Kann man Programmiersprachen kombinieren?

27

Ich habe eine Weile programmiert, ich habe einige rudimentäre Programme geschrieben und ich möchte weiter lernen. Ich habe den Punkt erreicht, an dem Sie einfach nicht mehr wissen, was Sie als Nächstes lernen sollen, und ich möchte eine Frage zu meiner eigenen Neugier stellen.

Kurz gesagt, die Frage ist, ob Sie mehrere Programmiersprachen zu einem Ergebnis kombinieren können. Kann dieser Code zum Beispiel möglich sein?

<html>
cout << "Hello world!";
</html>

oder

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Das fühlt sich wie eine dumme Frage an, aber ich kann nicht wissen, ob es möglich ist oder nicht, deshalb frage ich es. In dieser Frage stelle ich fest, dass er Python-Code in HTML-Code verwendet. Wenn mein obiges Beispiel nicht möglich ist, was hat er dann getan?

Bugster
quelle
12
Damit dies funktioniert (ohne die Leute wahnsinnig zu machen), braucht man zumindest strenge Regeln, wie sie interagieren und welche Teile als welche Sprache verarbeitet werden sollen.
6
Es würde einen Höllenlexer / Parser brauchen.
Chad Harrison
2
@Brian Lua ist darin eingebettet, dass der Interpreter in einen C- oder C ++ - Code eingebunden ist und zum Ausführen von Lua-Code verwendet wird, der in Zeichenfolgen oder externen Dateien gespeichert ist, wodurch möglicherweise C / C ++ - Objekte dem Lua-Code ausgesetzt werden. Lua ist im Sinne dieser Frage nicht (wenn überhaupt nicht häufig) "eingebettet".
2
Das ist so, als würden Sie fünf Buchstaben mit jeweils unterschiedlichen Symbolen für die 26 Buchstaben erstellen und sie in einem einzigen Buch mischen: sinnlos, irritierend und überflüssig.
ThomasX
7
Ich denke, die Leute vergessen eindeutig den gängigsten (und einzig gültigen) Anwendungsfall des "Kombinierens von Sprachen" - ASM-Fragmente in C / C ++ - Programmen , normalerweise aus Gründen der Leistung.
TC1

Antworten:

43

Ihr erstes Beispiel ist irgendwie möglich. Normalerweise passieren solche Dinge in PHP (und anderen verwandten Web-Programmiersprachen) wie folgt:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Einige wichtige Punkte zu diesem Beispiel:

  • HTML ist KEINE Programmiersprache, sondern eine Auszeichnungssprache.
  • PHP und HTML werden nicht an derselben Stelle ausgeführt / interpretiert: PHP-Code wird von einem PHP-Interpreter ausgeführt, der auf dem Server ausgeführt wird, und das Ergebnis wird in das umgebende HTML "injiziert". Dann wird der gesamte Blob an den Client / Browser gesendet, der das gesamte HTML rendert.

Ihr zweites Beispiel sieht aus wie eine Art Mashup von C ++ und Java. Es ist möglich, dass kompilierte Module, die in verschiedenen Sprachen geschrieben sind, miteinander kommunizieren, aber es wäre äußerst verwirrend und schwierig, Java und C ++ in derselben Quelldatei zu kombinieren: Wie würde der Compiler wissen, welche Anweisungen Java und welche C ++ sind?

Ich nehme an, Sie könnten theoretisch einen speziellen Compiler / Pre-Prozessor mit "Sprach" -Indikatoren schreiben, wie zum Beispiel:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Aber ich bin mir ehrlich gesagt nicht sicher, ob Sie dadurch etwas Nützliches gewinnen würden.

Wie würde diese hybride Sprachumgebung auch mit Sprachfunktionen umgehen, die zwischen beiden nicht kompatibel sind?

