Как написать свой интерпретатор?

Тема в разделе "WASM.BEGINNERS", создана пользователем searkand, 7 янв 2011.

  1. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    Всем привет. интересно узнать как написать свои интерпретатор. писал свои интепретатор на Си++ который читал мой скрипт переводил его в промежуточный скрипт файл -> потом в asm файл и уже ассамблером переводил в исполняемый файл и запускал этот скрипт. как сделать иначе чтобы не зависеть от ассамблера? то есть прошу очень подробно обьяснить как пишутся интерпретаторы таких языков как perl,php,java. меня интересует интерпретаор компилирующего типа. взаранее спасибо.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    http://ru.wikipedia.org/wiki/ПОЛИЗ
     
  3. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    спс. пригодится в будущем. но мне бы сейчас саму концепцию уловить. хотя бы узнать что юзать
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    searkand
    а это что не концепция чтоле? в гугле поищи про полиз, и стековые машины, там тебе куча примеров на любом языке.
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ахо и ульман. у шилда есть. видел некий интерп в уроках его написания. у кернигана и пайка в программном окружении юних по шагам разбирается написание простейшего интерпретатора на яцц. обсосана каждая деталь

    к пакетам разных построителей парсеров бывают примеры-уроки интерпреров/компилеров(реже)

    есть более или менее удачные опенсорсные компилеры/интерпреры. их вполне можно изучать/брать за основу
    а что хотите. выбор есть. что вам по руке станет
    компилить сразу в машкод или вирт машиной?
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    вот тут я конечно поржал, вам интерпретатор или компилятор? Хотя может вы может сразу хотите
    http://ru.wikipedia.org/wiki/JIT-компиляция
    Хотя кто не дает? инфы в нете валом
     
  7. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    я что-то уже реализовал подобное в своем мини языке. я хочу сначала узнать как без помощи ассемблера перевести свой скрипт в бинарник.тоесть в идеале я вижу один екзешный файл интепретатора. или вот еще интересно как виртуальную машину сделать.
     
  8. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    qqwe
    прошу пожалуйста на этом по подробнее. вспоминается первый урок низкоуровнего программирования для дZенствующих. там рассказывалось как компилить com программу через редактор Hex workshop. но вот как такое сделать с .exe и в своей проге
     
  9. Monogen

    Monogen New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    90
    Нужно определиться, что вам нужно. Интерпретатор читает и исполняет программу сам. Компилятор только преобразует ее в машинный код, исполняемый процессором.
    Вот. Определяйтесь. Интерпретатор. http://ru.wikipedia.org/wiki/Интерпретатор, компилятор - http://ru.wikipedia.org/wiki/Компилятор

    Чтобы написать свой интерпретатор, вам надо понять, что такое лексический, синтаксический, семантический анализ. Как он осуществляется. Разобраться с методами синтаксического разбора. Кратко это объяснить не получится.

    Вот какие книжки посоветую, начните с них:
    1. С. З. Свердлов. Языки программирования и методы трансляции. (скачать можно на infanata.com, вбейте название в поиск. Чтобы скачать, надо зарегистрироваться).
    2. Н. Вирт. Построение компиляторов. (в электронном виде не встречал, есть оригинал в открытом доступе, но он на английском, на русском нет - только в бумажном виде).

    Потом можно прочитать вот эти:
    3. В. А. Серебряков, М. П. Галочкин. Основы конструирования компиляторов. (infanata.com)
    4. Карпов. Основы построения трансляторов.

    Есть еще "Ахо, Сети, Ульман. Компиляторы: принципы, технологии, инструменты.", но начинать с нее не советую: книжка больше теоретическая, чем практическая.
     
  10. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    searkand
    урок N1
    --------
    калькулятор на 4 действия
    работает на стековой виртуальной машине (интерпретаторе)
    Код (Text):
    1. COMPILER Hw1
    2.  
    3.  
    4.    STOP = -1
    5.  
    6.    NOP = 0
    7.  
    8.    ADD = 1
    9.    SUB = 2
    10.    MUL = 3
    11.    DIV = 4
    12.    NEG = 5
    13.    NUM = 6
    14.  
    15.  
    16.    code = [0 for i in xrange(1000)]
    17.    ip = 0
    18.  
    19.    stack = [0 for i in xrange(1000)]
    20.    sp = 0
    21.  
    22.  
    23. # --- Code gen ---
    24. # ----------------
    25.  
    26.    def emit(self, op):
    27.       self.code[ self.ip ] = op
    28.       self.ip += 1
    29.  
    30.    def emit2(self, op, num):
    31.       self.code[ self.ip ] = op
    32.       self.ip += 1
    33.       self.code[ self.ip ] = num
    34.       self.ip += 1
    35.  
    36.  
    37. # --- Interpret ---
    38. # -----------------
    39.  
    40.    def push(self, num):
    41.       self.stack[ self.sp ] = num
    42.       self.sp += 1
    43.  
    44.    def pop(self):
    45.       self.sp -= 1
    46.       return self.stack[ self.sp ]
    47.  
    48.    def interp(self):
    49.       ip = 1
    50.       op = self.code[ 0 ]
    51.    
    52.       while op != self.STOP:
    53.          if op == self.ADD:
    54.             v = self.pop()
    55.             self.push( self.pop() + v)
    56.      
    57.          elif op == self.SUB:
    58.             v = self.pop()
    59.             self.push( self.pop() - v)
    60.      
    61.          elif op == self.MUL:
    62.             v = self.pop()
    63.             self.push( self.pop() * v )
    64.  
    65.          elif op == self.DIV:
    66.             v = self.pop()
    67.             if v == 0:
    68.                self.push( 9001 )
    69.             else:
    70.                self.push( self.pop() / v )
    71.      
    72.          elif op == self.NEG:
    73.             self.push( -self.pop() )
    74.  
    75.          elif op == self.NUM:
    76.             self.push( self.code[ ip ] )
    77.             ip += 1
    78.      
    79.          op = self.code[ ip ]
    80.          ip += 1
    81.  
    82.       return self.pop()
    83.  
    84.  
    85.  
    86. # --- Parser ---
    87. # --------------
    88.  
    89. IGNORECASE    
    90.  
    91.  
    92. CHARACTERS
    93.   letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
    94.   digit  = "0123456789".
    95.   eol    = CHR(13) .
    96.   lf     = CHR(10) .
    97.  
    98.  
    99. TOKENS
    100.   number = digit {digit} .
    101.  
    102.  
    103. COMMENTS
    104.   FROM '#' TO eol
    105.  
    106.  
    107. IGNORE  "\t" + " " + eol + lf
    108.  
    109.  
    110. PRODUCTIONS
    111.   Hw1
    112.   =
    113.     { Body }
    114.     EOF
    115.                              (. self.emit(self.STOP) .)
    116.                              (. print self.interp()  .)
    117.   .
    118.  
    119.  
    120.   Body
    121.   =
    122.       Expr
    123.   .
    124.  
    125.  
    126.   Expr
    127.   =
    128.     Sum
    129.   .
    130.  
    131.  
    132.   Sum
    133.   =
    134.     Mul
    135.     {
    136.       (
    137.         "+"                  (. op = self.ADD .)
    138.        |
    139.         "-"                  (. op = self.SUB .)
    140.       )
    141.       Mul
    142.                              (. self.emit(op) .)
    143.     }
    144.   .
    145.  
    146.  
    147.   Mul
    148.   =
    149.     Singl
    150.     {
    151.       (
    152.         "*"                  (. op = self.MUL .)
    153.        |
    154.         "/"                  (. op = self.DIV .)
    155.       )
    156.       Singl
    157.                              (. self.emit(op) .)
    158.     }
    159.   .
    160.  
    161.  
    162.   Singl
    163.   =
    164.       "-" Singl              (. self.emit(self.NEG) .)
    165.     |
    166.       "+" Singl
    167.     |
    168.       number                 (. self.emit2(self.NUM, int(self.token.val)) .)
    169.     |
    170.       "(" Expr ")"
    171.   .
    172.  
    173.  
    174. END Hw1.
    парсер-интерпретатор написан на coco и питоне. текст мало комментирован, тк предельно прост.
     
  12. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    http://ru.wikipedia.org/wiki/Интерпретатор - прочитай.

    Monogen
    да я определился. мне нужен интерпретатор компилирующего типа. программа которая делает анализ и переводит код в байт-код есть. но как реализовать виртуальную машину? у меня она получилась как переводчик байт-кода в ассамблерский и выполнение его. но как выяснилось такое делает компилятор -> это мне не нужно.
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    searkand
    ололлоло?
     
  14. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    что? прочитай про интерпретатор компилирующего типа если это тебя так смешит.
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    searkand
    вообще говоря, там тупо компилятор в промежуточный код, и интерпретатор этого кода. Где там интерпретатор компилирующего типа. мне не понятно(как единое целое). Те вам надо написать компилятор, и написать интерпретатор этого кода.

     
  16. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    ну и
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    searkand
    ну и в чем проблема? берем полиз, пишем компилятор. Пишем интерпретатор и все. Хоть стековый хоть регистровый. Инфы и кода валом в интернете.
     
  18. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa

    извини но я не такой продвинутый как ты.

    прошу оценить мой компилятор.
     
  19. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    searkand
    причем тут продвинутость? ты конкретно вопрос задай? что не получается?
     
  20. searkand

    searkand New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2010
    Сообщения:
    27
    spa
    думаю ты прав. щас обьясню как было дело. пол года назад мне вдруг прспичило создать свой язык. тогда я мало что знал о интерпретаторах и компиляторах. и до меня не доходила одна вещь: как заставить скрипт выполняться? что бы его процессор выполнил или что бы программа своими силами справилась. сначала написал интерпретатор (3-4 дня). он умел только:
    1 создавать переменные (было всего два типа: строковой и целый)
    2 обрабатывать простые математические операций: - + * / % ^
    3 делать инкремент и декремент переменной
    4 выводить в консоль и запрашивать значение переменной.
    5 константы
    скрипт мог выглядеть вот так:
    [!mdu \ начало скрипта
    #const|133,asd| \ обьявляем константу
    @alex = 1123 + 21; \ ычесляем мат. операцию
    @alex+;
    @assa = 'alex + vdaasdadasd';
    @bob; \ создаем переменную
    ?|@bob|; \ запрашиваем значение переменной bob
    !|@asd,@bob| \ выводим значение asd и bob
    !] \ конец скрипта