[php] Какие шаблоны я мог бы использовать в коде, чтобы упростить перевод на другой язык программирования?



Answers

В моем ответе будет рассмотрена конкретная задача синтаксического анализа Python, чтобы перевести его на другой язык, а не на аспекты более высокого уровня, которые Ира хорошо ответила на его ответ.

Короче: не используйте модуль парсера, есть более простой способ.

Модуль ast , доступный с Python 2.6, намного более подходит для ваших нужд, поскольку он дает вам готовый АСТ для работы. Я написал статью об этом в прошлом году, но, короче говоря, использую метод parse ast для анализа исходного кода Python в AST. Модуль parser даст вам дерево разбора, а не AST. Остерегайтесь разницы .

Теперь, поскольку АСТ Python достаточно детализированы, учитывая AST, передняя задача не является ужасно трудной. Я полагаю, что вы можете иметь простой прототип для некоторых частей функциональности, готовых довольно быстро. Однако для получения полного решения потребуется больше времени, главным образом потому, что семантика языков различна. Простое подмножество языка (функции, базовые типы и т. Д.) Можно легко перевести, но как только вы попадете в более сложные слои, вам понадобится тяжелая техника для эмуляции ядра одного языка в другом. Например, рассмотрите генераторы Python и списки, которые не существуют в PHP (к моим лучшим знаниям, которые, по общему признанию, являются слабыми при использовании PHP).

Чтобы дать вам один последний совет, рассмотрите инструмент 2to3 , созданный разработчиками Python, чтобы перевести код Python 2 в код Python 3. Во-первых, у него есть большинство элементов, которые нужно перевести на Python. Однако, так как ядра Python 2 и 3 аналогичны, там не требуется эмуляционное оборудование.

Question

Я собираюсь сделать побочный проект, целью которого является перевод кода с одного языка программирования на другой. Языки, с которых я начинаю работать, - это PHP и Python (с Python на PHP должно быть проще начать), но в идеале я бы мог добавить другие языки с относительной легкостью. План:

  • Это ориентировано на веб-разработку. Оригинальный и целевой код будет сидеть поверх фреймворков (которые мне также придется писать). Эти рамки будут охватывать шаблон проектирования MVC и следовать строгим правилам кодирования. Это должно сделать перевод несколько проще.

  • Я также рассматриваю IOC и инъекции зависимостей, поскольку они могут облегчить процесс перевода и уменьшить вероятность ошибок.

  • Я буду использовать модуль парсера Python, который позволяет мне играть с абстрактным деревом синтаксиса. По-видимому, ближе всего к PHP можно token_get_all() , что является началом.

  • С этого момента я могу построить AST, таблицы символов и поток управления.

Тогда я верю, что могу начать выводить код. Мне не нужен идеальный перевод . Мне все равно придется просматривать сгенерированный код и исправлять проблемы. В идеале переводчик должен обозначать проблематичные переводы.

Прежде чем спросить: «Что, черт возьми, в этом смысл?» Ответ будет ... Это будет интересный опыт обучения. Если у вас есть какие-либо сведения о том, как сделать это менее сложным, сообщите мне.

РЕДАКТИРОВАТЬ:

Мне больше интересно узнать, какие шаблоны я мог бы применять для кода, чтобы упростить перевод (т.е. IoC, SOA?) Кода, чем как сделать перевод.




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

Есть относительно простой способ начать работу. Во-первых, зайдите http://sourceforge.net/projects/lime-php/ (если вы хотите работать на PHP) или некоторые из них и выполните код примера. Затем вы можете написать лексический анализатор, используя последовательность регулярных выражений и токенов подачи для создаваемого парсера. Ваши семантические действия могут либо выводить код непосредственно на другом языке, либо создавать некоторую структуру данных (мыслить объекты, человек), которые вы можете массировать и перемещаться для генерации выходного кода.

Вам повезло с PHP и Python, потому что во многих отношениях они являются одним и тем же языком, как и другие, но с различным синтаксисом. Жесткая часть преодолевает семантические различия между форматами грамматики и структурами данных. Например, у Python есть списки и словари, в то время как PHP имеет только массивы-члены.

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

О, и поскольку у вас нет статических типов в Python, лучше всего писать и полагаться на функции PHP, такие как «python_add», который добавляет числа, строки или объекты в соответствии с тем, как это делает Python.

Очевидно, что это может стать намного больше, если вы позволите.




Вы можете взглянуть на компилятор Vala , который переводит Vala (C # -подобный язык) на C.




Related