REXX - потенциал платформы OS/2

Автор: Basil A. Sidorov

Дата: 14.01.2002

Источник: ru.e comstation.ru

 

Что такое REXX? Какова его концепция?

 

Абревиатура REXX расшифровывается как REstructure eXtended eXecutor и созвучна с латинским REX (король). История создания изложена автором, Майком Колишау (Mike Cowlishaw) в "Rexx brief history".

А началась эта история 29 марта 1979, когда была опубликована первая спецификация нового языка. После обсуждения концепций, в конце 1979 года Майк реализовал первый интерпретатор. Первоначально новый язык был доступен только внутри IBM, что с одной стороны позволяло учесть мнения и пожелания большого числа людей, а с другой - делало возможным внесение достаточно кардинальных изменений.

К 1982 году язык оформился в его теперешнем виде и получил вторую букву "X".

В OS/2 REXX появился с версии 1.2, сначала в расширенной (EE), а с версии 1.3 - и в стандартной редакции системы.

REXX - скриптовый язык и применяется там же, где применяются любые скриптовые языки: когда возможности встроенного языка пакетной обработки уже исчерпаны, а переход на "традиционное" программирование себя еще не оправдывает.

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

 

В повседневной деятельности возникают задачи, которые могут быть прекрасно решены с помощью REXX. Например, маленький шедуллер, обработчик текста, работа с WPS. Каков этот круг задач?

 

Тривиальный пример работы с WPS - создание программных объектов с помощью SysCreateObject() штатной библиотеки расширения RexxUtil. Или SysOpenObject() с помощью которой можно запустить на исполнение (DOS)программу с требуемыми настройками. А вообще, на www.os2.spb.ru лежит коллекция самых разных скриптов "на все случаи жизни".

Когда мне понадобилось скопировать "всё, что можно" с плохо читаемого компакт-диска - написание скрипта заняло примерно полчаса. Вместе со всеми украшательствами. Думаю, что поиски "чего-нибудь готового" заняли бы больше времени:)

 

Какие REXX'ы бывают?

 

Можно выделить три ветви - Classic REXX, Object REXX и NetRexx. Первые два входят в штатную поставку OS/2 начиная с Warp4. Пользователи Warp3 могут установить Object REXX из архива на хоббесе. Эту же версию я рекомендую и для мерлина, а "сладкую парочку" RexxCRT.DLL/RexxUtil.DLL из него - всем, кроме пользователей ACP1+.

Наиболее современная версия классического рекса это, видимо, Regina Rexx, развиваемый Марком Хесслингом (Mark Hessling) и существующий как проект на SourceForge.

Объектный рекс начал разрабатываться внутри IBM в начале 1990-х годов и, насколько я понимаю, позиционируется IBM'ом как основной диалект и заменитель "классики".

NetRexx был создан и развивается Майком Колишау и представляет язык Java-программирования с рексоподобным синтаксисом.

 

Где можно найти твои статьи про Object REXX?

 

Статьи опубликованы на сайте RDM/2, архив 1999 года. Первая из них дублирует :) чти.мя ACP1, вторая сравнивает возможности ввода/вывода классического и объектного REXX'ов.

 

Могут ли другие скриптовые языки (perl, vb) заменить REXX?

 

Мне сложно ответить на этот вопрос, т.к. я весьма шапочно знаком с Perl'ом и еще меньше - с Visual Basic'ом.

Однако, читая "Изучаем Perl" Р.Л.Шварца и Т.Кристиансена, нельзя не обратить внимание на сильную привязку Perl'а к юниксоподобным системам, а VB раздражает большим числом своих инкарнаций.

Кроме того, рекс не просто общецелевой скриптовый язык, это еще и "универсальный клей", используемый самыми разными компонентами OS/2 и различными прикладными программами. Заменить его в этом качестве может только другой рекс.

В частности, REXX используется инсталятором OS/2, широко применяется при CID-инсталяции различных программ. Некоторые LanServer'овские утилиты - тоже rexx-скрипты.

 

С чего начать изучение REXX?

 

Изучение REXX'а начинается с того же, что и все остальное - с чтения штатной документации. Для тех, кому удобнее читать русское руководство - нужен либо "русский Мерлин" либо (c)rexx.inf из него.

Руководство должно быть прочитано полностью. Особенно - раздел "Встроенные функции". Это позволит не изобретать велосипеды типа wordpos() или space().

В части синтаксиса нужно помнить об открывающей скобке: length(string) - вызов функции "length" с аргументом "string", а length (string) - объединение (через пробел) двух строк.

Некоторую сложность могут представлять кортежи (stem) с их правилами подстановки "хвостовых" значений.

Но если воспользоваться rexxtry (интерактивный скрипт из штатной поставки) - большинство вопросов выясняются легко и быстро.

 

'REXX Tips and Tricks' - этот текст будет полезен начинающим?

 

