Was bedeutet es, dass „Sprache A in Sprache B geschrieben ist“?

31

Ich höre oft den Begriff, dass Sprache A in Sprache B geschrieben ist. Beispielsweise wurde PHP in C geschrieben , C # ist in C ++ geschrieben .

Kann mir bitte jemand erklären, was das bedeutet und ob es überhaupt stimmt? Hat das etwas mit dem von der Sprache verwendeten Interpreter-Compiler zu tun?

Auf welchen Faktoren basiert außerdem die Wahl der Implementierungssprache?

Songo
quelle
19
Genau genommen ist "PHP wurde in C geschrieben" falsch. Eine Sprache ist per se eine formale Definition, daher wird sie nicht in einer anderen Programmiersprache (sondern in Englisch) geschrieben. Nur der Compiler, der Interpreter und / oder die Bibliothek können in C, C ++ oder was auch immer geschrieben werden. In der Praxis gibt es für viele Sprachen einen dominanten Compiler oder Interpreter, und die Unterscheidung zwischen Sprachdefinition und Implementierung wird nicht getroffen.
user281377
Interessanterweise wurde BCPL meistens in BCPL
OldCurmudgeon 20.11.12
7
PHP "per se" ist keine formale Definition. Es ist ein C-Programm.
Kaz
8
s/written/implemented/und es ist viel klarer.
TMN
2
@ugoren In der Assembly wurden viele C-Compiler geschrieben. In diesem Jahrhundert allerdings nicht so sehr.
Ross Patterson

Antworten:

30

Die meisten Programmiersprachen fallen in zwei Kategorien: interpretierte und kompilierte Sprachen.

Eine kompilierte Sprache wird von einem Compiler in Maschinencode übersetzt , die Sprache, die die CPU direkt Schritt für Schritt ausführt. Eine interpretierte Sprache verwendet dagegen einen Vermittler, einen Interpreter , um den Sprachcode auszuführen. Der Interpreter selbst ist ein anderes Programm, das normalerweise selbst zu Maschinencode kompiliert wird.

PHP ist eine interpretierte Sprache. Sie benötigen ein separates Programm zu laufen PHP - Code, der Computer das Programm nicht direkt läuft. Dieses separate Programm, der PHP-Interpreter, ist selbst in C geschrieben.

C # ist eine kompilierte Sprache, die jedoch nicht zu Maschinencode kompiliert wird. Stattdessen wird es in einer speziellen Sprache (Bytecode) kompiliert, um auf einer virtuellen Maschine ausgeführt zu werden. Java ist ein weiteres Beispiel für eine solche Einrichtung. Sie könnten es als eine Mischung aus Kompilierung und Interpretation betrachten, bei der die virtuelle Maschine ein Interpreter ist. Die virtuelle Maschine für C # (die CLI oder Common Language Infrastructure ) ist in C ++ geschrieben.

Andere Beispiele sind:

  • Python: Der Python-Interpreter kompiliert Python-Code in Python-Bytecode und interpretiert dann den Bytecode. Der Interpreter selbst ist in C geschrieben. Seitdem wurden neue Implementierungen hinzugefügt, darunter eine, die Python zur Ausführung auf derselben für C # verwendeten CLI kompiliert, IronPython , und eine, die auf der Java Virtual Machine Jython ausgeführt wird . Um den Kreis zu schließen, gibt es eine Python-Version, die in (einer Teilmenge von) Python, PyPy, geschrieben ist .
  • Ruby: Ruby begann als reine interpretierte Sprache, aber die neueste Version verwendete Bytecode. Auch für Ruby gibt es ein Projekt mit dem Namen IronRuby , das zur CLI kompiliert wird , und eines für die Java-VM JRuby .
