perlbs2000
СОДЕРЖАНИЕ
- ИМЯ
- СИНОПСИС
- ОПИСАНИЕ
- gzip в BS2000
- bison в BS2000
- Распаковка дистрибутива Perl в BS2000
- Компиляция Perl в BS2000
- Тестирование Perl в BS2000
- Установка Perl в BS2000
- Использование Perl в POSIX-оболочке BS2000
- Использование Perl в "родном" BS2000
- Аномалии с плавающей точкой в BS2000
- Использование PerlIO и разных кодировок на ASCII и EBCDIC разделах
- АВТОРЫ
- СМОТРИТЕ ТАКЖЕ
- ИСТОРИЯ
ИМЯ
perlbs2000 - построение и установка Perl для BS2000.
Этот документ нуждается в обновлении, но мы не знаем, что в нём должно быть. Пожалуйста, отправьте комментарии на https://github.com/Perl/perl5/issues.
СИНОПСИС
Этот документ поможет вам настроить, скомпилировать, протестировать и установить Perl в BS2000 в POSIX подсистеме.
ОПИСАНИЕ
Это портированная версия Perl для POSIX подсистемы в BS2000 версии OSD V3.1A или более поздней. Она может работать и на других версиях, но мы начали портирование и тестирование с 3.1A и в настоящее время используем версию V4.0A.
Для установки Perl вам могут потребоваться следующие программы GNU:
gzip в BS2000
Мы использовали версию 1.2.4, которую можно было установить с коробкой, с одной ошибкой во время 'make check'.
bison в BS2000
Утилита yacc, поставляемая с BS2000 POSIX, нам не подошла. Поэтому мы использовали bison. Нам пришлось внести несколько изменений в Perl, чтобы использовать чистый (реентерабельный) анализатор bison. Мы использовали версию 1.25, но нам пришлось внести несколько изменений из-за EBCDIC. Более подробные сведения о yacc см. ниже.
Распаковка дистрибутива Perl в BS2000
Для извлечения ASCII архива tar в BS2000 POSIX вам необходима файловая система ASCII (мы использовали для этого mountpoint /usr/local/ascii). Теперь извлеките архив в файловой системе ASCII без преобразования ввода-вывода:
cd /usr/local/ascii export IO_CONVERSION=NO gunzip < /usr/local/src/perl.tar.gz | pax -r
Вы можете проигнорировать сообщение об ошибке для первого элемента архива (это не выглядит как архив tar / пропускаем к следующему файлу...), это только каталог, который будет создан автоматически.
После извлечения архива скопируйте всю древовидную структуру каталогов в вашу EBCDIC файловую систему. На этот раз используйте преобразование ввода-вывода:
cd /usr/local/src IO_CONVERSION=YES cp -r /usr/local/ascii/perl5.005_02 ./
Компиляция Perl в BS2000
Есть файл "hints" для BS2000, называемый hints.posix-bc (потому что posix-bc - это имя ОС, возвращаемое `uname`), который указывает правильные значения для большинства вещей. Основная проблема, конечно, набор символов EBCDIC. У нас есть немецкая версия EBCDIC.
Из-за проблем с родным yacc мы использовали GNU bison для генерации чистого (=реентерабельного) анализатора для perly.y. Таким образом, наша команда yacc на самом деле выглядит следующим образом:
-----8<-----/usr/local/bin/yacc-----8<----- #! /usr/bin/sh
# Bison как реентерабельный yacc:
# сохранение параметров: params="" while [[ $# -gt 1 ]]; do params="$params $1" shift done
# добавление флага %pure_parser:
tmpfile=/tmp/bison.$$.y echo %pure_parser > $tmpfile cat $1 >> $tmpfile
# вызов bison:
echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Чистый анализатор)" /usr/local/bin/bison --yacc $params $tmpfile
# очистка:
rm -f $tmpfile -----8<----------8<-----
Мы всё ещё используем обычный yacc для a2p.y!!! Мы создали символическую ссылку, назвав её byacc, чтобы различать две версии:
ln -s /usr/bin/yacc /usr/local/bin/byacc
Мы собираем Perl с помощью GNU make. Мы пробовали использовать native make, и он тоже работал.
Тестирование Perl в BS2000
Мы всё ещё получаем несколько ошибок во время make test. Некоторые из них являются результатом использования bison. Bison выводит ошибку парсера вместо синтаксической ошибки, поэтому мы можем их игнорировать. Следующий список показывает наши ошибки, ваши результаты могут отличаться:
op/numconvert.......FAILED тесты 1409-1440 op/regexp...........FAILED тесты 483, 496 op/regexp_noamp.....FAILED тесты 483, 496 pragma/overload.....FAILED тесты 152-153, 170-171 pragma/warnings.....FAILED тесты 14, 82, 129, 155, 192, 205, 207 lib/bigfloat........FAILED тесты 351-352, 355 lib/bigfltpm........FAILED тесты 354-355, 358 lib/complex.........FAILED тесты 267, 487 lib/dumper..........FAILED тесты 43, 45 Не удалось 11/231 скриптов тестов, 95.24% успешно. 57/10595 подтестов не удалось, 99.46% успешно.
Установка Perl в BS2000
У нас нет nroff в BS2000 POSIX (ещё), поэтому мы проигнорировали любые ошибки во время установки документации.
Использование Perl в POSIX-оболочке BS2000
POSIX-оболочка BS2000 не поддерживает нотацию shebang (#!/usr/local/bin/perl), поэтому вам нужно использовать следующие строки вместо неё:
: # use perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; # ^ Запускать только в оболочке
Использование Perl в "родном" BS2000
У нас пока не очень много опыта с этим, но попробуйте следующее:
Скопируйте ваш исполняемый файл Perl в BS2000 LLM с помощью bs2cp:
bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'
Теперь вы можете запустить его с помощью следующей команды (SDF):
/START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV
Сначала вы получите командную строку BS2000 ('*'). Здесь вы можете ввести параметры, например, -e 'print "Hello World!\\n";' (обратите внимание на двойные обратные слэши!) или -w и имя вашего скрипта Perl. Имена файлов, начинающиеся с / , ищутся в POSIX файловой системе, другие - в BS2000 файловой системе. Вы можете даже использовать подстановки, если поставите % перед именем файла (например, -w checkfiles.pl %*.c). Обратитесь к руководству по C/C++ для получения дополнительных возможностей командной строки (поищите PARAMETER-PROMPTING).
Аномалии с плавающей точкой в BS2000
По-видимому, существует ошибка в реализации плавающей точки в системах BS2000 POSIX, такая, что вызов int() от произведения числа и числа малой величины не совпадает с вызовом int() от частного этого числа и числа большой величины. Например, в следующем коде Perl:
my $x = 100000.0;
my $y = int($x * 1e-5) * 1e5; # '0'
my $z = int($x / 1e+5) * 1e5; # '100000'
print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000 Хотя можно было бы ожидать, что величины $y и $z будут одинаковыми и равными 100000, они будут разными и вместо этого будут равны 0 и 100000 соответственно.
Использование PerlIO и разных кодировок на ASCII и EBCDIC разделах
Начиная с версии 5.8, Perl использует новый PerlIO в BS2000. Это позволяет использовать разные кодировки по каналам ввода-вывода. Например, вы можете использовать
use Encode;
open($f, ">:encoding(ascii)", "test.ascii");
print $f "Hello World!\n";
open($f, ">:encoding(posix-bc)", "test.ebcdic");
print $f "Hello World!\n";
open($f, ">:encoding(latin1)", "test.latin1");
print $f "Hello World!\n";
open($f, ">:encoding(utf8)", "test.utf8");
print $f "Hello World!\n"; для получения двух файлов, содержащих "Hello World!\n" в ASCII, EBCDIC, ISO Latin-1 (в этом примере идентично ASCII) и UTF-EBCDIC (в этом примере идентично обычному EBCDIC). Подробности см. в документации Encode::PerlIO.
Так как внутренне PerlIO использует сырой ввод-вывод, всё это полностью игнорирует тип вашей файловой системы (ASCII или EBCDIC) и переменную среды IO_CONVERSION. Если вы хотите получить старое поведение, то функции ввода-вывода BS2000 определяют преобразование в зависимости от файловой системы, PerlIO всё ещё ваш друг. Используйте IO_CONVERSION как обычно и сообщите Perl, что он должен использовать родной слой ввода-вывода:
export IO_CONVERSION=YES
export PERLIO=stdio Теперь ваш ввод-вывод будет ASCII на разделах ASCII и EBCDIC на разделах EBCDIC. Подробные сведения о PerlIO (без Encode::!) см. в документации.
АВТОРЫ
Thomas Dorner
СМОТРИТЕ ТАКЖЕ
Список рассылки
Если вас интересуют порты Perl для z/OS (ранее известный как OS/390) и POSIX-BC (BS2000), обратитесь к списку рассылки perl-mvs. Чтобы подписаться, отправьте пустое сообщение на perl-mvs-subscribe@perl.org.
См. также:
https://lists.perl.org/list/perl-mvs.html В архивах в сети есть веб-архивы списка рассылки:
https://www.nntp.perl.org/group/perl.mvs/ ИСТОРИЯ
Этот документ был первоначально написан Thomas Dorner для выпуска Perl 5.005.
Этот документ был изменён для выпуска perl 5.6 11 июля 2000 года.
© 1993–2023 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.38.0/perlbs2000