1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Minggu 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Universitas Harvard] 3 00:00:04,730 --> 00:00:07,490 [Ini adalah CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Baiklah. Selamat datang kembali. Ini adalah CS50, dan ini adalah awal minggu 7. 5 00:00:12,280 --> 00:00:14,690 Beberapa pengumuman kecil: 6 00:00:14,690 --> 00:00:18,150 Pset5 sedang berlangsung sekarang, atau segera akan, 7 00:00:18,150 --> 00:00:21,590 dan saya katakan, cukup jujur, hal ini cenderung menjadi salah satu lebih menantang 8 00:00:21,590 --> 00:00:24,460 set masalah saja, jadi biarkan saya menyebutkan ini sekarang 9 00:00:24,460 --> 00:00:28,190 sehingga minggu ini lebih dari sebelumnya Anda tidak menunggu sampai, katakanlah, Rabu malam 10 00:00:28,190 --> 00:00:29,920 atau Kamis malam untuk menyelam masuk 11 00:00:29,920 --> 00:00:32,369 Ini jelas merupakan pset menarik. Kami pikir itu menyenangkan. 12 00:00:32,369 --> 00:00:36,110 Jika Anda benar-benar mendapatkan sepenuhnya benar dan kemudian dapat menantang Dewan yang disebut Big, 13 00:00:36,110 --> 00:00:39,830 Anda akan memiliki kesempatan untuk mencocokkan akal dengan beberapa staf saja yang 14 00:00:39,830 --> 00:00:41,620 dan beberapa teman sekelas Anda. 15 00:00:41,620 --> 00:00:44,670 Apa Dewan Big adalah sekali Anda memiliki spell checker-kerja Anda, 16 00:00:44,670 --> 00:00:48,860 Anda akan dapat pergi ke cs50.net setelah menjalankan perintah, 17 00:00:48,860 --> 00:00:52,430 murni memilih, dan kemudian jumlah waktu dan jumlah RAM dan lebih 18 00:00:52,430 --> 00:00:56,130 yang telah digunakan dalam pelaksanaan Anda akan dipamerkan di sini di halaman rumah kursus itu. 19 00:00:56,130 --> 00:00:59,740 Anda akan melihat bahwa sejumlah besar orang-orang di sini yang terdaftar sebagai staf 20 00:00:59,740 --> 00:01:04,220 karena selama akhir pekan, staf pikir akan menyenangkan untuk mencoba mengalahkan satu sama lain. 21 00:01:04,220 --> 00:01:07,390 Jadi menyadari bahwa tujuan di sini bukan untuk mengalahkan staf. 22 00:01:07,390 --> 00:01:09,790 Bahkan saya hanya di sini di nomor 13. 23 00:01:09,790 --> 00:01:13,790 Murni memilih, tapi kesempatan untuk melihat betapa sedikit RAM 24 00:01:13,790 --> 00:01:16,790 dan bagaimana beberapa detik CPU Anda dapat menggunakan vis-a-vis beberapa teman sekelas Anda. 25 00:01:16,790 --> 00:01:20,540 >> Dan aku akan mengakui bahwa Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 saat ini dalam posisi nomor 1 sebagai salah satu TF, 27 00:01:23,750 --> 00:01:28,120 ini adalah sebuah implementasi yang kita sebut tidak mungkin 28 00:01:28,120 --> 00:01:32,700 mengingat bahwa dia menggunakan hampir 0 RAM dan hampir 0 detik untuk loading. 29 00:01:32,700 --> 00:01:35,670 Jadi kami akan mengurus offline Kevin. [Tertawa] 30 00:01:35,670 --> 00:01:40,950 Ada keterampilan tertentu yang Kevin adalah menempatkan untuk menguji di sini. 31 00:01:40,950 --> 00:01:45,280 Salah satu hal yang kami pikir kami akan melakukan terlalu sekarang CS50x adalah seminggu berlangsung, 32 00:01:45,280 --> 00:01:49,520 dan kalian menjadi bagian dari percobaan ini sebagai pelajar tersebut. 33 00:01:49,520 --> 00:01:53,720 Kami sudah meminta mereka sebagai bagian dari pset0 mereka, yang sama untuk menyerahkan proyek Scratch 34 00:01:53,720 --> 00:01:58,280 yang menarik bagi mereka - permainan, sepotong seni interaktif, animasi, atau sejenisnya - 35 00:01:58,280 --> 00:02:03,700 1 - video untuk 2 menit, jika mereka ingin, menyapa dunia dan siapa mereka sebenarnya. 36 00:02:03,700 --> 00:02:06,780 Saya pikir saya akan berbagi dengan Anda hanya beberapa video yang telah disampaikan sejauh ini 37 00:02:06,780 --> 00:02:10,759 karena bagi kami, pada staf setidaknya, itu benar-benar telah menarik 38 00:02:10,759 --> 00:02:14,220 dan inspirasi untuk melihat orang-orang dari seluruh dunia - negara di seluruh dunia - 39 00:02:14,220 --> 00:02:18,160 tuning, dari segala hal, untuk kursus ilmu komputer di Internet, 40 00:02:18,160 --> 00:02:20,410 apakah itu karena mereka ingin melanjutkan studi mereka sendiri, 41 00:02:20,410 --> 00:02:22,300 mereka ingin mengambil karir mereka dalam arah yang baru, 42 00:02:22,300 --> 00:02:24,390 mereka ingin untuk mengisi kesenjangan dalam pengetahuan mereka sendiri, 43 00:02:24,390 --> 00:02:27,190 sehingga beberapa alasan yang sama bahwa kalian mungkin telah di sini. 44 00:02:27,190 --> 00:02:31,090 >> Jadi aku memberikan satu siswa seperti di sini. Anda bisa meningkatkan volume hanya sedikit. 45 00:02:31,090 --> 00:02:35,520 Berikut adalah salah satu dari 1 menit mahasiswa kami pengiriman. 46 00:02:35,520 --> 00:02:40,380 Halo, dunia. Saya seorang mahasiswa teknik industri di sini di Malaga, Spanyol. 47 00:02:40,380 --> 00:02:45,840 Saya gembira tentang kursus online ini karena saya mencintai ilmu komputer, aku benar-benar, 48 00:02:45,840 --> 00:02:48,880 dan saya benar-benar menghargai bahwa saya bisa menjelajahinya. 49 00:02:48,880 --> 00:02:51,940 Dan fakta bahwa saya bisa belajar sama semua kalian lakukan 50 00:02:51,940 --> 00:02:57,040 tapi bukannya berada di Harvard saya di Malaga, bagaimana awesome adalah bahwa? 51 00:02:57,040 --> 00:03:02,040 Nah, saya Fernando, dan ini adalah CS50. Lihat kalian. 52 00:03:02,040 --> 00:03:07,100 [Tertawa] lain klip kita sangat suka, Anda akan menemukan bahwa Bahasa Inggris ini pria ini tidak begitu kuat. 53 00:03:07,100 --> 00:03:11,520 Sepertinya dia itu diterjemahkan mesin, sehingga terjemahan sendiri sedikit tidak sempurna, 54 00:03:11,520 --> 00:03:15,790 tapi ini adalah salah satu favorit kami sejauh ini juga. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Halo, dunia. [Berbicara dalam bahasa Jepang] 57 00:03:32,370 --> 00:03:39,830 [Aku juga harus menyapa dalam bahasa Jepang karena bahasa Inggris saya sangat bisa diandalkan.] 58 00:03:39,830 --> 00:03:45,380 [Saya telah menyampaikan pesan kepada Anda dari kota Gifu, Jepang.] 59 00:03:45,380 --> 00:03:49,820 [Saya bisa menjadi seorang mahasiswa untuk pertama kalinya dalam 20 tahun, seperti yang bisa dilihat.] 60 00:03:49,820 --> 00:03:54,640 [Saya sangat berterima kasih kepada Harvard University yang memberi saya kesempatan ini dan EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf adalah gitar dan hal favorit saya berjalan.] [Tertawa] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Mengapa Anda pikir saya mencoba untuk menghadiri sebuah cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Universitas Harvard, itu adalah kerinduan saya.] 65 00:04:14,990 --> 00:04:19,740 [Apalagi jika kehadiran saya jauh tinggal di Jepang.] 66 00:04:19,740 --> 00:04:26,680 [Saya ingin mencoba segera menyadari keberadaan EDX seperti ketika.] 67 00:04:26,680 --> 00:04:32,500 [Jangan Anda pikir sehingga Anda tidak berhubungan dengan usia belajar I.] 68 00:04:32,500 --> 00:04:38,350 [Cs50 adalah kerinduan saya. Nama saya adalah Kazu, dan ini adalah cs50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [tepuk tangan dan bersorak] 70 00:04:43,090 --> 00:04:49,220 Lain favorit kami adalah penyerahan ini dari seseorang di sini. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google jika Anda tidak terbiasa dengan meme ini. 72 00:04:55,380 --> 00:05:01,480 >> Dan kemudian terakhir, beberapa orang lain yang mendapat diposting bahwa mungkin memenangkan penghargaan menggemaskan. 73 00:05:01,480 --> 00:05:06,820 [Mahasiswa] Aww! >> [Malan] Kita harus mendengarkan. Ini adalah pendek, jadi dengarkan erat. 74 00:05:08,580 --> 00:05:11,150 [Speaker perempuan] Siapa nama Anda? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Speaker perempuan] Apa ini? >> [Cekikikan] CS50. [Tertawa] 76 00:05:16,120 --> 00:05:19,510 [Malan] Dia mengambil dua, meskipun. 77 00:05:19,510 --> 00:05:22,240 Di sini kita pergi, yang terakhir. 78 00:05:23,030 --> 00:05:26,980 Nama saya adalah Louie, dan ini adalah CS50. 79 00:05:26,980 --> 00:05:30,250 [Tertawa] Ini kemudian adalah CS50x. 80 00:05:30,250 --> 00:05:33,230 Terima kasih kepada semua orang dari Anda sambil mengikuti dari awal di rumah 81 00:05:33,230 --> 00:05:35,620 yang telah mengambil bagian sejauh ini. 82 00:05:35,620 --> 00:05:39,510 Hari ini, kita menyimpulkan diskusi kita struktur data, 83 00:05:39,510 --> 00:05:41,160 setidaknya beberapa yang paling mendasar, 84 00:05:41,160 --> 00:05:44,760 dan kemudian kita lanjutkan pembicaraan kita tentang HTML dan pemrograman web. 85 00:05:44,760 --> 00:05:48,520 Memang, kita telah menghabiskan masa lalu sekitar tujuh minggu melihat dasar-dasar pemrograman - 86 00:05:48,520 --> 00:05:50,450 algoritma, struktur data, dan sejenisnya - 87 00:05:50,450 --> 00:05:53,050 dan C, karena Anda mungkin telah mengalami sejauh ini, 88 00:05:53,050 --> 00:05:57,060 belum tentu yang paling mudah diakses dari bahasa 89 00:05:57,060 --> 00:05:59,090 yang dapat digunakan untuk mengimplementasikan beberapa dari ide-ide. 90 00:05:59,090 --> 00:06:01,880 Dan sehingga mulai minggu ini dan minggu depan dan kemudian berikut, 91 00:06:01,880 --> 00:06:07,110 kita akhirnya akan dapat transisi dari C, yang umumnya dikenal sebagai bahasa yang cukup tingkat rendah, 92 00:06:07,110 --> 00:06:11,190 hal-hal tingkat yang lebih tinggi, di antaranya PHP, JavaScript, dan sejenisnya, 93 00:06:11,190 --> 00:06:14,850 yang kita akan melihat memanfaatkan pelajaran yang sama yang telah kita pelajari selama beberapa minggu terakhir, 94 00:06:14,850 --> 00:06:19,430 tetapi Anda akan menemukan bahwa menyatakan hal-hal seperti array dan tabel hash dan mencari dan menyortir 95 00:06:19,430 --> 00:06:23,370 menjadi jauh lebih mudah karena bahasa itu sendiri kita akan mulai menggunakan 96 00:06:23,370 --> 00:06:25,290 akan menjadi lebih kuat. 97 00:06:25,290 --> 00:06:27,410 Tapi pertama-tama, sebuah aplikasi pohon. 98 00:06:27,410 --> 00:06:30,240 Ini sangat umum hari ini perlu untuk kompres informasi. 99 00:06:30,240 --> 00:06:34,770 Dalam konteks apa yang akan Anda ingin untuk kompres beberapa jenis informasi digital? 100 00:06:37,190 --> 00:06:39,670 >> Ya. >> [Mahasiswa] Bila Anda perlu untuk mengirimkannya melalui Web. 101 00:06:39,670 --> 00:06:41,450 Ya, ketika Anda ingin mengirim sesuatu melalui Web. 102 00:06:41,450 --> 00:06:44,950 Jika Anda ingin men-download file berukuran besar, itu ideal jika seseorang di ujung lain 103 00:06:44,950 --> 00:06:48,760 telah dikompresi file yang menggunakan format zip atau sesuatu seperti itu 104 00:06:48,760 --> 00:06:53,760 sehingga Anda mengirim lebih sedikit bit daripada yang mungkin ditransmisikan. 105 00:06:53,760 --> 00:06:55,500 Jadi bagaimana Anda kompres informasi? 106 00:06:55,500 --> 00:07:00,540 Itu semua bermuara pada menggunakan lebih sedikit bit daripada yang disyaratkan oleh standar. 107 00:07:00,540 --> 00:07:03,220 Tapi ini adalah semacam hal yang aneh karena berpikir kembali ke minggu 0 dan 1 108 00:07:03,220 --> 00:07:07,370 ketika kita berbicara tentang ASCII dan biner dan kami berbicara tentang ASCII pada khususnya 109 00:07:07,370 --> 00:07:10,690 dengan menggunakan 8 bit untuk mewakili huruf abjad 110 00:07:10,690 --> 00:07:16,120 sehingga huruf A diwakili oleh 65, huruf kecil adalah nomor 97, 111 00:07:16,120 --> 00:07:21,210 dan bagaimanapun Anda mewakili 65 atau 97, Anda menggunakan 7 atau 8 bit. 112 00:07:21,210 --> 00:07:24,120 Tapi menangkap adalah bahwa ada beberapa huruf dalam abjad Inggris 113 00:07:24,120 --> 00:07:26,230 yang tidak sepopuler orang lain. 114 00:07:26,230 --> 00:07:31,600 Z tidak semua yang populer, Q tidak semua yang populer, tapi A dan E yang super populer. 115 00:07:31,600 --> 00:07:37,280 Namun untuk semua surat-surat, secara default dunia menggunakan jumlah bit yang sama, hanya 8. 116 00:07:37,280 --> 00:07:42,690 Jadi tidak akan menjadi lebih cerdas jika bukan menggunakan 8 bit untuk setiap surat, 117 00:07:42,690 --> 00:07:47,440 bahkan yang paling jarang digunakan seperti Q dan Z, 118 00:07:47,440 --> 00:07:51,910 bagaimana jika kita menggunakan lebih sedikit bit untuk A dan E dan S dan huruf yang paling populer 119 00:07:51,910 --> 00:07:55,000 dan digunakan lebih bit untuk huruf kurang populer, 120 00:07:55,000 --> 00:07:57,770 ide yang mengoptimalkan mari untuk kasus umum, 121 00:07:57,770 --> 00:08:01,160 yang merupakan tema dalam ilmu komputer mencoba untuk mengoptimalkan apa yang akan terjadi yang paling 122 00:08:01,160 --> 00:08:05,310 dan menghabiskan waktu lebih sedikit, sedikit lebih banyak ruang pada hal-hal yang, yah, mungkin terjadi 123 00:08:05,310 --> 00:08:07,680 tetapi tidak harus sesering. 124 00:08:07,680 --> 00:08:09,330 Jadi mari kita contoh. 125 00:08:09,330 --> 00:08:12,610 >> Misalkan kita ingin mengkodekan informasi yang cukup efisien. 126 00:08:12,610 --> 00:08:15,090 Anda mungkin telah tumbuh mengetahui sedikit tentang kode Morse, 127 00:08:15,090 --> 00:08:17,450 dan kemungkinan besar Anda tidak tahu kode aktual, 128 00:08:17,450 --> 00:08:21,750 tetapi Anda mungkin ingat bahwa itu setidaknya rangkaian titik dan garis. 129 00:08:21,750 --> 00:08:26,640 Ini adalah coding cukup efisien, dan perhatikan bahwa huruf yang paling populer - misalnya, E - 130 00:08:26,640 --> 00:08:28,980 menggunakan terpendek beep. 131 00:08:28,980 --> 00:08:31,740 Kode Morse adalah semua tentang bip-bip-bip-bip-bip bip-dan memegang nada 132 00:08:31,740 --> 00:08:34,799 baik untuk jangka waktu yang singkat atau jangka waktu yang lama. 133 00:08:34,799 --> 00:08:40,330 E, seperti yang dilambangkan oleh titik, adalah bip super pendek, hanya bip, dan itu akan mewakili E. 134 00:08:40,330 --> 00:08:43,960 Sebaliknya, T akan menjadi bip panjang, seperti bip [memperpanjang suara], 135 00:08:43,960 --> 00:08:45,710 dan yang akan mewakili T. 136 00:08:45,710 --> 00:08:48,840 Tapi itu masih cukup pendek karena, sebaliknya, jika Anda melihat Z, 137 00:08:48,840 --> 00:08:52,690 untuk mengekspresikan Z Anda akan pergi bip, bip [lagi suara], bip, bip [suara pendek]. 138 00:08:52,690 --> 00:08:55,360 Jadi lebih lama karena kurang umum. 139 00:08:55,360 --> 00:08:58,150 Tapi Gotcha sini adalah bahwa kode Morse adalah sedikit cacat 140 00:08:58,150 --> 00:09:00,610 di bahwa itu tidak segera decodable. 141 00:09:00,610 --> 00:09:07,350 Sebagai contoh, misalkan Anda mendengar pada beberapa akhir bip kawat [singkat], bip [lama]. 142 00:09:07,350 --> 00:09:12,480 Pesan apa yang aku terima? Sebuah titik dan tanda hubung. Apa yang mewakili? 143 00:09:12,480 --> 00:09:15,330 [Mahasiswa] A. >> [Malan] Mungkin. 144 00:09:15,330 --> 00:09:18,270 Hal ini juga bisa menjadi E diikuti oleh T. 145 00:09:18,270 --> 00:09:23,390 Dengan kata lain, kode Morse, meskipun memanfaatkan prinsip ini mengoptimalkan kasus sudut, 146 00:09:23,390 --> 00:09:26,250 tidak meminjamkan dirinya untuk decodability langsung. 147 00:09:26,250 --> 00:09:29,850 Artinya, manusia yang mendengar atau menerima titik-titik dan garis 148 00:09:29,850 --> 00:09:34,540 harus entah bagaimana mencari tahu di mana istirahat adalah antara huruf, 149 00:09:34,540 --> 00:09:39,660 karena jika Anda tidak tahu di mana mereka istirahat, Anda mungkin bingung A untuk ET atau sebaliknya. 150 00:09:39,660 --> 00:09:43,880 >> Jadi apa yang mungkin Anda lakukan? Dalam kode Morse Anda hanya bisa berhenti antara masing-masing huruf. 151 00:09:43,880 --> 00:09:47,660 Tapi berhenti adalah jenis counter untuk seluruh titik mempercepat segalanya. 152 00:09:47,660 --> 00:09:52,880 Jadi bagaimana jika sebaliknya kita datang dengan kode di mana tidak ada situasi yang buruk 153 00:09:52,880 --> 00:09:56,570 di mana E adalah awalan, misalnya, dari A - 154 00:09:56,570 --> 00:10:00,020 dengan kata lain, jika kita bisa memastikan bahwa pola yang masih singkat untuk huruf populer 155 00:10:00,020 --> 00:10:04,850 lama untuk huruf kurang populer, tetapi tidak ada kebingungan mungkin? 156 00:10:04,850 --> 00:10:08,930 Seorang pria dengan nama Huffman tahun lalu menemukan skema ini disebut Huffman coding 157 00:10:08,930 --> 00:10:12,390 yang benar-benar memanfaatkan salah satu struktur data yang kita telah menghabiskan sedikit waktu berbicara tentang 158 00:10:12,390 --> 00:10:16,560 minggu terakhir ini, bahwa pohon, pohon biner khusus - 159 00:10:16,560 --> 00:10:19,710 pohon biner yang berarti bahwa ia tidak memiliki lebih dari 2 anak. 160 00:10:19,710 --> 00:10:22,720 Ini mungkin memiliki anak kiri, mungkin anak kanan, dan hanya itu. 161 00:10:22,720 --> 00:10:26,510 Jadi misalkan hanya demi diskusi yang seseorang ingin mengirim pesan 162 00:10:26,510 --> 00:10:31,270 yang terlihat seperti ini. Ini omong kosong tapi itu terdiri dari As, B, C, Ds, dan Es. 163 00:10:31,270 --> 00:10:34,890 Dan jika Anda benar-benar menghitung semua As, B, C, Ds, dan Es 164 00:10:34,890 --> 00:10:36,870 dan kemudian membagi dengan jumlah total surat, 165 00:10:36,870 --> 00:10:42,710 tabel ini kecil di sini mengatakan bahwa 45% dari surat-surat Es, 20% adalah As, 166 00:10:42,710 --> 00:10:45,010 10% B, dan sebagainya. 167 00:10:45,010 --> 00:10:47,330 Jadi dengan kata lain, menganggap bahwa string dikutip ada 168 00:10:47,330 --> 00:10:49,080 hanya beberapa pesan yang ingin Anda kirim. 169 00:10:49,080 --> 00:10:52,180 Ini terjadi menjadi omong kosong hanya supaya kita bisa digunakan sebagai huruf sesedikit mungkin, 170 00:10:52,180 --> 00:10:55,220 tapi itu memang terjadi bahwa E tetap yang paling populer, 171 00:10:55,220 --> 00:11:01,450 dan B dan C adalah yang paling populer, setidaknya dari 5 huruf abjad. 172 00:11:01,450 --> 00:11:04,040 Jadi bagaimana kita bisa pergi tentang datang dengan sebuah encoding, 173 00:11:04,040 --> 00:11:08,430 pengkodean biner, pola 0s dan 1s untuk masing-masing huruf 174 00:11:08,430 --> 00:11:14,820 sedemikian rupa sehingga E adalah pola singkat dan mungkin B dan C adalah pola sedikit lebih lama, 175 00:11:14,820 --> 00:11:19,270 lagi, gagasan bahwa kita ingin menggunakan sedikit bit sebagian besar waktu 176 00:11:19,270 --> 00:11:21,790 dan lebih bit hanya sekali-sekali. 177 00:11:21,790 --> 00:11:26,070 Menurut Huffman coding, Anda dapat membuat hutan pohon. 178 00:11:26,070 --> 00:11:31,190 Ada semacam alur cerita di sini yang melibatkan pohon dan juga proses membangun mereka. 179 00:11:31,190 --> 00:11:32,420 Mari kita mulai. 180 00:11:32,420 --> 00:11:36,140 >> Saya mengusulkan agar Anda mulai dengan hutan ini, sehingga untuk berbicara, dari 5 pohon, 181 00:11:36,140 --> 00:11:38,260 masing-masing adalah pohon yang cukup bodoh. 182 00:11:38,260 --> 00:11:42,800 Pohon ini terdiri dari hanya satu node, yang diwakili di sini oleh sebuah lingkaran. 183 00:11:42,800 --> 00:11:45,310 Jadi masing-masing hal mungkin struct C 184 00:11:45,310 --> 00:11:50,200 dan bagian dalam struct C mungkin pelampung mewakili jumlah frekuensi 185 00:11:50,200 --> 00:11:52,510 dan kemudian mungkin char mewakili surat itu. 186 00:11:52,510 --> 00:11:56,470 Jadi pikirkan node ini sebagai sembarang struct C tua tetapi, untuk saat ini, tingkat yang lebih tinggi. 187 00:11:56,470 --> 00:12:01,230 Ini adalah hutan dari 5 pohon, masing-masing yang hanya memiliki satu node. 188 00:12:01,230 --> 00:12:06,830 Apa Huffman diusulkan adalah bahwa kita mulai menggabungkan pohon-pohon 189 00:12:06,830 --> 00:12:11,140 yang memiliki jumlah frekuensi terkecil ke pohon sedikit lebih besar 190 00:12:11,140 --> 00:12:13,490 dengan menghubungkan mereka dengan simpul akar baru. 191 00:12:13,490 --> 00:12:17,560 Jadi antara surat-surat di sini, perhatikan bahwa untuk kenyamanan saya telah mengurutkannya dari kiri ke kanan, 192 00:12:17,560 --> 00:12:21,420 meskipun itu tidak benar-benar diperlukan, dan perhatikan bahwa terkecil node 193 00:12:21,420 --> 00:12:23,930 saat ini 10% dan 10%. 194 00:12:23,930 --> 00:12:28,940 Jadi Huffman mengusulkan bahwa kita gabungkan 2 node terkecil menjadi pohon baru 195 00:12:28,940 --> 00:12:34,450 dengan memperkenalkan node induk baru dan kemudian memberikan orangtua bahwa anak kiri dan anak kanan 196 00:12:34,450 --> 00:12:37,720 dimana B adalah sewenang-wenang kiri dan C adalah sewenang-wenang kanan. 197 00:12:37,720 --> 00:12:41,590 Dan kemudian Huffman lanjut mengusulkan bahwa mari kita sekarang hanya berpikir tentang anak kiri 198 00:12:41,590 --> 00:12:44,790 di salah satu pohon selalu seperti yang diwakili oleh 0 199 00:12:44,790 --> 00:12:47,890 dan anak kanan selalu sebagai yang diwakili oleh angka 1. 200 00:12:47,890 --> 00:12:50,680 >> Tidak masalah jika Anda flip mereka selama Anda konsisten. 201 00:12:50,680 --> 00:12:54,650 Jadi sekarang kita memiliki empat pohon di hutan ini. 202 00:12:54,650 --> 00:12:58,050 Dan saya mengatakan empat karena sekarang pohon di sebelah kiri - 203 00:12:58,050 --> 00:13:00,570 dan itu tidak begitu banyak pohon dalam arti bahwa itu tumbuh dengan cara ini, 204 00:13:00,570 --> 00:13:05,170 itu lebih seperti sebuah pohon keluarga mana sekarang 0,2 adalah semacam induk dari dua anak - 205 00:13:05,170 --> 00:13:07,930 melihat bahwa di orangtua kita telah ditarik 0,2. 206 00:13:07,930 --> 00:13:13,370 Kami telah menambahkan jumlah frekuensi dari dua anak dan diberi node baru jumlah total. 207 00:13:13,370 --> 00:13:15,310 Jadi sekarang kita hanya ulangi proses ini. 208 00:13:15,310 --> 00:13:19,490 Menemukan dua node terkecil dan kemudian bergabung dengan mereka menjadi pohon baru 209 00:13:19,490 --> 00:13:21,380 dan kemudian ulangi proses lebih lanjut. 210 00:13:21,380 --> 00:13:26,390 Saat ini kami memiliki beberapa calon, 20%, 15%, dan 20%. 211 00:13:26,390 --> 00:13:29,780 Dalam hal ini, kita harus memutuskan ikatan itu. Kita bisa melakukannya secara sewenang-wenang. 212 00:13:29,780 --> 00:13:31,540 Kami hanya harus melakukannya secara konsisten. 213 00:13:31,540 --> 00:13:33,760 Dalam kasus ini, saya sewenang-wenang akan pergi dengan satu di sebelah kiri, 214 00:13:33,760 --> 00:13:39,880 dan sekarang saya menggabungkan 20% dan 15% untuk memberikan orang tua baru yang disebut 35%, 215 00:13:39,880 --> 00:13:46,310 yang anak kiri adalah 0, yang haknya anak 1, dan sekarang kami memiliki hanya tiga pohon di hutan. 216 00:13:46,310 --> 00:13:47,960 Anda mungkin bisa melihat mana hal ini terjadi. 217 00:13:47,960 --> 00:13:51,150 Jika kita ulangi ini beberapa kali lebih banyak, kita akan memiliki hanya satu pohon besar, 218 00:13:51,150 --> 00:13:53,900 semua yang ujung-ujungnya diberi label dengan 0s dan 1s. 219 00:13:53,900 --> 00:13:55,710 Mari kita melakukannya lagi. 220 00:13:55,710 --> 00:14:02,600 35% adalah akar pohon itu. 20% dan 45%, jadi kita akan menggabungkan 35% dan 20%. 221 00:14:02,600 --> 00:14:05,610 Sekarang kita memiliki pohon ini di sini. Kami menambahkan mereka bersama-sama, kita memiliki 55%. 222 00:14:05,610 --> 00:14:07,910 Sekarang hanya ada dua pohon di hutan. 223 00:14:07,910 --> 00:14:11,900 Kami melakukan ini satu kali terakhir, dan mudah-mudahan matematis semua frekuensi menambahkan 224 00:14:11,900 --> 00:14:15,570 karena mereka sejak kita harus dihitung mereka dari mendapatkan-pergi untuk menambahkan hingga 100%. 225 00:14:15,570 --> 00:14:17,960 Dan sekarang kita memiliki satu pohon. 226 00:14:17,960 --> 00:14:20,580 Jadi ini adalah Huffman coding pohon. 227 00:14:20,580 --> 00:14:24,400 Ini semacam butuh waktu beberapa saat untuk sampai ke sana secara verbal, tetapi kenyataannya adalah dengan untuk loop 228 00:14:24,400 --> 00:14:27,620 atau dengan fungsi rekursif, Anda bisa membangun hal ini cukup cepat. 229 00:14:27,620 --> 00:14:32,440 Jadi sekarang kita memiliki satu node baru, dan semua node dalam telah malloc'd, 230 00:14:32,440 --> 00:14:34,690 mungkin, sepanjang jalan. 231 00:14:34,690 --> 00:14:38,650 Jadi sekarang di bagian atas pohon ini kami memiliki 100%, tapi sekarang melihat kami memiliki jalan 232 00:14:38,650 --> 00:14:43,780 dari ini baru yang besar-besar-besar-kakek untuk semua yang besar-besar-besar-cucu 233 00:14:43,780 --> 00:14:45,930 semua jalan di bagian bawah, untuk semua daun. 234 00:14:45,930 --> 00:14:52,840 >> Apa yang akan kita lakukan sekarang adalah mengusulkan bahwa dalam rangka untuk mewakili huruf E, 235 00:14:52,840 --> 00:14:55,670 kita hanya akan menggunakan nomor 1. Kenapa? 236 00:14:55,670 --> 00:15:01,000 Karena jika kita melintasi pohon ini dari akar sampai ke akhir daun yang dikenal sebagai E, 237 00:15:01,000 --> 00:15:06,050 kita mengikuti hanya satu ujung, tepi kanan, dan yang berlabel tentu pada 1 kanan atas. 238 00:15:06,050 --> 00:15:11,550 Jadi implikasi sini untuk Huffman encoding adalah bahwa E dalam biner hanya harus 1. 239 00:15:11,550 --> 00:15:14,490 Dan itu cukup sialan efisien. Tidak bisa benar-benar mendapatkan lebih kecil dari itu. 240 00:15:14,490 --> 00:15:18,350 Sebaliknya, A akan diwakili, jika Anda mengikuti logika, 241 00:15:18,350 --> 00:15:21,610 dengan apa pola bit bukan? 01. 242 00:15:21,610 --> 00:15:25,500 Jadi untuk sampai ke A, kita mulai dari akar dan kami pergi kiri dan kemudian kita pergi kanan, 243 00:15:25,500 --> 00:15:28,580 yang berarti kami mengikuti 0 dan kemudian 1. 244 00:15:28,580 --> 00:15:32,810 Jadi kita akan mewakili huruf A dengan pola 0 dan 1. 245 00:15:32,810 --> 00:15:36,010 Dan sekarang perhatikan kita sudah memiliki properti decodability langsung 246 00:15:36,010 --> 00:15:38,090 bahwa kita tidak memiliki dalam kode Morse. 247 00:15:38,090 --> 00:15:42,840 Meskipun kedua pola cukup pendek - E adalah 1 bit, A adalah 2 bit - 248 00:15:42,840 --> 00:15:45,080 melihat bahwa mereka tidak dapat bingung satu atau yang lain, 249 00:15:45,080 --> 00:15:54,870 karena jika Anda melihat 1 itu harus menjadi E, jika Anda melihat 0 maka 1 itu jelas harus menjadi A. 250 00:15:54,870 --> 00:15:58,410 Demikian pula, apa D? 001. 251 00:15:58,410 --> 00:16:01,440 Apa itu C? 0001. 252 00:16:01,440 --> 00:16:05,320 Dan apa B? 0000. 253 00:16:05,320 --> 00:16:09,550 Dan lagi, karena semua surat-surat kita peduli berada di daun 254 00:16:09,550 --> 00:16:13,890 dan tidak satupun dari mereka adalah jenis perantara di jalan dari akar ke daun, 255 00:16:13,890 --> 00:16:18,760 tidak ada risiko conflating pengkodean yang berbeda 2 huruf ' 256 00:16:18,760 --> 00:16:22,300 karena semua pola bit yang deterministik. 257 00:16:22,300 --> 00:16:25,280 0000 akan selalu B. 258 00:16:25,280 --> 00:16:29,480 Tidak ada simpul di suatu tempat di antara yang mungkin membingungkan satu surat untuk yang lain. 259 00:16:29,480 --> 00:16:31,150 Jadi apa implikasi di sini? 260 00:16:31,150 --> 00:16:35,080 >> Surat yang paling populer - dalam hal ini kasus E - telah mendapat pengkodean terpendek, 261 00:16:35,080 --> 00:16:37,430 Sebuah telah mendapat pengkodean terpendek berikutnya, 262 00:16:37,430 --> 00:16:41,390 dan B dan C, yang kita sudah tahu dari jenis get-pergi adalah yang paling tidak populer 263 00:16:41,390 --> 00:16:45,390 pada frekuensi 10% masing-masing, mereka telah mendapatkan pengkodean terpanjang. 264 00:16:45,390 --> 00:16:49,410 Dan jadi apa ini berarti sekarang adalah bahwa jika Anda ingin mengirim pesan yang dikompresi 265 00:16:49,410 --> 00:16:51,950 melalui Internet atau dalam email atau sejenisnya, 266 00:16:51,950 --> 00:16:56,730 daripada menggunakan ASCII standar, Anda dapat mengirim pesan berkode Huffman 267 00:16:56,730 --> 00:17:01,720 dimana jika Anda ingin mengirim huruf E, Anda mengirim hanya satu bit. 268 00:17:01,720 --> 00:17:05,680 Jika Anda ingin mengirim A, Anda mengirim 2 bit, 01, bukannya mengirimkan 8 bit 269 00:17:05,680 --> 00:17:10,190 diikuti oleh 8 bit diikuti oleh 8 bit dan sebagainya. 270 00:17:10,190 --> 00:17:11,940 Tapi ada gotcha di sini. 271 00:17:11,940 --> 00:17:17,079 Ini tidak cukup hanya membangun pohon ini dan kemudian mulai mengirim dari Alice untuk Bob 272 00:17:17,079 --> 00:17:20,010 pola sedikit lebih pendek, string dari ASCII, 273 00:17:20,010 --> 00:17:23,140 karena Alice juga harus menginformasikan Bob apa 274 00:17:23,140 --> 00:17:26,880 jika Bob akan dapat membaca pesan terkompresi nya? 275 00:17:26,880 --> 00:17:30,770 [Respon siswa terdengar] >> Apa itu? 276 00:17:30,770 --> 00:17:32,310 [Respon siswa terdengar] >> Dari apa pohon tersebut. 277 00:17:32,310 --> 00:17:35,160 Atau bahkan lebih spesifik, apa yang pengkodean yang, 278 00:17:35,160 --> 00:17:39,010 terutama karena selama cerita ini kami membuat panggilan penghakiman pada satu titik. 279 00:17:39,010 --> 00:17:43,640 Ingat bahwa kita harus memilih sewenang-wenang antara 2 node 20% yang berbeda? 280 00:17:43,640 --> 00:17:49,800 Jadi bukan kasus yang Bob, penerima, hanya dapat merekonstruksi pohon sendiri 281 00:17:49,800 --> 00:17:53,390 karena mungkin dia akan membuat pohon yang sedikit berbeda dari Alice. 282 00:17:53,390 --> 00:17:56,670 Selain itu, Bob bahkan tidak tahu apa pesan asli 283 00:17:56,670 --> 00:18:00,770 karena satu-satunya Alice mengirim dia, tentu saja, adalah pesan terkompresi. 284 00:18:00,770 --> 00:18:05,900 >> Jadi hasil tangkapan dengan kompresi seperti ini adalah bahwa, ya, Alice dapat menyimpan seluruh banyak bit 285 00:18:05,900 --> 00:18:09,900 dengan mengirimkan 1 untuk E dan 01 untuk A dan sebagainya, 286 00:18:09,900 --> 00:18:15,180 tapi dia juga harus menginformasikan apa Bob pemetaan antara huruf dan bit 287 00:18:15,180 --> 00:18:19,620 karena mereka tidak bisa dengan jelas mengandalkan hanya ASCII lagi jika kita tidak menggunakan ASCII. 288 00:18:19,620 --> 00:18:22,200 Jadi dia bisa mengirimkan pohon entah bagaimana - 289 00:18:22,200 --> 00:18:26,600 menuliskannya, menyimpannya sebagai data biner atau sesuatu seperti itu - 290 00:18:26,600 --> 00:18:30,280 atau hanya mengirimkan contekan kecil, file Excel, yang menunjukkan pemetaan. 291 00:18:30,280 --> 00:18:36,480 Jadi efektivitas kompresi benar-benar menganggap bahwa pesan yang Anda mengirim 292 00:18:36,480 --> 00:18:40,230 cukup besar, setidaknya menengah, 293 00:18:40,230 --> 00:18:42,180 karena jika Anda mengirim pesan super pendek, 294 00:18:42,180 --> 00:18:45,390 jika Anda hanya ingin mengirim pesan buruk, yang terjadi menjadi kata yang kita bisa mengeja sini, 295 00:18:45,390 --> 00:18:49,550 B-A-D, Anda mungkin akan menggunakan lebih sedikit bit, 296 00:18:49,550 --> 00:18:53,130 tapi hasil tangkapan adalah jika Anda juga harus menginformasikan apa Bob pohon adalah 297 00:18:53,130 --> 00:18:57,530 atau apa yang pengkodean, Anda akan mungkin lebih besar daripada semua tabungan 298 00:18:57,530 --> 00:19:00,110 memiliki hal-hal yang dikompresi untuk memulai. 299 00:19:00,110 --> 00:19:02,210 Jadi itu benar-benar bisa menjadi kasus bahwa jika Anda mencoba mengompresi 300 00:19:02,210 --> 00:19:05,330 bahkan dengan sesuatu seperti format zip atau file Anda mungkin akrab dengan - 301 00:19:05,330 --> 00:19:07,780 cukup kecil file, file bahkan kosong - 302 00:19:07,780 --> 00:19:10,930 kadang-kadang file tersebut mungkin akan lebih besar dan tidak kecil. 303 00:19:10,930 --> 00:19:14,320 Tapi secara realistis, yang terjadi hanya untuk ukuran file kecil, 304 00:19:14,320 --> 00:19:16,920 sehingga tidak akan membuat file gigabyte menjadi 2 gigabyte; 305 00:19:16,920 --> 00:19:19,480 kita benar-benar berbicara byte atau hanya beberapa kilobyte. 306 00:19:19,480 --> 00:19:22,330 >> Beberapa program seperti zip cukup pintar untuk menyadari bahwa, 307 00:19:22,330 --> 00:19:24,590 "Kau akan menghabiskan lebih banyak bit mengompresi ini." 308 00:19:24,590 --> 00:19:27,460 "Biar tidak repot-repot mengompresi untuk Anda sama sekali." 309 00:19:27,460 --> 00:19:30,160 Jadi ini adalah salah satu cara maka mengompresi format teks. 310 00:19:30,160 --> 00:19:32,300 Kita bisa menerapkan sesuatu seperti ini di C. 311 00:19:32,300 --> 00:19:35,370 Sebagai contoh, di sini adalah bagaimana kita bisa merepresentasikan sebuah node di pohon ini 312 00:19:35,370 --> 00:19:39,320 di mana kita memiliki char untuk simbol, nilai mengambang untuk frekuensi, 313 00:19:39,320 --> 00:19:42,250 dan seperti yang kita lihat dengan struktur lain kami data, 2 pointer, 314 00:19:42,250 --> 00:19:47,080 1 ke anak kiri, 1 ke kanan, baik yang dapat menjadi NULL, 315 00:19:47,080 --> 00:19:50,850 tetapi jika tidak, hal itu mengacu pada anak kiri dan anak kanan. 316 00:19:50,850 --> 00:19:55,130 Jadi ini kemudian adalah Huffman coding, dan itu salah satu cara yang dapat Anda pergi tentang mengompresi informasi, 317 00:19:55,130 --> 00:19:57,880 dan itu pasti salah satu yang paling mudah untuk menerapkan 318 00:19:57,880 --> 00:20:00,830 dalam konteks, mengatakan, struktur data minggu lalu, 319 00:20:00,830 --> 00:20:03,250 bahkan meskipun algoritma yang lebih canggih ada 320 00:20:03,250 --> 00:20:08,220 yang dapat melakukan mutasi bahkan lebih canggih dari data Anda. 321 00:20:08,220 --> 00:20:11,640 Setiap pertanyaan kemudian pada pohon, pohon biner, atau kompresi teks? 322 00:20:11,640 --> 00:20:15,590 [Mahasiswa] Apakah ada ambiguitas tertentu, seperti jika [tak terdengar] dibagi menjadi 01, 323 00:20:15,590 --> 00:20:19,160 maka 011 akan ambigu, kan? 324 00:20:19,160 --> 00:20:22,730 [Tak terdengar] >> Pertanyaan bagus. Ambiguitas. 325 00:20:22,730 --> 00:20:25,940 Mari saya meringkas dengan mengacu pada gambar ini di sini. 326 00:20:25,940 --> 00:20:29,650 Karena karakter Anda mengompresi, representasi dari, 327 00:20:29,650 --> 00:20:32,850 menurut definisi dari algoritma ini selalu tetap daun, 328 00:20:32,850 --> 00:20:41,870 Anda tidak akan pernah sengaja menggunakan pola yang sama dari bit untuk awalan huruf ganda. 329 00:20:41,870 --> 00:20:46,740 Jadi dengan kata lain, Anda khawatir tentang, kedengarannya seperti, ambiguitas timbul 330 00:20:46,740 --> 00:20:51,580 dimana 001 mungkin menjadi awal dari B atau awal C atau sesuatu seperti itu. 331 00:20:51,580 --> 00:20:56,780 Tapi itu tidak dapat terjadi karena pemberitahuan bahwa semua huruf abjad kita encoding 332 00:20:56,780 --> 00:20:58,290 berada di daun. 333 00:20:58,290 --> 00:21:01,910 >> Ambiguitas hanya bisa timbul, seperti dalam kasus kode Morse, 334 00:21:01,910 --> 00:21:06,770 jika, misalnya, C adalah suatu tempat di sepanjang jalan dari akar ke B. 335 00:21:06,770 --> 00:21:12,290 [Mahasiswa] Kanan. Jadi dalam hal ini, katakan A memiliki 2 daun. >> Katakanlah A memiliki - Katakanlah lagi. 336 00:21:12,290 --> 00:21:18,760 [Mahasiswa] Katakanlah A memiliki 2 daun, F dan G, dan kemudian G - >> Oke. Tapi itu tidak bisa. 337 00:21:18,760 --> 00:21:23,230 Sebuah sendiri tidak bisa memiliki F daun dan G karena surat-surat F dan G 338 00:21:23,230 --> 00:21:27,560 akan diri mereka meninggalkan tempat di sebelah kiri B atau hak E. 339 00:21:27,560 --> 00:21:28,900 Jadi menurut definisi, mereka harus daun. 340 00:21:28,900 --> 00:21:32,940 Jika tidak, Anda tepat, kami sudah tidak memecahkan masalah yang dihadapi kode morse. 341 00:21:32,940 --> 00:21:38,150 Pertanyaan bagus. Pertanyaan lain? Baiklah. 342 00:21:38,150 --> 00:21:42,050 Ini gagasan bit, ternyata kita sudah memiliki kekuatan selama ini bahwa kita sudah tidak benar-benar digunakan 343 00:21:42,050 --> 00:21:44,200 ketika itu datang untuk memanipulasi 0s dan 1s. 344 00:21:44,200 --> 00:21:46,600 Kami bertanya tentang hal ini di salah satu set masalah awal: 345 00:21:46,600 --> 00:21:52,340 yaitu, bagaimana Anda pergi tentang mengkonversi huruf besar menjadi huruf kecil atau sebaliknya? 346 00:21:52,340 --> 00:21:55,460 Atau, lebih konkret, salah satu psets pertama bertanya 347 00:21:55,460 --> 00:22:01,090 berapa banyak bit yang Anda benar-benar harus flip untuk mengubah A menjadi huruf kecil atau sebaliknya? 348 00:22:01,090 --> 00:22:05,580 Berikut adalah pengingat cepat dari apa yang 65 dan 97 terlihat seperti di biner. 349 00:22:05,580 --> 00:22:08,060 Dan bahkan jika pertanyaan yang semacam pudar dalam memori Anda, 350 00:22:08,060 --> 00:22:11,290 Anda dapat melihat lagi di sini bahwa berapa banyak bit perlu membalik 351 00:22:11,290 --> 00:22:15,810 untuk mengubah modal A untuk huruf kecil a? Hanya satu. 352 00:22:15,810 --> 00:22:19,650 >> Mereka hanya berbeda dalam satu lokasi, bit ketiga dari kiri. 353 00:22:19,650 --> 00:22:24,240 Sedangkan A memiliki 010, sedikit yang memiliki 011. 354 00:22:24,240 --> 00:22:26,250 Jadi entah bagaimana, kita hanya perlu bisa membalik sedikit itu, 355 00:22:26,250 --> 00:22:29,410 dan kita kemudian dapat memanfaatkan atau huruf kecil. 356 00:22:29,410 --> 00:22:32,720 Kami telah melakukan ini di masa lalu dengan benar-benar menggunakan jika kondisi 357 00:22:32,720 --> 00:22:35,930 dan memeriksa apakah surat itu antara kapital A dan Z modal, 358 00:22:35,930 --> 00:22:41,480 maka output seperti A - a + 26 atau sesuatu seperti itu. 359 00:22:41,480 --> 00:22:46,130 Anda mungkin melakukan perubahan aritmatika dengan huruf abjad. 360 00:22:46,130 --> 00:22:49,270 Tapi bagaimana kalau kita hanya bisa dibengkokkan bit tunggal? 361 00:22:49,270 --> 00:22:59,080 Bagaimana bisa Anda pergi tentang mengambil senilai satu byte itu bit, sehingga 8 bit seperti 01.000.001 dan 01100001? 362 00:22:59,080 --> 00:23:03,170 Jika Anda memiliki pola-pola bit, bagaimana kita bisa pergi tentang mengubah hanya salah satu dari mereka? 363 00:23:03,170 --> 00:23:07,610 Bagaimana jika kita memperkenalkan di sini kuning pola lain bit? 364 00:23:07,610 --> 00:23:13,420 Jika saya membuat 0s seluruh string kuning kecuali sedikit yang saya ingin mengubah 365 00:23:13,420 --> 00:23:17,900 dan kemudian saya memperkenalkan operator baru yang dikenal sebagai operator bitwise - 366 00:23:17,900 --> 00:23:21,210 bitwise dalam arti bahwa ia beroperasi pada bit individu, 367 00:23:21,210 --> 00:23:25,360 bukan pada byte seluruh atau empat byte sekaligus. 368 00:23:25,360 --> 00:23:31,170 Ini bar vertikal ada di kuning menunjukkan bahwa bagaimana jika kita mengambil representasi modal A 369 00:23:31,170 --> 00:23:37,060 dan bitwise OR dengan urutan kuning bit? 370 00:23:37,060 --> 00:23:41,300 Dengan kata lain, menoleh ke bahasan kita tentang ekspresi Boolean dalam Scratch dan kemudian di C. 371 00:23:41,300 --> 00:23:47,520 >> Melakukan Boolean atau berarti bahwa untuk menjadi kenyataan, baik hal pertama harus benar 372 00:23:47,520 --> 00:23:50,700 atau hal kedua harus benar atau keduanya harus benar, 373 00:23:50,700 --> 00:23:53,270 dan kemudian output yang dihasilkan itu sendiri benar. 374 00:23:53,270 --> 00:24:00,230 Dalam hal ini di sini, apa yang kita dapatkan jika kita mengambil 0 "atau" ed dengan 0? Palsu atau palsu? 375 00:24:00,230 --> 00:24:04,280 Ini masih palsu, sehingga huruf kecil yang tetap seperti yang diharapkan. 376 00:24:04,280 --> 00:24:07,540 Bagaimana jika bukan kita lakukan 1 atau 0? 377 00:24:07,540 --> 00:24:12,640 Ini sekarang masih 1, tapi perhatikan apa yang akan terjadi di sini. 378 00:24:12,640 --> 00:24:18,630 Jika kita mulai dengan modal A dan kami terus "atau" bit individu seperti yang kita lakukan di sini, 379 00:24:18,630 --> 00:24:25,180 0 atau yang kuning memberi kita apa di sini? Ini memberi kita 1. 380 00:24:25,180 --> 00:24:35,120 Bahkan, seandainya kita tidak tahu apa versi huruf kecil dari yang sebenarnya. 381 00:24:35,120 --> 00:24:38,270 Mari kita lakukan ini. Mari saya mundur ini di sini. 382 00:24:38,270 --> 00:24:42,340 Mari kita lakukan ini lagi. 0 atau 0 memberi saya 0. 383 00:24:42,340 --> 00:24:45,020 1 atau 0 memberi saya 1. 384 00:24:45,020 --> 00:24:48,020 0 atau 1 memberi saya 1. 385 00:24:48,020 --> 00:24:52,880 0 atau 0 memberi saya 0. Yang berikutnya adalah 0, yang berikutnya adalah 0, yang berikutnya adalah 0. 386 00:24:52,880 --> 00:24:55,660 1 atau 0 memberi saya 1. 387 00:24:55,660 --> 00:24:59,140 Dan bahkan jika kita tidak tahu sebelumnya apa yang huruf kecil itu, 388 00:24:59,140 --> 00:25:04,770 hanya dengan "atau" ing A dengan pola bit yang kami telah disajikan di sini dengan warna kuning, 389 00:25:04,770 --> 00:25:09,400 Anda dapat huruf kecil modal A dengan membalik sedikit itu. 390 00:25:09,400 --> 00:25:11,580 Kami menggunakan ini minggu lalu ekspresi: membalik sedikit. 391 00:25:11,580 --> 00:25:13,710 Bagaimana Anda benar-benar melakukan itu pemrograman? 392 00:25:13,710 --> 00:25:16,390 Anda menggunakan apa yang umumnya disebut topeng, urutan bit, 393 00:25:16,390 --> 00:25:19,980 bahwa dalam kasus ini kebetulan terlihat seperti nomor ini di sini, 394 00:25:19,980 --> 00:25:22,980 dan kemudian Anda "atau" bersama-sama menggunakan operator ini C baru, 395 00:25:22,980 --> 00:25:29,940 tidak | |, Anda menggunakan satu | dan Anda benar-benar akan mendapatkan jawaban ini di sini karena mengapa? 396 00:25:29,940 --> 00:25:35,120 Ini adalah tempat 1s, 2s tempat, 16s 4s, 8s,, 32s. 397 00:25:35,120 --> 00:25:42,280 Jadi ternyata bahwa jika Anda mengambil huruf kapital A dan bitwise ATAU dengan 32 integer, 398 00:25:42,280 --> 00:25:47,520 karena 32 integer, ketika Anda melihat hal itu sebagai bit, terlihat seperti ini, 399 00:25:47,520 --> 00:25:50,860 yang berarti Anda dapat membalik bit yang Anda benar-benar ingin. 400 00:25:50,860 --> 00:25:52,630 Dan sama - dan kami akan melihat kode hanya dalam beberapa saat - 401 00:25:52,630 --> 00:25:54,210 misalkan kita ingin pergi ke arah lain. 402 00:25:54,210 --> 00:25:58,210 >> Bagaimana Anda pergi dari huruf kecil modal ke A? Yang agak perlu berubah? 403 00:25:58,210 --> 00:25:59,820 Ini yang sama. 404 00:25:59,820 --> 00:26:03,970 Kami ingin mengubah itu agak ketiga dari 1 sampai 0. 405 00:26:03,970 --> 00:26:06,310 Dan bagaimana mungkin kita pergi untuk melakukan ini? 406 00:26:06,310 --> 00:26:10,130 Bagaimana kita mematikan sedikit? Dengan apa pola bit bisa kita mematikan sedikit? 407 00:26:11,580 --> 00:26:14,070 Bagaimana jika kita membalikkan semacam topeng? 408 00:26:14,070 --> 00:26:17,350 Padahal sebelumnya, kami membuat 0s masker seluruh kuning 409 00:26:17,350 --> 00:26:19,930 kecuali untuk bit yang kita ingin menghidupkan, 410 00:26:19,930 --> 00:26:25,580 bagaimana jika saat ini, kita membuat 1s masker seluruh kecuali sedikit yang kita ingin mematikan 411 00:26:25,580 --> 00:26:28,330 dan kemudian menggunakan apa operator? 412 00:26:28,330 --> 00:26:30,560 Bagaimana jika kita "dan" hal-hal? Mari kita lihat. 413 00:26:30,560 --> 00:26:34,880 Jika sekarang kita flip untuk ini, anggaplah bahwa sekali lagi saya membuat topeng itu semua 1s 414 00:26:34,880 --> 00:26:37,650 kecuali untuk bit salah satu yang saya ingin mematikan 415 00:26:37,650 --> 00:26:43,860 dan kemudian daripada "atau" nomor putih di bagian atas dengan nomor kuning di sini, 416 00:26:43,860 --> 00:26:46,940 bagaimana jika saya bukan "dan" mereka bersama-sama? Ini disebut bitwise dan. 417 00:26:46,940 --> 00:26:49,450 Logikanya, itu adalah hal yang sama seperti Boolean dan. 418 00:26:49,450 --> 00:26:55,160 Ini memberi saya 0 & 1 adalah 0. Jadi palsu dan benar adalah palsu. 419 00:26:55,160 --> 00:26:58,160 Benar dan benar adalah benar. 420 00:26:58,160 --> 00:27:04,020 Dan di sini adalah keajaiban: Benar dan salah sekarang palsu, jadi kita sudah dimatikan sedikit itu. 421 00:27:04,020 --> 00:27:06,560 Dan sekarang sisa cerita agak sederhana. 422 00:27:06,560 --> 00:27:11,970 Karena sisa topeng adalah 1s, tidak peduli apa nomor yang putih. 423 00:27:11,970 --> 00:27:15,580 Ketika Anda "dan" sesuatu dengan benar, Anda tidak akan mengubah nilainya. 424 00:27:15,580 --> 00:27:20,200 Jika benar, itu akan tetap benar. Jika itu palsu, itu akan tetap palsu. 425 00:27:20,200 --> 00:27:23,190 >> Tapi keajaiban terjadi ketika Anda mengambil sesuatu yang benar 426 00:27:23,190 --> 00:27:25,430 dan Anda kemudian "dan" dengan palsu. 427 00:27:25,430 --> 00:27:30,030 Ini memiliki efek mematikan yang sedikit. 428 00:27:30,030 --> 00:27:31,980 Jadi agak samar di sana. 429 00:27:31,980 --> 00:27:35,390 Mari kita benar-benar melihat beberapa kode, yang sebenarnya mungkin terlihat lebih samar, 430 00:27:35,390 --> 00:27:38,220 tapi mari kita lihat di sini di tolower. 431 00:27:38,220 --> 00:27:45,880 Jika saya melihat tolower, pergi dari ibukota A ke huruf kecil a, 432 00:27:45,880 --> 00:27:47,730 mari kita lihat bagaimana kita dapat menerapkan program ini. 433 00:27:47,730 --> 00:27:51,280 Berikut utama, dan itu tidak mengambil argumen baris perintah. 434 00:27:51,280 --> 00:27:55,980 Saya mendeklarasikan c karakter untuk surat bahwa pengguna akan mengetik masuk 435 00:27:55,980 --> 00:28:00,690 Saya kemudian menggunakan do akrab sementara loop hanya memastikan bahwa pengguna pasti memberi saya modal A 436 00:28:00,690 --> 00:28:05,010 atau B atau C. .. Z, sehingga mereka memberi saya sesuatu antara A dan Z. 437 00:28:05,010 --> 00:28:08,580 Dan sekarang apa yang saya lakukan di sini? 438 00:28:08,580 --> 00:28:14,870 Aku "atau" ing ini dengan 0x20, tapi itu sebenarnya sama - 439 00:28:14,870 --> 00:28:19,500 dan kami akan kembali ke hotel ini dalam sekejap - 32. 440 00:28:19,500 --> 00:28:24,830 Jadi sekali lagi, 32 adalah pola bit sini. Mengapa kita tahu ini? 441 00:28:24,830 --> 00:28:26,320 Hanya berpikir kembali ke minggu 0. 442 00:28:26,320 --> 00:28:31,010 Ini adalah tempat 1s, 2s tempat, 4s, 8s, 16s, 32s tempat. 443 00:28:31,010 --> 00:28:33,470 Jadi ini nomor kuning terjadi menjadi 32. 444 00:28:33,470 --> 00:28:40,570 Saya kemudian dapat mengambil surat seperti char di sini, bitwise "atau" dengan harfiah nomor 32, 445 00:28:40,570 --> 00:28:45,250 dan apa yang saya dapatkan kembali? Versi huruf kecil itu char. 446 00:28:45,250 --> 00:28:48,830 Sesaat lalu, meskipun, saya menyatakan ini dalam notasi dasar yang berbeda. 447 00:28:48,830 --> 00:28:51,370 Apa ini mewakili? >> [Mahasiswa] Heksadesimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Hal ini terjadi untuk mewakili heksadesimal. 449 00:28:53,050 --> 00:28:55,170 Kami belum berbicara tentang heksadesimal semua yang banyak, 450 00:28:55,170 --> 00:28:57,330 tapi itu sebenarnya nyaman dalam kasus-kasus seperti ini. 451 00:28:57,330 --> 00:29:01,730 >> Meskipun terlihat lebih kompleks dan meskipun tampak seperti 20 dan tidak 32, 452 00:29:01,730 --> 00:29:06,240 ternyata heksadesimal sebenarnya notasi super nyaman 453 00:29:06,240 --> 00:29:10,810 karena dalam heksadesimal setiap digit setelah 0x - dan ini berarti apa-apa; 454 00:29:10,810 --> 00:29:13,960 ini hanya konvensi manusia yang mengatakan inilah sejumlah heksadesimal - 455 00:29:13,960 --> 00:29:18,590 masing-masing digit, 2 dan kemudian 0, sendiri dapat diwakili 456 00:29:18,590 --> 00:29:20,800 dengan tepat 4 bit. 457 00:29:20,800 --> 00:29:27,840 Jadi jika kita melakukan hal ini, izinkan saya membuka editor teks di sini - aneh autocomplete - 458 00:29:27,840 --> 00:29:35,940 jika kita melakukan editor teks kecil di sini, yang berarti angka 0x20 sini adalah 4 bit, ada cara lain 4 bit. 459 00:29:35,940 --> 00:29:38,050 Mari kita lakukan 4 bit paling kanan terlebih dahulu. 460 00:29:38,050 --> 00:29:44,690 0 saat diwakili dengan 4 bit adalah apa? Super mudah. Hanya semua 0s. 461 00:29:44,690 --> 00:29:46,780 Jadi 4 bit sebagai 0s. 462 00:29:46,780 --> 00:29:53,510 Bagaimana Anda mewakili 2? Sudah lama sejak kami melakukan ini, tapi itu 0100. 463 00:29:53,510 --> 00:29:57,310 Jadi ini adalah tempat 1s, ini adalah tempat 2s, dan kemudian tidak peduli apa tempat-tempat lain. 464 00:29:57,310 --> 00:30:00,610 Dengan kata lain, dalam heksadesimal Anda mungkin mengatakan 0x20, 465 00:30:00,610 --> 00:30:04,340 tetapi jika Anda kemudian berpikir tentang apa yang 2 dan bagaimana hal itu diwakili dalam biner, 466 00:30:04,340 --> 00:30:07,130 apa 0 dan bagaimana hal itu diwakili dalam biner, 467 00:30:07,130 --> 00:30:10,440 jawaban atas pertanyaan-pertanyaan yang ini dan ini, masing-masing. 468 00:30:10,440 --> 00:30:14,380 Jadi 0x20 terjadi untuk mewakili pola 8 bit, 469 00:30:14,380 --> 00:30:16,880 yang justru merupakan topeng yang kita inginkan. 470 00:30:16,880 --> 00:30:20,140 Jadi ini adalah untuk saat ini hanya sebuah latihan intelektual, 471 00:30:20,140 --> 00:30:24,520 tetapi kenyataannya adalah dalam kode itu biasanya lebih umum untuk menulis konstanta seperti ini 472 00:30:24,520 --> 00:30:28,360 dalam heksadesimal karena kemudian programmer yang relatif dapat dengan mudah, 473 00:30:28,360 --> 00:30:32,560 bahkan jika itu memerlukan beberapa kertas dan pensil, mencari tahu apa yang pola bit adalah 474 00:30:32,560 --> 00:30:35,960 karena Anda tidak bisa hanya mengungkapkan 0s dan 1s biasanya dalam kode. 475 00:30:35,960 --> 00:30:38,540 Anda tidak dapat pergi 00010 dan sebagainya. 476 00:30:38,540 --> 00:30:42,380 >> Anda harus memilih notasi desimal atau heksadesimal atau oktal atau lainnya. 477 00:30:42,380 --> 00:30:47,540 Kebanyakan orang cenderung memilih heksadesimal sederhana sehingga digit masing-masing mewakili 4 bit 478 00:30:47,540 --> 00:30:49,320 dan Anda dapat melakukan hal ini matematika cepat. 479 00:30:49,320 --> 00:30:54,990 Dan aku akan melambaikan tangan saya di toupper, yang hampir sama, itu terlihat hampir identik. 480 00:30:54,990 --> 00:31:01,900 Toupper terjadi untuk menggunakan bukan operator atau melainkan orang ini dan df. 481 00:31:01,900 --> 00:31:09,300 Apa df mewakili? df? Siapa saja? >> [Mahasiswa] 255. 482 00:31:09,300 --> 00:31:12,780 255? Bukan 255. Itu akan menjadi ff. 483 00:31:12,780 --> 00:31:15,210 Kami akan meninggalkan satu ini sebagai olahraga ringan. 484 00:31:15,210 --> 00:31:23,460 Tetapi jika Anda pergi dari 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, dan kemudian apa yang terjadi setelah 9? 485 00:31:23,460 --> 00:31:26,510 Kami jenis dari angka desimal, tetapi dalam heksadesimal apa yang terjadi setelah 9? 486 00:31:26,510 --> 00:31:29,510 [Mahasiswa] a. Jadi >> a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Anda dapat mencari tahu dari sana apa pola bit d benar-benar mewakili. 488 00:31:33,470 --> 00:31:38,850 Dan jika kita melakukan matematika, kita akan melihat bahwa topeng Anda akhirnya mendapatkan kembali identik dengan hal ini. 489 00:31:38,850 --> 00:31:45,580 Ini adalah f, semua 1s, dan ini d. Jadi df merupakan topeng itu. Baiklah. 490 00:31:45,580 --> 00:31:50,980 Dan terakhir, tidak membuat hal-hal suara super, super teknis, 491 00:31:50,980 --> 00:31:53,840 tapi misalkan kita ingin menulis sebuah program yang melakukan hal ini. 492 00:31:53,840 --> 00:31:58,960 Biarkan aku pergi ke depan dan membuat biner, yang merupakan program dalam sebuah file yang bernama binary.c. 493 00:31:58,960 --> 00:32:02,050 Dan sekarang biarkan aku menjalankan biner dan memberi saya sebuah integer non-negatif. 494 00:32:02,050 --> 00:32:03,960 Mari kita mulai mudah dan ketik 0. 495 00:32:03,960 --> 00:32:09,010 Ini sekarang adalah sebuah program yang mencetak integer dalam representasi biner. 496 00:32:09,010 --> 00:32:13,470 Jadi jika saya memainkan permainan ini lagi dan ketik hanya dalam 1, aku harus mendapatkan representasi 32-bit dari 1. 497 00:32:13,470 --> 00:32:15,490 Jika saya melakukan ini lagi dengan 2, aku harus mendapatkan itu. 498 00:32:15,490 --> 00:32:19,310 Jika saya melakukan 7, aku harus mendapatkan 1s beberapa di akhir dan sebagainya. 499 00:32:19,310 --> 00:32:22,740 Ternyata saya menyebutkan ini karena dengan operasi bitwise 500 00:32:22,740 --> 00:32:25,490 Anda benar-benar bisa melakukan satu hal lain juga. 501 00:32:25,490 --> 00:32:29,130 Anda dapat membuat topeng ini dinamis. 502 00:32:29,130 --> 00:32:32,800 Lihatlah contoh ini yang terakhir melibatkan operasi bitwise. 503 00:32:32,800 --> 00:32:35,490 Berikut adalah bagian pertama dari kode tersebut, meminta pengguna untuk nomor, 504 00:32:35,490 --> 00:32:38,130 dan menegaskan bahwa Anda memberi saya sebuah integer non-negatif. 505 00:32:38,130 --> 00:32:39,780 Jadi itulah hal semacam sekolah tua. 506 00:32:39,780 --> 00:32:41,980 Tapi di sini adalah sesuatu yang agak menarik. 507 00:32:41,980 --> 00:32:44,910 >> Bagaimana saya pergi tentang mencetak angka dalam biner? 508 00:32:44,910 --> 00:32:48,970 Saya pertama kali iterate dari apa untuk apa? 509 00:32:48,970 --> 00:32:52,270 Apa ukuran int biasanya, setidaknya dalam alat? >> [Mahasiswa] 4. 510 00:32:52,270 --> 00:32:57,130 Ini 4. Jadi 4 * 8 adalah 32 - 1 adalah 31. 511 00:32:57,130 --> 00:33:02,590 Jadi jika aku mulai menghitung dari 31, yang mewakili, ternyata, 512 00:33:02,590 --> 00:33:07,630 hanya konseptual, bit 31 atau bit urutan tertinggi, yaitu orang ini di sini, 513 00:33:07,630 --> 00:33:09,650 sedangkan ini akan menjadi 0 bit. 514 00:33:09,650 --> 00:33:12,850 Jadi ini adalah sedikit 01 bit ... 31. 515 00:33:12,850 --> 00:33:14,950 Jadi apa yang kode ini lakukan? 516 00:33:14,950 --> 00:33:20,140 Perhatikan hal ini untuk loop, meskipun tampak samar, hanya iterasi dari 31 ke 0. Itu saja. 517 00:33:20,140 --> 00:33:24,530 Jadi bagian yang menarik sekarang harus dalam 5 baris disini. 518 00:33:24,530 --> 00:33:28,110 Perhatikan bahwa di baris ini saya menyatakan topeng disebut variabel 519 00:33:28,110 --> 00:33:30,790 agar sesuai dengan cerita kita ini nomor kuning. 520 00:33:30,790 --> 00:33:32,200 Dan kemudian apa ini lakukan? 521 00:33:32,200 --> 00:33:35,720 Ini adalah operator bitwise kita belum melihat sebelumnya, kemungkinan besar. 522 00:33:35,720 --> 00:33:38,300 Ini operator shift kiri. 523 00:33:38,300 --> 00:33:40,060 Operator ini melakukan hal ini. 524 00:33:40,060 --> 00:33:44,920 Berikut adalah nomor 1, dan jika Anda melakukannya saya meninggalkan shift, shift kiri, 525 00:33:44,920 --> 00:33:49,260 apa yang Anda berpikir bahwa memiliki efek lakukan untuk yang 1 individu? 526 00:33:49,260 --> 00:33:51,290 Secara harfiah bergeser di atas. 527 00:33:51,290 --> 00:33:57,540 Jadi jika nomor 1 adalah apa yang Anda miliki di sebelah kiri dan Anda mulai dengan menginisialisasi i ke 31, 528 00:33:57,540 --> 00:34:03,490 apa yang akan Anda lakukan? Ini akan mengambil nomor 1 dan bergeser 31 tempat di sini. 529 00:34:03,490 --> 00:34:06,210 Dan karena jelas tidak ada angka lain di belakangnya, 530 00:34:06,210 --> 00:34:10,350 mereka akan secara default diganti dengan 0s. 531 00:34:10,350 --> 00:34:15,120 Jadi Anda akan memulai dengan, nomor 1 yang tentu saja terlihat seperti ini - 532 00:34:15,120 --> 00:34:18,659 dan biarkan aku menggambar di sini di tengah. 533 00:34:18,659 --> 00:34:22,139 Dan kemudian ketika Anda menggeser hal-hal ke kiri, orang ini pada dasarnya berjalan dengan cara ini. 534 00:34:22,139 --> 00:34:24,659 Tapi segera setelah Anda melakukannya, 0 yang akan terisi 535 00:34:24,659 --> 00:34:28,360 Jika Anda menggeser kedua kalinya, ia pergi dengan cara ini dan 0 lagi akan terisi 536 00:34:28,360 --> 00:34:31,000 >> Anda mengubahnya lagi dan kemudian 0 lagi akan terisi 537 00:34:31,000 --> 00:34:37,900 Jadi jika Anda melakukan hal ini dari 1 << i 31 tempat, Anda akhirnya mendapatkan masker 538 00:34:37,900 --> 00:34:42,550 yang 32 karakter, yang paling kiri yang merupakan 1, 539 00:34:42,550 --> 00:34:45,199 semua sisa yang 0. 540 00:34:45,199 --> 00:34:50,880 Dan ternyata, sebagai samping, pergeseran nomor ke kiri seperti ini 541 00:34:50,880 --> 00:34:53,530 juga kebetulan, dan kadang-kadang mudah, 542 00:34:53,530 --> 00:34:57,520 memiliki efek melakukan apa ke nomor itu? >> [Mahasiswa] Menggandakan itu. 543 00:34:57,520 --> 00:35:00,980 Menggandakan karena masing-masing kolom - tempat 1s, 2s tempat, tempat 4s, 544 00:35:00,980 --> 00:35:05,030 Tempat 8s, 16s tempat - mereka dua kali lipat semua sebagai Anda pergi ke kiri. 545 00:35:05,030 --> 00:35:09,500 Atau lebih tepatnya, ketika Anda menggeser 1s Anda akan berakhir menggandakan nilai nomor. 546 00:35:09,500 --> 00:35:12,070 Anda dapat akhirnya melakukan transformasi menarik digit 547 00:35:12,070 --> 00:35:15,640 dengan menggeser segala sesuatu atas dengan cara ini oleh kekuatan dari 2. 548 00:35:15,640 --> 00:35:17,150 Jadi bagaimana cara kerjanya? 549 00:35:17,150 --> 00:35:22,580 Hal ini kemudian memberikan saya sebuah topeng itu semua 0s kecuali untuk 1 di persis tempat yang saya inginkan, 550 00:35:22,580 --> 00:35:27,920 dan kemudian ungkapan ini, yang dicuri dari toupper.c, 551 00:35:27,920 --> 00:35:31,770 hanya mengatakan mengambil nomor n bahwa pengguna mengetik, 552 00:35:31,770 --> 00:35:34,730 "Dan" dengan topeng itu, dan apa yang akan Anda dapatkan? 553 00:35:34,730 --> 00:35:39,200 Anda akan mendapatkan 1 jika ada 1 di lokasi bertopeng, 554 00:35:39,200 --> 00:35:41,570 atau Anda akan mendapatkan 0 jika tidak ada. 555 00:35:41,570 --> 00:35:44,370 Dan sehingga semua program ini tidak efektif adalah memiliki lingkaran, 556 00:35:44,370 --> 00:35:48,340 dan menciptakan topeng dengan 1 di sini, maka 1 di sini, maka 1 di sini, 557 00:35:48,340 --> 00:35:52,950 dan menggunakan ini bitwise DAN trik untuk mengatakan apakah ada 1 bit pada input pengguna di sini? 558 00:35:52,950 --> 00:35:59,220 >> Apakah ada sedikit 1 di masukan pengguna di sini? Dan jika demikian, secara harfiah mencetak 1, lagi mencetak 0. 559 00:35:59,220 --> 00:36:03,780 Kami melakukan ini dengan ints hanya karena itulah mengapa kita melakukan 32 bit bukan 8, 560 00:36:03,780 --> 00:36:06,900 tapi apa yang kita telah memperkenalkan maka ini bitwise DAN, ini bitwise OR, 561 00:36:06,900 --> 00:36:10,450 dan ini operator pergeseran kiri, yang tidak sering sangat membantu, 562 00:36:10,450 --> 00:36:12,230 tapi ternyata mereka bisa. 563 00:36:12,230 --> 00:36:16,560 Bahkan, jika Anda adalah untuk mewakili sesuatu seperti sebuah array boolean 564 00:36:16,560 --> 00:36:21,260 hanya untuk mewakili benar atau salah, misalkan Anda ingin melacak apakah atau tidak 565 00:36:21,260 --> 00:36:24,630 ruangan yang penuh dengan 300 siswa hadir, 566 00:36:24,630 --> 00:36:29,420 Anda bisa mendeklarasikan array ukuran 300 jenis bool sehingga Anda mendapatkan 300 bools, 567 00:36:29,420 --> 00:36:33,090 dan Anda dapat mengatur masing-masing untuk benar jika seseorang di sini dan palsu sebaliknya. 568 00:36:33,090 --> 00:36:37,550 Mengapa bahwa representasi dalam struktur data tidak efisien? 569 00:36:39,370 --> 00:36:44,800 Apa yang buruk tentang desain dari struktur data, array 300 bools? 570 00:36:46,190 --> 00:36:49,600 Apa yang dimaksud dengan bool, pada kenyataannya, di bawah kap mesin? 571 00:36:49,600 --> 00:36:52,310 Ini juga, adalah sesuatu yang mungkin tidak akrab. 572 00:36:52,310 --> 00:36:53,720 Ternyata tidak ada bool. 573 00:36:53,720 --> 00:36:56,620 Ingat kita semacam dibuat bahwa dengan file cs50.h, 574 00:36:56,620 --> 00:36:58,630 yang itu sendiri termasuk bool standar. 575 00:36:58,630 --> 00:37:00,930 C adalah jenis bodoh, meskipun, ketika datang ke bool. 576 00:37:00,930 --> 00:37:04,880 Menggunakan 8 bit untuk mewakili setiap bool, yang benar-benar boros 577 00:37:04,880 --> 00:37:09,040 karena jelas, berapa banyak bit yang Anda butuhkan untuk mewakili bool? Hanya 1. 578 00:37:09,040 --> 00:37:13,190 Jadi ternyata bahwa jika Anda sekarang memiliki kemampuan dengan operator bitwise 579 00:37:13,190 --> 00:37:17,760 untuk memanipulasi bit individu bahkan dalam char, bahkan dalam satu byte, 580 00:37:17,760 --> 00:37:21,380 ternyata Anda bisa mengurangi memori yang dibutuhkan untuk mewakili sesuatu yang bodoh 581 00:37:21,380 --> 00:37:25,490 seperti itu struktur data kehadiran bergaya dengan faktor 8. 582 00:37:25,490 --> 00:37:29,820 Alih-alih menggunakan delapan bit untuk mewakili benar atau salah, Anda benar-benar bisa menggunakan salah satu 583 00:37:29,820 --> 00:37:34,500 dengan menggunakan satu byte untuk setiap delapan siswa di kelas 584 00:37:34,500 --> 00:37:41,990 dan Toggling dari 0 ke 1 bit individu dengan menggunakan jenis tingkat rendah trik. 585 00:37:43,850 --> 00:37:49,460 Yang benar-benar mengakhiri energi. Apakah ada pertanyaan tentang operasi bitwise? 586 00:37:49,460 --> 00:37:52,710 >> Ya. >> [Mahasiswa] Apakah ada operator eksklusif atau? 587 00:37:52,710 --> 00:37:56,440 Ya. Ada operator eksklusif atau yang terlihat seperti ini, ^, simbol wortel, 588 00:37:56,440 --> 00:38:02,070 yang berarti hanya hal pertama atau yang kedua bisa menjadi 1 untuk output menjadi 1. 589 00:38:02,070 --> 00:38:07,750 Ada juga yang tidak, ~, yang akan memungkinkan Anda untuk membalikkan sebuah 0 ke 1 atau sebaliknya juga. 590 00:38:07,750 --> 00:38:11,600 Dan ada juga operator shift kanan, >>, yang merupakan kebalikan dari yang kita lihat. 591 00:38:11,600 --> 00:38:13,850 Baiklah. Mari kita mengambil hal-hal sekarang untuk tingkat yang lebih tinggi. 592 00:38:13,850 --> 00:38:16,770 Kami mulai dengan berbicara tentang teks dan kemudian mengompresi 593 00:38:16,770 --> 00:38:19,650 dan mewakili teks dengan lebih sedikit jumlah bit; 594 00:38:19,650 --> 00:38:22,890 kami berbicara sedikit tentang bagaimana sekarang kita dapat mulai memanipulasi hal-hal pada tingkat bitwise. 595 00:38:22,890 --> 00:38:26,640 Mari kita sekarang tampilannya kembali 10.000 kaki ke representasi 596 00:38:26,640 --> 00:38:29,250 hal-hal yang lebih kompleks seperti grafis. 597 00:38:29,250 --> 00:38:32,950 Di sini kita memiliki bendera Jerman, di sini kita memiliki salah satu dari Prancis. 598 00:38:32,950 --> 00:38:36,350 Ini mungkin direpresentasikan dalam format file Anda mungkin tahu - GIF, misalnya. 599 00:38:36,350 --> 00:38:40,030 Jika Anda pernah melihat gambar di Web yang berakhiran. Gif, 600 00:38:40,030 --> 00:38:43,000 ini adalah format pertukaran grafis. 601 00:38:43,000 --> 00:38:47,530 Kedua bendera di sini semacam meminjamkan diri untuk kompresi 602 00:38:47,530 --> 00:38:52,050 untuk apa mungkin alasan yang jelas? >> [Respon siswa tidak terdengar] 603 00:38:52,050 --> 00:38:53,440 Ada banyak pengulangan, kan? 604 00:38:53,440 --> 00:38:57,270 Dalam rangka untuk mengirim bendera Jerman, menganggap ini sebagai sebuah gambar pada layar 605 00:38:57,270 --> 00:38:59,030 kembali di hari Scratch Anda. 606 00:38:59,030 --> 00:39:02,380 Anda mungkin ingat bahwa ada individu piksel atau titik yang membentuk gambar. 607 00:39:02,380 --> 00:39:06,650 >> Ada satu baris titik-titik hitam dan baris lain seluruh titik-titik hitam. 608 00:39:06,650 --> 00:39:10,110 Ada sekelompok barisan titik-titik hitam yang kita bisa melihat apakah kita benar-benar diperbesar, 609 00:39:10,110 --> 00:39:13,370 banyak seperti ketika kita menyorot wajah Rob di Photoshop. 610 00:39:13,370 --> 00:39:15,500 Segera setelah kami mendapat lebih dalam dan lebih dalam dan lebih ke dalam gambar, 611 00:39:15,500 --> 00:39:19,990 Anda mulai melihat pixelation, semua kotak yang terdiri matanya dalam kasus itu. 612 00:39:19,990 --> 00:39:24,130 Sama kesepakatan di sini. Jika kita menyorot cukup sedikit, Anda akan melihat titik-titik individu. 613 00:39:24,130 --> 00:39:27,110 Nah, ini adalah jenis limbah bit. 614 00:39:27,110 --> 00:39:32,120 Jika sepertiga dari bendera hitam dan sepertiga dari bendera berwarna kuning dan sebagainya, 615 00:39:32,120 --> 00:39:34,860 mengapa kita tidak bisa entah bagaimana kompres bendera ini? 616 00:39:34,860 --> 00:39:39,560 Dan bahkan bendera Prancis bisa dikompresi meskipun pola ini sedikit berbeda. 617 00:39:39,560 --> 00:39:44,120 Ternyata format file GIF adalah format kompresi lossless, 618 00:39:44,120 --> 00:39:48,420 yang berarti Anda dapat mengambil gambar seperti bendera Jerman di sini, 619 00:39:48,420 --> 00:39:53,540 Anda dapat membuang banyak bit tanpa mengorbankan kualitas. 620 00:39:53,540 --> 00:39:55,340 Hal ini berbeda dengan sesuatu seperti JPEG, 621 00:39:55,340 --> 00:39:57,050 dengan yang sebagian besar dari kita mungkin lebih akrab. 622 00:39:57,050 --> 00:39:59,000 Facebook foto dan foto Flickr dan sejenisnya 623 00:39:59,000 --> 00:40:02,200 hampir selalu disimpan sebagai file JPEG ketika mereka upload, 624 00:40:02,200 --> 00:40:08,100 tapi file JPEG adalah lossy - format dimana Anda membuang bit - lossy 625 00:40:08,100 --> 00:40:10,430 tetapi Anda juga membuang berkualitas. 626 00:40:10,430 --> 00:40:13,890 Dan jadi jika Anda kompres foto dengan Photoshop atau upload ke Facebook 627 00:40:13,890 --> 00:40:15,580 atau membawa mereka pada ponsel benar-benar jelek, 628 00:40:15,580 --> 00:40:19,510 Anda tahu bahwa gambar mulai menjadi sangat kotor dan pixelated, 629 00:40:19,510 --> 00:40:22,290 dan itu karena sedang dikompresi oleh komputer atau telepon 630 00:40:22,290 --> 00:40:24,550 oleh harfiah membuang informasi jauhnya. 631 00:40:24,550 --> 00:40:28,500 Tapi GIF menakjubkan karena dapat menggunakan bit kurang dari itu mungkin secara default 632 00:40:28,500 --> 00:40:30,750 tanpa kehilangan informasi apapun. 633 00:40:30,750 --> 00:40:32,410 >> Dan pada dasarnya melakukannya sebagai berikut. 634 00:40:32,410 --> 00:40:38,740 Daripada menyimpan dalam sebuah file seperti BMP akan sebuah tiga RGB untuk hitam, hitam, hitam, hitam, 635 00:40:38,740 --> 00:40:42,570 hitam, hitam, hitam, hitam, hitam, hitam, hitam, hitam dan sebagainya, 636 00:40:42,570 --> 00:40:45,640 bukan, format GIF akan mengatakan, "Black," 637 00:40:45,640 --> 00:40:48,330 dan kemudian, "Ulangi 100 kali," atau sesuatu seperti itu. 638 00:40:48,330 --> 00:40:52,280 "Hitam, ulangi ini 100 kali, hitam, ulangi ini 100 kali ..." 639 00:40:52,280 --> 00:40:54,530 "Kuning, ulangi 100 kali." 640 00:40:54,530 --> 00:40:57,200 Dan jadi ingat, pada dasarnya, pixel paling kiri 641 00:40:57,200 --> 00:41:02,160 dan kemudian mengkodekan entah gagasan mengulangi pixel itu lagi dan lagi. 642 00:41:02,160 --> 00:41:06,110 Jadi GIF kemudian dapat memampatkan diri tanpa kehilangan informasi apapun. 643 00:41:06,110 --> 00:41:09,510 Tetapi jika Anda harus menebak, kalau itu adalah algoritma yang digunakan gifs, 644 00:41:09,510 --> 00:41:13,180 yang ini bendera, meskipun mereka terlihat sama dalam ukuran, 645 00:41:13,180 --> 00:41:19,620 akan menjadi lebih kecil bila disimpan pada disk sebagai GIF? >> [Mahasiswa] Jerman. 646 00:41:19,620 --> 00:41:21,660 Jerman akan menjadi lebih kecil? Kenapa? 647 00:41:21,660 --> 00:41:26,620 [Mahasiswa] Karena Anda mengulanginya berkali kali horizontal 648 00:41:26,620 --> 00:41:29,010 dan kemudian Anda ulangi lain waktu. >> Tepat. 649 00:41:29,010 --> 00:41:32,020 Karena orang-orang yang menemukan GIF hanya jenis sewenang-wenang memutuskan 650 00:41:32,020 --> 00:41:36,040 bahwa pengulangan tersebut akan dimanfaatkan secara horisontal dan tidak lateral. 651 00:41:36,040 --> 00:41:40,900 Ada pengulangan lebih banyak lateral sini di bendera Jerman daripada di bendera Prancis. 652 00:41:40,900 --> 00:41:44,430 Jadi, jika kita benar-benar membuka folder di harddisk yang memiliki ini GIF, 653 00:41:44,430 --> 00:41:51,920 Anda benar-benar dapat melihat bahwa bendera Jerman di sini adalah 2 kilobyte dan satu Perancis adalah 4 kilobyte. 654 00:41:51,920 --> 00:41:54,080 Ini terjadi menjadi suatu kebetulan bahwa salah satu adalah dua kali yang lain, 655 00:41:54,080 --> 00:41:57,960 tapi pada kenyataannya kasus bahwa bendera Prancis jauh lebih besar. 656 00:41:57,960 --> 00:42:01,250 >> Meskipun kita berbicara di sini tentang grafis, ide yang sama dapat diterapkan untuk 657 00:42:01,250 --> 00:42:05,150 tidak hal-hal seperti bendera tapi gambar yang sedikit lebih kompleks. 658 00:42:05,150 --> 00:42:08,170 Jika Anda mengambil gambar apel, pasti ada banyak duplikasi di sana, 659 00:42:08,170 --> 00:42:11,040 jadi kami entah bagaimana bisa ingat bahwa latar belakang default adalah biru 660 00:42:11,040 --> 00:42:13,230 dan tidak, seperti gambar kanan menunjukkan, 661 00:42:13,230 --> 00:42:16,830 harus ingat warna setiap piksel tunggal dalam gambar ini. 662 00:42:16,830 --> 00:42:21,060 Jadi kita bisa membuang bit pergi sana tanpa kehilangan informasi. 663 00:42:21,060 --> 00:42:23,340 Apel masih terlihat sama. 664 00:42:23,340 --> 00:42:27,510 Dalam contoh di sini, Anda mungkin akan melihat apa yang terjadi dalam sebuah film. 665 00:42:27,510 --> 00:42:31,970 Ini merupakan gulungan film lama-sekolah dimana dalam gambar atas ada 666 00:42:31,970 --> 00:42:36,900 Anda memiliki mengemudi RV melewati rumah dan pohon. 667 00:42:36,900 --> 00:42:42,130 Dan seperti yang van drive masa lalu dari kiri ke kanan, apa yang jelas tidak berubah? 668 00:42:42,130 --> 00:42:45,320 Rumah tidak akan di mana saja, dan pohon itu tidak akan kemana-mana. 669 00:42:45,320 --> 00:42:47,700 Satu-satunya hal yang bergerak adalah van dalam kasus ini. 670 00:42:47,700 --> 00:42:51,650 Sehingga Latar Belakang Unchanged menyarankan, apa yang dapat Anda lakukan dalam film 671 00:42:51,650 --> 00:42:56,530 juga sama hanya membuang informasi yang tidak berubah di antara frame. 672 00:42:56,530 --> 00:42:58,900 Hal ini umumnya dikenal sebagai kompresi interframe 673 00:42:58,900 --> 00:43:02,120 dimana jika frame ini terlihat hampir identik dengan yang satu ini, 674 00:43:02,120 --> 00:43:05,390 mari kita tidak repot-repot menyimpan pada disk setiap informasi yang identik 675 00:43:05,390 --> 00:43:09,250 pada frame menengah, mari kita hanya menggunakan frame kunci sesekali 676 00:43:09,250 --> 00:43:13,420 yang benar-benar menyimpan informasi secara berlebihan hanya sebagai kewarasan sedikit memeriksa. 677 00:43:13,420 --> 00:43:18,620 >> Sebaliknya, pendekatan lain untuk video kompresi adalah dalam contoh kedua dan lebih rendah di sini, 678 00:43:18,620 --> 00:43:23,970 mana daripada toko 30 frame, kenapa tidak Anda hanya menyimpan 15 frame per detik, bukan? 679 00:43:23,970 --> 00:43:27,070 Daripada jenis film mengalir indah, sempurna, 680 00:43:27,070 --> 00:43:30,060 mungkin terlihat seperti itu gagap sedikit, sekolah tua, 681 00:43:30,060 --> 00:43:37,190 tetapi efek bersih akan menggunakan bit jauh lebih sedikit daripada yang mungkin diperlukan. 682 00:43:37,190 --> 00:43:39,240 Jadi di mana hal ini kemudian meninggalkan kita? 683 00:43:39,240 --> 00:43:41,700 Itu sedikit dari samping di mana lagi Anda dapat pergi dengan kompresi. 684 00:43:41,700 --> 00:43:45,140 Untuk lebih lanjut tentang itu, mengambil kelas seperti CS175 sini. 685 00:43:45,140 --> 00:43:46,990 Berikut adalah contoh lain dalam video. 686 00:43:46,990 --> 00:43:49,190 Jika lebah adalah satu-satunya bergerak, 687 00:43:49,190 --> 00:43:51,790 Anda benar-benar dapat membuang informasi pada mereka tengah frame 688 00:43:51,790 --> 00:43:55,260 karena bunga dan langit dan daun tidak berubah. 689 00:43:55,260 --> 00:43:57,960 Tapi mari kita sekarang mempertimbangkan satu hal terakhir. 690 00:43:57,960 --> 00:44:03,890 Dalam 5 menit berikutnya kita tinggalkan C belakang selamanya di kuliah? Ya. Tidak di psets, meskipun. 691 00:44:03,890 --> 00:44:10,210 Terakhir cerita tentang C dan kemudian kita mendapatkan hal-hal yang sangat seksi 692 00:44:10,210 --> 00:44:13,870 melibatkan HTML dan Web dan woo-hoo. Baiklah. 693 00:44:13,870 --> 00:44:16,050 Di sini kita pergi. Itulah motivasi. 694 00:44:16,050 --> 00:44:20,020 Ternyata selama ini ketika kita telah menulis program yang kami jalankan dentang. 695 00:44:20,020 --> 00:44:23,890 Dan dentang, kami telah mengatakan sejak minggu pertama cukup banyak, mengambil kode sumber 696 00:44:23,890 --> 00:44:25,740 dan mengubahnya menjadi kode obyek. 697 00:44:25,740 --> 00:44:28,540 Dibutuhkan C dan mengubahnya menjadi 0s dan 1s. 698 00:44:28,540 --> 00:44:32,150 Aku sudah seperti telah berbohong kepada Anda untuk beberapa minggu karena itu tidak sesederhana itu. 699 00:44:32,150 --> 00:44:36,750 >> Ada lebih banyak terjadi di bawah tenda ketika Anda menjalankan program seperti dentang. 700 00:44:36,750 --> 00:44:39,560 Bahkan, proses kompilasi program benar-benar dapat diringkas, 701 00:44:39,560 --> 00:44:42,210 seperti yang mungkin Anda ingat dari video Rob pada kompiler, 702 00:44:42,210 --> 00:44:47,580 ke dalam 4 langkah: pra-pengolahan, kompilasi itu sendiri, perakitan, dan menghubungkan. 703 00:44:47,580 --> 00:44:51,950 Tapi kami di kelas dan kebanyakan orang di dunia biasanya merangkum semua langkah-langkah 704 00:44:51,950 --> 00:44:54,410 hanya sebagai "kompilasi." 705 00:44:54,410 --> 00:44:58,070 Tetapi jika kita mulai dengan kode sumber seperti ini, mengingat ini mungkin program C sederhana 706 00:44:58,070 --> 00:45:03,530 kami telah menulis sejauh ini, mengingat bahwa ketika dikompilasi itu akhirnya tampak seperti ini. 707 00:45:03,530 --> 00:45:07,310 Tapi sebenarnya ada langkah menengah, dan langkah-langkah adalah sebagai berikut. 708 00:45:07,310 --> 00:45:10,750 Pertama ada hal ini di bagian paling atas ini dan sebagian besar program kami, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Apa yang # include lakukan bagi kita? 711 00:45:17,210 --> 00:45:24,150 Ini salinan cukup banyak dan pasta isi stdio.h ke dalam file saya sehingga mengapa? 712 00:45:24,150 --> 00:45:27,220 Mengapa saya peduli tentang isi stdio.h? Apa yang ada di sana kepentingan? 713 00:45:27,220 --> 00:45:32,310 Printf s deklarasi, prototipe, sehingga compiler kemudian tahu apa yang saya maksud 714 00:45:32,310 --> 00:45:34,900 ketika saya menyebutkan fungsi ini printf. 715 00:45:34,900 --> 00:45:39,390 Jadi langkah 1 dalam menyusun adalah pra-pengolahan, dimana program seperti dentang 716 00:45:39,390 --> 00:45:43,450 atau beberapa program pembantu yang dentang datang dengan membaca atas kode Anda ke bawah, 717 00:45:43,450 --> 00:45:47,740 kiri ke kanan, dan setiap kali melihat simbol # diikuti dengan kata kunci seperti include, 718 00:45:47,740 --> 00:45:53,980 ia melakukan operasi itu, copy dan paste dalam kasus stdio.h ke dalam file Anda. 719 00:45:53,980 --> 00:45:55,510 Itulah langkah 1. 720 00:45:55,510 --> 00:45:59,620 Maka Anda memiliki file C jauh lebih besar karena copy besar, pekerjaan tempel itu hanya terjadi. 721 00:45:59,620 --> 00:46:01,710 >> 2 Langkah sekarang kompilasi. 722 00:46:01,710 --> 00:46:04,880 Tapi ternyata kompilasi mengambil kode sumber yang terlihat seperti ini 723 00:46:04,880 --> 00:46:08,160 dan mengubahnya menjadi sesuatu yang terlihat seperti ini, 724 00:46:08,160 --> 00:46:12,560 yang bagi mereka yang akrab disebut? >> [Mahasiswa] Majelis. >> Majelis bahasa. 725 00:46:12,560 --> 00:46:16,700 Ini sebenarnya sesuatu jika Anda mengambil CS61 Anda akan menyelam ke lebih rinci. 726 00:46:16,700 --> 00:46:22,380 Ini hanya tentang sedekat Anda bisa mendapatkan untuk menulis 0s dan 1s sendiri 727 00:46:22,380 --> 00:46:25,850 tetapi menulis hal-hal sedemikian rupa sehingga masih membuat setidaknya sedikit masuk akal. 728 00:46:25,850 --> 00:46:30,760 Ini adalah instruksi mesin, dan jika kita gulir ke fungsi utama di sini, 729 00:46:30,760 --> 00:46:35,470 melihat bahwa ada instruksi ini push, memindahkan instruksi, kurangi instruksi, 730 00:46:35,470 --> 00:46:38,550 sebut instruksi, dan sebagainya. 731 00:46:38,550 --> 00:46:42,930 Ketika Anda mendengar bahwa komputer Anda memiliki Intel dalam, 732 00:46:42,930 --> 00:46:46,180 Anda memiliki CPU Intel di Mac atau PC, apa artinya? 733 00:46:46,180 --> 00:46:51,200 Sebuah CPU datang dibangun oleh perusahaan seperti Intel memahami instruksi tertentu. 734 00:46:51,200 --> 00:46:55,770 Mereka tidak tahu apa fungsi seperti swap atau utama per se, 735 00:46:55,770 --> 00:47:00,060 tetapi mereka tahu apa yang sangat rendah tingkat instruksi seperti menambah, mengurangi, mendorong, 736 00:47:00,060 --> 00:47:02,430 bergerak, panggilan, dan sebagainya yang. 737 00:47:02,430 --> 00:47:06,170 Jadi, ketika Anda mengkompilasi kode C ke dalam bahasa assembly, 738 00:47:06,170 --> 00:47:11,820 Anda sangat user-ramah tampak kode diubah menjadi sesuatu yang tampak seperti ini, 739 00:47:11,820 --> 00:47:21,670 yang benar-benar bergerak byte atau 4 byte di dalam unit-unit kecil seperti masuk dan keluar dari CPU. 740 00:47:21,670 --> 00:47:26,820 Tapi akhirnya, ketika dentang siap untuk mengambil representasi dari program Anda 741 00:47:26,820 --> 00:47:30,940 ke 0s dan 1s, maka langkah yang disebut perakitan terjadi, 742 00:47:30,940 --> 00:47:33,850 dan ini lagi semua terjadi dalam sekejap mata saat menjalankan dentang. 743 00:47:33,850 --> 00:47:39,300 Kami mulai di sini, itu output file seperti ini, dan kemudian mengubahnya tersebut 0s dan 1s. 744 00:47:39,300 --> 00:47:42,000 Dan jika Anda ingin kembali di beberapa titik dan benar-benar melihat ini dalam tindakan, 745 00:47:42,000 --> 00:47:48,220 jika saya pergi ke hello1.c--ini adalah salah satu program pertama kita melihat - 746 00:47:48,220 --> 00:47:53,710 biasanya kita akan mengkompilasi ini dengan hello1.c dentang dan ini akan memberi kita a.out. 747 00:47:53,710 --> 00:47:59,890 Jika sebaliknya Anda malah berikan S-bendera, apa yang akan Anda dapatkan adalah hello1.s 748 00:47:59,890 --> 00:48:02,750 dan Anda benar-benar akan melihat bahasa assembly. 749 00:48:02,750 --> 00:48:05,750 >> Aku melakukan ini untuk program yang sangat singkat, tetapi jika Anda kembali untuk Scramble 750 00:48:05,750 --> 00:48:08,740 atau Recover atau program yang telah ditulis dan hanya keluar dari rasa ingin tahu 751 00:48:08,740 --> 00:48:13,240 ingin melihat apa yang benar-benar tampak seperti, apa yang sebenarnya sedang dimasukkan ke CPU, 752 00:48:13,240 --> 00:48:15,700 Anda dapat menggunakan S-bendera dengan dentang. 753 00:48:15,700 --> 00:48:17,770 Tapi kemudian yang terakhir, masih ada satu gotcha. 754 00:48:17,770 --> 00:48:21,810 Berikut adalah 0s dan 1s yang mewakili implementasi saya halo, dunia. 755 00:48:21,810 --> 00:48:25,530 Tapi aku menggunakan fungsi orang lain dalam program saya. 756 00:48:25,530 --> 00:48:28,710 Jadi meskipun proses telah saya ambil hello.c, 757 00:48:28,710 --> 00:48:34,280 itu akan dikompilasi ke dalam kode assembly, dan kemudian itu akan dirakit menjadi 0s dan 1s, 758 00:48:34,280 --> 00:48:37,460 hanya 0s dan 1s yang outputted pada saat ini dalam waktu 759 00:48:37,460 --> 00:48:40,270 adalah orang-orang yang dihasilkan dari kode saya. 760 00:48:40,270 --> 00:48:44,400 Tetapi orang yang menulis printf, mereka menyusun kode mereka 20 tahun yang lalu 761 00:48:44,400 --> 00:48:47,000 dan itu sekarang terpasang di suatu tempat pada alat, 762 00:48:47,000 --> 00:48:51,610 jadi kami entah bagaimana harus menggabungkan 0s nya dan 1s 0s dengan saya dan 1s, 763 00:48:51,610 --> 00:48:56,160 dan yang membawa kita ke langkah ke-4 dan terakhir dari kompilasi, yang dikenal sebagai menghubungkan. 764 00:48:56,160 --> 00:48:58,680 Jadi di sisi kiri kita memiliki gambar yang sama persis seperti sebelumnya: 765 00:48:58,680 --> 00:49:02,580 hello.c menjadi kode assembly menjadi 0s dan 1s. 766 00:49:02,580 --> 00:49:05,960 Tapi ingat bahwa saya menggunakan library I / O standar dalam kode saya, 767 00:49:05,960 --> 00:49:10,350 dan itu berarti suatu tempat di komputer ada sebuah file yang bernama stdio.c 768 00:49:10,350 --> 00:49:13,980 atau setidaknya versi terkompilasi daripadanya karena seseorang beberapa tahun yang lalu 769 00:49:13,980 --> 00:49:18,530 dikompilasi ke dalam kode stdio.c perakitan dan kemudian sejumlah besar 0s dan 1s. 770 00:49:18,530 --> 00:49:21,130 Ini adalah apa yang dikenal sebagai statis atau perpustakaan yang dinamis. 771 00:49:21,130 --> 00:49:23,350 Ini beberapa file duduk di suatu tempat di alat. 772 00:49:23,350 --> 00:49:28,710 >> Tapi akhirnya, saya harus mengambil 0s 1s dan saya dan orang tersebut 0s dan 1s 773 00:49:28,710 --> 00:49:32,760 dan entah bagaimana menghubungkan mereka bersama-sama, secara harfiah menggabungkan mereka 0s dan 1s 774 00:49:32,760 --> 00:49:37,900 ke dalam satu file bernama a.out atau hello1 atau apa pun aku menelepon program saya 775 00:49:37,900 --> 00:49:43,320 sehingga hasil akhirnya memiliki semua 1s dan 0s yang harus menulis program saya. 776 00:49:43,320 --> 00:49:45,660 Jadi selama ini semester ini ketika Anda telah menggunakan dentang 777 00:49:45,660 --> 00:49:48,750 dan bahkan baru-baru ini berjalan membuat dalam rangka untuk menjalankan dentang, 778 00:49:48,750 --> 00:49:53,580 semua langkah ini telah terjadi semacam instan tapi sangat sengaja. 779 00:49:53,580 --> 00:49:57,830 Dan jadi jika Anda melanjutkan dalam ilmu komputer, yaitu CS61, 780 00:49:57,830 --> 00:50:00,850 ini adalah lapisan bahwa Anda akan terus mengupas off ada 781 00:50:00,850 --> 00:50:06,980 berbicara tentang efisiensi, implikasi keamanan, dan sejenisnya dari rincian tingkat yang lebih rendah. 782 00:50:06,980 --> 00:50:09,220 Tapi dengan itu, kita akan meninggalkan C belakang. 783 00:50:09,220 --> 00:50:11,420 Mari kita pergi ke depan dan mengambil 5 menit istirahat kami sekarang, 784 00:50:11,420 --> 00:50:14,190 dan ketika kita kembali: Internet. 785 00:50:17,280 --> 00:50:19,170 Baiklah. Kami kembali. 786 00:50:19,170 --> 00:50:23,590 Sekarang kita mulai melihat kami tidak hanya di HTML karena, seperti yang akan Anda lihat, 787 00:50:23,590 --> 00:50:26,050 HTML sendiri sebenarnya cukup sederhana 788 00:50:26,050 --> 00:50:29,270 tapi benar-benar di pemrograman web lebih umum, jaringan secara lebih umum, 789 00:50:29,270 --> 00:50:31,770 dan bagaimana semua teknologi ini datang bersama-sama 790 00:50:31,770 --> 00:50:35,400 untuk memungkinkan kita untuk membuat program yang lebih canggih atas Internet 791 00:50:35,400 --> 00:50:38,690 daripada sejauh ini kita sudah mampu dalam jendela hitam dan putih. 792 00:50:38,690 --> 00:50:42,140 Memang, pada saat ini di semester meskipun kita akan menghabiskan waktu relatif kurang 793 00:50:42,140 --> 00:50:46,200 pada PHP, HTML, CSS, JavaScript, SQL dan banyak lagi, 794 00:50:46,200 --> 00:50:48,480 sebagian besar siswa melakukan akhirnya melakukan proyek akhir yang berbasis web 795 00:50:48,480 --> 00:50:51,230 karena ketika Anda akan melihat, latar belakang Anda sekarang memiliki di C 796 00:50:51,230 --> 00:50:54,450 sangat banyak diterapkan pada bahasa tingkat tinggi. 797 00:50:54,450 --> 00:50:56,800 >> Dan ketika Anda mulai berpikir tentang proyek akhir Anda, 798 00:50:56,800 --> 00:50:59,940 yang, seperti Set Soal 0, di mana Anda didorong 799 00:50:59,940 --> 00:51:02,160 untuk melakukan sesuatu yang paling menarik bagi Anda dalam Scratch, 800 00:51:02,160 --> 00:51:05,790 proyek akhir adalah kesempatan Anda untuk mengambil pengetahuan baru ditemukan dan cerdas dengan C 801 00:51:05,790 --> 00:51:09,850 atau PHP atau JavaScript atau sejenisnya keluar untuk spin 802 00:51:09,850 --> 00:51:12,330 dan menciptakan karya Anda sendiri dari perangkat lunak untuk dunia untuk melihat. 803 00:51:12,330 --> 00:51:17,770 Dan untuk benih Anda dengan ide-ide, mengetahui bahwa Anda dapat kepala di sini, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Setiap tahun, kami meminta ide dari fakultas dan staf dan kelompok mahasiswa di kampus 805 00:51:21,800 --> 00:51:27,330 hanya untuk mengirimkan ide-ide mereka untuk hal-hal menarik yang bisa dipecahkan menggunakan komputer, 806 00:51:27,330 --> 00:51:29,860 menggunakan website, dengan menggunakan perangkat lunak. 807 00:51:29,860 --> 00:51:32,360 Jadi jika Anda berjuang untuk datang dengan ide Anda sendiri, 808 00:51:32,360 --> 00:51:35,790 dengan segala cara menelusuri ide-ide di sana dari tahun ini dan terakhir. 809 00:51:35,790 --> 00:51:39,990 Sangat oke untuk menangani sebuah proyek yang telah ditangani sebelumnya. 810 00:51:39,990 --> 00:51:44,540 Kami telah melihat banyak aplikasi untuk melihat status cucian di kampus, 811 00:51:44,540 --> 00:51:47,000 banyak aplikasi untuk navigasi menu ruang makan, 812 00:51:47,000 --> 00:51:49,540 banyak aplikasi untuk navigasi katalog kursus dan sejenisnya. 813 00:51:49,540 --> 00:51:53,680 Dan memang, dalam kuliah masa depan dan dalam seminar mendatang, 814 00:51:53,680 --> 00:51:57,750 kami akan memperkenalkan Anda kepada beberapa API tersedia untuk umum, baik yang tersedia secara komersial 815 00:51:57,750 --> 00:52:02,520 serta di sini tersedia dari CS50 di kampus sehingga Anda memiliki akses ke data 816 00:52:02,520 --> 00:52:04,910 dan kemudian dapat melakukan hal-hal yang menarik dengan itu. 817 00:52:04,910 --> 00:52:09,380 Jadi lebih pada proyek-proyek akhir dalam beberapa hari ketika kami merilis spesifikasi, 818 00:52:09,380 --> 00:52:12,990 tapi untuk saat ini, tahu bahwa Anda dapat bekerja solo atau dengan satu atau dua teman 819 00:52:12,990 --> 00:52:16,010 pada kebanyakan setiap proyek yang menarik bagi Anda. 820 00:52:16,010 --> 00:52:18,080 Internet. 821 00:52:18,080 --> 00:52:22,300 Anda pergi ke depan dan mengeluarkan laptop Anda, Anda pergi ke facebook.com untuk pertama kalinya, 822 00:52:22,300 --> 00:52:27,020 tidak memiliki login baru, dan tekan Enter. Apa sebenarnya yang terjadi? 823 00:52:27,020 --> 00:52:30,150 >> Ketika anda menekan Enter pada komputer Anda, sejumlah besar langkah-langkah 824 00:52:30,150 --> 00:52:32,600 memulai semacam ajaib terjadi. 825 00:52:32,600 --> 00:52:35,960 Jadi Anda di sini di server, kiri web seperti Facebook di sini di sebelah kanan, 826 00:52:35,960 --> 00:52:42,500 dan entah bagaimana Anda menggunakan bahasa ini disebut HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP bukan bahasa pemrograman. Ini adalah lebih dari sebuah protokol. 828 00:52:46,770 --> 00:52:52,310 Ini adalah satu set konvensi bahwa web browser dan server web gunakan ketika intercommunicating. 829 00:52:52,310 --> 00:52:54,360 Dan apa artinya ini adalah sebagai berikut. 830 00:52:54,360 --> 00:52:56,790 Banyak seperti di dunia nyata, kita memiliki konvensi ini 831 00:52:56,790 --> 00:53:00,140 di mana jika Anda bertemu dengan beberapa manusia untuk pertama kalinya, jika Anda tidak keberatan menghibur saya di sini, 832 00:53:00,140 --> 00:53:03,980 Aku mungkin datang kepada Anda, katakanlah, "Hai, nama saya David." >> Hi, David. Nama saya adalah Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hai, David. Nama saya Sammy." 834 00:53:05,770 --> 00:53:08,310 Jadi sekarang kita baru saja terlibat dalam semacam protokol manusia konyol 835 00:53:08,310 --> 00:53:12,200 di mana saya telah melakukan protokol, Sammy telah merespon, 836 00:53:12,200 --> 00:53:15,060 kami berjabat tangan, dan transaksi selesai. 837 00:53:15,060 --> 00:53:18,260 HTTP sangat mirip dalam roh. 838 00:53:18,260 --> 00:53:23,350 Ketika web Anda permintaan browser www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 apa browser Anda benar-benar lakukan adalah mengulurkan tangan nya, sehingga untuk berbicara, 840 00:53:27,020 --> 00:53:29,960 ke server dan itu mengirimnya pesan. 841 00:53:29,960 --> 00:53:34,220 Dan pesan itu biasanya sesuatu seperti mendapatkan - apa yang Anda ingin mendapatkan? - 842 00:53:34,220 --> 00:53:38,740 mendapatkan saya halaman rumah, yang biasanya dilambangkan dengan sebuah garis miring pada akhir URL. 843 00:53:38,740 --> 00:53:43,790 Dan hanya sehingga Anda tahu apa bahasa yang saya berbicara, saya browser saya akan memberitahu Anda 844 00:53:43,790 --> 00:53:46,930 bahwa aku berbicara versi HTTP 1.1, 845 00:53:46,930 --> 00:53:51,980 Dan juga untuk mengukur baik, aku akan memberitahu Anda bahwa host yang saya ingin halaman rumah 846 00:53:51,980 --> 00:53:54,120 adalah facebook.com. 847 00:53:54,120 --> 00:53:57,730 Biasanya, web browser, tanpa sepengetahuan Anda, manusia, 848 00:53:57,730 --> 00:54:03,350 mengirimkan pesan ini di internet ketika Anda cukup mengetikkan www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Masukkan, ke browser Anda. 850 00:54:05,370 --> 00:54:07,300 Dan apa Facebook merespon dengan? 851 00:54:07,300 --> 00:54:12,540 Menanggapi dengan beberapa tampak serupa rincian samar tapi juga jauh lebih. 852 00:54:12,540 --> 00:54:14,310 Biarkan aku pergi ke depan ke halaman rumah Facebook di sini. 853 00:54:14,310 --> 00:54:17,480 Ini adalah layar yang sebagian besar dari kita mungkin tidak pernah melihat apakah Anda tinggal login sepanjang waktu, 854 00:54:17,480 --> 00:54:19,830 tapi ini memang halaman rumah mereka. 855 00:54:19,830 --> 00:54:24,150 Jika kita melakukan ini di Chrome, perhatikan bahwa Anda dapat menarik ini menu konteks kecil. 856 00:54:24,150 --> 00:54:26,980 Menggunakan Chrome, baik pada Mac OS, Windows, Linux, atau sejenisnya, 857 00:54:26,980 --> 00:54:31,840 jika Anda klik atau klik Kontrol kiri, Anda biasanya bisa menarik sebuah menu yang terlihat seperti ini, 858 00:54:31,840 --> 00:54:35,870 di mana beberapa pilihan menanti, salah satunya adalah View Page Source. 859 00:54:35,870 --> 00:54:39,920 Anda juga dapat biasanya mendapatkan hal-hal ini dengan pergi ke menu View dan mengaduk-aduk. 860 00:54:39,920 --> 00:54:42,750 Misalnya, di sini di bawah View, Developer adalah hal yang sama. 861 00:54:42,750 --> 00:54:45,780 Aku akan pergi ke depan dan melihat View Source Halaman. 862 00:54:45,780 --> 00:54:50,800 Apa yang Anda akan melihat adalah HTML bahwa Markus telah menulis untuk mewakili facebook.com. 863 00:54:50,800 --> 00:54:55,910 Ini adalah kekacauan lengkap di sini, tapi kami akan melihat bahwa ini masuk akal sedikit lebih lama lagi. 864 00:54:55,910 --> 00:54:59,840 Tapi ada beberapa pola di sini. Biarkan saya scroll ke bawah untuk hal-hal seperti ini. 865 00:54:59,840 --> 00:55:05,730 Ini sulit bagi manusia untuk membaca, tetapi melihat bahwa ada pola kurung siku 866 00:55:05,730 --> 00:55:10,360 dengan kata kunci seperti opsi, kata kunci seperti nilai, beberapa string dikutip. 867 00:55:10,360 --> 00:55:15,660 Di sinilah, ketika Anda mendaftar untuk pertama kalinya, ditentukan apa tahun kelahiran Anda. 868 00:55:15,660 --> 00:55:19,020 Bahwa menu drop-down dari tahun kelahiran entah bagaimana dikodekan sini 869 00:55:19,020 --> 00:55:23,870 dalam bahasa yang disebut HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Dengan kata lain, ketika browser Anda meminta halaman web, 871 00:55:27,730 --> 00:55:30,610 itu berbicara ini konvensi disebut HTTP. 872 00:55:30,610 --> 00:55:35,170 Tapi apa facebook.com menanggapi permintaan itu dengan? 873 00:55:35,170 --> 00:55:38,260 >> Ini merespon dengan beberapa pesan samar, seperti yang akan kita lihat sebentar lagi. 874 00:55:38,260 --> 00:55:43,760 Tetapi sebagian besar respon adalah dalam bentuk HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Itulah bahasa yang sebenarnya di mana halaman web yang ditulis. 876 00:55:47,170 --> 00:55:52,030 Dan apa web browser benar-benar kemudian adalah, setelah menerima sesuatu yang tampak seperti ini, 877 00:55:52,030 --> 00:55:57,120 membacanya atas ke bawah, kiri ke kanan, dan setiap saat itu melihat salah satu kurung siku 878 00:55:57,120 --> 00:56:03,370 diikuti dengan kata kunci seperti opsi, ini akan menampilkan bahwa bahasa markup dalam cara yang tepat. 879 00:56:03,370 --> 00:56:06,820 Dalam kasus ini, itu akan menampilkan menu drop-down tahun. 880 00:56:06,820 --> 00:56:09,240 Tapi sekali lagi, ini adalah kekacauan lengkap untuk melihat. 881 00:56:09,240 --> 00:56:16,630 Ini bukan karena pengembang Facebook memanifestasikan 0 untuk 5 untuk gaya, misalnya. 882 00:56:16,630 --> 00:56:20,190 Hal ini karena sebagian besar kode yang mereka tulis adalah, pada kenyataannya, ditulis dengan indah, 883 00:56:20,190 --> 00:56:22,450 juga berkomentar, baik indentasi, dan sejenisnya, 884 00:56:22,450 --> 00:56:26,080 tapi tentu saja mesin, komputer, browser benar-benar tidak peduli 885 00:56:26,080 --> 00:56:27,890 apakah kode Anda baik-gaya. 886 00:56:27,890 --> 00:56:33,100 Dan pada kenyataannya, itu benar-benar sia-sia untuk menekan tombol tab semua kali 887 00:56:33,100 --> 00:56:37,650 dan untuk menempatkan komentar di seluruh kode Anda dan untuk memilih nama-nama variabel yang benar-benar deskriptif 888 00:56:37,650 --> 00:56:42,340 karena jika browser tidak peduli, semua yang Anda lakukan di akhir hari membuang-buang byte. 889 00:56:42,340 --> 00:56:46,660 >> Jadi ternyata apa yang kebanyakan situs web lakukan adalah meskipun kode sumber untuk facebook.com, 890 00:56:46,660 --> 00:56:49,550 untuk cs50.net dan semua situs-situs lain di Internet 891 00:56:49,550 --> 00:56:53,730 biasanya ditulis dengan baik dan baik berkomentar dan baik indentasi dan sejenisnya, 892 00:56:53,730 --> 00:56:59,270 biasanya sebelum website ini dimasukkan ke Internet, kode minified, 893 00:56:59,270 --> 00:57:02,970 dimana HTML dan CSS - sesuatu yang lain kita akan segera melihat - 894 00:57:02,970 --> 00:57:05,960 kode JavaScript kita akan segera melihat dikompresi, 895 00:57:05,960 --> 00:57:09,250 dimana nama variabel yang panjang menjadi X dan Y dan Z, 896 00:57:09,250 --> 00:57:13,900 dan semua itu spasi yang membuat segalanya tampak begitu mudah dibaca adalah semua dibuang, 897 00:57:13,900 --> 00:57:17,700 karena jika Anda berpikir tentang cara ini, Facebook mendapat halaman miliar memukul sehari - 898 00:57:17,700 --> 00:57:21,670 gila seperti itu sesuatu - jadi apa jika seorang programmer hanya untuk menjadi anal 899 00:57:21,670 --> 00:57:26,660 memukul spasi satu waktu ekstra hanya untuk indent beberapa baris kode yang pernah begitu banyak? 900 00:57:26,660 --> 00:57:29,500 Apa implikasinya jika Facebook mempertahankan bahwa spasi 901 00:57:29,500 --> 00:57:32,880 di semua byte yang mereka mengirim kembali kepada orang-orang di Internet? 902 00:57:32,880 --> 00:57:36,400 Menekan spasi sekali memberi Anda byte ekstra dalam file Anda. 903 00:57:36,400 --> 00:57:39,730 Dan jika satu miliar orang kemudian lanjutkan untuk men-download halaman rumah hari itu, 904 00:57:39,730 --> 00:57:42,060 berapa banyak lebih banyak data telah Anda ditransmisikan melalui Internet? 905 00:57:42,060 --> 00:57:45,200 Sebuah gigabyte tanpa alasan yang baik. 906 00:57:45,200 --> 00:57:48,510 Dan diberikan, untuk banyak situs web ini bukan masalah scalable, 907 00:57:48,510 --> 00:57:51,030 tetapi untuk Facebook, Google, untuk beberapa situs paling populer 908 00:57:51,030 --> 00:57:54,860 ada insentif besar secara finansial untuk membuat kode Anda terlihat seperti berantakan 909 00:57:54,860 --> 00:57:58,980 sehingga Anda menggunakan sebagai byte sesedikit mungkin di samping untuk kemudian mengompresi 910 00:57:58,980 --> 00:58:01,500 menggunakan sesuatu seperti zip, algoritma yang disebut gzip, 911 00:58:01,500 --> 00:58:04,250 bahwa browser tidak untuk Anda secara otomatis. Tapi ini mengerikan. 912 00:58:04,250 --> 00:58:08,060 Kita tidak akan pernah belajar apa-apa tentang website orang lain dan bagaimana merancang halaman web 913 00:58:08,060 --> 00:58:09,680 jika kita harus melihatnya seperti ini. 914 00:58:09,680 --> 00:58:13,620 >> Jadi untungnya, browser seperti Chrome dan IE dan Firefox hari ini 915 00:58:13,620 --> 00:58:16,450 biasanya datang dengan built-in tools pengembang. 916 00:58:16,450 --> 00:58:21,730 Bahkan, jika saya pergi ke sini untuk Inspect Element atau jika saya pergi ke Lihat, Developer, 917 00:58:21,730 --> 00:58:25,220 dan pergi ke Tools Developer eksplisit, 918 00:58:25,220 --> 00:58:27,640 ini jendela di bagian bawah layar saya sekarang muncul. 919 00:58:27,640 --> 00:58:31,230 Ini sedikit menakutkan pada awalnya karena ada banyak tab asing di sini, 920 00:58:31,230 --> 00:58:34,510 tetapi jika saya klik pada Elemen sepanjang jalan di bagian kiri bawah, 921 00:58:34,510 --> 00:58:38,810 Chrome jelas cukup pintar. Ia tahu bagaimana menafsirkan semua kode ini. 922 00:58:38,810 --> 00:58:42,320 Dan jadi apa Chrome dilakukannya itu membersihkan semua HTML Facebook. 923 00:58:42,320 --> 00:58:45,680 Meskipun tidak ada spasi ada, tidak ada lekukan di sana, 924 00:58:45,680 --> 00:58:51,120 Sekarang perhatikan bahwa saya dapat mulai menavigasi halaman web ini semua lebih hierarkis. 925 00:58:51,120 --> 00:58:56,910 Ternyata bahwa setiap halaman web yang ditulis dalam bahasa yang disebut HTML5 harus dimulai dengan hal ini, 926 00:58:56,910 --> 00:59:03,980 ini deklarasi DOCTYPE, sehingga untuk berbicara: 927 00:59:03,980 --> 00:59:07,840 Ini semacam cahaya dan abu-abu di sana, tapi itu baris pertama kode dalam file ini, 928 00:59:07,840 --> 00:59:12,080 dan itu hanya memberitahu browser, "Hei, inilah beberapa HTML5 Here comes halaman web.." 929 00:59:12,080 --> 00:59:18,490 Braket terbuka pertama di luar itu akan terjadi hal, braket tag HTML terbuka, 930 00:59:18,490 --> 00:59:22,320 dan kemudian jika saya menyelam lebih dalam - panah-panah ini benar-benar berarti; 931 00:59:22,320 --> 00:59:25,140 mereka hanya demi presentasi, mereka tidak benar-benar dalam file - 932 00:59:25,140 --> 00:59:30,300 melihat bahwa dalam tag HTML Facebook, apa pun yang dimulai dengan braket terbuka 933 00:59:30,300 --> 00:59:32,910 dan kemudian memiliki sebuah kata disebut tag. 934 00:59:32,910 --> 00:59:38,610 Jadi di dalam tag HTML adalah rupanya tag kepala dan tag tubuh. 935 00:59:38,610 --> 00:59:41,930 Di dalam tag kepala sekarang adalah seluruh kekacauan untuk Facebook 936 00:59:41,930 --> 00:59:45,620 karena mereka memiliki banyak metadata dan hal-hal lain untuk pemasaran dan periklanan. 937 00:59:45,620 --> 00:59:50,600 >> Tetapi jika kita scroll ke bawah, bawah, bawah, bawah, mari kita lihat di mana itu. Ini dia. 938 00:59:50,600 --> 00:59:52,210 Yang satu ini setidaknya agak akrab. 939 00:59:52,210 --> 00:59:55,990 Judul halaman rumah Facebook, jika Anda pernah melihat di tab di bar judul, 940 00:59:55,990 --> 00:59:59,060 Selamat Datang di Facebook adalah - Log In, Mendaftar atau Pelajari Lebih. 941 00:59:59,060 --> 01:00:01,110 Itulah yang akan Anda lihat di title bar Chrome, 942 01:00:01,110 --> 01:00:03,100 dan itulah bagaimana hal itu diwakili dalam kode. 943 01:00:03,100 --> 01:00:08,090 Jika kita mengabaikan segala sesuatu yang lain di kepala, sebagian besar keberanian dari sebuah halaman web dalam tubuh, 944 01:00:08,090 --> 01:00:10,940 dan ternyata bahwa kode Facebook akan terlihat lebih kompleks 945 01:00:10,940 --> 01:00:14,540 daripada hal-hal yang paling kita akan menulis awalnya hanya karena sudah dibangun selama bertahun-tahun, 946 01:00:14,540 --> 01:00:17,260 tapi ada banyak seluruh tag script, kode JavaScript, 947 01:00:17,260 --> 01:00:18,870 yang membuat website sangat interaktif: 948 01:00:18,870 --> 01:00:22,330 melihat update status seketika menggunakan bahasa seperti JavaScript. 949 01:00:22,330 --> 01:00:25,270 Ada sesuatu yang disebut div, yang merupakan divisi dari halaman. 950 01:00:25,270 --> 01:00:27,940 Tapi sebelum kita sampai ke detail yang, mari kita coba untuk memperkecil 951 01:00:27,940 --> 01:00:31,920 dan melihat versi sederhana dari Facebook 1.0, sehingga untuk berbicara. 952 01:00:31,920 --> 01:00:34,740 Berikut adalah dunia, halo halaman web. 953 01:00:34,740 --> 01:00:37,370 Memiliki bahwa deklarasi DOCTYPE di bagian paling atas 954 01:00:37,370 --> 01:00:40,280 yang sedikit berbeda dari segala sesuatu yang lain. 955 01:00:40,280 --> 01:00:46,130 Tidak ada lagi yang kita tulis di halaman web akan mulai dengan 01:00:48,880 dan kecuali untuk sesuatu yang disebut komentar dalam HTML. 957 01:00:48,880 --> 01:00:53,000 Tapi bagi sebagian besar, segala sesuatu dalam suatu halaman web adalah braket, buka kunci, braket dekat. 958 01:00:53,000 --> 01:00:56,220 >> Dalam hal ini Anda dapat melihat halaman web sederhana mungkin. 959 01:00:56,220 --> 01:01:00,260 Tag HTML berisi tag kepala dan mengandung tag body, 960 01:01:00,260 --> 01:01:04,580 tetapi perhatikan bahwa ada gagasan untuk memulai dan menghentikan tag. 961 01:01:04,580 --> 01:01:11,360 Ini adalah tag awal untuk HTML, ini adalah tag dekat atau tag akhir. 962 01:01:11,360 --> 01:01:15,400 Perhatikan bahwa mereka semacam pertentangan dalam arti bahwa tag dekat atau tag akhir 963 01:01:15,400 --> 01:01:20,030 telah ini garis miring dalam dirinya sendiri. 964 01:01:20,030 --> 01:01:23,540 Sementara itu, ada sebuah tag kepala terbuka di sini dan tag kepala dekat sini. 965 01:01:23,540 --> 01:01:26,880 >> Ada judul yang terbuka dan tag judul dekat sini. 966 01:01:26,880 --> 01:01:29,850 Kenyataan bahwa aku telah menempatkan judul pada satu baris, murni sewenang-wenang. 967 01:01:29,850 --> 01:01:33,760 Itu hanya tampak seperti itu akan cocok dengan baik pada satu baris, jadi aku tidak repot-repot menekan Enter beberapa kali. 968 01:01:33,760 --> 01:01:38,200 Sementara itu, tubuh saya lakukan hanya untuk indent pernah begitu jelas. 969 01:01:38,200 --> 01:01:41,050 Perhatikan bahwa HTML adalah bahasa yang cukup bodoh. 970 01:01:41,050 --> 01:01:43,410 Padahal, kembali pada hari sebelum ada editor WYSIWYG 971 01:01:43,410 --> 01:01:46,770 dan Microsoft Word di mana Anda dapat mengatakan, "Jadikan ini berani, membuat miring," 972 01:01:46,770 --> 01:01:50,850 Anda benar-benar akan ketik perintah kecil dalam esai 20 + tahun yang lalu 973 01:01:50,850 --> 01:01:55,740 dimana Anda akan berkata, "Mulai membuat teks tebal ini Berhenti membuat teks tebal ini.." 974 01:01:55,740 --> 01:01:59,010 "Mulai membuat ini miring teks Berhenti membuat ini miring teks.." 975 01:01:59,010 --> 01:02:01,850 >> Itulah yang HTML atau bahasa markup adalah. 976 01:02:01,850 --> 01:02:05,530 Ini tag pertama mengatakan, "Hei, browser. Sinilah beberapa HTML." 977 01:02:05,530 --> 01:02:09,880 Tag berikutnya mengatakan, "Hei, browser. Sinilah kepala, header halaman web saya." 978 01:02:09,880 --> 01:02:11,650 "Hei, browser. Sinilah judul." 979 01:02:11,650 --> 01:02:15,880 Dan kemudian di sini, "Hei, browser. Itu saja untuk judul." 980 01:02:15,880 --> 01:02:20,000 Jadi ini adalah bagaimana browser tahu untuk tidak lagi menampilkan karakter lebih dari halo, dunia 981 01:02:20,000 --> 01:02:21,860 dalam judul bar. 982 01:02:21,860 --> 01:02:23,640 Sementara itu, ini mengatakan, "Itu saja untuk kepala." 983 01:02:23,640 --> 01:02:28,340 Ini mengatakan, "Di sinilah tubuh Berikut adalah tubuh yang sebenarnya." - Secara harfiah, kata-kata halo, dunia. 984 01:02:28,340 --> 01:02:33,190 Dan ini mengatakan di sini, "Itu untuk tubuh Itu saja untuk HTML.." 985 01:02:33,190 --> 01:02:34,640 Jadi browser yang cukup bodoh. 986 01:02:34,640 --> 01:02:39,920 Mereka hanya membaca hal ini atas ke bawah, kiri ke kanan, dan melakukan apa yang mereka diperintahkan untuk melakukan. 987 01:02:39,920 --> 01:02:41,860 Mari kita benar-benar melakukan sedikit contoh di sini. 988 01:02:41,860 --> 01:02:46,240 Mari saya membuka sederhana program pada Mac saya di sini, yaitu TextEdit. 989 01:02:46,240 --> 01:02:48,220 Pada Windows Anda dapat menggunakan Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Tapi ini adalah semua yang Anda butuhkan untuk mulai membuat halaman web. 991 01:02:50,520 --> 01:02:53,730 Aku akan pergi ke depan dan hanya copy dan paste kode ini ke dalam file ini. 992 01:02:53,730 --> 01:02:57,210 Aku akan pergi ke depan dan simpan di desktop saya, 993 01:02:57,210 --> 01:03:01,220 dan aku akan menyimpan ini sebagai hello.html, 994 01:03:01,220 --> 01:03:03,840 dan sekarang file bernama hello.html. 995 01:03:03,840 --> 01:03:05,690 Ini dia pada desktop saya. 996 01:03:05,690 --> 01:03:11,130 Biarkan saya sekarang masuk ke browser dan tarik file ke browser. 997 01:03:11,130 --> 01:03:14,060 Dan voila, di sini adalah halaman web pertama saya. 998 01:03:14,060 --> 01:03:17,340 Perhatikan bahwa judul tab adalah halo, dunia sesuai dengan tag judul, 999 01:03:17,340 --> 01:03:20,040 dan perhatikan bahwa halo, dunia adalah badan halaman web saya, 1000 01:03:20,040 --> 01:03:22,190 dan woo-hoo, aku di Internet. 1001 01:03:22,190 --> 01:03:24,700 >> Aku tidak benar-benar, benar, karena file ini tidak di Internet. 1002 01:03:24,700 --> 01:03:28,330 Ini akan terjadi pada hard drive lokal saya pada saat itu jalan tertentu. 1003 01:03:28,330 --> 01:03:32,720 Tetapi gagasan adalah sama. Semua sekarang kita butuhkan adalah web server yang meng-upload. 1004 01:03:32,720 --> 01:03:37,410 Tapi pertama-tama mari kita benar-benar memperkenalkan kompleksitas sedikit lebih dan stilisasi yang lebih sedikit. 1005 01:03:37,410 --> 01:03:39,890 Ini adalah sederhana, jika membosankan, halaman web. 1006 01:03:39,890 --> 01:03:41,990 Ternyata ada jenis lain dari tag yang bisa kita gunakan. 1007 01:03:41,990 --> 01:03:45,530 Misalnya, di sini di kuning saya telah memperkenalkan 2 tag baru. 1008 01:03:45,530 --> 01:03:49,630 Kami tidak akan bermain banyak dengan hari ini, tetapi perhatikan bahwa link tag 1009 01:03:49,630 --> 01:03:52,520 entah bagaimana tampak berbeda dari segala sesuatu yang lain. 1010 01:03:52,520 --> 01:03:55,370 The tag link mengambil apa yang disebut atribut, 1011 01:03:55,370 --> 01:03:59,770 dan atribut adalah sesuatu yang mengubah perilaku dari tag. 1012 01:03:59,770 --> 01:04:03,840 Dalam hal ini ini bukan pilihan terbaik dari nama, link, karena itu agak berarti, 1013 01:04:03,840 --> 01:04:11,590 tapi ini tag link mengatakan, pada dasarnya, termasuk file bernama styles.css dalam halaman web saya. 1014 01:04:11,590 --> 01:04:15,400 Anda dapat menganggap ini sebagai analog dengan C # include direktif. 1015 01:04:15,400 --> 01:04:19,650 Styles.css mengacu pada bahasa yang berbeda sama sekali bahwa kami tidak akan bermain dengan hari ini, 1016 01:04:19,650 --> 01:04:23,790 tapi itu untuk estetika: ukuran font, warna, padding, indentasi, margin, 1017 01:04:23,790 --> 01:04:26,040 dan semua itu detail semacam estetika. 1018 01:04:26,040 --> 01:04:28,820 Sementara itu, tag script secara fungsional serupa, 1019 01:04:28,820 --> 01:04:33,140 tapi bukannya termasuk CSS, bahasa itu, termasuk bahasa lain, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Jadi dengan kata lain, dengan 2 tag akhirnya saya akan bisa menulis halaman web saya sendiri 1021 01:04:37,810 --> 01:04:41,490 tetapi juga menarik dalam kode yang saya atau orang lain telah menulis 1022 01:04:41,490 --> 01:04:44,350 sehingga kita dapat berdiri di atas bahu orang lain, kita bisa berlatih desain yang baik, 1023 01:04:44,350 --> 01:04:46,120 anjak keluar kode umum. 1024 01:04:46,120 --> 01:04:49,090 Jika saya punya 10 halaman web yang berbeda, hal ini berarti bahwa beberapa estetika saya 1025 01:04:49,090 --> 01:04:52,490 bisa keluar faktor, seperti # include, dalam berkas yang terpisah. 1026 01:04:52,490 --> 01:04:54,420 Jadi kita menuju ke sana. 1027 01:04:54,420 --> 01:04:57,180 Tapi mari kita benar-benar pertama melakukan sesuatu yang lebih menarik dengan file ini. 1028 01:04:57,180 --> 01:05:01,110 >> Sekali lagi, ini hanya TextEdit. Aku tidak teknis di Internet, tapi kami akan sampai di sana. 1029 01:05:01,110 --> 01:05:04,910 Saya ingin membuat halo, dunia sedikit lebih berani daripada. 1030 01:05:04,910 --> 01:05:10,890 Jadi halo, mari kita sewenang-wenang mengatakan untuk berani. 1031 01:05:10,890 --> 01:05:15,910 Sekali lagi, cerita sama: halo, koma, mulai membuat ini berani, 1032 01:05:15,910 --> 01:05:19,730 maka dunia akan dicetak dalam huruf tebal, dan ini berarti menghentikan pencetakan ini dalam huruf tebal. 1033 01:05:19,730 --> 01:05:24,020 Biarkan aku pergi ke depan dan menyimpan file saya, kembali ke Chrome, saya akan memperbesar hanya supaya kita bisa melihat lebih baik, 1034 01:05:24,020 --> 01:05:27,870 dan kembali, dan Anda akan melihat dunia yang sekarang dicetak tebal. 1035 01:05:27,870 --> 01:05:31,810 Web adalah semua tentang hyperlink, jadi mari kita pergi ke depan dan melakukan hal ini: 1036 01:05:31,810 --> 01:05:38,550 situs favorit saya adalah, katakanlah, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Simpan, reload. Oke. Ada beberapa masalah sekarang selain hideousness website. 1038 01:05:43,810 --> 01:05:47,310 1, aku cukup yakin aku tekan Enter sini. Dan saya lakukan. 1039 01:05:47,310 --> 01:05:51,590 Saya tidak hanya tekan Enter, saya juga indentasi, mempraktekkan apa yang telah kita berkhotbah tentang gaya, 1040 01:05:51,590 --> 01:05:54,930 tapi saya tepat di sebelah dunia. 1041 01:05:54,930 --> 01:05:58,410 Lalu mengapa ini? Browser hanya melakukan apa yang Anda katakan mereka lakukan. 1042 01:05:58,410 --> 01:06:04,010 Saya belum memberitahu browser, "Istirahat baris disini Masukkan paragraf istirahat di sini.." 1043 01:06:04,010 --> 01:06:07,820 Jadi browser, tidak masalah jika aku memukul Kembali 30 kali, 1044 01:06:07,820 --> 01:06:10,820 itu masih akan menempatkan hak saya di samping dunia. 1045 01:06:10,820 --> 01:06:15,930 Apa yang saya benar-benar harus dilakukan di sini adalah mengatakan sesuatu seperti
, menyisipkan satu baris. 1046 01:06:15,930 --> 01:06:17,940 >> Dan sebenarnya, satu baris adalah jenis hal yang aneh 1047 01:06:17,940 --> 01:06:21,650 karena Anda tidak bisa benar-benar mulai pindah ke jalur lain, kemudian melakukan sesuatu, 1048 01:06:21,650 --> 01:06:25,380 dan kemudian berhenti bergerak ke baris baru. Ini semacam operasi atom. 1049 01:06:25,380 --> 01:06:28,140 Anda juga melakukannya atau tidak. Anda tekan Enter atau tidak. 1050 01:06:28,140 --> 01:06:33,390 Jadi br adalah sedikit dari sebuah tag yang berbeda, dan jadi saya perlu semacam baik terbuka dan menutupnya 1051 01:06:33,390 --> 01:06:35,230 sekaligus. 1052 01:06:35,230 --> 01:06:37,500 Sintaks untuk itu adalah ini. 1053 01:06:37,500 --> 01:06:41,760 Secara teknis, Anda bisa melakukan sesuatu seperti ini dalam beberapa versi HTML, 1054 01:06:41,760 --> 01:06:45,600 tapi ini hanya bodoh karena tidak ada alasan untuk memulai dan menghentikan sesuatu 1055 01:06:45,600 --> 01:06:48,420 jika Anda malah bisa melakukan semuanya sekaligus. 1056 01:06:48,420 --> 01:06:52,310 Sadarilah HTML5 yang tidak ketat memerlukan slash ini, 1057 01:06:52,310 --> 01:06:55,410 sehingga Anda akan melihat buku pelajaran dan sumber daya online yang tidak memilikinya, 1058 01:06:55,410 --> 01:06:59,780 tetapi untuk mengukur baik mari kita berlatih simetri yang kita lihat sejauh ini. 1059 01:06:59,780 --> 01:07:02,870 Ini berarti bahwa tag adalah baik dibuka dan ditutup. 1060 01:07:02,870 --> 01:07:05,220 Jadi sekarang biarkan aku menyimpan file saya, kembali ke sini. 1061 01:07:05,220 --> 01:07:10,240 Oke, jadi itu mulai terlihat lebih baik, kecuali Web saya tahu adalah jenis diklik, 1062 01:07:10,240 --> 01:07:13,610 namun youtube di sini tampaknya tidak mengakibatkan apa-apa. 1063 01:07:13,610 --> 01:07:17,560 Itu karena meskipun tampak seperti link, browser tidak tahu bahwa per se, 1064 01:07:17,560 --> 01:07:20,670 jadi saya harus memberitahu browser bahwa ini adalah link. 1065 01:07:20,670 --> 01:07:22,620 >> Cara untuk melakukan ini adalah dengan menggunakan tag anchor: 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 dan biarkan aku memindahkan ke baris baru hanya jadi sedikit lebih mudah dibaca, 1069 01:07:38,490 --> 01:07:40,060 dan aku akan mengecilkan ukuran font. 1070 01:07:40,060 --> 01:07:43,890 Apakah saya sudah selesai? Tidak Ada akan menjadi dikotomi ini. 1071 01:07:43,890 --> 01:07:46,760 Ini tag, tag anchor, memang mengambil atribut, 1072 01:07:46,760 --> 01:07:52,900 yang memodifikasi perilaku, dan nilai dari atribut yang tampaknya URL YouTube. 1073 01:07:52,900 --> 01:07:56,380 Tetapi melihat dikotomi adalah bahwa hanya karena itulah URL Anda akan, 1074 01:07:56,380 --> 01:08:01,020 itu tidak berarti bahwa harus menjadi kata yang Anda menggarisbawahi dan membuat link. 1075 01:08:01,020 --> 01:08:03,960 Sebaliknya, yang bisa menjadi sesuatu seperti ini. 1076 01:08:03,960 --> 01:08:10,870 Jadi saya harus mengatakan berhenti membuat kata ini hyperlink dengan menggunakan tag anchor dekat. 1077 01:08:10,870 --> 01:08:12,650 Perhatikan Aku tidak melakukan hal ini. 1078 01:08:12,650 --> 01:08:15,890 1, ini hanya akan membuang-buang waktu semua orang dan itu tidak perlu. 1079 01:08:15,890 --> 01:08:19,290 >> Untuk menutup tag, Anda hanya menyebutkan nama tag lagi. 1080 01:08:19,290 --> 01:08:21,800 Anda tidak menyebutkan salah satu atribut. 1081 01:08:21,800 --> 01:08:26,189 Jadi mari kita simpan itu, kembali. Oke, voila, sekarang biru dan hyperlink. 1082 01:08:26,189 --> 01:08:29,430 Jika saya klik, saya benar-benar melakukan pergi ke YouTube. 1083 01:08:29,430 --> 01:08:32,529 Jadi meskipun halaman web saya tidak di internet, itu setidaknya HTML, 1084 01:08:32,529 --> 01:08:37,930 dan jika kita membiarkan Internet mengejar ketinggalan, kita benar-benar akan berakhir di sini di youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Dan aku bisa kembali dan inilah halaman web saya. Tapi perhatikan ini. 1086 01:08:40,670 --> 01:08:43,120 Jika Anda pernah mendapatkan spam atau serangan phishing, 1087 01:08:43,120 --> 01:08:45,850 sekarang Anda memiliki kemampuan setelah hanya lima menit untuk melakukan hal yang sama. 1088 01:08:45,850 --> 01:08:50,920 Kita bisa pergi di sini dan melakukan sesuatu seperti www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 atau apa pun website samar, dan kemudian Anda dapat mengatakan memverifikasi account PayPal Anda. 1090 01:08:59,319 --> 01:09:04,840 [Tertawa] Dan sekarang ini akan pergi ke badguy.com, yang aku tidak akan mengklik 1091 01:09:04,840 --> 01:09:08,000 karena saya tidak tahu di mana yang mengarah. [Tertawa] 1092 01:09:08,000 --> 01:09:10,859 >> Tapi kita sekarang memiliki kemampuan untuk benar-benar berakhir di sana. 1093 01:09:10,859 --> 01:09:12,640 Jadi kita benar-benar hanya mulai menggores permukaan. 1094 01:09:12,640 --> 01:09:15,830 Kami tidak pemrograman per se, kami sedang menulis bahasa markup. 1095 01:09:15,830 --> 01:09:18,569 Tapi segera setelah kami melengkapi kosakata kami di HTML, 1096 01:09:18,569 --> 01:09:21,520 kami akan memperkenalkan PHP, bahasa pemrograman yang sebenarnya 1097 01:09:21,520 --> 01:09:26,859 yang akan memungkinkan kita untuk menghasilkan HTML secara otomatis, menghasilkan CSS otomatis, 1098 01:09:26,859 --> 01:09:29,430 sehingga kita dapat dimulai pada hari Rabu untuk melaksanakan, katakanlah, 1099 01:09:29,430 --> 01:09:31,700 kita sendiri mesin pencari dan banyak lagi. 1100 01:09:31,700 --> 01:09:34,770 Tapi lebih pada bahwa dalam beberapa hari. Kita akan melihat Anda kemudian. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]