Martijn Pieters
quelle
Es tut mir leid, wie unterscheidet sich eine virtuelle Maschine von einem Interpreter? Ich verstehe nicht, wie die Verwendung von Eins einen halben Weg zur Kompilierung darstellt. Wollen Sie damit sagen, dass der Bytecode zur Hälfte kompiliert ist?
Philip
1
@Philip: Byte-Code ist kein Maschinencode. Anstatt die CPU mit direkten Anweisungen zu versorgen, benötigen Sie noch einen Interpreter, der den Bytecode aufnimmt und diesen interpretiert. Übersetzen Sie ihn in Maschinenanweisungen. Der Vorteil ist, dass die virtuelle Maschine einfacher auf andere Architekturen portiert werden kann und Sie Tricks wie die JIT-Kompilierung anwenden können .
Martijn Pieters
Hat jemand das Gefühl, dass der Begriff "zusammengestellt" für Marketingzwecke verwässert wurde?
Philip
2
Whoa! Ich nehme das zurück. Ich war dort eine Weile auf der falschen Straße. Ich nahm an, dass "kompiliert" bedeutete, sich in Maschinencode und nur Maschinencode zu verwandeln, was eigentlich nicht wahr ist. Es ist nur ein Begriff für die Übersetzung von Code in anderen Code. Sei es der Maschinencode, der Bytecode oder die gewünschte Sprache. Es stellt sich außerdem heraus, dass es PHP-Compiler gibt, sodass man nur sagen kann, dass sie "typisch" interpretiert werden.
Philip
Auch eine gute Quelle: youtube.com/watch?v=e4ax90XmUBc
Adam
34

Sie haben im Grunde recht. Wenn gesagt wird, dass Ruby in C geschrieben ist, bedeutet dies, dass der Sprachinterpreter und Teile der Kernbibliothek in C geschrieben sind.

Der Ruby-Interpreter ist also ein C-Programm, das eine Textdatei als Eingabe verwendet, verarbeitet und dann Funktionen aufruft, die sich entweder in einer anderen Textdatei befinden (sofern sie in Ruby geschrieben wurden) oder kompilierten C-Code enthalten, der über die erforderliche Grundfunktionalität verfügt Direkter Zugriff auf Systemressourcen wie Speicher, Dateisystem und mehr. Und einige Funktionen, die eine sehr hohe Leistung erfordern.

Sie haben also verschiedene Teile einer Sprache, die in anderen Sprachen geschrieben werden können oder müssen. Nichts würde Sie davon abhalten, den Interpreter in C und die Bibliotheken in C ++ zu schreiben (obwohl dies möglicherweise einige Dinge erschwert). Sie könnten sogar mehrere Schritte ausführen und eine Sprache verwenden, die sehr gut in der Textverarbeitung ist, um einige Zwischendaten zu generieren, die dann von einem C-Code verarbeitet werden.

Faktoren für die Entscheidung können dieselben sein wie für andere komplexe Anwendungen. Leistung ist eins. Die Fähigkeit, Code zu schreiben, der direkt auf andere Systemressourcen zugreifen kann. In den meisten Fällen muss es sich also um eine kompilierte Sprache handeln (obwohl Sie theoretisch einen Ruby-Interpreter in Python schreiben könnten). Die Verfügbarkeit auf verschiedenen Systemen ist wichtig, wenn Sie möchten, dass Ihre Sprache unter Linux, Win, OS X und anderen ausgeführt wird.

thorsten müller
quelle
Weiß jemand, warum ich in dem Moment, in dem ich es gepostet habe, drei positive Stimmen für meine Antwort sehe?
thorsten müller 20.11.12
1
Ich sehe jetzt vier, aber ich bin mir nicht sicher, was Sie fragen? Sind die Upvotes zu schnell erschienen? Wenn ja, na ja, viele Augen auf die Frage (drei fast gleichzeitige Antwort), und Ihre Antwort ist gut.
Yannis
Hmm ja. Vielleicht hatte ich es gespeichert und dann bearbeitet, erneut gespeichert und den ersten Speichervorgang vergessen (ich werde alt). Für mich sah es so aus, als hätte ich in dem Moment, in dem ich gepostet habe, die ersten drei Upvotes erhalten.
thorsten müller 20.11.12
@ thorstenmüller +1 für "Nichts würde Sie davon abhalten, den Interpreter in C und die Bibliotheken in C ++ zu schreiben." Ich wollte Sie gerade danach fragen. Gibt es dafür bekannte Implementierungen, bei denen sich der Interpreter / Compiler in einer Sprache befindet, während sich die Kernbibliotheken in einer anderen Sprache befinden?
Songo
@ thorstenmüller Ich habe das gelegentlich ein paar mal passieren lassen. Wenn mehrere Personen die Frage beim Posten angesehen haben, wird innerhalb von ein oder zwei Sekunden die Meldung "Eine neue Antwort wurde gepostet" angezeigt, sodass sie die gesamte Antwort hätte überfliegen und innerhalb von 10 Sekunden eine Bewertung abgeben können von Ihrem Beitrag es. Darüber hinaus werden Änderungen, die innerhalb von 5 Minuten nach dem Posten der Antwort vorgenommen wurden, nicht im Bearbeitungsverlauf angezeigt, was zu geringfügiger Verwirrung bei Ihnen hätte führen können.
Izkata
10

