INTERPRET

Материал из ПМК вики
Перейти к навигации Перейти к поиску

INTERPRET (интерпретировать) — архаичное слово Каллисто. Текстовый интерпретатор.

INTERPRET      ( −− )                               Интерпретировать входной поток.

Интерпретирует последовательность слов, пока во входном потоке что-то есть.

Ввод слова INTERPRET[править]

В режиме ЛАТ последовательно нажмите клавиши  7   4   2   ИП   ×   6   ×   ИП   2 

История[править]

Слово INTERPRET появилось в 1958 году в самой первой версии интерпретатора Форта, написанного Чак Муром на Фортране для IBM EDPM 704 для САО. Тогда оно ещё не называлось INTERPRET, так в то время команды Форта кодировались числами.

Первый INTERPRET использовал WORD, чтобы считывать с перфокарт слова, разделённые пробелами и NUMBER для оцифровки слов, в данном случае чисел с плавающей запятой. Подобный ввод в свободном формате был необычен для того времени, но более эффективным (компактней, быстрее) и надёжным. Фортрановский ввод был отформатирован в конкретные колонки, что приводило к многочисленным повторным прогонам перфокарт из-за плохо выравненных колонок.

Этот интерпретатор использовал закодированную на Фортране конструкцию IF … ELSE IF, в поисках совпадения одного символа.

В программе CURVE, написанной Чак Муром для Burroughs B5500 в 1964 году (Национальная ускорительная лаборатория SLAC, Стэнфордский университет), интерпретатор на Алголе с помощью IF… ELSE IF разбивал входной поток на 6-символьные входные слова, называвшиеся ATOM (из Лиспа).

В 1966 году Чак Мур, будучи гуру MCP на 5500, работал в Realtime Systems, Inc (RSI). В то время интерпретатор принимал слова, первые 6 символов которых были значащими, так как размер слова 5500 составлял 48 бит.

В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово INTERPRET под именем QUERY

В 1994 году стандарт ANS заменил старинное слово INTERPRET на более гибкое EVALUATE

Иногда текстовый интерпретатор называют «внешним» (англ. outer) интерпретатором, в противоположность адресному («внутреннему») интерпретатору.

INTERPRET в предыдущем стандарте Forth-83 (англ.)[править]

     INTERPRET    --                            M,83
          Begin text interpretation at the character indexed by the
          contents of >IN relative to the block number contained in
          BLK , continuing until the input stream is exhausted.  If
          BLK contains zero, interpret characters from the text input
          buffer.  See:  "input stream"

INTERPRET в стандарте Forth-79 (англ.)[править]

INTERPRET
    Begin interpretation at the character indexed by the  contents
    of  >IN  relative  to  the  block  number  contained  in  BLK,
    continuing  until  the  input stream  is  exhausted.   If  BLK
    contains  zero,  interpret characters from the terminal  input
    buffer.

INTERPRET в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

INTERPRET
       The outer text interpreter which sequentially executes or compiles
       text from the input stream (terminal or disc) depending on STATE. If
       the word name cannot be found after a search of CONTEXT and then
       CURRENT it is converted to a number according to the current base.
       That also failing, an error message echoing the name with a " ?"
       will be given.
       Text input will be taken according to the convention for WORD. If a
       decimal point is found as part of a number, a double number value
       will be left. The decimal point has no other purpose than to force
       this action.
       See NUMBER.

Реализация[править]

Выход из бесконечного цикла BEGINAGAIN внутри INTERPRET происходит необычным образом. Его обеспечивает служебное «пустое слово» через манипуляцию стеком возвратов, когда исчерпывается входной поток.

Слова, исполняемые словом INTERPRET, могут вызывать авост.

3381 ;#INTERPRET
3382 ; INTERPRET        ( −− )                               Интерпретировать входной поток.
3383 LINTER:         .DB     9
3384                 .TEXT   "INTERPRET"
3385                 .DW     LQSTAC
3386 INTER:          .DW CALL                                ; Интерпретировать последовательность слов, пока во входном потоке что−то есть.
3387 IT1:            .DW BL,WORD
3388                 .DW DUP,TWOP,CAT, SAVIN,CSTOR           ; Сохранить вторую литеру, важную для обработки литерных констант в NUMBER
3389                 .DW FIND, ZBRAN,IT3, STATE,UAT, LESS
3390                 .DW ZBRAN,IT2, N2CFA, COMMA, BRAN,IT5
3391 IT2:            .DW N2CFA, EXEC, BRAN,IT5
3392 IT3:            .DW HERE, NUMB, DPL,AT, ONEP, ZBRAN,IT4, FL, FLITE, BRAN,IT5
3393 IT4:            .DW LITER
3394 IT5:            .DW QSTAC, BRAN,IT1