Безусловно. Причем читать его нужно и тем, кто не собирается использовать REXX, а просто хочет расширить свои познания об штатных утилитах, языке пакетной ("обычные" .cmd) обработки и т.п. Скажем, классическое: "SomeProg 2>&1 > nul" проще всего найти именно там. Версия периодически меняется, так что искать лучше по слову "rxtt".

 

Что можно сказать о производительности? Какого размера бывают рексовые скрипты?

 

"Пузомеркой" интерпретатора является RexxCPS, который измеряет время исполнения некоторых типичных операций. Но говоря о производительности, следует помнить, что скорость работы процессоров постоянно растет. Как следствие, использование скриптовых языков вообще и REXX, в частности, становится все более удобным.

Размеры скриптов бывают самыми разными: от однострочного

 

/* SAY.CMD */ interpret 'say' arg(1)

 

до многосоткилобайтовых монстров типа PPWizard.

Практически же оптимальным является скрипт до 10-15 килобайт. Дело в том, что интерпретация REXX-скриптов в OS/2 является двухстадийной. На первой стадии строится так называемый токенизированый образ, на второй - интерпретируется результат токенизации.

Если скрипт достаточно мал и токенизированый образ оказался менее 64Кб, он сохраняется в расширенных атрибутах файла, что ускоряет все последующие запуски скрипта.

Если образ настолько велик, что не помещается в расширенных аттрибутах, то первая стадия будет повторятся каждый раз, существенно увеличивая общее время запуска скрипта. В такой ситуации (утилитой rexxc) можно сохранить токенизированный образ как дисковый файл. Если файлу присвоить расширение .cmd - он будет исполняться как обычный текстовый скрипт.

Используя такую технику следует помнить, что формат токен-образа не стандартизирован и зависит от версии интерпретатора. Таким образом токенизированые скрипты (обычно) не годятся для распространения как самостоятельная программа.

Здесь я бы отметил ещё одно преимущество Object Rexx - написание модульных скриптов становится тривильным: аттрибут public для общедоступных классов/процедур и директива requires в скриптах, которые будут ими пользоваться. Для классов есть и более изощрённая техника, которая позволит избавиться от накладных расходов, связанных с директивой requires.

 

Что нужно сделать, чтобы использовать REXX в своей программе на Си?

 

Все необходимое (руководство, хедеры, примеры) есть в OS/2 Tookit. Само API реализовано в рамках проекта SAA как SAA Rexx API и достаточно универсально для использования самыми разными интерпретаторами.

 

... А если я хочу использовать REXX, как внутренний скриптовый язык своей программы? Например, пользователь делает описание "3D-сцены" на рексе (параметры объектов и сцены). Дальше, остается воспользоваться готовым решением - запустить интерпретатор рекса. При выполнении скрипта, вызываются функции программы (расстановка объектов и т.п.)

 

Совет простой - читать RexxPG/смотреть примеры/хедеры всё того же ToolKit'а. Интерпретатор REXX'а имеет различные хуки, которые позволяют определять собственные команды/функции, манипулировать пулом переменных и вводом/выводом, перехватывать обработку ошибок и даже подменять интерпретатор, если это нужно.

Лично я этим не занимался, но вот несколько примеров:

 

Есть ли REXX в других ОС? Какие у них ограничения?

 

Здесь сложно что-либо добавить к информации с авторского сайта. Интерпретаторы рекса есть практически везде - от майнфреймов до наладонных компьютеров. Я работал с рексом в PCDOS, с Региной (Win32/DOS32), классикой и объектным рексом в OS/2. Если исключить интерпретатор PCDOS (с крайне неприятным ограничением <64Кб на значение переменной), то написание универсальных скриптов вполне реально.

Вместе с тем, я считаю, что наиболее перспективным является Object REXX, несмотря на то, что пока(?) он развивается исключительно фирмой IBM и свободно доступен только для OS/2 и Linux'а.

 

Как ты думаешь, есть ли смысл предлагать REXX, как язык для начинающих программистов? вместо Паскаля? (например, в школах) ...

 

Сложно сказать. С одной стороны и Pascal и Rexx - алгоритмические языки, с другой - Pascal знает гораздо большее:) число преподователей.

 

... идея сумасшедшая, но зато какие просторы для творчества открываются перед "малышом"?!! (обновлять на десктопе объекты, доступ к SOM)

 

Если это десктоп OS/2 - безусловно:)

 

Есть ли гарантии, что REXX никуда не исчезнет?

 

"Полную гарантию может дать только страховой полис":) На самом деле в "Философия Java" Брюса Эккеля есть такой (примерно) текст: "На одном из моих семинаров Алан Голуб доказывал, что наиболее используемые в настоящее время языки - Rexx и Cobol, в указанном порядке".

 

На вопросы отвечал: Василий А. Сидоров

Вопросы задавал: Eugene Gorbunoff