Как использовать разные языки в одном проекте
Недавно я решил написать программу на Java и Python, но я понятия не имею, как это сделать... Есть ли способ заставить классы взаимодействовать в проекте так, чтобы, например, методы Python могли вызываться из Java? Есть ли рамки, которые позволяют мне справиться с этим? Мне также было интересно, как опытные программисты пишут свои проекты на нескольких языках.
Моя идея состояла в том, чтобы написать Gui моей программы с JavaFX из-за его потрясающего внешнего вида и распознавания речи в Python, использующего для этого библиотеку Google.
1 ответ
Существуют сторонние библиотеки, которые могут быть использованы для этого, но этот мост также может быть создан без, если вы также хотите включить третий язык. Из-за названия вашего вопроса, эта часть ответа дает более общий ответ на "разных языках".
Java JNI (собственный интерфейс Java) позволяет вам соединять Java и собственный код. Технически, этот нативный код может быть для любого языка, который компилируется в нативный код или каким-то образом поддерживает его, но на практике JNI часто используется для того, чтобы заставить Java работать с C или C++.
Есть много примеров для Java/C и Java/C++. Python также поддерживает работу вместе с нативным кодом. Видите вызов C/C++ из Python? Так что вы могли бы использовать C++ в качестве посредника между Java и Python. Вам нужно научиться использовать мост Python/native и научиться использовать мост Java/native, а затем соединить их вместе, чтобы перейти к Python/native/Java.
В этом есть плюсы и минусы. Con: Вы теперь вынуждены ввести третий язык и поддерживать большую сложность. Pro: Если вы открыты для совместного использования нескольких языков, это, естественно, открывает двери для использования множества разных языков вместе, так как многие языки поддерживают вызов нативного кода.
Другой вариант
Еще один способ сделать это - запустить каждый отдельный язык в отдельном процессе и заставить разные процессы передавать свои данные взад и вперед посредством какого-либо межпроцессного взаимодействия. Некоторые распространенные способы сделать это - через сокеты (те же самые вещи, которые используются для сетевого взаимодействия), и с помощью файлов на диске, и с помощью разделяемой памяти.
Хотя сокеты, вероятно, наиболее известны для сетевых коммуникаций (т. Е. "Http-трафик в Интернете обычно открывает сокет для сервера через порт 80"), он также обычно используется для локальной межпроцессной связи. Вы бы открыли сокет таким же образом, но обычно это было бы имя хоста "localhost", который обычно является IP-адресом. 127.0.0.1
,
Это добавляет сложность отслеживания сообщений между процессами и их фактической обработки. В зависимости от вашей среды и потребностей эта сложность может быть более или менее сложной, чем запуск нескольких языков в одном процессе. Если вам потребуется масштабировать ваше приложение позже, разделение его на несколько процессов может облегчить распределение нагрузки между несколькими компьютерами в случае сокетов или файлов.
Для вашей конкретной ситуации
Вы упомянули, что вы хотите Java для GUI. В любом случае графический интерфейс Java обрабатывается в отдельном потоке, поэтому вы должны иметь возможность вызывать функцию инициализации GUI в Java из Python, которая устанавливает и отображает ваш графический интерфейс. Просто имейте в виду проблемы параллелизма (то есть проблемы многопоточности).
Кроме того, я забыл о Jython. Спасибо @ Джереми за то, что указал на это. Я никогда не использовал его лично, но это "Python для платформы Java". Вы можете посмотреть на это, чтобы увидеть, если это обеспечивает то, что вам нужно.
Также, согласно комментарию @that другого парня:
API Google Cloud Speech имеет Java API, так же как и API Python. Просто используйте это и избавьте себя от множества неприятностей.
Таким образом, вам, возможно, даже не понадобится устанавливать мосты. Однако я оставляю свой ответ на ваш вопрос в том виде, в котором вы его задали, на тот случай, если вы решите, что хотите разрешить многоязычную поддержку в любом случае и для будущих пользователей.