Мета-программирование на несколько языков вывода - PullRequest
12 голосов
/ 18 апреля 2011

Я ищу способ написать и поддерживать определенный алгоритм (на самом деле подмодуль визуализации графики моего кода) только один раз. Мне нужен алгоритм на C ++, PHP и Javascript. Теоретически я мог бы написать это на C ++ и обернуть это в расширение PHP; но это имеет много проблем само по себе и не решает ссылку Javascript.

Мне кажется, что я ищу инструмент, который преобразует язык (независимо от того, какой именно) в три (или два, если исходный язык - один из трех) выходных языков, которые я ' м нацеливания. Я нашел MetaL (http://www.meta -language.net /), который, кажется, делает то, что я хочу, но также выглядит мертвым (без обновлений с 2007 года) и ориентирован только на один из трех языков, которые мне нужны. Он должен быть достаточно гибким и позволять мне обновлять результаты - например, я использую Cairo в рендеринге C ++ и PHP, а HTML-холст - на стороне Javascript. Поэтому мне нужно настроить API для определенных эффектов.

В качестве альтернативы я бы остановился на парсере и лексере PHP, который дал бы мне AST с достаточной информацией, чтобы я мог написать генераторы для C ++ и Javascript в качестве альтернативного бэкэнда.

Есть идеи? Спасибо.

Ответы [ 5 ]

6 голосов
/ 18 апреля 2011

Вы можете взглянуть на Haxe .Haxe - это язык программирования с открытым исходным кодом.Его можно скомпилировать в JavaScript, Flash / ActionScript, PHP, C ++, Java, C #, Python и Lua.

2 голосов
/ 18 апреля 2011

Проект Emscripten (который я заметил только на прошлой неделе) может вас заинтересовать: http://syntensity.blogspot.com/2011/04/emscripten-10.html

Этот парень в основном написал компилятор для C / C ++, который компилируется в код Javascript.

Это должно решить Javascript-сторону вашей проблемы.

Надеюсь, это поможет.

Другим продуктом того же порядка, и немного более известным, является Google Web Toolkit (GWT). Он основан на Java, но конечный результат аналогичен - вы пишете свое веб-приложение в коде Java, и он компилирует передние части в Javascript, а внутренние части - в обычный байт-код Java. Я знаю, что вы не спрашиваете о Java, но если она вас интересует, ссылка здесь: http://code.google.com/webtoolkit/

Чуть менее полезен, но, возможно, более уместен для вашего вопроса PHPJS . Это проект для реализации как можно большей части языка PHP в Javascript. Они делают это по принципу «функция за функцией», так что это только приблизительное приближение, но, учитывая синтаксис языка, его можно использовать для написания кода, который работает без изменений в нативном PHP и также в Javascript на стороне клиента.

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

1 голос
/ 18 апреля 2011

Может быть, вы можете просто написать его в javascript, а затем использовать интерпретатор JavaScript C ++ и PHP.

1 голос
/ 18 апреля 2011

Может быть, вы посмотрите на «кодирование» вашего исходного алгоритма в xml и использование различных шаблонов xslt для вывода на ваши целевые языки?Или, возможно, antlr (http://www.antlr.org/ http://www.amazon.com/Definitive-Antlr-Reference-Domain-Specific-Programmers/dp/0978739256/ref=sr_1_1?s=books&ie=UTF8&qid=1303114884&sr=1-1).

0 голосов
/ 18 апреля 2011

Совершенно другой подход - использовать ассемблерный код.Напишите алгоритм на выбранном вами языке, скомпилируйте его в исходный код ASM.Затем предоставьте интерфейсные оболочки на языках развертывания.

Конечно, это все «воздушный пирог».Это зависит от множества переменных, количества целевых платформ, важности оптимизации, частоты смены интерфейса, связанной с изменением реализации и т. Д.

...