Rexx (REstructured eXtended eXecutor)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:57, 8 июня 2016.
Rexx (REstructured eXtended eXecutor)
fraimed
Парадигма мультипарадигмный: процедурный, структурированный
Спроектировано Mike Cowlishaw
Разработчики Mike Cowlishaw, IBM
Стабильная версия ANSI X3.274 / 1996; 26 years ago (1996)
Печать дисциплины Динамическая
Главная реализация
VM/SP, TSO/E V2, SAAREXX, ARexx, BREXX.
Диалект
NetRexx, Object REXX, now ooREXX
Влияние
NetRexx, Object REXX

Rexx (REstructured eXtended eXecutor) ([ ˌriːˈstrʌk.tʃər ɪkˈsten.dɪd ɪɡˈzek.jʊ.tər ]) это интерпретируемый язык программирования, разработанный в IBM Майком Коулишом. Это структурированный язык программирования высокого уровня предназначен для простоты обучения и чтения. Язык и открытый интерпретатор REXX существуют для широкого круга вычислительных платформ; также существуют компиляторы для машин IBM. [1]

Rexx широко используется в качестве языка сценариев и макросов, и часто используется для обработки данных, текста и создания отчетов; Эти сходства с Perl означают, что Rexx хорошо справляется с программированием CGI и действительно используются для этой цели. Rexx является основным языком сценариев в некоторых операционных системах, например, OS / 2, МВС, В.М., AmigaOS, а также используется в качестве внутреннего макро языка в некоторых других программах, таких как KEdit, и эмулятор терминала ZOC. Кроме того, Rexx язык может быть использован для написания сценариев и макросов в любой программе, которая использует Windows Scripting Host ActiveX (например, VBScript и JScript), если установлен один из движков Rexx.

Rexx поставляется с VM / SP и выше, TSO / E Версия 2 и выше, OS / 2 (1.3 и позже, когда он официально объявлен процедурным языком), AmigaOS Версия 2 и выше, PC DOS (7.0 или 2000) и Windows NT 4.0 (Набор инструментов: Regina). REXX скрипты для OS / 2 имеют коллизии расширения файла .cmd с другими языками сценариев, поэтому первая строка сценария определяет интерпретатор, который будет использоваться. REXX макросы для REXX-совместимых приложений используют расширения, определяемые приложением.

Rexx скрипт иногда называют EXEC в знак признания роли Rexx в качестве замены для этого языка.

Особенности

Rexx имеет следующие характеристики и особенности:

  • Простой синтаксис
  • Способность направлять команды нескольким средам
  • Способность поддерживать функции, процедуры и команды, связанные с конкретной вызывающей средой.
  • Встроенный стек, с возможностью взаимодействовать со стеком среды, если таковой имеется.
  • Набор небольших инструкций -всего два десятка
  • Свободный синтаксис
  • Независимые от регистра признаки, в том числе имена переменных
  • Основу составляет символьные строки
  • Динамическая типизация данных, нет деклараций
  • Нет зарезервированных ключевых слов, за исключением локального контекста
  • Нет встроенных файловых объекты
  • Произвольная числовая точность
  • Десятичная арифметика с плавающей точкой
  • Богатый выбор встроенных функций, в особенности строки и обработка текстов
  • Автоматическое управление хранением
  • Защита от ошибок
  • Адресуемые структуры данных
  • Ассоциативные массивы
  • Простой доступ к командам и объектам системы
  • Простая обработка ошибок и встроенный отладчик
  • Несколько искусственных ограничений
  • Упрощенные средства ввода / вывода
  • Нетрадиционные операторы
  • Только частично поддерживает параметры командной строки Unix, за исключением конкретных реализаций
  • Не обеспечивает основное управление терминалом как частью языка, за исключением конкретных реализаций
  • Не обеспечивает общий способ включать функции и подпрограммы из внешних библиотек, за исключением конкретных реализаций

Rexx имеет только двадцать три, в значительной степени само собой разумеющимся, инструкции (например, вызов, парсинг, выбор) с минимальной пунктуацией и форматированием требований. Это, по существу, почти свободная форма языка только с одним типом данных - символьная строка; эта философия означает, что все данные видны (символически) и отладки с трассировкой упрощены.

