Object REXX — это высокоуровневый , универсальный , интерпретируемый , объектно-ориентированный ( основанный на классах ) язык программирования .
Это продолжение и значительное расширение языка программирования Rexx (часто называемого «Classic Rexx»). Object REXX сохраняет все возможности и синтаксис «Classic Rexx», добавляя при этом возможности полного объектно-ориентированного программирования (ООП). Хотя Object REXX не реализует все аспекты стандарта «Информационные технологии – Язык программирования REXX» ANSI X3.274-1996 [1] , он предлагает много новых собственных возможностей.
Следуя влиянию "Classic Rexx", Object REXX разработан так, чтобы его было легко изучать, использовать и поддерживать. Доступно несколько объектно-ориентированных реализаций REXX, включая Open Object Rexx ("ooRexx") и Rexx Object Oriented ("roo!"). [2] : 311
В 1988 году проект «Oryx» в IBM под техническим руководством Саймона К. Нэша экспериментировал со слиянием «Classic Rexx» с объектной моделью Smalltalk . [3] [4] Мотивацией проекта было перенести преимущества ООП в «Classic Rexx», сохранив совместимость и, таким образом, перенеся удобство использования «Classic Rexx» в ООП. [5] Вначале проекты были сосредоточены на аспектах ООП , таких как рассмотрение всего как объекта, объектно-ориентированная инкапсуляция и передача сообщений , объектно-ориентированный параллелизм , классы и наследование . [6]
Эта первоначальная работа позже привела под руководством Рика МакГвайра к первому прототипу Object REXX, который был представлен в 1992 году. В 1994 году IBM объявила, что Object REXX заменит «Classic Rexx» в качестве стандартного интерпретатора REXX в следующей версии OS/2 . [4] В 1996 году Object REXX [a] был выпущен как часть операционной системы OS/2 Warp 4. [7] В 1997 году последовали версии для Windows 95 , Windows NT и Linux . [8] [9] В 1999 году была выпущена версия Object REXX для AIX V4.1.5 или выше. [10] В 2000 году последовали версии для zLinux и Sun/Solaris . Для Windows 2000 , Windows Me , Windows 98 и Windows NT 4.0 последнее крупное обновление для Object REXX было выпущено в 2001 году. [11]
12 октября 2004 года IBM объявила о прекращении разработки Object REXX и передала исходный код и лицензионные права [b] некоммерческой Special Interest Group (SIG), Rexx Language Association (RexxLA). В 2005 году RexxLA выпустила ooRexx как новое воплощение Object REXX как бесплатное и открытое программное обеспечение под лицензией Common Public License . [12] Эта первая версия ooRexx 3.0.0 была значительно переработана по сравнению с исходным кодом IBM с целью повышения читабельности. Позднее ядро ooRexx было переписано на чистом C++ , а новая архитектура и собственный интерфейс были спроектированы и реализованы под техническим руководством Рика МакГвайра. Эта работа позволила RexxLA выпустить ooRexx 4.0.0 с поддержкой 64-бит в 2009 году. По сей день RexxLA продолжает разрабатывать, поддерживать и обслуживать ooRexx, а также "Classic Rexx" и NetRexx . Кроме того, RexxLA организует ежегодные симпозиумы. [13]
Оригинальный интерпретатор Object REXX компании IBM по-прежнему доступен в операционных системах на базе OS/2, таких как ArcaOS и eComStation .
Следующая таблица содержит примечательные особенности и изменения основных версий интерпретатора Object REXX и ooRexx. Все выпуски ooRexx и необходимая документация доступны на Sourceforge . [14] [15] Для дистрибутивов на базе Arch Linux текущая и разрабатываемая версии доступны как Arch User Repository . Для ooRexx 5.0.0 доступен неофициальный порт для OS/2. Начиная с выпуска 5.0.0 доступны переносимые версии интерпретатора, которые позволяют использовать его без установки. Для Intellij IDEA ooRexxPlugin добавляет поддержку подсветки синтаксиса , проверки синтаксиса, автодополнения кода и поддержки документации по образцу Javadoc с использованием аннотаций . [16]
ooRexx разработан с целью сохранения всех функций "Classic Rexx". Он соответствует [c] стандарту ANSI для языка Rexx (X3.274-1996, "Programming Language Rexx" [1] ), для взаимодействия на разных платформах с другими соответствующими реализациями. Таким образом, программы "Classic Rexx" обычно запускаются под ooRexx без каких-либо изменений. Это позволяет легко переносить как программный код, так и знания разработчиков из "Classic Rexx" в ooRexx. К этому ooRexx добавляет все функции ООП, такие как подклассы , полиморфизм и инкапсуляция данных . Дополнительные функции включают множественное наследование через mixin classes .
Код, который IBM выпустила с открытым исходным кодом в 2004 году, не включал классы для поддержки IBM System Object Model (SOM) и Workplace Shell (WPS). [31] Версия IBM Object REXX для OS/2 включает классы для поддержки SOM [32] и WPS. [33] Они также включены в первоначальный последующий продукт OS/2, eComStation, а также в его нынешнего потомка, ArcaOS. [34]
ooRexx следует философии дизайна «Classic Rexx», чтобы создать «ориентированный на человека» язык программирования, который легко изучать, кодировать, запоминать и поддерживать. Это достигается, отчасти, за счет сохранения небольшого размера языка и следования принципу наименьшего удивления . [2] [35] ooRexx 5.0.0, например, содержит всего тридцать ключевых инструкций. [36] Кроме того, это динамический язык программирования , который предлагает гибкость и позволяет сосредоточиться на разработке, а не на языковых ограничениях. Существует только один тип данных, строка символов , который не нужно объявлять, что снижает усилия программистов по сравнению со строго типизированными языками . [37]
Подобно «Classic Rexx», существуют инструкции присваивания, инструкции ключевых слов и инструкции команд. В отличие от многих других языков, ключевые слова не зарезервированы, поэтому нет необходимости запоминать длинный список зарезервированных слов . [38] В случаях, когда строка не является ни инструкцией присваивания, ни инструкцией ключевого слова, она считается инструкцией команды, что заставляет интерпретатор передавать ее операционной системе для выполнения и устанавливать переменную RC
для кода возврата. Кроме того, ADDRESS
инструкция позволяет перенаправлять команды в определенные среды, такие как Bourne Shell , Bash , Z-Shell , Command Prompt и другие, а также перехватывать ошибки.
a = "привет мир" /* инструкция присваивания */ do i = 1 to 2 /* ключевое слово инструкция "DO" */ сказать "раунд #" i ":" a /* ключевое слово инструкция "SAY" */ конец /* ключевое слово инструкция "END" */ "echo Hello World" /* команда операционной системе */ скажите "RC:" rc /* код возврата */
Как и «Classic Rexx», ooRexx имеет синтаксис свободной формы , где расположение программного кода не имеет значения. Перед выполнением интерпретатор объединяет несколько некавыченных пробелов в один, в то время как строка символов, заключенная в кавычки (одинарные или двойные), не изменяется. Конкатенацию можно запросить явно с помощью двух вертикальных черт ( ||
), или неявно, разделяя термины пробелами или примыкая терминами. Поскольку язык свободной формы требует рассмотрения меньшего количества синтаксических правил, предполагается, что он облегчает процесс обучения за счет снижения внутренней когнитивной нагрузки . [39]
скажите "Привет, мир!" /* вывод: Привет, мир! */ сказать "Это" 'есть' "REXX!" /* вывод: Это REXX! */ скажи "До свидания""пока" || '!' /* вывод: До свидания! */
Как "Classic Rexx", ooRexx является языком программирования, нечувствительным к регистру . Интерпретатор делает заглавными все символы вне кавычек перед их выполнением. Поскольку регистры не нужно различать, требуется изучать меньше дополнительных деталей, и удается избежать раздражающих синтаксических ошибок. [39]
a = "Это REXX!" Скажите A /* вывод: Это REXX! */ СКАЖИТЕ / * вывод: Это REXX! */
Подобно парадигме обмена сообщениями, реализованной Аланом Кейем в Smalltalk, все в ooRexx является объектом, с которым можно общаться, отправляя сообщения, называя метод. Идея отправки сообщений объектам, как если бы они были живыми существами, помогает новичкам изучать концепции ООП. [38]
В отличие от Smalltalk, есть явный оператор сообщения, тильда ( ~
), где принимающий объект помещается слева от него, а результат операции возвращается. Как и в Smalltalk, сообщения ooRexx могут быть каскадированы, если ~~
используются две тильды ( ) вместо одной, возвращая объект, который получил метод, а не полученный результат. Поведение большинства методов по умолчанию можно изменить, указав опцию, которая может быть либо прописана полностью, либо сокращена и не чувствительна к регистру. Это обеспечивает буквальное понимание и снижает усилия по обучению для новичков. [39] Например, метод strip по умолчанию удаляет начальные и конечные пробелы. Это поведение можно изменить, например, указав "leading"
или "l"
в качестве опции. В то время как функции вложены в «Classic Rexx», сообщения можно объединять в цепочку в ooRexx, что улучшает читаемость оператора . [ 38]
a = "Я ooRexx!" скажите / * вывод: Я ooRexx! */ скажите ~ Strip ( "Leading" ) /* вывод : Я ooRexx! */ скажи ~ полоска ( "l" ) ~ обратный /* вывод: ! xxeRoo ma I */
Парадигма обмена сообщениями позволяет одновременное выполнение нескольких методов на одном объекте, так что параллелизм возможен. Несколько объектов могут быть активны одновременно и обмениваться сообщениями друг с другом для коммуникации и синхронизации. [36]
В дополнение к трем типам инструкций «Classic Rexx», ooRexx добавляет директивные инструкции, которые не являются исполняемыми, при этом первая директива отмечает конец исполняемой части программы. [36] Чтобы сделать директивные инструкции легко распознаваемыми, они вводятся с двумя последовательными двоеточиями, например ::CLASS classname
, , что заставляет интерпретатор определять новый класс с именем «classname».
d = . dog ~ new /* создать и назначить собаку */ d ~ лай /* пусть собака лает */ :: класс собака /* директива класса */ :: метод bark /* директива метода */ скажи "гав!" /* вывод: гав! */
Существует четыре различных типа классов: классы объектов, которые действуют как фабрика для создания объектов, классы-миксины , которые добавляют методы к другим классам, абстрактные классы, которые предоставляют определения для методов, и метаклассы , которые могут использоваться для создания других классов. [36]
ooRexx release 5.0.0 содержит 82 встроенные функции , число которых оставалось относительно стабильным на протяжении многих лет. [36] Используя ::requires
директиву , внешние библиотеки функций могут быть интегрированы на уровне программ. Такие библиотеки обычно организованы вокруг доменно-специфичных функций.
Библиотека расширений Rexx предоставляет класс для чтения и записи файлов со значениями, разделенными запятыми (CSV), для создания и обработки данных JavaScript Object Notation (JSON) и среды подкоманд, которая частично эмулирует среду TSO / CMS . [40] Библиотека RxMath предлагает расширенные математические функции, такие как вычисление квадратного корня, показательная функция, логарифм, синус, косинус, тангенс, арксинус и вычисление мощности. [41] Библиотека RxSock позволяет включать протоколы TCP/IP , [42] в то время как библиотека RxFtp [43] специально предоставляет доступ к протоколу передачи файлов .
Расширение Windows включает в себя Windows Script Host (WSH) Scripting Engine, который может использоваться для выполнения общих задач автоматизации. Он также включает в себя Object Linking and Embedding / ActiveX (OLE) поддержку, позволяющую взаимодействовать с программами Windows, такими как Microsoft Office через OLEObject
. [44] ooSQLite предоставляет интерфейс для SQLite , внутрипроцессной библиотеки, которая реализует автономный, безсерверный, безконфигурационный, транзакционный SQL- движок базы данных. [45] Существует также внешняя библиотека, которая реализует двунаправленный мост Java , основанный на Bean Scripting Framework , называемый BSF4ooRexx, который позволяет использовать классы Java в программах ooRexx. [38]
Для Windows ooRexx включает фреймворк OODialog, позволяющий создавать диалоговые окна Windows и, следовательно, графические пользовательские интерфейсы . [46] В дополнение к поддержке OLE расширение Windows может взаимодействовать с менеджером программ Windows, системным журналом событий , буфером обмена и реестром, а также запрашивать, редактировать и взаимодействовать с окнами, меню или подменю. [44]
Для POSIX -совместимых операционных систем библиотека классов nCurses позволяет писать текстовые пользовательские интерфейсы с использованием библиотеки программирования ncurses . [47] Библиотека RxUnixSys предоставляет функции для большинства систем Unix для взаимодействия с процессами и потоками, пользователями и группами пользователей, файлами и файловыми системами и т. д. [48]