Werden Compiler außerhalb der Entwicklung verwendet?

14

Nach meinem Verständnis sind Compiler für Entwickler gedacht, die ihren Code in ausführbare (Maschinencode-) Dateien kompilieren. Compiler erstrecken sich nicht auf den Computer oder das Endbenutzersystem eines Clients.

Stattdessen konvertieren Entwickler ihren Code mithilfe des Compilers in Maschinencode, der dann zur Verwendung als Anwendung auf die anderen Maschinen übertragen wird.

Haben Compiler eine Funktion außerhalb dieses Prozesses? Wenn ja, wann werden sie verwendet?

Pankaj Upadhyay
quelle
21
Ja, Compiler kompilieren Code.
Tom Squires
@Tom: Ich habe irgendwo gelesen, dass C-Compiler auf verschiedenen Computern installiert sind, einschließlich Spielekonsolen. Bedeutet dies, dass wir Code in C schreiben, der dann an diese Geräte gesendet wird, wo er vom Compiler kompiliert und dann vom Interpreter ausgeführt wird?
Pankaj Upadhyay
3
@Pankaj Upadhyay: Es ist möglich , dass Code könnte zu einer Maschine gesendet und dann durch einen internen Prozess zusammengestellt. Es ist unwahrscheinlich, dass der Benutzer des Geräts dies jemals sehen oder davon erfahren wird. Dies kann der Fall sein, wenn Teile des Codes für bestimmte Hardware kompiliert werden müssen und Lösungen, die zur Laufzeit auf Hardware testen, zu langsam sind, sodass während der Installation Code verteilt und kompiliert werden muss. Vielleicht ...
FrustratedWithFormsDesigner
3
@Pankaj Mit Compilern werden keine Spielekonsolen ausgeliefert, aber einige können auf ihnen installiert werden. Sony lieferte eine Version von Linux und GCC, die beispielsweise auf der PS2 installiert werden könnte. Andere Leute haben ihren Weg geknackt / gehackt, um andere Betriebssysteme und Software auf Konsolen zu bringen.
IronMensan
4
@Stargazer: Meinten Sie: "Nein, Compiler übersetzen von einer Ausgangssprache in eine Zielsprache"? Wenn Sie das Komma weglassen, bedeutet Ihr Satz das Gegenteil Ihrer beabsichtigten Bedeutung.
Daniel Pryden

Antworten:

19

Ja und nein. Ja, im klassischen Szenario verwendet ein Entwickler einen Compiler, um Maschinencode aus dem Quellcode zu generieren, und der Maschinencode wird dann an die Benutzer verteilt.

Es gibt jedoch einige Ausnahmen. Erstens werden viele Open Source-Projekte in erster Linie (oder sogar ausschließlich) in Form von Quellcode verteilt, und der Endbenutzer muss sie installieren, indem er ein paar Befehle wie makeund dann eingibtmake intall. Dadurch wird der Compiler, Linker usw. aufgerufen, um den Computercode aus dem Quellcode für den Computer dieses Benutzers zu generieren. In diesen Fällen wird der Prozess des Erstellens und Installierens jedoch so weit automatisiert, dass der Benutzer nur selten viel Wissen darüber benötigt, abgesehen von der Tatsache, dass er noch nie ein reines Quellcode-Paket installiert hat Ihr Paketmanager listet normalerweise ein "Entwicklungs" -Paket als Voraussetzung für die Installation der Anwendung auf, die sie wirklich interessieren (obwohl einige dies für Endbenutzer immer noch als unfreundlich betrachten).

Eine andere Ausnahme (die angedeutet, aber in den anderen Antworten, die ich gesehen habe, nicht sehr gut erklärt wurde) sind Just-in-Time-Compiler (JIT). Einige offensichtliche Beispiele für JIT-Compiler sind die Microsoft Common Language Runtime (CLR) und die Java Virtual Machine (JVM). In diesen Fällen gibt es normalerweise zwei völlig separate Compiler, die an der Übersetzung des Quellcodes in Maschinencode beteiligt sind. Eine wird vom Entwickler verwendet. Es wird jedoch kein direkter Maschinencode generiert, sondern ein maschinenunabhängiger Bytecode. Die CLR / JVM enthält dann einen zweiten Compiler, der von dem ersten vollständig getrennt ist und diese Bytecodes in Maschinencode für den Zielcomputer konvertiert.

Ich sollte hinzufügen, dass der zweite Compiler nicht unbedingt erforderlich ist. Frühe Versionen der JVM (zum Beispiel) haben die Bytecodes nur interpretiert, anstatt sie zu kompilieren. Dies ist jedoch häufig mit erheblichen Leistungseinbußen verbunden. Daher enthalten die meisten für den produktiven Einsatz bestimmten JVMs der neuesten Generation einen JIT-Compiler.

Jerry Sarg
quelle
24