Синтаксис Rexx выглядит похоже на PL / I, но имеет меньше обозначений; труднее осуществлять парсинг (программой), но проще в использовании, за исключением случаев, когда привычки PL / I могут привести к казусам. Одна из целей проектирования REXX был принцип наименьшего удивления. .[2]

История

Rexx был разработан и впервые реализован на ассемблере, как собственный проект Майка Коулиша из IBM между 20 марта 1979 года и серединой 1982 года , первоначально в качестве языка сценариев программирования, чтобы заменить EXEC языки и EXEC 2. Было разработан, чтобы быть языком макросов и сценариев для любой системы. Таким образом, Rexx считается предшественником Tcl и Python. Rexx был также предназначен его создателем быть упрощеным и помоч в освоении, чем PL / I. Тем не менее, некоторые отличия от PL / I могут сбить с толку невнимательных.

Впервые он был представлен общественности на 56 конференции в Хьюстоне, штат Техас, в 1981 году ,[3] где реакция слушателей, представленная Тедом Джонстоном из SLAC, привело к поставке Rexx в качестве продукта IBM в 1982. На протяжении многих лет Rexx входит в IBM почти во всех операционных системах CMS, МВС TSO / E, AS / 400, ESA, AIX, PC DOS, и OS / 2, и также некоторые версии доступны для Novell NetWare, Windows, Java, и Linux.

Первая версия не совсем была написана для IBM. Первая версия была для PC DOS, написана Чарльзом Дэнеем в 1984/5. Первая версия компилятора появилась в 1987 году, написана для CMS Лундином и Вудраффом .[4] Other versions have also been developed for Atari, AmigaOS, Unix, Solaris, DEC, Windows, Windows CE, Pocket PC, DOS, Palm OS, QNX, OS/2, Linux, BeOS, EPOC32/Symbian, AtheOS, OpenVMS, Apple Macintosh, and Mac OS X.[5] Другие версии были также разработаны для Atari, AmigaOS, Unix, Solaris, DEC, Windows, Windows CE, Pocket PC, DOS, Palm OS, QNX , OS / 2, Linux, BeOS, EPOC32 / Symbian, AtheOS, OpenVMS, Apple Macintosh, и Mac OS X.[5]

Amiga версия Rexx, называется ARexx, был включен в AmigaOS на протяжении 2 лет, и была популярна для сценариев, а также контроля приложений. Многие Amig- приложения имеют Rexx-порт, что позволяет контролировать приложения от Rexx. Один сценарий Rexx может даже переключаться между различными портами для того, чтобы контролировать несколько запущенных приложений. В 1990 году Кэти Дагер из SLAC организовал первый независимый Rexx симпозиум, который привел к формированию языковой Ассоциации REXX. Симпозиумы проводятся ежегодно.

Доступны несколько бесплатных версий Rexx. В 1992 году появились два наиболее широко используемых порта с открытым исходным кодом : REXX / IMC для Unix от Яна Колье и Регина Андерса Кристенсена (позже принятой Марк Hessling) для Windows и Unix. BREXX распространен на WinCE и Pocket PC платформы, и был "обратно портирован" на VM / 370 и MVS.

OS / 2 имел визуальную систему от другого диалекта Watcom VX-REXX и VisPro REXX от Hockware.

Портативный Rexx от Killowat и Personal Rexx от Quercus - два интерпретатора Rexx, предназначенные для MS-DOS и, возможно, работающие под Windows, с помощью командной строки. С середины 1990-х, появилось два новых варианта Rexx:

  • NetRexx: компилирует Java байт-код через исходный код Java, не имеет зарезервированные ключевые слова совсем , и использует объектную модель Java, и, совсем не совместим с «классическим» Rexx.
  • Object REXX: объектно-ориентированный Rexx и как правило, совместимый с предыдущими версиями Rexx.

В 1996 ANSI опубликовала стандарт для Rexx: ANSI X3.274-1996 "Информационные технологии - Программирование Язык REXX" [5] Более двух десятков книг по Rexx были опубликованы с 1985 года. Rexx отметил свое 25-летие на 20 марта 2004 года, который отмечался в 15-й Международной REXX симпозиуме Язык Ассоциации Rexx в Böblingen, Германия, в мае 2004 года.