Реализация транслятора строки INTERPRET из СП-Форта 3.07:

:INTERPRET
 BEGIN 
    BL WORD DUP C@ \ выделяем слова, пока не исчерпаем строку 
 WHILE 
    FIND ?DUP \ ищем в словаре 
    IF
       STATE @ = \ в зависимости от состояния компилируем или выполняем 
       IF COMPILE, ELSE EXECUTE THEN 
    ELSE 
       ?LITERAL \ если не нашли, то проверяем "на литеральность" 
    THEN 
    ?STACK 
 REPEAT DROP 
;

Реализация из SP-Forth 4.20:

: INTERPRET_ ( -> ) \ интерпретировать входной поток
  BEGIN
    PARSE-NAME DUP
  WHILE
    SFIND ?DUP
    IF
         STATE @ =
         IF COMPILE, ELSE EXECUTE THEN
    ELSE
         S" NOTFOUND" SFIND 
         IF EXECUTE
         ELSE 2DROP ?SLITERAL THEN
    THEN
    ?STACK
  REPEAT 2DROP
;

VARIABLE   &INTERPRET

' INTERPRET_ ' &INTERPRET TC-ADDR!

: INTERPRET &INTERPRET @ EXECUTE ;

Советская реализация[править]

Юрий Семёнов приводит следующее определение слова INTERPRET (стр. 140):

 : INTERPRET BEGIN               ( начало бесконечного цикла)
          FINDN           ( поиск очередного имени в словаре)
             IF                         ( если слово найдено)
               STATE @ <        ( в стеке байт длины, STATE ;
                            проверяется, не является ли слово
                          оператором немедленного исполнения)
                IF                      ( если обычное слово)
                 NAME> ,        ( запись CFA найденного слова
                                  в новое описание)
                ELSE    ( если слово немедленного исполнения)
                     NAME> EXECUTE    ( исполнение найденного
                                        слова)
                THEN
             ELSE      ( если слово не найдено, проверяется -
                         может быть это число ?)
                  HERE NUMBER DPL @ 1+ ( преобразование пос-
                         ледовательности кодов ASCII в число)
               IF                 ( если число двойной длины)
                  DLITERAL  ( запись последовательности "LIT,
                              число" в описание нового слова)
               ELSE DROP LITERAL    ( запись в описание числа
                                      одинарной длины)
               THEN
             THEN
             ?STACK              ( указатель стека в норме ?)
             AGAIN ;

У Баранова-Ноздрунова определение слова INTERPRET выглядит так (стр. 79):

: INTERPRET  ( ---> )  BEGIN  BL  WORD  FINDN
  ?DUP  IF  ( Проверить признак IMMEDIATE)
  1+  IF  NAME>  EXECUTE
      ELSE  NAME>  STATE  @  IF  ,  ELSE  EXECUTE  THEN
      THEN
  ELSE  ( Может быть это число?)
      NUMBER  DPL  @  1+
      IF  [COMPILE]  2LITERAL
      ELSE  DROP  [COMPILE]  LITERAL  THEN
 THEN  AGAIN  ;

Описание и определение слова INTERPRET в ядре ФОРТ-ЕС:

INTERPRET + -> ИНТЕРПРЕТИРОВАТЬ ВХОДНОЙ ПОТОК                   40

                     Экран номер 40
( 31.03.84      EXPECT  OUERY INTERPRET  ФОРТ-СИСТЕМА  X )

: INTERPRET ( ->) BEGIN -FIND ?DUP IF
   1+ IF EXECUTE ELSE STATE @ IF , ELSE EXECUTE THEN  THEN
   ELSE NUMBER DPL @ 1+ IF [COMPILE] 2LITERAL
    ELSE DROP [COMPILE] LITERAL THEN THEN ?STACK AGAIN ;

Определение слова INTERPRET в FORTH ИТЭФ:

             HEAD    211Q,'INTERPRE',324Q,INTER,$COL      ; INTERPRET
   IT1:      DW  DFIND,ZBRAN,IT3-$,STATE,AT,LESS
             DW  ZBRAN,IT2-$,COMMA,BRAN,IT5-$
   IT2:      DW  EXEC,BRAN,IT5-$
   IT3:      DW  HERE,NUMB,DPL,AT,ONEP,ZBRAN,IT4-$,DLITE,BRAN,IT5-$
   IT4:      DW  DROP,LITER
   IT5:      DW  QSTAC,BRAN,IT1-$

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.