Языковая интеграция - PullRequest
       24

Языковая интеграция

4 голосов
/ 11 августа 2009

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

Кстати, я не говорю о каноническом веб-стеке или о более новых, более сексуальных и дружественных для JVM языках. Мне интересно, есть ли «известные ресурсы», где я мог бы узнать о процессах принятия решений за языками связывания, например, Java и C ++.

Конечно, на ум приходят такие инструменты, как XML, JSON и XMPP. С другой стороны, я видел системы, связывающие Java и C ++ с использованием сериализации. Я не ищу единого решения для всех. Мне больше интересно узнать о различных решениях и о том, как я должен поступать, принимая такие решения.

Приношу свои извинения, если это слишком широко для этого форума, но по крайней мере я не прошу людей исправить или переписать мой испорченный код;)

Ответы [ 5 ]

7 голосов
/ 11 августа 2009

Есть четыре модели, о которых я могу подумать:

  • Встроить динамический язык в приложение, которое в основном написано на более «системном» языке, например Lua, Python или Javascript, встроенном в приложение Java, C ++ или C #. Это используется главным образом для компонента сценариев / настройки приложения. Это будет достигнуто путем предоставления некоторых типов данных хост-приложений в формате, который может использовать динамический язык.

  • Написать собственные (или C # или Java) расширения для языка с проблемами производительности. Python и Ruby имеют много таких расширений. Это отличается от вышеизложенного тем, что динамический язык является основой. Это достигается путем написания собственных библиотек (или оболочки вокруг других собственных библиотек) в соответствии с соглашениями о вызовах языка клиента. Это также та же общая структура при смешивании ассемблера с C в системном коде.

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

  • Разработка приложения на нескольких языках, использующих одну платформу и соглашения о вызовах. Например, Java и Scala могут свободно смешиваться.

2 голосов
/ 11 августа 2009

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

Если два языка работают в одном и том же адресном пространстве, то либо они должны разрабатываться вместе на основе общей среды выполнения (как прекрасно делала Digital со своим семейством языков VAX VMS, и как Microsoft изо всех сил пыталась сделать с его общим Language Runtime для .NET) или один должен быть «ответственным». Есть много языков (OCaml, Standard ML, Haskell, Lua и, вероятно, также Perl, Ruby), которые прекрасно взаимодействуют с C, если они отвечают. Они не взаимодействуют друг с другом.

Обычно самой фундаментальной трудностью является автоматическое управление памятью («управляемая куча»). Некоторая единица должна отвечать за то, когда безопасно возвращать мертвые объекты, и, если два разных языка решат, что именно они должны ответить на этот вопрос, возникают отдельные процессы.

1 голос
/ 11 августа 2009

Я думаю Swig - это то, что вам нужно. Также см. эту страницу , где вы можете найти различные инструменты для интеграции Python с множеством других языков.

1 голос
/ 11 августа 2009

Lua - это язык сценариев, который очень хорошо интегрируется с C в одном и том же процессе. Он использует модель стека для преодоления несоответствия импеданса между двумя языками / средами выполнения. Реализация Lua имеет открытый исходный код и относительно компактна; так что это может быть хорошим кандидатом на учебу.

D-Bus является примером использования IPC. Его можно использовать для интеграции отдельных процессов, реализованных на разных языках. Он поддерживает асинхронный обмен сообщениями, а также синхронный вызов метода. Существуют реализации D-Bus для Gtk, Qt, python и т. Д ...

Виртуальная машина Parrot - это виртуальная машина, предназначенная для взаимодействия языков.

Еще один подход - тот, который использует GLib (используется Gtk). Из руководства GObject :

Решение, используемое GLib, заключается в использовании библиотека GType, которая содержит время выполнения описание всех объекты, которыми манипулирует программист. Это так называемый динамический тип 1 библиотека затем используется специальным общий код клея для автоматического преобразовать параметры функции и соглашения о вызовах функций между разные домены времени выполнения.

0 голосов
/ 11 августа 2009

Немного расходятся в процессе принятия решений ...

При создании системы вы разделяете ее на функционально независимые подсистемы. Теоретически для каждой из подсистем вы должны выяснить, на какой основе вы будете ее строить. Аспекты, которые имеют значение: * какая структура лучше всего соответствует функциональности подсистемы * какие рамки удобны вашим разработчикам * будущая поддержка: что, если поставщик фреймворка перестанет его поддерживать (как MS почти сделала с неуправляемым C ++) *

Когда система становится неоднородной, пришло время подумать о внутрисистемном клее. Это также может рассматриваться как отдельная подсистема и может быть построено на нескольких протоколах межпроцессного взаимодействия, таких как MPI, каналы, или что-то домашнее.

...