12 октября 2004 года, IBM объявила свой план выложить реализации Object REXX под общей публичной лицензией. Последние релизы Object REXX содержать движок скриптов ActiveX WSH ,реализующий эту версию языка Rexx.

22 февраля 2005 года, был объявлен первый офицальный релиз Open Object Rexx (ooRexx). Этот продукт содержит движок сприптов WSH, который позволяет программировать в операционной системе Windows приложения с помощью Rexx таким же образом, в котором Visual Basic и Java / J ++ это реализовано путем установки по умолчанию WSH и Perl, TCL, Python и сторонних скрпитовых движков,

Командная строка интерпретатора Rexx также устанавливается с ooRexx, и это также можно позволяет запускать программы ooRexxScript из командной строки с помощью команды CSCRIPT (WScript также может быть запущен из командной строки) вызова Windows Scripting Host.

Rexx / Tk это инструментарий для работы с графикой, который будет использоваться в программах Rexx в же образом, как широко доступный Tcl / Tk.

Rexx IDE, RxxxEd, был разработан для Windows. RxSock для работы в сети,также, как и другие дополнения к Regina Rexx и интерпретатор Rexx для командной строки Windows, поставляется в большинстве наборов ресурсов для различных версий Windows, и работает в соответствии со всеми из них, а также MS-DOS.

Правописание и заглавные буквы

Первоначально язык назывался Rex (реформированный исполнитель); дополнительная "Х" была добавлена, чтобы избежать столкновения с именами других продуктов. REX изначально имел только заглавные буквы, так как код мэйнфреймы им направленность на верхний регистр. В те времена стиль требовал иметь только имена из заглавных букв, отчасти потому, что почти весь код по-прежнему был из заглавных букв. Для продукта в итоге добавилась ее одна X и оба издания книги Майка использовали только заглавные буквы. Расширение для REXX был использован для системных продуктов в 1984 году. К 1990 он был в значительной степени, написан как Rexx или, с малыми заглавными: REXX. Документы IBM использовали REXX, и стандарт ANSI использует REXX;

Синтаксис

Цикл

Циклическая структура в Rexx начинается с DO и заканчивается END, но может быть представлена в нескольких вариантах. NetRexx использует LOOP вместо DO для цикла, в то время как ooRexx интерпертирует LOOP и DO одинаково

Условные циклы

Rexx поддерживает разнообразные традиционные циклы структурного программирования при тестировании условия либо до (делать, пока) или после (не сделать, пока) выполнения списка инструкций:

 do while [condition]
 [instructions]
 end
 do until [condition]
 [instructions]
 end

Повторяющиеся циклы

Как и большинство языков, Rexx может входить в рекурсию и увеличивать переменную индекса и выходить, когда достигается предел:

 do index = start [to limit] [by increment] [for count]
 [instructions]
 end

Инкремент может быть опущен и является по умолчанию 1. предел тоже может быть опущен, что делает продолжает цикл навсегда. Rexx разрешает счетные циклы, где выражение вычисляется в начале цикла и инструкции внутри цикла выполняются столько раз, сколько было вычислено до:

 do expression
 [instructions]
 end

Rexx может выполнять цикл вечно, пока программа не будет завершена:

 do forever
 [instructions]
 end

Программа может вырваться из цикла тока с инструкцией leave, которая является обычным способом выхода цикла типа сделай-навсегда, или может использоваться для быстрого выхода после необходимых итераций инструкций.

Комбинированные циклы

Необычно, что Rexx позволяет комбинировать повторяющиеся и условные элементы в одном и том же цикле[6]

 do index = start [to limit] [by increment] [for count] [while condition]
 [instructions]
 end
 do expression [until condition]
 [instructions]
 end

Условия

Проверка условий с помощью IF:

 if [condition] then
 do
 [instructions]
 end
 else
 do
 [instructions]
 end

ELSE опционально.

 if [condition] then do
 [instructions]
 end
 else do
 [instructions]
 end

Для одиночных конструкций DO and END также могут быть опущены

 if [condition] then
 [instruction]
 else
 [instruction]

Или, в другой краткой версии

 if [condition] then [instruction]
 else [instruction]

