Все, что вы хотели знать о REXX, но боялись спросить

Автор: В.Казимирчик

Источник: RDM/2

Дата: 21 февраля 2000 г.

История REXX, изложенная в этой статье, взята со страницы автора REXX'а (Mike Cowlishaw, IBM UK Laboratories) - https://www2.hursley.ibm.com - с его согласия, полученного автором статьи 17 февраля 2000 г. по e-mail. Комментарии автора статьи изложены в скобках с примечанием "kzm".

Автор статьи не претендует на всеобъемлющее знание REXX и всего, что с ним связано, и соответственно, может быть в чем-то неправ.

 

Немного истории

В 70-х - 80-х годах наиболее успешной многопользовательской операционной системой IBM была VM/370 (Virtual Machine/370). Эта система предоставляла каждому пользователю "персональный компьютер" через концепцию "виртуальной машины", подобной Virtual DOS Machine (VDM) в OS/2.

В рамках виртуальной машины VM можно было запускать любую операционную систему для System/370, и наиболее популярной являлась однопользовательская система CMS (Conversational Monitor System). CMS унаследовала многие черты от более ранних систем, таких, как Multics (мне это название ни о чем не говорит - kzm), например - управление системой посредством команд.

CMS также предоставляет возможность "обернуть" (wrap) команды программными операторами, такие конструкции писались на языке EXEC. Этот язык, правда, лишь немногим более функциональный, чем язык bat-файлов PC-DOS, позволял более быстро и просто создавать расширения и новые команды, чем при использовании ассемблера.

В 1970 году C.J.Stephenson и другие люди в исследовательском центре IBM T.J.Watson поняли, что концепция командного языка программирования имеет огромный потенциал - один язык может служить расширением, или языком написания макросов, для большого количества самых различных приложений. Так появилось расширение языка EXEC - EXEC2, который в основном использовался для написания системных команд и макросов для различных редакторов.

Однако в этом языке предпочтение отдавалось командам, в то время как переменным и манипуляциям с ними уделялось меньше внимания. Да и опыт написания более-менее сложных программ на EXEC2 показал некоторое неудобство его синтаксиса. Как пример, можно привести команду копирования файла с последующей проверкой результата этой операции, написанную на EXEC2:

   COPYFILE &FNAME &FTYPE &FMODE = BACKUP =

   &IF &RC GT 0 &TYPE Copy failed with return code &RC

Назрела необходимость в новом языке, с более классическим синтаксисом в традициях Алгола, Паскаля и PL/I, который в то же время унаследовал бы возможности EXEC2 в области обработки текста и выполнения команд операционной системы.

Новый язык был назван REX (да, с одним 'X', вторая 'X' появилась в 1982 году, чтобы избежать пересечения в названии с другим программным обеспечением). Почему REX? Просто автору понравилось звучание этого слова. Во главу угла ставилось максимальное упрощение процесса программирования. Этот язык унаследовал многие конструкции из других языков, таких, как PL/I и EXEC2, однако более понятные интуитивно. Вот пример, приведенный двумя абзацами выше, переписанный на REX:

   'COPYFILE' fname ftype fmode '= BACKUP ='

   if rc>0 then say 'Copy failed with return code' rc

С дальнейшим увеличением сложности программ разница в наглядности значительно увеличивается.

Первая спецификация языка REX появилась 29 марта 1979 года, а первая реализация, вышедшая в конце того же года, была бесплатно распространена по внутренней сети IBM по всему миру и быстро завоевала популярность. К 1982 году язык стал практически таким, каким мы его знаем сегодня. В 1985 году появилась первая не-IBM-овская реализация языка REXX - Personal REXX для PC-DOS (сейчас этот продукт продается компанией Quercus Systems, версии для DOS, Windows и OS/2).

В 1987 году компания IBM сделала REXX процедурным языком для SAA (Systems Application Architecture), а затем последовали реализации для ряда других операционных систем, таких, как MVS/TSO, AS/400 и (в 1989 году) - OS/2 1.2 Extended Edition. Первый компилятор языка REXX был разработан в 1989 году лабораторией IBM в Вене.

REXX стал неотъемлемой частью OS/2, начиная с версии 1.3. В версии OS/2 2.1 в REXX появилась поддержка multimedia.

В 1994 году компанией IBM были выпущены реализации REXX для AIX/6000, Netware (посл. не видел, хотя интересно - kzm) и для монитора транзакций CICS.

 

Вкратце о других реализациях REXX, не упоминавшихся выше

Object REXX - ООП-реализация REXX, умеет исполнять скрипты, написанные на classic REXX. Поставляется с WARP 4/5, существует реализация и для WAPR 3. Использовать одновременно оба диалекта нельзя, и, чтобы переключиться с "обычного" на "объектный" или обратно, надо набрать в командной строке OS/2 switchrx и перезагрузить систему.

NetREXX - не совсем REXX. Детище того же Mike Cowlishaw, предназначено для создания java-классов с помощью синтаксиса, близкого к Classic REXX.

Regina - бесплатная реализация для ряда платформ, таких, как win32, DOS, AMIGA, OpenVMS и ряд юниксов.

VX-REXX - создание PM-программ, где вся внутренняя логика пишется на REXX (например, реакция на "click button"). Детище Watcom. К сожалению, больше не поддерживается. Хотя вполне работоспособно и освоить его можно довольно быстро (надо сказать, что PM-приложение на REXX можно также создать с помощью GPFRexx - ну и название! -, VisProREXX и MAID, но я их не пробовал - kzm).

Amiga REXX. Здесь все понятно.

Enterprise REXX (WinREXX) для Windows и DEC Alpha.

В комплект поставки IBM PC-DOS также входит REXX-интерпретатор (который отлично работает и под другими версиями DOS, например, под M$ DOS). Единственная обнаруженная мной проблема - REXX'у доступно довольно мало памяти - примерно 400 Kb.

Существуем большое количество библиотек для REXX самой различной направленности. Достаточно поискать слово REXX на Hobbes (https://hobbes.nmsu.edu) и посмотреть на результат.

Многие популярные программы для OS/2 используют REXX в качестве макроязыка (например, PM Mail).

Имеется news-конференция, посвященная REXX - comp.lang.rexx.

С 1990 года проводится ежегодный REXX symposium.

 

Преимущества и недостатки

Преимущества:

* Простота. Программы на REXX легко читаемы и интуитивно понятны.

* Все переменные - символьные, так что нет необходимости в объявлении типа переменной (причем размер строки символов не ограничен). Имеются довольно мощные средства обработки строк (например, разбор с помощью инструкции PARSE) или конвертация текста по таблице (TRANSLATE), с помощью последнего особенно удобно конвертировать русскоязычные тексты из одной кодировки в другую.

* Преимущество интерпретируемого языка - возможность строить команды "на ходу" (INTERPRET).

* Точность вычислений определяется разработчиком (NUMERIC DIGITS, см. ниже).

* Достаточно удобно использовать REXX как "клей" (glue), т.е. в качестве связующей компоненты сложных гетерогенных систем, а также для расширения возможностей приложений посредством макро-языка.

Основной недостаток: REXX является интерпретируемым языком, соответственно, имеет меньшую производительность (особенно при вычислениях) по сравнению, скажем, с программами на C.