Лучшая практика для проектов на нескольких языках программирования

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

  •  10-07-2019
  •  | 
  •  

Вопрос

Есть ли у кого-нибудь какой-нибудь опыт в этом?Прямо сейчас я работаю над декомпилятором Java на C ++, но хотел бы, чтобы язык более высокого уровня выполнял фактические преобразования внутренних деревьев.Мне любопытно, стоят ли накладные расходы на маршалинг данных между языками преимущества более выразительного языка для лучшего изложения того, чего я пытаюсь достичь (например, Haskell).Действительно ли это делается в "реальном мире", или обычно выбирают язык в начале проекта и придерживаются его?Есть какие-нибудь советы от тех, кто уже пробовал это?

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

Решение

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

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

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

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

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

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

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

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

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

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

  • Явные механизмы склеивания, такие как Пирекс, которые похожи на генератор оболочек, но имеют свой собственный язык для определения интерфейса.Pyrex на самом деле является полноценным языком программирования.Промежуточное программное обеспечение, такое как КОМ или КОРБА разрешить создание общего определения интерфейса извне по отношению к приложению в язык определения интерфейса и языковые привязки для соответствующих языков для использования механизма общего интерфейса.

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