Wie interagieren mehrere Sprachen in einem Projekt?

70

Ich habe gehört, dass einige Leute in einem Projekt in mehreren Sprachen programmiert haben. Ich kann mir nicht vorstellen, wie die Sprachen miteinander interagieren.

Ich meine, es gibt keine Java-Methode wie

myProgram.callCfunction(parameters);

passiert nie oder irre ich mich?

n00ki3
quelle

Antworten:

32

Es ist eigentlich durchaus üblich, mehrere Sprachen in einem Projekt zu haben, aber die Prinzipien dahinter sind nicht immer einfach.

Im einfachen Fall werden verschiedene Sprachen zu demselben Code kompiliert. Beispielsweise wird C- und C ++ - Code normalerweise in Machine Assembler oder C # kompiliert, und VB.Net wird in IL kompiliert (die Sprache, die von der .NET-Laufzeit verstanden wird).

Es wird schwieriger, wenn die Sprachen / Compiler ein anderes System verwenden. Es gibt viele verschiedene Möglichkeiten, grundlegende Datentypen wie Integer, Float und Doubles werden intern dargestellt, und es gibt noch mehr Möglichkeiten, Zeichenfolgen darzustellen. Bei der Weitergabe von Typen zwischen den verschiedenen Sprachen muss sichergestellt sein, dass beide Seiten den Typ gleich interpretieren. Andernfalls werden die Typen korrekt zugeordnet. Diese Art der Typzuordnung wird auch als Marshalling bezeichnet .

Klassische Beispiele für die Interoperabilität zwischen verschiedenen Programmiersprachen sind (hauptsächlich aus der Windows-Welt):

  • Die verschiedenen Sprachen, die für die .NET-Plattform verfügbar sind. Dies umfasst C #, VB.Net, J #, IronRuby, F #, XSLT und viele andere weniger beliebte Sprachen.
  • In C ++ oder VB geschriebene native COM-Komponenten können mit einer Vielzahl von Sprachen verwendet werden: VBScript, VB, alle .NET-Sprachen, Java
  • Win32-API-Funktionen können über .NET oder VB aufgerufen werden
  • IPC (Interprozesskommunikation)
  • Corba , wahrscheinlich der umfassendste (und komplexeste) Ansatz
  • Webdienste und andere serviceorientierte Architekturen, wahrscheinlich der modernste Ansatz
Dirk Vollmar
quelle
1
Darf ich fragen, was Native COM componentssind?
Dan
Ist es eine gute Praxis, in großen Projekten Python-Skripte aus C # -Code aufzurufen?
Amrit
@amrit: Das hängt total davon ab. Das Mischen von Technologien in einem Projekt ist natürlich immer mit bestimmten Kosten verbunden, aber diese Kosten können leicht durch die Kosten für die (Neu-) Implementierung vorhandener Funktionen aufgewogen werden. Es kann daher durchaus sinnvoll sein, vorhandene Python-Bibliotheken in eine C # -Codebasis zu integrieren.
Dirk Vollmar
16

Im Allgemeinen verwendet jedes Webprojekt mit angemessener Größe etwa fünf Sprachen: HTML, CSS, Javascript, eine serverseitige Sprache (ASP, JSP, CGI-Skripte mit Perl, PHP usw.) und eine Variante von SQL für die Datenbankkonnektivität.

(Dies ist natürlich eine Handbewegung des Streits darüber, ob HTML und CSS als Programmiersprachen gelten oder nicht - ich bin das Camp "Sie sind, aber nur keine Turing-vollständigen Sprachen", aber das ist ein ganz anderer Thread. )

Einige Beispiele, wie all diese zusammenarbeiten:

Wenn Sie den Best-Practice-Weg gehen, ist die Struktur einer Webseite in HTML und die Anweisungen zur Anzeige in CSS - die sich in derselben Datei befinden können, aber nicht müssen. Das CSS enthält eine Reihe von Klassen, auf die sich der HTML-Code bezieht, und es ist Sache des Browsers, herauszufinden, wie man sie zusammenklickt.

Wenn Sie noch einen Schritt weiter gehen, können alle Javascript-Skripte auf dieser Seite das vorhandene HTML / CSS ändern (Inhalt von HTML-Entitäten ändern, eine CSS-Klasse gegen eine andere austauschen, das Verhalten des CSS ändern usw.). ) Dies geschieht über das sogenannte Dokumentobjektmodell, bei dem es sich im Wesentlichen um eine sprach- und plattformunabhängige API handelt, mit der HTML-Seiten objektähnlich bearbeitet werden können (an diesem Punkt werde ich mich langsam zurückziehen und nur einen Link zum relevanten Objekt bereitstellen Wiki-Artikel .)

