[Powered by Google Translate] ROB BOWDEN: Lassen Sie uns über Compiler sprechen.
Bis zu diesem Punkt haben Sie gerade Ihren Quelltext eingegeben in
einige Dateien, schickte sie durch diese großen schwarzen Box, die ist
Clang, und heraus kommt die ausführbare Datei, die funktioniert
genau das, was Sie geschrieben haben in Ihrem Quellcode.
So magisch wie die gewesen ist, werden wir einen genaueren
schauen, was tatsächlich passiert
wenn wir kompilieren eine Datei.
Also, was bedeutet es, etwas zu kompilieren?
>> Nun, in einem sehr allgemeinen Sinn, es bedeutet nur,
Umwandlung Code in einer schriftlichen
Programmiersprache zur anderen.
Aber in der Regel, wenn die Leute sagen, dass sie zu kompilieren etwas, sie
bedeuten sie nehmen es von einer höheren Ebene Programmierung
Sprache auf einem niedrigeren Niveau Programmiersprache.
Diese können wie sehr subjektiv sein.
Zum Beispiel werden Sie wahrscheinlich nicht von C denken, wie einer hohen
Level-Programmiersprache, aber Sie wissen es zu kompilieren.
Aber es ist alles relativ.
Wie wir sehen werden, die Assembler-Code und schließlich Maschine
Code, den wir unten zu kompilieren ist zweifellos ein niedrigeres Niveau
als C.
Obwohl wir mit werden Clang in der heutigen Demonstration,
Viele der Ideen, die hier übertragen auf anderen Compilern.
>> Für Clang gibt es vier Hauptschritte im Gesamtsystem
Zusammenstellung.
Dies sind ein, Vorverarbeitung durch den Präprozessor getan, zwei,
Zusammenstellung durch den Compiler getan, drei, Montage
getan vom Assembler und vier,
Verknüpfung vom Linker getan.
Es kann verwirrend sein, dass einer der Unterschritte des Gesamtsystems
Clang Compiler wird als Compiler, sondern
wir dazu kommen.
Wir werden mit einem einfachen Hallo Welt Programm als Beispiel
in diesem video.
Lassen Sie uns einen Blick.
>> Der erste Schritt ist Vorverarbeitung.
Was macht der Präprozessor tun?
In so ziemlich jedem C Programm, das Sie je gelesen habe oder schriftlicher Form
Sie haben Codezeilen, die mit einem Hash beginnen verwendet.
Ich nenne es Hash, aber man kann auch sagen Pfund, Anzahl
Anmeldung oder scharf.
Eine solche Linie ist eine Präprozessordirektive.
Sie haben wahrscheinlich gesehen # define und # vor beinhalten, aber es
gibt mehrere, die der Präprozessor erkennt.
Fügen wir eine # unsere Hallo Welt Beispiel definieren.
Jetzt lasst uns laufen nur den Präprozessor auf diese Datei.
Durch die Übergabe Clage the-E-Flag, Sie anweist, zu laufen
nur der Präprozessor.
Mal sehen, was passiert.
Es sieht aus wie Clang nur spuckt alles
auf der Kommandozeile.
Um all diese Ausgabe in eine neue Datei namens sparen
hello2.c, wir anhängen> hello2.c auf unseren Befehl.
Werfen wir nun einen Blick auf unsere vorverarbeiteten Datei.
>> Whoa, passiert was unsere kurze kleines Programm?
Wenn wir alle den Weg zum Ende der Datei zu gehen, werden wir sehen,
Teil des Codes, dass wir tatsächlich schrieb.
Beachten Sie, dass der # define-gegangen ist und alle Instanzen des Namens
haben genau das, was wir in festgelegten ersetzt worden
der # define-Zeile.
Also, was sind alle diese typedefs und Funktionsdeklarationen
am Anfang der Datei?
Beachten Sie, dass der # define war nicht der einzige Präprozessor
Richtlinie, die wir angegeben.
Wir haben auch # include stdio.h.
Also alle die verrückten Linien sind eigentlich nur stdio.h kopiert
und in den Anfang der Datei eingefügt.
Das ist, warum Header-Dateien so nützlich für die Funktion sind
Deklarationen.
Statt benötigen zum Kopieren und Einfügen all der Funktion
Deklarationen über die Verwendung am Anfang der Datei, die
Präprozessor kopieren und sie aus dem Header
Datei für Sie.
>> Jetzt, da wir Vorverarbeitung fertig sind, bewegen wir uns auf
Zusammenstellung.
Der Grund nennen wir diesen Schritt Zusammenstellung ist, denn dies ist
der Schritt, wo Clang eigentlich seine Kompilieren nicht von C nach
Assembler-Code.
Um über Clang kompiliert eine Datei auf Montage, aber
weiterhin nicht weiter, geben sie dem Flag-s
auf der Kommandozeile.
Werfen wir einen Blick auf die Montage
Datei, die ausgegeben wurde.
Es sieht aus wie eine ganz andere Sprache.
Assembly-Code ist sehr Prozessor-spezifischen.
In diesem Fall, da die CS50 Gerät ist auf eine laufende
virtuellen x86-Prozessor, ist dies x86-Assembler-Code.
Sehr wenige Menschen schreiben Sie direkt in Assembler-Code in diesen Tagen,
aber jedes C Programm, das Sie jemals schreiben transformiert wird unten
in der Montage.
Wieder nennen wir diesen Schritt der Erstellung des C in Assembler
da es sich von einem höheren Niveau auf ein niedrigeres Niveau gehen
Programmiersprache.
>> Was macht die Montage niedrigeren Niveau als C?
Nun, in der Montage, sind wir sehr in dem, was wir tun können, begrenzt.
Es gibt keine, wenn das, während es für ist, oder Schleifen jeglicher Art.
Aber man kann erreichen, die gleichen Dinge, dass diese Kontrolle
Strukturen bieten die begrenzten Operationen,
Montage vorsieht.
Aber zu sehen, wie niedrige Montage wirklich ist, gehen wir
einen weiteren Schritt in unserer Zusammenstellung, Montage.
Es ist der Assembler die Aufgabe, die Assembler-Code zu transformieren
in das Objekt oder Maschinencode.
Beachten Sie, dass der Monteur nicht der Output Assembly;
statt, dauert es in der Montage-und Ausgänge Maschinencode.
Maschinen-Code ist die eigentliche 1 und 0, dass eine CPU
verstehen, obwohl wir immer noch ein klein wenig Arbeit verlassen
bevor wir laufen unserem Programm.
Lassen Sie montieren unsere Assembler-Code, indem
Clang-c-Flag.
Nun wollen wir sehen, was in dem zusammengebauten Datei.
>> Nun, das nicht hilft uns sehr.
Beachten Sie, dass der Maschinencode die Einsen und Nullen, dass es
Computer verstehen kann.
Das bedeutet nicht, es ist einfach für uns zu verstehen.
So genau, wie niedrig ist die Montage?
Es ist fast identisch mit Objekt-Code.
Gehen von der Montage bis Objekt-Code ist viel mehr ein
Übersetzung als eine Transformation, weshalb
könnte man nicht der Ansicht, die Assembler
noch keine tatsächliche Kompilierung.
In der Tat ist es ziemlich einfach, manuell übersetzen
Montage in Maschinencode.
Mit Blick auf die Anordnung für eine Hauptfunktion, dass erste Zeile
geschieht in hexadezimal 0x55 entsprechen.
In binären, das ist 1010101.
Die zweite Zeile passiert Hexadezimal 0x895 entsprechen.
Und das nächste, 0x56.
Angesichts einer relativ einfache Tabelle, könnte man übersetzen
Montage in dem Code, den Maschinen zu verstehen.
>> So gibt es eine verbleibende Schritt in
Zusammenstellung, die Verknüpfen.
Verknüpfung kombiniert eine Reihe von Objekt-Dateien in eine große Datei
dass Sie tatsächlich auszuführen.
Verlinkung ist sehr abhängig vom Betriebssystem.
Der einfachste Weg, um Clang werde dann verknüpfen Objekt
Dateien zusammen zu Clang auf alle Dateien, die rufen
Sie miteinander zu verknüpfen.
Wenn Sie. Geben o-Dateien, dann wird es nicht erneut zu verarbeiten müssen,
kompilieren, und montieren alle Ihre Source-Code.
Werfen wir einen mathematischen Funktion in unserer Datei, so haben wir
etwas zu verknüpfen in.
Nun wollen wir es kompilieren wieder auf Objekt-Code und
rufen Clang auf sie.
Oops.
Da wir eine mathematische Funktion enthalten, müssen wir in verlinken
die Mathematik-Bibliothek mit-lm.
>> Wenn wir miteinander zu verknüpfen Haufen wollte. O Dateien, die wir
schrieb am eigenen, würden wir nur angeben, sie alle auf die
Befehlszeile.
Die Einschränkung ist, dass nur eine dieser Dateien müssen
tatsächlich geben Sie eine Hauptfunktion, da sonst die
resultierende ausführbare Datei würde nicht wissen, wo ich anfangen soll
Ihren Code ausführen.
Was ist der Unterschied zwischen der Angabe einer Datei in verlinken
mit-l und nur die Angabe einer Datei direkt?
Nichts.
Es ist nur so, dass Clang genau das, was Datei kennen passiert
so etwas wie-lm Fall zu beziehen.
Wenn Sie diese Datei wussten Sie, können Sie angeben, es
ausdrücklich.
Denken Sie daran, dass all-l-Flags am Ende kommen müssen
Ihrer Nachfrage der Kunden.
>> Und das ist alles dort ist zu ihm.
Wenn Sie gerade laufen Clang auf einige Dateien, das ist, was es ist
eigentlich tun.
Mein Name ist Rob Bowden, und dies ist CS50.