Как взаимодействуют несколько языков в одном проекте?

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

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

myProgram.callCfunction(parameters);

никогда не бывает .. или я ошибаюсь ? :)

12 ответов


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

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

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

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

  • различные языки, доступные для .NET platfrom. Это включает в себя C#, VB.Net, J#, IronRuby, F#, XSLT и многие другие менее популярные языки.
  • собственные компоненты COM, написанные на C++ или VB, могут использоваться с огромным разнообразием языков: VBScript, VB, все языки .NET, Java
  • Win32 api функции могут быть вызваны из .NET или VB
  • IPC (inter process communication)
  • описание, возможно, самый комплексный (и самый сложный) подход
  • веб-службы и другие сервис-ориентированные архитектуры, вероятно, самый современный подход

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

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

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

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

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

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

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

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


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

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

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

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

пример:

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

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

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

 Hello()

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

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


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

  1. Piped вход-выход (любой язык может сделать это потому что вход и выход должны быть обязательно реализованы в каждой не-игрушке язык)
  2. наличие кода на одном языке компилируется в родную библиотеку в то время как другой поддерживает вызов собственного кода.
  3. связь по закольцованной сети. Вы можете таким образом, возникают трудности с вмешательством брандмауэра.
  4. базы данных. Это может быть мыслится как "универсальные" данные формат хранения, и, следовательно, могут быть доступны на большинстве языков с расширениями базы данных. Это вообще требуется одна программа для завершения работы перед следующей программой доступ к базе данных. Кроме того, все "коммуникации" являются обычно записывается на диск.
  5. Если языков работать на том же времени (т. е. .Чистая, JVM), то вы вообще можете передавать объектные данные с одного языка прямо к другому с небольшим импеданс.

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


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


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

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

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

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

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


Это зависит от типа проекта. Если вы хотите поэкспериментировать, вы можете настроить веб-проект в .NET и изменить язык постранично. Это не работает, как вы показываете в своем псевдокоде, но это несколько языков. Конечно, фактический каталог кода должен быть одним языком.


существует несколько способов, которыми код на языках может взаимодействовать напрямую. Пока данные передаются между кодом в правильном формате, на уровне битов и байтов, нет причин, по которым разные языки не могут взаимодействовать. Этот подход используется в традиционной разработке DLL windows. Даже на разных платформах, если вы можете получить правильный формат (посмотрите на big / little endian, если это интересно), он будет работать до тех пор, пока ваш компоновщик (не компилятор) знает, как присоединиться к коду вместе.

помимо этого существует множество других способов, которыми языки могут разговаривать друг с другом. В .Net world код компилируется вплоть до IL-кода, который одинаков для каждого языка, таким образом, C#, VB.Net все одинаковы под капотом и могут звонить/работать друг с другом без проблем.


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


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