1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Woche 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Dies ist CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Gut. Willkommen zurück. Dies ist CS50, und dies ist der Beginn der 7. Woche. 5 00:00:12,280 --> 00:00:14,690 Ein paar kleine Meldungen: 6 00:00:14,690 --> 00:00:18,150 Pset5 ist nun im Gange oder werden bald sein, 7 00:00:18,150 --> 00:00:21,590 und lassen Sie mich sagen, ganz ehrlich, bedeutet dies tendenziell unter den schwieriger sein 8 00:00:21,590 --> 00:00:24,460 des Kurses das Problem Sätze, so möchte ich erwähnen, das jetzt 9 00:00:24,460 --> 00:00:28,190 so dass in dieser Woche mehr denn je Sie nicht warten, bis, sagen wir, Mittwoch Abend 10 00:00:28,190 --> 00:00:29,920 oder Donnerstag Nacht zu tauchen in. 11 00:00:29,920 --> 00:00:32,369 Dies ist definitiv eine interessante pset. Wir denken, es macht Spaß. 12 00:00:32,369 --> 00:00:36,110 Wenn Sie tatsächlich bekommen völlig korrekt und kann dann fordern die sogenannten Big Board, 13 00:00:36,110 --> 00:00:39,830 Sie haben die Möglichkeit, Verstand mit einigen der natürlich die Mitarbeiter entsprechen 14 00:00:39,830 --> 00:00:41,620 und einige von deinen Klassenkameraden. 15 00:00:41,620 --> 00:00:44,670 What The Big Board ist, wenn Sie Ihre Rechtschreibprüfung gearbeitet haben, 16 00:00:44,670 --> 00:00:48,860 Sie werden in der Lage zu cs50.net nach Ausführung eines Befehls zu gehen, 17 00:00:48,860 --> 00:00:52,430 rein in entscheiden, und dann wird die Menge an Zeit und die Menge an RAM und 18 00:00:52,430 --> 00:00:56,130 dass Sie in Ihrer Implementierung verwendet wird hier auf den Kurs der Homepage zu sehen sein. 19 00:00:56,130 --> 00:00:59,740 Sie werden feststellen, dass eine ganze Reihe von diesen Leuten hier als Mitarbeiter aufgeführt sind 20 00:00:59,740 --> 00:01:04,220 Seit über das Wochenende, dachte das Personal, es wäre lustig, um zu versuchen, sich gegenseitig zu übertrumpfen. 21 00:01:04,220 --> 00:01:07,390 So klar, dass hier das Ziel nicht darin, die Mitarbeiter zu übertreffen. 22 00:01:07,390 --> 00:01:09,790 Auch ich bin nur hier auf Nummer 13. 23 00:01:09,790 --> 00:01:13,790 Rein entscheiden, aber es ist eine Gelegenheit, um zu sehen, wie wenig RAM 24 00:01:13,790 --> 00:01:16,790 und wie wenige CPU Sekunden können Sie vis-a-vis einige Ihrer Klassenkameraden zu verwenden. 25 00:01:16,790 --> 00:01:20,540 >> Und ich gebe zu, dass Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 derzeit in Nummer 1 Position als einer der TFs, 27 00:01:23,750 --> 00:01:28,120 Dies ist eine Implementierung, die wir als nicht möglich 28 00:01:28,120 --> 00:01:32,700 gegeben, dass er mit fast 0 RAM und fast 0 Sekunden zum Laden. 29 00:01:32,700 --> 00:01:35,670 Also werden wir kümmern uns um Kevin offline. [Gelächter] 30 00:01:35,670 --> 00:01:40,950 Es gibt bestimmte Fähigkeiten, die Kevin wird auf die Probe setzen hier. 31 00:01:40,950 --> 00:01:45,280 Eines der Dinge, die wir dachten, wir würden es auch tun jetzt CS50x ist eine Woche im Gange, 32 00:01:45,280 --> 00:01:49,520 und ihr seid genauso ein Teil dieses Experiments, wie diese Schüler sind. 33 00:01:49,520 --> 00:01:53,720 Wir haben sie als Teil ihrer pset0 gebeten, das war ähnlich wie ein Scratch Projekt einreichen 34 00:01:53,720 --> 00:01:58,280 für sie von Interesse - ein Spiel, ein interaktives Kunstwerk, eine Animation oder dergleichen - 35 00:01:58,280 --> 00:02:03,700 eine 1 - bis 2-Minuten-Video, wenn sie möchten, sagen hallo zur Welt und wer sie wirklich sind. 36 00:02:03,700 --> 00:02:06,780 Ich dachte, ich würde mit Ihnen teilen nur ein paar der Videos, die eingereicht wurden bisher 37 00:02:06,780 --> 00:02:10,759 weil es für uns auf der Personal mindestens, ist es wirklich war spannend 38 00:02:10,759 --> 00:02:14,220 und inspirierend, diese Leute aus der ganzen Welt zu sehen - Länder auf der ganzen Welt - 39 00:02:14,220 --> 00:02:18,160 Tuning in, aller Dinge, zu einem Computer Wissenschaft natürlich auf dem Internet, 40 00:02:18,160 --> 00:02:20,410 sei es, weil sie ihre eigenen Studien fortsetzen wollen, 41 00:02:20,410 --> 00:02:22,300 sie wollen ihre Karriere in eine neue Richtung, 42 00:02:22,300 --> 00:02:24,390 sie wollen, um Lücken im eigenen Wissen zu füllen, 43 00:02:24,390 --> 00:02:27,190 so dass einige der aus den gleichen Gründen, die euch vielleicht hier gewesen. 44 00:02:27,190 --> 00:02:31,090 >> So gebe ich Ihnen eine solche Studenten hier. Man könnte die Lautstärke zu erhöhen gerade ein wenig. 45 00:02:31,090 --> 00:02:35,520 Hier ist einer unserer Schüler 1-Minuten Einreichungen. 46 00:02:35,520 --> 00:02:40,380 Hallo, Welt. Ich bin ein Student des Wirtschaftsingenieurwesens hier in Malaga, Spanien. 47 00:02:40,380 --> 00:02:45,840 Ich freue mich über dieses Online-Kurses aufgeregt, weil ich Informatik lieben, tue ich wirklich, 48 00:02:45,840 --> 00:02:48,880 und ich wirklich zu schätzen, dass ich sie zu erforschen bekommen. 49 00:02:48,880 --> 00:02:51,940 Und die Tatsache, dass ich die gleiche alle von euch tun zu lernen 50 00:02:51,940 --> 00:02:57,040 aber anstatt in Harvard Ich bin in Malaga, wie geil ist das denn? 51 00:02:57,040 --> 00:03:02,040 Nun, ich bin Fernando, und das ist CS50. See you guys. 52 00:03:02,040 --> 00:03:07,100 [Gelächter] Ein weiterer Clip wir besonders magst, wirst du feststellen, dass dieses Herrn Englisch ist nicht so stark. 53 00:03:07,100 --> 00:03:11,520 Es sieht aus wie er es maschinell übersetzt hatte, so dass die Übersetzungen selbst sind ein bisschen unvollkommen, 54 00:03:11,520 --> 00:03:15,790 aber dies war einer unserer Favoriten bisher als gut. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Hallo, Welt. [Spricht in Japanese] 57 00:03:32,370 --> 00:03:39,830 [Ich habe auf Japanisch grüßen, weil mein Englisch ist sehr unzuverlässig.] 58 00:03:39,830 --> 00:03:45,380 [Ich habe die Nachricht an Sie geliefert von der Stadt Gifu, Japan.] 59 00:03:45,380 --> 00:03:49,820 [I kann ein Student zum ersten Mal in 20 Jahren, wie man sehen kann.] 60 00:03:49,820 --> 00:03:54,640 [Ich bin sehr dankbar, Harvard University, die mir diese Gelegenheit und EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf ist eine Gitarre und mein Favorit, was läuft.] [Gelächter] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Warum denken Sie, ich habe versucht, eine cs50x teilzunehmen.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, ist es meine Sehnsucht.] 65 00:04:14,990 --> 00:04:19,740 [Vor allem, wenn ich entfernte Präsenz in Japan gelebt.] 66 00:04:19,740 --> 00:04:26,680 [Ich wollte versuchen, sofort Kenntnis von der Existenz solcher EDX wann.] 67 00:04:26,680 --> 00:04:32,500 [Glaubst du nicht, so dass Sie nicht auf das Alter des Lernens I. verwandt] 68 00:04:32,500 --> 00:04:38,350 [CS50 ist meine Sehnsucht. Mein Name ist Kazu, und dies ist CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [Applaus und Jubel] 70 00:04:43,090 --> 00:04:49,220 Ein weiterer Favorit von uns war diese Unterwerfung hier von jemandem. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google, wenn Sie nicht mit diesem meme sind. 72 00:04:55,380 --> 00:05:01,480 >> Und dann schließlich noch ein paar andere, die geschrieben, dass vielleicht gewinnen adorable Auszeichnung bekam. 73 00:05:01,480 --> 00:05:06,820 [Schüler] Aww! >> [Malan] Wir müssen zuhören. Dies ist so kurz, genau zuhören. 74 00:05:08,580 --> 00:05:11,150 [Sprecherin] Was ist dein Name? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Sprecherin] Was ist das? >> [Kichert] CS50. [Gelächter] 76 00:05:16,120 --> 00:05:19,510 [Malan] Er hat zwei Takes, though. 77 00:05:19,510 --> 00:05:22,240 Hier gehen wir, die letzte. 78 00:05:23,030 --> 00:05:26,980 Mein Name ist Louie, und dies ist CS50. 79 00:05:26,980 --> 00:05:30,250 [Gelächter] Das ist dann CS50x. 80 00:05:30,250 --> 00:05:33,230 Vielen Dank an alle diejenigen unter Ihnen, während nach zusammen zu Hause 81 00:05:33,230 --> 00:05:35,620 die wurden bisher Teilhabe. 82 00:05:35,620 --> 00:05:39,510 Heute schließen wir unsere Diskussion von Datenstrukturen, 83 00:05:39,510 --> 00:05:41,160 wenigstens einige der grundlegenden, 84 00:05:41,160 --> 00:05:44,760 und dann werden wir weiterhin unser Gespräch über HTML und Web-Programmierung. 85 00:05:44,760 --> 00:05:48,520 In der Tat haben wir die Vergangenheit verbrachte einige 7 Wochen Blick auf die Grundlagen der Programmierung - 86 00:05:48,520 --> 00:05:50,450 Algorithmen, Datenstrukturen und dergleichen - 87 00:05:50,450 --> 00:05:53,050 und C, wie Sie vielleicht bisher erlebt haben, 88 00:05:53,050 --> 00:05:57,060 ist nicht unbedingt die am besten zugänglichen Sprachen 89 00:05:57,060 --> 00:05:59,090 mit denen einige dieser Ideen umzusetzen. 90 00:05:59,090 --> 00:06:01,880 Und so beginnt diese Woche und nächste Woche und dann die folgenden, 91 00:06:01,880 --> 00:06:07,110 wir werden schließlich in der Lage sein, den Übergang von C, das in der Regel als relativ niedrig-Level-Sprache bekannt ist, 92 00:06:07,110 --> 00:06:11,190 Dinge höheren Ebene, unter ihnen PHP, JavaScript, und dergleichen, 93 00:06:11,190 --> 00:06:14,850 die zeichnen wir auf die gleichen Lektionen, die wir in den vergangenen Wochen gelernt zu sehen, 94 00:06:14,850 --> 00:06:19,430 aber du wirst feststellen, dass erklärt Dinge wie Arrays und Hash-Tabellen und Such-und Sortierfunktionen 95 00:06:19,430 --> 00:06:23,370 so viel leichter, weil die Sprachen selbst beginnen wir dann mit 96 00:06:23,370 --> 00:06:25,290 wird stärker. 97 00:06:25,290 --> 00:06:27,410 Aber zuerst, eine Anwendung von Bäumen. 98 00:06:27,410 --> 00:06:30,240 Es ist sehr häufig in diesen Tagen brauchen, um zu komprimieren. 99 00:06:30,240 --> 00:06:34,770 In welchem ​​Zusammenhang würden Sie wollen, um irgendeine Art von digitalen Informationen zu komprimieren? 100 00:06:37,190 --> 00:06:39,670 >> Yeah. >> [Schüler] Wenn Sie es über das Web senden müssen. 101 00:06:39,670 --> 00:06:41,450 Ja, wenn Sie etwas über das Web senden möchten. 102 00:06:41,450 --> 00:06:44,950 Wenn Sie eine große Datei herunterladen möchten, ist es ideal, wenn jemand am anderen Ende 103 00:06:44,950 --> 00:06:48,760 komprimiert wurde diese Datei mit einem ZIP-Format oder so ähnlich 104 00:06:48,760 --> 00:06:53,760 so dass Sie senden weniger Bits als sonst übermittelt werden könnten. 105 00:06:53,760 --> 00:06:55,500 So wie Sie komprimieren Informationen? 106 00:06:55,500 --> 00:07:00,540 Es läuft alles auf die Verwendung von weniger Bits als Standardmäßig sind erforderlich. 107 00:07:00,540 --> 00:07:03,220 Aber dies ist eine Art seltsame Sache, weil denken Sie zurück an den Wochen 0 und 1 108 00:07:03,220 --> 00:07:07,370 wenn wir sprachen über ASCII-und Binär und wir sprachen über ASCII insbesondere 109 00:07:07,370 --> 00:07:10,690 wie mit 8 Bits Buchstaben des Alphabets darstellen 110 00:07:10,690 --> 00:07:16,120 so dass der Buchstabe A durch 65 dargestellt wird, Kleinbuchstaben a die Zahl 97, 111 00:07:16,120 --> 00:07:21,210 und wie Sie repräsentieren die 65 oder 97, du bist mit 7 oder 8 Bit. 112 00:07:21,210 --> 00:07:24,120 Aber der Haken ist, dass es einige Buchstaben des englischen Alphabets 113 00:07:24,120 --> 00:07:26,230 die nicht so populär wie andere. 114 00:07:26,230 --> 00:07:31,600 Z ist gar nicht so beliebt, Q ist gar nicht so beliebt, aber A und E sind super beliebt. 115 00:07:31,600 --> 00:07:37,280 Und doch für alle diese Briefe, die standardmäßig die Welt nutzt die gleiche Anzahl von Bits, nur 8. 116 00:07:37,280 --> 00:07:42,690 So wäre es nicht klüger gewesen, wenn statt mit 8 Bit für jeden Buchstaben, 117 00:07:42,690 --> 00:07:47,440 selbst die selten wie Q und Z verwendet, 118 00:07:47,440 --> 00:07:51,910 was, wenn wir verwendet weniger Bits für A und E und S und den beliebtesten Briefe 119 00:07:51,910 --> 00:07:55,000 und verwendet mehr Bits für die weniger populären Buchstaben, 120 00:07:55,000 --> 00:07:57,770 die Idee ist, lasst uns optimieren für den üblichen Fall, 121 00:07:57,770 --> 00:08:01,160 das ist ein Thema in der Informatik zu versuchen, zu optimieren, was los ist, um das Beste geschehen 122 00:08:01,160 --> 00:08:05,310 und verbringen Sie ein wenig mehr Zeit, ein wenig mehr Platz auf die Dinge, die, ja, kann passieren, 123 00:08:05,310 --> 00:08:07,680 aber nicht unbedingt so häufig. 124 00:08:07,680 --> 00:08:09,330 Also lasst uns ein Beispiel nehmen. 125 00:08:09,330 --> 00:08:12,610 >> Angenommen, dass wir Informationen ziemlich effizient kodieren wollen. 126 00:08:12,610 --> 00:08:15,090 Sie können bis gewachsen zu wissen ein bisschen etwas über Morse-Code, 127 00:08:15,090 --> 00:08:17,450 und Chancen sind Sie nicht wissen, den eigentlichen Code, 128 00:08:17,450 --> 00:08:21,750 aber vielleicht daran erinnern, dass es zumindest diese Serie von Punkten und Strichen ist. 129 00:08:21,750 --> 00:08:26,640 Dies ist eine ziemlich effiziente Codierung, und beachten Sie, dass die beliebtesten Brief - zum Beispiel E - 130 00:08:26,640 --> 00:08:28,980 wird mit der kürzesten von Signaltönen. 131 00:08:28,980 --> 00:08:31,740 Morse-Code ist alles über piep-piep-piep-piep-piep-piep und Halten Tönen 132 00:08:31,740 --> 00:08:34,799 entweder für kurze Zeiträume oder lange Zeiträume. 133 00:08:34,799 --> 00:08:40,330 E, wie durch den Punkt bezeichnet, ist ein super kurzer Signalton, nur Piepton, und das wäre E. stellen 134 00:08:40,330 --> 00:08:43,960 Im Gegensatz dazu würde T einen längeren Piepton, wie beep [verlängert Sound] 135 00:08:43,960 --> 00:08:45,710 und das wäre stellen T. 136 00:08:45,710 --> 00:08:48,840 Aber das ist immer noch ziemlich kurz, weil im Gegensatz dazu, wenn Sie bei Z schauen, 137 00:08:48,840 --> 00:08:52,690 bis Z ausdrücken würden Sie piep, piep [mehr sound], piep, piep [kürzeren Ton] zu gehen. 138 00:08:52,690 --> 00:08:55,360 So ist es mehr, weil es weniger verbreitet ist. 139 00:08:55,360 --> 00:08:58,150 Aber die gotcha hier ist, dass Morse Code ein bisschen fehlerhaft ist 140 00:08:58,150 --> 00:09:00,610 in, dass es nicht sofort dekodiert. 141 00:09:00,610 --> 00:09:07,350 Zum Beispiel: Angenommen, Sie auf einige Ende des Drahtes Piepton zu hören [kurz], beep [lang]. 142 00:09:07,350 --> 00:09:12,480 Welche Botschaft habe ich gerade erhalten? Ein Punkt und ein Strich. Was bedeutet das darstellen? 143 00:09:12,480 --> 00:09:15,330 [Schüler] A. >> [Malan] Vielleicht. 144 00:09:15,330 --> 00:09:18,270 Es könnte auch E von T. gefolgt 145 00:09:18,270 --> 00:09:23,390 Mit anderen Worten, Morsecode, obwohl es nutzt das Prinzip der Optimierung der Ecke Fall 146 00:09:23,390 --> 00:09:26,250 Es eignet sich nicht zur sofortigen Dekodierbarkeit. 147 00:09:26,250 --> 00:09:29,850 Das heißt, der Mensch, Hören oder empfängt diese Punkte und Striche 148 00:09:29,850 --> 00:09:34,540 muss irgendwie herausfinden, wo die Pausen zwischen den Buchstaben sind, 149 00:09:34,540 --> 00:09:39,660 denn wenn Sie nicht wissen, wo diese Pausen sind, können Sie A für ET oder umgekehrt zu verwirren. 150 00:09:39,660 --> 00:09:43,880 >> Also, was können Sie tun? In Morsecode Sie könnten nur Pause zwischen den einzelnen Buchstaben. 151 00:09:43,880 --> 00:09:47,660 Aber Pause ist eine Art gegen die springende Punkt bei der Beschleunigung Dinge. 152 00:09:47,660 --> 00:09:52,880 So was, wenn wir stattdessen kam mit einem Code, wo es war nicht diese schlechte Situation 153 00:09:52,880 --> 00:09:56,570 wobei E ein Präfix, zum Beispiel von A - 154 00:09:56,570 --> 00:10:00,020 in anderen Worten, wenn wir dafür sorgen, dass die Muster noch für die beliebten Briefe kurzen 155 00:10:00,020 --> 00:10:04,850 lang für die weniger populären Buchstaben, aber es gibt keine mögliche Verwirrung? 156 00:10:04,850 --> 00:10:08,930 Ein Mann mit dem Namen Huffman Jahren erfunden dieses System mit der Bezeichnung Huffman-Kodierung 157 00:10:08,930 --> 00:10:12,390 das tatsächlich nutzt eine der Datenstrukturen wir ein bisschen Zeit damit verbracht habe reden 158 00:10:12,390 --> 00:10:16,560 in der vergangenen Woche, das von Bäumen, binären Bäumen, die speziell - 159 00:10:16,560 --> 00:10:19,710 ein binärer Baum bedeutet, dass es nicht mehr als zwei Kinder. 160 00:10:19,710 --> 00:10:22,720 Es hat vielleicht eine linke Kind, vielleicht ein rechtes Kind, und das ist es. 161 00:10:22,720 --> 00:10:26,510 Also nur für der Diskussion willen annehmen, dass jemand eine Nachricht senden möchte 162 00:10:26,510 --> 00:10:31,270 das sieht wie folgt aus. Es ist völliger Unsinn, aber es ist von As zusammengesetzt, Bs, Cs, Ds und Es. 163 00:10:31,270 --> 00:10:34,890 Und wenn Sie tatsächlich aufwärts zählen alle As, Bs, Cs, Ds und Es 164 00:10:34,890 --> 00:10:36,870 und dann durch die Gesamtanzahl von Buchstaben zu unterteilen, 165 00:10:36,870 --> 00:10:42,710 Diese kleine Tabelle sagt hier, dass 45% der Briefe Es sind 20% As, 166 00:10:42,710 --> 00:10:45,010 10% B, und so fort. 167 00:10:45,010 --> 00:10:47,330 Also mit anderen Worten davon aus, dass die Zeichenfolge in Anführungszeichen gibt 168 00:10:47,330 --> 00:10:49,080 ist nur einige Nachricht, die Sie senden möchten. 169 00:10:49,080 --> 00:10:52,180 Es passiert Unsinn nur so können wir so wenige Briefe wie möglich zu nutzen, 170 00:10:52,180 --> 00:10:55,220 aber es ist in der Tat der Fall, daß E die beliebteste bleibt, 171 00:10:55,220 --> 00:11:01,450 und B und C sind die am wenigsten beliebt, zumindest diese 5 Buchstaben des Alphabets. 172 00:11:01,450 --> 00:11:04,040 Wie können wir also zu kommen mit einer Codierung gehen, 173 00:11:04,040 --> 00:11:08,430 eine binäre Codierung, ein Muster von 0 und 1 für jeden dieser Briefe 174 00:11:08,430 --> 00:11:14,820 derart, daß E eine kurze Muster ist und vielleicht B und C sind etwas länger Mustern, 175 00:11:14,820 --> 00:11:19,270 wieder, dass die Idee, dass wir mit weniger Bits meiste Zeit wollen 176 00:11:19,270 --> 00:11:21,790 und mehr Bits nur einmal in eine Weile. 177 00:11:21,790 --> 00:11:26,070 Nach Huffman-Kodierung, können Sie einen Wald von Bäumen. 178 00:11:26,070 --> 00:11:31,190 Es ist eine Art von Story hier, dass beinhaltet Bäumen und auch den Prozess des Aufbaus sie. 179 00:11:31,190 --> 00:11:32,420 Lassen Sie uns beginnen. 180 00:11:32,420 --> 00:11:36,140 >> Ich schlage vor, dass Sie mit diesem Wald beginnen, so zu sprechen, von 5 Bäume, 181 00:11:36,140 --> 00:11:38,260 von denen jeder eine ziemlich dumme Baum. 182 00:11:38,260 --> 00:11:42,800 Der Baum wird von nur einem einzigen Knoten, wie hier durch einen Kreis dargestellt zusammengesetzt. 183 00:11:42,800 --> 00:11:45,310 So jedes dieser Dinge könnte eine C-Struktur sein, 184 00:11:45,310 --> 00:11:50,200 und im Inneren des C-Struktur kann ein Schwimmer, der die Frequenzzähleinrichtung sein 185 00:11:50,200 --> 00:11:52,510 und dann vielleicht ein char repräsentiert den Brief. 186 00:11:52,510 --> 00:11:56,470 So dieser Knoten denken, wie irgendein alter C struct, aber für jetzt, höheren Niveau. 187 00:11:56,470 --> 00:12:01,230 Dies ist ein Wald von 5 Bäume je, wer nur einen einzigen Knoten. 188 00:12:01,230 --> 00:12:06,830 Was Huffman vorgeschlagene ist, dass wir diese Bäume zu kombinieren starten 189 00:12:06,830 --> 00:12:11,140 , die die kleinsten Häufigkeiten haben in etwas größere Bäume 190 00:12:11,140 --> 00:12:13,490 indem Sie sie mit einem neuen Root-Knoten. 191 00:12:13,490 --> 00:12:17,560 So unter den Buchstaben hier bemerken, dass für die Bequemlichkeit Ich habe sie von links nach rechts sortiert, 192 00:12:17,560 --> 00:12:21,420 aber das ist nicht unbedingt notwendig, und beachten Sie, dass die kleinsten Knoten 193 00:12:21,420 --> 00:12:23,930 sind derzeit 10% und 10%. 194 00:12:23,930 --> 00:12:28,940 So Huffman vorgeschlagen, dass wir die 2 kleinsten Knoten verschmelzen zu einem neuen Baum 195 00:12:28,940 --> 00:12:34,450 durch die Einführung eines neuen übergeordneten Knoten und dann geben, dass Eltern eine linke Kind und ein rechtes Kind 196 00:12:34,450 --> 00:12:37,720 wobei B beliebig die linke und C ist der rechte beliebig. 197 00:12:37,720 --> 00:12:41,590 Und dann Huffman ferner vorgeschlagen, der uns jetzt nur noch der linke Kind denken, 198 00:12:41,590 --> 00:12:44,790 in einem dieser Bäume immer als durch 0 199 00:12:44,790 --> 00:12:47,890 und das rechte Kind immer als durch die Zahl 1 repräsentiert. 200 00:12:47,890 --> 00:12:50,680 >> Es spielt keine Rolle, wenn man sie drehen so lange, wie Sie konsistente sind. 201 00:12:50,680 --> 00:12:54,650 So, jetzt haben wir vier Bäume in diesem Wald. 202 00:12:54,650 --> 00:12:58,050 Und ich sage vier, weil jetzt der Baum auf der linken Seite - 203 00:12:58,050 --> 00:13:00,570 und es ist nicht so sehr ein Baum in dem Sinne, dass es auf diese Weise wächst, 204 00:13:00,570 --> 00:13:05,170 es ist mehr wie eine Familie Baum, wo jetzt die 0,2 ist eine Art der Muttergesellschaft der beiden Kinder - 205 00:13:05,170 --> 00:13:07,930 feststellen, dass in diesem Elternteil haben wir 0,2 gezogen. 206 00:13:07,930 --> 00:13:13,370 Wir haben die Häufigkeiten der beiden Kinder aufgenommen und in Anbetracht der neuen Knoten die Summe. 207 00:13:13,370 --> 00:13:15,310 So jetzt müssen wir nur wiederholen Sie diesen Vorgang. 208 00:13:15,310 --> 00:13:19,490 Finden Sie die beiden kleinsten Knoten und dann kommen sie in einen neuen Baum 209 00:13:19,490 --> 00:13:21,380 und wiederholen Sie den Vorgang weiter. 210 00:13:21,380 --> 00:13:26,390 Im Moment haben wir ein paar Kandidaten, 20%, 15% und weitere 20%. 211 00:13:26,390 --> 00:13:29,780 In diesem Fall haben wir die Krawatte zu brechen. Wir können es beliebig. 212 00:13:29,780 --> 00:13:31,540 Wir sollten es einfach tun konsequent. 213 00:13:31,540 --> 00:13:33,760 In diesem Fall werde ich willkürlich mit der auf der linken Seite, 214 00:13:33,760 --> 00:13:39,880 und ich habe jetzt verschmelzen die 20% und die 15%, um mir eine neue Muttergesellschaft namens 35%, 215 00:13:39,880 --> 00:13:46,310 deren linke Kind ist 0, deren rechte Kind ist 1, und jetzt haben wir nur drei Bäume im Wald. 216 00:13:46,310 --> 00:13:47,960 Sie können vielleicht sehen, wohin das führt. 217 00:13:47,960 --> 00:13:51,150 Wenn wir das ein paar Mal wiederholen, werden wir nur einen größeren Baum haben, 218 00:13:51,150 --> 00:13:53,900 deren sämtliche Kanten sind mit 0 und 1 bezeichnet. 219 00:13:53,900 --> 00:13:55,710 Lassen Sie es wieder tun. 220 00:13:55,710 --> 00:14:02,600 35% ist der Baum der Wurzel. 20% und 45%, so werden wir die 35% und 20% zu verschmelzen. 221 00:14:02,600 --> 00:14:05,610 Jetzt haben wir diesen Baum hier. Wir fügen diese zusammen, wir haben 55%. 222 00:14:05,610 --> 00:14:07,910 Jetzt gibt es nur noch zwei Bäume im Wald. 223 00:14:07,910 --> 00:14:11,900 Wir tun dies, ein letztes Mal, und hoffentlich mathematisch alle Frequenzen summieren 224 00:14:11,900 --> 00:14:15,570 weil sie sollte, da wir sie aus berechnet der get-go, bis zu 100%. 225 00:14:15,570 --> 00:14:17,960 Und jetzt haben wir ein Baum. 226 00:14:17,960 --> 00:14:20,580 Dies ist also eine Huffman-Kodierung Baum. 227 00:14:20,580 --> 00:14:24,400 Es Art von dauerte eine Weile, bis es verbal zu bekommen, aber die Realität ist, mit einer for-Schleife 228 00:14:24,400 --> 00:14:27,620 oder mit einer rekursiven Funktion, könnte man diese Sache ziemlich schnell zu bauen. 229 00:14:27,620 --> 00:14:32,440 Deshalb haben wir jetzt ein neuer Knoten, und alle diese inneren Knoten wurden malloc'd, 230 00:14:32,440 --> 00:14:34,690 vermutlich auf dem Weg. 231 00:14:34,690 --> 00:14:38,650 So, jetzt an der Spitze dieses Baumes haben wir 100%, aber jetzt bemerken wir einen Pfad 232 00:14:38,650 --> 00:14:43,780 von dieser neuen Ur-Ur-Ur-Großeltern, um alle Ur-Ur-Ur-Enkel 233 00:14:43,780 --> 00:14:45,930 den ganzen Weg nach unten, um alle Blätter. 234 00:14:45,930 --> 00:14:52,840 >> Was wir jetzt tun vorzuschlagen, dass, um den Buchstaben E darstellen, 235 00:14:52,840 --> 00:14:55,670 Wir werden einfach die Nummer 1. Warum? 236 00:14:55,670 --> 00:15:01,000 Denn wenn wir durchqueren diesen Baum aus dem endgültigen root auf dem Blatt als E bekannt, 237 00:15:01,000 --> 00:15:06,050 Wir folgen nur einem Rand, der rechte Rand, und das ist natürlich oben rechts 1 bezeichnet. 238 00:15:06,050 --> 00:15:11,550 So die Implikation hier für Huffman war, dass E die Codierung in binärer wird nur 1 sein. 239 00:15:11,550 --> 00:15:14,490 Und das ist verdammt effizient. Kann nicht wirklich alle kleiner. 240 00:15:14,490 --> 00:15:18,350 Im Gegensatz dazu ist A werde vertreten sein, wenn Sie die Logik folgen, 241 00:15:18,350 --> 00:15:21,610 mit welchen Muster von Bits statt? 01. 242 00:15:21,610 --> 00:15:25,500 So, um A zu erhalten, beginnen wir an der Wurzel, und wir gehen links und dann gehen wir rechts, 243 00:15:25,500 --> 00:15:28,580 das heißt, wir folgte eine 0, dann a 1. 244 00:15:28,580 --> 00:15:32,810 So werden wir den Buchstaben A mit dem Muster 0 und 1 darstellen. 245 00:15:32,810 --> 00:15:36,010 Und jetzt stellen wir fest, haben bereits eine Eigenschaft der unmittelbaren Dekodierbarkeit 246 00:15:36,010 --> 00:15:38,090 dass wir nicht in Morse-Code. 247 00:15:38,090 --> 00:15:42,840 Obwohl diese beiden Muster recht kurz sind - E 1 Bit ist, A 2 Bits - 248 00:15:42,840 --> 00:15:45,080 feststellen, dass sie nicht die eine oder andere verwechselt werden, 249 00:15:45,080 --> 00:15:54,870 denn wenn man eine 1 siehe es hat ein E sein, wenn Sie sehen 0 then a 1 es offensichtlich bekam ist ein A sein 250 00:15:54,870 --> 00:15:58,410 Ebenso, was ist D? 001. 251 00:15:58,410 --> 00:16:01,440 Was ist C? 0001. 252 00:16:01,440 --> 00:16:05,320 Und was ist B? 0000. 253 00:16:05,320 --> 00:16:09,550 Und wieder, weil alle Briefe, die wir kümmern uns sind die Blätter 254 00:16:09,550 --> 00:16:13,890 und keiner von ihnen sind so eine Art Zwischenhändler auf dem Weg von der Wurzel bis Blatt, 255 00:16:13,890 --> 00:16:18,760 es gibt kein Risiko conflating 2 Buchstaben verschiedene Kodierungen 256 00:16:18,760 --> 00:16:22,300 da alle diese Bitmuster deterministisch sind. 257 00:16:22,300 --> 00:16:25,280 0000 wird immer B sein 258 00:16:25,280 --> 00:16:29,480 Es gibt kein Knoten irgendwo dazwischen, mit dem Sie einen Buchstaben für den anderen verwirren könnten. 259 00:16:29,480 --> 00:16:31,150 Also, was ist die Implikation hier? 260 00:16:31,150 --> 00:16:35,080 >> Das populärste Schreiben - in diesem Fall E - ist die kürzeste Codierung bekommen, 261 00:16:35,080 --> 00:16:37,430 A hat die nächste kürzeste Codierung bekommen, 262 00:16:37,430 --> 00:16:41,390 und B und C, die wir bereits aus der get-go waren irgendwie am wenigsten beliebten wusste, 263 00:16:41,390 --> 00:16:45,390 bei 10% Frequenz jeder, haben sie die längste Kodierung bekommen. 264 00:16:45,390 --> 00:16:49,410 Und was bedeutet dies nun, dass wenn Sie eine Nachricht, ist komprimiert senden 265 00:16:49,410 --> 00:16:51,950 über das Internet oder in einer Email oder dergleichen, 266 00:16:51,950 --> 00:16:56,730 anstatt Standard-ASCII, können Sie eine Huffman codierten Nachricht 267 00:16:56,730 --> 00:17:01,720 wobei, wenn Sie den Buchstaben E zu senden möchten, senden Sie einfach ein einzelnes Bit. 268 00:17:01,720 --> 00:17:05,680 Wenn Sie ein A senden möchten, senden Sie 2 Bits, 01, anstelle des Sendens 8 Bit 269 00:17:05,680 --> 00:17:10,190 gefolgt von weiteren 8 Bits durch weitere 8 Bits und so weiter folgen. 270 00:17:10,190 --> 00:17:11,940 Aber es ist ein gotcha hier. 271 00:17:11,940 --> 00:17:17,079 Es ist nicht ausreichend, einfach zu konstruieren diesen Baum und starten Sie dann das Senden von Alice zu Bob 272 00:17:17,079 --> 00:17:20,010 die kürzere Bit-Muster, Zeichenfolge aus ASCII, 273 00:17:20,010 --> 00:17:23,140 weil Alice hat auch Bob, was zu informieren 274 00:17:23,140 --> 00:17:26,880 wenn Bob wird in der Lage sein, ihre komprimierte Nachricht lesen? 275 00:17:26,880 --> 00:17:30,770 [Unverständlich Student Response] >> Was ist das? 276 00:17:30,770 --> 00:17:32,310 [Unverständlich Student Response] >> Von dem, was der Baum ist. 277 00:17:32,310 --> 00:17:35,160 Oder noch genauer gesagt, was diese Codierungen sind, 278 00:17:35,160 --> 00:17:39,010 zumal in dieser Geschichte, die wir ein Urteil Anruf an einer Stelle. 279 00:17:39,010 --> 00:17:43,640 Beachten Sie, dass wir willkürlich holen zwischen den 2 verschiedenen 20% Knoten hatte? 280 00:17:43,640 --> 00:17:49,800 Es ist also nicht so, dass Bob, der Empfänger kann nur rekonstruieren, den Baum auf eigene 281 00:17:49,800 --> 00:17:53,390 vielleicht auch weil er den Baum immer so leicht anders Alice erstellen. 282 00:17:53,390 --> 00:17:56,670 Außerdem hat Bob gar nicht wissen, was die ursprüngliche Nachricht ist 283 00:17:56,670 --> 00:18:00,770 denn das einzige Alice sendet ihn wird, ist natürlich die komprimierte Nachricht. 284 00:18:00,770 --> 00:18:05,900 >> So der Fang mit Kompression wie das ist, ja, kann Alice sparen eine ganze Menge von Bits 285 00:18:05,900 --> 00:18:09,900 durch Senden 1 für E und 01 für A und so weiter, 286 00:18:09,900 --> 00:18:15,180 aber sie hat auch Bob informieren, was die Zuordnung zwischen Buchstaben und Bits 287 00:18:15,180 --> 00:18:19,620 weil sie nicht eindeutig stützen sich auf nur ASCII mehr, wenn wir nicht verwenden ASCII. 288 00:18:19,620 --> 00:18:22,200 So kann sie entweder schickt ihn den Baum irgendwie - 289 00:18:22,200 --> 00:18:26,600 notieren, bewahren Sie es als binäre Daten oder so ähnlich - 290 00:18:26,600 --> 00:18:30,280 oder senden Sie ihm ein wenig Spickzettel, eine Excel-Datei, die die Zuordnungen zeigt. 291 00:18:30,280 --> 00:18:36,480 So die Effektivität der Kompression wirklich davon ausgegangen, dass die Nachrichten, die Sie senden 292 00:18:36,480 --> 00:18:40,230 sind ziemlich groß, zumindest mittelgroß, 293 00:18:40,230 --> 00:18:42,180 denn wenn Sie senden eine super kurze Nachricht, 294 00:18:42,180 --> 00:18:45,390 wenn Sie nur wollen, um die Nachricht BAD geschieht, die zu einem Wort, das wir hier buchstabieren kann, 295 00:18:45,390 --> 00:18:49,550 B-A-D, du bist wahrscheinlich zu weniger Bits zu verwenden, 296 00:18:49,550 --> 00:18:53,130 aber der Haken ist, wenn Sie auch an Bob informieren, was der Baum 297 00:18:53,130 --> 00:18:57,530 oder was diese Codierungen sind, wirst du wahrscheinlich überwiegen alle Einsparungen 298 00:18:57,530 --> 00:19:00,110 der mit Druckluft Dinge zu beginnen. 299 00:19:00,110 --> 00:19:02,210 So kann es tatsächlich der Fall ist, dass, wenn Sie versuchen, komprimiert werden 300 00:19:02,210 --> 00:19:05,330 auch mit so etwas wie zip oder Dateiformate, die Sie vielleicht kennen - 301 00:19:05,330 --> 00:19:07,780 hübsche kleine Dateien, auch leere Dateien - 302 00:19:07,780 --> 00:19:10,930 manchmal sind diese Dateien möglicherweise größer und nicht kleiner. 303 00:19:10,930 --> 00:19:14,320 Aber realistisch, das passiert nur für kleine Dateigrößen, 304 00:19:14,320 --> 00:19:16,920 so ist es nicht zu machen ein Gigabyte-Datei 2 Gigabyte sein; 305 00:19:16,920 --> 00:19:19,480 wir wirklich reden Bytes oder nur ein paar Kilobyte. 306 00:19:19,480 --> 00:19:22,330 >> Einige Programme wie zip sind intelligent genug, um das zu realisieren, 307 00:19:22,330 --> 00:19:24,590 "Du wirst mehr Bits komprimiert diese zu verbringen." 308 00:19:24,590 --> 00:19:27,460 "Lassen Sie mich nicht die Mühe es zu komprimieren für Sie überhaupt nicht." 309 00:19:27,460 --> 00:19:30,160 Also das ist nur eine Möglichkeit, dann zu komprimieren Textformat. 310 00:19:30,160 --> 00:19:32,300 Wir könnten so etwas in C zu implementieren 311 00:19:32,300 --> 00:19:35,370 Zum Beispiel, hier ist, wie wir einen Knoten in diesem Baum stellen 312 00:19:35,370 --> 00:19:39,320 wo wir eine char für das Symbol, ein schwimmendes Wert für die Frequenz, 313 00:19:39,320 --> 00:19:42,250 und wie wir mit unseren anderen Datenstrukturen, 2 Zeiger gesehen, 314 00:19:42,250 --> 00:19:47,080 1 nach links Kind 1 nach rechts, von denen jeder den Wert NULL annehmen kann, 315 00:19:47,080 --> 00:19:50,850 aber wenn nicht, bezieht er sich auf einer linken und einer rechten Kindes Kind. 316 00:19:50,850 --> 00:19:55,130 Also das ist dann Huffman-Kodierung, und es ist ein Weg, dass man zu komprimieren Informationen gehen, 317 00:19:55,130 --> 00:19:57,880 und es ist sicherlich eines der am einfachsten zu implementieren 318 00:19:57,880 --> 00:20:00,830 im Rahmen von beispielsweise vergangenen Woche Datenstrukturen, 319 00:20:00,830 --> 00:20:03,250 obwohl auch komplexere Algorithmen existieren 320 00:20:03,250 --> 00:20:08,220 das kann aber noch mehr anspruchsvolle Mutationen Ihrer Daten. 321 00:20:08,220 --> 00:20:11,640 Fragen Sie dann auf Bäumen, binären Bäumen, oder Kompression von Text? 322 00:20:11,640 --> 00:20:15,590 [Schüler] Gibt es einige Unklarheiten, wie wenn [unverständlich] aufgeteilt in 01, 323 00:20:15,590 --> 00:20:19,160 dann 011 wäre mehrdeutig, nicht wahr? 324 00:20:19,160 --> 00:20:22,730 [Unverständlich] >> Gute Frage. Mehrdeutigkeit. 325 00:20:22,730 --> 00:20:25,940 Lassen Sie mich zusammenfassen unter Bezugnahme auf diese Bilder hier. 326 00:20:25,940 --> 00:20:29,650 Weil Sie die Zeichen verdichten, die Darstellungen, 327 00:20:29,650 --> 00:20:32,850 per Definition dieser Algorithmus immer die Blätter bleiben, 328 00:20:32,850 --> 00:20:41,870 Sie werden nie versehentlich die gleiche Muster von Bits für das Präfix von mehreren Buchstaben. 329 00:20:41,870 --> 00:20:46,740 Also mit anderen Worten, Sie besorgt sind, es klingt wie, eine Mehrdeutigkeit, die sich 330 00:20:46,740 --> 00:20:51,580 wobei 001 könnte der Beginn B oder der Beginn C oder so ähnlich sein. 331 00:20:51,580 --> 00:20:56,780 Aber das kann nicht der Fall sein, weil beachten Sie, dass alle Buchstaben des Alphabets wir kodieren 332 00:20:56,780 --> 00:20:58,290 befinden sich an den Blättern. 333 00:20:58,290 --> 00:21:01,910 >> Die Mehrdeutigkeit kann nur entstehen, wie im Fall des Morse-Code, 334 00:21:01,910 --> 00:21:06,770 wenn zum Beispiel war C irgendwo entlang der Pfad von der Wurzel zu B. 335 00:21:06,770 --> 00:21:12,290 [Schüler] Right. Also in diesem Fall, sagen A hat 2 Blätter. >> Say A - Sag das nochmal. 336 00:21:12,290 --> 00:21:18,760 [Schüler] Say A hat 2 Blätter, F und G, und dann G - >> Okay. Aber es geht nicht. 337 00:21:18,760 --> 00:21:23,230 Ein selbst konnte keine Blätter F und G, da diese Buchstaben F und G 338 00:21:23,230 --> 00:21:27,560 würden sich verlässt irgendwo links von B oder rechts von E sein 339 00:21:27,560 --> 00:21:28,900 So muss per definitionem sie Blätter sein. 340 00:21:28,900 --> 00:21:32,940 Andernfalls Sie hier genau richtig, haben wir nicht das Problem, dass Morse-Code steht gelöst. 341 00:21:32,940 --> 00:21:38,150 Gute Frage. Weitere Fragen? Gut. 342 00:21:38,150 --> 00:21:42,050 Diese Vorstellung von Bits, stellt sich heraus, dass wir die Macht hatte schon die ganze Zeit, dass wir eigentlich nicht verwendet 343 00:21:42,050 --> 00:21:44,200 wenn es um die Manipulation dieser 0s und 1s. 344 00:21:44,200 --> 00:21:46,600 Wir fragten dazu auf eine der frühesten Problem Sets: 345 00:21:46,600 --> 00:21:52,340 nämlich, wie Sie über das Konvertieren von Groß-in Kleinbuchstaben oder umgekehrt gehen? 346 00:21:52,340 --> 00:21:55,460 Oder, genauer gesagt, fragte einer den ersten pset 347 00:21:55,460 --> 00:22:01,090 wie viele Bits Sie haben tatsächlich zu kippen, um eine Änderung an einer oder umgekehrt Kleinschreibung? 348 00:22:01,090 --> 00:22:05,580 Hier ist eine kurze Übersicht über 65 und 97 aussehen wie in binär. 349 00:22:05,580 --> 00:22:08,060 Und selbst wenn diese Frage Art in Ihrer Erinnerung verblasst, 350 00:22:08,060 --> 00:22:11,290 Sie können wieder sehen, dass, wie viele Bits gekippt werden müssen 351 00:22:11,290 --> 00:22:15,810 zu Kapital zu ändern A in Kleinbuchstaben a? Nur eine. 352 00:22:15,810 --> 00:22:19,650 >> Sie nur an einem Ort, das dritte Bit aus dem linken unterscheiden. 353 00:22:19,650 --> 00:22:24,240 Während A hat eine 010, kleine a hat einen 011. 354 00:22:24,240 --> 00:22:26,250 Also irgendwie müssen wir nur in der Lage, diese Bit-Flip, 355 00:22:26,250 --> 00:22:29,410 und wir können dann zu nutzen oder Kleinbuchstaben. 356 00:22:29,410 --> 00:22:32,720 Wir haben dies in der Vergangenheit getan tatsächlich nutzen, wenn die Bedingungen 357 00:22:32,720 --> 00:22:35,930 und prüfen, ob der Brief ist zwischen Kapital A und Kapital Z, 358 00:22:35,930 --> 00:22:41,480 gibt dann wie A - a + 26 oder so ähnlich. 359 00:22:41,480 --> 00:22:46,130 Sie haben wahrscheinlich eine arithmetische Änderung der Buchstaben des Alphabets. 360 00:22:46,130 --> 00:22:49,270 Aber was wäre, wenn wir nur Flip dass einzelne Bit? 361 00:22:49,270 --> 00:22:59,080 Wie konnten Sie über die Einnahme ein Byte im Wert von Bits, so 8 Bits wie 01000001 und 01100001 zu gehen? 362 00:22:59,080 --> 00:23:03,170 Wenn Sie diese Abfolgen von Bits hatten, wie können wir über die Änderung nur einer von ihnen gehen? 363 00:23:03,170 --> 00:23:07,610 Was, wenn wir in Gelb hier vorstellen diese andere Muster von Bits? 364 00:23:07,610 --> 00:23:13,420 Wenn ich die ganzen gelben String 0s mit Ausnahme der ein bisschen, dass ich ändern wollen 365 00:23:13,420 --> 00:23:17,900 und dann stelle ich einen neuen Betreiber als bitweisen Operator bekannt - 366 00:23:17,900 --> 00:23:21,210 bitweise in dem Sinne, dass sie auf einzelne Bits arbeitet, 367 00:23:21,210 --> 00:23:25,360 nicht auf einer gesamten Byte oder vier Bytes auf einmal. 368 00:23:25,360 --> 00:23:31,170 Diese vertikale bar es in Gelb schlägt vor, dass was passiert, wenn wir die Darstellung von Kapital A zu nehmen 369 00:23:31,170 --> 00:23:37,060 und bitweise ODER es mit dem gelben Folge von Bits? 370 00:23:37,060 --> 00:23:41,300 In anderen Worten, denken Sie zurück an unsere Diskussion über Boolesche Ausdrücke in Scratch und dann in C. 371 00:23:41,300 --> 00:23:47,520 >> Doing eine boolesche oder bedeutet, dass um wahr zu sein, entweder das erste Ding hat um wahr zu sein 372 00:23:47,520 --> 00:23:50,700 oder das zweite Ding hat um wahr zu sein, oder sie haben beide um wahr zu sein, 373 00:23:50,700 --> 00:23:53,270 und dann das resultierende Ausgangssignal sich wahr. 374 00:23:53,270 --> 00:24:00,230 In diesem Fall hier, was haben wir bekommen, wenn wir 0 annehmen "oder" ed mit 0? Falsche oder falsch? 375 00:24:00,230 --> 00:24:04,280 Es ist immer noch falsch, so dass die Kleinbuchstaben a bleibt wie erwartet. 376 00:24:04,280 --> 00:24:07,540 Was wäre, wenn wir stattdessen 1 oder 0 zu tun? 377 00:24:07,540 --> 00:24:12,640 Dieser bleibt nun 1, aber bemerken, was geht darum, hier zu passieren. 378 00:24:12,640 --> 00:24:18,630 Wenn wir mit dem Kapital A und beginnen wir weiter "oder" die einzelnen Bits wie wir hier sind, 379 00:24:18,630 --> 00:24:25,180 0 oder die gelbe gibt uns, was hier unten? Dies gibt uns ein. 380 00:24:25,180 --> 00:24:35,120 In der Tat, nehmen wir nicht wissen, was die Groß-Version von wenig ein tatsächlich war. 381 00:24:35,120 --> 00:24:38,270 Lasst uns das tun. Lassen Sie mich zu bewegen diese wieder hier. 382 00:24:38,270 --> 00:24:42,340 Lasst uns wieder tun. 0 oder 0 gibt mir 0. 383 00:24:42,340 --> 00:24:45,020 1 oder 0 gibt mir ein. 384 00:24:45,020 --> 00:24:48,020 0 oder 1 gibt mir ein. 385 00:24:48,020 --> 00:24:52,880 0 oder 0 gibt mir 0. Der nächste ist 0, das nächste zu 0 ist, ist der nächste 0. 386 00:24:52,880 --> 00:24:55,660 1 oder 0 gibt mir ein. 387 00:24:55,660 --> 00:24:59,140 Und so, auch wenn wir nicht im Voraus wusste, was Kleinschreibung eine war, 388 00:24:59,140 --> 00:25:04,770 einfach durch "oder" ing A mit diesem Muster der Bits, die wir hier in gelb dargestellt, 389 00:25:04,770 --> 00:25:09,400 Sie Kleinbuchstaben ein Kapital A durch Umklappen dieses Bit. 390 00:25:09,400 --> 00:25:11,580 Wir benutzten diesen Ausdruck Wochen: Spiegeln ein bisschen. 391 00:25:11,580 --> 00:25:13,710 Wie wollen Sie wirklich tun programmatisch? 392 00:25:13,710 --> 00:25:16,390 Sie verwenden, was in der Regel eine Maske, eine Folge von Bits genannt, 393 00:25:16,390 --> 00:25:19,980 dass in diesem Fall einfach so passiert, wie diese Zahl schau mal, 394 00:25:19,980 --> 00:25:22,980 und dann "oder" es zusammen mit dieser neuen C-Operator, 395 00:25:22,980 --> 00:25:29,940 nicht | | Verwenden Sie ein einzelnes | und Sie würden tatsächlich bekommen diese Antwort hier, weil warum? 396 00:25:29,940 --> 00:25:35,120 Dies ist die 1s Ort, 2s Ort, 4s, 8s, 16s, 32s. 397 00:25:35,120 --> 00:25:42,280 So stellt sich heraus, dass, wenn Sie einen Großbuchstaben A und bitweise ODER es mit der Zahl 32, 398 00:25:42,280 --> 00:25:47,520 weil die Zahl 32, wenn man es so aussehen, als Bits, sieht wie folgt aus, 399 00:25:47,520 --> 00:25:50,860 dh Sie können das Bit, dass Sie wirklich wollen, zu kippen. 400 00:25:50,860 --> 00:25:52,630 Und ähnlich - und wir werden auf Code in nur einem Augenblick aussehen - 401 00:25:52,630 --> 00:25:54,210 Angenommen, wir wollen in die andere Richtung gehen. 402 00:25:54,210 --> 00:25:58,210 >> Wie willst du von Kleinbuchstaben einem Kapital A gehen? Welche Bit muss sich ändern? 403 00:25:58,210 --> 00:25:59,820 Es ist das gleiche. 404 00:25:59,820 --> 00:26:03,970 Wir wollen, dass die dritte Bit von einem 1 ändern, um eine 0. 405 00:26:03,970 --> 00:26:06,310 Und wie können wir dabei vorgehen? 406 00:26:06,310 --> 00:26:10,130 Wie können wir ausschalten ein bisschen? Mit welchem ​​Muster von Bits könnten wir schalten ein bisschen? 407 00:26:11,580 --> 00:26:14,070 Was, wenn wir von Invert der Maske zu sortieren? 408 00:26:14,070 --> 00:26:17,350 Während vor, wir haben die ganze gelbe Maske 0s 409 00:26:17,350 --> 00:26:19,930 mit Ausnahme des Ein-Bit wollten wir einzuschalten, 410 00:26:19,930 --> 00:26:25,580 was ist, wenn dieses Mal machen wir die gesamte Maske 1s mit Ausnahme des bit dass wir ausschalten möchten 411 00:26:25,580 --> 00:26:28,330 und verwenden Sie dann, was Betreiber? 412 00:26:28,330 --> 00:26:30,560 Was ist, wenn wir "und" die Dinge? Lassen Sie uns einen Blick. 413 00:26:30,560 --> 00:26:34,880 Wenn wir dies nun umdrehen, nehme an, dass ich wieder eine Maske, die alle 1s ist zu schaffen 414 00:26:34,880 --> 00:26:37,650 mit Ausnahme der ein bisschen, dass ich ausschalten möchten 415 00:26:37,650 --> 00:26:43,860 und dann anstatt "oder" die weißen Zahlen bis oben mit den gelben Zahlen hier unten, 416 00:26:43,860 --> 00:26:46,940 was ist, wenn ich statt "und" sie zusammen? Es nennt sich eine bitweise und. 417 00:26:46,940 --> 00:26:49,450 Logisch, es ist das gleiche wie ein Boolean und. 418 00:26:49,450 --> 00:26:55,160 Das gibt mir 0 & 1 0 ist. So falsch und wahr ist falsch. 419 00:26:55,160 --> 00:26:58,160 True und wahr ist wahr. 420 00:26:58,160 --> 00:27:04,020 Und hier ist das Zauberwort: Echte und falsche ist nun falsch, so haben wir aus, dass etwas gedreht. 421 00:27:04,020 --> 00:27:06,560 Und nun der Rest der Geschichte ist etwas einfach. 422 00:27:06,560 --> 00:27:11,970 Da der Rest der Maske ist 1s, spielt es keine Rolle, was die Zahlen in weiß sind. 423 00:27:11,970 --> 00:27:15,580 Wenn Sie "und" etwas mit echter, du wirst doch nicht um den Wert zu ändern. 424 00:27:15,580 --> 00:27:20,200 Wenn es wahr ist, bleibt wahr. Wenn es falsch war, bleibt falsch. 425 00:27:20,200 --> 00:27:23,190 >> Aber die Magie passiert, wenn Sie etwas, das wahr zu nehmen 426 00:27:23,190 --> 00:27:25,430 und Sie dann "und" es mit falschen. 427 00:27:25,430 --> 00:27:30,030 Dies hat die Wirkung des Ausschaltens dieses Bit. 428 00:27:30,030 --> 00:27:31,980 Also ein wenig kryptisch gibt. 429 00:27:31,980 --> 00:27:35,390 Lasst uns tatsächlich auf einige Code zu suchen, die vielleicht tatsächlich aussehen noch kryptisch, 430 00:27:35,390 --> 00:27:38,220 aber lassen Sie uns einen Blick hier bei tolower. 431 00:27:38,220 --> 00:27:45,880 Wenn ich bei tolower aussehen, gehen aus der Kapitalkonsolidierung A ein Kleinbuchstaben 432 00:27:45,880 --> 00:27:47,730 Lassen Sie uns sehen, wie wir dieses Programm zu implementieren. 433 00:27:47,730 --> 00:27:51,280 Hier ist Haupt, und es ist nicht an irgendwelche Kommandozeilen-Argumente. 434 00:27:51,280 --> 00:27:55,980 Ich erkläre ein Zeichen c für den Brief, dass der Benutzer wird geben in. 435 00:27:55,980 --> 00:28:00,690 Ich habe dann mit einer vertrauten do while-Schleife nur machen, um sicherzustellen, dass der Benutzer auf jeden Fall gibt mir ein großes A 436 00:28:00,690 --> 00:28:05,010 oder B oder C. .. Z, so geben sie mir etwas zwischen A und Z. 437 00:28:05,010 --> 00:28:08,580 Und nun, was mache ich hier? 438 00:28:08,580 --> 00:28:14,870 Ich bin "oder" ing dies mit 0x20, aber das ist eigentlich das gleiche wie - 439 00:28:14,870 --> 00:28:19,500 und wir kommen zurück, um dies in einem Moment - 32. 440 00:28:19,500 --> 00:28:24,830 Also noch einmal, ist 32 dieses Muster von Bits hier. Warum wir das wissen? 441 00:28:24,830 --> 00:28:26,320 Denk nur an Wochen 0. 442 00:28:26,320 --> 00:28:31,010 Dies ist die 1s Ort, 2s Ort, 4s, 8s, 16s, 32s statt. 443 00:28:31,010 --> 00:28:33,470 Also das gelbe Zahl passiert zu 32 sein. 444 00:28:33,470 --> 00:28:40,570 Ich kann dann einen Brief wie der char hier bitweise "oder" es buchstäblich mit der Nummer 32, 445 00:28:40,570 --> 00:28:45,250 und was bekomme ich zurück? Das kleine Version des char. 446 00:28:45,250 --> 00:28:48,830 Vorhin, obwohl, drückte ich dies in einer anderen Basis Notation. 447 00:28:48,830 --> 00:28:51,370 Was hat dies darzustellen? >> [Schüler] Hexadezimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Dies geschieht in Hexadezimal darstellen. 449 00:28:53,050 --> 00:28:55,170 Wir haben noch nicht über hexadezimale, dass alle viel geredet, 450 00:28:55,170 --> 00:28:57,330 aber es ist eigentlich in Fällen wie diesem bequem. 451 00:28:57,330 --> 00:29:01,730 >> Obwohl es sieht komplexer und obwohl es sieht aus wie 20 und nicht 32, 452 00:29:01,730 --> 00:29:06,240 es stellt sich heraus, dass Hexadezimal ist eigentlich super bequem Notation 453 00:29:06,240 --> 00:29:10,810 weil in hexadezimale jede Stelle nach dem 0x - und das bedeutet nichts; 454 00:29:10,810 --> 00:29:13,960 dies ist nur die menschliche Konvention, hier kommt eine Hexadezimalzahl sagt - 455 00:29:13,960 --> 00:29:18,590 jede dieser Stellen, die 2 und dann das 0, kann selbst dargestellt werden 456 00:29:18,590 --> 00:29:20,800 mit genau vier Bits. 457 00:29:20,800 --> 00:29:27,840 Also, wenn wir dies tun, lassen Sie mich eröffnen einen Texteditor hier - weird autocomplete - 458 00:29:27,840 --> 00:29:35,940 wenn wir ein wenig Texteditor hier zu tun, die Zahl 0x20 bedeutet hier ist 4 Bits, hier weitere 4 Bits. 459 00:29:35,940 --> 00:29:38,050 Lassen Sie uns die rechten 4 Bit zuerst. 460 00:29:38,050 --> 00:29:44,690 0, wenn mit 4 Bits dargestellt ist, was? Super easy. Nur alle 0s. 461 00:29:44,690 --> 00:29:46,780 So 4 Bits als 0s. 462 00:29:46,780 --> 00:29:53,510 Wie stellen Sie 2? Es ist schon eine Weile her, seit wir dies taten, aber es ist 0100. 463 00:29:53,510 --> 00:29:57,310 Das ist also die 1s Ort, das ist das 2s Ort, und dann ist es egal, was die anderen Orte sind. 464 00:29:57,310 --> 00:30:00,610 In anderen Worten, in hexadezimaler könnte man sagen 0x20, 465 00:30:00,610 --> 00:30:04,340 aber wenn man dann darüber nachdenken, was ist die 2 und wie wird sie vertreten im Binär-, 466 00:30:04,340 --> 00:30:07,130 was ist die 0 und wie wird sie vertreten im Binär-, 467 00:30:07,130 --> 00:30:10,440 die Antworten auf diese Fragen sind das und das sind. 468 00:30:10,440 --> 00:30:14,380 So 0x20 geschieht dieses Muster von 8 Bits repräsentieren, 469 00:30:14,380 --> 00:30:16,880 was genau das ist die Maske, die wir wollten. 470 00:30:16,880 --> 00:30:20,140 Also das ist im Moment nur eine intellektuelle Übung, 471 00:30:20,140 --> 00:30:24,520 aber die Realität ist im Code es in der Regel mehr gemeinsame Konstanten wie dies schreibe 472 00:30:24,520 --> 00:30:28,360 in hexadezimaler denn dann kann der Programmierer relativ einfach, 473 00:30:28,360 --> 00:30:32,560 auch wenn es etwas Papier und Bleistift benötigt, herauszufinden, was das Muster von Bits 474 00:30:32,560 --> 00:30:35,960 da kann man nicht einfach auszudrücken 0s und 1s typischerweise im Code. 475 00:30:35,960 --> 00:30:38,540 Du kannst nicht gehen 00010 und so weiter. 476 00:30:38,540 --> 00:30:42,380 >> Sie müssen dezimal oder hexadezimal oder oktal oder andere Schreibweisen wählen. 477 00:30:42,380 --> 00:30:47,540 Die meisten Menschen neigen dazu, hexadezimale einfach so, dass jede Ziffer 4 Bits repräsentiert holen 478 00:30:47,540 --> 00:30:49,320 und Sie können dies tun, schnelle Mathematik. 479 00:30:49,320 --> 00:30:54,990 Und ich werde meine Hand auf toupper, die fast die gleiche Wellenlänge, es sieht fast identisch. 480 00:30:54,990 --> 00:31:01,900 Toupper passiert nicht die oder Betreiber, sondern dieser Kerl und df verwenden. 481 00:31:01,900 --> 00:31:09,300 Was bedeutet df dar? df? Anyone? >> [Schüler] 255. 482 00:31:09,300 --> 00:31:12,780 255? Nicht 255. Das wäre ff sein. 483 00:31:12,780 --> 00:31:15,210 Wir werden diese ein als kleine Übung verlassen. 484 00:31:15,210 --> 00:31:23,460 Aber wenn Sie reicht von 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 und was dann kommt nach 9? 485 00:31:23,460 --> 00:31:26,510 Wir sind irgendwie von Dezimalstellen, sondern in hexadezimaler was kommt nach 9? 486 00:31:26,510 --> 00:31:29,510 [Schüler] ein. >> Also a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Sie können herausfinden, von dort, was Muster von Bits d tatsächlich steht. 488 00:31:33,470 --> 00:31:38,850 Und wenn wir die Mathematik zu tun, werden wir sehen, dass die Maske, die Sie am Ende immer wieder mit diesem identisch ist. 489 00:31:38,850 --> 00:31:45,580 Dies ist f alle 1s, und dies ist d. So df stellt diese Maske. Gut. 490 00:31:45,580 --> 00:31:50,980 Und schließlich, nicht zu machen Dinge klingen super, super Technik, 491 00:31:50,980 --> 00:31:53,840 aber angenommen, wir wollten ein Programm, das dies tut schreiben. 492 00:31:53,840 --> 00:31:58,960 Lassen Sie mich voran gehen und binär, was ein Programm in einer Datei namens binary.c ist. 493 00:31:58,960 --> 00:32:02,050 Und nun lassen Sie mich laufen binären und gib mir eine nicht-negative ganze Zahl ist. 494 00:32:02,050 --> 00:32:03,960 Fangen wir einfach und geben 0. 495 00:32:03,960 --> 00:32:09,010 Dies ist jetzt ein Programm, das druckt eine ganze Zahl in ihrer binären Darstellung. 496 00:32:09,010 --> 00:32:13,470 Also, wenn ich dieses Spiel wieder zu spielen und geben in nur 1, sollte ich eine 32-Bit-Darstellung von 1. 497 00:32:13,470 --> 00:32:15,490 Wenn ich das wieder tun mit 2, sollte ich, dass. 498 00:32:15,490 --> 00:32:19,310 Wenn ich 7 zu tun, sollte ich ein paar 1s am Ende bekommen und so weiter. 499 00:32:19,310 --> 00:32:22,740 Es stellt sich heraus, dass ich erwähnen, weil mit bitweise Operationen 500 00:32:22,740 --> 00:32:25,490 Sie konkret tun können eine andere Sache als gut. 501 00:32:25,490 --> 00:32:29,130 Sie können diese Masken dynamisch zu erstellen. 502 00:32:29,130 --> 00:32:32,800 Werfen Sie einen Blick auf diese ein letztes Beispiel mit bitweise Operationen. 503 00:32:32,800 --> 00:32:35,490 Hier ist der erste Teil des Codes, der Benutzer zur Eingabe einer Nummer, 504 00:32:35,490 --> 00:32:38,130 und es besteht darauf, dass Sie mir eine nicht-negative Ganzzahl. 505 00:32:38,130 --> 00:32:39,780 Damit ist eine Art der alten Schule Zeug. 506 00:32:39,780 --> 00:32:41,980 Aber hier ist etwas, was irgendwie interessant ist. 507 00:32:41,980 --> 00:32:44,910 >> Wie kann ich zum Drucken einer Zahl in binäre gehen? 508 00:32:44,910 --> 00:32:48,970 Ich zum ersten Mal von was zu was durchlaufen? 509 00:32:48,970 --> 00:32:52,270 Was ist in der Größe eines int in der Regel, zumindest in dem Gerät? >> [Schüler] 4. 510 00:32:52,270 --> 00:32:57,130 Es ist 4. So 4 * 8 ist 32 - 1 ist 31. 511 00:32:57,130 --> 00:33:02,590 Also, wenn ich fange an von 31 zu zählen, stellt das, es stellt sich heraus, 512 00:33:02,590 --> 00:33:07,630 nur konzeptionell, den 31. Bit oder das Bit höchster Ordnung, die dieser Kerl hier ist, 513 00:33:07,630 --> 00:33:09,650 während dies wird Bit 0 sein. 514 00:33:09,650 --> 00:33:12,850 Das ist also Bit 01 ... Bit 31. 515 00:33:12,850 --> 00:33:14,950 Also, was ist dieser Code tun? 516 00:33:14,950 --> 00:33:20,140 Beachten Sie diese for-Schleife, obwohl es kryptisch aussieht, ist nur Iteration von 31 bis 0. Das war's. 517 00:33:20,140 --> 00:33:24,530 So der interessante Teil muss nun in diesen 5 Zeilen hier zu sein. 518 00:33:24,530 --> 00:33:28,110 Beachten Sie, dass in dieser Zeile Ich erkläre eine Variable namens Maske 519 00:33:28,110 --> 00:33:30,790 im Einklang mit unserer Geschichte dieser gelben Zahlen. 520 00:33:30,790 --> 00:33:32,200 Und was dann wird diese tun? 521 00:33:32,200 --> 00:33:35,720 Dies ist ein weiterer bitweisen Operator wir nicht gesehen haben, bevor, am wahrscheinlichsten. 522 00:33:35,720 --> 00:33:38,300 Es ist die linke Shift-Operator. 523 00:33:38,300 --> 00:33:40,060 Dieser Operator tut dies. 524 00:33:40,060 --> 00:33:44,920 Hier ist die Nummer 1, und wenn du i Verschiebung, Verschiebung nach links verlassen, 525 00:33:44,920 --> 00:33:49,260 was denkst du, dass hat den Effekt zu tun, um dieser Person 1? 526 00:33:49,260 --> 00:33:51,290 Wörtlich Verschieben Sie es um. 527 00:33:51,290 --> 00:33:57,540 Also, wenn die Nummer 1 ist, was Sie auf der linken Seite haben und starten Sie mit der Initialisierung i bis 31, 528 00:33:57,540 --> 00:34:03,490 Was ist das jetzt tun? Es wird diese Nummer 1 nehmen und verschieben es 31 Plätze hier. 529 00:34:03,490 --> 00:34:06,210 Und weil es offensichtlich keine anderen Ziffern dahinter, 530 00:34:06,210 --> 00:34:10,350 diese werden standardmäßig mit 0s ersetzt werden. 531 00:34:10,350 --> 00:34:15,120 So werden Sie beginnen mit der Nummer 1, die natürlich aussieht - 532 00:34:15,120 --> 00:34:18,659 und lass mich ziehen Sie es hier in der Mitte. 533 00:34:18,659 --> 00:34:22,139 Und dann, wie Sie die Dinge nach links verschoben werden, dieser Kerl Wesentlichen geht auf diese Weise. 534 00:34:22,139 --> 00:34:24,659 Aber sobald du das tust, wird eine 0 ausgefüllt 535 00:34:24,659 --> 00:34:28,360 Wenn Sie es verschieben ein zweites Mal, es geht diesen Weg und voneinander 0 gefüllt wird in. 536 00:34:28,360 --> 00:34:31,000 >> Sie verschieben es wieder und dann noch 0 gefüllt wird in. 537 00:34:31,000 --> 00:34:37,900 Also, wenn Sie das Ding von 1 << i 31 Orten zu tun, beenden Sie immer eine Maske 538 00:34:37,900 --> 00:34:42,550 das heißt 32 Zeichen lang ist, die am weitesten links von denen eine 1 ist, 539 00:34:42,550 --> 00:34:45,199 der ganze Rest davon eine 0 ist. 540 00:34:45,199 --> 00:34:50,880 Und es stellt sich heraus, als beiseite, Verschieben einer Zahl auf der linken wie diese 541 00:34:50,880 --> 00:34:53,530 auch zufällig, und manchmal bequem, 542 00:34:53,530 --> 00:34:57,520 hat den Effekt, zu tun, was zu dieser Zahl? >> [Schüler] verdoppeln. 543 00:34:57,520 --> 00:35:00,980 Verdoppeln, weil jeder der Säulen - die 1s Ort, 2s Ort, 4s Ort, 544 00:35:00,980 --> 00:35:05,030 8s Ort, 16s Platz - sie sind alle Verdoppelung, wie Sie auf der linken Seite zu gehen. 545 00:35:05,030 --> 00:35:09,500 Oder besser gesagt, wenn Sie das 1s verschieben wirst du am Ende Verdoppelung des Wertes der Nummer. 546 00:35:09,500 --> 00:35:12,070 Sie können am Ende dabei interessante Transformationen von Ziffern 547 00:35:12,070 --> 00:35:15,640 indem alles über auf diese Weise durch Potenzen von 2. 548 00:35:15,640 --> 00:35:17,150 Also, wie funktioniert das? 549 00:35:17,150 --> 00:35:22,580 Dies ergibt dann mir eine Maske, die alle 0, außer für eine 1 in genau der Stelle möchte ich es, 550 00:35:22,580 --> 00:35:27,920 und dann dieser Ausdruck, die von toupper.c gestohlen wird, 551 00:35:27,920 --> 00:35:31,770 ist einfach zu sagen, nehmen Sie die Zahl n, die der Benutzer eingegeben wird, 552 00:35:31,770 --> 00:35:34,730 "Und" es mit dieser Maske, und was wirst du bekommen? 553 00:35:34,730 --> 00:35:39,200 Du wirst eine 1 bekommen, wenn es eine 1 in diesem maskierten Lage, 554 00:35:39,200 --> 00:35:41,570 oder du wirst eine 0 zu erhalten, wenn es nicht. 555 00:35:41,570 --> 00:35:44,370 Und damit alle dieses Programm nicht effektiv ist, hat es eine Schleife, 556 00:35:44,370 --> 00:35:48,340 und es entsteht eine Maske mit einer 1 über hier, dann eine 1 über hier, dann eine 1 hier rüber, 557 00:35:48,340 --> 00:35:52,950 und es nutzt diese bitweise UND Trick zu sagen, gibt es eine 1-Bit in der Eingabe des Benutzers hier? 558 00:35:52,950 --> 00:35:59,220 >> Gibt es ein 1-Bit in der Eingabe des Benutzers hier? Und wenn ja, buchstäblich drucken 1, sonst gedruckt 0. 559 00:35:59,220 --> 00:36:03,780 Wir tun dies mit ints, nur weil das ist, warum tun wir 32 Bit sind statt 8, 560 00:36:03,780 --> 00:36:06,900 aber was wir dann eingeführt ist bitweise AND, diese bitweise OR, 561 00:36:06,900 --> 00:36:10,450 und das linke Shift-Betreiber, die nicht oft schrecklich hilfreich 562 00:36:10,450 --> 00:36:12,230 aber es stellt sich heraus, dass sie sein kann. 563 00:36:12,230 --> 00:36:16,560 In der Tat, wenn Sie waren so etwas wie ein Array von booleschen stellen 564 00:36:16,560 --> 00:36:21,260 nur zu repräsentieren wahr oder falsch, nehme an, Sie wollten zu verfolgen, ob oder nicht zu halten 565 00:36:21,260 --> 00:36:24,630 ein Raum voller 300 Schüler vorhanden ist, 566 00:36:24,630 --> 00:36:29,420 Sie könnten erklären, ein Array der Größe 300 vom Typ bool, so dass Sie 300 bools bekommen, 567 00:36:29,420 --> 00:36:33,090 und Sie können jeweils auf true gesetzt, wenn jemand hier ist und sonst false. 568 00:36:33,090 --> 00:36:37,550 Warum ist diese Vertretung in diesem Datenstruktur ineffizient? 569 00:36:39,370 --> 00:36:44,800 Was ist schlimm daran das Design dieser Datenstruktur, ein Array von 300 bools? 570 00:36:46,190 --> 00:36:49,600 Was ist ein bool, in der Tat, unter der Haube? 571 00:36:49,600 --> 00:36:52,310 Auch dies ist etwas, das möglicherweise nicht vertraut. 572 00:36:52,310 --> 00:36:53,720 Es stellt sich heraus gibt es keine bool. 573 00:36:53,720 --> 00:36:56,620 Erinnern wir uns Art geschaffen, mit dem cs50.h Datei, 574 00:36:56,620 --> 00:36:58,630 die selbst umfasst Standard bool. 575 00:36:58,630 --> 00:37:00,930 C ist eine Art von dumm, aber wenn es um bool kommt. 576 00:37:00,930 --> 00:37:04,880 Es verwendet 8 Bit für jeden bool darstellen, ist was ganz verschwenderisch 577 00:37:04,880 --> 00:37:09,040 weil offensichtlich, wie viele Bits Sie brauchen, um einen bool dar? Nur 1. 578 00:37:09,040 --> 00:37:13,190 So stellt sich heraus, dass, wenn Sie haben nun die Möglichkeit mit bitweisen Operatoren 579 00:37:13,190 --> 00:37:17,760 auf einzelne Bits sogar in einem char, sogar in einem einzigen Byte zu manipulieren, 580 00:37:17,760 --> 00:37:21,380 es stellt sich heraus Sie den Speicher benötigt, um etwas dumm darstellen könnte sinken 581 00:37:21,380 --> 00:37:25,490 wie dieser Besuch styled Datenstruktur mit einem Faktor von 8. 582 00:37:25,490 --> 00:37:29,820 Anstelle der Verwendung von acht Bits auf true oder false darstellen, könnte man buchstäblich verwenden ein 583 00:37:29,820 --> 00:37:34,500 durch ein einzelnes Byte für jeweils acht Schüler in der Klasse 584 00:37:34,500 --> 00:37:41,990 und Umschalten 0-1 einzelnen Bits durch Verwendung dieser Arten von Low-Level-Tricks. 585 00:37:43,850 --> 00:37:49,460 Das ist wirklich ein Ende der Energie setzen. Gibt es irgendwelche Fragen zu bitweise Operationen? 586 00:37:49,460 --> 00:37:52,710 >> Yeah. >> [Student] Gibt es eine ausschließliche oder Betreiber? 587 00:37:52,710 --> 00:37:56,440 Ja. Es ist eine exklusive oder Betreiber, die so aussieht, ^, die Karotte Symbol, 588 00:37:56,440 --> 00:38:02,070 was bedeutet, nur das erste oder das zweite, was etwas kann eine 1 für die Ausgabe an ein 1 sein. 589 00:38:02,070 --> 00:38:07,750 Es gibt auch eine nicht ~, mit denen Sie eine 0 auf 1 oder umgekehrt sowie invertieren wird. 590 00:38:07,750 --> 00:38:11,600 Und es gibt auch eine Verschiebung nach rechts Betreiber, >>, die das Gegenteil von dem, was wir gesehen haben, ist. 591 00:38:11,600 --> 00:38:13,850 Gut. Lassen Sie uns die Dinge jetzt auf ein höheres Niveau. 592 00:38:13,850 --> 00:38:16,770 Wir begannen, indem er über Text und dann zu komprimieren 593 00:38:16,770 --> 00:38:19,650 und Darstellen des Textes mit weniger Bitzahlen; 594 00:38:19,650 --> 00:38:22,890 Wir sprachen ein wenig darüber, wie wir jetzt anfangen zu manipulieren Dinge auf einer bitweisen Ebene. 595 00:38:22,890 --> 00:38:26,640 Lassen Sie uns nun heranzoomen bis 10.000 Fuß zur Darstellung 596 00:38:26,640 --> 00:38:29,250 von komplexeren Dinge wie Grafiken. 597 00:38:29,250 --> 00:38:32,950 Hier haben wir eine Fahne von Deutschland haben, haben wir hier ein von Frankreich. 598 00:38:32,950 --> 00:38:36,350 Diese könnten in Dateiformate, die Sie vielleicht wissen vertreten sein - GIFs, zum Beispiel. 599 00:38:36,350 --> 00:38:40,030 Wenn Sie jemals ein Bild auf dem Web, die in. Gif endet gesehen 600 00:38:40,030 --> 00:38:43,000 dies ist ein Graphics Interchange Format. 601 00:38:43,000 --> 00:38:47,530 Beide Fahnen hier Art eignen sich die Kompression 602 00:38:47,530 --> 00:38:52,050 für das, was vielleicht offensichtlichste Grund? >> [Unverständlich Studenten Antwort] 603 00:38:52,050 --> 00:38:53,440 Es gibt eine Menge von Wiederholungen, nicht wahr? 604 00:38:53,440 --> 00:38:57,270 Um Deutschland die Flagge zu senden, daran zu denken als ein Bild auf dem Bildschirm 605 00:38:57,270 --> 00:38:59,030 Zurück in Ihrem Scratch Tag. 606 00:38:59,030 --> 00:39:02,380 Sie erinnern sich vielleicht, dass es einzelne Pixel oder Punkte, die ein Bild zu komponieren. 607 00:39:02,380 --> 00:39:06,650 >> Es gibt eine ganze Reihe von schwarzen Punkten und anderen ganze Reihe von schwarzen Punkten. 608 00:39:06,650 --> 00:39:10,110 Es gibt eine Reihe von Zeilen von schwarzen Punkten, die wir sehen, ob wir in wirklich gezoomt konnte, 609 00:39:10,110 --> 00:39:13,370 gern, wenn wir auf Robs Gesicht in Photoshop erkennen. 610 00:39:13,370 --> 00:39:15,500 Sobald wir tiefer und tiefer und tiefer in das Bild, 611 00:39:15,500 --> 00:39:19,990 Sie begann sehen die pixelation, alle Quadrate, die sein Auge in diesem Fall zusammen. 612 00:39:19,990 --> 00:39:24,130 Gleiches Geschäft hier. Wenn wir gezoomt ziemlich viel, würde man die einzelnen Punkte. 613 00:39:24,130 --> 00:39:27,110 Nun, das ist irgendwie eine Verschwendung von Bits. 614 00:39:27,110 --> 00:39:32,120 Wenn eine dritte der Fahne ist schwarz und der dritte Teil der Fahne ist gelb usw., 615 00:39:32,120 --> 00:39:34,860 warum können wir nicht irgendwie komprimiert diese Flagge? 616 00:39:34,860 --> 00:39:39,560 Und auch die Flagge Französisch konnte komprimiert, obwohl das Muster ist ein bisschen anders werden. 617 00:39:39,560 --> 00:39:44,120 Es stellt sich heraus das GIF-Dateiformat ist ein verlustfreies Format, 618 00:39:44,120 --> 00:39:48,420 das heißt, Sie können ein Bild, wie die deutsche Fahne hier nehmen, 619 00:39:48,420 --> 00:39:53,540 Sie werfen eine Menge seiner Bits ohne Abstriche an der Qualität. 620 00:39:53,540 --> 00:39:55,340 Dies steht im Gegensatz zu so etwas wie JPEGs, 621 00:39:55,340 --> 00:39:57,050 mit denen die meisten von uns sind wahrscheinlich besser vertraut. 622 00:39:57,050 --> 00:39:59,000 Facebook Fotos und Flickr Fotos und dergleichen 623 00:39:59,000 --> 00:40:02,200 fast immer als JPEGs gespeichert, wenn sie hochgeladen sind, 624 00:40:02,200 --> 00:40:08,100 aber JPEGs ist eine verlustbehaftete - LOSSY - Format, wobei Sie wegwerfen müssen bits 625 00:40:08,100 --> 00:40:10,430 aber Sie können auch wegwerfen Qualität. 626 00:40:10,430 --> 00:40:13,890 Und so, wenn Sie komprimieren Bilder mit Photoshop oder laden Sie sie auf Facebook 627 00:40:13,890 --> 00:40:15,580 oder nehmen sie an einem wirklich crappy Telefon, 628 00:40:15,580 --> 00:40:19,510 Sie wissen, dass das Bild zu bekommen sehr fleckig und pixelig beginnt, 629 00:40:19,510 --> 00:40:22,290 und das ist, weil es durch den Computer oder Handy komprimiert wird 630 00:40:22,290 --> 00:40:24,550 buchstäblich werfen Informationen entfernt. 631 00:40:24,550 --> 00:40:28,500 Aber GIF ist erstaunlich, dass es weniger Bits verwenden, als es vielleicht standardmäßig 632 00:40:28,500 --> 00:40:30,750 ohne Informationen zu verlieren. 633 00:40:30,750 --> 00:40:32,410 >> Und es wesentlich tut dies wie folgt. 634 00:40:32,410 --> 00:40:38,740 Anstatt store in einer Datei wie ein BMP würde ein RGB-Tripel für schwarz, schwarz, schwarz, schwarz, 635 00:40:38,740 --> 00:40:42,570 schwarz, schwarz, schwarz, schwarz, schwarz, schwarz, schwarz, schwarz und so weiter, 636 00:40:42,570 --> 00:40:45,640 vielmehr wird das GIF-Format gehen zu sagen, "Black" 637 00:40:45,640 --> 00:40:48,330 und dann: "Wiederholen Sie diese 100-mal", oder so ähnlich. 638 00:40:48,330 --> 00:40:52,280 "Black, wiederholen Sie diesen 100-mal, schwarz, wiederholen Sie diese 100-mal ..." 639 00:40:52,280 --> 00:40:54,530 "Yellow, wiederholen Sie diesen 100-mal." 640 00:40:54,530 --> 00:40:57,200 Und so erinnert sich im Wesentlichen die linke Pixel 641 00:40:57,200 --> 00:41:02,160 und dann kodiert irgendwie den Begriff der Wiederholung dieses Pixels wieder und wieder. 642 00:41:02,160 --> 00:41:06,110 So GIFs können dann komprimiert selbst ohne Informationen zu verlieren. 643 00:41:06,110 --> 00:41:09,510 Aber wenn Sie zu erraten, wenn es das ist der Algorithmus, dass die Verwendung GIFs, 644 00:41:09,510 --> 00:41:13,180 welche dieser Flaggen, obwohl sie gleich groß schauen, 645 00:41:13,180 --> 00:41:19,620 wird kleiner sein, wenn auf der Festplatte als GIF gespeichert? >> [Schüler] Deutschland. 646 00:41:19,620 --> 00:41:21,660 Deutschland wird kleiner sein? Warum? 647 00:41:21,660 --> 00:41:26,620 [Schüler] Weil du es wiederholen viele, viele Male horizontal 648 00:41:26,620 --> 00:41:29,010 und dann wiederholen Sie eine andere Zeit. >> Genau. 649 00:41:29,010 --> 00:41:32,020 Weil die Leute, die GIF erfunden nur irgendwie willkürlich entschieden 650 00:41:32,020 --> 00:41:36,040 dass die Wiederholung wird horizontal und seitlich nicht genutzt werden. 651 00:41:36,040 --> 00:41:40,900 Es gibt eine Menge mehr Wiederholungen seitlich hier in der deutschen Flagge als im Französisch Flagge. 652 00:41:40,900 --> 00:41:44,430 Also, wenn wir tatsächlich öffnen Sie einen Ordner auf meiner Festplatte, die diese GIFs hat, 653 00:41:44,430 --> 00:41:51,920 man kann tatsächlich sehen, dass die deutsche Flagge hier 2 Kilobyte und die Französisch ist man 4 Kilobyte. 654 00:41:51,920 --> 00:41:54,080 Es passiert ein Zufall sein, dass man zweimal das andere ist, 655 00:41:54,080 --> 00:41:57,960 aber es ist in der Tat der Fall, dass die Flagge Französisch viel größer ist. 656 00:41:57,960 --> 00:42:01,250 >> Auch wenn wir hier reden über Grafiken können die gleichen Ideen zu gelten 657 00:42:01,250 --> 00:42:05,150 nicht Dinge wie Flaggen, sondern Bilder, die ein wenig komplexer sind. 658 00:42:05,150 --> 00:42:08,170 Wenn Sie ein Bild von einem Apfel zu nehmen, sicherlich gibt es eine Menge von Doppelarbeit gibt, 659 00:42:08,170 --> 00:42:11,040 so konnten wir irgendwie vergessen, dass die Standard-Hintergrund ist blau 660 00:42:11,040 --> 00:42:13,230 und nicht, wie das rechte Bild suggeriert, 661 00:42:13,230 --> 00:42:16,830 müssen die Farbe jedes einzelnen Pixels im Bild erinnern. 662 00:42:16,830 --> 00:42:21,060 So können wir Bits wegwerfen dort ohne Informationen zu verlieren. 663 00:42:21,060 --> 00:42:23,340 Der Apfel sieht immer noch genau das gleiche. 664 00:42:23,340 --> 00:42:27,510 In diesem Beispiel hier können Sie sehen, was passiert in einem Film. 665 00:42:27,510 --> 00:42:31,970 Diese stellen old-school Filmrollen, wobei in der oberen Bild gibt 666 00:42:31,970 --> 00:42:36,900 Sie haben ein Wohnmobil fahren vorbei an einem Haus und einen Baum. 667 00:42:36,900 --> 00:42:42,130 Und wie van fährt vorbei von links nach rechts, was ist offensichtlich nicht ändern? 668 00:42:42,130 --> 00:42:45,320 Das Haus ist nicht überall, und der Baum ist nicht überall. 669 00:42:45,320 --> 00:42:47,700 Das einzige, was sich bewegt ist die van in diesem Fall. 670 00:42:47,700 --> 00:42:51,650 So als Hintergrund Unverändert sagt, was man in Filmen zu tun 671 00:42:51,650 --> 00:42:56,530 ist ähnlich einfach wegwerfen Informationen, die nicht in zwischen den Frames nicht ändert. 672 00:42:56,530 --> 00:42:58,900 Dies wird allgemein als Interframe-Kompression bekannt 673 00:42:58,900 --> 00:43:02,120 wobei, wenn dieser Rahmen sieht fast identisch zu dieser, 674 00:43:02,120 --> 00:43:05,390 Lassen Sie uns nicht die Mühe Speichern auf der Festplatte eine der identischen Informationen 675 00:43:05,390 --> 00:43:09,250 auf diesen Zwischenrahmen, lasst uns nur Keyframes einmal in eine Weile 676 00:43:09,250 --> 00:43:13,420 dass tatsächlich speichern diese Informationen redundant wie ein kleines Plausibilitätsprüfung. 677 00:43:13,420 --> 00:43:18,620 >> Im Gegensatz dazu ist ein anderer Ansatz zur Komprimierung von Videodaten in diesem zweiten und niedrigeren Beispiel hier, 678 00:43:18,620 --> 00:43:23,970 wo anstatt Speicher 30 Frames, warum gehst du nicht einfach speichern 15 Bildern pro Sekunde statt? 679 00:43:23,970 --> 00:43:27,070 Vielmehr als der Film Art von fließenden schön, perfekt, 680 00:43:27,070 --> 00:43:30,060 könnte es aussehen, wie es Stottern ist ein bisschen, ein wenig old school, 681 00:43:30,060 --> 00:43:37,190 aber der Netto-Effekt wird sein, weit weniger Bits als sonst notwendig sein könnte, zu verwenden. 682 00:43:37,190 --> 00:43:39,240 Woher kommt also diese dann lassen Sie uns? 683 00:43:39,240 --> 00:43:41,700 Das war ein bisschen eine Seite, wo sonst können Sie mit Kompression gehen. 684 00:43:41,700 --> 00:43:45,140 Für mehr Informationen darüber, nehmen eine Klasse wie CS175 hier. 685 00:43:45,140 --> 00:43:46,990 Hier ist ein weiteres Beispiel im Video. 686 00:43:46,990 --> 00:43:49,190 Wenn die Biene ist das einzige, was in Bewegung, 687 00:43:49,190 --> 00:43:51,790 Sie können wirklich wegwerfen Informationen in diesen mittleren Rahmen 688 00:43:51,790 --> 00:43:55,260 weil die Blume und Himmel und Blätter werden nicht verändert. 689 00:43:55,260 --> 00:43:57,960 Aber lassen Sie uns betrachten nun eine letzte Sache. 690 00:43:57,960 --> 00:44:03,890 In den nächsten 5 Minuten verlassen wir C für immer hinter sich in der Vorlesung? Ja. Nicht in den pset, though. 691 00:44:03,890 --> 00:44:10,210 Zuletzt Geschichte über C und dann werden wir sehr sexy Zeug 692 00:44:10,210 --> 00:44:13,870 mit HTML und Web-und Woo-hoo. Gut. 693 00:44:13,870 --> 00:44:16,050 Here we go. Das ist die Motivation. 694 00:44:16,050 --> 00:44:20,020 Es stellt sich heraus die ganze Zeit, wenn wir wurden Schreiben von Programmen laufen wir Clang. 695 00:44:20,020 --> 00:44:23,890 Und Clang, die wir seit der ersten Woche ziemlich viel gesagt, nimmt Quellcode 696 00:44:23,890 --> 00:44:25,740 und wandelt sie in Objektcode. 697 00:44:25,740 --> 00:44:28,540 Es dauert C und wandelt es in 0s und 1s. 698 00:44:28,540 --> 00:44:32,150 Ich habe Art von Ihnen liegt seit ein paar Wochen, weil es nicht ganz so einfach. 699 00:44:32,150 --> 00:44:36,750 >> Es gibt eine Menge mehr los unter der Haube, wenn Sie ein Programm wie Clang laufen. 700 00:44:36,750 --> 00:44:39,560 In der Tat kann der Prozess der Erstellung eines Programms wirklich zusammenfassen, 701 00:44:39,560 --> 00:44:42,210 wie man es von Robs Video auf Compilern erinnern, 702 00:44:42,210 --> 00:44:47,580 in diese 4 Schritte: Pre-Processing, sich selbst kompilierte, Montage und Vernetzung. 703 00:44:47,580 --> 00:44:51,950 Aber wir in der Klasse und die meisten Menschen in der Welt in der Regel fassen alle diese Schritte 704 00:44:51,950 --> 00:44:54,410 nur als "kompilieren." 705 00:44:54,410 --> 00:44:58,070 Aber wenn wir mit Source Code wie diesen zu starten, rufen das ist vielleicht die einfachste C-Programm 706 00:44:58,070 --> 00:45:03,530 haben wir bisher geschrieben erinnern, dass beim Kompilieren es so aussieht endet. 707 00:45:03,530 --> 00:45:07,310 Aber es gibt tatsächlich ein Zwischenschritt, und diese Schritte sind wie folgt. 708 00:45:07,310 --> 00:45:10,750 Zuerst gibt es das Ding an der Spitze dieses und die meisten unserer Programme, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Was bedeutet # include für uns tun? 711 00:45:17,210 --> 00:45:24,150 Es ist ziemlich viel kopiert und fügt die Inhalte der stdio.h in meine Datei so, dass warum? 712 00:45:24,150 --> 00:45:27,220 Warum muss ich über den Inhalt der stdio.h kümmern? Was ist da drin von Interesse? 713 00:45:27,220 --> 00:45:32,310 Printf Erklärung, dessen Prototyp, so dass der Compiler weiß dann, was ich meine 714 00:45:32,310 --> 00:45:34,900 wenn ich diese Funktion printf erwähnen. 715 00:45:34,900 --> 00:45:39,390 So Schritt 1 bei der Zusammenstellung ist Pre-Processing, wobei ein Programm wie Clang 716 00:45:39,390 --> 00:45:43,450 oder einige Hilfsprogramm, dass Clang kommt mit liest den Code von oben nach unten, 717 00:45:43,450 --> 00:45:47,740 links nach rechts, und jedes Mal, es sieht ein Symbol # gefolgt von einem Schlüsselwort wie include, 718 00:45:47,740 --> 00:45:53,980 es führt, dass der Betrieb, Kopieren und Einfügen in diesem Fall stdio.h in Ihre Datei. 719 00:45:53,980 --> 00:45:55,510 Das ist Schritt 1. 720 00:45:55,510 --> 00:45:59,620 Dann haben Sie eine viel größere C-Datei wegen der riesigen Kopieren, Einfügen Job, der gerade passiert ist. 721 00:45:59,620 --> 00:46:01,710 >> Schritt 2 wird nun kompilieren. 722 00:46:01,710 --> 00:46:04,880 Aber es stellt sich heraus kompilieren dauert Source Code, der wie folgt aussieht 723 00:46:04,880 --> 00:46:08,160 und verwandelt es in etwas, das wie folgt aussieht, 724 00:46:08,160 --> 00:46:12,560 die für Kenner heißt? >> [Schüler] Versammlung. >> Assembler-Code. 725 00:46:12,560 --> 00:46:16,700 Das ist eigentlich etwas, wenn Sie nehmen CS61 Sie eintauchen werde im Detail. 726 00:46:16,700 --> 00:46:22,380 Dies ist nur ungefähr so ​​nah wie man zu schreiben 0s und 1s sich selbst zu bekommen 727 00:46:22,380 --> 00:46:25,850 aber das Schreiben Dinge in einer Weise, die macht immer noch wenigstens ein wenig Sinn. 728 00:46:25,850 --> 00:46:30,760 Dies sind Maschinenbefehle, und wenn wir unten scrollen, um die Hauptfunktion hier 729 00:46:30,760 --> 00:46:35,470 feststellen, dass es diese Push-Befehl, bewegen Anweisung, subtrahieren Unterricht, 730 00:46:35,470 --> 00:46:38,550 CALL-Anweisung, und so weiter. 731 00:46:38,550 --> 00:46:42,930 Wenn Sie hören, dass Ihr Computer Intel inside hat, 732 00:46:42,930 --> 00:46:46,180 Sie haben eine Intel CPU in Ihrem Mac oder PC, was bedeutet das? 733 00:46:46,180 --> 00:46:51,200 Eine CPU kommt von Unternehmen wie Intel das Verständnis bestimmter Befehle gebaut. 734 00:46:51,200 --> 00:46:55,770 Sie haben keine Ahnung, was Funktionen wie Swap sind oder wichtigsten sind per se, 735 00:46:55,770 --> 00:47:00,060 aber sie wissen, was auf sehr niedriger Ebene Anweisungen wie addieren, subtrahieren, drücken, 736 00:47:00,060 --> 00:47:02,430 bewegen, nennen, und so weiter sind. 737 00:47:02,430 --> 00:47:06,170 Also, wenn Sie C-Code zu kompilieren in Assembler, 738 00:47:06,170 --> 00:47:11,820 Ihre sehr benutzerfreundlich aussehende Code wird in etwas, das wie folgt aussieht umgewandelt, 739 00:47:11,820 --> 00:47:21,670 dass buchstäblich bewegt oder 4 Byte um in so kleinen Einheiten in die und aus der CPU. 740 00:47:21,670 --> 00:47:26,820 Aber schließlich, wenn Clang ist bereit, diese Darstellung Ihres Programm teilnehmen 741 00:47:26,820 --> 00:47:30,940 in 0 und 1, dann wird der Schritt als Montage geschieht, 742 00:47:30,940 --> 00:47:33,850 und dies wiederum alles geschieht im Handumdrehen beim Laufen Clang. 743 00:47:33,850 --> 00:47:39,300 Wir beginnen hier, gibt es eine Datei wie diese, und dann wandelt sie in dieser 0s und 1s. 744 00:47:39,300 --> 00:47:42,000 Und wenn Sie wollen zurück zu einem bestimmten Zeitpunkt und tatsächlich sehen dies in Aktion, 745 00:47:42,000 --> 00:47:48,220 wenn ich gehe in hello1.c--dies ist eines der ersten Programme, die wir betrachtet - 746 00:47:48,220 --> 00:47:53,710 Normalerweise würden wir dies mit Clang hello1.c kompilieren und dies würde uns a.out. 747 00:47:53,710 --> 00:47:59,890 Wenn hingegen geben Sie stattdessen die Option-S, was Sie bekommen, ist hello1.s 748 00:47:59,890 --> 00:48:02,750 und du wirst tatsächlich sehen die Assembler-Sprache. 749 00:48:02,750 --> 00:48:05,750 >> Ich tue dies für einen sehr kurzen Programm, aber wenn Sie zurück zum Scramble 750 00:48:05,750 --> 00:48:08,740 oder Recover oder Programm, das Sie geschrieben haben und nur aus Neugier 751 00:48:08,740 --> 00:48:13,240 wollen sehen, was es tatsächlich aussieht, was tatsächlich in der CPU zugeführt wird, 752 00:48:13,240 --> 00:48:15,700 Sie können, dass-S-Flagge mit Clang verwenden. 753 00:48:15,700 --> 00:48:17,770 Aber dann schließlich gibt es noch ein gotcha. 754 00:48:17,770 --> 00:48:21,810 Hier sind die 0 und 1, die meine Implementierung von Hallo Welt vertreten. 755 00:48:21,810 --> 00:48:25,530 Aber ich habe jemand anderes die Funktion in meinem Programm. 756 00:48:25,530 --> 00:48:28,710 Also auch wenn der Prozess wurde ich hello.c, 757 00:48:28,710 --> 00:48:34,280 Es wird in Assembler-Code kompiliert, und dann wird es in 0 und 1 montiert, 758 00:48:34,280 --> 00:48:37,460 die einzige 0s und 1s, die zu diesem Zeitpunkt ausgegeben werden, 759 00:48:37,460 --> 00:48:40,270 sind diejenigen, die sich aus meinem Code. 760 00:48:40,270 --> 00:48:44,400 Aber die Person, die printf schrieb sie ihren Code kompiliert vor 20 Jahren 761 00:48:44,400 --> 00:48:47,000 und es ist jetzt irgendwo auf dem Gerät installiert ist, 762 00:48:47,000 --> 00:48:51,610 so dass wir irgendwie auf seine 0s und 1s mit meinem 0s und 1s verschmelzen, 763 00:48:51,610 --> 00:48:56,160 und das bringt uns zu der vierten und letzten Schritt der Zusammenstellung, wie die Verknüpfung bekannt. 764 00:48:56,160 --> 00:48:58,680 Also auf der linken Seite haben wir genau das gleiche Bild wie zuvor: 765 00:48:58,680 --> 00:49:02,580 hello.c wird Assembler-Code wird 0s und 1s. 766 00:49:02,580 --> 00:49:05,960 Aber daran erinnern, dass ich die Standard I / O-Bibliothek verwendet in meinem Code, 767 00:49:05,960 --> 00:49:10,350 und das bedeutet, irgendwo auf dem Computer gibt es eine Datei namens stdio.c 768 00:49:10,350 --> 00:49:13,980 oder zumindest die kompilierte Version davon weil jemand vor einigen Jahren 769 00:49:13,980 --> 00:49:18,530 stdio.c kompiliert in Assembler-Code und dann eine ganze Reihe von 0s und 1s. 770 00:49:18,530 --> 00:49:21,130 Dies ist, was als einer statischen oder einer dynamischen Bibliothek bekannt. 771 00:49:21,130 --> 00:49:23,350 Es ist einige Datei irgendwo sitzt im Gerät. 772 00:49:23,350 --> 00:49:28,710 >> Aber schließlich habe ich meine 0s und 1s zu nehmen und diese Person die 0 und 1 773 00:49:28,710 --> 00:49:32,760 und irgendwie miteinander verbinden, buchstäblich zu kombinieren, die 0 und 1 774 00:49:32,760 --> 00:49:37,900 in einer einzigen Datei namens a.out oder hello1 oder was auch immer, rief ich mein Programm 775 00:49:37,900 --> 00:49:43,320 so dass das Endergebnis hat alle 1s und 0s, die mein Programm zusammenstellen sollte. 776 00:49:43,320 --> 00:49:45,660 So all dieser Zeit in diesem Semester, wenn Sie schon mit Clang 777 00:49:45,660 --> 00:49:48,750 und noch mehr kürzlich ausführten machen, um Clang laufen, 778 00:49:48,750 --> 00:49:53,580 Alle diese Schritte wurden geschieht Art sofort, sondern ganz bewusst. 779 00:49:53,580 --> 00:49:57,830 Und so, wenn Sie weiter auf in der Informatik, nämlich CS61, 780 00:49:57,830 --> 00:50:00,850 Das ist die Schicht, dass Sie zu schälen back off gibt es weiterhin 781 00:50:00,850 --> 00:50:06,980 reden Effizienz, Auswirkungen auf die Sicherheit und dergleichen dieser unteren Ebene Details. 782 00:50:06,980 --> 00:50:09,220 Aber damit sind wir dabei, C hinter sich lassen. 783 00:50:09,220 --> 00:50:11,420 Fahren wir fort und nehmen unsere 5-minütige Pause jetzt 784 00:50:11,420 --> 00:50:14,190 und wenn wir zurückkommen: das Internet. 785 00:50:17,280 --> 00:50:19,170 Gut. Wir sind zurück. 786 00:50:19,170 --> 00:50:23,590 Jetzt beginnen wir unseren Blick nicht nur auf HTML, weil, wie Sie sehen werden, 787 00:50:23,590 --> 00:50:26,050 HTML selbst ist eigentlich ziemlich einfach 788 00:50:26,050 --> 00:50:29,270 aber wirklich bei Web-Programmierung allgemein Vernetzung allgemein 789 00:50:29,270 --> 00:50:31,770 und wie alle diese Technologien kommen zusammen 790 00:50:31,770 --> 00:50:35,400 uns zu erlauben, viel mehr anspruchsvolle Programme der Spitze der Internet erstellen 791 00:50:35,400 --> 00:50:38,690 als bisher konnten wir in diesen schwarzen und weißen Fenstern. 792 00:50:38,690 --> 00:50:42,140 In der Tat, an dieser Stelle in den Semesterferien, obwohl wir verbringen relativ weniger Zeit 793 00:50:42,140 --> 00:50:46,200 auf PHP, HTML, CSS, JavaScript, SQL und mehr, 794 00:50:46,200 --> 00:50:48,480 die meisten Studenten zu tun am Ende tut letzten Projekte, die web-basiert sind 795 00:50:48,480 --> 00:50:51,230 denn wie Sie sehen werden, der Hintergrund haben Sie jetzt in C 796 00:50:51,230 --> 00:50:54,450 ist sehr viel für diesen höheren Sprachen. 797 00:50:54,450 --> 00:50:56,800 >> Und wie Sie sich Gedanken über Ihre letzte Projekt, 798 00:50:56,800 --> 00:50:59,940 die, ähnlich wie Problem Set 0, wo Sie wurden ermutigt 799 00:50:59,940 --> 00:51:02,160 die meisten nichts von Interesse für Sie tun Scratch, 800 00:51:02,160 --> 00:51:05,790 das endgültige Projekt ist Ihre Chance, Ihre neu gewonnene Wissen und versierte mit C nehmen 801 00:51:05,790 --> 00:51:09,850 oder PHP oder JavaScript oder dergleichen für eine Testfahrt 802 00:51:09,850 --> 00:51:12,330 und erstellen Sie Ihre eigenen Stück Software für die Welt zu sehen. 803 00:51:12,330 --> 00:51:17,770 Und Samen, den Sie mit Ideen, wissen, dass man hier den Kopf, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Jedes Jahr, erbitten wir Ideen aus Dozenten und Mitarbeiter und Studenten auf dem Campus 805 00:51:21,800 --> 00:51:27,330 nur um ihre Ideen für interessante Dinge, die gelöst mit Computern könnte einreichen, 806 00:51:27,330 --> 00:51:29,860 mit Webseiten, mittels Software. 807 00:51:29,860 --> 00:51:32,360 Also, wenn Sie kämpfen, um mit einer Idee des eigenen, 808 00:51:32,360 --> 00:51:35,790 mit allen Mitteln zu blättern durch die Ideen es ab diesem Jahr und letzte. 809 00:51:35,790 --> 00:51:39,990 Es ist vollkommen in Ordnung, ein Projekt, das in Angriff genommen wurde, bevor anzugehen. 810 00:51:39,990 --> 00:51:44,540 Wir haben viele Apps für das Sehen den Status der Wäsche auf dem Campus gesehen 811 00:51:44,540 --> 00:51:47,000 viele Anwendungen für die Navigation in den Speisesaal Menü 812 00:51:47,000 --> 00:51:49,540 viele Anwendungen für die Navigation im Vorlesungsverzeichnis und dergleichen. 813 00:51:49,540 --> 00:51:53,680 Und in der Tat, in einer zukünftigen Vortrag und in Zukunft Seminare, 814 00:51:53,680 --> 00:51:57,750 stellen wir Ihnen einige öffentlich zugänglichen APIs einzuführen, beide im Handel erhältlich 815 00:51:57,750 --> 00:52:02,520 wie auch hier erhältlich CS50 auf dem Campus, so dass Sie Zugriff auf die Daten 816 00:52:02,520 --> 00:52:04,910 und können dann interessante Dinge mit ihm. 817 00:52:04,910 --> 00:52:09,380 Also mehr über den endgültigen Projekten in ein paar Tagen, wenn wir die Spezifikation freizugeben, 818 00:52:09,380 --> 00:52:12,990 aber jetzt wissen, dass man solo arbeiten oder mit einem oder zwei Freunden 819 00:52:12,990 --> 00:52:16,010 auf fast jedem Projekt für Sie von Interesse. 820 00:52:16,010 --> 00:52:18,080 Das Internet ist. 821 00:52:18,080 --> 00:52:22,300 Du gehst vor und ziehen Sie Ihren Laptop, gehen Sie zu facebook.com zum ersten Mal, 822 00:52:22,300 --> 00:52:27,020 er nicht in letzter Zeit protokolliert, und drücken Sie Enter. Was genau passiert? 823 00:52:27,020 --> 00:52:30,150 >> Wenn Sie auf Ihrem Computer die Eingabetaste drücken, eine ganze Reihe von Schritten 824 00:52:30,150 --> 00:52:32,600 Starten Art von Zauberhand passiert. 825 00:52:32,600 --> 00:52:35,960 Also hier auf der linken Seite, Web-Server wie Facebook ist hier auf der rechten Seite, 826 00:52:35,960 --> 00:52:42,500 und irgendwie Sie verwenden diese Sprache namens HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP ist keine Programmiersprache. Es ist mehr ein Protokoll. 828 00:52:46,770 --> 00:52:52,310 Es ist eine Reihe von Konventionen, dass Web-Browsern und Web-Servern verwenden, wenn kommunizierende. 829 00:52:52,310 --> 00:52:54,360 Und was das bedeutet, ist wie folgt. 830 00:52:54,360 --> 00:52:56,790 Vieles in der realen Welt, wir haben diese Konventionen 831 00:52:56,790 --> 00:53:00,140 wo, wenn Sie treffen einige Menschen zum ersten Mal, wenn Sie nichts dagegen haben humoring mich hier, 832 00:53:00,140 --> 00:53:03,980 Ich könnte kommen zu euch sagen: "Hallo, mein Name ist David." >> Hallo, David. Mein Name ist Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hallo, David. Mein Name ist Sammy." 834 00:53:05,770 --> 00:53:08,310 So, jetzt haben wir gerade in dieser Art von dummen Menschen-Protokoll engagiert 835 00:53:08,310 --> 00:53:12,200 wo ich das Protokoll initiiert hat Sammy reagiert, 836 00:53:12,200 --> 00:53:15,060 haben wir die Hände geschüttelt, und die Transaktion abgeschlossen ist. 837 00:53:15,060 --> 00:53:18,260 HTTP ist sehr ähnlich im Geiste. 838 00:53:18,260 --> 00:53:23,350 Wenn Ihr Web-Browser fordert www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 was Ihr Browser wirklich tut baut seine Hand, so zu sprechen, 840 00:53:27,020 --> 00:53:29,960 an den Server und es dem Senden einer Nachricht. 841 00:53:29,960 --> 00:53:34,220 Und diese Botschaft ist in der Regel so etwas wie bekommen - was wollen Sie kommen? - 842 00:53:34,220 --> 00:53:38,740 mich die Startseite, die in der Regel durch einen einfachen Schrägstrich am Ende der URL bezeichnet wird. 843 00:53:38,740 --> 00:53:43,790 Und damit Sie wissen, welche Sprache ich spreche, bin ich der Browser werde Ihnen sagen, 844 00:53:43,790 --> 00:53:46,930 daß ich spreche HTTP Version 1.1, 845 00:53:46,930 --> 00:53:51,980 Und auch für eine gute Maßnahme, ich werde Ihnen sagen, dass der Gastgeber, die ich möchte die Homepage 846 00:53:51,980 --> 00:53:54,120 ist facebook.com. 847 00:53:54,120 --> 00:53:57,730 Typischerweise wird ein Web-Browser, ohne Wissen Sie, der Mensch, 848 00:53:57,730 --> 00:54:03,350 sendet diese Meldung über das Internet, wenn Sie geben einfach www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Geben Sie in Ihrem Browser. 850 00:54:05,370 --> 00:54:07,300 Und was bedeutet Facebook antwortet mit? 851 00:54:07,300 --> 00:54:12,540 Es reagiert mit einigen ähnlich aussehende kryptische Details, sondern auch vieles mehr. 852 00:54:12,540 --> 00:54:14,310 Lassen Sie mich gehen Sie vor, um Facebook-Homepage hier. 853 00:54:14,310 --> 00:54:17,480 Dies ist der Bildschirm, dass die meisten von uns wohl nie sehen, wenn Sie in all der Zeit angemeldet bleiben, 854 00:54:17,480 --> 00:54:19,830 aber dies ist in der Tat ihrer Homepage. 855 00:54:19,830 --> 00:54:24,150 Wenn wir dies in Chrome zu tun, feststellen, dass Sie ziehen diese kleinen Kontextmenüs. 856 00:54:24,150 --> 00:54:26,980 Mit Chrome, ob auf Mac OS, Windows, Linux, oder dergleichen, 857 00:54:26,980 --> 00:54:31,840 Wenn Sie oder linken Maustaste steuern, können Sie in der Regel nach oben ziehen ein Menü, das wie folgt aussieht, 858 00:54:31,840 --> 00:54:35,870 wo ein paar Optionen zu erwarten, ist eine von denen View Page Source. 859 00:54:35,870 --> 00:54:39,920 Sie können in der Regel auch auf diese Dinge zu bekommen, indem Sie auf das Menü Ansicht und stochern. 860 00:54:39,920 --> 00:54:42,750 Zum Beispiel, hier unter Ansicht ist Entwickler die gleiche Sache. 861 00:54:42,750 --> 00:54:45,780 Ich werde weitermachen und schauen View Page Source. 862 00:54:45,780 --> 00:54:50,800 Was Sie sehen, ist das HTML, dass Mark hat geschrieben facebook.com vertreten. 863 00:54:50,800 --> 00:54:55,910 Es ist ein komplettes Chaos hier, aber wir werden sehen, dass dies ein wenig mehr Sinn macht es dauerte nicht lange. 864 00:54:55,910 --> 00:54:59,840 Aber es gibt einige Muster hier. Lassen Sie mich nach unten scrollen, wie dieses Zeug. 865 00:54:59,840 --> 00:55:05,730 Das ist schwer für einen Menschen zu lesen, aber feststellen, dass es dieses Muster der spitzen Klammern 866 00:55:05,730 --> 00:55:10,360 mit Schlüsselwörtern wie Option Schlüsselwörter wie Wert, einige Zeichenfolgen in Anführungszeichen. 867 00:55:10,360 --> 00:55:15,660 Dies ist, wo, wenn Sie sich angemeldet haben für das erste Mal, angegeben, was Ihr Geburtsjahr ist. 868 00:55:15,660 --> 00:55:19,020 Das Dropdown-Menü der Geburt Jahr ist irgendwie kodiert hier 869 00:55:19,020 --> 00:55:23,870 in dieser Sprache namens HTML, Hypertext Markup Language. 870 00:55:23,870 --> 00:55:27,730 In anderen Worten, wenn Ihr Browser eine Webseite anfordert, 871 00:55:27,730 --> 00:55:30,610 es spricht diese Konvention als HTTP. 872 00:55:30,610 --> 00:55:35,170 Aber was bedeutet facebook.com auf dieses Ersuchen reagieren mit? 873 00:55:35,170 --> 00:55:38,260 >> Es reagiert mit einigen dieser kryptischen Botschaften, wie wir in einem Moment sehen. 874 00:55:38,260 --> 00:55:43,760 Aber die meisten seiner Antwort in Form von HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Das ist die eigentliche Sprache, in der eine Web-Seite geschrieben wird. 876 00:55:47,170 --> 00:55:52,030 Und was für ein Web-Browser wirklich so ist, nach Erhalt von etwas, das wie folgt aussieht, 877 00:55:52,030 --> 00:55:57,120 liest es von oben nach unten, von links nach rechts, und jedes Mal, es sieht eine dieser spitzen Klammern 878 00:55:57,120 --> 00:56:03,370 gefolgt von einem Schlüsselwort wie die Option, zeigt es, dass die Markup-Sprache in geeigneter Weise. 879 00:56:03,370 --> 00:56:06,820 In diesem Fall wäre es eine entsprechende Dropdown-Menü von Jahren. 880 00:56:06,820 --> 00:56:09,240 Aber auch dies ist ein komplettes Chaos zu betrachten. 881 00:56:09,240 --> 00:56:16,630 Dies ist nicht, weil Facebook-Entwickler 0 für 5 manifestieren für Stil, zum Beispiel. 882 00:56:16,630 --> 00:56:20,190 Dies ist, weil die meisten der Code, den sie schreiben, ist in der Tat geschrieben schön, 883 00:56:20,190 --> 00:56:22,450 gut kommentiert, schön eingerückt, und dergleichen, 884 00:56:22,450 --> 00:56:26,080 aber natürlich Maschinen, Computer, Browser wirklich nicht give a damn 885 00:56:26,080 --> 00:56:27,890 ob Ihr Code ist gut gestylt. 886 00:56:27,890 --> 00:56:33,100 Und in der Tat, es ist völlig unwirtschaftlich, drücken Sie die Tab-Taste alle jene Zeiten 887 00:56:33,100 --> 00:56:37,650 und legte Kommentare Alles gesamten Code und wirklich aussagekräftigen Variablennamen wählen 888 00:56:37,650 --> 00:56:42,340 denn wenn der Browser nicht egal ist, ist alles, was Sie am Ende des Tages zu tun vergeuden Bytes. 889 00:56:42,340 --> 00:56:46,660 >> So stellt sich heraus, was die meisten Websites zu tun ist, obwohl der Quellcode für facebook.com, 890 00:56:46,660 --> 00:56:49,550 für cs50.net und alle diese anderen Seiten im Internet 891 00:56:49,550 --> 00:56:53,730 sind in der Regel gut geschrieben und gut kommentiert und schön eingerückt und dergleichen, 892 00:56:53,730 --> 00:56:59,270 in der Regel vor der Website ins Internet gestellt wird, wird der Code minimierte, 893 00:56:59,270 --> 00:57:02,970 wobei die HTML und CSS - etwas, was wir bald sehen - 894 00:57:02,970 --> 00:57:05,960 der JavaScript-Code, den wir bald sehen wird komprimiert, 895 00:57:05,960 --> 00:57:09,250 wobei lange Variablennamen zu X und Y und Z, 896 00:57:09,250 --> 00:57:13,900 und all das Leerzeichen, die alles so lesbar macht ist alles weggeworfen, 897 00:57:13,900 --> 00:57:17,700 denn wenn man es auf diese Weise denken, bekommt Facebook eine Milliarde Seitenaufrufen einen Tag - 898 00:57:17,700 --> 00:57:21,670 etwas Verrücktes wie die - so was ist, wenn ein Programmierer nur um anal 899 00:57:21,670 --> 00:57:26,660 drücken Sie die Leertaste ein extra Zeit nur Gedankenstrich einige Codezeile noch so viel mehr? 900 00:57:26,660 --> 00:57:29,500 Was ist die Implikation, wenn Facebook bewahrt, dass Leerzeichen 901 00:57:29,500 --> 00:57:32,880 in all der Bytes schicken sie zurück zum Menschen über das Internet? 902 00:57:32,880 --> 00:57:36,400 Schlagen Sie die Leertaste, sobald gibt Ihnen eine zusätzliche Byte in Ihrer Datei. 903 00:57:36,400 --> 00:57:39,730 Und wenn eine Milliarde Menschen gehen dann auf die Homepage downloaden an diesem Tag, 904 00:57:39,730 --> 00:57:42,060 wie viel mehr Daten haben Sie über das Internet übertragen? 905 00:57:42,060 --> 00:57:45,200 Ein Gigabyte für keinen guten Grund. 906 00:57:45,200 --> 00:57:48,510 Und gewährt, für eine Vielzahl von Websites, das ist nicht so eine skalierbare Ausgabe, 907 00:57:48,510 --> 00:57:51,030 aber für Facebook, Google, für einige der beliebtesten Websites 908 00:57:51,030 --> 00:57:54,860 es großer Anreiz finanziell, um Ihren Code wie ein Chaos aussehen 909 00:57:54,860 --> 00:57:58,980 so dass Sie möglichst wenige Bytes wie möglich mit zusätzlich dann komprimieren 910 00:57:58,980 --> 00:58:01,500 mit so etwas wie zip, als ein Algorithmus gzip, 911 00:58:01,500 --> 00:58:04,250 , dass der Browser automatisch für Sie. Aber das ist schrecklich. 912 00:58:04,250 --> 00:58:08,060 Wir werden es nie erfahren Sie alles über anderer Leute Webseiten und wie man Web-Seiten gestalten 913 00:58:08,060 --> 00:58:09,680 wenn wir müssen es so aussehen. 914 00:58:09,680 --> 00:58:13,620 >> So glücklicherweise Browsern wie Chrome und IE und Firefox in diesen Tagen 915 00:58:13,620 --> 00:58:16,450 typischerweise mit eingebautem Entwickler-Tools kommen. 916 00:58:16,450 --> 00:58:21,730 In der Tat, wenn ich hier unten gehen, um Element oder Prüfen gehe ich anschauen, Developer, 917 00:58:21,730 --> 00:58:25,220 und Developer Tools explizit zu gehen, 918 00:58:25,220 --> 00:58:27,640 Dieses Fenster an der Unterseite von meinem Bildschirm erscheint jetzt. 919 00:58:27,640 --> 00:58:31,230 Es ist ein wenig einschüchternd auf den ersten, denn es gibt eine Menge von unbekannten tabs hier 920 00:58:31,230 --> 00:58:34,510 aber wenn ich auf Elemente klicken Sie den ganzen Weg in der linken unteren, 921 00:58:34,510 --> 00:58:38,810 Chrome ist offensichtlich ziemlich schlau. Er weiß, wie der gesamte Code zu interpretieren. 922 00:58:38,810 --> 00:58:42,320 Und so was Chrome tut, ist es säubert alle Facebook-HTML. 923 00:58:42,320 --> 00:58:45,680 Auch wenn es nicht Leerzeichen gibt, gibt es nicht Einzug dort, 924 00:58:45,680 --> 00:58:51,120 Jetzt merke, dass ich damit beginnen, diese Web-Seite umso hierarchisch navigieren. 925 00:58:51,120 --> 00:58:56,910 Es stellt sich heraus, dass jede Web-Seite in einer Sprache namens HTML5 geschrieben werden sollte mit diesem zu starten, 926 00:58:56,910 --> 00:59:03,980 Diese DOCTYPE-Deklaration, so zu sprechen: 927 00:59:03,980 --> 00:59:07,840 Es ist eine Art von Licht und grau gibt, aber das ist die erste Zeile des Codes in dieser Datei 928 00:59:07,840 --> 00:59:12,080 und das sagt nur den Browser "Hey, hier kommt etwas HTML5. Hier kommt eine Web-Seite." 929 00:59:12,080 --> 00:59:18,490 Die erste Klammer darüber hinaus passiert, dieses Ding, eine offene Halterung HTML-Tag sein, 930 00:59:18,490 --> 00:59:22,320 und dann, wenn ich tauchen tiefer - diese Pfeile sind völlig bedeutungslos; 931 00:59:22,320 --> 00:59:25,140 sie sind nur für die Präsentation willen, sie sind nicht wirklich in der Datei - 932 00:59:25,140 --> 00:59:30,300 feststellen, dass innerhalb der HTML tag von Facebook, alles, was mit einer Klammer beginnt 933 00:59:30,300 --> 00:59:32,910 und dann hat ein Wort ist ein Tag genannt. 934 00:59:32,910 --> 00:59:38,610 So in der HTML-Tag ist offenbar ein Kopf-Tag und ein Body-Tag. 935 00:59:38,610 --> 00:59:41,930 Im Inneren des Kopfes tag ist jetzt eine ganze Durcheinander für Facebook 936 00:59:41,930 --> 00:59:45,620 denn sie haben eine Menge von Metadaten und andere Dinge für Marketing und Werbung. 937 00:59:45,620 --> 00:59:50,600 >> Aber wenn wir nach unten scrollen, down, down, down, mal sehen, wo es ist. Hier ist es. 938 00:59:50,600 --> 00:59:52,210 Dieser ist zumindest etwas bekannt. 939 00:59:52,210 --> 00:59:55,990 Der Titel der Facebook-Homepage, wenn Sie jemals zu sehen in der Registerkarte in Ihrer Titelleiste 940 00:59:55,990 --> 00:59:59,060 ist Welcome to Facebook - Einloggen, Registrieren oder Erfahren Sie mehr. 941 00:59:59,060 --> 01:00:01,110 Das ist das, was man in Chrome die Titelleiste zu sehen, 942 01:00:01,110 --> 01:00:03,100 und das ist, wie es im Code ist vertreten. 943 01:00:03,100 --> 01:00:08,090 Wenn wir alles im Kopf zu ignorieren, sind die meisten der Mut einer Web-Seite in den Körper, 944 01:00:08,090 --> 01:00:10,940 und es stellt sich heraus, dass Facebook-Code aussehen wird komplexer 945 01:00:10,940 --> 01:00:14,540 als die meisten Dinge, die wir dann zunächst zu schreiben, nur weil es gewesen ist im Laufe der Jahre gebaut, 946 01:00:14,540 --> 01:00:17,260 aber es gibt eine ganze Reihe von Skript-Tags, JavaScript-Code, 947 01:00:17,260 --> 01:00:18,870 das macht die Website sehr interaktiv: 948 01:00:18,870 --> 01:00:22,330 Sehen Status-Updates sofort mit Sprachen wie JavaScript. 949 01:00:22,330 --> 01:00:25,270 Es gibt so etwas wie ein div, die ein Geschäftsbereich von einer Seite ist. 950 01:00:25,270 --> 01:00:27,940 Aber bevor wir zu diesem Detail zu gehen, wollen wir versuchen zu verkleinern 951 01:00:27,940 --> 01:00:31,920 und eine einfachere Version von Facebook 1,0 aussehen, so zu sprechen. 952 01:00:31,920 --> 01:00:34,740 Hier ist die Hallo Welt von Web-Seiten. 953 01:00:34,740 --> 01:00:37,370 Es hat diesen DOCTYPE-Deklaration an der Spitze 954 01:00:37,370 --> 01:00:40,280 das ist ein wenig anders als alles andere. 955 01:00:40,280 --> 01:00:46,130 Nichts anderes haben wir in einer Web-Seite zu schreiben wird mit 01:00:48,880 und außer für etwas namens Kommentare in HTML. 957 01:00:48,880 --> 01:00:53,000 Aber zum größten Teil, alles ist in einer Web-Seite öffnende Klammer, Stichwort, Klammer. 958 01:00:53,000 --> 01:00:56,220 >> In diesem Fall können Sie die einfachste von Web-Seiten möglich. 959 01:00:56,220 --> 01:01:00,260 Das HTML-Tag enthält eine head-Tag und es enthält einen Körper tag, 960 01:01:00,260 --> 01:01:04,580 aber feststellen, dass es diese Vorstellung von Starten und Stoppen Tags. 961 01:01:04,580 --> 01:01:11,360 Dies ist der Starttag für HTML, das ist die enge tag oder End-Tag. 962 01:01:11,360 --> 01:01:15,400 Beachten Sie, dass diese Art von Gegensätzen sind in dem Sinne, dass die enge tag oder End-Tag 963 01:01:15,400 --> 01:01:20,030 hat dies uns innerhalb von sich selbst zu senken. 964 01:01:20,030 --> 01:01:23,540 Inzwischen gibt es eine offene head-Tag hier und eine enge Kopf-Tag hier. 965 01:01:23,540 --> 01:01:26,880 >> Es ist ein offenes Titel und eine enge Titel-Tag hier. 966 01:01:26,880 --> 01:01:29,850 Die Tatsache, dass ich den Titel auf einer Linie, rein willkürlich gesetzt. 967 01:01:29,850 --> 01:01:33,760 Es sah aus wie es schön wäre in eine Zeile passen, so dass ich nicht die Mühe Enter drücken ein paar mal. 968 01:01:33,760 --> 01:01:38,200 Inzwischen Gedankenstrich der Körper habe ich nur noch so klar. 969 01:01:38,200 --> 01:01:41,050 Beachten Sie, dass HTML eine ziemlich dumme Sprache ist. 970 01:01:41,050 --> 01:01:43,410 In der Tat, wieder in den Tag, bevor es WYSIWYG-Editoren 971 01:01:43,410 --> 01:01:46,770 und Microsoft Word, wo Sie sagen können "Machen Sie diese fett, machen diese kursiv" 972 01:01:46,770 --> 01:01:50,850 Sie würden tatsächlich geben kleine Kommandos in Aufsätzen 20 + Jahren 973 01:01:50,850 --> 01:01:55,740 wobei man sagen würde: "Beginnen Sie diesen Text fett. Stoppen Sie die diesen Text fett." 974 01:01:55,740 --> 01:01:59,010 "Beginnen Sie diesen Text kursiv. Stoppen Sie die dieser Text kursiv." 975 01:01:59,010 --> 01:02:01,850 >> Das ist, was HTML oder Markup-Sprache ist. 976 01:02:01,850 --> 01:02:05,530 Dieser erste Tag sagt: "Hey, Browser. Hier kommt etwas HTML." 977 01:02:05,530 --> 01:02:09,880 Der nächste Tag sagt: "Hey, Browser. Hier kommt der Kopf, der Kopf meiner Web-Seite." 978 01:02:09,880 --> 01:02:11,650 "Hey, Browser. Hier kommt der Titel." 979 01:02:11,650 --> 01:02:15,880 Und dann hier rüber, "Hey, Browser. Das ist es für den Titel." 980 01:02:15,880 --> 01:02:20,000 Also das ist, wie der Browser nicht mehr angezeigt werden mehr Zeichen als hallo kennt, weltweit 981 01:02:20,000 --> 01:02:21,860 in der Titelleiste. 982 01:02:21,860 --> 01:02:23,640 Inzwischen dies sagt, "Das ist es für den Kopf." 983 01:02:23,640 --> 01:02:28,340 Dieser sagt: "Hier kommt der Körper Hier ist der eigentliche Körper." - Buchstäblich die Worte Hallo Welt. 984 01:02:28,340 --> 01:02:33,190 Und das hier sagt, "Das ist es für den Körper. Das ist es für den HTML." 985 01:02:33,190 --> 01:02:34,640 So Browser sind ziemlich dumm. 986 01:02:34,640 --> 01:02:39,920 Sie gerade gelesen das Zeug von oben nach unten, von links nach rechts, und genau das tun, was ihnen gesagt wird, zu tun. 987 01:02:39,920 --> 01:02:41,860 Lasst uns tatsächlich ein kleines Beispiel hier. 988 01:02:41,860 --> 01:02:46,240 Lassen Sie mich eröffnen die einfachsten Programme auf meinem Mac hier, nämlich TextEdit. 989 01:02:46,240 --> 01:02:48,220 Unter Windows könnte Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Aber das ist alles, was Sie brauchen, um so Web-Seiten. 991 01:02:50,520 --> 01:02:53,730 Ich werde weitermachen und einfach kopieren und fügen Sie diesen Code in dieser Datei. 992 01:02:53,730 --> 01:02:57,210 Ich werde weitermachen und speichern Sie es auf meinem Desktop, 993 01:02:57,210 --> 01:03:01,220 und ich werde dies als hello.html speichern, 994 01:03:01,220 --> 01:03:03,840 und jetzt wird die Datei hello.html benannt. 995 01:03:03,840 --> 01:03:05,690 Hier ist es auf meinem Desktop. 996 01:03:05,690 --> 01:03:11,130 Lassen Sie mich nun in einem Browser zu gehen und ziehen Sie die Datei in den Browser. 997 01:03:11,130 --> 01:03:14,060 Und voila, hier ist meine erste Web-Seite. 998 01:03:14,060 --> 01:03:17,340 Beachten Sie, dass der Titel der Registerkarte hallo ist weltweit nach dem Titel-Tag, 999 01:03:17,340 --> 01:03:20,040 und bemerken, dass Hallo Welt der Körper meiner Web-Seite ist, 1000 01:03:20,040 --> 01:03:22,190 und woo-hoo, ich bin auf dem Internet. 1001 01:03:22,190 --> 01:03:24,700 >> Ich bin nicht wirklich, rechts, da diese Datei nicht auf dem Internet. 1002 01:03:24,700 --> 01:03:28,330 Es passiert auf meinem lokalen Festplatte an diesem bestimmten Pfad sein. 1003 01:03:28,330 --> 01:03:32,720 Aber die Idee ist die gleiche. Alles, was wir jetzt brauchen, ist ein Web-Server, auf die sie hochladen. 1004 01:03:32,720 --> 01:03:37,410 Aber lassen Sie uns zuerst tatsächlich einzuführen ein wenig mehr Komplexität und ein wenig mehr Stilisierung. 1005 01:03:37,410 --> 01:03:39,890 Dies ist eine einfache, wenn langweilig, Web-Seite. 1006 01:03:39,890 --> 01:03:41,990 Es stellt sich heraus es andere Arten von Tags können wir benutzen sind. 1007 01:03:41,990 --> 01:03:45,530 Zum Beispiel hier in gelb Ich habe 2 neue Tags eingeführt. 1008 01:03:45,530 --> 01:03:49,630 Wir werden nicht spielen viel mit diesen heute, aber feststellen, dass die Link-Tag 1009 01:03:49,630 --> 01:03:52,520 irgendwie sieht anders aus als alles andere. 1010 01:03:52,520 --> 01:03:55,370 Der Link-Tag nimmt, was sind die Attribute genannt, 1011 01:03:55,370 --> 01:03:59,770 und ein Attribut ist etwas, das Verhalten eines tag modifiziert. 1012 01:03:59,770 --> 01:04:03,840 In diesem Fall ist dies nicht die beste Wahl von Namen, Link, weil es irgendwie sinnlos, 1013 01:04:03,840 --> 01:04:11,590 aber dieser Link tag sagt, im Wesentlichen beinhalten die Datei namens styles.css Innenseite meiner Web-Seite. 1014 01:04:11,590 --> 01:04:15,400 Sie können sich diese als analog zu denken C die # include-Direktive. 1015 01:04:15,400 --> 01:04:19,650 Styles.css wird auf eine andere Sprache bezogen insgesamt, dass wir nicht mit der heutigen zu spielen, 1016 01:04:19,650 --> 01:04:23,790 aber es ist für Ästhetik: Schriftgrößen, Farben, Polster, Einzug, Ränder 1017 01:04:23,790 --> 01:04:26,040 und alle diese Art von Ästhetik Detail. 1018 01:04:26,040 --> 01:04:28,820 Inzwischen ist das Skript tag funktionell ähnliche 1019 01:04:28,820 --> 01:04:33,140 aber anstatt include CSS, dass die Sprache, enthält es eine andere Sprache, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Also mit anderen Worten, mit diesen 2 Tags werde ich schließlich in der Lage, meine eigene Web-Seite zu schreiben 1021 01:04:37,810 --> 01:04:41,490 sondern auch im Code zu ziehen, dass ich oder jemand anderes geschrieben hat 1022 01:04:41,490 --> 01:04:44,350 so dass wir auf andere Menschen auf ihren Schultern stehen, können wir üben gutes Design, 1023 01:04:44,350 --> 01:04:46,120 Ausklammern gemeinsamen Code. 1024 01:04:46,120 --> 01:04:49,090 Wenn ich 10 verschiedene Web-Seiten haben, bedeutet dies, dass einige meiner Ästhetik 1025 01:04:49,090 --> 01:04:52,490 können ausgeklammert werden, ähnlich wie # include in einer separaten Datei. 1026 01:04:52,490 --> 01:04:54,420 Also werden wir es bekommen. 1027 01:04:54,420 --> 01:04:57,180 Aber lasst uns eigentlich erst etwas interessanter mit dieser Datei. 1028 01:04:57,180 --> 01:05:01,110 >> Auch dies ist nur TextEdit. Ich bin technisch nicht auf dem Internet noch nicht, aber wir werden es schaffen. 1029 01:05:01,110 --> 01:05:04,910 Ich möchte hallo, Welt ein wenig mutiger als es ist. 1030 01:05:04,910 --> 01:05:10,890 So hallo, wir willkürlich sagen für fett. 1031 01:05:10,890 --> 01:05:15,910 Auch hier ist die Geschichte das gleiche: hallo, Komma, beginnen, diese kühne, 1032 01:05:15,910 --> 01:05:19,730 Dann Welt wird fett gedruckt, und das bedeutet mehr drucken diese in Fettschrift. 1033 01:05:19,730 --> 01:05:24,020 Lassen Sie mich gehen Sie vor und speichern Sie meine Datei, gehen Sie zurück zu Chrome, werde ich in nur so können wir es besser sehen zu vergrößern, 1034 01:05:24,020 --> 01:05:27,870 und laden Sie, und Sie werden sehen, dass die Welt nun fett. 1035 01:05:27,870 --> 01:05:31,810 Das Web ist alles über Hyperlinks, also lasst uns weitermachen und dies zu tun: 1036 01:05:31,810 --> 01:05:38,550 meine Lieblings-Webseite ist, sagen wir mal, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Speichern, neu zu laden. Okay. Es gibt ein paar Probleme jetzt neben der Abscheulichkeit der Website. 1038 01:05:43,810 --> 01:05:47,310 1, ich bin ziemlich sicher, dass ich getroffen Geben Sie hier. Und das tat ich. 1039 01:05:47,310 --> 01:05:51,590 Ich habe nicht nur getroffen, ich auch eingerückt Enter praktizieren, was wir über Stil gepredigt, 1040 01:05:51,590 --> 01:05:54,930 aber meine ist direkt neben Welt. 1041 01:05:54,930 --> 01:05:58,410 Warum ist dies so? Browser nur tun, was Sie zu tun ist. 1042 01:05:58,410 --> 01:06:04,010 Ich habe nicht den Browser gesagt, "Break-Linien hier. Absatz hier zu brechen. Einfügen" 1043 01:06:04,010 --> 01:06:07,820 So Browser, spielt es keine Rolle, ob ich zurück 30 Mal getroffen, 1044 01:06:07,820 --> 01:06:10,820 es ist immer noch zu meiner Rechten neben Welt zu setzen. 1045 01:06:10,820 --> 01:06:15,930 Was ich wirklich hier tun müssen, ist so etwas sagen wie
, legen Sie einen Zeilenumbruch. 1046 01:06:15,930 --> 01:06:17,940 >> Und tatsächlich ist ein Zeilenumbruch eine Art seltsame Sache 1047 01:06:17,940 --> 01:06:21,650 weil Sie nicht wirklich starten kann Wechsel zu einer anderen Linie, dann tun Sie etwas, 1048 01:06:21,650 --> 01:06:25,380 und dann nicht mehr bewegt, um eine neue Zeile. Es ist eine Art einer atomaren Operation. 1049 01:06:25,380 --> 01:06:28,140 Entweder tun Sie es oder eben nicht. Sie Enter oder eben nicht. 1050 01:06:28,140 --> 01:06:33,390 So br ist ein wenig von einem anderen Tag, und so muss ich sowohl offen sortieren und schließen Sie es 1051 01:06:33,390 --> 01:06:35,230 alles auf einmal. 1052 01:06:35,230 --> 01:06:37,500 Die Syntax dafür ist. 1053 01:06:37,500 --> 01:06:41,760 Technisch könnte man etwas wie dies in einigen Versionen von HTML zu tun, 1054 01:06:41,760 --> 01:06:45,600 aber das ist einfach nur dumm, denn es gibt keinen Grund, zu starten und zu stoppen etwas 1055 01:06:45,600 --> 01:06:48,420 wenn man stattdessen tun sie alle auf einmal. 1056 01:06:48,420 --> 01:06:52,310 Erkenne, dass HTML5 nicht zwingend erforderlich diese Schrägstrich, 1057 01:06:52,310 --> 01:06:55,410 so werden Sie sehen, Lehrbüchern und Online-Ressourcen, die es nicht haben, 1058 01:06:55,410 --> 01:06:59,780 aber für eine gute Maßnahme lasst uns üben die Symmetrie, die wir bisher gesehen haben. 1059 01:06:59,780 --> 01:07:02,870 Dies bedeutet, dass das Tag sowohl geöffnet und geschlossen ist. 1060 01:07:02,870 --> 01:07:05,220 So, jetzt lass mich retten meine Datei, gehen Sie hier zurück. 1061 01:07:05,220 --> 01:07:10,240 Okay, es fängt an besser aussehen, mit Ausnahme der Web Ich weiß, ist eine Art anklickbar 1062 01:07:10,240 --> 01:07:13,610 und doch youtube hier scheint nicht zu nichts führen. 1063 01:07:13,610 --> 01:07:17,560 Das ist denn auch wenn es wie ein Link aussieht, ist der Browser nicht wissen, dass per se, 1064 01:07:17,560 --> 01:07:20,670 so habe ich den Browser sagen, dass dies ein Link ist. 1065 01:07:20,670 --> 01:07:22,620 >> Die Art und Weise, dies zu tun ist, um ein Anker-Tag verwenden: 1066 01:07:22,620 --> 01:07:26,770 01:07:35,900 = "Http://www.youtube.com"> 1068 01:07:35,900 --> 01:07:38,490 und lassen Sie mich zu bewegen diese zu einer neuen Zeile einfach so, es ist ein wenig mehr lesbar, 1069 01:07:38,490 --> 01:07:40,060 und ich werde schrumpfen die Schriftgröße. 1070 01:07:40,060 --> 01:07:43,890 Ich bin noch nicht fertig? Nein, es geht um diese Dichotomie sein. 1071 01:07:43,890 --> 01:07:46,760 Dieser Tag, der Anker-Tag, tatsächlich zu nehmen ein Attribut, 1072 01:07:46,760 --> 01:07:52,900 was ändert sein Verhalten, und der Wert dieses Attributs ist offenbar YouTube URL. 1073 01:07:52,900 --> 01:07:56,380 Aber beachten Sie die Dichotomie ist, dass, nur weil das der URL Sie gehst ist, 1074 01:07:56,380 --> 01:08:01,020 das bedeutet nicht, das hat das Wort, das Sie unterstreichen und macht einen Link sein. 1075 01:08:01,020 --> 01:08:03,960 Vielmehr kann das so etwas wie dieses. 1076 01:08:03,960 --> 01:08:10,870 Also ich muss sagen, aufhören, dieses Wort ein Hyperlink durch die enge Anker-Tag. 1077 01:08:10,870 --> 01:08:12,650 Beachten Sie, ich tue das nicht. 1078 01:08:12,650 --> 01:08:15,890 1, würde dies nur eine Verschwendung von Zeit aller Beteiligten sein, und es ist nicht notwendig. 1079 01:08:15,890 --> 01:08:19,290 >> Um einen Tag zu schließen, können Sie nur den Namen des Tags wieder. 1080 01:08:19,290 --> 01:08:21,800 Sie erwähnen nicht, eines der Attribute. 1081 01:08:21,800 --> 01:08:26,189 Lassen Sie uns also retten, gehen Sie zurück. Okay, voila, jetzt ist es blau und Hyperlinks. 1082 01:08:26,189 --> 01:08:29,430 Wenn ich es auf, ich tatsächlich gehen auf YouTube. 1083 01:08:29,430 --> 01:08:32,529 Also auch wenn meine Web-Seite ist nicht über das Internet, ist es zumindest HTML, 1084 01:08:32,529 --> 01:08:37,930 und wenn lassen wir das Internet aufzuholen, würden wir tatsächlich am Ende hier bei youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Und ich kann zurück gehen und hier ist meine Web-Seite. Aber bemerkt. 1086 01:08:40,670 --> 01:08:43,120 Wenn Sie jemals Spam oder eine Phishing-Attacke geworden, 1087 01:08:43,120 --> 01:08:45,850 Jetzt haben Sie die Möglichkeit nach nur fünf Minuten, um das gleiche zu tun. 1088 01:08:45,850 --> 01:08:50,920 Wir können hier gehen und etwas tun, wie www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 oder was auch immer die skizzenhaften Website ist, und dann kann man sagen, ob Ihr PayPal-Konto. 1090 01:08:59,319 --> 01:09:04,840 [Gelächter] Und jetzt wird auf badguy.com, die werde ich nicht auf Sie zu gehen 1091 01:09:04,840 --> 01:09:08,000 weil ich habe keine Ahnung, wohin das führt. [Gelächter] 1092 01:09:08,000 --> 01:09:10,859 >> Aber wir haben jetzt die Möglichkeit, tatsächlich dort enden. 1093 01:09:10,859 --> 01:09:12,640 So sind wir wirklich gerade erst an der Oberfläche kratzen. 1094 01:09:12,640 --> 01:09:15,830 Wir sind nicht die Programmierung per se; wir schreiben Markup-Sprache. 1095 01:09:15,830 --> 01:09:18,569 Aber sobald wir runden unser Wortschatz in HTML, 1096 01:09:18,569 --> 01:09:21,520 wir stellen PHP, eine tatsächliche Programmiersprache 1097 01:09:21,520 --> 01:09:26,859 das wird es uns ermöglichen, HTML automatisch generieren, erzeugen CSS automatisch 1098 01:09:26,859 --> 01:09:29,430 so dass wir am Mittwoch beginnen, zu implementieren, zu sagen, 1099 01:09:29,430 --> 01:09:31,700 unsere eigene Suchmaschine und vieles mehr. 1100 01:09:31,700 --> 01:09:34,770 Aber mehr dazu in ein paar Tagen. Wir sehen uns dann. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]