Парадигма | Конкатенативный ( на основе стека ), [1] структурированный |
---|---|
Разработано | Hewlett-Packard |
Впервые появился | 1984 (1986) |
ОС | Калькуляторы HP |
Диалекты | |
Системный RPL, Пользовательский RPL | |
Под влиянием | |
RPN , Форт , Лисп [2] |
RPL [5] — операционная система для карманных калькуляторов и язык программирования приложений , используемый в научных графических калькуляторах Hewlett-Packard RPN (обратная польская запись) серий HP 28 , 48 , 49 и 50 , но его можно использовать и на калькуляторах без RPN, таких как серии 38 , 39 и 40. Внутри он также использовался в 17B , 18C , 19B и 27S . [7]
RPL — это структурированный язык программирования, основанный на RPN, но в равной степени способный обрабатывать алгебраические выражения и формулы, реализованный как потоковый интерпретатор . [8] RPL имеет много общего с Forth , оба языка основаны на стеке , а также с LISP на основе списков . В отличие от предыдущих калькуляторов HP RPN, которые имели фиксированный четырехуровневый стек , динамический стек, используемый RPL, ограничен только доступным объемом оперативной памяти , при этом калькулятор отображает сообщение об ошибке, когда заканчивается память, а не молча сбрасывает аргументы из стека, как в стеках RPN фиксированного размера. [9]
RPL возник в 1984 году в исследовательском центре HP в Корваллисе, штат Орегон, как замена предыдущей практике реализации операционных систем калькуляторов на языке ассемблера . [7] Первым калькулятором, использовавшим его внутри компании, был HP-18C, а первым калькулятором, сделавшим его доступным для пользователей, был HP-28C, оба выпущены в 1986 году. [10] [7] Последний карманный калькулятор, поддерживающий RPL, HP 50g, был снят с производства в 2015 году. [11] [12] [13] Однако существует множество эмуляторов, которые могут эмулировать калькуляторы RPL компании HP, работающие в различных операционных системах и на различных устройствах, включая смартфоны iOS и Android.Существует также ряд проектов сообщества по воссозданию и расширению RPL на новых калькуляторах, таких как newRPL [14] [15] или DB48X , [16] [17] , которые могут добавлять функции или улучшать производительность. [18]
Внутренний низко-среднеуровневый вариант RPL, называемый System RPL (или SysRPL ), используется в некоторых более ранних калькуляторах HP, а также в вышеупомянутых, как часть языка реализации их операционной системы . В серии HP 48 этот вариант RPL недоступен пользователю калькулятора без использования внешних инструментов, но в сериях HP 49/50 в ПЗУ встроен компилятор для использования SysRPL. При кодировании в SysRPL можно вызвать серьезный сбой, поэтому при его использовании следует соблюдать осторожность. Высокоуровневая версия User RPL (или UserRPL ) языка доступна в указанных графических калькуляторах для разработки текстовых и графических прикладных программ. Все программы UserRPL внутренне представлены как программы SysRPL, но используют только безопасное подмножество доступных команд SysRPL. Однако проверка ошибок, которая является частью команд UserRPL, делает программы UserRPL заметно медленнее, чем эквивалентные программы SysRPL. Команда UserRPL SYSEVAL сообщает калькулятору, что необходимо обрабатывать определенные части программы UserRPL как код SysRPL.
Блоки управления RPL не являются строго постфиксными . Хотя есть некоторые заметные исключения, структуры блоков управления выглядят так, как они выглядят в стандартном инфиксном языке. Калькулятор управляет этим, позволяя реализации этих блоков пропускать вперед в потоке программы по мере необходимости.
RPL поддерживает базовую условную проверку через структуру IF/THEN/ELSE. Базовый синтаксис этого блока:
ЕСЛИ условие ТО если-истина [ИНАЧЕ если-ложь] КОНЕЦ
В следующем примере проверяется, равно ли число в нижней части стека «1», и, если да, заменяет его на «Равно единице»:
« ЕСЛИ 1 == ТО "Равно одному" КОНЕЦ »
Конструкция IF оценивает условие, а затем проверяет дно стека на предмет результата. В результате RPL может опционально поддерживать блоки IF в стиле FORTH, позволяя определять условие до блока. Оставляя условие пустым, оператор IF не будет вносить никаких изменений в стек во время выполнения условия и будет использовать существующий результат внизу стека для проверки:
« 1 == ЕСЛИ ТО "Равно одному" КОНЕЦ »
Постфиксное условное тестирование может быть выполнено с использованием функций IFT («if-then») и IFTE («if-then-else»).
IFT и IFTE выталкивают из стека две или три команды соответственно. Верхнее значение оценивается как логическое, и, если оно истинно, второе верхнее значение помещается обратно в стек. IFTE допускает третье значение «else», которое будет помещено обратно в стек, если логическое значение ложно.
В следующем примере функция IFT используется для извлечения объекта из нижней части стека и, если он равен 1, заменяет его на «One»:
« 1 == «Один» IFT »
В следующем примере функция IFTE используется для извлечения объекта из нижней части стека и, если он равен 1, заменяет его на «One». Если он не равен 1, заменяет его на строку «Not one»:
« 1 == "Один" "Ни один" IFTE »
IFT и IFTE оценят программный блок, заданный как один из его аргументов, что позволяет использовать более компактную форму условной логики, чем структура IF/THEN/ELSE/END. Следующий пример извлекает объект из нижней части стека и заменяет его на «One», «Less» или «More» в зависимости от того, равен ли он, меньше или больше 1.
« ДУП 1 == « БРОСЬТЕ «Один» » « 1 < "Меньше" "Больше" IFTE » ИФТЕ »
Для поддержки более сложной условной логики RPL предоставляет структуру CASE/THEN/END для обработки нескольких исключающих тестов. Будет выполнена только одна из ветвей в операторе CASE. Базовый синтаксис этого блока:
СЛУЧАЙ условие_1 ТОГДА если-условие_1 КОНЕЦ ... условие_n ТОГДА если-условие_n КОНЕЦ если-нет КОНЕЦ
Следующий код иллюстрирует использование блока CASE/THEN/END. При наличии буквы в нижней части стека он заменяет ее эквивалентом в виде строки или «Неизвестной буквой»:
« СЛУЧАЙ DUP "A" == ЗАТЕМ "Альфа" КОНЕЦ DUP "B" == ЗАТЕМ "Бета" КОНЕЦ DUP "G" == ЗАТЕМ "Гамма" КОНЕЦ «Неизвестное письмо» КОНЕЦ SWAP DROP @ Избавьтесь от оригинального письма »
Этот код идентичен следующему эквиваленту вложенного блока IF/THEN/ELSE/END:
« ЕСЛИ DUP "A" == ЗАТЕМ "Альфа" ЕЩЕ ЕСЛИ DUP "B" == ТО "Бета" ЕЩЕ ЕСЛИ DUP "G" == ТО "Гамма" ЕЩЕ «Неизвестное письмо» КОНЕЦ КОНЕЦ КОНЕЦ SWAP DROP @ Избавьтесь от оригинального письма »
RPL предоставляет оператор FOR/NEXT для циклического перехода от одного индекса к другому. Индекс для цикла хранится во временной локальной переменной, к которой можно получить доступ в цикле. Синтаксис блока FOR/NEXT следующий:
index_from index_to FOR имя_переменной оператор_цикла NEXT
В следующем примере цикл FOR используется для суммирования чисел от 1 до 10. Индексная переменная цикла FOR — «I»:
« 0 @ Начать с нуля в стеке 1 10 @ Цикл от 1 до 10 ДЛЯ I @ "I" — локальная переменная I + @ Добавьте «I» к текущей сумме. ДАЛЕЕ @ Повторить... »
Блок START/NEXT используется для простого блока, который выполняется от начального индекса до конечного индекса. В отличие от цикла FOR/NEXT, переменная цикла недоступна. Синтаксис блока START/NEXT:
index_from index_to START loop_statement NEXT
FOR/NEXT и START/NEXT поддерживают определяемый пользователем шаг приращения. Заменив завершающее ключевое слово NEXT на приращение и ключевое слово STEP, переменная цикла будет увеличиваться или уменьшаться на значение, отличное от значения по умолчанию +1. Например, следующий цикл делает шаг назад с 10 до 2, уменьшая индекс цикла на 2:
« 10 2 СТАРТ -2 ШАГ »
Блок WHILE/REPEAT/END в RPL поддерживает неопределенный цикл с проверкой условия в начале цикла. Синтаксис блока WHILE/REPEAT/END следующий:
WHILE условие REPEAT оператор_цикла END
Блок DO/UNTIL/END в RPL поддерживает неопределенный цикл с проверкой условия в конце цикла. Синтаксис блока DO/UNTIL/END следующий:
DO loop_statement ДО тех пор, пока условие КОНЕЦ
Было рассмотрено несколько существующих операционных систем и языков, но ни один из них не мог удовлетворить всем целям проектирования. Поэтому была разработана новая система, которая объединяет потоковую интерпретацию Forth с функциональным подходом Lisp . Полученная операционная система, неофициально известная как RPL (Reverse-Polish Lisp), впервые появилась на публике в июне 1986 года в калькуляторе HP-18C Business Consultant.(Примечание. Это название часто цитируется как «RPL: язык управления математикой». Отрывок доступен по адресу: [3][4])
RPL расшифровывается как Reverse Polish Lisp. В ранние дни разработки RPL мы устали называть безымянную систему "новой системой", и один из разработчиков придумал "RPL", и как игру слов на "RPN", которая всегда была любимой/ненавистной отличительной чертой HP calcs, и как точное указание на происхождение языка от
Forth
и
Lisp
.
RPL никогда не предназначался как публичный термин; во время статьи
в HP Journal
(август 1987 г.) о
HP 28C
была предпринята попытка создать менее причудливое название — отсюда "ROM-based procedural language", которое сохранило инициалы, но имело более достойное звучание. Команда разработчиков никогда не называет его иначе, как (инициалы) RPL. Вы можете выбрать любую из двух полных версий слова, которая вам больше нравится. Или как насчет "Rich People's Language?" Билл Уикс, HP Corvallis.
RPL означает Reverse Polish Lisp — он объединил язык калькулятора RPN более ранних моделей с функциями языков программирования Lisp и Forth . Какое-то время HP объясняла буквы RPL как аббревиатуру от «ROM-based Procedural Language».
1987:
HP-28C
: Первый полноценный калькулятор RPL: В конце 1980-х годов HP разработала новый язык программирования для своей новой серии чрезвычайно мощных калькуляторов. Объединив элементы RPN,
Lisp
и
Forth
, HP придумала язык под названием RPL (или ROM-based Procedural Language).