Es bedeutet einfach, dass der größte Teil des Kerns von Sprache A in Sprache B geschrieben ist. Welcher "Kern von Sprache A" sich von Sprache zu Sprache unterscheiden mag, aber im Allgemeinen bedeutet es, dass es sich um einen Compiler oder Interpreter handelt. Entscheidend für die Auswahl einer Sprache, in der eine andere Sprache geschrieben werden soll, ist wie bei fast jedem Projekt, mit welchen Sprachen die Entwickler besser vertraut sind.

Das heißt, "Sprache A ist in Sprache B geschrieben" ist eine Vereinfachung für die meisten modernen Sprachen. Wenn wir Python als Beispiel nehmen, während die Referenzimplementierung CPython tatsächlich in C geschrieben wurde, gibt es Implementierungen, die in anderen Sprachen geschrieben wurden, wie Jython (in Java geschrieben), IronPython (in C # geschrieben), PyPy (in Python geschrieben), CLPython (geschrieben in Common Lisp), Stackless Python (geschrieben in C und Python) und Unladen Swallow (geschrieben in C ++).

Eine Programmiersprache ist eine Definition, und wie das Python-Beispiel zeigt, gibt es keine wirklichen Einschränkungen für die Sprachen, in denen Compiler, Interpreter und Bibliotheken geschrieben werden können. Natürlich kann eine Sprache auch in sich selbst geschrieben werden. durch einen Prozess namens Bootstrapping .

yannis
quelle
2
Ich würde Psyco nicht als eine andere Implementierung bezeichnen, da es als Erweiterung von CPython ausgeführt wird.
Martijn Pieters
@MartijnPieters Laut Website ist es auch ein totes Projekt. Entfernt.
Yannis
@YannisRizos Ist Unladen Swallow nicht auch tot ?
Andres F.
1
@Songo: Abgesehen davon string.lower(s)ist es eine Python-Funktion, die das an delegiert return s.lower(), das ist richtig. Die CPython 3.3-String-Case-Operationen werden in C.
Martijn Pieters,
3

Aus der Perspektive der Verwendung einer Programmiersprache ist eine Programmiersprache nur ein Programm. Es kann sich um einen Compiler, einen Interpreter oder eine virtuelle Maschine handeln. All diese Dinge sind nur Computerprogramme und können daher in jeder Sprache geschrieben werden.

Wenn Sie also Ihre eigene PHP-Version erstellen möchten, können Sie mit einer beliebigen Sprache beginnen, die Sie am besten beherrschen. Sie würden dann ein Programm schreiben, das PHP-formatierten Code lesen und das tun kann, was die PHP-Spezifikation Ihrem Programm vorschreibt . Sie erstellen damit die PHP-Sprache in der Sprache X.

Bryan Oakley
quelle
Interessanter Punkt. Wenn ich also eine in PHP eingebaute Funktion habe, explodedie eine braucht Stringund eine zurückgibt Array, ist ihre Implementierung (dh der Code, der den String bearbeitet, um das Array zu erzeugen) in C geschrieben , oder?
Songo
@Songo: richtig. Auch hier ist PHP nur ein Programm, nicht anders als Word oder Apache oder Notepad oder vi oder Emacs. Es liest Daten ein und analysiert sie gemäß einer Sprachspezifikation. Anschließend wird das getan, was die Sprachspezifikation vorschreibt.
Bryan Oakley
Diese Antwort bringt die Sprache schlecht mit der Implementierung in Verbindung.
Russell Borogove
Ich denke, das ist die einfachste und direkteste Antwort und ich sehe nicht, wie es irgendetwas zusammenfügt. Es lässt sogar vermuten, dass es mehr als eine Implementierung von PHP gibt. Es gibt in der Tat einige, das ursprüngliche PHP und das Facebook-Ding, und es könnte andere geben.
Warren P
@RussellBorogove: glaubst du nicht, dass "aus der Perspektive der Verwendung einer Programmiersprache" hilft, die Antwort zu klären? Denken Sie daran, wir haben es mit einem absoluten Anfänger mit dieser Frage zu tun. Es ist fair, IMO, ein wenig Präzision zu opfern, um den Punkt zu veranschaulichen.
Bryan Oakley
3

Eine sehr ähnliche Formulierung mit völlig anderer Bedeutung ist "Schriftsprache A in Sprache B", zB "C in Java schreiben".

Dies beschreibt Code, der in einer Sprache syntaktisch korrekt ist, aber Strukturen, Redewendungen und Konventionen aus einer anderen Sprache verwendet. In dem Beispiel "Schreiben von C in Java" würden Zeichen dafür sein, dass alle lokalen Variablen über jeder Methode deklariert werden, wobei Integer-Konstanten anstelle von Aufzählungen verwendet werden, Bezeichner mit Unterstrichen usw. verwendet werden.

In der Regel passiert dies, wenn jemand lange mit einer Sprache gearbeitet hat (insbesondere, wenn er nur mit dieser Sprache gearbeitet hat) und in der aktuellen Sprache noch sehr neu ist (oder kein Interesse daran hat, sauberen Code zu schreiben).

Michael Borgwardt
quelle
"CPython ist in C geschrieben" bedeutet definitiv nicht "dieser Benutzer schreibt in Python, als wäre es C". Dies bedeutet, dass CPython (Python.exe unter Windows, / usr / bin / python unter Unix) in C geschrieben ist.
Warren P
@Warren P: Sicher, aber die Ausdrücke sind sehr ähnlich, so dass Leute, die mit keinem vertraut sind, hier leicht nach einer Erklärung suchen könnten.
Michael Borgwardt
3

Technologie ist ein inhärent iterativer Prozess. Wir beginnen mit einfachen Werkzeugen und verwenden diese dann, um bessere Werkzeuge zu entwickeln. Die ersten Assemblersprachen waren so ziemlich 1: 1-Übersetzungen der standardisierten Befehlsbytecodes für den Chip; Die 8086-Architektur und ihr Assembler dominierten andere Architekturen wie Z80, RISC usw., und so begannen wir, Sprachen zu entwickeln, die in die 8086-Assembly integriert werden konnten, wie FORTRAN, COBOL, Pascal und C. Das Programm, das den Quellcode von interpretiert Diese Sprachen müssen in etwas Primitiverem geschrieben sein, sonst kommt es zu einem Henne-Ei-Streit. Wenn der Quellcode für den ersten C-Compiler in C geschrieben wurde, was kompilierte dann diesen C-Quellcode und wäre das nicht per Definition der erste C-Compiler?

Grundsätzlich bedeutet "C # ist in C ++ geschrieben", dass die ersten und / oder beliebtesten Compiler- und Laufzeit- / Kernbibliotheken der Spezifikation der C # -Sprache entsprechen (Microsoft .NET Framework und der Befehlszeilencompiler) Programm CSC.exe) sind in C ++ geschrieben.

KeithS
quelle
0

"Sprache A ist in Sprache B geschrieben" bedeutet, dass die einzige Implementierung von Sprache A (oder die einzige, die weit verbreitet ist) diejenige ist, die tatsächlich ein in Sprache B entwickeltes Projekt ist und die einzige vollständige, aktuelle Die Angabe von A ist der B-Quellcode, der ihn so implementiert, dass das B-Programm normalerweise als korrekt angesehen wird, wenn die Dokumentation und das B-Programm nicht übereinstimmen.

Kaz
quelle
Es gibt keine einzige autorisierende Implementierung von C ++. Im Fall von C ++ ist die Spezifikation korrekt und undefiniertes Verhalten in der Spezifikation kann alles in Ihrer Implementierung bewirken. Also nein, das ist nicht richtig.
Warren P
Ich sehe nicht, was der vorherige Kommentar mit meiner Antwort zu tun hat. Ich habe keine allgemein quantifizierte Aussage über alle Sprachen gemacht, und so ist das C ++ - Gegenbeispiel nicht anwendbar. Eine Aussage der Form "A ist in B geschrieben", wobei A "C ++" ist, ergibt keinen Sinn, es sei denn, B ist "Englisch".
Kaz