Понимание интерпретации и выполнения кода времени выполнения

StackOverflow https://stackoverflow.com/questions/2421549

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top