Как несколько языков взаимодействуют в одном проекте? - PullRequest
57 голосов
/ 12 марта 2009

Я слышал, как некоторые люди программируют на нескольких языках в одном проекте. Я не могу представить, как языки взаимодействуют друг с другом.

Я имею в виду, что нет такого метода Java, как

myProgram.callCfunction(parameters);

никогда не бывает или я не прав?

Ответы [ 12 ]

26 голосов
/ 12 марта 2009

Наличие нескольких языков в одном проекте на самом деле довольно распространено, однако принципы не всегда просты.

В простом случае разные языки компилируются в один и тот же код. Например, код C и C ++ обычно компилируется в машинный ассемблер или C #, а VB.Net компилируется в IL (язык, понятный среде выполнения .NET).

Сложнее, если языки / компиляторы используют другую систему типов. Может быть много разных способов, базовые типы данных, такие как integer, float и double, представлены внутренне, и есть еще больше способов представления строк. При передаче типов между различными языками необходимо убедиться, что обе стороны интерпретируют один и тот же тип или, если нет, типы правильно сопоставлены. Этот вид сопоставления типов также известен как marshalling .

Классическими примерами взаимодействия между различными языками программирования являются (в основном из мира Windows):

  • Различные языки, доступные для платформы .NET. Это включает C #, VB.Net, J #, IronRuby, F #, XSLT и многие другие менее популярные языки.
  • Нативные компоненты COM, написанные на C ++ или VB, могут использоваться с огромным разнообразием языков: VBScript, VB, все языки .NET, Java
  • Win32 API-функции могут быть вызваны из .NET или VB
  • IPC (межпроцессное взаимодействие)
  • Corba , вероятно, самый полный (и самый сложный) подход
  • Веб-сервисы и другие сервис-ориентированные архитектуры, вероятно, самый современный подход
14 голосов
/ 12 марта 2009

Как правило, любой веб-проект приличного размера будет использовать около пяти языков: HTML, CSS, Javascript, какой-нибудь серверный язык «выполнения задач» (ASP, JSP, CGI-скрипты на Perl, PHP и т. Д.), и некоторый вариант SQL для подключения к базе данных.

(Это, конечно, отмахивание от руки аргумента о том, считаются ли HTML и CSS языками программирования - я - «они есть, но только не языки Тьюринга», но это в целом другая тема.)

Некоторые примеры того, как все они работают вместе:

Если вы идете по пути наилучшей практики, структура веб-страницы представлена ​​в HTML, а инструкции по ее отображению - в CSS - которая может быть в том же файле, но не обязательно быть. CSS содержит несколько классов, на которые ссылается HTML, и браузер должен выяснить, как их объединить.

Если сделать еще один шаг вперед, то любые сценарии javascript на этой странице могут изменить любой из имеющихся HTML / CSS (изменить содержимое сущностей HTML, поменять один класс CSS на другой, изменить поведение CSS и и т. д.) Это делается с помощью так называемой объектной модели документа, которая, по сути, является независимым от языка и платформы API для манипулирования HTML-страницами объектно-подобным образом (после чего я медленно отступлю и просто предоставлю ссылку) к соответствующей статье вики .)

Но тогда откуда взялся весь HTML / CSS / Javascript? Это то, что делает язык на стороне сервера. В простейшей форме язык на стороне сервера - это программа, которая возвращает гигантскую строку, содержащую HTML-страницу в качестве вывода. Это, очевидно, может стать намного более сложным: формы HTML и параметры строки запроса могут быть использованы в качестве входных данных для нашей серверной программы, и тогда у вас есть весь объект AJAX, где JavaScript также отправляет данные непосредственно на язык сервера. Вы также можете придумать, где язык сервера может настраивать HTML, CSS и Javascript, который вылетает - по сути, у вас есть программа на одном языке, пишущая программу на другом языке.

Соединение между сервером и языком SQL работает практически так же. Есть много способов сделать его более сложным и безопасным, но самый простой способ для вашего серверного языка - динамически построить строку с командой SQL, передать ее в базу данных через какой-то соединитель и получить обратно. набор результатов. (Это тот случай, когда у вас действительно есть функция, которая сводится к someValue = database.executeThisSQLCommand (SQLString).)