Отступы не являются обязательными, но они помогают улучшить читаемость.

Тестирование множественных условий

SELECT это Rexx CASE-структура, как и многих других конструкций, получена от PL / I. Как и в некоторых реализациях CASE-конструкций в других динамических языках, положение WHEN указывает полные условия, которые не должны быть связаны друг с другом. В этом, они больше похожи на каскадные комплекты IF-THEN-ELSEIF-THEN-...-ELSE

 select
 when [condition] then
 [instruction] or NOP
 when [condition] then
 do
 [instructions] or NOP
 end
 otherwise
 [instructions] or NOP
 end

Nop-инструкция используется программистом там, где он не хочет ничего выполнять, но требуется выполнение каких-либо инструкций. Условие OTHERWISE опционально. Если оно опущено и не встретилось конструкции WHEN, then тогда условие SYNTAX необходимо.

Простые переменные

Переменные в Rexx не чувствительны к регистру и не привязаны к определенному типу:

 say hello /* => HELLO */
 hello = 25
 say hello /* => 25 */
 hello = "say 5 + 3"
 say hello /* => say 5 + 3 */
 interpret hello /* => 8 */
 drop hello
 say hello /* => HELLO */

Составные переменные

В отличие от многих других языков программирования, классический Rexx не имеет прямой поддержки массивов переменных, адресуемых с помощью численного индекса. Вместо этого он предлагает сложные переменные. Составная переменная состоит из ствола с последующим хвостом. Точка используется для соединения ствола с хвостом. Если хвосты используются числовые, легко произвести тот же эффект в виде массива.

 do i = 1 to 10
 stem.i = 10 - i
 end

В последствии эти переменные будут иметь следующие значения: stem.1 = 9, stem.2 = 8, stem.3 = 7... В отличие от массивов, индекс для переменной не обязательно должен иметь целое значение. Например, следующий код является действительным:

 i = 'Monday'
 stem.i = 2

В Rexx также можно установить значение ствола по умолчанию

 stem. = 'Unknown'
 stem.1 = 'USA'
 stem.44 = 'UK'
 stem.33 = 'France'

После этих действий stem.3 выдаст 'Unknown'. Также весь ствол может быть стёрт инструкцией DROP

 drop stem.

С помощью этой функции можно также сбросить любое установленное ранее значение По соглашению (а не как часть языка) stem.0 часто используется, чтобы отслеживать, сколько элементов в стебле, например процедура добавления слова в список может быть закодированной как это:

 add_word: procedure expose dictionary.
 parse arg w
 n = dictionary.0 + 1
 dictionary.n = w
 dictionary.0 = n
 return

Также можно иметь несколько переменных в хвосте. К примеру:

 m = 'July'
 d = 15
 y = 2005
 day.y.m.d = 'Friday'

