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

Одной из основных проблем вашего интерфейса является то, что единственный конструктор T занимает const U&. Это означает, что вы можете передать временное значение в T и оставить reference_wrapper для мертвого объекта, поскольку const& в объекте не продлевает время жизни временного объекта.

Чтобы решить эту проблему, вам нужно добавить удаленный конструктор, который останавливает вас от принятия временных. Добавление

T(const U&&) = delete;

сделает это.

59
задан itsmysterybox 6 December 2018 в 16:33
поделиться

12 ответов

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

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

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

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

  • различные языки, доступные для платформы.NET. Это включает C#, VB.Net, J#, IronRuby, F#, XSLT и много других менее популярных языков.
  • Собственные COM-компоненты, записанные в C++ или VB, могут использоваться с огромным множеством языков: VBScript, VB, все языки.NET, функции Java
  • Win32 api могут быть вызваны от.NET, или VB
  • IPC (предайте коммуникацию процесса земле)
  • Corba, вероятно, самое всестороннее (и самый сложный) подход
  • веб-сервисы и другая архитектура для обслуживания широкого круга запросов, вероятно, самый современный подход
27
ответ дан Dirk Vollmar 24 November 2019 в 18:32
поделиться

Обычно любой прилично размерный веб-проект будет использовать приблизительно пять языков: HTML, CSS, JavaScript, некоторая серверная сторона “getting вещи done” язык (ASP, JSP, сценарии CGI с Perl, PHP, и т.д.), и некоторый вариант SQL для возможности соединения базы данных.

(Это - конечно, отмахивание руки аргумент о том, являются ли HTML и количество CSS как языки программирования †“I’m “they, но просто не полный по Тьюрингу languages” лагерь, но that’s целый другой поток.)

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

, Если you’re, идущий путем лучших практик, структура веб-страницы находится в HTML и инструкциях для того, как отобразиться, это находится в CSS †“, который мог быть в том же файле, но don’t должны быть. CSS содержит набор классов, которые HTML посылает к, и it’s до браузера выяснить, как нажать их вместе.

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

, Но тогда, где делает весь HTML / CSS / JavaScript прибывает из? That’s, что делает язык серверной стороны. В самой простой форме язык serer-стороны является программой, которая возвращает гигантскую строку, содержащую страницу HTML как ее вывод. Это, очевидно, может стать намного более сложным: HTML-формы и параметры строки запроса могут использоваться в качестве входа для нашей серверной программы, и затем у Вас есть целая вещь Ajax, где JavaScript добирается для отправки данных непосредственно в язык сервера также. Можно также стать необычными, где язык сервера может настроить HTML, CSS и JavaScript, который выводит слюну †“по существу, у Вас есть программа в одном языке, пишущий программу в другом языке.

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

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

14
ответ дан Electrons_Ahoy 24 November 2019 в 18:32
поделиться

Несколько используемых языков называют "совместимостью" или "interop", если коротко.

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

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

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

Как пример:

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

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

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

 Hello()

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

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

8
ответ дан Svante 24 November 2019 в 18:32
поделиться

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

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

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

5
ответ дан shsmurfy 24 November 2019 в 18:32
поделиться

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

2
ответ дан bedwyr 24 November 2019 в 18:32
поделиться

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

1
ответ дан Carter 24 November 2019 в 18:32
поделиться

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

  1. Используя Различные языки вместе для создавания одного приложения. Например, с помощью Java для создания GUI и с помощью JNI для доступа C API (настолько отвечающий вопрос можно вызвать функции C от Java;))
  2. Используя Различные Языки вместе в одном проекте, но они не часть того же приложения. Например. Я в настоящее время работаю над приложением для iPhone, которое имеет, использует большую сумму текста. Я в настоящее время использую три языка Python (для работы с origanal источниками текста), SQL (для помещения результатов приложения Python в формате, легко доступном из API iphone sqlite3) и Objectiv C для создания реального приложения. Даже при том, что конечный продукт только будет Objective C, я использовал два других языка для получения до конечного продукта
1
ответ дан hhafez 24 November 2019 в 18:32
поделиться

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

  • можно записать DLL в, скажем, C и затем пользоваться той библиотекой из, скажем, программы VB.
  • Вы могли записать программу сервера в, сказать C++ и иметь много различных реализаций языка клиента.
  • веб-проект А часто использует много языков; например, программа сервера, записанная в, скажем, Java (язык программирования), который выбирает данные из базы данных с помощью SQL (язык запросов), отправляет результат в браузер в HTML (язык разметки), который пользователь может взаимодействовать с использованием JavaScript (язык сценариев)...
1
ответ дан Kieron 24 November 2019 в 18:32
поделиться

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

0
ответ дан Gregory A Beamer 24 November 2019 в 18:32
поделиться

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

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

0
ответ дан MrTelly 24 November 2019 в 18:32
поделиться

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

0
ответ дан Stephan Eggermont 24 November 2019 в 18:32
поделиться

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

0
ответ дан Jason Baker 24 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: