2009-03-11 2 views
44

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

Я имею в виду не существует метод Java как

myProgram.callCfunction(parameters); 

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

ответ

21

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

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

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

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

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

Могу ли я спросить, что такое «Родные COM-компоненты»? – Dan

+0

Является ли хорошей практикой вызывать скрипты python из кода C# в большом проекте? – amrit

+0

@amrit: Это полностью зависит. Разумеется, технологии микширования в проекте всегда имеют определенную стоимость, но эту стоимость можно легко перевесить за счет (повторной) реализации существующей функциональности. Поэтому вполне разумно интегрировать существующие библиотеки Python в базу данных C#. –

0

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

6

Несколько языков в процессе эксплуатации называются «интероперабельность» или «взаимодействие».

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

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

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

В качестве примера:

можно определить метод в C#

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

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

Hello() 

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

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

1

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

+0

ok.granted. это способ ... как языки могут взаимодействовать. НО: Когда программа Python знает, что есть что-то разобрать ... и когда основное приложение знает, что парсер только что закончил? – n00ki3

+0

Хорошо, вот пример. В компании, в которой я работал, было приложение парсера в сети, которое слушало входящие запросы для анализа данных. Парсер просто прослушал запросы из другого приложения, а затем разбирал и перетаскивал данные. Парсер был написан в приложении C на C#. – Carter

+0

Хорошо, получилось .. спасибо :) – n00ki3

0

Есть много ра РНТ способы вы можете использовать различные языки в одном проекте Есть две основных категорий, которые приходят на ум

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

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

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

1

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

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

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

0

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

10

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

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

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

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

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

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

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

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

+0

Если вы не используете Seaside on Gemstone (GLASS) Smalltalk. Он достигает на порядок большей производительности, делая все на серверном языке. –

0

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

4

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

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

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

Смежные вопросы