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 в подсистеме POSIX на BS2000.
ОПИСАНИЕ
Это портированная версия 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. Подробнее об этом см. ниже.
Распаковка дистрибутива Perl в BS2000
Для извлечения архива tar в формате ASCII в BS2000 POSIX вам нужен файловый сервер ASCII (мы использовали точную точку монтирования /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
Для 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. Мы также попробовали родной 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
В BS2000 POSIX пока нет nroff, поэтому мы проигнорировали любые ошибки при установке документации.
Использование Perl в POSIX-оболочке BS2000
BS2000 POSIX не поддерживает обозначение shebang (#!/usr/local/bin/perl), поэтому вместо этого нужно использовать следующие строки:
: # use perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; # ^ Запуск только в оболочке
Использование Perl в "родном" BS2000
У нас пока мало опыта работы с этим, но попробуйте следующее:
Скопируйте исполняемый файл Perl в LLM BS2000 с помощью 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 для версии 5.005 Perl.
Этот документ был изменен для версии 5.6 Perl 11 июля 2000 года.
© 1993–2021 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.34.0/perlbs2000