Понимание интерпретации и выполнения кода во время выполнения - PullRequest
2 голосов
/ 11 марта 2010

Я создаю игру в XNA и думал о создании собственного языка сценариев (очень просто, заметьте). Я знаю, что есть лучшие способы сделать это (и я заново изобретаю колесо), но я хочу, чтобы опыт обучения был более продуктивным и быстрым.

Когда я сталкиваюсь с кодом во время выполнения, насколько я понимаю, обычный подход состоит в том, чтобы разобрать машинный код или байт-код или что-то еще, что на самом деле является исполняемым, и затем выполнить это, верно? Но, например, когда впервые вышел Chrome, они сказали, что их движок JavaScript работает быстро, потому что он компилирует JavaScript в машинный код. Это означает, что другие движки не компилировались в машинный код.

Я бы предпочел не компилировать на более низкий язык, так есть ли какие-нибудь известные современные методы для анализа и выполнения кода без компиляции на низком уровне? Возможно, что-то вроде разбора кода на какое-то дерево, ветвления по дереву, сравнения каждого символа и вызова некоторой функции, которая обрабатывает этот символ? (Дикий гадать и колоть в темноте)

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

Лично я бы не катил ваш собственный анализатор (превращая ввод в токены) или лексер (проверяя входные токены для вашей языковой грамматики). Взгляните на ANTLR для разбора / лексирования - это отличный фреймворк и имеет полный исходный код, если вы хотите разобраться в этом.

Для выполнения кода, который вы проанализировали, я бы посмотрел на запуск простой виртуальной машины или, что еще лучше, взглянул бы на llvm , которая является попыткой с открытым исходным кодом (ish) стандартизировать байт виртуальной машины. форматируйте код и предоставляйте полезные функции, такие как JITing (превращение скомпилированного байта кода скрипта в сборку).

Я бы не отговаривал вас от более продвинутых опций, которые вы используете, таких как собственное выполнение машинного кода, но имейте в виду, что это очень специализированная область, и она становится действительно сложной, очень быстрой!

Эрлз указал, что мой ответ может показаться «не пытайтесь делать это самостоятельно. Перечитывая мой пост, это звучит немного так. Причина, по которой я упомянул ANTLR и LLVM, состоит в том, что они оба имеют кучу исходного кода и учебных пособий, поэтому я считаю, что это хороший справочный источник. Возьми это за основу и играй

0 голосов
/ 16 марта 2010

Python великолепен как язык сценариев. Я бы порекомендовал вам сделать привязку C # для его C API и использовать его. Встраивать Python легко. Ваше приложение может определять функции, типы / классы и переменные внутри модулей, к которым имеет доступ интерпретатор Python. Приложение также может вызывать функции в скриптах Python и получать результат обратно. Объединение этих двух функций дает вам схему двусторонней связи.

По сути, вы получаете синтаксис и семантику Python бесплатно. То, что вам нужно реализовать, это API, который ваше приложение предоставляет Python. Примером может быть доступ к игровым логическим функциям и функциям рендеринга. Затем скрипты Python определяют функции, которые их вызывают, а хост-приложение вызывает функции Python (с параметрами) для выполнения работы.

РЕДАКТИРОВАТЬ: похоже, IronPython может сэкономить вам еще больше работы. Это реализация CPython на C # и имеет собственный API встраивания: http://www.ironpython.net/

0 голосов
/ 16 марта 2010

Вы можете попробовать эту среду для построения языков (она хорошо работает с XNA): http://www.meta -alternative.net / mbase.html

Есть несколько уроков: http://www.meta -alternative.net / calc.pdf

http://www.meta -alternative.net / pfront.pdf

...