Макроэтюды на REXX

Опубликовано в журнале "Компьютерра" №24-25 от 29 июня 1998 года

Автор: Михаил Попов | Раздел: ТЕМА НОМЕРА

 

     Какой язык программирования мы обычно выбираем, чтобы написать маленькую программку, которая решает те или иные рутинные задачи и, тем самым, немного облегчает нам жизнь? Зачастую под рукой оказывается Бейсик (тот ли, который содержится в Word, или любой другой). Существует, однако, еще один интуитивно понятный и простой язык, который как нельзя более подходит для сочинения различных домашних поделок. Я имею в виду REXX. Этот интерпретируемый язык входит в состав операционных систем OS/2 и PC-DOS от IBM, где он является мощным усилителем командных файлов и используется в некоторых приложениях. Существует также множество библиотек, расширяющих возможности языка и позволяющих создавать довольно сложные конструкции. Как пример, можно привести программу FRIP, написанную Дмитрием Завалишиным для оптимизации роутинга в сетях, работающих по технологии Fidonet. Первоначально задачи REXX мыслились, однако, несколько шире.

     Язык был создан сотрудником британских лабораторий IBM Майклом Коулишоу (Michael Cowlishaw). Сам он определил REXX как "процедурный язык, который позволяет записывать программы и алгоритмы в ясном и структурном виде". Действительно, REXX внутренне прост и логичен, а потому, по-своему, красив. Синтаксически же он не сильно отличается от других процедурных языков программирования.

     По мысли создателя языка, одним из самых полезных свойств REXX должна была стать возможность его использования как макроязыка для разнообразных приложений. Идея состояла в том, чтобы избавить разработчиков приложений от необходимости написания собственных макроязыков. Вместо этого они могли использовать REXX и поддерживать его программные интерфейсы. Для выполнения процедур, которые не являются частью REXX, программа обращается к функциям того или иного приложения, которое "знает", как с ними обращаться. Если бы эта идея осуществилась, пользователь должен был бы учить не несколько разных макроязыков, а всего один. Наиболее полно, как я уже говорил выше, философия REXX была воплощена в операционной системе OS/2 и некоторых ее приложениях. Можно сказать, что для OS/2 REXX стал тем, чем для Unix является скриптовый язык Perl.

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

    В каком состоянии находится REXX сейчас? Можно считать, что DOS (тем более, PC-DOS) благополучно почила, а о возрождении для массового пользователя OS/2, "лучшей 32-битной операционной системы", уже никто всерьез не говорит. REXX, однако, не умер, а, благодаря своим простоте и удобству, воплотился в нескольких независимых реализациях, как для DOS, так и для Windows и Unix, и даже Java. Среди этих реализаций есть бесплатные, условно-бесплатные и коммерческие интерпретаторы языка, документация и средства разработки. Лично я могу порекомендовать свободно распространяемый Brexx, который реализован для операционных систем DOS, HP-UX и Linux. С сайта https://nisyros.physics.auth.gr:10000 можно переписать не только сам интерпретатор, но и его исходные тексты на C. В качестве примера использования REXX приведу небольшую программку, которая справляется с той же задачей, что описанный мной в этом же номере макрос для Microsoft Word, а именно - транслитерации русских текстов. Его же, кстати, можно использовать и для весьма актуальной задачи расшифровки многострадальных электронных писем, несколько раз перекодированных из Win-1251 в KOI-8 и обратно. Следует только сделать соответствующие таблицы подстановки.

 

/* Transliteration */

/* По наличию комментария в первой строке командные процессоры OS/2 и PC-DOS отличают программу на REXX от обычного командного файла */

/* Чтение аргументов из командной строки */

parse arg infile outfile

/* Открытие файлов, имена которого заданы первым и вторым аргументами соответственно на чтение и на запись */

   Call Open(infile, 'r')

   Call Open(outfile, 'w')

/* Начало цикла, условие окончание - конец файла */

   do until EOF(infile)

/* Чтение одного символа */

       R = Read(infile,1)

/* Если символ соответствует одному из нижеследующих условий, он преобразуется */

       if R="а" then R="a"; else

            if R="A" then R="А"; else

/* … и так далее, до … */

                  if R="я" then R="ya"; else

                       if R="Я" then R="YA"

/* Запись символа в выводной файл */

       Call Write(outfile, R)

   end

 

    С этой программой, кстати, связан любопытный случай. Находясь на конференции в Санкт-Петербурге, я сумел с некоторыми трудностями подключиться к Интернету, чтобы принять почту. Хоть "Россия on-line" и обеспечивает бесплатный роуминг в крупных городах нашей страны, но вот уговорить сотрудников Таврического дворца уступить мне на минуту телефонную розетку удалось с большим трудом. Получив долгожданное письмо от Евгения Козловского, открываю его… О, ужас! "Окщв! Опе раепы тфкужпр, ажр рж жечу хжвжыу тфкдеж", - сервер online.ru, через который Евгений имел неосторожность отправить послание, безжалостно исковеркал его. Что делать? Прочитать письмо мне нужно было, что называется, кровь из носу, а подключиться к Интернету еще раз, чтобы переписать какую-нибудь продвинутую программу-"читалку", не представлялось возможным.

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

    Богатый набор ссылок по REXX можно найти по адресу www2.hursley.ibm.com/rexx/