Aber woher kommt dann all das HTML / CSS / Javascript? Das macht die serverseitige Sprache. In der einfachsten Form ist die sererseitige Sprache ein Programm, das eine riesige Zeichenfolge zurückgibt, die eine HTML-Seite als Ausgabe enthält. Dies kann natürlich viel komplexer werden: HTML-Formulare und Abfragezeichenfolgenparameter können als Eingabe für unser serverseitiges Programm verwendet werden, und dann haben Sie die gesamte AJAX-Sache, bei der das Javascript Daten auch direkt an die Serversprache senden kann. Sie können sich auch vorstellen, wo die Serversprache HTML, CSS und Javascript anpassen kann, die ausgespuckt werden - im Wesentlichen haben Sie ein Programm in einer Sprache, das ein Programm in einer anderen Sprache schreibt.

Die serverseitige Verbindung zwischen Sprache und SQL funktioniert ähnlich. Es gibt viele Möglichkeiten, es komplexer und sicherer zu machen. Am einfachsten ist es jedoch, wenn Ihre Serversprache eine Zeichenfolge mit einem SQL-Befehl dynamisch erstellt, diese über einen Connector an die Datenbank übergibt und zurückkehrt eine Ergebnismenge. (Dies ist ein Fall, in dem Sie wirklich eine Funktion haben, die sich auf someValue = database.executeThisSQLCommand (SQLString) beschränkt.)

Zum Abschluss kommunizieren verschiedene Sprachen in diesem Fall entweder, indem sie tatsächlich Programme ineinander schreiben, oder indem sie Daten in sehr einfachen, leicht zu analysierenden Formaten weitergeben, die jeder verstehen kann. (Hauptsächlich Saiten.)

Electrons_Ahoy
quelle
Es sei denn, Sie verwenden Seaside on Gemstone (GLASS) Smalltalk. Es erreicht eine um eine Größenordnung bessere Produktivität, indem es alles in der serverseitigen Sprache ausführt.
Stephan Eggermont
10

Mehrere verwendete Sprachen werden als "Interoperabilität" oder kurz "Interop" bezeichnet.

Ihr Beispiel ist falsch. Java kann C-Funktionen aufrufen.

Die Sprache bietet einen Mechanismus für die Interoperabilität.

Im Fall von .NET werden Sprachen als Teil der CLI in IL kompiliert. Somit kann jede .NET-Sprache Module interopieren (Aufrufmethoden definiert durch), die in einer anderen .NET-Sprache definiert sind.

Als Beispiel:

Ich kann eine Methode in C # definieren

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

Und ich kann es von Python (IronPython) nennen

 Hello()

Und erhalten Sie die erwartete Ausgabe.

Im Allgemeinen interagieren einige Sprachen besser als andere, insbesondere wenn die Sprachautoren das Interop speziell zu einem Merkmal der Sprache gemacht haben.

Alan
quelle
7

Mehrere Sprachen können interagieren mit:

  1. Piped Input / Output (JEDE Sprache kann dies tun, da Input und Output notwendigerweise in jeder Nicht-Spielzeugsprache implementiert werden müssen)
  2. Wenn Code in einer Sprache in eine native Bibliothek kompiliert wird, unterstützt die andere das Aufrufen von nativem Code.
  3. Kommunikation über eine Loopback-Netzwerkverbindung. Auf diese Weise können Probleme mit Firewall-Interferenzen auftreten.
  4. Datenbanken. Diese können als "universelles" Datenspeicherformat angesehen werden und können daher von den meisten Sprachen mit Datenbankerweiterungen aufgerufen werden. Dies erfordert im Allgemeinen, dass ein Programm den Vorgang beendet, bevor das nächste Programm auf die Datenbank zugreifen kann. Darüber hinaus werden alle "Kommunikationen" im Allgemeinen auf die Festplatte geschrieben.
  5. Wenn die beteiligten Sprachen zur gleichen Laufzeit ausgeführt werden (z. B. .NET, JVM), können Sie Objektdaten im Allgemeinen mit geringer Impedanz direkt von einer Sprache in die andere übergeben.

In fast allen Fällen müssen Sie jede Kommunikation in ein gemeinsames Format konvertieren, bevor sie ausgetauscht werden kann (Ausnahme sind Sprachen zur gleichen Laufzeit). Aus diesem Grund werden in einem Projekt selten mehrere Sprachen verwendet.

shsmurfy
quelle
3

Ich arbeite an einem großen Unternehmensprojekt, das (bei der letzten Zählung) ungefähr 8 Sprachen umfasst. Der Großteil der Kommunikation erfolgt über einen Nachrichtenbus auf Unternehmensebene, der Bindungen für mehrere Sprachen enthält, um Daten abzurufen und hin und her zu übertragen. Es heißt Tibco .

Bedwyr
quelle
2

Sie könnten eine App haben, in der der Großteil der Arbeit in Java erledigt wird, aber es könnte einen Teil davon geben, wie zum Beispiel einen Datenparser oder etwas, das in Python geschrieben ist oder was Sie haben. Eigentlich fast zwei separate Apps, vielleicht arbeitet der Parser nur an Dateien, und dann verwendet Ihre Haupt-App in Java sie für etwas. Wenn mich jemand fragen würde, was ich in diesem Projekt verwendet habe, würde ich "Java und Python" sagen.