Итак, чтобы обернуть это, различные языки в этом случае либо общаются, либо фактически пишут программы друг в друге, либо передают данные в очень простых и легко разбираемых форматах, понятных каждому. (Струны, в основном.)

8 голосов
/ 12 марта 2009

Использование нескольких языков называется «совместимость» или «взаимодействие» для краткости.

Ваш пример неверен. Java может вызывать функции C.

Язык обеспечивает механизм взаимодействия.

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

Как пример:

Я могу определить метод в C #

static void Hello(){ Console.WriteLine("Hello World");}

И я могу вызвать его из Python (IronPython)

 Hello()

И получите ожидаемый результат.

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

5 голосов
/ 12 марта 2009

Несколько языков могут взаимодействовать с:

  1. Канальный ввод / вывод (ЛЮБОЙ язык может сделать это потому что ввод и вывод должны быть обязательно реализованы в каждом не игрушечном язык)
  2. код на одном языке компилируется в нативную библиотеку в то время как другой поддерживает вызов собственного кода.
  3. Связь через петлевое сетевое соединение. Вы можете столкнуться с трудностями с помехами брандмауэра таким образом.
  4. Базы данных. Их можно рассматривать как «универсальные» данные формат хранения, и, следовательно, могут быть доступны для большинства языков с расширениями базы данных. Это вообще требуется одна программа для завершения операции до следующей программы может получить доступ к базе данных. Кроме того, все «сообщения» обычно записывается на диск.
  5. Если соответствующие языки работают в одной и той же среде выполнения (например, .NET, JVM), то вы обычно можете передавать объектные данные с одного языка непосредственно к другому с небольшим сопротивлением.

Практически в каждом случае вам необходимо преобразовать любое сообщение в общее формат, прежде чем он может быть заменен (за исключением языков на то же время выполнения). Вот почему несколько языков редко используются в одном проект.

2 голосов
/ 12 марта 2009

Я работаю над крупным корпоративным проектом, который состоит из (по последним подсчетам) около 8 языков. Большая часть обмена данными осуществляется через шину сообщений уровня предприятия, которая содержит привязки для нескольких языков для доступа и передачи данных назад и вперед. Это называется tibco .

1 голос
/ 12 марта 2009

Существуют различные способы использования нескольких языков в одном проекте. Некоторые примеры:

  • Вы можете написать DLL, скажем, на C, а затем использовать эту библиотеку, скажем, из программы VB.
  • Вы можете написать серверную программу, скажем, на C ++, и иметь множество различных языковых реализаций клиента.
  • Веб-проект часто использует много языков; например, серверная программа, написанная, скажем, на Java (язык программирования), которая извлекает данные из базы данных, используя SQL (язык запросов), отправляет результат в браузер в HTML (язык разметки), который пользователь может взаимодействовать с использованием Javascript (язык сценариев) ...
1 голос
/ 12 марта 2009

Существует множество разных способов использования разных языков в одном проекте. На ум приходят две основные категории

  1. Использование разных языков для создания одного приложения. Например, использование Java для создания GUI и использование JNI для доступа к C API (поэтому, отвечая на ваш вопрос, вы можете вызывать функции C из Java;))
  2. Использование разных языков вместе в одном проекте, но они не являются частью одного приложения. Например. В настоящее время я работаю над приложением для iPhone, которое использует большое количество текста. В настоящее время я использую три языка Python (для работы с оригинальными источниками текста), SQL (для представления результатов приложения python в формате, легко доступном из iphone sqlite3 api) и Objectiv C для создания реального приложения. Хотя конечным продуктом будет только Цель C, я использовал два других языка, чтобы получить конечный продукт
1 голос
/ 12 марта 2009

У вас может быть приложение, в котором большая часть работы выполняется на Java, но может быть какая-то его часть, например, анализатор данных или что-то написанное на Python или что-то еще. На самом деле это почти два отдельных приложения, возможно, парсер просто работает с файлами, а затем ваше основное приложение на Java использует их для чего-то. Если бы меня спросили, что я использовал в этом проекте, я бы сказал: «Java и Python».

0 голосов
/ 12 марта 2009

Просто чтобы добавить в список примеров, довольно часто оптимизируют код Python на C или C ++ или пишут библиотеку C для привязки другой библиотеки к Python.

0 голосов
/ 12 марта 2009

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

...