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?
Antworten:
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
make
und 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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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 .
quelle