Как обеспечить взаимодействие двух разных программ с двумя разными языками?

26

Я не знаю, слишком ли это широко или нет, но я молодой программист, все еще учусь в колледже, это мой младший год. Я чувствую, что у меня есть довольно хорошие навыки для разных языков и довольно хорошая база. Но я спотыкаюсь, что если, например, я пытаюсь создать программу и говорю, что написал одну часть на python, потому что она проста и выполняет свою работу, но эта программа должна получить вывод из другой программы, которую я написал. в C, и я использую C из-за его скорости. Я не уверен, как заставить две разные программы и языки взаимодействовать друг с другом, чтобы создать общую единую программу. Я думаю о том, что вы можете писать в файл, но что, если программы Python и C, имеющие доступ к файлу, мне нужно подумать о блокировках.

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

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

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

Спасибо за любой ответ.

Анатолий Торчинский
источник
Я знаю, что есть Swig , кажется, он делает то, что ты хочешь, но я не использовал его. Так ты попробуй и посмотри :).
user712092
1
Обратите внимание, что ваш вопрос содержит две совершенно не связанные между собой темы: одна - общение между двумя процессами / приложениями на одном хосте, другая - обычная архитектура веб-сервер / клиент, использующая JS на клиенте и python на сервере.
Жоау Пинту
Вы пересмотрели концепцию LAMP? Вы можете сделать много общения через базы данных.
SDsolar

Ответы:

28

Код, написанный на разных языках, может взаимодействовать разными способами.

На уровне исходного кода кросс-компиляция из одного языка в другой может быть выполнена для некоторых комбинаций языков (например, GWT от Google включает компилятор java-to-javascript; компилятор Glasgow Haskell может компилироваться в C; ранние версии C ++ скомпилировано в C). Однако в большинстве случаев это неосуществимо.

Языки с общей виртуальной платформой, такие как среда выполнения JVM или .NET, обычно могут взаимодействовать через механизмы, предоставляемые платформой - например, все языки JVM могут обращаться к библиотекам Java и использовать их для связи друг с другом, а также могут вызывать методы и использовать классы, созданные на любом другом языке JVM.

Многие языки программирования, в том числе Python, предлагают механизм взаимодействия с нативными библиотеками, обычно написанными на C. Используя такой механизм, можно вызывать нативные функции из другого, более высокого уровня языка. В популярных библиотеках часто имеются привязки. Этот метод обычно упоминается как «Интерфейс внешней функции» . Интерфейс Python- in -C - это CFFI .

Другой вариант - создать две совершенно разные программы и заставить их взаимодействовать во время выполнения. Существуют различные механизмы для достижения этого; самый простой - через канал (загляните в subprocessмодуль для python): в основном, одна программа вызывает другую, отправляя входные данные в свой стандартный ввод и считывая результат обратно из своего стандартного вывода. Это делает одну программу подпроцессом другой; если вам нужно, чтобы они были долгоживущими и запускались независимо, данные можно передавать туда и обратно через именованные каналы, (локальные) сетевые сокеты, общие файлы и (в зависимости от платформы) другими способами. Какой из них лучше, зависит.

tdammers
источник
Отличный ответ. Еще одна возможность - встроить интерпретатор в основную программу, обычно это делается между C ++ и Lua для разработки игр. Или см. Десятое правило Гринспена: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Эндрю
11

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

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

Если вам нужно настроить API для одной программы, чтобы использовать ее для вызова другой программы, вы можете обратиться к RPC (удаленные вызовы процедур), который обычно поддерживается на уровне операционной системы.

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

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

Мейсон Уилер
источник
2

Передача сообщений , по-видимому, является общей концепцией здесь, поскольку существуют различные примеры, когда можно взаимодействовать с разными языками, например, можно использовать классический ASP с COM-компонентами и немного JavaScript, чтобы получить смесь из 3 разных языков, используемых в одном приложении.

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

JB King
источник
0

Большинство компонентов программного обеспечения не должны взаимодействовать в терминах инструкций, а должны отправлять и получать данные: взаимодействовать с базой данных, отправлять / получать запросы JSON / XML и т. Д.

vemv
источник
0

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

программа1 | program2

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

markijbema
источник