Ja, Compiler werden hauptsächlich von Entwicklern verwendet, mit einigen bemerkenswerten Ausnahmen. Endbenutzer verwenden manchmal Compiler, um die neueste Open Source-Software zu kompilieren und zu installieren, selbst wenn sie keine Änderungen am Code vornehmen. Einige Programmiersprachen haben auch keine Compiler. Sie verwenden stattdessen Interpreter, die im laufenden Betrieb "kompilieren". In diesem Fall müssen Endbenutzer den Interpreter auf ihren Computern installiert haben.

Karl Bielefeldt
quelle
4
Wenn wir die Definition von "Compilern" auf Programme beschränken würden, die ausführbare Dateien generieren, wäre dies eine gute Antwort. Dies ist jedoch nur eine Teilmenge der wahren Definition von "Compiler"
riwalk
16
@ Jan Soltis: Ich bin anderer Meinung. Ich habe den Linux-Kernel aus dem Quellcode kompiliert: Bedeutet das, dass ich ein Linux-Kernel- Entwickler bin ? Ich habe noch nie den Linux-Kernel-Code geändert oder einen Patch eingereicht. Das bedeutet, dass ich kein Kernel-Entwickler bin . In den Jahren, in denen ich Gentoo als primäres Betriebssystem verwendet habe, habe ich außerdem jede einzelne Software auf dem Computer kompiliert . Die überwiegende Mehrheit davon wurde jedoch vom Portage-Paketverwaltungssystem automatisch kompiliert. Ich würde argumentieren, dass ich in diesem Fall als Endbenutzer, aber nicht als Entwickler auftrat .
Daniel Pryden
8
@Jan Soltis: Mir ist bewusst, dass das Ihre Meinung ist. Ich bin mit Respekt anderer Meinung. Ich habe Gegenargumente angegeben, um meine Position zu unterstützen, während Sie weiterhin nicht unterstützte Behauptungen aufstellen. Sie scheinen zu glauben, dass es eine scharfe Grenze zwischen "Entwickler" und "Endbenutzer" gibt, die meines Erachtens nicht existiert.
Daniel Pryden
6
Das Herunterladen von Quellen und das anschließende Ausführen von "make install" ist kein Entwickler. Es ist definitiv eine Endbenutzeroperation.
Kristopher Johnson
3
@Jan: Ich könnte akzeptieren, dass man mit einer Distribution wie Gentoo, die Pakete kompiliert, zumindest ein Power- User ist, aber das ist immer noch eindeutig ein Benutzertyp. Das Kompilieren des Codes anderer Leute, ohne ihn zu ändern, zu ergänzen oder sogar zu lesen, macht Sie nicht zum Entwickler.
Carson63000
10

Ja

Ein Compiler ist ein Programm, das Code von einer Sprache in eine andere übersetzt (siehe Wikipedia ). Die häufigste Verwendung von Compilern besteht darin, die Ausgangssprache in Maschinencode zu übersetzen, dies definiert jedoch das Wort "Compiler".

Beispielsweise generiert Python beim Importieren eines Moduls Byte-Code und passt somit in die Definition eines Compilers (da es von der Quellsprache Python in die Zielsprache Python-Byte-Code konvertiert).

Ein weiteres Beispiel ist die V8-JavaScript-Engine. Es konvertiert JavaScript in x86-Maschinencode und passt somit auch in die Definition eines Compilers. V8 passt nicht nur zur Definition eines Compilers, sondern ist auch in Chrome enthalten und wird auf Client-Computern sehr häufig verwendet.

riwalk
quelle
4

Ein Fall wäre eine Anwendung, die zur Laufzeit dynamisch Code generiert und dann den generierten Code ausführt. Dieser Code müsste zur Laufzeit kompiliert werden.

Bearbeiten: Es gibt andere Ausnahmen, aber sie wurden bereits in anderen Antworten erwähnt.

Morgan Herlocker
quelle
+1 nur sagen , JIT
gnat
1
Die V8-Engine in Chrome ist keine Ausnahme.
Riwalk
Zur Verdeutlichung aktualisiert. Mir ist klar, dass es noch andere Ausnahmen gibt.
Morgan Herlocker
3

Compiler sind nur für Entwickler gedacht, die ihren Programmiersprachencode in ausführbare Dateien (Machin-Code) kompilieren möchten

Ich würde sagen "Compiler sind primär für Entwickler gedacht ...". Ich habe jedoch Beispiele gesehen, bei denen Programme im laufenden Betrieb neuen Programmiersprachencode generieren und daher einen Compiler benötigen, der auf dem Computer des Endbenutzers installiert wird. Das bedeutet nicht, dass der Endbenutzer selbst mit dem Compiler arbeiten muss.

