«Σε ποια γλώσσα είναι γραμμένη η ίδια η C;»
Από μια άλλη οπτική γωνία, είναι: πριν εκτελεστεί η γλώσσα C, πρέπει να μεταγλωττιστεί, οπότε από πού προέρχεται ο μεταγλωττιστής της γλώσσας C; Σε ποια γλώσσα είναι γραμμένο; Αν είναι γραμμένο στο ίδιο το C, υπάρχει πρώτα αυγό ή κοτόπουλο;
1
Ας υποθέσουμε ότι δεν υπάρχουν μεταγλωττιστές στον κόσμο, ας ξεκινήσουμε με τη γλώσσα μηχανής και ας δούμε πώς.
Η γλώσσα μηχανής μπορεί να εκτελεστεί απευθείας από την CPU χωρίς την ανάγκη μεταγλωττιστή.
Στη συνέχεια, υπάρχει η συμβολική γλώσσα, αν και η συμβολική γλώσσα είναι μόνο ένα μνημονικό για τη γλώσσα μηχανής, αλλά πρέπει επίσης να μεταγλωττιστεί σε γλώσσα μηχανής για να εκτελεστεί, επομένως δεν υπάρχει άλλη επιλογή από το να χρησιμοποιήσετε τη γλώσσα μηχανής για να γράψετε αυτόν τον πρώτο μεταγλωττιστή (δεν θα χρησιμοποιηθεί στο μέλλον).
Το πρόβλημα της συμβολικής γλώσσας λύθηκε και είναι ένα μεγάλο βήμα προς τα εμπρός, αυτή τη στιγμή είναι δυνατή η χρήση συμβολικής γλώσσας για τη σύνταξη του μεταγλωττιστή της γλώσσας C, που λέμε ότι είναι ο πρόγονος του μεταγλωττιστή C.
Με αυτόν τον πρόγονο, μπορείτε να μεταγλωττίσετε οποιοδήποτε πρόγραμμα γλώσσας C, οπότε μπορείτε να γράψετε έναν μεταγλωττιστή στην ίδια τη γλώσσα C; Απλώς συντάξτε το με τους προγόνους.
Εντάξει, μετά από ένα τέτοιο επίπεδο, τελικά πήρα έναν μεταγλωττιστή γραμμένο σε C, κάτι που είναι πραγματικά ενοχλητικό.
Σε αυτό το σημείο, ο μεταγλωττιστής C που γράφτηκε από το προηγούμενο πακέτο μπορεί να εγκαταλειφθεί.
Φυσικά, αν υπήρχαν άλλες γλώσσες υψηλού επιπέδου πριν από τη C, όπως η Pascal, τότε η Pascal θα μπορούσε να χρησιμοποιηθεί για τη συγγραφή ενός μεταγλωττιστή C.
Ο μεταγλωττιστής του πρώτου Pascal λέγεται ότι γράφτηκε στο Fortran. Ως η πρώτη γλώσσα υψηλού επιπέδου, ο μεταγλωττιστής του Fortran θα πρέπει να είναι γραμμένος σε συμβολική γλώσσα.
2
Εδώ είναι ένας ενδιαφέρον μύθος για τον μεταγλωττιστή:
Ο θρύλος λέει ότι ο Ken Thompson, ένας από τους εφευρέτες του Unix, έπαιζε σε οποιοδήποτε μηχάνημα Unix στα Bell Labs, εισήγαγε το όνομα χρήστη και τον κωδικό πρόσβασής του και μπορούσε να συνδεθεί με τον ριζικό τρόπο!
Τα Bell Labs είναι γεμάτα ταλέντο και κάποιοι άλλοι μεγάλοι ταύροι ορκίστηκαν να βρουν αυτήν την ευπάθεια, διάβασαν τον πηγαίο κώδικα C του Unix και τελικά βρήκαν την κερκόπορτα σύνδεσης και αφού καθάρισαν την κερκόπορτα, μεταγλώττισαν το Unix και το έτρεξαν, αλλά ο Thompson ήταν ακόμα σε θέση να συνδεθεί.
Μερικοί άνθρωποι πιστεύουν ότι μπορεί να υπάρχει πρόβλημα με τον μεταγλωττιστή και εμφυτεύτηκε μια κερκόπορτα κατά τη μεταγλώττιση του Unix, έτσι ξαναέγραψαν έναν μεταγλωττιστή σε C και μεταγλώττισαν ξανά το Unix με έναν νέο μεταγλωττιστή.
Αλλά και πάλι δεν λειτουργεί, ο Thompson μπορεί ακόμα να συνδεθεί με root, κάτι που είναι πραγματικά καταστροφικό!
Αργότερα, ο ίδιος ο Thompson ξεκλείδωσε το μυστικό, ήταν ο πρώτος μεταγλωττιστής C που είχε πρόβλημα, αυτός ο μεταγλωττιστής φυσικά θα εμφυτευτεί στην κερκόπορτα κατά τη μεταγλώττιση του πηγαίου κώδικα του Unix, αυτό δεν είναι αρκετό, τι είναι ακόμα καλύτερο, αν γράψετε έναν νέο μεταγλωττιστή σε γλώσσα C, σίγουρα πρέπει να τον μεταγλωττίσετε σε δυαδικό κώδικα, τι να μεταγλωττίσετε, χρησιμοποιήστε μόνο τον πρώτο μεταγλωττιστή που έγραψε ο Thompson για μεταγλώττιση, εντάξει, ο μεταγλωττιστής που γράψατε θα μολυνθεί, ο μεταγλωττιστής σας θα μεταγλωττίσει ξανά το Unix, Θα εμφυτεύσει επίσης μια κερκόπορτα :-)
Εδώ που τα λέμε, θυμάμαι το περιστατικό XcodeGhost πριν από μερικά χρόνια, που σημαίνει απλώς ότι ένας δούρειος ίππος εμφυτεύτηκε στο Xcode (λήφθηκε από ανεπίσημα κανάλια), έτσι ώστε οι εφαρμογές ios που μεταγλωττίστηκαν από το XCode να μολυνθούν και αυτές οι εφαρμογές θα μπορούσαν να χρησιμοποιηθούν από χάκερ για να κάνουν παράνομα πράγματα.
Αν και αυτό το XCodeGhost απέχει πολύ από αυτό της Thompson, μας υπενθυμίζει ότι κατά τη λήψη λογισμικού, θα πρέπει να χρησιμοποιείτε επίσημα κανάλια, να κάνετε λήψη από τον επίσημο ιστότοπο, να αναζητάτε το πρότυπο HTTPS του ιστότοπου και ακόμη και να επαληθεύετε το άθροισμα ελέγχου.
3
Μερικοί άνθρωποι μπορεί να ρωτήσουν: Χρησιμοποιώ το Hui για να γράψω μια παράγραφο Hello World, αλλά κάποιος μπορεί να το χρησιμοποιήσει για να γράψει έναν σύνθετο μεταγλωττιστή; Είναι αυτό δυνατόν?
Φυσικά, όταν αναπτύχθηκε η πρώτη γενιά του Unix, δεν υπήρχε γλώσσα C και ο Ken Thompson και ο Dennis Ritchie πληκτρολόγησαν το Unix με γραμμές συναρμολόγησης. Η πρώτη έκδοση του WPS γράφτηκε από τον Qiu Bojun στο Hui, και ο μεταγλωττιστής του Turbo Pascal γράφτηκε επίσης από τον Anders στο Hui, και οι ικανότητες των θεών δεν μπορούν να φανταστούν οι απλοί άνθρωποι.
Για τους μεταγλωττιστές, είναι επίσης δυνατό να αναπτυχθούν με τρόπο "χιονοστιβάδας":
Λαμβάνοντας ακόμα ως παράδειγμα τη γλώσσα C, η πρώτη έκδοση μπορεί να επιλέξει ένα υποσύνολο της γλώσσας C, όπως η υποστήριξη μόνο βασικών τύπων δεδομένων, δηλώσεων ελέγχου διεργασιών και κλήσεων συναρτήσεων...... Αυτό το υποσύνολο το ονομάζουμε C0.
Στη συνέχεια, γράψτε έναν μεταγλωττιστή σε συμβολική γλώσσα και λάβετε μόνο ένα υποσύνολο αυτής της γλώσσας C0, έτσι ώστε να είναι πολύ πιο εύκολο να γραφτεί.
Η γλώσσα C0 λειτουργεί και στη συνέχεια επεκτείνουμε αυτό το υποσύνολο προσθέτοντας δομές, δείκτες, ...... και καλώντας τη νέα γλώσσα C1.
Ποιος γράφει τον μεταγλωττιστή για τη γλώσσα C1; Φυσικά, είναι C0.
Όταν το C1 λειτουργεί, αναπτύξτε ξανά τα χαρακτηριστικά της γλώσσας, γράψτε τον μεταγλωττιστή με C1 και λάβετε C2.
Στη συνέχεια, υπάρχει το C3, το C4...... Τέλος, έχετε την πλήρη γλώσσα C.
Αυτή η διαδικασία ονομάζεται bootstrapping και στα κινέζικα ονομάζεται bootstrapping.
|