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
Native COM components
sind?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.)
quelle
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
Und ich kann es von Python (IronPython) nennen
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.
quelle
Mehrere Sprachen können interagieren mit:
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.
quelle
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 .
quelle
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.
quelle
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
quelle
Es gibt verschiedene Möglichkeiten, wie mehrere Sprachen in einem Projekt verwendet werden können. Einige Beispiele:
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle