RPL (язык программирования) - RPL (programming language)

РПЛ
Парадигма Стек , структурированный , объектно-ориентированный
Разработано Фирма Хьюлет-Паккард
Впервые появился 1984 (1986)
Операционные системы Калькуляторы HP
Диалекты
Системная РПЛ, Пользовательская РПЛ
Под влиянием
РПН , Форт , Лисп

RPL - это операционная система портативного калькулятора и язык прикладного программирования, используемый в калькуляторах RPN (обратной польской нотации) Hewlett-Packard для построения научных графиков серий HP 28 , 48 , 49 и 50 , но его также можно использовать на калькуляторах без RPN, такие как серии 38 , 39 и 40 .

RPL - это структурированный язык программирования, основанный на RPN, но в равной степени способный обрабатывать алгебраические выражения и формулы, реализованный как многопоточный интерпретатор . RPL имеет много общего с Forth , оба языка основаны на стеке , а также на LISP на основе списков . В отличие от предыдущих калькуляторов HP RPN, которые имели фиксированный четырехуровневый стек , стек, используемый RPL, ограничен только доступной оперативной памятью калькулятора .

RPL возникла в 1984 году в центре разработки HP в Корваллисе, штат Орегон , как замена предыдущей практики реализации операционных систем калькуляторов на языке ассемблера . Последний карманный калькулятор с поддержкой RPL, HP 50g, был снят с производства в 2015 году. Однако существует несколько эмуляторов, которые могут эмулировать калькуляторы HP RPL, которые работают в различных операционных системах и устройствах, включая смартфоны iOS и Android.

Варианты

Внутренний низко- и среднеуровневый вариант 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. Базовый синтаксис этого блока:

 IF condition THEN if-true [ELSE if-false] END

В следующем примере проверяется, равно ли число внизу стопки «1», и если да, то заменяется на «Равно единице»:

 « IF 1 == THEN "Equal to one" END »

Конструкция IF оценивает условие, а затем проверяет результат в нижней части стека. В результате RPL может дополнительно поддерживать блоки IF в стиле FORTH, позволяя определять условие перед блоком. Если оставить условие пустым, оператор IF не будет вносить никаких изменений в стек во время выполнения условия и будет использовать существующий результат в нижней части стека для теста:

 « 1 == IF THEN "Equal to one" END »

IFT / IFTE

Условное тестирование Postfix может выполняться с помощью функций IFT («если-то») и IFTE («если-то-еще»).

IFT и IFTE извлекают из стека две или три команды соответственно. Самое верхнее значение оценивается как логическое, и, если оно истинно, второе верхнее значение помещается обратно в стек. IFTE допускает третье значение «else», которое будет помещено обратно в стек, если логическое значение ложно.

В следующем примере функция IFT используется для извлечения объекта из нижней части стека и, если он равен 1, заменяет его на «One»:

 « 1 == "One" IFT »

В следующем примере функция IFTE используется для извлечения объекта из нижней части стека и, если он равен 1, заменяет его на «One». Если он не равен 1, он заменяет его строкой «Not one»:

 « 1 == "One" "Not one" IFTE »

IFT и IFTE будут оценивать программный блок, указанный в качестве одного из его аргументов, что позволяет использовать более компактную форму условной логики, чем структура IF / THEN / ELSE / END. В следующем примере объект извлекается из нижней части стека и заменяется на «Один», «Меньше» или «Больше», в зависимости от того, равно ли он, меньше или больше 1.

 «
   DUP 1 ==
   « DROP "One" »
   « 1 < "Less" "More" IFTE »
   IFTE
 »

ДЕЛО / ТО / КОНЕЦ

Для поддержки более сложной условной логики RPL предоставляет структуру CASE / THEN / END для обработки нескольких эксклюзивных тестов. Будет выполнена только одна из ветвей внутри оператора CASE. Базовый синтаксис этого блока:

 CASE 
  condition_1 THEN if-condition_1 END 
   ...
  condition_n THEN if-condition_n END
  if-none
 END

Следующий код иллюстрирует использование блока CASE / THEN / END. Если в конце стека находится буква, она заменяет ее строковым эквивалентом или «Неизвестной буквой»:

 « 
   CASE 
      DUP "A" == THEN "Alpha" END
      DUP "B" == THEN "Beta" END
      DUP "G" == THEN "Gamma" END
      "Unknown letter"
   END
   SWAP DROP  @ Get rid of the original letter
 »

Этот код идентичен следующему вложенному эквиваленту блока IF / THEN / ELSE / END:

 «
    IF DUP "A" ==
    THEN
       "Alpha"
    ELSE 
       IF DUP "B" == THEN
          "Beta"
       ELSE 
          IF DUP "G" == THEN
             "Gamma"
          ELSE
             "Unknown letter"
          END
       END 
    END
    SWAP DROP  @ Get rid of the original letter
 »

Циклические заявления

FOR / NEXT

RPL предоставляет оператор FOR / NEXT для перехода от одного индекса к другому. Индекс цикла хранится во временной локальной переменной, к которой можно получить доступ в цикле. Синтаксис блока FOR / NEXT:

index_from index_to FOR variable_name loop_statement NEXT

В следующем примере цикл FOR используется для суммирования чисел от 1 до 10. Переменной индекса цикла FOR является «I»:

 « 
    0       @ Start with zero on the stack
    1 10    @ Loop from 1 to 10
    FOR I   @ "I" is the local variable
       I +  @ Add "I" to the running total
    NEXT    @ Repeat...
 »

НАЧАЛО / СЛЕДУЮЩИЙ

Блок START / NEXT используется для простого блока, который выполняется от начального индекса до конечного индекса. В отличие от цикла FOR / NEXT, переменная цикла недоступна. Синтаксис блока START / NEXT:

 index_from index_to START loop_statement NEXT

FOR / STEP и START / STEP

И FOR / NEXT, и START / NEXT поддерживают определяемое пользователем приращение шага. При замене завершающего ключевого слова NEXT на инкремент и ключевое слово STEP переменная цикла будет увеличиваться или уменьшаться на другое значение, отличное от значения по умолчанию +1. Например, следующий цикл отступает от 10 до 2, уменьшая индекс цикла на 2:

 « 10 2 START -2 STEP »

WHILE / REPEAT / END

Блок WHILE / REPEAT / END в RPL поддерживает неопределенный цикл с проверкой условия в начале цикла. Синтаксис блока WHILE / REPEAT / END:

 WHILE condition REPEAT loop_statement END

DO / UNTIL / END

Блок DO / UNTIL / END в RPL поддерживает неопределенный цикл с проверкой условий в конце цикла. Синтаксис блока DO / UNTIL / END:

 DO loop_statement UNTIL condition END

Заметки

1. ^ "RPL" произошел от Reverse Polish Lisp согласно его первоначальным разработчикам, в то время как в течение короткого времени в 1987 году отдел маркетинга HP пытался придумать для него процедурный язык на основе бэкронима, основанный на ПЗУ . Кроме того, инициалы RPL иногда интерпретируются как обратная польская логика или обратный польский язык, но эти названия не являются официальными.

Смотрите также

Рекомендации

дальнейшее чтение

Внешние ссылки