Mögliche Gründe für diese Programmgestaltung:

  • Leistung: Stellen Sie sich eine regelgesteuerte Anwendung vor, bei der die Regeln in einem Endbenutzerdatenspeicher gespeichert sind und Sie über einige Massendaten verfügen, die von diesen Regeln verarbeitet werden sollen. Anstatt die Regeln immer wieder zu interpretieren, generiert ein Programm zuerst den Verarbeitungscode, kompiliert ihn und führt ihn mit den zu verarbeitenden Daten aus

  • Stellen Sie sich ein Programm vor, in dem der Endbenutzer eine Art mathematische Formel hinzufügen kann und der Entwickler des Programms dafür keinen eigenen Parser / Interpreter implementieren möchte. Stattdessen nimmt das Programm diese Formel, nimmt einige Ergänzungen vor, um sie in einen gültigen Programmcode umzuwandeln, lässt den Compiler sie kompilieren und führt sie anschließend aus.

Doc Brown
quelle
hmm .... Das bedeutet nicht, dass der Endbenutzer alleine mit dem Compiler arbeiten muss . Das erklärt und verdeutlicht so ziemlich alles.
Pankaj Upadhyay
2

Das ist richtig - Compiler kompilieren den Quellcode in eine ausführbare Form, die dann von einem Linker in eine ausführbare Binärdatei eingebunden wird. Der Quellcode kann auch direkt von einem Interpreter ausgeführt werden, z. B. einer der vielen Befehlszeilen-Shells (C-Shell, Bash, Zsh usw.), awk, sed usw.

Es kann schwierig sein, eine klare Grenze zwischen "Entwickler" und "Endbenutzer" zu ziehen, es sei denn, Sie beschränken Ihre Diskussion auf ein bestimmtes Produkt. Entwickler sind alle "Endbenutzer" der von ihnen verwendeten Tools, und "Endbenutzer" haben möglicherweise Entwicklungstools wie Compiler und Interpreter auf ihren Computern installiert.

Caleb
quelle
2
Ok, ich gehe jetzt zu -1, weil es hier eine Menge Missverständnisse über Compiler gibt. Compiler übersetzen Code aus einer Quellsprache in eine Zielsprache. Die Aussage, dass sie Maschinencode generieren, ähnelt der Aussage, dass Fahrzeuge 4 Räder haben (ja, die meisten Fahrzeuge haben 4 Räder, aber ein Motorrad ist auch ein Fahrzeug. Auf die gleiche Weise generieren die meisten Compiler Maschinencode, aber ein C # -> VB-Konverter ein Compiler auch)
riwalk
1
@ Stargazer712, ich versichere dir, dass es kein Missverständnis gibt - ich weiß sehr gut, was Compiler tun, danke. Aber wenn mich jemand, der mich nicht kennt, fragt, was ein Auto ist, würde ich wahrscheinlich sagen, dass ein Auto vier Räder hat, obwohl manche dies nicht tun . Eine pedantische Definition verwirrt oft mehr, als es einer Person erklärt, die versucht, sich mit einem Konzept auseinanderzusetzen. "Compiler" kann auch eine Stellenbeschreibung sein, aber das zu erwähnen, würde hier nicht helfen.
Caleb
1

Administratoren müssen möglicherweise auch Programmiersprachen zum Schreiben von Skripten verwenden, um verschiedene automatisierte Aufgaben auszuführen. Beispiel: Ein Skript löscht alte Protokolldateien nach 90 Tagen von einem Server, um Speicherplatz freizugeben. Die Sprache, in der das Skript geschrieben wurde, muss interpretiert oder kompiliert werden, damit es auf dem System ausgeführt werden kann.

JB King
quelle
1

Einige Programme sind Metaprogramme : Während sie ausgeführt werden, können sie ein anderes Programm (oder einen anderen Quellcode) generieren und es kompilieren und dann irgendwie ausführen. Lesen Sie auch über mehrstufige Programmierung .

Um diese Art von Programmen verwenden zu können, wäre ein Compiler erforderlich, auch wenn der Benutzer nicht weiß, wie er sich selbst programmieren soll (da der Computer Code generiert, der kompiliert werden muss).

Ein Beispiel finden Sie in MELT (das C ++ - Code zur Erweiterung von GCC generiert ) oder in J.Pitrats CAIA- System für künstliche Intelligenz (das C-Code generiert, insbesondere seinen eigenen Code, um kombinatorische Probleme zu lösen).

Bei einigen Sprachen und Implementierungen muss fast überall ein Compiler vorhanden sein (in jedem Programm, das in dieser Sprache und Implementierung codiert ist). Erstens enthalten mehrere Webbrowser eine Javascript JIT- Engine (wie V8 ). Außerdem enthalten die meisten gängigen Lisp- Implementierungen (z. B. SBCL ) einen Compiler (sogar nützlich, um Anwendungen auszuführen , die Ausdrücke generieren und auswerten können ). Lesen Sie auch über homoikonische Sprachen und Qine-Programme .

Basile Starynkevitch
quelle