[Powered by Google Translate] ROB BOWDEN: Ας μιλήσουμε για μεταγλωττιστές. Μέχρι αυτό το σημείο, έχετε μόλις πληκτρολογήσατε μέχρι τον πηγαίο κώδικα σε σας κάποια αρχεία, τους έστειλε μέσα από αυτό το μεγάλο μαύρο κουτί που είναι Clang, και βγαίνει εκτελέσιμο αρχείο σας που κάνει ακριβώς αυτό που έγραψε στον πηγαίο κώδικα σας. Όπως μαγικό ως που είναι ήδη, θα πάμε να ρίξουμε μια πιο προσεκτική δούμε τι πραγματικά συμβαίνει όταν θα καταρτίζουν φάκελο. Λοιπόν, τι σημαίνει αυτό για την κατάρτιση κάτι; Λοιπόν, στην πιο γενική έννοια, αυτό σημαίνει απλώς μετατροπή κώδικα γραμμένο σε ένα γλώσσα προγραμματισμού στην άλλη. Αλλά συνήθως όταν οι άνθρωποι λένε ότι συγκεντρώνουν κάτι, σημαίνει ότι είναι το παίρνετε από ένα υψηλότερο επίπεδο προγραμματισμού γλώσσας σε ένα χαμηλότερο επίπεδο γλώσσας προγραμματισμού. Αυτά μπορεί να φαίνεται σαν πολύ υποκειμενική άποψη. Για παράδειγμα, ίσως δεν σκέφτονται C ως υψηλή επιπέδου γλώσσα προγραμματισμού, αλλά εσείς το υπολογίσουν. Αλλά είναι όλα σχετικά. Όπως θα δούμε, ο κωδικός συναρμολόγησης και τελικά μηχανή κώδικα που συγκεντρώνει κάτω για να είναι αναμφισβήτητα ένα χαμηλότερο επίπεδο από το C. Αν και θα πρέπει να χρησιμοποιούν Clang σε διαδήλωση σήμερα, ένα Πολλές από τις ιδέες εδώ μεταφέρει σε άλλες μεταγλωττιστές. Για Clang, υπάρχουν τέσσερα βασικά βήματα στη συνολική σύνταξη. Αυτά είναι ένα, προεπεξεργασία γίνεται από τον προεπεξεργαστή? Δύο, συλλογή γίνεται από τον compiler? τρία, συναρμολόγηση γίνεται από το συναρμολογητή? και τέσσερα, σύνδεση γίνεται από το συνδέτη. Μπορεί να προκαλέσει σύγχυση ότι ένα από τα υποστάδια της συνολικής Μεταγλωττιστές Clang ονομάζεται ο compiler, αλλά θα φτάσουμε σε αυτό. Θα πρέπει να χρησιμοποιείτε ένα απλό πρόγραμμα Hello World ως παράδειγμα μας σε όλο αυτό το βίντεο. Ας ρίξουμε μια ματιά. Το πρώτο βήμα είναι η προεπεξεργασία. Τι κάνει η προεπεξεργαστή κάνει; Σε σχεδόν κάθε πρόγραμμα C που έχετε ποτέ διαβάσει ή να γράψει, έχετε χρησιμοποιήσει γραμμές κώδικα που αρχίζουν με ένα hash. Θα καλέσω το χασίς, αλλά μπορείτε επίσης να το ονομάσουμε κιλά, αριθμός υπογράψουν, ή αιχμηρά. Κάθε τέτοια γραμμή είναι μια οδηγία προεπεξεργαστή. Πιθανόν να έχετε δει # define και # include πριν, αλλά υπάρχει είναι αρκετά περισσότερο ότι το προεπεξεργαστή αναγνωρίζει. Ας προσθέσουμε μια # define για παράδειγμα γεια κόσμο μας. Τώρα ας τρέχει μόνο το προεπεξεργαστή σε αυτό το αρχείο. Με το πέρασμα clage η σημαία-Ε, είστε εντολή να τρέξει μόνο η προεπεξεργαστή. Ας δούμε τι θα συμβεί. Μοιάζει Clang φτύνει απλά τα πάντα στη γραμμή εντολών. Για να αποθηκεύσετε ολόκληρο το έξοδο να ονομάζεται ένα νέο αρχείο hello2.c, θα προσαρτήσει> hello2.c στην εντολή μας. Τώρα, ας ρίξουμε μια ματιά στο αρχείο μας προεπεξεργασμένων. Πω πω, τι συνέβη στο μικρό μικρό πρόγραμμα μας; Αν πάμε σε όλη τη διαδρομή προς τα κάτω αυτού του αρχείου, θα δούμε μερικές από τον κωδικό που πραγματικά έγραψε. Παρατηρήστε ότι το # define έχει φύγει και όλες οι περιπτώσεις της ονομασίας έχουν αντικατασταθεί με ακριβώς αυτό που ορίζεται στο το # define γραμμή. Έτσι, τι είναι όλα αυτά τα typedefs και δηλώσεις λειτουργία στην κορυφή του αρχείου; Παρατηρήστε ότι το # define δεν ήταν η μόνη προεπεξεργαστή οδηγίας που ορίζεται. Έχουμε επίσης συμπεριλάβει # stdio.h. Έτσι, όλα τα τρελά γραμμές είναι στην πραγματικότητα απλά stdio.h αντιγραφεί και επικολληθεί στην κορυφή αυτού του αρχείου. Αυτός είναι ο λόγος που τα αρχεία κεφαλίδας είναι τόσο χρήσιμα για τη λειτουργία δηλώσεις. Αντί να χρειάζεται να αντιγράψετε και να επικολλήσετε όλα της συνάρτησης δηλώσεις που σκοπεύετε να χρησιμοποιήσετε στην κορυφή του αρχείου σας, οι προεπεξεργαστή θα αντιγράψετε και να επικολλήσετε τους από την επικεφαλίδα αρχείο για εσάς. Τώρα που τελειώσαμε προεπεξεργασία, θα προχωρήσουμε σε σύνταξη. Ο λόγος που το ονομάζουμε συλλογή βήμα είναι επειδή αυτό είναι το βήμα όπου πραγματικά δεν Clang κατάρτιση του από C έως κώδικα assembly. Για να έχουμε Clang καταρτίζουν φάκελο κάτω από τη συναρμολόγηση, αλλά δεν συνεχιστεί περαιτέρω, να περάσει η σημαία-S στη γραμμή εντολών. Ας ρίξουμε μια ματιά στη συνέλευση αρχείο που εξάγεται. Μοιάζει αρκετά διαφορετική γλώσσα. Συνέλευση κώδικας είναι πολύ συγκεκριμένο επεξεργαστή. Σε αυτή την περίπτωση, δεδομένου ότι η συσκευή CS50 εκτελείται σε ένα εικονικό επεξεργαστή x86, αυτό είναι x86 κώδικα assembly. Πολύ λίγοι άνθρωποι γράφουν κατευθείαν σε κώδικα assembly αυτές τις μέρες, αλλά κάθε πρόγραμμα C Έχετε ποτέ γράψει μεταμορφώνεται κάτω σε συνέλευση. Και πάλι, καλούμε αυτό το βήμα την κατάρτιση του C σε συνέλευση αφού έχουμε μετάβαση από ένα υψηλότερο επίπεδο σε ένα χαμηλότερο επίπεδο γλώσσα προγραμματισμού. Αυτό που κάνει τη συναρμολόγηση χαμηλότερο επίπεδο από ό, τι C; Λοιπόν, στη συναρμολόγηση, είμαστε πολύ περιορισμένες σε ό, τι μπορούμε να κάνουμε. Δεν υπάρχουν αν, ενώ είναι, για είναι, ή βρόχους οποιουδήποτε είδους. Αλλά μπορείτε να πετύχετε τα ίδια πράγματα που αυτοί τον έλεγχο δομές προσφέρουν χρησιμοποιώντας τις περιορισμένες λειτουργίες που συνέλευση δεν παρέχουν. Αλλά για να δείτε πόσο χαμηλό επίπεδο συγκέντρωσης είναι πραγματικά, ας πάμε ένα βήμα παραπέρα στη συλλογή μας, τη συναρμολόγηση. Είναι δουλειά του συναρμολογητή να μετατρέψει τον κώδικα συναρμολόγησης σε αντικείμενο ή κώδικα μηχανής. Να θυμάστε ότι ο assembler δεν συνέλευση εξόδου? μάλλον, παίρνει στη συναρμολόγηση και εξόδους κώδικα μηχανής. Κώδικα μηχανής είναι η πραγματική 1 και 0 ότι η CPU μπορεί να κατανοήσουν, αν και έχουμε ακόμα ένα μικρό κομμάτι της εργασίας αριστερά για να μπορέσουμε να τρέξουμε το πρόγραμμά μας. Ας συγκεντρώσει κώδικα assembly μας με το πέρασμα Clang η σημαία-c. Τώρα, ας δούμε τι είναι στην συναρμολογημένη αρχείο. Λοιπόν, αυτό δεν μας βοηθά πάρα πολύ. Να θυμάστε ότι ο κώδικας μηχανής είναι αυτά και μηδενικά που ο υπολογιστής σας μπορεί να καταλάβει. Αυτό δεν σημαίνει ότι είναι εύκολο για μας να καταλάβουμε. Έτσι ακριβώς πόσο χαμηλό επίπεδο είναι η συνέλευση; Είναι σχεδόν ταυτόσημη με αντικειμενικό κώδικα. Η μετάβαση από τη συναρμολόγηση σε κώδικα αντικειμένου είναι κάτι πολύ περισσότερο από ένα μετάφραση από μια μεταμόρφωση, η οποία είναι ο λόγος κανείς δεν θα μπορούσε να εξετάσει το συναρμολόγησης να κάνει οποιαδήποτε πραγματική compiling. Στην πραγματικότητα, είναι αρκετά εύκολο να μεταφράσει από το χέρι συναρμολόγηση σε κώδικα μηχανής. Κοιτάζοντας το συγκρότημα για μια κύρια λειτουργία, ότι η πρώτη γραμμή συμβαίνει να αντιστοιχούν σε δεκαεξαδικό 0x55. Στο δυαδικό, αυτό είναι 1010101. Η δεύτερη γραμμή συμβαίνει να αντιστοιχούν δεκαεξαδικό 0x895. Και το επόμενο, 0x56. Λαμβάνοντας υπόψη ένα σχετικά απλό τραπέζι, θα μπορούσε να μεταφράσει συναρμολόγηση στον κώδικα ότι οι μηχανές μπορούν να καταλάβουν πάρα πολύ. Έτσι, υπάρχει ένα υπόλοιπο βήμα συλλογή, η οποία συνδέει. Η σύνδεση συνδυάζει μια δέσμη των αρχείων αντικειμένου σε ένα μεγάλο αρχείο ότι μπορείτε πραγματικά να εκτελέσει. Η σύνδεση είναι πολύ εξαρτάται από το σύστημα. Έτσι, ο ευκολότερος τρόπος για να πάρετε Clang να συνδέσει μόνο αντικείμενο αρχεία μαζί είναι να καλέσετε Clang για όλα τα αρχεία που θέλετε να συνδέσετε μαζί. Εάν καθορίσετε. O αρχεία, τότε δεν θα χρειαστεί να επανεπεξεργασία, καταρτίζουν και συγκεντρώνουν όλες του πηγαίου κώδικα σας. Ας ρίξει μια λειτουργία μαθηματικά στο αρχείο μας, έτσι έχουμε κάτι να συνδέσει μέσα Τώρα ας το υπολογίσουν πίσω κάτω από τον αντικειμενικό κώδικα και καλέστε Clang σε αυτό. Ωχ. Από τη στιγμή που περιλάμβανε μια λειτουργία μαθηματικά, θα πρέπει να συνδεθεί σε η βιβλιοθήκη με τα μαθηματικά-lm. Αν θέλαμε να συνδέσει μαζί μάτσο αρχεία. O ότι εμείς έγραψε τη δική μας, εμείς θα προσδιορίζει ακριβώς όλα αυτά σε ο γραμμή εντολών. Ο περιορισμός είναι ότι μόνο ένα από αυτά τα αρχεία πρέπει να πραγματικά καθορίσετε μια κύρια λειτουργία, ή αλλιώς η εκτελέσιμο που προκύπτει δεν θα ξέρουν από πού να αρχίσω εκτέλεση κώδικα σας. Ποια είναι η διαφορά μεταξύ καθορίζοντας ένα αρχείο για να συνδεθείτε σε με-l και μόνο προσδιορίζοντας ένα αρχείο απ 'ευθείας; Τίποτα. Είναι ακριβώς αυτό που συμβαίνει Clang να γνωρίζουμε ακριβώς τι αρχείο κάτι σαν-lm συμβαίνει να αναφερθώ. Αν ήξερα τον εαυτό σας ότι το αρχείο, μπορείτε να καθορίσετε το ρητά. Απλώς να θυμάστε ότι όλοι-l σημαίες πρέπει να έρθει στο τέλος της ζήτησης του πελάτη σας. Και αυτό είναι όλα υπάρχει σε αυτό. Όταν εκτελείτε μόνο Clang σε ορισμένα αρχεία, αυτό είναι ό, τι είναι πραγματικά κάνει. Το όνομά μου είναι Rob Bowden, και αυτό είναι CS50.