«Язык программирования REXX в современном мире. Создание кроссплатформенных программ»
Автор: А.Е.Тарасов
Рецензент: В.А.Кузнецов
Дата: 13.08.2013
Видеоверсия: Youtube
На фестивале компьютерного творчества «CHAOS CONSTRUCTIONS'2013», прошедшего 10 и 11 августа 2013 года, мною был просчитан доклад на данную тему. Предлагаю вашему вниманию слегка переработанный текст доклада. Презентацию в формате PowerPointможно взять от сюда.
Здравствуйте! Меня зовут Алексей Тарасов. Немного о себе: родился и живу в г.Саратове, за плечами два образования (техническое и высшее) плюс незаконченная аспирантура. И, пожалуй, будем считать, что со вступительной частью мы закончили.
Итак, если вы не сталкивались с REXX ранее, сделаем небольшое пояснение. Язык придумал сотрудник компании IBM Майк Кулешоу (Mike Cowlishaw) в 1979 году. Сегодня существует девять открытых реализаций REXX. Он поддерживается практически на любой платформе, но изначально был наиболее популярен на платформах IBM: мейнфреймах и ОС OS/2.
Вот несколько ключевых причин, почему писать программы на REXX так здорово:
- Богатый набор встроенных функций и методов;
- Предоставляет два непревзойденных встроенных оператора - TRACE и PARSE;
- Основная концепция REXX - "все есть строка";
- Отсутствие типа переменных. Хотя существует понятие тип данных;
- Наличие составных переменных. То есть имя переменной может состоять из нескольких частей разделенных точкой;
- Отсутствие классических массивов. Это следствие предыдущего пункта;
- Арифметические действия любой точности;
- Наличие стандарта ISO;
- Отсутствие классических процедур и разницей между ними и функциями. Есть именные участки кода, на которые можно совершить переход и вернуться. При этом к ним можно обраться и как к функции и как к процедуре;
- Вы можете выполнить команды Windows или Unix/Linux и другие приложения из программы REXX полностью аналогично тому, как это можно сделать в пакетном файле оболочки (если некоторая команда в пределах сценария не может быть опознана интерпретатором, она выполняется как команда оболочки; выполнение команды оболочки можно вызвать и явно); кроме того, в программе REXX можно получить код возврата команды и использовать любой её вывод;
- Достаточно нестрогие синтаксические правила; одна команда может располагаться на нескольких строках, несколько команд могут располагаться на одной строке; язык регистронезависим; во многих случаях разрешается добавлять или опускать пробелы; ключевые слова зарезервированы только в контексте: например, вы можете иметь переменную с именем, совпадающим с именем встроенной функции.
Ещё одна особенность REXX'а - он не навязывает стиль написания кода. Все иные языки требуют от программиста следования жестким догмам "шаг влево, вправо - попытка бегства, прыжок на месте - провокация" (с). Отсюда и появляются Си программисты и прочие. Например, я перешел на REXX с Паскаля, и поначалу строил конструкции, к которым привык на нем. И только через полгода начал потихоньку от них отходить, открывая для себя все новые и новые грани REXX. Мой же друг до сих пор пишет на найтивном REXX из комплекта OS/2 Warp 3.0, как на Фортране. Он жутко упрямый и очень тяжело расстается со старыми привычками. REXX и это позволяет.
Обычно язык REXX, выступая в роли связующего звена, применяется персоналом, не занятом в программировании, т.е. системными администраторами и специалистами различных групп.
Одна из уникальных возможностей REXX заключается в том, что его можно использовать как макроязык во многих приложениях поверх других функций, что делает REXX очень полезным инструментом. Это позволяет пользователям автоматизировать определённые задачи, заставлять программу делать ещё что-то. Эта возможность уже реализована в целом ряде программ. Для OS/2 можно сходу вспомнить электронную таблицу MESA, редактор ФИДОпочты FleetStreet. В Windows поддержка REXX встроена в OpenOffice.
Целью создания REXX была легкость использования, а не легкость реализации. Он снабжен:
- обширной библиотекой мощных и удобных функций для работы со строками,
- автоматическим преобразованием типов;
- числами произвольной точности;
- ассоциативными массивами;
- небольшим набором команд с контекстно-зависимыми ключевыми словами, предназначенными для максимальной гибкости и быстроты разработки.
В любой реализации REXX вся арифметика - десятичная. Она не страдает от "компьютерных" ошибок округления, которые заставляют вас выглядеть глупо. Более того, десятичная точность практически не ограничена (разумеется, в пределах объема памяти, вычислительной мощности и здравого смысла). Например, можно посчитать число Pi до 1024 знака после запятой, и не просто рассчитать – но и использовать его в расчетах, подняв точность всего математического аппарата языка стандартным образом.
Для мейнфреймов коммерческий компилятор REXX генерирует нативный объектный код. Он также позволяет внедрять приложения в промышленную эксплуатацию без необходимости выполнения их из исходного кода (выжимая всю производительность до последней капли).
Для языка REXX существует стандарт ISO и реализации для всех распространенных платформ. Не так много языков программирования имеют стандарт ISO. Это означает, что определены жесткие критерии, по которым можно оценить ту или иную реализацию, следовательно, и качество доступных интерпретаторов и компиляторов. Одна из первых открытых реализаций, Regina, работает на внушительном количестве архитектур и операционных систем, о некоторых из которых я даже не слышал.
Давайте рассмотрим несколько существующих сред программирования на REXX.
Начнем с одной очень интересной среды DrDialog (Рис.1).
Программа уникальна по двум вещам: первая - её полностью разработал один человек, и второе - она появилась в 1994 году. И, не смотря на почтенный возраст, она не только работоспособна на текущий момент, но и продолжает быть мощным инструментом. Последние дополнения датированы 2004 годам. Разумеется, это уже не авторские доработки. Особенностью среды является наличие дополнительного мощного инструмента по отладке с пошаговым выполнением программ, с отображением содержанием переменных и прочее.
Рис.1
DrDialog отличается от других пакетов тем, что он был разработан с очень узкой направленностью, в то время как другие решения были перетяжеленны большими пакетами самых различных программ, и имели в комплекте разнообразные функции, от доступа к базе данных, до функций GUI. DrDialog был разработан исключительно для создания GUI приложений на REXX и ничего более. Возможно именно эта узкая направленность в сочетании со стабильностью в работе и позволяет ей так долго оставаться очень мощным и полезным продуктом.
Следующий продукт в нашем коротком обзоре это VisProREXX (Рис.2)
Рис.2
VisPro REXX - это визуальный инструмент программирования, который полностью интегрирован с Workplace Shell.
Версия 3.1.1 GOLD вышла в 1996 году. Последние изменения датируются 2006 годом. До 2012 года это был коммерческий продукт, и только в этом году поступила в свободное пользование. Одновременно была выпушена очередная сборка, вобравшая в себя все существующие улучшения.
Особенностью данной сборки является богатый набор различных объектов, охватывающий весь спектр возможностей системы, а так же развитые инструменты по работе с базами данных. Реализована возможность сборки программ по типу клиент/сервер.
С VisPro REXX Вы можете подключаться к любым базам данных ODBC и к базам данных с ODBC-совместимыми интерфейсами, к Oracle через интерфейс REXX Oracle.
Рис.3.
Вот один из примеров программ, поставляемых со средой. (Рис.3) Вам ни чего не напоминает?
Рис.4
Отдельно стоит отметить встроенный генератор отчетов (Рис.4). Это позволяет легко печатать привлекательные отчеты, включая счета-фактуры, кадровые отчеты, финансовые отчеты и многое другое. Как показывает мой опыт, иногда это весьма полезная вещичка.
Следующим в обзоре будет среда GPF REXX (Рис.5).
Рис.5.
Из всех рассмотренных пакетов, Gpf REXX наиболее ориентирован на профессиональных разработчиков, так как он имеет стандартные варианты довольно низкоуровневого интерфейса управления. При определении меню, например, Вы можете выбрать, будет ли приложение нести ответственность за рисование, перерисовки, закрытия меню, или же эти операции должны выполняться автоматически. Есть также ряд опций, таких как SyncPaint и NoByteAligned, служащие для повышения производительности.
По сравнению с другими продуктами, рабочий экран Gpf REXX устроен так, что позволяет легко напрямую манипулировать объектами и редко использовать всплывающие меню или аналогичные иконки.
Положительной стороной Gpf REXX является Редактор функций, используемый для написания собственных функций REXX гораздо более глубоко, нежели на рабочем экране.
К сожалению, пакет снабжен очень плохой документацией. Но зато в состав пакета входит большое количество примеров. От самых элементарных, показывающих как использовать конкретный объект, до макетов весьма серьезных программ.
Следующим мы рассмотрим пакет WatcomVXREXX (Рис.6).
Рис.6.
VX-REXX позволяет создать гибкую модульную архитектуру проектов для самого широкого спектра применения. Приложения могут управляться как проекты, и проекты могут быть беззаголовочными или безоконными. В одном файле может храниться и код программы, и несколько окон, и код, выполняемый в разных потоках. Есть возможность поделить окна и код между проектами по сети. Архитектуру выбирает программист, она будет зависеть только от того, как вы хотите разделить код и информацию между проектами. Из всех перечисленных проектов VX-REXX дает разработчику наиболее широкий спектр возможностей для настройки приложений.
VX-REXX как среда разработки, хорошо продуман и эффективен. Информация об инструментах и различных списках разнесены в разные окна, что позволяет их разместить в любом месте экрана.
Большинство средств программирования GUI интерфейса позволяют построить пользовательский интерфейс, выбрав элемент управления из палитры и место размещения его в окне. Можно на экране непосредственно управлять объектами, изменять размеры, перемещать их. Двойной щелчок на объекте позволяет установить свойства объекта. Рабочий экран VX-REXX делает то же самое, но, неуловимым образом, это делает процесс более естественным и интуитивно понятным, чем в других средах - за счет хорошо продуманной минимизации манипуляций. Например, при перемещении мыши по рабочему окну VX-REXX в строке состояния мигает именем каждого объекта, над котором проходит указатель. Для сравнения, в VisPro REXX, вы должны выбрать курсором объект чтобы увидеть его имя, но поле вы вынуждены провести дополнительные действия, чтобы снять с него выделение, если Вы конечно, не собираетесь сразу его использовать. В VX-REXX расходуется меньше усилий. И такая простота характерна для всех его инструментов.
Рис.7.
В состав пакета также входит интересный текстовый редактор (Рис.7) с интерфейсом, напоминающим ленты, появившиеся в MSOffice2007. Или на оборот?
Пожалуй, пока о средах программирования - все. Несмотря на то, что все только что рассмотренные среды программирования были созданы значительное время назад, каждая из них позволяет вести разработки на весьма приличном уровне.
Теперь давай те разберемся, чего мне (в частности) от них надо. Особенностью моих проектов в том, что я не являюсь профессиональным программистом, в смысле, что не зарабатываю этим деньги напрямую. А реализую проекты из повседневной жизни и производственной сфере, которые облегчают жизнь мне и моему окружению. Поэтому для меня важно:
- Простота и быстрота освоения. Решение должно способствовать продвижению и популяризации самого программирования;
- Простота написания и отладки кода программ любой сложности;
- Простота внесений изменения в рабочий код;
- Расширяемость - решение должно обеспечивать простоту доработки уже законченных проектов и программ. В том числе отсутствие проблем при смене версии языка;
- Кроссплатформенность - решение должно быть работоспособным для большинства ОС. Это позволит писать любую программу только один раз;
- Интеграция - решения должно легко интегрироваться с другими решениями, задачами, программами, реализованными на любом языке программирования.
Из опыта я могу назвать только один язык программирования, который бы удовлетворял поставленным условиям – это REXX. Главным недостатком для меня, описанных выше сред, является то, что все они работают только под управлением eCS (OS/2), и не позволяют генерировать код для иных ОС.
Для реализации требования кроссплатформенности, пришлось выбрать интерпретатор. На сегодняшний день можно выделить три ветви REXX- Classic REXX, Object REXX и NetRexx. И почти с десяток разных их реализаций.
Начнем, пожалуй, беглый обзор с конца и поговорим о NetRexx (Рис.8).
Рис.8.
NetRexx – это Будущее языка Rexx на мобильных платформах.
REXXотлично подходит для мобильных устройств благодаря скромным требованиям и отличной переносимости. Уже существуют несколько реализаций REXX и NetRexx для Android. Например, есть NetRexx IDE для Android-устройств.
Производительность, которая присуща оптимизированному коду, появляется на маломощных машинах, "карманных мейнфреймах". Вполне возможно, что код NetRexx уже выполняется на вашем Android-устройстве, просто вы об этом не догадываетесь...
NetRexx ветвь развития создана отцом языка REXX. Начиналось все как эксперимент по оценке возможности выполнения REXX на виртуальной машине Java (JVM). В дальнейшем это стал первый альтернативный язык для JVM. Эта версия сегодня является стабильным, полноценным и самодостаточным продуктом, который обходит по производительности другие языки для VM.
NetRexx реализован в виде кросс-платформенного транслятора с REXX в исходный код на языке Java. За 16 лет существования эта версия JVM продемонстрировала значительный прогресс для компилятора javac, ВМ hotspot, j9 и др. NetRexx - это попытка начать с нуля и исправить то, что не устраивало самого Майка Кулешоу. Это, как было отмечено в 2008 году на саммите Sun JVM Language Summit, единственный альтернативный язык для JVM, который послужил основой для создания нового класса в библиотеке Java Class Library: BigDecimal.
IBM сдержали обещание открыть Object REXX и NetRexx (первый в 2005 году, второй в июне 2011 года). Для всех пользователей и поклонников это означает, что затраченные ресурсы не пропадут зря и есть перспективы.
На текущий момент последняя версия NetRexx 3.02 GA от 19 июля 2013 г.
Теперь переходим к Object REXX (Рис.9).
Рис.9.
Object REXX (объектный REXX) — объектно-ориентированный скриптовый язык, основанный на языке REXX, созданный корпорацией IBM первоначально для операционных систем серий OS/2 и OS/390. Object REXX и Classic REXX входит в штатный комплект поставки eCS (OS/2), начиная c Warp4.
2004 IBM выпустила Object REXX как программное обеспечение с открытым кодом, положив начало проекту Open Object REXX, ныне доступному для различных операционных систем: Linux, Solaris, Windows.
Язык Open Object REXX является расширением классического REXX, включающим классы, объекты и методы. Основные возможности ooREXX:
- поддержка ООП (наследование, полиморфизм, инкапсуляция); это не замещает функции классического REXX и не препятствуют разработке и исполнению программ на классическом REXX (вы решаете сами, когда использовать ООП);
- полная совместимость с классическим REXX; программы на классическом REXX будут работать без изменения, ooREXX полностью совместим с более ранними версиями IBM интерпретаторов REXX; ooREXX обеспечивает стандартный API REXX для разработки внешних библиотек функций, написанных на Cи;
- поддержка COM;
- тесная интеграция с Windows Script Host;
- встроенные возможности для работы со строками, двоичными и шестнадцатеричными данными, base64, ассоциативными массивами, чтение и запись текстовых и бинарных файлов;
- встроенные расширения для работы с TCP/IP, FTP, математическими функциями, построения GUI;
- поддержка других внешних dll-расширений;
На текущий момент последняя версия Open Object REXX 4.1.3 от 7 июля 2013 г. – совсем свежая.
Рис.10.
Переходим к последней ветки языка и поговорим о ярком представителе Classic REXX - ReginaREXX (Рис.10).
Regina — один из современных интерпретаторов REXX, портированный на большинство Unix-платформ и ряд других. Создан Anders Christensen, в настоящее время поддерживается Марком Хесслингом (Mark Hessling). Создание и развитие этого интерпретатора преследуют две цели — добиться совместимости со стандартом ANSI (реализовано начиная с версии Regina 3.1) и работать на максимально возможном количестве платформ.
На текущий момент последняя версия Regina Rexx 3.7 от 6 июня 2013 г.
Беря во внимание массовость ОС под которыми работает Reginaи то что это представитель классического REXX, я выбрал её как свой базовый интерпретатор.
В Regineприсутствует примитивные функции для создания графических окон, в первую очередь для реализации запросов к пользователю вида OK/NO. Но их не достаточно для реализации полноценного интерфейса. Для этих целей была выбрана библиотека RexxDW. Версии данной библиотеки существуют для Unix (Рис.11), Windows(Рис.12) и eCS (OS/2) (Рис.13).
Рис.11 (Unix)
Рис.12 (Windows)
Рис.13 (eCS (OS/2))
Как видно из слайдов, если не считать незначительных нюансов, отображения всех элементов одинаковы, функционирование программ совершенно не отличается. Однако, внешний вид элементов может несколько зависеть от версии системы. Скажем при смене WindowsXP на Windows 7, пользователь одного из моих проектов, даже задал вопрос «Почему окно программы выглядит по-другому?». Функционирование программ при этом совершенно не отличается.
Вот теперь мы вплотную подошли к задаче написания программы, способной работать на разных ОС. Мне долго пришлось рассказывать о REXX, а решение просто и даже тривиально. Нужно просто писать программы на REXX. И все! Ставим соответствующую ОС Regina’у и RexxDW. А потом запускаем файл с расширением «.rexx». И все будет работать!
У меня в момент отладки была ситуация когда один и тот же файл на сетевом диске был запущен 2 раза под Winodwsи 3 раза под eCS (OS/2). По запарке я да же не сразу это осознал, так как никакой разницы не заметил.
Теперь разберемся, что же нужно делать с самим RexxDW. Он дает программист минимально необходимый, но достаточный набор простых операций по созданию и управлению различными элементами GUI. Каждый элемент GUIуправляется своим набором команд. Опыт разработки программ показал, что хотя названия и синтаксис всех команд созданы по единым правилам, запоминать их не очень удобно. Решение было найдено в создании процедуры «Create». Это единая процедура, через которую создаются все элементы GUI. Её синтаксис весьма прост:
Create Object, InBox, Text, [‘Параметр1; Параметр2’]
где:
Object – тип создаваемого объекта;
InBox – уникальный код BOX’са куда помещаем объект;
Text – текстовое значение для вывода в объект при создании;
‘Параметр1; Параметр2’ – дополнительные именные параметра, через точку с запятой в обязательных кавычках. Пример: Width=30.
К дополнительным именным параметрам относятся все параметры всех объектов. Все параметры имеют значения по умолчанию, и требуют указания только в случае если программисту нужно создать объект с параметрами, отличными от стандартных. Процедура всегда возвращает уникальный код создаваемого объекта.
Применение данной процедуры позволило не только упростить синтаксис команд создания и управления объектами, но значительно сократить листинги программ, сделало их более читабельными. (Рис.14)
Рис.14
Как видно из слайда, разница налицо. При использовании команд самого RexxDW на создание одного объекта и указание всех его свойств уходит 2-4 строки. Тогда как при использовании процедуры «Create», весь механизм упрятан в неё.
Теперь рассмотрим один из моих уже реализованных на этой базе и внедренных проектов (Рис.15). Проект носит название «Автоматизация мониторинга и управления насосами». Предыстория: у моих друзей фирма занимаемся водоснабжением в 9 сельских населенных пунктах. В их управлении находиться поселковый водопровод, 20 скважин и насосных станций. Все объекты оборудованы необходимыми датчиками и контроллерами с GSM модемами. Через модемы контроллеры отправляют SMSс уведомлениями о срабатывании датчиков и совершенных действиях, а также могут принимать команды управления. Пока таких объектов управления было 1-5, можно было справляться с ними и через обычный сотовый телефон, а вот при большем количестве встал вопрос о надлежащей автоматизации задачи.
Она была успешно решена на REXX.
Рис.15
Вот так выглядит окно клиентской версии «Монитора насосов». Данная программа писалась одновременно и в Windowsи eCS(OS/2). И сразу проверялась на работу в обоих ОС. На мой взгляд, очень интересна структура организации данных в программе, так как подобное возможно только на REXX, но это выходит за пределы объявленной темы.
Отдельно хочется упомянуть ещё об одном проекте на REXX, разработку которого ведет ранее упомянутый друг Валентин Кузнецов. Проект носит название «WebFIDO» (Рис.16).
Это комплекс для доступа в FIDOиз интернета, идеологически напоминающий WebBBS. Основная ее цель - создание программных средств для работы в FIDO с мобильных устройств.
Рис.16.
Интерфейс разработан для удобного доступа посредством браузера мобильного телефона, но может использоваться и через любой браузер компьютера. Сейчас ДЕМО ВЕРСИЯ системы настолько улучшена, что по функциональности вплотную приблизилась к предрелизной сборке и в настоящий момент позволяет:
* Иметь каждому пользователю индивидуальный настоящий ФИДОадрес, пойнтовый или даже нодовый;
* Получить доступ к примерно 100 эхоконференциям ФИДОнет;
* Индивидуально управлять подпиской на эхоконференции;
* Писать и получать NetMail. Есть индикация прихода новых NetMail писем;
* Писать письма в эхоконференции, в том числе:
** ответы без цитирования или с цитированием;
** ответы в другую эхоконференцию;
** ответы получателю цитируемого письма;
* Скачивать файлы файлэх;
* Хатчить файлы в файлэхи.
Таким образом, система реализует практически весь стандартный функционал пакета ФИДОсофта начального уровня.
Для ознакомления с системой создан специальный гостевой вход с именем пользователя "Ghost User" и ФИДОадресом 2:5053/51.401. Функционал там весьма урезан, но почитать эхопочту, написать письма в несколько эхоконференций и покачать файлы можно без ограничений. Для захода гостем нужно в командной строке любого вменяемого браузера набрать строку:
https://behind-mirror.vfose.ru/cgi-bin/webfido.cmd?r=00000000000905040307
Для нас же важным является то, что весь проект написан на REXX'е, включая CGI-скрипты. Из других языков в проекте имеются лишь небольшие вставки яваскрипта. При этом объем исходных текстов на удивление невелик и составляет со всеми утилитами и образцами форм менее половины мегабайта (а если убрать комментарии, то и меньше).
За время работы с REXX набран значительный объем самых разнообразных материалов по языку. Включающие книги, инструкции, примера кода и прочее. В настоящее время ведется работы по созданию сайта посвященного программированию на REXX, где будет вложен весь имеющиеся материал. Адрес сайта: librexx.ru
Выводы:
- Из практики видно, что REXX является полноценным универсальным языком программирования, пригодным для самых разнообразных серьезных проектов. Мнения отдельных программистов о нем, как о «не до языке», не имеют под собой оснований.
- Кроссплатформенность проектов на REXX заложена самой идеологией языка.
- Исходный текст на REXX понятнее, чем у многих широко распространенных языков программирования. Листинги получаются не большими за счет высокой выразительности средств языка и глубокой проработки его основ.
- Концепция простоты языка для программиста реализована хорошо, и позволяет заботиться о функциональном наполнении проекта, вместо борьбы с техническими трудностями.
- Все требования, предъявленные мною, к среде для кроссплатформенных проектов REXX выполняет не ниже «Хорошо», а по некоторым пунктам и «Превосходно». Ява, Си и Паскаль с этой задачей не справились.