Несколько цифровых хвостовых элементов могут быть использованы, чтобы обеспечить эффект многомерного массива. Особенности, похожие на составные переменные в Rexx были найдены во многих других языках (в том числе ассоциативных массивов в AWK, хэши в Perl и хэш-таблиц в Java. Большинство из этих языков обеспечивают инструкцию перебора всех ключей (или хвосты в Rexx выражении) , но этого не хватает в классическом Rexx. Вместо этого необходимо, держать вспомогательные списки хвостовых значений, соответствующим образом. например, в программе для подсчета слов следующую процедуру можно использовать для записи каждого вхождения слова.

 add_word: procedure expose count. word_list
 parse arg w .
 count.w = count.w + 1 /* assume count. has been set to 0 */
 if count.w = 1 then word_list = word_list w
 return

и позже:

 do i = 1 to words(word_list)
 w = word(word_list,i)
 say w count.w
 end

За счет потери некоторой ясности кода возможно скомбинировать эти техники в один ствол:

 add_word: procedure expose dictionary.
 parse arg w .
 dictionary.w = dictionary.w + 1
 if dictionary.w = 1 /* assume dictionary. = 0 */
 then do
 n = dictionary.0+1
 dictionary.n = w
 dictionary.0 = n
 end
 return

и немного позднее:

 do i = 1 to dictionary.0
 w = dictionary.i
 say i w dictionary.w
 end

Rexx не обеспечивает сетевую безопасность, так что если одно из слов является числом менее чем dictionary.0 этот метод загадочным образом выдаст ошибку. Последние реализации Rexx, в том числе объектов REXX IBM и открытых реализаций источника, как ooRexx включают новый язык,упрощающий конструкцию итерации по стоимости стебля, или над другим объектом коллекций, такие как массив, таблица или список.

 do i over stem.
 say i '-->' stem.i
 end

Ключевые инструкции

PARSE

Инструкция PARSE сочетает в себе несколько полезных функций обработки строк. Синтаксис:

parse [upper] origin [template]

где origin определяет источник: • arg (аргументы на верхнем уровне хвоста командной строки) • LineIn (стандартный ввод, например клавиатура) • pull (очереди данных Rexx или стандартный ввод) • source (информация о том, программа была выполнена) • value (выражение) with: ключевое слово с требуется, чтобы указать, где кончается экспрессии • var (переменная) • version (версия / номер выпуска) и шаблон может быть: • список переменных • номер столбца разделителей • буквальные разделители Верхний регистр является необязательным; если указано, данные будут преобразованы в верхний регистр перед парсингом. Примеры: Использование списка переменных в качестве матрицы

 myVar = "John Smith"
 parse var myVar firstName lastName
 say "First name is:" firstName
 say "Last name is:" lastName

отобразит следующее:

 First name is: John
 Last name is: Smith

Использование разделителя в качестве шаблона:

 myVar = "Smith, John"
 parse var myVar LastName "," FirstName
 say "First name is:" firstName
 say "Last name is:" lastName

также отобразит следующее:

 First name is: John
 Last name is: Smith

Использование колонок цифровых разделителей:

 myVar = "(202) 123-1234"
 parse var MyVar 2 AreaCode 5 7 SubNumber
 say "Area code is:" AreaCode
 say "Subscriber number is:" SubNumber

Отобразит следующее:

 Area code is: 202
 Subscriber number is: 123-1234

Шаблон можно использовать как комбинацию переменных, литеральных разделителей, и столбцов цифровых разделителей.

INTERPRET

Инструкция INTERPRET вычисляет аргумент и обрабатывает его значение как утверждение в Rexx. INTERPRET инструкция является мощной и одной из главных причин, почему писать Rexx компиляторы нетривиально. Другая причина состоит в том,что Rexx (в десятичной системе) имеет произвольную арифметическую точность (в том числе в нечетких сравнениях), использование инструкции PARSE с программными шаблонам, стволовыми массивами и разреженными массивов. ->

 /* demonstrate INTERPRET with square(4) => 16 */
 X = 'square'
 interpret 'say' X || '(4) ; exit'
 SQUARE: return arg(1)**2

Это отображает 16 и завершает работу. Из-за того, что содержимое переменной в Rexx является строкой, включая рациональные числа с показателями и даже целые программы, Rexx предлагает интерпретировать строки в качестве вычисленных выражений. Эта функция может быть использована для передачи функции в качестве параметров функций, таких как SIN или COS в процедурах вычисления интегралов. Rexx предлагает только базовые функции, как ABS, DIGITS, MAX, MIN, ЗНАК, RANDOM, и полный набор шестнадцатеричных плюс бинарных преобразований с битовых операций. Более сложные функции, такие как SIN, должны быть реализованы с нуля или получены из сторонних внешних библиотек. Некоторые внешние библиотеки, как правило, реализованные в традиционных языках, не поддерживают расширенную точность. Более поздние версии (не классические) поддерживают переменные конструкций CALL. Вместе с встроенной функцией VALUE, CALL может быть использован вместо INTERPRET. Это классическая программа:

 /* terminated by input "exit" or similar */
 do forever ; interpret linein() ; end

Чуть более сложный "Rexx калькулятор":

 X = 'input BYE to quit'
 do until X = 'BYE' ; interpret 'say' X ; pull X ; end

PULL это сокращение для PARSE UPPER PULL. Точно так же, ARG является сокращением для PARSE UPPER ARG. Инструкцию INTERPRET можно использовать в других случаях. Пакет программного обеспечения Valour основывается на интерпретаторе REXX для реализации среды ООП. Другое использование было найдено в неизданных продуктах Westinghouse под названием Машина времени, которая могла полностью восстановиться после фатальной ошибки.

NUMERIC

 say digits() fuzz() form() /* => 9 0 SCIENTIFIC */
 say 999999999+1 /* => 1.000000000E+9 */
 numeric digits 10 /* only limited by available memory */
 say 999999999+1 /* => 1000000000 */

 say 0.9999999999=1 /* => 0 (false) */
 numeric fuzz 3
 say 0.99999999=1 /* => 1 (true) */
 say 0.99999999 == 1 /* => 0 (false) */

 say 100*123456789 /* => 1.23456789E+10 */
 numeric form engineering
 say 100*123456789 /* => 12.34567890E+9 */
  Calculates sqrt Calculates e
code
 numeric digits 50
 n=2
 r=1
 do forever /* Newton's method */
 rr=(n/r+r)/2
 if r=rr then leave
 r=rr
 end
 say "sqrt" n ' = ' r
 numeric digits 50
 e=2.5
 f=0.5
 do n=3
 f=f/n
 ee=e+f
 if e=ee then leave
 e=ee
 end
 say "e =" e
output sqrt 2 = 1.414213562373095048801688724209698078569671875377 e = 2.7182818284590452353602874713526624977572470936998

SIGNAL

Инструкция SIGNAL предназначена для аномальных изменений в потоке управления (смотрите следующий раздел). Тем не менее, это может быть неправильно и рассматриваются как GOTO в других языках (хотя они не строго эквивалентны, так как он завершает циклы и другие конструкции). Это может привести к трудной читаемости кода.

Обработка ошибок и исключений

В Rexx возможно перехватить ошибки и другие исключения, используя инструкцию SIGNAL. Есть семь системных условий: ERROR, FAILURE, HALT, NOVALUE, NOTREADY, LOSTDIGITS and SYNTAX. Обращение c каждым может быть включено и выключено в исходном коде по желанию. Следующая программа будет работать до тех пор, пока не будет прекращена

 signal on halt;
 do a = 1
	 say a
	 do 100000 /* a delay */
	 end
 end
 halt:
 say "The program was stopped by the user"
 exit

Многие программисты считают, что в Rexx опираться на значения символов по умолчанию опасно и используют SIGNAL на NOVALUE или аналогичное утверждение. Это перехватывает использования неопределенных переменных, которые, в противном случае, получают свой собственный (в верхнем регистре) имя их значения. Независимо от состояния условия NOVALUE, статус переменной всегда можно проверить с помощью встроенного в функции SYMBOL возвращения VAR для определенных переменных. Функция VALUE может быть использована для получения значения переменных, не вызывая условие NOVALUE, но его основной целью является чтение и установление переменных окружений, похожих на POSIX GETENV и PutEnv.

Условия

ERROR Положительный RC от системной команды FAILURE Отрицательный RC для системной команды (например, команда не существет) HALT Аварийное завершение NOVALUE Ссылка на неопределенную переменную NOTREADY Ошибка ввода-вывода (например,попытки чтения за пределами конца файла) SYNTAX Недопустимый синтаксис программы, или какое-либо другое условие ошибки LOSTDIGITS Значительные цифры теряются (ANSI Rexx,но не TRL второго издания)

Когда состояние обрабатывается инструкцией SIGNAL ON, системные переменные Sigl и RC могут быть проанализированы. RC содержит код ошибки Rexx и SIGL содержит номер строки, где возникла ошибка. Начиная с версии 4 Rexx условия могут получить имена, и есть также конструкция CALL ON. Это удобно, если внешние функции не существуют обязательно:

 ChangeCodePage: procedure /* protect SIGNAL settings */
 signal on syntax name ChangeCodePage.Trap
 return SysQueryProcessCodePage()
 ChangeCodePage.Trap: return 1004 /* windows-1252 on OS/2 */

Ссылки

  1. [1],IBM Library
  2. [2],The design of the REXX
  3. [3],REX - A Command Programming Language
  4. [4],First compiler
  5. 5,0 5,1 [5],Rexx Implementations
  6. The Rexx Language - A Practical Approach to Programming,author Cowlishaw