Всем привет. интересно узнать как написать свои интерпретатор. писал свои интепретатор на Си++ который читал мой скрипт переводил его в промежуточный скрипт файл -> потом в asm файл и уже ассамблером переводил в исполняемый файл и запускал этот скрипт. как сделать иначе чтобы не зависеть от ассамблера? то есть прошу очень подробно обьяснить как пишутся интерпретаторы таких языков как perl,php,java. меня интересует интерпретаор компилирующего типа. взаранее спасибо.
searkand а это что не концепция чтоле? в гугле поищи про полиз, и стековые машины, там тебе куча примеров на любом языке.
ахо и ульман. у шилда есть. видел некий интерп в уроках его написания. у кернигана и пайка в программном окружении юних по шагам разбирается написание простейшего интерпретатора на яцц. обсосана каждая деталь к пакетам разных построителей парсеров бывают примеры-уроки интерпреров/компилеров(реже) есть более или менее удачные опенсорсные компилеры/интерпреры. их вполне можно изучать/брать за основу а что хотите. выбор есть. что вам по руке станет компилить сразу в машкод или вирт машиной?
вот тут я конечно поржал, вам интерпретатор или компилятор? Хотя может вы может сразу хотите http://ru.wikipedia.org/wiki/JIT-компиляция Хотя кто не дает? инфы в нете валом
spa я что-то уже реализовал подобное в своем мини языке. я хочу сначала узнать как без помощи ассемблера перевести свой скрипт в бинарник.тоесть в идеале я вижу один екзешный файл интепретатора. или вот еще интересно как виртуальную машину сделать.
qqwe прошу пожалуйста на этом по подробнее. вспоминается первый урок низкоуровнего программирования для дZенствующих. там рассказывалось как компилить com программу через редактор Hex workshop. но вот как такое сделать с .exe и в своей проге
Нужно определиться, что вам нужно. Интерпретатор читает и исполняет программу сам. Компилятор только преобразует ее в машинный код, исполняемый процессором. Вот. Определяйтесь. Интерпретатор. http://ru.wikipedia.org/wiki/Интерпретатор, компилятор - http://ru.wikipedia.org/wiki/Компилятор Чтобы написать свой интерпретатор, вам надо понять, что такое лексический, синтаксический, семантический анализ. Как он осуществляется. Разобраться с методами синтаксического разбора. Кратко это объяснить не получится. Вот какие книжки посоветую, начните с них: 1. С. З. Свердлов. Языки программирования и методы трансляции. (скачать можно на infanata.com, вбейте название в поиск. Чтобы скачать, надо зарегистрироваться). 2. Н. Вирт. Построение компиляторов. (в электронном виде не встречал, есть оригинал в открытом доступе, но он на английском, на русском нет - только в бумажном виде). Потом можно прочитать вот эти: 3. В. А. Серебряков, М. П. Галочкин. Основы конструирования компиляторов. (infanata.com) 4. Карпов. Основы построения трансляторов. Есть еще "Ахо, Сети, Ульман. Компиляторы: принципы, технологии, инструменты.", но начинать с нее не советую: книжка больше теоретическая, чем практическая.
searkand урок N1 -------- калькулятор на 4 действия работает на стековой виртуальной машине (интерпретаторе) Code (Text): COMPILER Hw1 STOP = -1 NOP = 0 ADD = 1 SUB = 2 MUL = 3 DIV = 4 NEG = 5 NUM = 6 code = [0 for i in xrange(1000)] ip = 0 stack = [0 for i in xrange(1000)] sp = 0 # --- Code gen --- # ---------------- def emit(self, op): self.code[ self.ip ] = op self.ip += 1 def emit2(self, op, num): self.code[ self.ip ] = op self.ip += 1 self.code[ self.ip ] = num self.ip += 1 # --- Interpret --- # ----------------- def push(self, num): self.stack[ self.sp ] = num self.sp += 1 def pop(self): self.sp -= 1 return self.stack[ self.sp ] def interp(self): ip = 1 op = self.code[ 0 ] while op != self.STOP: if op == self.ADD: v = self.pop() self.push( self.pop() + v) elif op == self.SUB: v = self.pop() self.push( self.pop() - v) elif op == self.MUL: v = self.pop() self.push( self.pop() * v ) elif op == self.DIV: v = self.pop() if v == 0: self.push( 9001 ) else: self.push( self.pop() / v ) elif op == self.NEG: self.push( -self.pop() ) elif op == self.NUM: self.push( self.code[ ip ] ) ip += 1 op = self.code[ ip ] ip += 1 return self.pop() # --- Parser --- # -------------- IGNORECASE CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". digit = "0123456789". eol = CHR(13) . lf = CHR(10) . TOKENS number = digit {digit} . COMMENTS FROM '#' TO eol IGNORE "\t" + " " + eol + lf PRODUCTIONS Hw1 = { Body } EOF (. self.emit(self.STOP) .) (. print self.interp() .) . Body = Expr . Expr = Sum . Sum = Mul { ( "+" (. op = self.ADD .) | "-" (. op = self.SUB .) ) Mul (. self.emit(op) .) } . Mul = Singl { ( "*" (. op = self.MUL .) | "/" (. op = self.DIV .) ) Singl (. self.emit(op) .) } . Singl = "-" Singl (. self.emit(self.NEG) .) | "+" Singl | number (. self.emit2(self.NUM, int(self.token.val)) .) | "(" Expr ")" . END Hw1. парсер-интерпретатор написан на coco и питоне. текст мало комментирован, тк предельно прост.
spa http://ru.wikipedia.org/wiki/Интерпретатор - прочитай. Monogen да я определился. мне нужен интерпретатор компилирующего типа. программа которая делает анализ и переводит код в байт-код есть. но как реализовать виртуальную машину? у меня она получилась как переводчик байт-кода в ассамблерский и выполнение его. но как выяснилось такое делает компилятор -> это мне не нужно.
searkand вообще говоря, там тупо компилятор в промежуточный код, и интерпретатор этого кода. Где там интерпретатор компилирующего типа. мне не понятно(как единое целое). Те вам надо написать компилятор, и написать интерпретатор этого кода.
searkand ну и в чем проблема? берем полиз, пишем компилятор. Пишем интерпретатор и все. Хоть стековый хоть регистровый. Инфы и кода валом в интернете.
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 !] \ конец скрипта