Fuhrmann
quelle
ok.granted. Dies ist ein Weg, wie Sprachen interagieren können. ABER: Wann weiß das Python-Programm, dass es etwas zu analysieren gibt ... und wann weiß die Haupt-App, dass der Parser gerade fertig ist?
n00ki3
Ok, hier ist ein Beispiel. Eine Firma, für die ich gearbeitet habe, hatte eine Parser-App in einem Netzwerk, die auf eingehende Anfragen zum Parsen von Daten wartete. Der Parser hat nur auf Anfragen von einer anderen App gewartet und dann die Daten analysiert und mitgeschoben. Der Parser wurde in C geschrieben, die App in C #.
Carter
2

Es gibt viele verschiedene Möglichkeiten, wie Sie verschiedene Sprachen in einem Projekt verwenden können. Es gibt zwei Hauptkategorien, die Ihnen in den Sinn kommen

  1. Verwenden Sie verschiedene Sprachen zusammen, um eine Anwendung zu erstellen. Verwenden Sie beispielsweise Java zum Erstellen der GUI und JNI für den Zugriff auf die C-API (um Ihre Frage zu beantworten, können Sie C-Funktionen von Java aus aufrufen;))
  2. Verschiedene Sprachen zusammen in einem Projekt verwenden, aber sie sind nicht Teil derselben Anwendung. Zum Beispiel. Ich arbeite derzeit an einer iPhone-App, die viel Text verwendet. Ich verwende derzeit drei Sprachen Python (um mit den ursprünglichen Quellen des Textes zu arbeiten), SQL (um die Ergebnisse der Python-App in ein Format zu bringen, das über die iphone sqlite3-API leicht zugänglich ist) und Objectiv C, um die eigentliche App zu erstellen. Obwohl das Endprodukt nur Ziel C sein wird, habe ich zwei andere Sprachen verwendet, um zum Endprodukt zu gelangen
hhafez
quelle
2

Es gibt verschiedene Möglichkeiten, wie mehrere Sprachen in einem Projekt verwendet werden können. Einige Beispiele:

  • Sie können eine DLL beispielsweise in C schreiben und diese Bibliothek dann beispielsweise aus einem VB-Programm verwenden.
  • Sie könnten ein Serverprogramm beispielsweise in C ++ schreiben und viele verschiedene Sprachimplementierungen des Clients haben.
  • Ein Webprojekt verwendet oft viele Sprachen. Beispielsweise sendet ein Serverprogramm, das beispielsweise in Java (einer Programmiersprache) geschrieben ist und mithilfe von SQL (einer Abfragesprache) Daten aus einer Datenbank abruft, das Ergebnis in HTML (einer Auszeichnungssprache) an den Browser, was der Benutzer kann Interaktion mit Javascript (einer Skriptsprache) ...
Kieron
quelle
2

Schlecht. Wenn es nicht dringend erforderlich ist, bleiben Sie bei einer einzigen Sprache. Sie erhöhen Abhängigkeiten und Komplexität. Wenn Sie jedoch über Code verfügen, der interessante Funktionen bietet, kann es einfacher sein, ihn zusammenzukleben, als ihn neu zu erstellen.

Stephan Eggermont
quelle
1

Dies hängt von der Art des Projekts ab. Wenn Sie experimentieren möchten, können Sie in .NET ein Webprojekt einrichten und die Sprache seitenweise ändern. Es funktioniert nicht so, wie Sie es in Ihrem Pseudocode anzeigen, aber es sind mehrere Sprachen. Natürlich muss das eigentliche Codeverzeichnis eine einzige Sprache sein.

Gregory A Beamer
quelle
1

Es gibt verschiedene Möglichkeiten, wie Code in Sprachen direkt interagieren kann. Solange die zwischen dem Code übertragenen Daten auf Bit- und Byte-Ebene im richtigen Format vorliegen, gibt es keinen Grund, warum verschiedene Sprachen nicht zusammenarbeiten können. Dieser Ansatz wird in der traditionellen Windows-DLL-Entwicklung verwendet. Selbst auf verschiedenen Plattformen funktioniert es, wenn Sie das richtige Format erhalten (bei Interesse Big / Little Endian ansehen), solange Ihr Linker (nicht Compiler) weiß, wie man Code zusammenfügt.

Darüber hinaus gibt es zahlreiche andere Möglichkeiten, wie Sprachen miteinander sprechen können. In der .Net-Welt wird der Code in IL-Code kompiliert, der für jede Sprache gleich ist. Auf diese Weise sind C #, VB.Net unter der Haube alle gleich und können nahtlos miteinander aufrufen / arbeiten.

MrTelly
quelle
1

Nur um die Liste der Beispiele zu erweitern, ist es ziemlich üblich, Python-Code in C oder C ++ zu optimieren oder eine C-Bibliothek zu schreiben, um eine andere Bibliothek an Python zu binden.

Jason Baker
quelle