[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.