Wie können zwei verschiedene Programmierungen mit zwei verschiedenen Sprachen interagieren?

26

Ich weiß nicht, ob dies zu umfassend ist oder nicht, aber ich bin ein junger Programmierer, der noch am College ist, es ist mein Junior-Jahr. Ich habe das Gefühl, dass ich verschiedene Sprachen ziemlich gut beherrsche und eine ziemlich gute Basis habe. Aber ich stolpere über die Frage, ob ich zum Beispiel ein Programm erstellen und sagen möchte, dass ich einen Teil in Python geschrieben habe, nur weil es einfach ist und die Aufgabe erfüllt, aber dieses Programm müsste von einem anderen Programm ausgegeben werden, das ich geschrieben habe in C und ich benutze C wegen seiner Geschwindigkeit. Ich bin nicht sicher, wie die zwei verschiedenen Programme und Sprachen miteinander interagieren sollen, um ein Gesamtprogramm zu erstellen. Ich denke daran, wie sicher Sie in eine Datei schreiben können, aber was ist, wenn Python und C-Programme beide auf eine Datei zugreifen, müsste ich an Sperren denken.

Meistens habe ich das mit dem Importieren von Dateien in ein Programm gemacht, aber in diesem Fall sind sie dieselbe Sprache, so dass es einfach ist, ich benutze nur die Importfunktion, aber wenn zwei Sprachen / Programme interagieren, um eine zusammenhängende Ausgabe zu erstellen, habe ich Probleme .

Ich habe über diese Frage nachgedacht, weil ich darüber nachgedacht habe, einige grundlegende Webanwendungen zu erstellen, nur um zu lernen, aber ich habe keine Ahnung, wie ich Javascript-Dateien interaktiv mit etwas sagen soll, das ich in Python geschrieben habe oder umgekehrt.

Ich habe das Gefühl, dass mir hier etwas wirklich Leichtes fehlt und ich es einfach nicht verstehe. Tut mir leid, wenn diese Frage zu weit gefasst ist, ich aber online keine eindeutige Antwort finden konnte. Ich habe versucht, eine Open Source-Webanwendung zu durchsuchen, konnte aber keine Antwort daraus herausfinden Dies ist ein guter Ort, um mich zu fragen, ob ich es liebe, auf stackexchange zu lesen.

Vielen Dank für jede Antwort.

Anatoly Torchinsky
quelle
Ich weiß, es gibt Swig , es scheint das zu tun, was du willst, aber ich habe es nicht benutzt. Also probier es aus und schau :).
User712092
1
Bitte beachten Sie, dass Ihre Frage zwei völlig unabhängige Themen enthält, von denen eines im Allgemeinen zwischen zwei Prozessen / Anwendungen auf demselben Host kommuniziert und das andere die übliche Webserver- / Client-Architektur ist, bei der JS auf dem Client und Python auf dem Server verwendet werden.
João Pinto
Haben Sie das LAMP-Konzept überprüft? Sie können viel über Datenbanken kommunizieren.
SDsolar

Antworten:

28

In verschiedenen Sprachen geschriebener Code kann auf verschiedene Arten interagieren.

Auf der Quellebene kann für einige Sprachkombinationen eine Querkompilierung von einer Sprache in die andere durchgeführt werden (z. B. enthält Googles GWT einen Java-to-Javascript-Compiler; der Glasgow Haskell-Compiler kann in C kompiliert werden; frühere Versionen von C ++) kompiliert zu C). Meistens ist dies jedoch nicht realisierbar.

Sprachen, die eine virtuelle Plattform wie die JVM oder die .NET-Laufzeit gemeinsam nutzen, können in der Regel über von der Plattform bereitgestellte Mechanismen interagieren. Beispielsweise können alle JVM-Sprachen auf Java-Bibliotheken zugreifen und diese für die Kommunikation untereinander verwenden und Methoden aufrufen und Klassen verwenden, die in einer anderen JVM-Sprache erstellt wurden.

Viele Programmiersprachen, einschließlich Python, bieten einen Mechanismus für die Schnittstelle mit systemeigenen Bibliotheken, die normalerweise in C geschrieben sind. Mit einem solchen Mechanismus können systemeigene Funktionen aus einer anderen, übergeordneten Sprache aufgerufen werden. In populären Bibliotheken sind häufig Bindungen verfügbar. Diese Technik wird üblicherweise als "Foreign Function Interface" bezeichnet . Die Python-in-C-Schnittstelle ist die CFFI .

