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

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

Вопрос

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

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

myProgram.callCfunction(parameters);

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

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

Решение

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

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

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

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

  • Различные языки, доступные для платформы .NET оттуда.Сюда входят C #, VB.Net, J #, IronRuby, F #, XSLT и многие другие, менее популярные языки.
  • Собственные COM-компоненты, написанные на C ++ или VB, могут использоваться с огромным разнообразием языков:VBScript, VB, все .СЕТЕВЫЕ языки, Java
  • Функции Win32 api могут быть вызваны из .NET или VB
  • IPC (межпроцессная коммуникация)
  • Корба, вероятно, наиболее всеобъемлющий (и наиболее сложный) подход
  • Веб-сервисы и другие сервис-ориентированные архитектуры, вероятно, самый современный подход

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

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

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

Несколько примеров того, как все это работает вместе:

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

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

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

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

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

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

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

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

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

Как пример:

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

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

И я могу позвонить из Python (IronPython)

 Hello()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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