Лучшая практика для проектов с несколькими языками программирования - PullRequest
0 голосов
/ 24 ноября 2008

У кого-нибудь есть опыт с этим? Я сейчас работаю над декомпилятором Java в C ++, но хотел бы, чтобы язык более высокого уровня выполнял фактические преобразования внутренних деревьев. Мне любопытно, стоит ли накладывать расходы на маршалинг данных между языками в пользу более выразительного и языка для лучшего формулирования того, что я пытаюсь выполнить (например, Haskell). Это на самом деле делается в «реальном мире», или обычно выбирают язык в начале проекта и придерживаются его? Какие-нибудь советы от тех, кто пытался это сделать?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2008

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

Это происходит в реальном мире? Да. В настоящее время я работаю над проектом, который состоит из кода PHP и target-c.

Хитрость, как вы указали, заключается в общении между двумя языками. Если это вообще возможно, пусть каждый язык придерживается своего собственного домена, и пусть эти два раздела общаются самым простым способом. В моем случае это были документы XML, отправленные через http. В вашем случае, какой-то форматированный текстовый файл может быть ответом.

1 голос
/ 24 ноября 2008

Джон Оустерхаут , изобретатель Tcl / Tk , был убежденным сторонником многоязычного программирования и довольно подробно писал об этом. Чтобы сделать это, вам нужен чистый интерфейсный интерфейс между языками, которые вы для него используете. Для этого есть немало механизмов. Примеры различных механизмов для этого:

  • SWIG (Упрощенная Обертка и Генератор интерфейса может взять или c ++ (или несколько других языков) заголовочный файл и генерировать интерфейс для языка высокого уровня такие как Perl или Python, который позволяет вам получить доступ к API. Есть другие системы, которые используют это подход.

  • Java поддерживает JNI и различные другие системы, такие как Python ctypes , VisualWorks DLL / C подключи это родные механизмы которые позволяют вам явно построить призыв к нижнему Подсистема уровня.

  • Tcl / Tk был задуман как встроенный и имеет собственный API для библиотеки C, чтобы добавить хуки в язык. Конструкции для это напоминает argv [] структуры в С, и были разработаны, чтобы сделать это относительно легко взаимодействовать C-программа на основе командной строки в Tcl. Это похоже на выше пример, но исходя из противоположности направление. Многие скриптовые языки такие как поддержка Python, Lua и Tcl этот тип механизма.

  • Явные клеевые механизмы, такие как Pyrex , которые похожи на генератор-обертка, но есть свои собственный язык для определения интерфейс. Pyrex на самом деле полный язык программирования. Промежуточное программное обеспечение, такое как COM или CORBA разрешить общий определение интерфейса будет построено внешне к заявке в язык определения интерфейса и языковые привязки для языки, связанные с использованием общий интерфейсный механизм.

1 голос
/ 24 ноября 2008

Расходы на сортировку зависят от языков и архитектуры, с которой вы работаете. Например, если вы используете CLR или JVM, доступны недорогие решения для взаимодействия - хотя я знаю, что вы работаете с, вероятно, неуправляемым C ++.

Другой путь - это встроенный предметно-ориентированный язык. Преобразования дерева часто выражаются через сопоставление с образцом и применение относительно небольшого числа функций. Вы можете написать простое сопоставление с образцом дерева - например, нечто похожее на Lisp s-exprs, но использующее заполнители для захвата переменных - со связанными действиями, которые являются функциями, которые преобразуют соответствующее поддерево.

...