Eine andere Möglichkeit besteht darin, zwei völlig separate Programme zu erstellen und zur Laufzeit interagieren zu lassen. Es gibt verschiedene Mechanismen, um dies zu erreichen; Am einfachsten geht es über eine Pipe (schauen Sie sich das subprocessModul für Python an): Im Grunde ruft ein Programm das andere auf, sendet Eingaben an sein Standardverzeichnis und liest das Ergebnis von seinem Standardverzeichnis zurück. Dies macht ein Programm zu einem Unterprozess des anderen; Wenn Sie beide Komponenten für eine lange Lebensdauer benötigen und unabhängig voneinander starten möchten, können Daten über Named Pipes, (lokale) Netzwerk-Sockets, gemeinsam genutzte Dateien und (je nach Plattform) auf andere Weise hin und her übertragen werden. Welches am besten ist, hängt davon ab.

tdammers
quelle
Gute Antwort. Eine andere Möglichkeit besteht darin, dass ein Interpreter in das primäre Programm eingebettet wird, das üblicherweise zwischen C ++ und Lua für die Spieleentwicklung erstellt wird. Oder sehen Sie sich Greenspuns zehnte Regel an: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew
11

Es gibt mehrere gut etablierte Möglichkeiten, wie zwei Programme miteinander kommunizieren können. Sie haben bereits ein offensichtliches Problem identifiziert, indem Sie Dateien freigeben, und ein offensichtliches Problem damit. Es gibt aber auch andere Möglichkeiten.

Die meisten modernen Betriebssysteme enthalten einen Mechanismus namens Named Pipes , bei dem es sich im Grunde um einen Datenstrom handelt, dessen Eingabe in einem Programm und dessen Ausgabe in einem anderen Programm endet. Wenn Sie Daten von einem Programm an ein anderes Programm senden müssen, das auf demselben Computer ausgeführt wird, kann dies eine gute Methode sein.

Wenn Sie eine API einrichten müssen, damit ein Programm das andere Programm aufruft, sollten Sie sich mit RPC (Remote Procedure Calls) befassen, was normalerweise auch auf Betriebssystemebene unterstützt wird.

Wenn Sie zwischen zwei Programmen auf zwei verschiedenen Computern kommunizieren möchten, werden die Dinge komplizierter. Dann müssen Sie mit Netzwerken und Protokollen arbeiten. Sie benötigen eines der Programme, um einen Socket zu öffnen und eingehende Nachrichten abzuhören, sie in einen internen Methodenaufruf zu dekodieren, zu verarbeiten und eine Antwort zurückzugeben. Es stehen zahlreiche Bibliotheken zur Verfügung, um diese Funktionalität in verschiedenen Sprachen bereitzustellen, einschließlich C und Python.

Grundsätzlich hängt die Methode, die Sie verwenden sollten, von den Besonderheiten des jeweiligen Vorhabens ab. Informieren Sie sich über verschiedene Formen der prozessübergreifenden Kommunikation und des Network Messaging, und finden Sie heraus, was am besten zu Ihren Anforderungen passt.

Mason Wheeler
quelle
2

Das Übergeben von Nachrichten scheint hier das allgemeine Konzept zu sein, da es verschiedene Beispiele gibt, bei denen verschiedene Sprachen interagieren können, z. B. könnte man klassisches ASP mit COM-Komponenten und etwas JavaScript verwenden, um eine Mischung aus drei verschiedenen Sprachen zu erhalten, die in derselben Anwendung verwendet werden.

In dem Beispiel, das Sie angeben, wären die Sperren nicht etwas, das das Betriebssystem auf dem Dateisystem handhaben könnte? Jedes Programm kennt sich nicht unbedingt mit dem anderen aus.

JB King
quelle
0

Die meisten Softwarekomponenten sollten nicht in Form von Anweisungen kommunizieren, sondern Daten senden und empfangen: mit einer Datenbank interagieren, JSON- / XML-Anforderungen senden / empfangen usw.

vemv
quelle
0

Je nach Art Ihres Problems kann die Verwendung von Rohren in der Standard-Shell ausreichend sein (geben Sie Ihre Shell ein):

program1 | program2

Auf diese Weise geht die Ausgabe von Programm1 direkt auf die Eingabe von Programm2 über. Natürlich funktioniert dies nicht für jedes Problem, aber viele (nicht interaktive) Probleme können mit diesem Ansatz problemlos gelöst werden.

markijbema
quelle