FrustratedWithFormsDesigner
quelle
Ein Beispiel alle vergaßen (darunter auch ich), so wenden Sie sich bitte es um Ihre Antwort hinzuzufügen: CUDA. Es ist eine Mischung aus zwei sehr unterschiedlichen C-Sprachen, wobei einige Funktionen für ein Gerät (GPU) kompiliert wurden und andere auf einem Host verbleiben, wobei die Kommunikationsschicht abgeleitet wird.
SK-logic
7
Es ist nicht ungewöhnlich, dass JavaScript sowie HTML und PHP auf einer Seite angezeigt werden. Schrecklich, aber nicht ungewöhnlich.
Michael Borgwardt
1
Nicht so vertraut mit PHP, aber ASP.NET-Code (egal ob C # oder VB.NET) generiert HTML und JavaScript - und das JavaScript ist häufig direkt auf der ASPX-Seite eingebettet. Die vollständige Trennung wird oft als ideal bezeichnet, aber ein kurzer Überblick über die Fragen zu ASP.NET mit SO-Tags gibt Ihnen eine Vorstellung davon, wie komplex das sein kann.
sq33G
@ sq33G - ASP.NET generiert HTML-Code. Sie können Javascript einbinden, wenn Sie möchten. ASP.NET ist sicherlich NICHT das, was der Autor als zu tun beschreibt.
Ramhound
Ich wollte PHP / HTML / JS in einem Dokument aufrufen, wenn es sonst niemand getan hätte.
Ben Brocka
19

Kurze Antwort

Nicht wirklich.


Lange Antwort

Einbetten

Im Allgemeinen enthält eine einzelne Quelldatei Code für genau eine Programmiersprache. Es ist aus mehreren Gründen ungewöhnlich, dass mehrere Sprachen in einer einzigen Datei zusammengefasst werden:

  • Das Parsen mehrerer syntaktisch unterschiedlicher Sprachen auf einmal ist äußerst schwierig (wenn nicht gar unmöglich).
  • Verschiedene Sprachen behandeln die Programmierung unterschiedlich . Haskells Vorstellung von einer Funktion unterscheidet sich von der von C ++.

Verknüpfen

Verschiedene Programmiersprachen, die eine gemeinsame Anwendungsbinärschnittstelle verwenden, können kombiniert werden, um eine einzige ausführbare Datei oder Bibliothek zu bilden. Das Ineinandergreifen der Signaturen der beiden Sprachen ist häufig mit einem gewissen Aufwand verbunden, es gibt jedoch Tools, die den Vorgang vereinfachen.

Mehrsprachige

Polyglot-Code ist gültig und in mehr als einer Sprache gleichwertig. Die 404-Seite von Stack Overflow enthält ein solches Programm:

Stapelüberlauf 404 polyglot

Dies druckt "404" in Python, Perl, Ruby, C, Brainfuck und Befunge.

Fazit

Sprachen werden selten in Dateien gemischt, und wenn, dann ist es nur zum Lachen . Die Leute versuchen sogar, das Mischen von Sprachen in Projekten zu vermeiden, da dies zusätzliche Probleme mit sich bringt. Obwohl es technisch möglich sein kann, ist das Mischen verschiedener Sprachen weder üblich noch pragmatisch.

unbekannt
quelle
Ich sehe hier keinen Rubin ...
Jason Lewis
@JasonLewis Ich kenne Ruby nicht, aber dieser Beitrag besagt, dass er Zeile 4 auswertet.
Maxpm
9
Sprachen sind nicht immer für Lacher gemischt. Mit den meisten C-Compilern können Sie Assembly und C mischen, und viele Forths auch. In den achtziger Jahren war es mit Acorns BBC Basic einer der besten BASIC-Dialekte im Spiel, 6502-Assembler zu mischen, und das war damals eine sehr wünschenswerte Funktion. Es brachte die BBC-Benutzer zum Lachen, aber so ziemlich alle anderen weinten, insbesondere diejenigen, die 6502-Maschinencode von Hand zusammensetzen und rohe Opcodes in ihre Programme in DATAAnweisungen einfügen mussten . Nicht, dass ich bitter wäre oder so. Noooo.
Alexios
1
@ SK-logic SQL ist eine strukturierte Abfragesprache, keine Programmiersprache.
Maxpm
1
Eines der traurigen Dinge an der modernen Softwareentwicklung ist, dass mehrsprachige Apps jetzt so viel schwieriger sind. In den DOS-Tagen wurde fast alles mit der gleichen Objektdatei kompiliert und es wurden die gleichen Parameterübergabekonventionen verwendet. Es war wirklich einfach, sie einfach miteinander zu verknüpfen. Heutzutage nicht so sehr ...
Brian Knoblauch
7

Ja, das ist tatsächlich möglich. Natürlich nicht so, wie Sie es sich vorgestellt haben. Es gibt einige Sprachen , die speziell für diesen Zweck entwickelt wurden.

In der Praxis kann es sehr nützlich sein, mehrere domänenspezifische Sprachen in einer einzigen Hostsprache zu mischen . Es ist selten erforderlich, zwei oder mehr gleichermaßen "Mehrzweck" -Sprachen in einer einzigen Quellcodedatei zu mischen, obwohl Sie häufig Projekte finden, die beispielsweise in VB.NET und C # geschrieben sind und unterschiedliche Sprachkomponenten enthalten, die separat kompiliert werden.

HTML ist nur eine Auszeichnungssprache. Möglicherweise finden Sie einen serverseitigen Code (z. B. in VB.NET), HTML-Markup und clientseitigen Javascript-Code in einer einzigen Quelldatei, obwohl dies von vielen als eine schlechte Vorgehensweise angesehen wird.

SK-Logik
quelle
7

Dies wird oft als polygloter Code bezeichnet - es gibt einige lustige / verrückte Beispiele, wenn Sie dem Link folgen oder an verschiedenen anderen Stellen im Web. Die meisten davon sind nur zum Spaß / um zu beweisen, dass es möglich ist.

Im Ernst, es gibt verschiedene Beispiele aus dem wirklichen Leben, in denen zwei oder mehr verschiedene Sprachen sinnvoll kombiniert werden können:

  • Web Templating - Sprachen wie PHP oder JSP-Dateien mischen Code in HTML. Die Meinungen darüber, ob dies eine gute Idee ist oder nicht, gehen weit auseinander.
  • Makrosprachen - häufig wird eine Makrosprache in die Quelldatei gemischt, z. B. C / C ++ - Präprozessormakros. Es gibt auch interessante Fälle wie Lisp, in denen die Makrosprache selbst Lisp ist (der einzige Unterschied besteht darin, ob der Code zur Kompilierungszeit oder zur Laufzeit ausgeführt wird).
  • DSLs - häufig wird eine domänenspezifische Sprache definiert, um ein bestimmtes Problem effektiv zu lösen, das in den Quellcode einer anderen Sprache eingebettet ist. Hier ist ein Beispiel für ein schönes DSL für SQL, das in Clojure-Code eingebettet werden kann.
  • Skripterstellung - Einige dynamische Sprachen eignen sich besonders für kurze Skripte und können in Software eingebettet werden, die in einer anderen Sprache geschrieben wurde. Groovy- Skripte lassen sich beispielsweise sehr einfach in eine Java-Anwendung einbetten.
  • Polyglot-Projekte - manchmal ist es sinnvoll, mehrere Sprachen zu verwenden, um die unterschiedlichen Funktionen der einzelnen zu nutzen. Beispielsweise unterstützt die JVM mehrere Sprachen, die ziemlich transparent zusammenarbeiten können, sodass Sie Java (für schnelle und statisch typisierte OOP) mit Clojure (für interaktive Entwicklung, Parallelität und funktionale Programmierung) mischen können. Bei solchen Projekten werden die verschiedenen Sprachen in der Regel immer noch in separate Quelldateien / -ordner unterteilt, sie werden jedoch gleichzeitig kompiliert, um eine einzige Anwendung zu erstellen.
mikera
quelle
6

Es ist möglich, mit Perl Inline eine Kombination von Sprachen zu erstellen, die es ermöglicht, ein Perl-Skript zu schreiben und Codeabschnitte einzufügen, die in einer anderen Sprache geschrieben sind:

Inline unterstützt C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Oktave, Awk, BC, TT (Template Toolkit), WebChat und sogar PERL

JohnTESlade
quelle
Ich hatte noch nie von Perl Inline gehört. Es ist eine interessante Idee, aber gibt es einen Vorteil gegenüber dem wahrscheinlich üblichen Ansatz, separate Module für Nicht-PERL-Code zu haben?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl ist ein großartiges Modul, das jedoch einige Mängel aufweist. Es funktioniert gut, aber nur im Rahmen eines relativ einfachen Codes. Obwohl schon eine Weile daran gearbeitet wurde, würde ich es in keiner Produktion verwenden.
Dynamische
3

Embedded SQL war eine gängige Methode, um SQL-Anweisungen in Programme anderer Sprachen einzubetten.

Heutzutage wurde es fast vollständig durch einen einfacher zu kompilierenden API-basierten Datenbankzugriff ersetzt, bei dem die Hostsprache nicht geändert werden muss, sondern stattdessen die normalen Fähigkeiten verwendet werden.

Joachim Sauer
quelle
1
In diesen Tagen feierte ein Embedded SQL sein Comeback in Form von LINQ und es ist hier, um zu bleiben.
SK-logic
@ SK-logic: Wie sieht LINQ mit Embedded SQL aus? Es ist keine andere Sprache, sondern lediglich die Anwendung zusätzlicher Sprachkonstrukte in der Hostsprache.
Joachim Sauer
LINQ ist ein sehr typisches eingebettetes DSL, das seiner Hostsprache semantisch fremd ist. Und im Falle von LINQ2SQL verhält es sich genauso wie das alte eingebettete SQL, es wird wörtlich in SQL übersetzt.
SK-logic
Embedded SQL wird jedoch nicht "in SQL übersetzt". Sie schreiben die Literal- SQL in Ihren C-Code (und normalerweise auch nicht in Zeichenfolgenkonstanten). Auch wenn LINQ Sprachfunktionen verwendet, die (soweit ich weiß) speziell für LINQ entwickelt wurden, handelt es sich "nur" um eine API in der Hostsprache.
Joachim Sauer
1
Pro C und Pro Fortran haben SQL-Anweisungen ein wenig übersetzt. Und LINQ ist nicht "nur" eine API, sondern eine API mit Syntax Sugar und einer Reihe austauschbarer Compiler-Backends. Damit ist es ein perfektes Beispiel für ein vollwertiges Embedded-DSL.
SK-logic
2

Es können mehrere Programmiersprachen verwendet werden, um 1 exe zu bilden. Eine Möglichkeit ist die Verwendung von DLLs. Natürlich gibt es verschiedene Bedenken. Zum Beispiel Parameterkompatibilität, COM-Kompatibilität und so weiter. Wenn Sie überlegen, wie Sie ein Datenbanksystem für Ihre Arbeit aufrufen, werden Sie möglicherweise feststellen, dass das DBMS nicht immer in einer Sprache geschrieben ist, die Sie kennen. Sie interessieren sich wahrscheinlich nicht einmal, solange die Schnittstelle bekannt ist.

Dieses Konzept wird weiterentwickelt, wenn Ihre Lösung Web-Services verwendet. Dies ist eine noch sauberere Möglichkeit, mehrere Softwarekomponenten zu kombinieren.

In der .NET-Welt gilt all das oben Genannte im Übrigen auch für die Schnittstellenebene, in der XAML- und HTML-Schnittstellen in Silverlight zusammenleben können.

In der UNIX-Welt haben wir einmal KShell-Skripte verwendet, um C ++ - und COBOL-Programme zu starten, damit die Lösung funktioniert.

Keine Chance
quelle
2

Ich denke, es wäre wert, Cython hier zu erwähnen . Es ist eine Obermenge von Python zum Schreiben von C-Erweiterungen und obwohl es eine einzigartige Sprache für sich ist, können Sie C-Code in Python-Code verwenden, wenn Sie der Python-Syntax von Cython entsprechen

Magnus
quelle
0

Beispiele für das Kombinieren von Sprachen: Jython (Python in Java), Cog (Python, das in so ziemlich allem als Generator für eingebetteten Code verwendet wird). Ich habe oft Perl-Code verwendet, um C ++ zu generieren, wenn Sie die Codegenerierung zählen.

Michael Kohne
quelle
0

Das .NET Framework ist so aufgebaut, dass mehrere Sprachen an einer Lösung teilnehmen können. Es funktioniert so lange, wie die Sprache CLR-kompatiblen Bytecode erzeugen kann.

http://www.geekinterview.com/question_details/1047

Jalayn
quelle
Ich glaube nicht, dass das Originalplakat so gemeint hat. Der resultierende Bytecode hat sehr wenig mit der Art und Weise zu tun, in der er in der Sprache geschrieben wurde, aus der er kompiliert wurde.
perdian
Ich glaube nicht, dass Sie die Frage verstanden haben. Der Autor spricht über das Kombinieren mehrerer Sprachen in einer undurchsichtigen Datei.
Craige
0

Es ist sehr schwer, sehr hässlich und oft nutzlos, mehrere Programmiersprachen in einer Datei zu kombinieren.

Es ist jedoch möglich, ein großes Projekt in mehr als einer Sprache zu schreiben. Beispielsweise enthalten sowohl Mozilla Firefox als auch MySQL C- und C ++ - Code. Bei großen Projekten wird diese Praxis häufig angewendet, da eine bestimmte Sprache einige Funktionen bietet, die eine andere nicht bietet. In PHP können Sie beispielsweise nach der Ausführung einer ausführbaren Binärdatei fragen, das Ergebnis nehmen und es ab diesem Zeitpunkt in Ihrem PHP-Code verwenden.

Wenn Sie neugierig sind, welche Sprachen für einige der wichtigsten Open Source-Projekte der Welt verwendet werden, können Sie dies überprüfen Ohloh.net. Dort finden Sie Statistiken zum Quellcode vieler Projekte.

Radu Murzea
quelle
-1

Sie können Sprachen in HTML "mischen". Für die Funktionsweise vieler Websites ist es wichtig, dass Sie Javascript in HTML einbetten können. Aber natürlich ist HTML Markup und keine Programmiersprache.

Ich denke, zu tun, was Sie vorschlagen, würde sowieso bedeuten, eine neue Sprache zu schreiben. Entweder müssten Sie einen Interpreter / Compiler erstellen, der alle diese Sprachen spricht und sie konsistent einrahmen kann, oder Sie müssten eine Möglichkeit finden, Zeile für Zeile explizit in einer Metasprache auszuwerten. Diese beiden Optionen sind im Grunde identisch, mit Ausnahme dessen, was der Programmierer tun muss, damit die Sprachen zusammenarbeiten.

markw
quelle
+1 zum Mischen von Sprachen in HTML, aber ich persönlich halte es für sauberer, HTML / CSS und JS getrennt zu halten. Die Webdesigner können ihr Ding machen, ohne zu versuchen, durch strenges JavaScript zu waten, das auf der gesamten Website eingebettet ist.
jmort253
Sie können Sprachen in HTML mischen, aber nicht viele von ihnen sind Programmiersprachen , was das vorliegende Thema ist.
Alexios
Wie? Javascript ist keine Programmiersprache? PHP? Ich habe auch Perl- und Python-Injektionen gesehen, obwohl das mit Apache-Modulen war.
Uhr
-1

Sprache ist ein Werkzeug. Bevor man ein Werkzeug auswählt (außerdem eine komische Hummer-PC-Spektroskop-Kombination macht), sollte man sich fragen - was genau möchte ich tun? Sobald die Antwort gegeben ist, werden Sie feststellen, dass eine solche Mischung von Sprachen selten notwendig ist.

Hamo
quelle
-3

Ja, es ist möglich, Programmiersprachen zu mischen, solange Ihr Interpreter / Compiler dies versteht. Zum Beispiel das Mischen von Javascript, PHP, Python in HTML oder C ++ in C #.

Das Mischen von Sprachen kann jedoch das Lesen und Ändern von Code erschweren, weshalb Vorsicht geboten ist. Eine Möglichkeit, dies zu umgehen, besteht darin, separate Dateien für Code in der aufzurufenden Sprache zu erstellen und diesen zu importieren, anstatt ihn einzubetten.

Garrett Hall
quelle