[ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ] ΟΜΙΛΗΤΗΣ 1: Εντάξει, αυτό είναι CS50, και αυτή είναι η αρχή της εβδομάδας τέσσερα, και όπως μπορεί να έχετε ακούσει ή διαβάσετε, ο κόσμος έχει τέλος. Πηγαίνοντας σε όλο το διαδίκτυο έχει γίνει η γνώση και η ευαισθητοποίηση από ένα σφάλμα σε ένα πρόγραμμα, ένα γλώσσα προγραμματισμού που ονομάζεται Bash. Αυτό έχει θαυμάσια επώνυμα όπως Shellshock, ή την πόρτα του Bash, αλλά και άρθρα όπως αυτά Δεν ήταν ασυνήθιστο. Και στην πραγματικότητα, πολλά από αυτά φέρουν πίσω αναμνήσεις από Heartbleed, που μπορεί να έχετε παρατηρήσει στο πατήστε ξανά αυτό το παρελθόν άνοιξη, η οποία ήταν εξίσου αρκετά δραματική. Τώρα, όσοι από εσάς εδώ Σήμερα, πόσοι από εσάς έχετε, ακόμη και αν δεν καταλαβαίνετε τι Είναι όλα σχετικά, ακούσει Shellshock; Εντάξει, και πόσοι από εσάς έχουν υπολογιστές που είναι ευάλωτα; Εντάξει, πρέπει να υπάρχει πολύ, πολύ περισσότερο τα χέρια μέχρι τώρα, για λόγους που θα δούμε. Ας ρίξουμε μια ματιά στο τι είναι συνεχίζεται στα μέσα μαζικής ενημέρωσης και στη συνέχεια να το εξηγήσω λίγο εδώ για να μας τεχνική. ΟΜΙΛΗΤΗΣ 2: Ασφάλεια εμπειρογνώμονες έχουν προειδοποίησε ότι ένα σοβαρό ελάττωμα θα μπορούσε να να είναι έτοιμος να επηρεάσει εκατοντάδες τα εκατομμύρια των χρηστών του κόσμου web. Λοιπόν, τι ακριβώς είναι το σφάλμα που είναι ήδη βαπτιστεί Shellshock, και τι κάνει; Λοιπόν, Shellshock είναι επίσης γνωστή ως η Bash bug, το λογισμικό που εκμεταλλεύεται. Hackers χρησιμοποιούν τον ιό για να σαρώσετε ευάλωτες τα συστήματα που τρέχουν Linux και Unix λειτουργικά συστήματα και στη συνέχεια να τους μολύνουν. Bash είναι ένα κέλυφος γραμμής εντολών. Αυτό επιτρέπει στους χρήστες ζήτημα εντολές για να ξεκινήσει προγράμματα και δυνατότητες στο πλαίσιο του λογισμικού πληκτρολογώντας το κείμενο. Είναι συνήθως χρησιμοποιούνται από τους προγραμματιστές, και δεν θα πρέπει να είναι ανοικτά στον ευρύτερο κόσμο, αν Shellshock αλλάζει αυτό. Λοιπόν, worringly, ορισμένοι αναλυτές προειδοποιούν ότι θα μπορούσε να είναι μεγαλύτερη απειλή, επειδή Shellshock επιτρέπει την πλήρη έλεγχο μιας μολυσμένο μηχάνημα, ενώ Heartbleed επιτρέπεται μόνο hackers για να κατασκοπεύει τους υπολογιστές. Είναι τόσο σοβαρό, είναι αξιολογήθηκε ένα 10 από 10 για τη σοβαρότητα με την Εθνική Βάση δεδομένων ευπάθειας. 2.3 από όλους τους διακομιστές web είναι σε κινδύνου, συμπεριλαμβανομένων και ορισμένων υπολογιστές Mac. Λοιπόν, βεβαιωθείτε ότι έχετε επιδιορθώσει τα συστήματα σας τώρα. Όποιος φιλοξενία ενός δικτυακού τόπου λειτουργίας οι επηρέασε τα λειτουργικά συστήματα πρέπει να αναλάβει δράση το συντομότερο δυνατό. Όποιος μπορεί να αντέξει οικονομικά να πρέπει να εξετάσουμε για την εφαρμογή της παρακολούθησης και τους web firewalls για να κοιτάξει έξω για τυχόν επιθέσεις. ΟΜΙΛΗΤΗΣ 3: Το χειρότερο πράγμα ότι θα μπορούσε να συμβεί είναι ότι κάποιος θα γράψει κώδικα, ότι θα πάει αυτόματα και σάρωση το διαδίκτυο και θα επηρεάσουν όλα από αυτούς τους υπολογιστές. Και όταν το κάνουν αυτό, αλλά, το χειρότερο πράγμα που θα μπορούσε να κάνει είναι απλά διαγράψτε τα πάντα, ή να κλείσει τους χώρους προς τα κάτω. Έτσι, θα μπορούσαμε να δούμε βλάβη από αυτή την άποψη, όπου θα έχουμε κακόβουλα άτομα που μόλις αποφασίσει να προκαλέσει τον όλεθρο φέρνοντας τα συστήματα κάτω ή διαγραφή αρχεία, και τέτοια πράγματα. ΟΜΙΛΗΤΗΣ 2: Μερικοί λένε ότι αυτό είναι ένα του πιο δύσκολο να μετρηθούν σφάλματα σε έτη, και μπορεί να χρειαστούν εβδομάδες ή ακόμη και μήνες για να καθορίσει την τελική επίπτωση της. ΟΜΙΛΗΤΗΣ 1: Οπότε όλα αυτά είναι αλήθεια, αλλά το αστείο πράγμα είναι, σχεδόν όλα από τις εικόνες που μόλις είδατε, εκτός ίσως από το πληκτρολόγιο, δεν έχει τίποτα να κάνει με η απολύτως bug. Servers και σύρματα και ούτω καθεξής, αυτό είναι το είδος της εφαπτομενικά που σχετίζονται, αλλά στο επίκεντρο είναι στην πραγματικότητα αρκετά εξοικειωμένοι τι συμβαίνει εδώ. Στην πραγματικότητα, επιτρέψτε μου να πάω σε συσκευή CS50 μας. Επιτρέψτε μου να πάει μπροστά και να μεγιστοποιήσουν το τερματικό παράθυρο εδώ. Και έχετε παιδιά έχουν αυτή τη χρήση, ή το ενσωματωμένο έκδοση αυτών, στο gedit για να γράψει προγράμματα, πληκτρολογήσετε εντολές, και ούτω καθεξής, και αυτό είναι στην πραγματικότητα, και έχει ήταν για εβδομάδες, Bash, Β-Α-Σ-Η. Αυτό είναι το Bourne-again κέλυφος, η οποία είναι μόνο ένα φανταχτερό τρόπο λέγοντας, Αυτό είναι ένα πρόγραμμα που έχει αναβοσβήνει έγκαιρη, αποτελεσματική, που κάθεται εκεί, περιμένοντας για την είσοδο σας. Και αυτό είναι η εντολή διεπαφή γραμμής μέσω της οποίας έχετε παιδιά τρέξει εντολές και τελικά, την κατάρτιση και στη συνέχεια να τρέχει προγράμματα. Αλλά Bash είναι ένας προγραμματισμός γλώσσα με την ακόλουθη έννοια. Ξέρετε ότι υπάρχουν εντολές όπως cd και ls και κλαγγή και άλλοι, αλλά μπορείτε να ορίσετε τις δικές σας εντολές από την εφαρμογή τους στο Bash. Τώρα δεν πρόκειται να πάει στη μεγάλη λεπτομέρεια ως προς Bash την γλώσσα προγραμματισμού, αλλά γνωρίζουμε, για παράδειγμα, ότι αυτή τη στιγμή, δεν υπάρχει εντολή που ονομάζεται "γεια". Έτσι ώστε να μπορεί να βρεθεί σε ένα από αυτά τα πακέτα. Δεν είναι εγκατεστημένο στον υπολογιστή μου. Ζητήστε από το διαχειριστή σας. Αλλά αν θέλω να υπάρχει ένα πρόγραμμα που ονομάζεται "γεια" στο Bash ή στην προτροπή μου, Μπορώ να χρησιμοποιήσω πραγματικά σύνταξη που είναι αρκετά όπως C. Δεν είναι ακριβώς το ίδιο, αλλά φαίνεται αρκετά παρόμοια με ένα λειτουργία, αν και λείπουν κάποιες λεπτομέρειες. Τίποτα δεν φαίνεται να συμβαίνει, αλλά τώρα αν πληκτρολογήσετε "γεια" μπορείτε πραγματικά να γράψετε ένα πρόγραμμα, όχι σε C, δεν σε Java, όχι σε άλλο προγραμματισμό γλώσσα, αλλά στην ίδια Bash. Τώρα, το κλειδί εδώ είναι ότι έγραψα το όνομα Ήθελα να δώσω αυτή τη νέα εντολή, και οι παρενθέσεις είναι επίσης συμβολικό αυτό είναι μια λειτουργία. Παρεμπιπτόντως, μπορείτε επίσης να κάνετε τη διασκέδαση πράγματα, και στην πραγματικότητα, ακόμη και σε Mac OS, Αυτό είναι ένα πρόγραμμα που ονομάζεται Terminal. Έρχεται χτισμένο σε κανέναν υπολογιστή που έχει ένα Mac σε αυτό το δωμάτιο, και μπορείτε να κάνετε κάτι παρόμοιο και σε Mac OS, αλλά μπορείτε να πάτε πιο πέρα ​​από αυτό. Και αυτό είναι ένα μικρό εφαπτόμενο, αλλά αυτό είναι το είδος της διασκέδασης. Θυμήθηκα σήμερα το πρωί, όταν σκεφτόμαστε αυτό μέσα, από ένα μικρό παιχνίδι που χρησιμοποιείται για να παίξει με έναν από τους πρώην TFs CS50 του σύμφωνα με την οποία κάθε φορά που θα περπατήσετε μακριά από πληκτρολόγιο του με την οθόνη του ξεκλείδωτη, Θα ήθελα να εκτελέσει μια εντολή όπως αυτό-- "να πω ένα γεια." Και τώρα κάθε φορά που ήρθε πίσω για να του πληκτρολόγιο μετά καθάρισα την οθόνη και αυτός θα καθίσει, προσπαθήστε να κάνετε κάποια εργασία, δείτε τα περιεχόμενα του directory-- του [AUDIO PLAYBACK] -Γεια. Γεια σας. ΟΜΙΛΗΤΗΣ 1: Λοιπόν, για να είμαστε δίκαιοι, δεν ήταν στην πραγματικότητα "γεια". Ήταν συνήθως κάτι μοιάζει περισσότερο με αυτό-- [AUDIO PLAYBACK] -Beep. ΟΜΙΛΗΤΗΣ 1: --that I would-- ώστε ο υπολογιστής του θα ορκίζονται σε αυτόν κάθε φορά που στην πραγματικότητα κάθισε στο πληκτρολόγιο του. Και πολύ γρήγορα κατάλαβε μην αφήνετε την οθόνη του ξεκλείδωτη. Αλλά αυτό υποδηλώνει το είδος ηλίθια διασκέδαση που εσείς μπορεί να έχει με κάτι σαν Bash. Αλλά είναι λίγο πιο σοβαρά, να είστε σίγουροι, από αυτό. Και στην πραγματικότητα, αυτό είναι ένα από τα πιο επικίνδυνη και μακράς διαρκείας σφάλματα ότι πραγματικά έχει χτυπήσει τον κόσμο σε παγκόσμιο επίπεδο. Αυτό το σφάλμα έχει περίπου για περίπου 20 χρόνια, και θα πρέπει να επιτευχθεί μέσα σε μόλις ένα στιγμή από τη σχετική απλότητά της. Έτσι, αυτό είναι ένα αντιπροσωπευτικό εντολή ότι αν αγοράσω ένα Mac, κυριολεκτικά τώρα όταν έχετε καπάκι σας ανοικτά, μπορείτε να δοκιμάσετε την πληκτρολόγηση σε ότι πρόγραμμα που ονομάζεται Terminal. Terminal είναι κάτω Εφαρμογές Utilities-- για μια φορά, οι χρήστες των Windows δεν χρειάζεται να ανησυχούν για το συγκεκριμένο threat-- αλλά όσοι από εσάς με Mac να πληκτρολογήσετε αυτό σε ένα παράθυρο, όπως θα το κάνω εδώ, και αν έχετε πληκτρολογήσει ότι σε αυτό το πρόγραμμα ονομάζεται Terminal, όπως θα κάνω τώρα, αν δείτε τη λέξη «ευάλωτα», ο υπολογιστής σας είναι ευάλωτοι στην εκμετάλλευση. Τώρα τι σημαίνει αυτό στην πραγματικότητα; Και αυτό είναι ομολογουμένως μερικά πολύ τρελό σύνταξη, αλλά ας τουλάχιστον σύρει έξω μερικές από τις πιο ενδιαφέρουσες πτυχές. Έτσι, υπάρχει κάποια σύνταξη που φαίνεται λίγο γνωστό, τουλάχιστον από C και τον προγραμματισμό γενικότερα. Βλέπω κάποιες παρενθέσεις, ερωτηματικά, αγκύλες, και τέτοια, αλλά αποδεικνύεται ότι αυτό ηλίθιο πράγμα εδώ με κίτρινο χρώμα είναι ουσιαστικά μία συνάρτηση ότι δεν κάνει τίποτα. Τα μέσα του παχέος εντέρου δεν κάνουν τίποτα, και η ερωτηματικό σημαίνει σταματήσουμε να κάνουμε τίποτα. Ώστε μέσα από αυτά άγκιστρα, το γεγονός ότι έχω μια ίση υπογράψουν προς τα αριστερά, αυτό είναι ουσιαστικά δημιουργώντας μια εντολή ή μια μεταβλητή, που ονομάζεται x, και αναθέτοντας την ότι κίτρινο κομμάτι του κώδικα εκεί. Αυτό θα μπορούσε να είναι κάτι σαν "ηχώ γεια "ή" λένε μπιπ "ή κάτι παρόμοια με εκείνη. Αλλά αν παρατηρήσετε τα μάτια σας περιπλανηθείτε περαιτέρω προς τα δεξιά, υπάρχει κάτι περισσότερο σε αυτή τη γραμμή από το μόνο το τέλος της εν λόγω ερωτηματικό. "Echo ευάλωτες," και, στη συνέχεια, πέρα από αυτό υπάρχει ακόμα περισσότερα. Ένα άλλο ερωτηματικό, bash -c :. Έτσι τα πολυλογώ, αυτή η γραμμή του κώδικα είναι επαρκή για επιτακτικούς ένας υπολογιστής που είναι ευάλωτα σε κάνει κάτι που θέλετε να κάνετε, γιατί υπάρχει ένα bug στο Bash οποία παρόλο Bash έπρεπε να σταματήσει διαβάζοντας τις γραμμές του δικαιώματος εντολών εκεί μετά το κίτρινο κείμενο, για ένα 20-plus ετών bug, Bash έχει πράγματι την ανάγνωση πέρα από αυτό τελεία και αρκετά πολύ κάνει ό, τι λέγεται. Έτσι ποια είναι η επίπτωση του ότι τελικά; Απλά είπε "echo hello" ή "echo ευάλωτες," αλλά τι γίνεται αν έκανε κάτι πραγματικά κακόβουλα, όπως rm -rf *, το οποίο δεν θα μπορούσε έχετε πληκτρολογήσει ποτέ πριν, και ειλικρινά ίσως δεν θα πρέπει να πάρα πολύ σύντομα, επειδή μπορείτε να κάνετε μια πολλές ζημιές με αυτό. Γιατί; rm κάνει αυτό, φυσικά; Αφαιρεί. * Σημαίνει αυτό; Όλα. Έτσι είναι το λεγόμενο wild card, οπότε αυτό σημαίνει διαγράψει τα πάντα σε ο τρέχων κατάλογος. -r συμβαίνει να σημαίνει αναδρομική, το οποίο σημαίνει ότι αν αυτό που είστε διαγραφή είναι ένας κατάλογος, και μέσα από εκεί είναι άλλα αρχεία και άλλους καταλόγους, αναδρομικά βουτήξει εκεί και να διαγράψετε όλα αυτά. Και-f είναι το χειρότερο από όλα αυτά. Όποιος γνωρίζει τι σημαίνει -f εδώ; Force. Έτσι αναγκάζουν μέσα, ακόμη και αν αυτό είναι μια κακή ιδέα, το κάνει χωρίς να ζητά μου για την περαιτέρω επιβεβαίωση. Έτσι, ξέρετε, εμείς γελάμε με αυτό, αλλά ειλικρινά, εγώ κατά πάσα πιθανότητα πληκτρολογήστε αυτό πολλές φορές μια ημέρα, διότι η πραγματικότητα είναι ο πιο γρήγορος τρόπος για να διαγράψετε ένα σωρό πράγματα. Αλλά ακόμα και έχω κάνει κάποια ζημιά. Αλλά αν ήταν να ξεγελάσουν έναν υπολογιστή σε ορισμό κάποια ηλίθια μεταβλητή ή λειτουργία που ονομάζεται x, αλλά στη συνέχεια ξεγελώντας τον υπολογιστή σε εκτέλεση πέρα από τα όρια που λειτουργία, πέρα ​​από αυτό το ερωτηματικό, θα μπορούσε πράγματι να ξεγελάσουν έναν υπολογιστή σε εκτέλεση κάτι σαν rm -rf ή η εντολή Email ή η εντολή Αντιγραφή. Οτιδήποτε κυριολεκτικά μπορείτε να κάνετε με το υπολογιστή, είτε πρόκειται για τη διαγραφή αρχείων, δημιουργία αρχείων, spamming κάποιος, επιτίθεται κάποιο εξυπηρετητή εξ αποστάσεως, αν μπορείτε να το εκφράσουν με μια εντολή, μπορεί να ξεγελάσει έναν υπολογιστή σε αυτό. Τώρα αυτό είναι ένα παράδειγμα της πώς μπορείτε να το κάνετε αυτό; Λοιπόν, υπάρχουν πολλοί υπολογιστές για το Bash διαδίκτυο λειτουργία. Όλοι οι χρήστες μας Mac είναι μεταξύ τους. Πολλοί servers Linux είναι μεταξύ αυτά, καθώς και Unix servers. Παράθυρα παίρνει και πάλι σχετικά από το γάντζο εκτός και αν έχετε εγκαταστήσει ειδικό λογισμικό. Τώρα πολλοί servers, για παράδειγμα, για λειτουργία εξυπηρετητών Ιστού, και στην πραγματικότητα, το Linux είναι ίσως το πιο δημοφιλές λειτουργικό σύστημα να τρέχει σε υπολογιστές, στο διαδίκτυο που εξυπηρετούν ιστοσελίδων. Τώρα, όπως θα δούμε αργότερα στο εξάμηνο, όταν μπορείτε να στείλετε ένα αίτημα από browser-- σας Chrome, Internet Explorer, whatever-- σε έναν απομακρυσμένο server, αποδεικνύεται ότι, ακόμη και αν που μόλις πληκτρολογήσατε www.example.com, Ο φυλλομετρητής σας στέλνει ένα μήνυμα Αυτό είναι λίγο πιο απόκρυφες, όπως αυτό. Αλλά παρατηρήσετε κάτι περίεργο. Οι δύο πρώτες γραμμές Δεν έχω δει ποτέ πριν, αλλά δεν φαίνονται ιδιαίτερα απειλητική. Αλλά παρατηρήστε τι έχω κλαπεί για την τρίτη γραμμή εδώ. Εάν ένας κακός ήταν να στείλει ένα μήνυμα όπως αυτό από τον υπολογιστή του ή της σε μια ευάλωτη Mac ή ένα ευάλωτες εξυπηρετητή Linux, το αστείο είναι ότι το Bash, ότι η απλή γραμμή λίγο εντολή, είναι πανταχού παρούσα και είναι συχνά χρησιμοποιούνται για να εκτελέσει ουσιαστικά Τα περιεχόμενα ενός μήνυμα που λαμβάνει. Και με αυτή τη λογική, μπορείτε να εξαπατήσει έναν web server, ως εκ τούτου, αποστέλλοντας κάτι σαν User-Agent, το οποίο συνήθως υποτίθεται για να πει το το όνομα του browser σας. User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, αυτό είναι απλά το πρόγραμμα περιήγησης σας τρόπος για τον προσδιορισμό ίδιας. Αλλά αν ένας κακός πολύ έξυπνα λέει, mm-mm, είμαι Δεν πρόκειται να σας πω τι browser μου είναι, Είμαι αντίθετα πρόκειται να σας στείλουμε αυτό αινιγματικός-πράγμα που ψάχνει με ένα -rf rm * Σε αυτό, μπορείτε κυριολεκτικά να ξεγελάσουν ένα ευάλωτες web server στο διαδίκτυο σε εκτέλεση ακριβώς αυτό το υπάρχει για τη διαγραφή όλων των αρχείων. Και ειλικρινά, ότι δεν είναι ακόμα και το χειρότερο από αυτό. Μπορείτε να κάνετε τίποτα. Μπορείτε να ξεκινήσετε ένα κατανεμημένο άρνηση της επίθεσης υπηρεσιών αν σας έστειλε αυτό το μήνυμα ολόκληρη τσαμπιά των διακομιστών web και στη συνέχεια είχε τους όλα κατέβει, για παράδειγμα, για Harvard.edu servers, και μπορείτε να ταξινομήσετε κτύπημα το καλό από αυτούς από την κυκλοφορία του δικτύου που ήταν διαφορετικά ενεργοποιείται από αυτή κακός. Έτσι, τα πολυλογώ, σχεδόν ο καθένας σε αυτό το δωμάτιο που κατέχει έναν υπολογιστή Mac είναι ευάλωτες σε αυτό. Η ασημένια επένδυση είναι ότι αν δεν είσαι τρέχει ένα web server για το laptop σας, και αν δεν έχετε στην πραγματικότητα διαμορφωμένη να επιτρέψει κάτι σαν SSH σε αυτό, είστε πραγματικά ασφαλείς. Είναι ευάλωτοι, αλλά υπάρχει η που προσπαθεί να μπει στο φορητό υπολογιστή σας, ώστε να μπορείτε να το είδος του ήσυχοι. Ωστόσο, η Apple σύντομα θα είναι ενημέρωση κώδικα για αυτό. Ο κόσμος του Linux έχει ήδη κυκλοφορήσει μια σειρά από διορθώσεις για το Fedora και Ubuntu και άλλες εκδόσεις του Linux, και μάλιστα αν εκτελέσετε ενημέρωση 50 στη συσκευή, ακόμη και ότι, επίσης, θα είναι ενημερώνονται και διορθώνονται. Αλλά αυτό δεν έχει πολύ πραγματικά ευάλωτη, γιατί αν έχετε επιδιορθώνεται με τη συσκευή και έκανε το laptop σας δημόσια πρόσβαση στο διαδίκτυο, το οποίο δεν είναι από προεπιλογή, έχετε στην πραγματικότητα ήταν μια χαρά, επειδή του firewalling και άλλες τεχνικές. Αλλά αυτό είναι ένα ακραίο παράδειγμα ενός bug ότι έχουμε ζήσει για κυριολεκτικά για 20 χρόνια, και ποιος ξέρει αν κάποιος όλο αυτό το διάστημα έχει γνωστή γι 'αυτό; Και στην πραγματικότητα, αυτό είναι ένα από τα οι θεμελιώδεις προκλήσεις ότι θα δούμε αργότερα στο εξάμηνο σχετικά με την ασφάλεια, είναι ότι ακριβώς όπως και στον πραγματικό κόσμο, οι καλοί είναι σε μειονεκτική θέση. Για να διατηρήσετε τους κακούς έξω, θα πρέπει να βεβαιωθείτε ότι όλες οι πόρτες είναι κλειδωμένες, ότι κάθε παράθυρο είναι ασφαλές, ότι κάθε σημείο εισόδου σε ένα σπίτι Είναι ασφαλές να κρατήσει τους κακούς έξω. Αλλά αυτό που κάνει το κακό πρέπει να κάνει να συμβιβαστεί πραγματικά το σπίτι σας και κλέβουν από σας; Αυτός ή αυτή έχει μόνο να βρει ένα ξεκλείδωτο πόρτα, ένα σπασμένο παράθυρο, ή κάτι κατά μήκος αυτών των γραμμών, και αυτό είναι το ίδιο πράγμα στην ασφάλεια των υπολογιστών. Μπορούμε να γράψουμε εκατομμύρια γραμμές κώδικα προγραμματισμού και ξοδεύουν εκατοντάδες ή χιλιάδες από ώρες προσπαθώντας να πάρει το σωστό, αλλά αν κάνετε μόνο μία λάθος στην ορθότητα, μπορείτε να βάλετε ολόκληρο το σύστημα και Πράγματι, στην περίπτωση αυτή, ολόκληρο το διαδίκτυο και τον κόσμο σε κίνδυνο. Έτσι, αν θέλετε να μάθετε περισσότερα γι 'αυτό, πηγαίνετε σε αυτό το URL εδώ. Δεν υπάρχει καμία ανάγκη για δράση απόψε, εκτός αν είστε μεταξύ αυτών πιο άνετα ότι έχουν τρέξει τη δική σας ιστοσελίδα διακομιστή, στην οποία περίπτωση θα πρέπει, στην πραγματικότητα, να ενημερώσετε το λογισμικό σας. Και αυτό είναι πάρα πολύ ο τίτλος του μια ομιλία, και τώρα ένα χαρτί, ότι έχουμε συνδέονται σχετικά με την ιστοσελίδα μάθημα για σήμερα. Ήταν από τους συναδέλφους που ονομάζεται Ken Thompson, ο οποίος δεχόταν ένα πολύ διάσημο βραβείο στην επιστήμη των υπολογιστών, και έδωσε αυτή την ομιλία μερικά χρόνια πριν, ουσιαστικά για το ίδιο θέμα. Ζητώντας από τους λαούς το ερώτημα, θα πρέπει να έχετε πραγματικά εμπιστοσύνη, τελικά, η λογισμικό σας έχει δοθεί; Για παράδειγμα, όλοι έχουμε γράψει προγράμματα, και έχουμε την κατάρτιση τους με Clang. Και με τη γνώση σας, έχετε γράψει όλα τα προγράμματα για την CS50, όπου υπάρχει μια πίσω πόρτα του είδους, υπάρχει ένας τρόπος ότι ένα κακό, αν τρέχει το πρόγραμμα σας, θα μπορούσε να πάρει τον έλεγχο του υπολογιστή σας; Μάλλον δεν είναι, σωστά; Mario, και άπληστοι, και Credit. Όλα αυτά είναι πολύ μικρά προγράμματα. Θα έπρεπε να είναι αρκετά κακό, αν πραγματικά έκανε ολόκληρο τον υπολογιστή σας ευάλωτο μετά τη σύνταξη 10 ή 20 γραμμές κώδικα, ή τουλάχιστον αγνοεί κάποια των επιπτώσεων της ασφάλειας. Τώρα μπορώ να πω ότι περιπαικτικά, αλλά θα πάμε να δούμε σήμερα και αυτή την εβδομάδα είναι στην πραγματικότητα πραγματικά, πραγματικά εύκολη να είναι κακό και να κάνει ακόμα σύντομο προγράμματα ευάλωτες. Αλλά για τώρα, τουλάχιστον, συνειδητοποιούν ότι το ερώτημα που τίθεται εδώ είναι περίπου Clang σε ένα compiler. Γιατί έχουμε ήδη εμπιστευθεί Clang για τις τελευταίες δύο ή τρεις εβδομάδες; Ποιος μπορεί να πει ότι όποιος έγραψε Clang δεν έχει "αν" κατάσταση εκεί που εγχέεται ουσιαστικά κάποια μηδενικά και αυτοί σε κάθε πρόγραμμα που καταρτίζει ότι θα αφήσει τον ή την πρόσβαση της όταν ο υπολογιστής σας είστε κοιμισμένοι και το καπάκι του φορητού υπολογιστή σας είναι ανοικτό και ο υπολογιστής σας τρέχει; Σωστά; Έχουμε αυτό το είδος του δικαιώματος τιμή του συστήματος τώρα που έχουμε την πεποίθηση ότι Clang είναι legit. Έχετε εμπιστοσύνη ότι η συσκευή είναι legit. Έχετε εμπιστοσύνη ότι κυριολεκτικά κάθε πρόγραμμα στο Mac ή στο PC σας είναι αξιόπιστο. Και όπως υποδηλώνει αυτό το απλό σφάλμα, ακόμη και αν δεν είναι κακόβουλο, ότι δεν είναι απολύτως πιθανό να είναι η περίπτωση. Έτσι θα πρέπει να είναι φοβισμένος ως κόλαση. Ειλικρινά, δεν υπάρχει καμία απλή λύση σε αυτό το άλλο από ένα είδος της ευαισθητοποίησης της κοινωνίας της αυξανόμενης πολυπλοκότητας ότι χτίζουμε στην κορυφή των συστημάτων πληροφορικής μας, και πώς ολοένα πιο ευάλωτη θα μπορούσε κάλλιστα να είναι. Τώρα με ότι είπε, ξεμπλοκάρισμα. Έτσι Breakout είναι πρόβλημα που τρεις, και Breakout είναι ένα παιχνίδι από χτες ότι μπορείτε να ανακαλέσετε, αλλά για μας στο πρόβλημα που τρεις, μας επιτρέπει να λάβουν τα πράγματα πίσω επάνω μια εγκοπή έτσι ώστε όταν γράφουμε προγράμματα, ακόμα και σε ένα τερματικό παράθυρο σαν αυτό, μπορούμε να τρέξουμε στην πραγματικότητα, εν τέλει, γραφικών δεν προγράμματα σε αντίθεση με εκείνους που είχαν πρόσβαση στο Scratch. Έτσι, αυτό είναι το προσωπικό του εφαρμογή του Breakout, το οποίο είναι ακριβώς αυτό το τούβλο-σπάσιμο το παιχνίδι, ώστε να μετακινήσετε το κουπί σας πίσω και πίσω, και να χτυπήσει την μπάλα κατά τα χρωματιστά τούβλα επάνω στην κορυφή. Έτσι, αυτό μας φέρνει το είδος της πίσω όπου ήμασταν σε θέση να είναι πολύ γρήγορα με το Scratch, και τώρα με C, την εφαρμογή της δικής μας γραφικών διεπαφών χρήστη. Αλλά περισσότερο από αυτό, αυτό σετ πρόβλημα αντιπροσωπεύει την πρώτη στην οποία δίνουμε έχετε μια δέσμη των κώδικα. Και στην πραγματικότητα, να φέρω ρητή προσοχή σε αυτό, γιατί ειδικά για τις λιγότερο άνετα, αυτό πρόβλημα που, τουλάχιστον εκ πρώτης όψεως, πρόκειται να αισθάνονται σαν έχουμε λάβει μια εγκοπή. Επειδή σας έχω δώσει, για μερικές από την αναζήτηση και διαλογή προβλήματα στην PSET, ένα μάτσο κώδικα που γράψαμε, και ένα ζευγάρι των παρατηρήσεων που λένε "να κάνουμε," όπου θα πρέπει να συμπληρώσετε τα κενά. Έτσι, δεν είναι πολύ τρομακτικό, αλλά Είναι η πρώτη φορά είμαστε παράδοση σας κωδικό που θα πρέπει να πρώτα διαβάσει, να κατανοήσει, και στη συνέχεια να προσθέσετε και να ολοκληρωθεί. Και στη συνέχεια, με το ξεμπλοκάρισμα, θα πάμε να κάνουμε το ίδιο, σας δίνει μερικές δεκάδες περισσότερες γραμμές του κώδικα που, ειλικρινά, να σας δώσει ένα μεγάλο μέρος του πλαισίου για το παιχνίδι, αλλά να σταματήσει σύντομο της εφαρμογής των τούβλων και η μπάλα και το κουπί, αλλά κάνουμε εφαρμόσει κάποια άλλα χαρακτηριστικά. Και ακόμη ότι με την πρώτη ματιά, και πάλι, ειδικά αν είναι λιγότερο άνετα, μπορεί να φαίνεται ιδιαίτερα τρομακτικό και νομίζετε ότι υπάρχουν τόσες πολλές νέες λειτουργίες θα πρέπει να τυλίξουν το μυαλό σας περίπου, και αυτό είναι αλήθεια. Αλλά να έχετε κατά νου, είναι αρκετά όπως το Scratch. Οι πιθανότητες είναι εσείς δεν χρησιμοποιείτε όλα τα κομμάτια του παζλ στο Scratch. Οι πιθανότητες είναι εσείς δεν με ένοιαζε να τυλίξει το μυαλό σας γύρω από όλα αυτά γιατί το μόνο που χρειάστηκε ήταν μια γρήγορη ματιά για να καταλάβετε, oh, αυτό είναι ό, τι μπορώ να κάνω με αυτό το κομμάτι του παζλ. Και πράγματι, το πρόβλημα που 3 spec, θα σας επισημάνω στην τεκμηρίωση που θα σας παρουσιάσουμε μερικές νέες λειτουργίες, και, τελικά, ο προγραμματισμός κατασκευάζει χρησιμοποιείτε. Προϋποθέσεις, βρόχους, μεταβλητές και λειτουργίες θα είναι πανομοιότυπο με ό, τι έχουμε δει μέχρι τώρα. Έτσι, πράγματι, αυτό που θα δώσει σας είναι μερικά δείγματα κώδικα, ότι σας επιτρέπει να δημιουργήσετε ένα παράθυρο ότι δεν φαίνεται σε αντίθεση με αυτό, και τελικά να μετατραπεί σε κάτι αρκετά όπως αυτό. Επωφεληθείτε λοιπόν του CS50, συζητήσουν τις ώρες γραφείου και περισσότερο, και να λάβει την άνεση στο γεγονός ότι το ποσό του κώδικα που πρέπει να γράψετε είναι στην πραγματικότητα δεν είναι όλα τόσο πολύ. Η πρώτη πρόκληση είναι απλώς να εγκλιματιστούν τον εαυτό σας σε κάποιο κώδικα που έχω γράψει. Οποιεσδήποτε ερωτήσεις σχετικά με pset3, Shellshock, ή με άλλο τρόπο; ΚΟΙΝΟ: Έμοιαζε διέρχεται με ξεμπλοκάρισμα ότι ο κώδικας είναι σχεδόν ένα object-oriented στυλ, αλλά νόμιζα ότι ήταν ένα C object-oriented πρόγραμμα. ΟΜΙΛΗΤΗΣ 1: Μια εξαιρετική ερώτηση. Έτσι κοιτάζοντας μέσα από το κώδικα της διανομής, ο κώδικας γράψαμε για pset3, για όσους είναι εξοικειωμένοι, αυτό μοιάζει να είναι ένα λίγο object-oriented. Σύντομη απάντηση είναι, είναι. Είναι μια προσέγγιση για το πώς θα μπορεί να κάνει αντικειμενοστραφή κώδικα χρησιμοποιώντας μια γλώσσα όπως η C, αλλά είναι ακόμα τελικά διαδικαστικά. Δεν υπάρχουν μέθοδοι στο εσωτερικό της οι μεταβλητές, όπως θα δείτε. Αλλά θυμίζει αυτό. Και θα δούμε και πάλι αυτό το χαρακτηριστικό όταν φτάσουμε σε PHP και JavaScript προς το τέλος του εξαμήνου. Αλλά για τώρα, σκεφτείτε το σαν μια υπόδειξη του τι είναι να έρθει. Καλή ερώτηση. Εντάξει. Έτσι συγχώνευση είδος ήταν το πώς θα αριστερά πράγματα την τελευταία φορά. Και συγχώνευση είδος ήταν δροσερό το αίσθηση ότι ήταν τόσο πολύ πιο γρήγορα, τουλάχιστον με βάση τις δοκιμές βιαστική κάναμε την περασμένη εβδομάδα, από ό, τι, ας πούμε, φούσκα sort, ταξινόμηση με επιλογή, ταξινόμηση με εισαγωγή. Και αυτό ήταν πολύ τακτοποιημένο είναι μόνο πώς συνοπτικά και καθαρά μπορείτε να το εκφράσουν. Και τι να πούμε ότι ήταν ένα ανώτερο δεσμεύεται για το χρόνο τρέχει από τη συγχώνευση ταξινομήσετε; Ναι; ΚΟΙΝΟ: n log n; ΟΜΙΛΗΤΗΣ 1: n log n, σωστά. n log n. Και θα επανέλθω σε αυτό που πραγματικά σημαίνει ή όπου αυτό προέρχεται από, αλλά αυτό ήταν καλύτερα ό, τι χρόνο λειτουργίας ότι είδαμε για φούσκα Η επιλογή και η ταξινόμηση με εισαγωγή; Έτσι, n τετράγωνο. n τετράγωνο είναι μεγαλύτερο από αυτό, και ακόμα κι αν δεν είναι προφανές, γνωρίζουν ότι log n είναι μικρότερο από το η, οπότε αν το κάνετε n φορές κάτι μικρότερο από το η, πρόκειται να είναι μικρότερη από n τετράγωνο. Είναι ένα κομμάτι της διαίσθησης εκεί. Αλλά πληρώσαμε ένα τίμημα γι 'αυτό. Ήταν πιο γρήγορα, αλλά ένα θέμα που ξεκίνησε να προκύψουν περασμένη εβδομάδα ήταν αυτό δίλημμα. Πήρα την καλύτερη απόδοση ώρα σοφός, αλλά τι εγώ πρέπει να περάσουν από την άλλη χέρι, προκειμένου να επιτευχθεί αυτό; ΚΟΙΝΟ: Μνήμη. ΟΜΙΛΗΤΗΣ 1: Ας υποθέσουμε και πάλι; ΚΟΙΝΟ: Μνήμη. ΟΜΙΛΗΤΗΣ 1: Μνήμη, ή χώρο γενικότερα. Και αυτό δεν ήταν super φανερό με τους ανθρώπους μας, αλλά υπενθυμίζουν ότι οι εθελοντές μας ήταν ένα βήμα μπροστά και ενίσχυση πίσω, σαν να υπάρχει μια σειρά εδώ, και όπως κι αν υπάρχει μια δεύτερη συστοιχία εδώ ότι θα μπορούσαν να χρησιμοποιήσουν, γιατί εμείς αναγκαία κάπου να συγχωνεύσει αυτά τα παιδιά. Εμείς δεν θα μπορούσε απλά να τα ανταλλάξουν στη θέση του. Έτσι συγχώνευση είδος μόχλευσης Είναι περισσότερο χώρο, η οποία εμείς δεν πρέπει με οι άλλοι αλγόριθμοι, αλλά το θετικό είναι ότι είναι πολύ πιο γρήγορα. Και ειλικρινά, στον πραγματικό κόσμο διάστημα αυτά days-- RAM, σκληρό δίσκο space-- είναι σχετικά φθηνή, και έτσι ώστε να είναι δεν είναι απαραίτητα κάτι κακό. Έτσι, ας ρίξουμε μια γρήγορη ματιά, ένα μικρό πιο μεθοδικά, σε ό, τι κάναμε και γιατί είπαμε ότι ήταν n log n. Μέχρι εδώ είναι τα οκτώ αριθμούς και το οκτώ εθελοντές που είχαμε την τελευταία φορά. Και το πρώτο πράγμα που Συγχώνευση Sort μας είπε να κάνουμε ό, τι ήταν; ΚΟΙΝΟ: Διαίρεση σε δύο. ΟΜΙΛΗΤΗΣ 1: Ας υποθέσουμε και πάλι; ΚΟΙΝΟ: Διαίρεση σε δύο. ΟΜΙΛΗΤΗΣ 1: Διαίρεση σε δύο, σωστά. Αυτό είναι πολύ θυμίζει το βιβλίο του τηλεφώνου, του χάσματος και να κατακτήσει γενικότερα. Έτσι κοιτάξαμε το αριστερό μισό. Και στη συνέχεια, αφού είπαμε, το είδος το αριστερό ήμισυ των στοιχείων, τι κάναμε επόμενη πούμε; Ταξινομήστε το αριστερό μισό της αριστεράς εξάμηνο, η οποία μας επέτρεψε να, μετά τη διαίρεση σε δύο, επικεντρωθεί σε τέσσερις και δύο. Πώς μπορείτε να ταξινομήσετε μια λίστα τώρα, σε κίτρινο, μεγέθους δύο, χρησιμοποιώντας Merge Sort; Καλά χωρίζουν στη μέση, και να ταξινομήσετε το αριστερό μισό. Και αυτό ήταν όπου τα πράγματα πήρε λίγο ηλίθιο σύντομα. Πώς μπορείτε να ταξινομήσετε μια λίστα που είναι από μέγεθος ένα, όπως αυτό το νούμερο τέσσερα εδώ; Είναι ταξινομούνται. Τελειώσατε. Αλλά τότε πώς να ταξινομήσετε μια λίστα μέγεθος ένα, όταν πρόκειται για το νούμερο δύο; Λοιπόν, το ίδιο πράγμα, αλλά τώρα ποια ήταν η τρίτο και το βασικό στάδιο Merge Sort; Θα έπρεπε να συγχωνεύσει το αριστερό ένα δεύτερο και το δεξιό ήμισυ. Και μόλις το κάναμε αυτό, εξετάσαμε στα τέσσερα, κοιτάξαμε δύο. Αποφασίσαμε εντάξει, προφανώς τα δύο έρχεται πρώτο, έτσι βάλαμε δύο σε του θέση, που ακολουθείται από τέσσερα. Και τώρα θα πρέπει να το είδος της προς τα πίσω, και αυτό είναι το είδος της χαρακτηριστικής από έναν αλγόριθμο, όπως Merge Ταξινόμηση, rewind στη μνήμη. Ποια ήταν η επόμενη γραμμή της ιστορίας; Τι θα πρέπει να επικεντρώνεται στην επόμενη; Το δεξί μισό τμήμα του αριστερού το ήμισυ, η οποία είναι έξι και οκτώ. Έτσι, επιτρέψτε μου να το βήμα μέσα από αυτό χωρίς να βασανίζω το σημείο πάρα πολύ. Έξι και οκτώ, στη συνέχεια, έξι είναι ταξινομούνται, οκτώ είναι ταξινομημένο. Συγχώνευση μαζί τους, όπως ότι, και τώρα το επόμενο μεγάλο βήμα Είναι, βέβαια, να ταξινομήσετε το δεξί μισό από το πρώτο βήμα αυτού του αλγορίθμου. Έτσι, έχουμε επικεντρωθεί σε ένα, τρία, επτά, πέντε. Εμείς στη συνέχεια να επικεντρωθούν στο αριστερό μισό. Το αριστερό μισό του ότι, το δεξί μισό της ότι, και μετά τη συγχώνευση τους σε ένα και τρία. Τότε το δεξιό ήμισυ, στη συνέχεια αφήνεται μισο από αυτό, τότε το δεξί μισό από αυτό. Συγχώνευση σε αυτό, και τώρα αυτό που απομένει βήμα; Συγχώνευση τον μεγάλο αριστερό μισό και το μεγάλο δεξί μισό, έτσι ώστε το ένα πηγαίνει εκεί κάτω, στη συνέχεια, δύο, τότε τρία, τότε τέσσερα, τότε πέντε, στη συνέχεια, έξι, επτά, στη συνέχεια, στη συνέχεια, οκτώ. Έτσι τώρα γιατί αυτό τελικά αποκαλύπτοντας, ειδικά αν n και λογαρίθμους περισσότερα γενικά μάλλον να ξεφύγουν, τουλάχιστον στην πρόσφατη μνήμη; Λοιπόν, παρατηρήστε το ύψος του αυτό το πράγμα. Είχαμε οκτώ στοιχεία, και διαιρούμενο αυτό από δύο, με δύο, με δύο. Έτσι, συνδεθείτε βάση δύο από οκτώ μας δίνει τρία. Και πιστέψτε με σε αυτό, αν λίγο θολό σχετικά με αυτό. Αλλά συνδεθείτε βάση δύο από τις οκτώ είναι τρεις, έτσι έχουμε κάνει τρία στρώματα της συγχώνευσης. Και όταν θα συγχωνευθεί στοιχεία, πόσα στοιχεία δεν κοιτάμε σε κάθε μία από αυτές τις γραμμές; Ένα σύνολο από n, σωστά; Γιατί να συγχωνεύσει την πρώτη γραμμή, ακόμη και αν το κάναμε αποσπασματικά, αγγίξαμε τελικά κάθε αριθμό μία φορά. Και στη δεύτερη σειρά, για συγχώνευση αυτών των καταλόγων του μεγέθους των δύο, θα έπρεπε να αγγίξει κάθε στοιχείο μία φορά. Και τότε εδώ πραγματικά σαφώς στην τελευταία σειρά, θα έπρεπε να αγγίξει κάθε μία από αυτές στοιχεία μια φορά, αλλά μόνο μία φορά, τόσο εδώ βρίσκεται, τότε, n log n μας. Και τώρα απλά για να κάνει τα πράγματα λίγο πιο επίσημα για μια στιγμή, αν ήταν να αναλύσουμε τώρα αυτό σε ένα είδος υψηλότερο επίπεδο και προσπαθούν να αποφασίσουν, αλλά και το πώς μπορεί να σας πάει για την έκφραση ο χρόνος εκτέλεσης του αλγορίθμου απλά κοιτάζοντας αυτό και δεν χρησιμοποιώντας μια σκηνοθετημένη παράδειγμα; Λοιπόν, πόσο χρόνο θα σας πω βήμα όπως αυτό σε κίτρινο θα λάβει, αν n <2 επιστροφή; Αυτό είναι μια μεγάλη O από ό, τι; Έτσι βλέπω ένα, έτσι ένα βήμα, ίσως και δύο βήματα, διότι είναι αν και στη συνέχεια να επιστρέψει, αλλά είναι συνεχή φορά, σωστά; Έτσι είπαμε O (1), και ότι είναι πώς θα το εκφράσει. T, απλά να είναι χρόνος τρέχει. n είναι το μέγεθος της εισόδου, έτσι ώστε T (n), ακριβώς ένα φανταχτερό τρόπο του λέγοντας ότι η λειτουργία χρόνο που δίνεται είσοδο μεγέθους n πρόκειται να είναι της τάξης από σταθερό χρόνο, σε O (1). Αλλά κατά τα άλλα, τι γίνεται με αυτό; Πώς θα εκφράσει το χρόνος λειτουργίας αυτής κίτρινη γραμμή; T από τι; Μπορείτε είδος του να εξαπατήσει εδώ και απαντήσει στην ερώτησή μου κυκλικά. Έτσι, αν ο χρόνος τρέχει σε Γενικά μπορούμε απλώς να πω είναι T (n). Και τώρα είστε το είδος του punting εδώ και λέγοντας, καλά, απλά ταξινομήσετε το αριστερό μισό, και στη συνέχεια να ταξινομήσετε το δεξί μισό. Πώς θα μπορούσαμε να αντιπροσωπεύουν συμβολικά ο χρόνος εκτέλεσης αυτού κίτρινη γραμμή; T από τι; Ποιο είναι το μέγεθος της εισόδου; n πάνω από δύο. Γιατί δεν μπορώ να πω μόνο αυτό; Και τότε αυτό είναι ένα άλλο Τ (n / 2) και έπειτα και πάλι, αν έχω τη συγχώνευση δύο ταξινομημένων μισών, πόσα στοιχεία θα πάω να πρέπει να αγγίξει συνολικά; n. Έτσι, μπορώ να εκφράσω αυτό, ακριβώς για να είναι το είδος της φαντασίας, καθώς ο χρόνος τρέχει γενικά. T (n) είναι ακριβώς ο χρόνος εκτέλεσης της T (n / 2), συν T (n / 2), αριστερό μισό και το δεξί μισό, συν O (n), η οποία είναι πιθανώς n βήματα, αλλά ίσως, αν είμαι με τη χρήση δύο δάχτυλα, είναι διπλάσιες βήματα, αλλά είναι γραμμική. Είναι μερικές αριθμό των βημάτων ότι είναι ένας παράγοντας του n, έτσι μπορούμε να εκφράσουμε αυτό ως αυτό. Και αυτό είναι που τώρα θα punt με το πίσω από μας γυμνασίου μαθηματικά βιβλίο είμαστε η επανεμφάνιση τελικά καταλήγει να ισοδυναμεί με αυτό, n φορές log n, αν πραγματικά το κάνετε έξω τα μαθηματικά πιο επίσημα. Έτσι, αυτό είναι μόλις δύο προοπτικές. Ένα αριθμητικά με ένα hard-coded αντιπροσωπευτικό παράδειγμα χρησιμοποιώντας οκτώ αριθμούς, καθώς και μια πιο γενική ματιά στο πώς φτάσαμε εκεί. Αλλά αυτό που είναι πραγματικά ενδιαφέρον εδώ είναι, και πάλι, αυτή η έννοια της ποδηλασίας. Δεν είμαι χρησιμοποιούν για βρόχους. Είμαι το είδος του καθορισμού κάτι από την άποψη της ίδιας, όχι μόνο με αυτό μαθηματική συνάρτηση, αλλά και από την άποψη αυτή ψευδοκώδικα. Αυτός ο κωδικός ψευδο είναι αναδρομικές στην εν λόγω δύο γραμμών του είναι ουσιαστικά το λέει για να πάει η ίδια χρησιμοποιεί για να λύσει ένα μικρότερο πρόβλημα του μικρότερου μεγέθους, και, στη συνέχεια, ξανά και ξανά και ξανά μέχρι να περιοριστούν το προς τα κάτω σε αυτό το λεγόμενο βασικό σενάριο. Οπότε ας πραγματικότητα συντάξει ένα πιο συναρπαστικό take-away από αυτό ως εξής. Επιτρέψτε μου να πάω στο gedit και να λάβει μια μια ματιά σε μερικά από τον πηγαίο κώδικα του σήμερα, ιδίως αυτό το παράδειγμα εδώ. Sigma 0, η οποία προσθέτει προφανώς οι αριθμοί ένα μέχρι n. Έτσι, ας δούμε τι είναι εξοικειωμένοι και άγνωστα εδώ. Πρώτα έχουμε ένα ζευγάρι από περιλαμβάνει, οπότε τίποτα νέο εκεί. Πρωτότυπο. Είμαι λίγο θολό σχετικά με αυτό μετά από λίγες ημέρες, αλλά αυτό που είπαμε μια πρωτότυπο της συνάρτησης είναι; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Τι είναι αυτό; ΚΟΙΝΟ: Θα το ανακοινώσουμε. ΟΜΙΛΗΤΗΣ 1: Θα το ανακοινώσουμε. Έτσι είστε διδασκαλία Clang, hey, δεν είναι στην πραγματικότητα την εφαρμογή αυτή ακόμα, αλλά κάπου σε αυτό το αρχείο, προφανώς, πρόκειται να είναι μια λειτουργία που ονομάζεται αυτό; Σίγμα. Και αυτό είναι απλά μια υπόσχεση ότι πρόκειται να μοιάζει με αυτό. Είναι πρόκειται να πάρει έναν ακέραιο ως input-- και μπορώ να γίνω πιο σαφής και να πω int n --and είναι πρόκειται να επιστρέψει ένα int, αλλά ερωτηματικό μέσα, mm, θα πάρει γύρω στην εφαρμογή αυτή λίγο αργότερα. Και πάλι, Clang είναι χαζός. Είναι μόνο για να ξέρετε τι μπορείτε να πείτε πάνω προς τα κάτω, έτσι πρέπει να δώσει τουλάχιστον είναι μια ιδέα για το τι είναι να έρθει. Τώρα, ας ρίξουμε μια ματιά στο κεντρικό εδώ. Ας μετακινηθείτε προς τα κάτω εδώ και δείτε ποια είναι τα κύρια κάνει. Δεν είναι τόσο πολύ από μια λειτουργία, και στην πραγματικότητα, το κατασκεύασμα εδώ είναι εξοικειωμένος. Δηλώνω μια μεταβλητή n, και στη συνέχεια, I ταλαιπωρούν ξανά και ξανά το χρήστη για ένα θετικό ακέραιο χρησιμοποιώντας getInt, και μόνο έξοδος από αυτόν τον βρόχο μόλις ο χρήστης έχει συμμορφωθεί. Κάντε Ενώ, έχουμε χρησιμοποιήσει για να ταλαιπωρούν τον χρήστη με αυτόν τον τρόπο. Τώρα αυτό είναι ενδιαφέρον. Δηλώνω μια int που ονομάζεται "απάντηση". Θα είναι η τιμή επιστροφής αναθέσει μιας συνάρτησης που ονομάζεται "σίγμα". Δεν ξέρω τι κάνει αυτό ακόμα, αλλά Θυμάμαι δηλώνοντας ότι πριν από λίγο. Και τότε είμαι περνώντας το αξία που ο χρήστης πληκτρολογήσει το, n, και, στη συνέχεια, μπορώ να αναφέρω την απάντηση. Λοιπόν ας ανατρέξει για μια στιγμή. Ας πάμε μπροστά σε αυτόν τον κατάλογο, να σίγμα 0, και πραγματικά να τρέξει αυτό το πρόγραμμα και να δούμε τι θα συμβεί. Έτσι, αν πάω μπροστά και να τρέξει αυτό το πρόγραμμα, ./sigma-0, και πληκτρολογήστε σε ένα θετικό ακέραιο, όπως δύο, Sigma, όπως το ελληνικό σύμβολο συνεπάγεται, είναι απλά πρόκειται να προσθέσετε όλους τους αριθμούς από μηδέν για μέχρι δύο. Έτσι 0 συν 1 συν 2. Έτσι, αυτό θα πρέπει να ελπίζουμε μου 3. Αυτό είναι το μόνο που κάνει. Και ομοίως, εάν το τρέχω ξανά και δίνω τον αριθμό τρία, ότι είναι 3 συν 2, έτσι ώστε να είναι 5 συν 1 θα πρέπει να μου δώσει 6. Και στη συνέχεια, αν έχω πραγματικά τρελό και αρχίσετε να πληκτρολογείτε σε μεγαλύτερους αριθμούς, θα πρέπει να μου δώσει όλο και μεγαλύτερες ποσά. Έτσι, αυτό είναι όλο. Ποιο είναι, λοιπόν σίγμα μοιάζει; Λοιπόν, αυτό είναι αρκετά απλή. Είναι το πώς θα μπορούσε να εφαρμοστεί αυτό για τις τελευταίες δύο εβδομάδες. "Int" πρόκειται να είναι ο τύπος επιστροφής. Sigma είναι το όνομα, και παίρνει μια μεταβλητή m αντί n. Θα αλλάξει αυτό επάνω στην κορυφή. Στη συνέχεια, αυτό είναι απλά μια επιταγή λογική. Θα δούμε γιατί σε μια στιγμή. Τώρα Δηλώνω άλλη μεταβλητή, Συνοψίζοντας, θα προετοιμαστεί στο μηδέν. Στη συνέχεια, έχω αυτό Για βρόχο επανάληψη, προφανώς για λόγους σαφήνειας, από i = 1 έως και σε ένα = m, η οποία είναι όποια και αν είναι ο χρήστης πληκτρολογήσει το, και στη συνέχεια θα αυξήσετε το ποσό, όπως αυτό. Και στη συνέχεια να επιστρέψει το ποσό. Έτσι, μερικές ερωτήσεις. Ένα, αξιώνω το σχόλιό μου είναι ότι αυτή η αποφεύγει τον κίνδυνο από ένα άπειρο βρόχο. Γιατί θα περνά σε αρνητικό αριθμό προκαλέσει, ενδεχομένως, ένα άπειρο βρόχο; ΚΟΙΝΟ: Ποτέ δε θα φτάσει m. ΟΜΙΛΗΤΗΣ 1: Ποτέ μην φτάσει m. Αλλά μ περνά σε, οπότε ας θεωρούν ένα απλό παράδειγμα. Εάν m περνιέται σε με το χρήστη ως αρνητική. Ανεξάρτητα από τα κύρια. Κύρια μας προστατεύει από αυτό πάρα πολύ, έτσι είμαι απλά είναι πραγματικά πρωκτικό με σίγμα για να βεβαιωθείτε ότι η είσοδος δεν μπορεί να είναι αρνητική. Έτσι, εάν το m είναι αρνητική, κάτι σαν αρνητική. Τι πρόκειται να συμβεί; Λοιπόν, εγώ δεν πρόκειται να να προετοιμαστεί για ένα, και τότε εγώ πρόκειται να είναι λιγότερο από ή ίσο με m; Stand by. Αυτό was-- του ας μη, ας nix αυτή την ιστορία. Δεν είχα κάνει αυτή την ερώτηση, γιατί ο κίνδυνος που είμαι υπαινίσσεται δεν πρόκειται να συμβεί, διότι i είναι πάντα θα είναι μεγαλύτερη than-- OK, Θα αποσύρετε αυτό το ερώτημα. OK. Ας επικεντρωθούμε μόνο σε αυτό το μέρος εδώ. Γιατί Δηλώνω κάποια εκτός του βρόχου; Ανακοίνωση on line 49 έχω δηλώνονται Ι μέσα από το βρόχο, αλλά σε απευθείας σύνδεση 48 έχω δηλωθεί κάποια έξω. Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Σίγουρα. Έτσι, πρώτα απ 'όλα εγώ σίγουρα δεν το κάνουν θέλουν να το δηλώσει και να προετοιμάσει άθροισμα στο μηδέν εσωτερικό του βρόχο σε κάθε επανάληψη, γιατί αυτό θα νικήσει με σαφήνεια η Σκοπός της συνοψίζοντας τους αριθμούς. Θα ήθελα να κρατήσει την αλλαγή η αξία πίσω στο μηδέν. Και επίσης, τι άλλο πιο απόκρυφες λόγος για την ίδια σχεδιαστική απόφαση; Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ακριβώς. Θέλω να έχουν πρόσβαση έξω του βρόχου πάρα πολύ για το τι γραμμή; Στις 53. Και με βάση τον κανόνα του αντίχειρα μας από ένα ζευγάρι των διαλέξεων πριν, Οι μεταβλητές scoped, πραγματικά, να το άγκιστρα που τους καλύπτουν. Έτσι, αν δεν δηλώνουν άθροισμα μέσα από αυτές τις εξωτερικές αγκύλες, Δεν μπορώ να το χρησιμοποιήσετε σε γραμμή 53. Με άλλα λόγια, αν δηλώνονται άθροισμα εδώ, ή ακόμα και εντός της Για βρόχο, εγώ δεν θα μπορούσε να έχει πρόσβαση σε 53. Η μεταβλητή ουσιαστικά θα φύγει. Έτσι, ένα ζευγάρι των λόγων εκεί. Αλλά τώρα ας πάμε πίσω και να δούμε τι θα συμβεί. Έτσι σίγμα φώναξαν. Προσθέτει μέχρι 1 συν 2, ή 1 συν 2 συν 3, και, στη συνέχεια, επιστρέφει την τιμή, αποθηκεύει στην απάντηση, και printf εδώ είναι ο λόγος που βλέπω στην οθόνη. Έτσι, αυτό είναι τι θα καλέσετε μια επαναληπτική προσέγγιση, όπου επανάληψη μόνο σημαίνει τη χρήση ενός βρόχου. A Για βρόχο, ένα βρόχο Ενώ, ένα Do Ενώ βρόχο, απλά κάνει και πάλι κάτι και ξανά και ξανά. Αλλά σίγμα είναι το είδος της μια τακτοποιημένη λειτουργία ότι θα μπορούσα να εφαρμόσει διαφορετικά. Τι γίνεται με αυτό, το οποίο ακριβώς για να είναι είδος δροσερό, επιτρέψτε μου να πραγματικά να απαλλαγούμε από πολλή απόσπαση της προσοχής γιατί αυτή τη λειτουργία Είναι πραγματικά πολύ απλό. Ας περιοριστούν κάτω ακριβώς σε τέσσερις βασικές γραμμές της και να απαλλαγούμε από όλα τα σχόλια και άγκιστρα. Αυτό είναι το είδος της ένα μυαλό-blowing εναλλακτική εφαρμογή. Εντάξει, ίσως όχι το μυαλό-blowing, αλλά αυτό είναι το είδος των πιο σέξι, εντάξει, να εξετάσουμε αυτό το θέμα πολύ πιο συνοπτικά. Με μόλις τέσσερις γραμμές του κώδικα, Θέλω πρώτα να έχει τον έλεγχο αυτό λογική. Εάν m είναι μικρότερο από ή ίσο με μηδέν, σίγμα δεν έχει κανένα νόημα. Είναι υποτίθεται ότι είναι σε Αυτό ισχύει για θετικούς αριθμούς, έτσι είμαι απλώς πρόκειται να επιστροφή μηδέν αυθαίρετα έτσι ώστε να έχουμε τουλάχιστον κάποια λεγόμενη βασική περίπτωση. Αλλά εδώ είναι η ομορφιά. Το σύνολο αυτής της ιδέας, η προσθήκη αριθμοί από 1 έως η, πι ή σε αυτή την περίπτωση, μπορεί να γίνει με το είδος της αποποιούνται τις ευθύνες. Λοιπόν, ποιο είναι το άθροισμα των 1 m; Λοιπόν, ξέρετε τι; Είναι το ίδιο με το άθροισμα των m συν το ποσό του 1 m μείον 1. Λοιπόν ξέρετε τι; Τι είναι σίγμα m μείον 1; Λοιπόν, εάν είστε το είδος του ακολουθήσετε αυτό λογικά, είναι το ίδιο όπως το m μείον 1 συν σίγμα πι του μείον 2. Έτσι, μπορείτε να το είδος της μόνο-- αυτό είναι σαν, αν είστε απλά προσπαθεί να ενοχλήσει ένα φίλο και θα σας κάνω μια ερώτηση, Σας το είδος του απαντήσει με ένα ερώτημα, μπορείτε είδος μπορεί να κρατήσει το πέρασμα του buck. Αλλά αυτό που είναι βασικό είναι ότι αν κρατήσετε καθιστώντας το ερώτημα και μικρότερα και μικρότερα, είστε Δεν ρωτούν τι είναι σίγμα του n, τι είναι σίγμα n, τι είναι σίγμα του n; Ρωτάς τι είναι σίγμα του n, τι είναι σίγμα από n μείον 1, τι είναι σίγμα n μείον 2; Τελικά ερώτησή σας πρόκειται να γίνει αυτό; Τι είναι σίγμα μίας ή μηδέν, μερικοί πολύ μικρή τιμή, και μόλις πάρετε αυτό, ο φίλος σας, δεν πρόκειται να ζητήσει το ίδιο ερώτημα και πάλι, είστε ακριβώς πρόκειται να πω, μα είναι μηδέν. Τελειώσαμε παίζοντας αυτό το είδος ηλίθια κυκλική παιχνίδι. Έτσι αναδρομής είναι η πράξη στον προγραμματισμό μιας συνάρτησης η οποία αυτοαποκαλείται. Αυτό το πρόγραμμα, όταν καταρτίζονται και να τρέξει, είναι πρόκειται να συμπεριφέρονται με τον ίδιο ακριβώς τρόπο, αλλά αυτό που είναι βασικό είναι ότι μέσα μιας συνάρτησης που ονομάζεται σίγμα, υπάρχει μια γραμμή κώδικα, όπου είμαστε οι ίδιοι καλώντας, η οποία κανονικά θα ήταν κακό. Για παράδειγμα, τι θα γίνει αν για πρώτη φορά καταρτίζονται αυτό, έτσι ώστε να sigma-- κάνουν sigma 1 ./sigma-1. Θετικός ακέραιος, παρακαλούμε, 50 το 1275. Έτσι, ποια είναι η λειτουργία φαίνεται να να είναι, με βάση μία δοκιμή, σωστή. Αλλά τι γίνεται αν έχω λίγο επικίνδυνο και διαγράψτε το λεγόμενο βασικό σενάριο, και απλώς να πω, αλλά είμαι απλά κάνοντας αυτό πιο περίπλοκη από ό, τι είναι. Ας υπολογίσουμε το σίγμα με τη λήψη μ και στη συνέχεια προσθήκη σε σίγμα m μείον ένα; Λοιπόν, τι πρόκειται να συμβεί εδώ; Ας σμίκρυνση. Ας μεταγλωττίσετε ξανά το πρόγραμμα, αποθηκεύσετε, να μεταγλωττίσετε ξανά το πρόγραμμα, και στη συνέχεια έτοιμοι ./sigma-1 μεγέθυνση, εισάγετε θετικό ακέραιο παρακαλούμε, 50. Πόσοι από εσάς είναι πρόθυμοι να fess μέχρι να δει αυτό; OK. Έτσι, αυτό μπορεί να συμβεί για ένα αριθμό λόγων, και ειλικρινά αυτή την εβδομάδα είμαστε για να σας δώσει περισσότερα από αυτά. Αλλά σε αυτή την περίπτωση, προσπαθήστε στο λόγο πίσω τι θα μπορούσε να συμβεί εδώ; Τμηματοποίηση σφάλμα, είπαμε τελευταία χρόνος, αναφέρεται σε ένα τμήμα της μνήμης. Κάτι κακό συνέβη. Αλλά αυτό που ήταν μηχανική που πήγε στραβά εδώ λόγω της απομάκρυνσης μου της λεγόμενης περίπτωση βάση, όπου επέστρεψε ένα σκληρό κωδικοποιημένη τιμή; Τι νομίζετε ότι πήγε στραβά; Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Αχ. Καλή ερώτηση. Έτσι το μέγεθος του αριθμού ότι ήμουν συνοψίζοντας πήρε τόσο μεγάλο που υπερέβη το μέγεθος του χώρου μνήμης. Καλή ιδέα, αλλά δεν είναι τελείως πρόκειται να προκαλέσει μια συντριβή. Αυτό θα μπορούσε να προκαλέσει υπερχείλιση ακεραίου, όπου τα bits απλά αναποδογυρίστε και στη συνέχεια να μείνουμε μια πραγματικά μεγάλη αριθμό για σαν ένα αρνητικό αριθμό, αλλά ότι η ίδια δεν θα προκαλέσει μια συντριβή. Διότι στο τέλος της ημέρα ένας int είναι ακόμη 32 bits. Δεν πρόκειται να λάθος να κλέψει ένα κομμάτι 33η. Αλλά μια καλή σκέψη. Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Η μέθοδος Ποτέ δεν σταματά να τρέχει, και μάλιστα η ίδια καλεί και πάλι και ξανά και ξανά και ξανά και πάλι, και κανένας από οι λειτουργίες αυτές ποτέ τελειώσει, διότι μόνη γραμμή τους Κωδικός καλεί εαυτό του ξανά και ξανά και πάλι. Και τι είναι πραγματικά συμβαίνει εδώ, και τώρα μπορεί είδος επιστήσει εικονογραφικά. Επιτρέψτε μου να πάει πάνω σε ένα εικόνα για μόνο μια στιγμή. Αυτή είναι μια εικόνα, ότι τελικά θα συμπληρώσουν αναλυτικότερα, από ό, τι συμβαίνει μέσα από τη μνήμη του υπολογιστή σας. Και αποδεικνύεται ότι για το κάτω μέρος αυτής της εικόνας είναι κάτι που ονομάζεται η στοίβα. Αυτό είναι ένα κομμάτι της μνήμη, ένα κομμάτι της μνήμης RAM, αυτό είναι ακριβώς που χρησιμοποιούνται κάθε χρόνο μια λειτουργία που ονομάζεται. Κάθε φορά που, προγραμματιστής, καλέσετε μια συνάρτηση, το λειτουργικό σύστημα, όπως Mac OS, Windows ή Linux, αρπάζει ένα μάτσο bytes, ίσως μερικά kilobytes, ίσως μερικά megabytes της μνήμης, τα χέρια σας, και στη συνέχεια αφήνει να εκτελέσετε τη λειτουργία σας, χρησιμοποιώντας ανεξάρτητα από τις μεταβλητές που χρειάζεστε. Και αν τότε καλέστε ένα άλλο λειτουργία και μια άλλη λειτουργία, μπορείτε να πάρετε ένα άλλο κομμάτι της μνήμης και ένα άλλο κομμάτι της μνήμης. Και πράγματι, αν αυτές πράσινο δίσκοι από Annenberg αντιπροσωπεύουν ότι η μνήμη, Εδώ είναι τι θα συμβεί το πρώτο φορά που θα καλέσετε σίγμα λειτουργία. Είναι σαν να βάζουμε ένα δίσκο, όπως αυτό σχετικά με το τι είναι αρχικά ένα άδειο στοίβα. Στη συνέχεια, όμως, αν αυτό δίσκο καλεί τον εαυτό της, να το πω έτσι, καλώντας ένα άλλο παράδειγμα σίγμα, που είναι σαν να ζητάμε από το λειτουργικό σύστημα, ooh, χρειάζεται λίγο περισσότερη μνήμη, δώσε μου αυτό. Και τότε παίρνει συσσωρεύονται στην κορυφή. Αλλά τι είναι το κλειδί εδώ είναι ότι ο πρώτος δίσκος είναι ακόμα εκεί, γιατί επικαλέστηκε το δεύτερο αυτό δίσκο. Τώρα, εν τω μεταξύ, σίγμα καλέστε σίγμα, αυτό είναι σαν να ζητάμε περισσότερη μνήμη. Παίρνει συσσωρεύονται εδώ. σίγμα καλέστε σίγμα, αυτό είναι ένα άλλο δίσκος που παίρνει συσσωρεύονται εδώ. Και αν συνεχίσεις να κάνεις αυτό, τελικά, το είδος του χάρτη αυτήν την οπτική σε αυτό το διάγραμμα, τι πρόκειται να συμβεί με τη στοίβα των δίσκων; Είναι πρόκειται να υπερβεί το ποσό της μνήμης του υπολογιστή σας έχει. Και το συντομότερο αυτό το πράσινο δίσκο υπερβαίνει την οριζόντια γραμμή πάνω από στοίβα και πάνω η λέξη σωρό, η οποία θα επανέλθουμε στο μέλλον, ότι είναι ένα κακό πράγμα. Ο σωρός είναι μια διαφορετική τμήμα της μνήμης, και αν αυτά ας δίσκους σωρό και σωρό, θα πάμε να υπερβαίνει δικό σας τμήμα της μνήμης, και ένα πρόγραμμα πρόκειται όντως για την συντριβή. Τώρα, ως ένα μέρος, αυτή την ιδέα της αναδρομής, ως εκ τούτου, μπορεί να οδηγήσει σαφώς σε προβλήματα, αλλά αυτό δεν είναι απαραίτητα κακό. Επειδή θεωρούν, μετά από όλα, how-- και ίσως αυτό παίρνει κάποιο να χρησιμοποιείται να --Πώς κομψό ή πόσο απλό ότι η εφαρμογή του σίγμα ήταν. Και εμείς δεν πρόκειται να χρησιμοποιήσετε αναδρομή τόσο πολύ σε CS50, αλλά σε CS51, και πραγματικά κάθε κατηγορία όπου μπορείτε να χειριστείτε τις δομές δεδομένων όπως δέντρα, ή οικογενειακά δέντρα, ότι έχουν κάποια ιεραρχία, Είναι σούπερ, σούπερ χρήσιμο. Τώρα, ως ένα μέρος, έτσι ώστε να ως επίδοξους επιστήμονες υπολογιστών είναι εξοικειωμένοι με μερικές από της Google μέσα αστεία, αν πάτε στο Google και θα δούμε μέχρι ποια είναι η ορισμό του, ας πούμε, αναδρομή, εισάγετε. Αχα. Παρεμπιπτόντως, τράβηξα μερικές. Αυτό ήταν σαν 10 λεπτά αναβλητικότητα σήμερα το πρωί. Αν και η Google "στραβό", ανακοίνωση γέρνοντας το κεφάλι σας slightly-- και τότε αυτό είναι ίσως πιο φρικτό από όλα επειδή κάποιος πέρασε σαν ημέρα τους για την εφαρμογή αυτής της μερικά χρόνια ago-- έλα. Ω, wait-- ότι είναι ένα bug. Έτσι εκτελείται σε ένα από τα μεγαλύτερες ιστοσελίδες στον κόσμο είναι αυτά τα ηλίθια μικρά αυγά του Πάσχα. Πιθανόν να καταναλώνουν ένα nontrivial αριθμό των γραμμών του κώδικα ακριβώς έτσι ώστε να μπορούμε να έχουμε λίγο διασκεδαστικά πράγματα όπως αυτό. Αλλά τουλάχιστον τώρα μπορείτε να πάρετε ορισμένα από αυτά τα μέσα αστεία. Τώρα ας ρίξουμε μια ματιά σε μερικά από τα λευκό έγκειται έχουμε την αφήγηση των καθυστερήσεων, και αρχίζουν να ξεφλουδίζουν πίσω μερικά στρώματα τεχνικά έτσι ώστε να μπορείτε πραγματικά να καταλάβετε τι συμβαίνει στις και μπορείτε να καταλάβετε κάποιες από τις απειλές, όπως Shellshock, ότι έχουν αρχίσει τώρα να γίνει στην πρώτη γραμμή του καθενός προσοχή, τουλάχιστον στα μέσα μαζικής ενημέρωσης. Έτσι, εδώ είναι μια πολύ απλή λειτουργία ότι δεν επιστρέφει τίποτα, κενό. Το όνομά του είναι swap. Παίρνει σε δύο μεταβλητές και επιστρέφει τίποτα. Λαμβάνει σε α και β. Έτσι, μια γρήγορη επίδειξη. Φέραμε αυτά τα επάνω. Θα μπορούσαμε επίσης να πάρει ένα μικρό σπάσει εδώ μόνο για μια στιγμή και έχουν κάτι να πιει. Αν κάποιος δεν θα με πείραζε να ενώνει μου μέχρι εδώ μόνο για μια στιγμή. Πώς για σας στο καφέ πουκάμισο; Έλα πάνω. Απλά η μία σήμερα. Σας ευχαριστώ, όμως. Εντάξει, και έχουμε ανεβαίνει ο οποίος εδώ; Ποιο είναι το όνομά σου; ΟΜΙΛΗΤΗΣ 4: Laura. ΟΜΙΛΗΤΗΣ 1: Laura. Έλα πάνω. Έτσι, Laura, πολύ απλή πρόκληση σήμερα. Νίκαια για την κάλυψη yo. Εντάξει. Έτσι έχουμε λίγο γάλα εδώ και έχουμε κάποια χυμό πορτοκαλιού εδώ και μερικά φλιτζάνια ότι εμείς δανείστηκε από Annenberg σήμερα. ΟΜΙΛΗΤΗΣ 4: Ξένα. ΟΜΙΛΗΤΗΣ 1: Και πρόκειται να προχωρήσει και να σας δώσει μισό ποτήρι από αυτό. Εντάξει. Και θα σας δώσουμε το μισό ένα ποτήρι του γάλακτος. Ω, και μόνο έτσι ώστε να μπορείτε να θυμηθείτε τι ήταν αυτό, όπως, Θυμήθηκα να φέρει αυτό μέχρι και σήμερα. Εντάξει. Αν δεν σας πειράζει, ας δούμε, μπορεί να τα βάλουν πάνω από τα δικά σας γυαλιά αν θέλετε. Αυτό θα είναι ο κόσμος από τα μάτια της Laura. Εντάξει. Έτσι, ο στόχος σας, δεδομένου δύο φλιτζάνια υγρή εδώ, το γάλα και το χυμό πορτοκαλιού, είναι να ανταλλάξουν τα δύο περιεχόμενα, έτσι ώστε η χυμό πορτοκαλιού πηγαίνει στο φλιτζάνι γάλα και το γάλα πηγαίνει σε το φλιτζάνι χυμό πορτοκαλιού. ΟΜΙΛΗΤΗΣ 4: Μπορώ να έχω άλλο ένα φλιτζάνι; ΟΜΙΛΗΤΗΣ 1: Είμαι τόσο ευτυχής ότι ρωτήσατε, αν θα ήταν πολύ καλύτερα βίντεο αν δεν το είχε ζητήσει. Αλλά ναι, μπορούμε να σας προσφέρουμε ένα τρίτο κύπελλο που είναι άδειο, φυσικά. Εντάξει. Έτσι ανταλλάξουν εκεί τα περιεχόμενα. Πολύ ωραία. Πολύ καλό. Κάνεις αυτό το εξαιρετικά προσεκτικά. Και τρίτο βήμα. Εντάξει. Εξαιρετική. Ένα μεγάλο χειροκρότημα θα ήταν καλό για την Laura. Εντάξει. Έχουμε ένα μικρό αποχαιρετιστήριο δώρο για σας, αλλά επιτρέψτε μου να πάρει αυτά. Σας ευχαριστώ πολύ. Έτσι ένα απλό παράδειγμα, όμως, για να αποδείξει ότι αν το κάνετε θέλουν να ανταλλάξουν τα περιεχόμενα από δύο δοχεία, ή ας τους καλέσει μεταβλητές, θα πρέπει να έχετε κάποια προσωρινή αποθήκευση να οργανώσει ένα από τα περιεχόμενα έτσι ότι μπορείτε να κάνετε πραγματικότητα το swap. Έτσι, πράγματι, αυτό το πηγαίο κώδικα εδώ C είναι αντιπροσωπευτική της ακριβώς αυτό. Εάν ο χυμός πορτοκαλιού ήταν ένα και το γάλα Ήταν β, και θέλαμε να ανταλλάξουν τα δύο, θα μπορούσατε να δοκιμάσετε κάτι δημιουργικό χύνοντας το ένα μέσα στο άλλο, αλλά ότι πιθανότατα δεν θα τέλος ιδιαίτερα καλά. Και γι 'αυτό χρησιμοποιήστε ένα τρίτο κύπελλο, κλήση το tmp, T-M-P κατά συνθήκη, και να θέσει το περιεχόμενο της ΕΕ σε αυτό, στη συνέχεια, να ανταλλάξουν ένα φλιτζάνι, στη συνέχεια, τοποθετήστε το στην ΕΕ το αρχική κύπελλο, έτσι επίτευξη, ακριβώς όπως Laura έκανε, το swap. Οπότε ας κάνουμε ακριβώς αυτό. Επιτρέψτε μου να πάει μπροστά και να ανοίξει μέχρι ένα παράδειγμα που είναι στην πραγματικότητα ονομάζεται «όχι ανταλλάξουν, "γιατί αυτό δεν είναι όσο απλά γίνεται, όπως μπορείτε να σκεφτείτε. Έτσι, σε αυτό το πρόγραμμα, παρατηρούμε ότι Είμαι χρησιμοποιώντας stdio.h, ο παλιός μας φίλος. Έχω το πρωτότυπο για την ανταλλαγή μέχρι εκεί, η οποία σημαίνει ότι η εφαρμογή της είναι πιθανώς κάτω, και ας δούμε τι είναι αυτό το κύριο πρόγραμμα που πρόκειται να κάνει για μένα. Θέλω πρώτα να δηλώσει int x παίρνει ένα, και int y παίρνει δύο. Έτσι σκέφτονται αυτά που ΕΕ και το γάλα, αντίστοιχα. Και τότε έχω μόνο ένα printf λέγοντας x είναι αυτό και y είναι αυτό, ακριβώς έτσι μπορώ οπτικά και δείτε τι συμβαίνει. Στη συνέχεια, έχω printf υποστηρίζοντας ότι είμαι εναλλαγή των δύο, και στη συνέχεια να εκτυπώσετε μια ισχυρίζονται ότι από όπου και αν ανταλλαχθούν, και να τυπώσω x και y και πάλι. Έτσι, εδώ κάτω σε swap είναι ακριβώς ό, τι έκανε η Laura, και ακριβώς αυτό που είδαμε στην η οθόνη πριν από λίγο. Ας πάμε μπροστά και να είναι βαθιά απογοήτευση. Μην κάνετε κανένα swap, και διατρέχουν κανένα swap, μεγεθύνοντας την έξοδο εδώ. Πληκτρολογήστε το x είναι 1, y είναι 2, swapping ανταλλαχθούν. χ είναι ακόμη 1, και το γ είναι ακόμη 2. Έτσι, ακόμη και αν, ειλικρινά, αυτό φαίνεται ήθελε ακριβώς, αν και με πιο τεχνικά, τι έκανε η Laura, δεν φαίνεται να λειτουργεί. Γιατί λοιπόν είναι αυτό; Λοιπόν, αποδεικνύεται ότι, όταν γράφουμε ένα πρόγραμμα όπως αυτό ότι έχει δύο κύρια, τονίζεται εδώ, και, στη συνέχεια, μια άλλη λειτουργία, όπως swap, επισημανθεί εδώ, η οποία καλεί, ο κόσμος μοιάζει κάπως έτσι αυτές οι δίσκοι πριν από λίγο. Όταν η κύρια πρώτη φώναξαν, αυτό είναι σαν να ζητάμε από το λειτουργικό σύστημα για ένα κομμάτι της μνήμης για κάθε τοπική μεταβλητές όπως το x και y που έχει κύρια, και καταλήγουν εκεί. Αλλά αν ο κύριος κλήσεις ανταλλάξουν, και κύρια περνάει να ανταλλάξουν δύο επιχειρήματα, α και β, χυμό πορτοκαλιού και το γάλα, δεν είναι σαν παραδίδοντας το χυμό πορτοκαλιού και το γάλα στο Laura. Τι κάνει ένας υπολογιστής, είναι περνά αντίγραφα του χυμού πορτοκαλιού και αντίγραφα του γάλακτος σε Laura, έτσι ώστε να τι είναι τελικά μέσα από αυτό το δίσκο είναι η μία αξία και δύο, ή ΕΕ και το γάλα, αλλά και αντίγραφα αυτών, έτσι ώστε σε αυτό το σημείο στην ιστορία, υπάρχει είναι η ΕΕ και το γάλα σε καθένα από αυτούς τους δίσκους. Υπάρχει ένα και δύο σε κάθε ένα από αυτούς τους δίσκους, και η λειτουργία εναλλαγής είναι πράγματι εργάζονται. Είναι αυτά αλλάζουν μέσα της δεύτερης ανώτατο δίσκο, αλλά ότι η εναλλαγή δεν έχει καμία επίπτωση. Και με βάση μόνο μερικές βασική αρχή έχουμε μίλησε για αυτό πριν, και μάλιστα Πριν από λίγα λεπτά, τι μπορεί να εξηγήσει γιατί η αλλαγή α και β στο εσωτερικό της ανταλλαγής δεν έχει καμία επίδραση επί του x και y, παρόλο Πέρασα x και y για τη λειτουργία swap. Τι είναι η λέξη κλειδί εδώ ότι ίσως απλοϊκά εξηγήσει; Νομίζω ότι άκουσα εδώ; ΚΟΙΝΟ: Επιστροφή. ΟΜΙΛΗΤΗΣ 1: Επιστροφή; Δεν επιστρέφουν. Ας πάμε με ένα άλλο. Τι είναι αυτό; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Εντάξει, έτσι return-- θα μπορούσαμε να κάνουν δουλειά επιστροφή στην ιστορία, αλλά υπάρχει μια ακόμα πιο απλή εξήγηση. ΚΟΙΝΟ: Πεδίο εφαρμογής. ΟΜΙΛΗΤΗΣ 1: Πεδίο εφαρμογής. Θα πάρω το πεδίο εφαρμογής. Έτσι, το πεδίο εφαρμογής, θυμηθείτε όπου x και y μας δήλωσε. Είναι δηλώνονται μέσα των κύριων μέχρι εδώ. α και β, εν τω μεταξύ, είναι αποτελεσματικά δήλωσε στο εσωτερικό της ανταλλαγής, δεν είναι αρκετά σε τα άγκιστρα, αλλά ακόμα στην ευρύτερη περιοχή της ανταλλαγής. Και έτσι πράγματι, α και β υπάρχουν μόνο μέσα σε αυτό το δίσκο από Annenberg, αυτό δεύτερο κομμάτι του κώδικα. Έτσι, είμαστε πραγματικά αλλάζει το αντίγραφο, αλλά ότι δεν είναι πραγματικά όλα αυτά χρήσιμη. Έτσι, ας ρίξουμε μια ματιά στο αυτό λίγο χαμηλότερο επίπεδο. Πάω να πάει πίσω στο το Directory Πηγή, και θα πάω στην πρώτη μεγέθυνση εδώ, και μόνο να επιβεβαιώσει ότι είμαι σε αυτό μεγαλύτερο παράθυρο τερματικού, το πρόγραμμα είναι ακόμα συμπεριφέρονται έτσι. Ας υποθέσουμε τώρα ότι αυτό δεν είναι σκόπιμη. Σαφώς ήθελα ανταλλαγής με εργασίας, έτσι ώστε να αισθάνεται σαν ένα bug. Τώρα θα μπορούσα να ξεκινήσω την προσθήκη ενός Πολλοί printf για τον κωδικό μου, εκτύπωση x εδώ, y πάνω εδώ, μια εδώ, b εδώ. Αλλά ειλικρινά, αυτό είναι ίσως ό, τι έχετε κάνει για μια-δυο εβδομάδες τώρα, σε ώρες γραφείου και στο σπίτι κατά την εργασία για psets προσπαθεί να βρει κάποια σφάλματα. Αλλά θα δείτε, αν δεν το έχετε κάνει ήδη, ότι το πρόβλημα που έχετε εισάγει τρεις σε μια εντολή που ονομάζεται GDB, όπου GDB, GNU πρόγραμμα εντοπισμού σφαλμάτων, έχει η ίδια ένα σωρό χαρακτηριστικά που μπορούν πραγματικά να ας καταλάβουμε καταστάσεις όπως αυτό, αλλά πιο συναρπαστικά, να λύσει τα προβλήματα και να βρει bugs. Έτσι, Πάω να το κάνουμε αυτό. Αντί ./noswap, είμαι αντί πρόκειται να τρέξει GDB ./noswap. Με άλλα λόγια, Πάω να τρέξει μου πρόγραμμα δεν Bash, το νέο μας φίλο σήμερα. Πάω να τρέξει μου noswap πρόγραμμα μέσα από αυτό το άλλο πρόγραμμα που ονομάζεται GDB, το οποίο είναι ένα πρόγραμμα εντοπισμού σφαλμάτων, το οποίο Είναι ένα πρόγραμμα που έχει σχεδιαστεί για να βοηθήσει σας οι άνθρωποι να βρουν και να αφαιρέσετε σφάλματα. Έτσι, αν χτύπησα Τρέξτε εδώ, υπάρχει μια αποτρόπαια μέγεθος του κειμένου ότι ποτέ πραγματικά πρέπει να διαβάσετε. Είναι ουσιαστικά μια απόσπαση της προσοχής από τη γραμμή, η οποία Πάω να χτυπήσει Control-L να σηκωθεί στην κορυφή εκεί. Αυτή είναι η προτροπή GDB. Αν θέλετε να εκτελέσετε αυτό το πρόγραμμα τώρα, όπως αυτό το μικρό σκονάκι στη σημερινή slide προτείνει, Run είναι η πρώτη εντολές που θα σήμαινε για την εισαγωγή. Και είμαι απλώς πρόκειται να πληκτρολογήσετε τρέχει εδώ μέσα GDB, και μάλιστα έτρεξε το πρόγραμμά μου. Τώρα υπάρχει κάποια επιπλέον εξόδους της οθόνης, όπως αυτή, αλλά αυτό είναι GDB ακριβώς είναι πρωκτικό και μας λέει τι συμβαίνει. Μπορείτε πραγματικά δεν έχουν να ανησυχούν σχετικά με αυτές τις λεπτομέρειες τώρα. Αλλά αυτό που είναι πραγματικά δροσερό για GDB, αν το κάνω αυτό again-- Control-L καθαρίζει το screen-- επιτρέψτε μου να πάω μπροστά και τύπου "σπάσει κύρια," ως εκ τούτου, όταν πατήσετε το Enter, ρύθμιση τι είναι ονομάζεται ένα σημείο καμπής στην noswap.c, γραμμή 16, η οποία είναι όπου GDB καταλάβει το πρόγραμμά μου πραγματικότητα είναι η λειτουργία μου είναι στην πραγματικότητα. Αυτό θα αγνοήσει για τώρα αλλά αυτή είναι η διεύθυνση στη μνήμη ειδικώς από αυτή τη λειτουργία. Έτσι τώρα, όταν τύπο τρέξει, παρατηρήσετε τι είναι δροσερό εδώ. Το πρόγραμμά μου σπάει στη γραμμή I είπε GDB να διακόψετε την εκτέλεση σε. Γι 'αυτό δεν πρέπει να αλλάξει τώρα τον κωδικό μου, προσθέσετε κάποια printf, η ξαναμεταγλωττίσετε, επανάληψη αυτό, να αλλάξετε, να προσθέσετε κάποια printf του, αποθηκεύσετε, ξαναμεταγλωττίσετε, να τρέξει. Μπορώ απλά να περπατήσετε μέσα από το πρόγραμμά μου βήμα προς βήμα με βήμα στο ανθρώπινο ταχύτητα, όχι σε Intel-μέσα είδος της ταχύτητας. Έτσι, σήμερα παρατηρούμε αυτή τη γραμμή Εμφανίζεται εδώ, και αν πάω πίσω στο πρόγραμμά μου στο gedit, παρατηρήσετε ότι είναι στην πραγματικότητα η πρώτη γραμμή του κώδικα. Υπάρχει γραμμή 16 στο gedit. Υπάρχει γραμμή 16 εντός GDB, και ακόμη αν και αυτό το μαύρο και άσπρο διεπαφή δεν είναι σχεδόν τόσο χρήστη φιλικό, αυτό σημαίνει ότι η γραμμή 16 δεν έχει εκτελεστεί ακόμα, αλλά είναι για να είναι. Έτσι, πράγματι, αν πληκτρολογήσετε εκτύπωση x, δεν printf, μόνο print x, Παίρνω κάποια ψευδή αξία εκεί από το μηδέν, επειδή το x δεν έχει προετοιμαστεί ακόμα. Έτσι, Πάω να πληκτρολογείτε την επόμενη, ή, αν θέλουν να είναι φανταχτερό, μόνο n για την επόμενη. Αλλά όταν τύπο επόμενη εισέλθουν, τώρα παρατηρήσετε ότι προχωρά στην γραμμή 17. Έτσι, λογικά, αν έχω εκτελεστεί γραμμή 16 και πλέον πληκτρολογήστε print x, τι πρέπει να δω; Ένα. Και τώρα αυτό είναι ομολογουμένως σύγχυση. $ 2 είναι ακριβώς ένα φανταχτερό τρόπο, αν θέλω να αναφερθώ σε αυτή την τιμή αργότερα, μπορείτε να πείτε "δολάριο υπογράψει δύο." Είναι σαν ένα back reference. Αλλά για τώρα, απλά αγνοήστε το. Αυτό που είναι ενδιαφέρον είναι ό, τι είναι σχετικά με το δικαίωμα του ίσον. Και τώρα αν πληκτρολογήσετε την επόμενη φορά και εκτύπωση y, θα πρέπει να δείτε 2. Μπορώ επίσης να εκτυπώσετε τώρα x και πάλι, και ειλικρινά, αν έχω πάρει μια μικρή σύγχυση ως προς το όπου είμαι, μπορώ να πληκτρολογήσετε λίστα για τη λίστα και μόλις δείτε κάποιο πλαίσιο γύρω το σημείο είμαι πραγματικά σε. Και τώρα μπορώ να πληκτρολογήσετε επόμενο, και υπάρχει και το x είναι 1. Τώρα πληκτρολογήστε το επόμενο. Ω, y είναι 2. Και πάλι, αυτό είναι συγκεχυμένη, λόγω εξόδου GDB του είναι να αναμιχθούν με τη δική μου παραγωγή. Αλλά αν έχετε κατά νου, από ρίχνοντας μια ματιά πίσω και εμπρός σε κωδικό σας ή τον έξω πλευρά από την πλευρά ίσως, εσείς θα δείτε ότι πραγματικά είμαι απλά ενίσχυση μέσω του προγράμματος μου. Αλλά παρατηρήστε τι θα συμβεί στη συνέχεια, κυριολεκτικά. Εδώ η γραμμή 22. Επιτρέψτε μου να πάει πέρα ​​από αυτό, έτσι κινείται έως 23, και αν μπορώ να εκτυπώσω x σήμερα, ακόμα μία. Και αν y εκτυπώσετε τώρα, ακόμα ένα. Έτσι, αυτό δεν είναι μια χρήσιμη άσκηση. Οπότε ας ξανακάνει αυτό. Επιτρέψτε μου να πάει πίσω μέχρι το κορυφή και τον τύπο τρέχει και πάλι. Και αυτό λέει το πρόγραμμα ότι είναι να διορθωθεί έχει ήδη ξεκινήσει, ξεκινήσει από την αρχή. Ναι, ας κάνουμε αυτό και πάλι. Και αυτή τη φορά, ας κάνουμε στη συνέχεια, δίπλα, δίπλα, δίπλα, δίπλα, αλλά τώρα τα πράγματα γίνονται ενδιαφέροντα. Τώρα θέλω να μπω swap, έτσι δεν πληκτρολογείτε την επόμενη. I πληκτρολογήστε το βήμα, και σήμερα παρατηρούμε ότι Μου έχει πήδηξε στη γραμμή noswap.c 33. Αν πάω πίσω στο gedit, τι γραμμή 33; Αυτή είναι η πρώτη πραγματική γραμμή κώδικα στο εσωτερικό του swap. Ποια είναι ωραίο, γιατί τώρα μπορώ το είδος των σακί γύρω και να πάρει περίεργη ως προς το τι συμβαίνει πραγματικά εκεί. Επιτρέψτε μου να εκτυπώσετε tmp. Πω πω. Γιατί δεν tmp έχουν κάποια τρελό, ψεύτικο αξία σκουπίδια; ΚΟΙΝΟ: Δεν έχει αρχικοποιηθεί. ΟΜΙΛΗΤΗΣ 1: Δεν έχει αρχικοποιηθεί. Και πράγματι, όταν εκτελείτε ένα πρόγραμμα, σας δίνεται ένα σωρό της μνήμης από το λειτουργικό σύστημα, αλλά θα δεν έχουν προετοιμαστεί οποιεσδήποτε αξίες, έτσι ώστε ό, τι bits είστε βλέπουμε εδώ, ακόμα κι αν είναι αυτό το τρελό μεγάλο αρνητικό τον αριθμό, σημαίνει απλά ότι αυτά είναι τα απομεινάρια από κάποια προηγούμενη χρήση αυτής της μνήμης RAM, ακόμα κι αν δεν έχουν ο ίδιος χρειαζόταν ακόμα. Έτσι τώρα είμαι πρόκειται να πάει μπροστά και τον τύπο επόμενο, και αν μπορώ τώρα να πληκτρολογήσουν tmp εκτύπωσης, τι πρέπει να δω; Όποια και αν είναι η αξία του ενός ήταν, a είναι το πρώτο επιχείρημα, απλά όπως x ήταν η πρώτη πράγμα που πέρασε σε, έτσι, ένα και το χ θα πρέπει να είναι η ίδια, έτσι εκτύπωση tmp θα μου εκτυπώσετε ένα. Έτσι, αυτό που θα δείτε στο σύνολο προβλήματος τρία είναι ένα φροντιστήριο των ειδών για GDB, αλλά συνειδητοποιούν ότι αυτή είναι η αρχή από ένα βλέμμα σε ένα εργαλείο που θα πραγματικά να σας βοηθήσει να λύσει τα προβλήματα πολύ πιο αποτελεσματικά. Τι είμαστε τελικά πρόκειται να κάνει την Τετάρτη έχει αρχίσει να ξεφλουδίζει πίσω μερικά στρώματα και αφαιρέστε κάποιες βοηθητικές ρόδες. Αυτό το πράγμα που ονομάζεται συμβολοσειρά που έχουμε χρησιμοποιήσει για κάποιο χρονικό διάστημα, θα πάμε για να πάρει σιγά-σιγά ότι μακριά από εσάς και να αρχίσουμε να μιλάμε για κάτι περισσότερο esoterically γνωστό ως char *, αλλά θα πάμε να κάνουμε αυτό το ωραίο και απαλά στην αρχή, αν και δείκτες, όπως και αν ονομάζεται, μπορεί να κάνει κάποιες πολύ άσχημα πράγματα, αν γίνεται κατάχρηση, κοιτάζοντας λίγο πλαστελίνης από ο φίλος μας ο Nick Parlante από Stanford Πανεπιστημίου, καθηγητής στον υπολογιστή επιστήμης, που μαζί αυτό προεπισκόπηση από ό, τι είναι να έρθει αυτή την Τετάρτη. [VIDEO PLAYBACK] Γεια σου, Binky. Ξυπνήστε. Ήρθε η ώρα για το δείκτη διασκέδαση. Τι είναι αυτό; Μάθετε σχετικά με τους δείκτες; Ω, ωραία! [ΤΕΛΟΣ VIDEO PLAYBACK] ΟΜΙΛΗΤΗΣ 1: Αυτό σας περιμένει την Τετάρτη. Θα σας δούμε στη συνέχεια. [VIDEO PLAYBACK] -Και Τώρα, Deep Σκέψεις, από Daven Farnham. Γιατί είμαστε εκμάθηση C; Γιατί να μην A +; [Γέλια] [ΤΕΛΟΣ VIDEO PLAYBACK]