1 00:00:00,000 --> 00:00:12,040 >> [Prehrávanie hudby] 2 00:00:12,040 --> 00:00:16,460 >> SPEAKER 1: Tak jo, to je CS50, a to je začiatok štvrtého týždňa 3 00:00:16,460 --> 00:00:20,420 a ako ste možno počuli alebo čítať, bol svet končí. 4 00:00:20,420 --> 00:00:23,520 Chystáte sa na celom internete bol znalosti a povedomia 5 00:00:23,520 --> 00:00:27,100 chyby v programe, čo je programovací jazyk s názvom Bash. 6 00:00:27,100 --> 00:00:32,729 To bolo nádherne značkové ako Shellshock alebo dvere Bash, 7 00:00:32,729 --> 00:00:35,485 ale predmety, ako sú tieto neboli neobvyklé. 8 00:00:35,485 --> 00:00:38,807 A v skutočnosti, mnoho z nich, aby spomienky Heartbleed, 9 00:00:38,807 --> 00:00:41,640 ktoré ste si možno všimli v stlačte znovu tento rok na jar, čo 10 00:00:41,640 --> 00:00:43,980 bol podobne docela dramatický. 11 00:00:43,980 --> 00:00:47,110 Teraz tí z vás dnes, koľko z vás, 12 00:00:47,110 --> 00:00:50,330 aj keď nechápem, čo je to všetko o, počul Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Dobre, a koľko z vás majú počítače, ktoré sú zraniteľné? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, mal by tam byť ďaleko, ďaleko viac rúk práve teraz, z dôvodov, ktoré sú vidieť. 17 00:01:00,250 --> 00:01:02,580 >> Poďme sa pozrieť na to, čo je sa deje v médiách 18 00:01:02,580 --> 00:01:05,304 A potom sa to trochu vysvetliť pre nás technicky. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> SPEAKER 2: Bezpečnostné experti majú varoval, že vážna chyba by mohla 21 00:01:11,250 --> 00:01:15,650 asi ovplyvniť stovky milióny svetových internetových užívateľov. 22 00:01:15,650 --> 00:01:20,600 Takže čo presne je chyba, že to bolo daboval Shellshock, a čo to robí? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 No, Shellshock je tiež známy ako Bash chyba, softvér ich využíva. 25 00:01:28,910 --> 00:01:33,230 Hackeri používajú vírus skenovanie zraniteľné systémy beží Linux a Unix 26 00:01:33,230 --> 00:01:36,300 operačné systémy a infikovať ich. 27 00:01:36,300 --> 00:01:38,730 Bash je príkazový riadok shellu. 28 00:01:38,730 --> 00:01:43,460 To umožňuje užívateľom vydávať príkazy na spustenie programy a funkcie v softvéri 29 00:01:43,460 --> 00:01:45,250 zadaním textu. 30 00:01:45,250 --> 00:01:49,980 To je zvyčajne používaný programátorov a by nemala byť otvorená voči okolitému svetu, 31 00:01:49,980 --> 00:01:51,590 keď Shellshock zmeny, ktoré. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> No, worringly, niektorí analytici varujú, že môže byť väčšou hrozbou, 34 00:01:57,910 --> 00:02:01,580 pretože Shellshock umožňuje kompletné ovládanie infikovaného stroja, 35 00:02:01,580 --> 00:02:06,030 vzhľadom k tomu, Heartbleed povolené len hackeri špehovať na počítačoch. 36 00:02:06,030 --> 00:02:09,130 Je to tak vážne, že je to bola hodnotená v 10 z 10 37 00:02:09,130 --> 00:02:11,900 k závažnosti podľa vnútroštátnych Databáza zraniteľnosť. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 zo všetkých webových serverov sú rizík, vrátane niektorých počítačoch so systémom Mac. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 No, uistite sa, že opraviť svoje systémy teraz. 42 00:02:25,600 --> 00:02:29,330 Každý hosting webových stránok v chode postihnuté operačné systémy 43 00:02:29,330 --> 00:02:31,800 by mali prijať opatrenia čo najskôr. 44 00:02:31,800 --> 00:02:35,390 Každý, kto si môže dovoliť to malo vyzerať ich sledovanie a webové aplikácie 45 00:02:35,390 --> 00:02:37,355 firewally dávať pozor na prípadné útoky. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 SPEAKER 3: Najhoršia vec že by sa mohlo stať, je 48 00:02:41,770 --> 00:02:45,080 že by niekto napísať kód, ktorý sa automaticky prepne a skenovanie 49 00:02:45,080 --> 00:02:48,280 internet a bude mať vplyv na všetkých týchto počítačov. 50 00:02:48,280 --> 00:02:50,710 A keď to robia dobre, Najhoršia vec, ktorú mohol urobiť 51 00:02:50,710 --> 00:02:53,300 je len odstrániť všetko, alebo zavrel miesta nadol. 52 00:02:53,300 --> 00:02:55,360 Takže sme mohli vidieť poškodenie z tohto uhla pohľadu, 53 00:02:55,360 --> 00:02:58,300 kde budeme mať škodlivé ľudí ktorí sa len rozhodnúť, že spôsobí katastrofu 54 00:02:58,300 --> 00:03:02,534 tým, že systémy, nadol alebo odstránenie súbory, a podobné veci. 55 00:03:02,534 --> 00:03:05,200 SPEAKER 2: Niektorí hovoria, že je to jeden z najťažších merať 56 00:03:05,200 --> 00:03:08,080 chyby v rokoch, a to môže trvať týždne alebo dokonca 57 00:03:08,080 --> 00:03:10,820 mesiacov na určenie jeho konečného vplyvu. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> SPEAKER 1: Takže všetko je to pravda, ale legrační vec je, takmer všetky 60 00:03:15,560 --> 00:03:18,330 Užívanie metafor ste práve videli, s výnimkou snáď klávesnicu, 61 00:03:18,330 --> 00:03:20,930 nemá nič spoločné s bug vôbec. 62 00:03:20,930 --> 00:03:23,960 Servery a drôty a tak ďalej, je to trochu tangenciálne súvisiacich 63 00:03:23,960 --> 00:03:27,410 ale v jadre je to vlastne celkom pozná to, čo sa tu deje. 64 00:03:27,410 --> 00:03:30,050 V skutočnosti, nechajte ma ísť do naše CS50 spotrebiča. 65 00:03:30,050 --> 00:03:32,910 Nechaj ma ísť napred a maximalizovať okno terminálu tu. 66 00:03:32,910 --> 00:03:36,020 A vy ste pomocou tohto, alebo vložený verzie tejto zmluvy, 67 00:03:36,020 --> 00:03:39,460 v gedit, aby sa písať programy, typ príkazy, a tak ďalej, 68 00:03:39,460 --> 00:03:43,690 a to je v skutočnosti, a má už niekoľko týždňov, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 To je Bourne-again shell, čo je len ozdobný spôsob, ako hovoriť, 70 00:03:46,890 --> 00:03:50,220 To je program, ktorý má blikanie rýchle, efektívne, 71 00:03:50,220 --> 00:03:51,970 že sedí tam čaká pre vstup pre vás. 72 00:03:51,970 --> 00:03:53,920 A je to príkaz riadky, cez ktoré 73 00:03:53,920 --> 00:03:57,650 vy ste bola spustená príkazov a nakoniec kompiláciu a spustením 74 00:03:57,650 --> 00:03:58,400 programy. 75 00:03:58,400 --> 00:04:01,320 >> Ale Bash je tiež programovanie jazyk v nasledujúcom zmysle. 76 00:04:01,320 --> 00:04:05,460 Viete, že existujú príkazy, ako je cd a ls aj zvoniť a ďalšie, 77 00:04:05,460 --> 00:04:09,580 ale môžete definovať vlastné príkazy od ich zavádzania do Bash. 78 00:04:09,580 --> 00:04:11,420 Teraz už nebudeme ísť do skvelého detailu 79 00:04:11,420 --> 00:04:16,089 ako Bash programovací jazyk, ale Viete, napríklad, že v súčasnej dobe, 80 00:04:16,089 --> 00:04:17,607 tam žiadny príkaz s názvom "Ahoj." 81 00:04:17,607 --> 00:04:19,440 Takže to možno nájsť v jeden z týchto balíčkov. 82 00:04:19,440 --> 00:04:20,856 Nie je nainštalovaný na mojom počítači. 83 00:04:20,856 --> 00:04:21,870 Spýtajte sa na správcu systému. 84 00:04:21,870 --> 00:04:26,030 Ale ak chcem tam byť program s názvom "ahoj" v bash alebo na moje výzvy, 85 00:04:26,030 --> 00:04:30,810 Môžem skutočne používať syntax, ktorá je celkom ako C. Nie je to úplne rovnaké, 86 00:04:30,810 --> 00:04:35,020 ale vyzerá to celkom podobné funkcie, aj keď chýbajú niektoré detaily. 87 00:04:35,020 --> 00:04:38,090 Sa zdanlivo nič nedeje, ale teraz keď som napísať "ahoj" 88 00:04:38,090 --> 00:04:40,960 , Môžete vytvoriť programu, a to v jazyku C, a to v jazyku Java, 89 00:04:40,960 --> 00:04:44,280 nie v inom programovaní jazyk, ale v Bash sám. 90 00:04:44,280 --> 00:04:47,630 >> Teraz je tu kľúčové je, že som napísal Meno Chcel som, aby tento nový príkaz, 91 00:04:47,630 --> 00:04:50,820 a zátvorky sú tiež symbolický čo je funkcia. 92 00:04:50,820 --> 00:04:54,010 Mimochodom, môžete si tiež urobiť srandu veci, a v skutočnosti, a to aj na Mac OS, 93 00:04:54,010 --> 00:04:55,620 To je program s názvom Terminal. 94 00:04:55,620 --> 00:04:58,800 Je dodávaný vstavaný do kohokoľvek počítač, ktorý má Mac v tejto miestnosti, 95 00:04:58,800 --> 00:05:03,640 a môžete robiť podobné veci v Mac OS, ale môžete ísť viac než to. 96 00:05:03,640 --> 00:05:07,110 A to je trochu tangenciálny, ale je to celkom sranda. 97 00:05:07,110 --> 00:05:09,715 Pripomenul som si dnes ráno, keď myslia si, vďaka, 98 00:05:09,715 --> 00:05:13,279 na malú hru som hrával s jedným z CS50 bývalých TFs 99 00:05:13,279 --> 00:05:16,570 kedy kedykoľvek by odísť z Jeho klávesnica s jeho obrazovku odomknúť, 100 00:05:16,570 --> 00:05:23,611 Ja by som spustiť príkaz ako tohle-- "pozdraviť." 101 00:05:23,611 --> 00:05:26,610 A teraz nejaký čas sa vrátil k jeho klávesnice, čo som vyčistil obrazovku 102 00:05:26,610 --> 00:05:27,985 a on by si sadnúť, pokúsiť sa urobiť nejakú prácu, 103 00:05:27,985 --> 00:05:29,250 vypísať obsah jeho directory-- 104 00:05:29,250 --> 00:05:29,510 >> [Prehrávanie zvuku] 105 00:05:29,510 --> 00:05:30,010 >> Ahoj. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Dobrý deň. 108 00:05:32,120 --> 00:05:35,030 >> SPEAKER 1: Takže, v spravodlivosti, to nie je v skutočnosti "ahoj." 109 00:05:35,030 --> 00:05:36,894 Bolo to zvyčajne niečo viac podobný že-- 110 00:05:36,894 --> 00:05:37,560 [Prehrávanie zvuku] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 SPEAKER 1: začali uznávať takzvané I would-- tak jeho počítač by 113 00:05:39,320 --> 00:05:42,170 nadávať na neho, kedykoľvek sa mu vlastne sa posadil na jeho klávesnici. 114 00:05:42,170 --> 00:05:46,265 A veľmi rýchlo prišiel na to nenechávať jeho obrazovka odomknutá. 115 00:05:46,265 --> 00:05:48,730 Ale to naznačuje, že druh z hlúpe zábavy, ktorá vás 116 00:05:48,730 --> 00:05:50,210 môže mať niečo ako Bash. 117 00:05:50,210 --> 00:05:52,770 Ale je to trochu viac vážne, aby bolo jasno, než to. 118 00:05:52,770 --> 00:05:57,235 A v skutočnosti, to je jeden z najnebezpečnejšie a dlhotrvajúci chyby 119 00:05:57,235 --> 00:05:58,860 že naozaj zasiahla svet po celom svete. 120 00:05:58,860 --> 00:06:02,060 Táto chyba bola asi pre asi 20 rokov, 121 00:06:02,060 --> 00:06:05,780 a budete udrel v niekoľkých okamih jeho relatívna jednoduchosť. 122 00:06:05,780 --> 00:06:07,990 >> Tak toto je reprezentatívna príkaz, že ak 123 00:06:07,990 --> 00:06:10,448 vlastné Mac, doslova hneď Keď máte otvorené veko, 124 00:06:10,448 --> 00:06:12,940 môžete skúsiť písať do toho program s názvom Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminál je pod Aplikácia Utilities-- 126 00:06:15,410 --> 00:06:18,790 raz, používatelia Windows nemusíte starať o tomto threat-- 127 00:06:18,790 --> 00:06:22,310 ale tí z vás s počítačmi Mac môžete zadať to do okna, ako to urobím tu, 128 00:06:22,310 --> 00:06:24,210 a ak nechcete písať že do tohto programu 129 00:06:24,210 --> 00:06:28,830 Terminál, ako ja budem robiť teraz, keď vidíte slovo "zraniteľný", 130 00:06:28,830 --> 00:06:32,200 váš počítač náchylné k vykorisťovaniu. 131 00:06:32,200 --> 00:06:33,850 >> Teraz čo to vlastne znamená? 132 00:06:33,850 --> 00:06:35,870 A to je pravda niektorí dosť šialené syntax, 133 00:06:35,870 --> 00:06:39,050 ale poďme aspoň vytiahnuť niektoré zo zaujímavých aspektov. 134 00:06:39,050 --> 00:06:42,567 Takže tam je nejaká syntaxe, ktorá vyzerá trochu pozná, aspoň z C 135 00:06:42,567 --> 00:06:43,950 a programovanie všeobecne. 136 00:06:43,950 --> 00:06:47,550 Vidím nejaké zátvorky, bodkočiarkami, zložené zátvorky, a také, 137 00:06:47,550 --> 00:06:50,820 ale ukázalo sa, že tento hlúposť tu v žltej farbe 138 00:06:50,820 --> 00:06:53,580 je v podstate funkcia že nerobí nič. 139 00:06:53,580 --> 00:06:57,840 Dvojbodka znamená nerobiť nič, a bodkočiarka znamená prestať robiť nič. 140 00:06:57,840 --> 00:07:00,250 Takže vnútri nich zložené zátvorky, skutočnosť, 141 00:07:00,250 --> 00:07:02,440 že mám rovné prihlásiť sa vľavo, to 142 00:07:02,440 --> 00:07:05,500 je v podstate vytvára príkaz, alebo premenná, 143 00:07:05,500 --> 00:07:09,520 nazvaný x a priradením tá žltá časť kódu tam. 144 00:07:09,520 --> 00:07:14,040 To by mohlo byť niečo ako "echo ahoj "alebo" hovoria pípnutie ", alebo tak niečo 145 00:07:14,040 --> 00:07:15,120 podobný tomu. 146 00:07:15,120 --> 00:07:17,780 Všimnime si ale, ak vaše oči ďalej putovať na pravej strane, 147 00:07:17,780 --> 00:07:22,150 tam je viac k tejto čiare, než len koniec tejto bodkočiarkou. 148 00:07:22,150 --> 00:07:25,160 "Echo zraniteľný", a potom Okrem toho je tu ešte viac. 149 00:07:25,160 --> 00:07:26,530 Ďalšie bodkočiarka, bash-c:. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Tak dlhý príbeh krátky, tento riadok kódu je 152 00:07:34,050 --> 00:07:36,660 dostatočná pre presvedčivé Počítač, ktorý je 153 00:07:36,660 --> 00:07:39,830 citlivé na niečo že chcete to robiť, 154 00:07:39,830 --> 00:07:44,290 pretože tam je chyba v Bash, kedy aj keď Bash mal zastaviť 155 00:07:44,290 --> 00:07:48,980 čítanie riadkov príkazu vpravo tam po žltej textu, 156 00:07:48,980 --> 00:07:52,520 na 20 a navyše rok stará chyba, Bash skutočne čítal 157 00:07:52,520 --> 00:07:56,780 po tomto bodkočiarkou a pekná veľa robí to, čo je povedané. 158 00:07:56,780 --> 00:07:59,070 >> Takže to, čo je to dôsledok z toho nakoniec? 159 00:07:59,070 --> 00:08:01,340 Len som povedal, "echo ahoj" alebo "echo zraniteľné," 160 00:08:01,340 --> 00:08:05,449 ale čo keď ste niečo v skutočnosti škodlivý, ako rm -RF * 161 00:08:05,449 --> 00:08:07,240 ktoré ste možno nie kedy napísal skôr, 162 00:08:07,240 --> 00:08:08,920 a úprimne povedané, pravdepodobne nemali príliš skoro, 163 00:08:08,920 --> 00:08:10,700 pretože môžete robiť Mnoho škôd s ním. 164 00:08:10,700 --> 00:08:11,210 Prečo? 165 00:08:11,210 --> 00:08:12,990 rm čo robí, samozrejme? 166 00:08:12,990 --> 00:08:14,270 Odstraňuje. 167 00:08:14,270 --> 00:08:15,930 * Znamená čo? 168 00:08:15,930 --> 00:08:16,430 Všetko. 169 00:08:16,430 --> 00:08:18,180 Takže je to tak-zvané divoká karta, tak to znamená, že 170 00:08:18,180 --> 00:08:20,410 zmazať všetko aktuálny adresár. 171 00:08:20,410 --> 00:08:23,379 r sa deje tak, že znamená rekurzívne, čo znamená, že ak to, čo ste zmazanie 172 00:08:23,379 --> 00:08:26,420 je adresár, a vnútri tam je ďalšie súbory a ďalšie adresáre, 173 00:08:26,420 --> 00:08:28,950 rekurzívne ponoriť do ešte a odstrániť všetko. 174 00:08:28,950 --> 00:08:31,040 A f je najhoršie zo všetkých. 175 00:08:31,040 --> 00:08:32,580 Každý, kto vie, čo f tu znamená? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Force. 178 00:08:34,360 --> 00:08:37,830 Takže nútiť prostriedky, a to aj či je to dobrý nápad, 179 00:08:37,830 --> 00:08:40,939 to bez toho by ma výzva Pre ďalšie potvrdenie. 180 00:08:40,939 --> 00:08:43,230 Takže, viete, my smiať , Ale úprimne povedané, asi by som 181 00:08:43,230 --> 00:08:44,972 Tento typ viackrát deň, pretože skutočnosti 182 00:08:44,972 --> 00:08:47,210 je, že je to najrýchlejší spôsob, ako odstrániť veľa vecí. 183 00:08:47,210 --> 00:08:48,590 Ale aj ja som urobil nejakú škodu. 184 00:08:48,590 --> 00:08:53,100 >> Ale ak ste boli na trik počítač do definovania nejaké stupídne premenné 185 00:08:53,100 --> 00:08:56,810 alebo volanie funkcie x, ale potom podvádzať počítača do realizácie 186 00:08:56,810 --> 00:09:00,030 za hranice, ktoré funkcie nad rámec tohto bodkočiarkou, 187 00:09:00,030 --> 00:09:04,430 môžete naozaj trik počítač k vykonaniu niečo ako rm -RF 188 00:09:04,430 --> 00:09:07,810 alebo príkaz E-mail alebo príkaz Kopírovať. 189 00:09:07,810 --> 00:09:11,400 Čokoľvek doslova môžete robiť s počítač, či už je to mazanie súborov, 190 00:09:11,400 --> 00:09:15,350 vytváranie súborov, spamy niekoho, útočia na nejaké serveri vzdialene, 191 00:09:15,350 --> 00:09:17,190 ak môžete vyjadriť s príkazom, je 192 00:09:17,190 --> 00:09:19,120 môže prinútiť počítač, aby robili to. 193 00:09:19,120 --> 00:09:21,510 >> Teraz, čo je príklad , Ako by to mohlo robiť? 194 00:09:21,510 --> 00:09:24,300 No, je tu veľa počítačov na internet tečúcou Bash. 195 00:09:24,300 --> 00:09:26,390 Všetci používatelia, aby sme Mac sú medzi nimi. 196 00:09:26,390 --> 00:09:30,390 Mnoho linuxových serverov patrí medzi je tiež, a servery Unix. 197 00:09:30,390 --> 00:09:32,630 Windows opäť dostane relatívne vyvesený 198 00:09:32,630 --> 00:09:34,590 Ak ste nainštalovali špeciálny softvér. 199 00:09:34,590 --> 00:09:37,130 Teraz veľa serverov, pre inštancie, spustiť webové servery, 200 00:09:37,130 --> 00:09:39,840 av skutočnosti Linux je možná najobľúbenejší operačný systém 201 00:09:39,840 --> 00:09:43,060 aby mohlo bežať na počítačoch na internete ktoré sa servírujú stránky. 202 00:09:43,060 --> 00:09:44,910 Teraz, ako uvidíme neskôr, v semestri, kedy 203 00:09:44,910 --> 00:09:48,470 odošlite žiadosť Váš browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- na vzdialenom serveri, 205 00:09:50,790 --> 00:09:53,730 Ukazuje sa, že aj keď ste práve zadali www.example.com, 206 00:09:53,730 --> 00:09:59,590 Váš prehliadač odoslanie správy to je trochu tajomný, ako je tento. 207 00:09:59,590 --> 00:10:01,239 >> Ale všimnite si niečo podivného. 208 00:10:01,239 --> 00:10:03,030 Prvé dva riadky Nikdy som nevidel, 209 00:10:03,030 --> 00:10:04,904 ale nevyzerajú obzvlášť ohrozujúce. 210 00:10:04,904 --> 00:10:08,030 Ale všimnite, čo som ukradol na treťom riadku tu. 211 00:10:08,030 --> 00:10:13,390 Ak je zlý človek mal poslať správu takhle zo svojho počítača 212 00:10:13,390 --> 00:10:17,270 na zraniteľné Mac alebo zraniteľný server Linux, 213 00:10:17,270 --> 00:10:21,580 Legrační je, že Bash, že jednoduchý malý príkazový riadok, 214 00:10:21,580 --> 00:10:27,450 je všadeprítomný a je často použitý v podstate vykonať 215 00:10:27,450 --> 00:10:30,020 obsah správu, ktorá sa mu venuje. 216 00:10:30,020 --> 00:10:33,490 A tým, že logika, môžete trik webový server, preto, 217 00:10:33,490 --> 00:10:36,370 zaslaním niečo ako User-Agent, ktorý zvyčajne 218 00:10:36,370 --> 00:10:38,300 má hovoriť názov vášho prehliadača. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, tento 220 00:10:42,420 --> 00:10:44,590 je jednoducho váš prehliadač je spôsob stotožňuje. 221 00:10:44,590 --> 00:10:46,605 Ale keď zloduch veľmi chytro hovorí, mm-mm, ja som 222 00:10:46,605 --> 00:10:47,930 Nie je ti to povedať čo môj prehliadač, 223 00:10:47,930 --> 00:10:50,888 Ja namiesto toho bude ti to poslať mystický vyzerajúce vec s rm -RF 224 00:10:50,888 --> 00:10:55,840 * V nej môžete doslova trik zraniteľné webový server na internete 225 00:10:55,840 --> 00:10:59,055 v prevedení presne, že v tam pre zmazanie všetkých súborov. 226 00:10:59,055 --> 00:11:00,930 A úprimne povedané, to nie je aj to najhoršie. 227 00:11:00,930 --> 00:11:01,763 Môžete robiť čokoľvek. 228 00:11:01,763 --> 00:11:04,480 Dalo by sa začať distribuovanej odmietnutie služby útoku 229 00:11:04,480 --> 00:11:07,030 ak si poslal túto správu celé zväzky webových serverov 230 00:11:07,030 --> 00:11:10,256 a potom nechal všetky zostúpiť, pre inštancie na serveroch Harvard.edu, 231 00:11:10,256 --> 00:11:12,130 a môžete zoradiť Bang sakra z nich 232 00:11:12,130 --> 00:11:15,490 o prevádzke na sieti, ktorý bol inak vyvolaná týmto zlý chlap. 233 00:11:15,490 --> 00:11:18,760 >> Tak dlhý príbeh krátky, takmer všetci v tejto miestnosti, kto vlastní Mac 234 00:11:18,760 --> 00:11:20,240 Je citlivá na to. 235 00:11:20,240 --> 00:11:24,100 Dobrou správou je, že ak ste beží webový server na vašom notebooku, 236 00:11:24,100 --> 00:11:27,780 a ak ste skutočne nakonfigurovaný to, aby niečo také SSH do toho, 237 00:11:27,780 --> 00:11:28,670 ste naozaj v bezpečí. 238 00:11:28,670 --> 00:11:31,710 To je zraniteľný, ale nie je kto sa snaží dostať do vášho notebooku, 239 00:11:31,710 --> 00:11:33,290 takže môžete trochu istí. 240 00:11:33,290 --> 00:11:36,210 Avšak, Apple čoskoro bude aktualizovať opravu to. 241 00:11:36,210 --> 00:11:39,660 Svet Linuxu už vydala počet opráv pre Fedora a Ubuntu 242 00:11:39,660 --> 00:11:43,790 a ďalšie verzie Linux, a naozaj Ak spustíte aktualizáciu 50 v zariadení, 243 00:11:43,790 --> 00:11:45,930 dokonca, že taky bude aktualizovaná a opravená. 244 00:11:45,930 --> 00:11:47,764 Že ale príliš nemá naozaj bol zraniteľný, 245 00:11:47,764 --> 00:11:49,804 pretože ak ste pohrali sa so spotrebičom 246 00:11:49,804 --> 00:11:52,770 a robil váš notebook verejne dostupné na internete, čo nie je 247 00:11:52,770 --> 00:11:54,910 V predvolenom nastavení, vy ste v skutočnosti bolo v poriadku, pretože 248 00:11:54,910 --> 00:11:56,890 z firewall a ďalších techník. 249 00:11:56,890 --> 00:12:01,000 >> Ale je to extrémny príklad chyby že sme žili za doslova 20 250 00:12:01,000 --> 00:12:04,050 rokov, a kto vie, či sa niekto Celú tú dobu sa vie o tom? 251 00:12:04,050 --> 00:12:06,300 A v skutočnosti, to je jeden z základné problémy 252 00:12:06,300 --> 00:12:08,690 že uvidíme neskôr semester o bezpečnosť, 253 00:12:08,690 --> 00:12:13,020 je to, že rovnako ako v reálnom svete, dobrí sú v nevýhode. 254 00:12:13,020 --> 00:12:16,500 Ak chcete zachovať zbabelcami von, musíme Uistite sa, že všetky dvere sú zamknuté, 255 00:12:16,500 --> 00:12:20,340 že každé okno je bezpečný, že každý bod vstupu do domu 256 00:12:20,340 --> 00:12:21,980 je bezpečný, aby zbabelcami von. 257 00:12:21,980 --> 00:12:26,870 Ale to, čo robí zlý človek musí to skutočne ohroziť váš domov 258 00:12:26,870 --> 00:12:28,200 a kradnúť od vás? 259 00:12:28,200 --> 00:12:32,574 On alebo ona jednoducho musí nájsť ten, odomknutý dvere, jeden rozbité okno, alebo tak niečo 260 00:12:32,574 --> 00:12:35,240 v tomto smere, a to je To isté sa v oblasti počítačovej bezpečnosti. 261 00:12:35,240 --> 00:12:37,660 Môžeme písať milióny riadky programového kódu 262 00:12:37,660 --> 00:12:40,570 a utrácať stovky alebo tisíce hodín, sa snaží, aby si to v poriadku, 263 00:12:40,570 --> 00:12:43,370 ale ak urobíte len jeden chyba v správnosti, 264 00:12:43,370 --> 00:12:47,030 si môžete dať celý systém a skutočne v tomto prípade celý internet 265 00:12:47,030 --> 00:12:48,660 a svet v ohrození. 266 00:12:48,660 --> 00:12:51,950 >> Takže ak by ste sa chceli dozvedieť viac o tom, prejdite na nasledujúcu adresu tu. 267 00:12:51,950 --> 00:12:54,450 Netreba akcii dnes večer, ak ste 268 00:12:54,450 --> 00:12:57,116 medzi tie pokojnejšie, že Boli beží vlastný web 269 00:12:57,116 --> 00:12:59,810 servera, v tom prípade by ste mali, v skutočnosti, aktualizovať softvér. 270 00:12:59,810 --> 00:13:03,244 >> Aj to je názov reč, a teraz papier, 271 00:13:03,244 --> 00:13:05,410 že sme zviazaná Webové stránky ihrisko je pre dnešok všetko. 272 00:13:05,410 --> 00:13:07,600 Bolo by kolegami menoval Ken Thompson, ktorý 273 00:13:07,600 --> 00:13:10,120 bolo prijatie veľmi slávny Ocenenie vo vede o počítačoch, 274 00:13:10,120 --> 00:13:13,495 a dal túto reč o niekoľko rokov Pred podstate na rovnakú tému. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Žiadať ľudí otázka, mali by ste naozaj 277 00:13:20,520 --> 00:13:23,480 dôvera, nakoniec, Softvér, ktorý ste dostali? 278 00:13:23,480 --> 00:13:26,100 Napríklad, my všetci máme bolo písanie programov, 279 00:13:26,100 --> 00:13:27,820 a my sme boli zostavovaní je s Clang. 280 00:13:27,820 --> 00:13:31,830 A svoje vedomosti, ste napísal všetky programy pre CS50 tam, kde je 281 00:13:31,830 --> 00:13:35,310 zadné dvere druhov, existuje spôsob, ako že zloduch, pokiaľ beží program, 282 00:13:35,310 --> 00:13:37,410 mohol prevziať vašom počítači? 283 00:13:37,410 --> 00:13:38,310 Asi nie, že jo? 284 00:13:38,310 --> 00:13:40,180 Mario a Greedy a Credit. 285 00:13:40,180 --> 00:13:41,680 To všetko sú celkom malé programy. 286 00:13:41,680 --> 00:13:43,910 Musel by ste byť dosť zlé, ak ste skutočne 287 00:13:43,910 --> 00:13:47,310 robil celý počítač zraniteľný po napísaní 10 alebo 20 riadkov kódu, 288 00:13:47,310 --> 00:13:49,690 alebo aspoň vedomí niektorých bezpečnostných dôsledkov. 289 00:13:49,690 --> 00:13:52,023 Teraz hovorím, že bodro, ale budeme vidieť dnes 290 00:13:52,023 --> 00:13:54,600 a tento týždeň je to vlastne naozaj, ale naozaj ľahké 291 00:13:54,600 --> 00:13:57,980 byť zlý, a aby ešte krátke programy zraniteľné. 292 00:13:57,980 --> 00:14:02,880 >> Ale teraz, aspoň si uvedomiť, že táto otázka je sem pozval 293 00:14:02,880 --> 00:14:04,850 je o Clang v kompilátora. 294 00:14:04,850 --> 00:14:08,360 Prečo sme sa veriť zvonenie za posledné dva alebo tri týždne? 295 00:14:08,360 --> 00:14:12,650 Kto môže povedať, že ten, kto písal zvonenie nemal "keby" podmienku, že 296 00:14:12,650 --> 00:14:17,680 že v podstate injekčne nejaké nuly a tie do každého programu, zostavuje 297 00:14:17,680 --> 00:14:21,180 že by ho nechal, alebo jej prístup počítač, keď si spal 298 00:14:21,180 --> 00:14:23,580 a vaša veko notebooku je otvorená a počítač so systémom? 299 00:14:23,580 --> 00:14:24,080 Je to tak? 300 00:14:24,080 --> 00:14:28,350 Máme tento druh česť systéme práva Teraz, ak veríme, že Clang je dôveryhodne. 301 00:14:28,350 --> 00:14:30,000 Veríte, že spotrebič je dôveryhodne. 302 00:14:30,000 --> 00:14:34,430 Veríte, že doslova každý program, na počítači Mac alebo PC je dôveryhodný. 303 00:14:34,430 --> 00:14:37,510 A ako tento jednoduchý chyba naznačuje, aj keď to nie je škodlivý, 304 00:14:37,510 --> 00:14:40,580 to rozhodne nie je pravdepodobné, že tomu tak je. 305 00:14:40,580 --> 00:14:42,350 >> Takže by ste mali báť ako čert. 306 00:14:42,350 --> 00:14:45,560 Úprimne povedané, nie je jednoduché Roztok sa tento druhý 307 00:14:45,560 --> 00:14:48,185 ako akési spoločenské povedomie z rastúcej zložitosti 308 00:14:48,185 --> 00:14:50,310 že staviame na vrchole našich počítačových systémov, 309 00:14:50,310 --> 00:14:53,740 a ako sa stále viac zraniteľnejšie by sme mohli byť celkom dobre. 310 00:14:53,740 --> 00:14:55,570 >> Teraz sa, že povedal, Breakout. 311 00:14:55,570 --> 00:14:59,889 Takže Breakout je problém nastaviť tri a Breakout je hra z dávnych dôb 312 00:14:59,889 --> 00:15:02,180 ktoré by vás mohli vyvolať, ale pre nás problém nastaviť tri, 313 00:15:02,180 --> 00:15:04,450 to nám umožňuje, aby sa veci späť do zárezu 314 00:15:04,450 --> 00:15:08,880 tak, že keď píšeme programy, aj v terminálovom okne, ako je tento, 315 00:15:08,880 --> 00:15:14,670 môžeme skutočne spustiť, nakoniec, grafické programy nie 316 00:15:14,670 --> 00:15:17,800 Na rozdiel od tých, ktoré sme mali prístup v Scratch. 317 00:15:17,800 --> 00:15:20,910 Tak toto je na zamestnanca je realizácia Breakout, 318 00:15:20,910 --> 00:15:23,930 čo je práve táto tehla-lámanie hra, že sa pohybujete pádlo späť 319 00:15:23,930 --> 00:15:27,590 a tam, a odpálil loptičku pred tými farebnými tehlami až hore. 320 00:15:27,590 --> 00:15:30,020 Takže to je, že nás trochu späť tam, kde 321 00:15:30,020 --> 00:15:33,180 sme boli schopní sa veľmi rýchlo Scratch, a teraz s C, 322 00:15:33,180 --> 00:15:35,800 , Ktorým sa vykonáva vlastné grafické používateľské rozhranie. 323 00:15:35,800 --> 00:15:38,960 >> Ale viac než to, že tento Problém set predstavuje prvý 324 00:15:38,960 --> 00:15:41,000 v ktorej dávame Ste banda kódu. 325 00:15:41,000 --> 00:15:43,940 A v skutočnosti, ja uvediem explicitné pozornosť na to, pretože najmä 326 00:15:43,940 --> 00:15:47,090 Pre tých menej príjemné, to problém nastaviť, aspoň na prvý pohľad, 327 00:15:47,090 --> 00:15:49,170 sa bude cítiť ako urobili sme ju do zárezu. 328 00:15:49,170 --> 00:15:51,540 Vzhľadom k tomu, že sme vám dal, Pre niektoré z hľadania 329 00:15:51,540 --> 00:15:54,930 a triedenie problémy v pset, banda kódu, ktorý sme napísali, 330 00:15:54,930 --> 00:15:56,680 a pár komentárov ktoré hovoria "robiť," 331 00:15:56,680 --> 00:15:58,221 kde budete musieť vyplniť prázdne miesta. 332 00:15:58,221 --> 00:16:00,020 Takže nie príliš desivé, ale je to prvýkrát, 333 00:16:00,020 --> 00:16:03,370 sme podal vám kód, ktorý je potrebné najprv prečítať, pochopiť a potom sa pridajú do 334 00:16:03,370 --> 00:16:04,290 a dokončiť ju. 335 00:16:04,290 --> 00:16:05,940 >> A potom Breakout, budeme robiť to isté, 336 00:16:05,940 --> 00:16:08,740 ktorá vám niekoľko desiatok viac liniek kódu, ktorý, úprimne povedané, aby vám 337 00:16:08,740 --> 00:16:11,490 veľa rámca pre hra, ale zastaviť pred 338 00:16:11,490 --> 00:16:14,304 vykonávacích tehly a loptu a pádlo, 339 00:16:14,304 --> 00:16:15,970 ale my realizovať niektoré ďalšie funkcie. 340 00:16:15,970 --> 00:16:18,280 A dokonca, že na prvý pohľad, znovu, najmä v prípade menej pohodlné, 341 00:16:18,280 --> 00:16:21,480 Mohlo by sa zdať obzvlášť skľučujúca a si myslíte, že je tak veľa nových funkcií 342 00:16:21,480 --> 00:16:24,070 budete musieť zabaliť svoju myseľ okolo, a je to pravda. 343 00:16:24,070 --> 00:16:26,281 Ale majte na pamäti, že je to celkom ako Scratch. 344 00:16:26,281 --> 00:16:28,780 Kurz ste nepoužili všetky že kúsky skladačky na začiatku. 345 00:16:28,780 --> 00:16:31,120 Kurz ste sa nestaral zabaliť vaša myseľ asi všetci 346 00:16:31,120 --> 00:16:33,617 pretože všetko, čo sa to Letmý pohľad pochopiť, oh, 347 00:16:33,617 --> 00:16:35,450 že to, čo sa dá robiť s týmto kúsok puzzle. 348 00:16:35,450 --> 00:16:38,260 A skutočne, v probléme nastavenie 3 spec, budeme bod, 349 00:16:38,260 --> 00:16:41,370 v dokumentácii, ktorá bude Predstavujeme Vám niektorých nových funkcií, 350 00:16:41,370 --> 00:16:43,570 a nakoniec programovanie konštruuje, ktorý používate. 351 00:16:43,570 --> 00:16:47,610 Podmienky, slučky, premenné a funkcie 352 00:16:47,610 --> 00:16:50,720 bude rovnaká ako to, čo sme videli doteraz. 353 00:16:50,720 --> 00:16:53,560 >> Takže naozaj, čo dáme vám je nejaký ukážkový kód, ktorý 354 00:16:53,560 --> 00:16:56,110 vám umožní vytvoriť okno ktorý vyzerá nie na rozdiel od toho 355 00:16:56,110 --> 00:16:59,540 a nakoniec premeniť ju na niečo také, ako toto. 356 00:16:59,540 --> 00:17:02,250 Takže využiť CS50, diskutovať úradné hodiny a viac, 357 00:17:02,250 --> 00:17:05,290 a útechu v tom, že množstvo kódu musíte napísať 358 00:17:05,290 --> 00:17:06,760 v skutočnosti nie je tak moc. 359 00:17:06,760 --> 00:17:10,359 Prvou úlohou je len aklimatizovať sami nejaký kód sme napísali. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Akékoľvek otázky týkajúce sa pset3, Shellshock, alebo inak? 362 00:17:15,810 --> 00:17:19,226 >> Divákov: Zdalo sa, že prechádza s Breakout 363 00:17:19,226 --> 00:17:22,154 že kód je takmer objektovo-orientovaný štýl, 364 00:17:22,154 --> 00:17:24,675 ale myslím, že C je objektovo-orientovaný program. 365 00:17:24,675 --> 00:17:26,050 SPEAKER 1: výborná otázka. 366 00:17:26,050 --> 00:17:28,258 Takže pri pohľade cez distribúcia kód, kód 367 00:17:28,258 --> 00:17:30,180 sme napísali pre pset3, Pre tých, ktorí poznajú, ho 368 00:17:30,180 --> 00:17:32,230 Vyzerá to, že je to trochu objektovo-orientovaný. 369 00:17:32,230 --> 00:17:33,800 Stručná odpoveď je, že to je. 370 00:17:33,800 --> 00:17:38,130 Je to priblíženie na to, ako mohli robiť objektovo-orientovaný kód pomocou 371 00:17:38,130 --> 00:17:41,850 jazyk C, ale to je ešte nakoniec procedurálne. 372 00:17:41,850 --> 00:17:44,900 Tam sú umiestnené vo vnútri žiadne metódy premenné, ako uvidíte. 373 00:17:44,900 --> 00:17:46,180 Ale pripomína to. 374 00:17:46,180 --> 00:17:48,780 A uvidíme, túto funkciu znovu až sa dostaneme do PHP a JavaScript 375 00:17:48,780 --> 00:17:49,946 ku koncu semestra. 376 00:17:49,946 --> 00:17:53,667 Ale teraz, myslím, že na to, ako náznak toho, čo je príde. 377 00:17:53,667 --> 00:17:54,250 Dobrá otázka. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 V poriadku. 380 00:17:56,550 --> 00:17:59,730 Takže zlúčenie trochu bolo, ako sme sa ľavá veci minule. 381 00:17:59,730 --> 00:18:03,250 A zlúčiť druh bol cool in pocit, že je to tak oveľa rýchlejšie, 382 00:18:03,250 --> 00:18:07,100 aspoň na základe zbežnej testy sme robili minulý týždeň, než, povedzme, bublina 383 00:18:07,100 --> 00:18:08,710 triedenie, výber triedenie, vkladanie sort. 384 00:18:08,710 --> 00:18:11,780 A to, čo bolo pekné i len ako stručne a čisto 385 00:18:11,780 --> 00:18:12,810 môžete vyjadriť. 386 00:18:12,810 --> 00:18:15,840 A to, čo sme si povedali, že je to horná viazaný na bežiaci čas zlúčenie 387 00:18:15,840 --> 00:18:16,340 triediť? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Jo? 390 00:18:18,495 --> 00:18:19,360 >> Divákov: n log n? 391 00:18:19,360 --> 00:18:20,819 >> SPEAKER 1: n log n, vpravo. n log n. 392 00:18:20,819 --> 00:18:23,776 A vrátime sa k tomu, čo to v skutočnosti znamená, alebo kde to pochádza, 393 00:18:23,776 --> 00:18:25,570 ale toto bolo lepšie než akej doby chodu 394 00:18:25,570 --> 00:18:28,440 ktoré sme videli na bubliny Výber a vkladanie triediť? 395 00:18:28,440 --> 00:18:30,610 Tak n na druhú. n na druhú je väčšie ako to, 396 00:18:30,610 --> 00:18:34,650 A aj keď to nie je úplne zrejmé, viem, že log n je menšie ako n, 397 00:18:34,650 --> 00:18:36,910 takže ak to n-krát niečo menšie ako n, 398 00:18:36,910 --> 00:18:38,680 že to bude menšie ako n na druhú. 399 00:18:38,680 --> 00:18:40,130 Je to trochu intuície tam. 400 00:18:40,130 --> 00:18:42,190 Ale my sme zaplatili cenu za to. 401 00:18:42,190 --> 00:18:47,000 Bolo to rýchlejšie, ale téma, ktoré začalo objavovať minulý týždeň bol tento kompromis. 402 00:18:47,000 --> 00:18:49,804 Mám lepší výkon Čas múdry, ale to, čo 403 00:18:49,804 --> 00:18:52,470 som musel stráviť na strane druhej ruky, aby bolo dosiahnuté, že? 404 00:18:52,470 --> 00:18:53,591 >> DIVÁKOV: Memory. 405 00:18:53,591 --> 00:18:54,465 SPEAKER 1: Čože? 406 00:18:54,465 --> 00:18:55,173 DIVÁKOV: Memory. 407 00:18:55,173 --> 00:18:57,040 SPEAKER 1: Pamäte, alebo miesto všeobecne. 408 00:18:57,040 --> 00:18:59,040 A nebolo to výborný zrejmé, s našimi ľuďmi, 409 00:18:59,040 --> 00:19:02,240 ale pripomenúť, že naša dobrovoľníkmi boli vykročil vpred a posilnenie 410 00:19:02,240 --> 00:19:04,780 späť, aj keď tam je pole tu, a ako by to 411 00:19:04,780 --> 00:19:07,130 Druhá pole, ktoré tu by mohli využiť, pretože sme 412 00:19:07,130 --> 00:19:09,080 Potrebné niekde zlúčiť tých ľudí. 413 00:19:09,080 --> 00:19:11,480 Nemohli sme len vymeniť ich na mieste. 414 00:19:11,480 --> 00:19:13,800 Takže zlúčiť triedenie vplyv je priestor, ktorý 415 00:19:13,800 --> 00:19:15,620 nemuseli sme sa ďalšie algoritmy, 416 00:19:15,620 --> 00:19:17,410 ale Výhodou je, že je to oveľa rýchlejšie. 417 00:19:17,410 --> 00:19:20,780 A úprimne povedané, v reálnom svete priestore Tieto days-- RAM, pevný disk space-- 418 00:19:20,780 --> 00:19:25,030 je relatívne lacné, a tak to je nie je nevyhnutne zlá vec. 419 00:19:25,030 --> 00:19:28,320 >> Takže poďme sa rýchlo pozrieť, trochu viac metodicky, na to, čo sme urobili 420 00:19:28,320 --> 00:19:30,220 a prečo povedal, že je n log n. 421 00:19:30,220 --> 00:19:33,260 Tak tu je osem čísel a Osem dobrovoľníkov sme mali minule. 422 00:19:33,260 --> 00:19:35,718 A prvá vec, ktorá Zlúčiť Zoradiť nám povedal, robiť to, čo? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 Divákov: Rozdeliť na dve časti. 425 00:19:38,010 --> 00:19:38,663 SPEAKER 1: Čože? 426 00:19:38,663 --> 00:19:39,650 Divákov: Rozdeliť na dve časti. 427 00:19:39,650 --> 00:19:40,610 SPEAKER 1: Rozdeľte na dve časti, vpravo. 428 00:19:40,610 --> 00:19:42,818 To je veľmi pripomína telefónny zoznam, rozdeľ 429 00:19:42,818 --> 00:19:44,220 a dobyť všeobecnejšie. 430 00:19:44,220 --> 00:19:45,640 Takže sme sa pozreli na ľavej polovici. 431 00:19:45,640 --> 00:19:48,700 A potom raz sme si povedali, triedenie ľavá polovica z prvkov, 432 00:19:48,700 --> 00:19:49,690 čo sme ďalšie povedať? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Zoradiť ľavú polovicu vľavo polovica, ktorá nám umožnila, 435 00:19:54,860 --> 00:19:57,570 Po rozdelení na dve časti, zamerať sa na štyri a dve. 436 00:19:57,570 --> 00:20:01,280 >> Ako zoradiť zoznam teraz, žltá, veľkosti dvoch, pomocou Merge Sort? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 No rozdeliť ho na polovicu, a zoradiť ľavú polovicu. 439 00:20:04,580 --> 00:20:07,100 A to bolo miesto, kde sa veci mám trochu hlúpy krátko. 440 00:20:07,100 --> 00:20:10,720 Ako zoradiť zoznam, ktorý je z veľkosť jedného, ​​ako tu toto číslo štyri? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Je radené. 443 00:20:13,210 --> 00:20:14,200 Máte hotovo. 444 00:20:14,200 --> 00:20:17,300 >> Ale ako si zoradiť zoznam Veľkosť jedného, ​​keď je to číslo dva? 445 00:20:17,300 --> 00:20:21,640 No, to isté, ale teraz to, čo bolo Tretím a kľúčovým krokom pri zlúčení Zoradiť? 446 00:20:21,640 --> 00:20:24,020 Vy ste mali zlúčiť ľavej polovica a pravú polovicu. 447 00:20:24,020 --> 00:20:26,580 A akonáhle sme urobili, že sme sa zamerali vo štyri sme sa zamerali na dve. 448 00:20:26,580 --> 00:20:28,750 Rozhodli sme sa v poriadku, zrejme dva je na prvom mieste, 449 00:20:28,750 --> 00:20:31,840 tak sme dali dva vo svojej miesto, nasleduje štyri. 450 00:20:31,840 --> 00:20:35,010 A teraz ste si na trochu vzad, a to je druh charakteristiky 451 00:20:35,010 --> 00:20:37,570 algoritmu, ako je korešpondencia Triediť vzad v pamäti. 452 00:20:37,570 --> 00:20:40,240 Aký bol ďalší línie príbehu? 453 00:20:40,240 --> 00:20:41,780 Čo by som mal zamerať na ďalšie? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Pravá polovica vľavo polovica, čo je šesť a osem. 456 00:20:47,350 --> 00:20:50,320 >> Takže len krok cez to bez hašteriť bod príliš veľa. 457 00:20:50,320 --> 00:20:53,330 Šesť a osem, potom šesť je radené, osem je triedený. 458 00:20:53,330 --> 00:20:57,190 Spojiť ich dohromady, ako to, a teraz ďalší veľký krok 459 00:20:57,190 --> 00:21:00,990 Je, samozrejme, triediť pravú polovicu z Prvý krok tohto algoritmu. 460 00:21:00,990 --> 00:21:02,870 Tak sme sa zamerať na jeden, tri, sedem, päť. 461 00:21:02,870 --> 00:21:04,540 Ďalej sa zameriavame na ľavej polovici. 462 00:21:04,540 --> 00:21:09,400 Ľavá polovica, že pravá polovica že, a potom zlúčiť do jednej a tri. 463 00:21:09,400 --> 00:21:13,100 Potom pravú polovicu, potom ľavej polovici nej, potom pravá polovica z nich. 464 00:21:13,100 --> 00:21:15,985 Zlúčiť ju, a čo teraz krok zostáva? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Zlúčiť veľký ľavej polovice a veľké pravá polovica, takže sa ide tam, 467 00:21:22,460 --> 00:21:27,330 potom dve, potom tri, potom štyri, potom päť, šesť a potom, potom sedem, potom osem. 468 00:21:27,330 --> 00:21:31,990 >> Takže teraz, prečo sa to nakoniec odhalí, najmä v prípade, n a logaritmy viac 469 00:21:31,990 --> 00:21:35,487 všeobecne skôr útek vás, aspoň v nedávnej pamäti? 470 00:21:35,487 --> 00:21:37,070 Dobre si všimnite, výška tejto veci. 471 00:21:37,070 --> 00:21:41,230 Mali sme osem prvkov, a my sme delí ju dvoma, dvoma, dvoma. 472 00:21:41,230 --> 00:21:44,590 Takže log základňu dvaja z ôsmich nám dáva tri. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 A ver mi, že ak na trochu hmlisté na to. 475 00:21:48,540 --> 00:21:54,710 Ale prihlásiť základ dvoch z ôsmich sú tri, tak sme urobili tri vrstvy zlúčenie. 476 00:21:54,710 --> 00:21:57,170 A keď sme zlúčili prvky, koľko elementov 477 00:21:57,170 --> 00:21:58,950 sa pozrieme na na každom z týchto riadkov? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Celkovo n, nie? 480 00:22:01,437 --> 00:22:04,020 Vzhľadom k tomu, zlúčiť horný riadok, aj keď sme to po častiach, 481 00:22:04,020 --> 00:22:05,990 nakoniec sme kedysi dotkol každé číslo. 482 00:22:05,990 --> 00:22:09,054 A v druhom rade, k zlúčenie týchto zoznamov veľkosti dvoch, 483 00:22:09,054 --> 00:22:10,470 sme museli raz dotknúť každého prvku. 484 00:22:10,470 --> 00:22:12,690 A potom tu naozaj jasne v poslednom rade, 485 00:22:12,690 --> 00:22:15,430 sme sa museli dotknúť každého z nich Prvky raz, ale len raz, 486 00:22:15,430 --> 00:22:18,400 tak tu leží, potom sa naša n log n. 487 00:22:18,400 --> 00:22:21,780 >> A teraz len aby sa veci trochu viac formálne len na chvíľu, ak máte 488 00:22:21,780 --> 00:22:24,260 bolo teraz analyzovať toto na akejsi vyššej úrovni 489 00:22:24,260 --> 00:22:28,340 a pokúsiť sa rozhodnúť dobre, ako môže ísť o vyjadrenie 490 00:22:28,340 --> 00:22:31,780 doba chodu tohto algoritmu len pri pohľade na neho, a nie 491 00:22:31,780 --> 00:22:33,590 pomocou sprisahanecké príklad? 492 00:22:33,590 --> 00:22:36,590 No, koľko času by ste povedali krok ako je to v žltej bude trvať, 493 00:22:36,590 --> 00:22:37,173 ak n <2 návrat? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 To je veľký O čo? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Takže som videl jedného, ​​tak jeden krok, možno dva kroky, pretože je to v prípade, 498 00:22:44,540 --> 00:22:47,110 a potom sa vrátiť, ale je to časová konštanta, nie? 499 00:22:47,110 --> 00:22:49,960 Tak sme si povedali, O (1), a to ako som si to vyjadriť. 500 00:22:49,960 --> 00:22:51,480 T, len sa beh času. 501 00:22:51,480 --> 00:22:54,150 n je veľkosť vstupu, tak T (n), len ozdobný spôsob, ako 502 00:22:54,150 --> 00:22:56,330 hovoriť beh čas vzhľadom vstup veľkosti n 503 00:22:56,330 --> 00:23:00,220 bude na objednávke o konštantnom čase, v O (1). 504 00:23:00,220 --> 00:23:01,970 >> Ale inak, čo toto? 505 00:23:01,970 --> 00:23:05,660 Ako by ste vyjadriť doba chodu tohto žltou čiarou? 506 00:23:05,660 --> 00:23:06,250 T, čo? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Môžete trochu podvádzať tú a odpovedz na moju otázku cyklicky. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Takže v prípade, že čas beží v Všeobecne len povedať, je T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 A teraz trochu plaviť sem hovoril, no, proste tak nejako ľavú polovicu, 513 00:23:22,490 --> 00:23:23,920 a potom triediť pravú polovicu. 514 00:23:23,920 --> 00:23:27,520 Ako môžeme symbolicky reprezentovať doba chodu tohto žltou čiarou? 515 00:23:27,520 --> 00:23:28,020 T, čo? 516 00:23:28,020 --> 00:23:29,360 Aká je veľkosť vstupu? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n po dvoch. 519 00:23:31,057 --> 00:23:32,140 Prečo som len povedať, že? 520 00:23:32,140 --> 00:23:36,449 A potom je ďalší T (n / 2) a potom znova, keď som zlúčiť dva zotriedené polovice, 521 00:23:36,449 --> 00:23:38,615 koľko prvkov idem musieť dotknúť všetkých? 522 00:23:38,615 --> 00:23:39,780 523 00:23:39,780 --> 00:23:40,320 n. 524 00:23:40,320 --> 00:23:42,790 Takže môžem vyjadriť to, len aby sa trochu fantázie, 525 00:23:42,790 --> 00:23:44,430 ako čas beží všeobecne. 526 00:23:44,430 --> 00:23:51,140 T (n) je práve bežiaci čas T (n / 2), Plus T (n / 2), vľavo polovica a pravú polovicu, 527 00:23:51,140 --> 00:23:55,360 Plus O (n), čo je pravdepodobne n krokov, ale možno, keď som pomocou dvoch prstov, 528 00:23:55,360 --> 00:23:57,960 to je dvakrát toľko kroky, ale je to lineárna. 529 00:23:57,960 --> 00:24:00,440 Je to nejaký počet krokov To je faktor n, 530 00:24:00,440 --> 00:24:02,270 tak by sme mohli vyjadriť to, pretože to. 531 00:24:02,270 --> 00:24:05,550 A to je miesto, kde sa budeme plaviť na späť na našej strednej školy z matematiky učebnicu 532 00:24:05,550 --> 00:24:10,290 sme, že opakovanie nakoniec skončí rovná to, n krát logn, 533 00:24:10,290 --> 00:24:12,530 ak ste skutočne urobiť z matematika viac formálne. 534 00:24:12,530 --> 00:24:13,950 >> Tak to je len dva pohľady. 535 00:24:13,950 --> 00:24:17,500 Jeden s číselne pevne reprezentatívneho príkladu 536 00:24:17,500 --> 00:24:21,140 pomocou ôsmich čísel a ďalšie Všeobecne pohľad na to, ako sme sa tam dostali. 537 00:24:21,140 --> 00:24:25,670 Ale čo je naozaj zaujímavé, je opäť tento pojem cyklistiky. 538 00:24:25,670 --> 00:24:26,900 Nejsem použitím slučiek. 539 00:24:26,900 --> 00:24:29,860 Som trochu definovanie niečo v zmysle sama o sebe, 540 00:24:29,860 --> 00:24:31,950 nielen s týmto matematické funkcie, 541 00:24:31,950 --> 00:24:34,860 ale aj z hľadiska tohto pseudokódu. 542 00:24:34,860 --> 00:24:38,260 Tento kód pseudo rekurzívne v tom, že dva zo svojich línií 543 00:24:38,260 --> 00:24:42,310 je v podstate hovorí to go používajú sa k riešeniu menšie 544 00:24:42,310 --> 00:24:45,400 Problém menšej veľkosti, a potom znova a znova 545 00:24:45,400 --> 00:24:48,820 a znovu, kým sa nám to orezávať až do tejto takzvanej referenčnej prípad. 546 00:24:48,820 --> 00:24:52,810 >> Takže poďme sa vlastne nakresliť presvedčivejšia sa-od to takto. 547 00:24:52,810 --> 00:24:58,420 Nechaj ma ísť do gedit a vziať pozrite sa na niektoré z dnešného zdrojového kódu, 548 00:24:58,420 --> 00:24:59,930 najmä tento príklad tu. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, ktorý zrejme dodáva čísla jedna až n. 550 00:25:03,709 --> 00:25:05,750 Takže poďme sa pozrieť, čo ich poznajú a neznáme tu. 551 00:25:05,750 --> 00:25:08,690 Najprv musíme pár patrí, takže nič nové tam. 552 00:25:08,690 --> 00:25:09,190 Prototype. 553 00:25:09,190 --> 00:25:11,370 Som trochu zahmlený na to po niekoľkých dňoch, 554 00:25:11,370 --> 00:25:13,790 ale to, čo sme si povedali Prototyp funkcie je? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 Divákov: [nepočuteľné]. 557 00:25:16,015 --> 00:25:16,905 SPEAKER 1: Čo je to? 558 00:25:16,905 --> 00:25:17,800 Divákov: Oznamujeme to. 559 00:25:17,800 --> 00:25:18,883 SPEAKER 1: Oznamujeme to. 560 00:25:18,883 --> 00:25:22,290 Takže ste sa učil zvonenie, hej, nie je v skutočnosti vykonávaniu tohto doteraz, 561 00:25:22,290 --> 00:25:25,740 ale niekde v tomto súbore, pravdepodobne, sa bude funkcia volaná, čo? 562 00:25:25,740 --> 00:25:26,930 563 00:25:26,930 --> 00:25:27,540 Sigma. 564 00:25:27,540 --> 00:25:30,540 A to je len sľub, že bude to vyzerať takto. 565 00:25:30,540 --> 00:25:33,720 Bude to trvať celé číslo ako input-- a môžem byť konkrétnejší 566 00:25:33,720 --> 00:25:36,570 a hovoria, int n --a, že je to chystá vrátiť int, 567 00:25:36,570 --> 00:25:39,900 ale bodkočiarka znamená, mm, budem obísť na vykonávanie tohto o niečo neskôr. 568 00:25:39,900 --> 00:25:40,989 Opäť platí, že Clang je hlúpy. 569 00:25:40,989 --> 00:25:43,280 Je to len bude vedieť, čo poviete, že zhora nadol, 570 00:25:43,280 --> 00:25:45,765 takže musíme dať aspoň je to náznak toho, čo je príde. 571 00:25:45,765 --> 00:25:47,330 >> Teraz sa pozrime na hlavné tu. 572 00:25:47,330 --> 00:25:50,040 Poďme sa prechádzať sem a vidieť, čo hlavné robí. 573 00:25:50,040 --> 00:25:53,780 Nie je to tak dlho, funkcie, a v skutočnosti tu konštrukt je oboznámený. 574 00:25:53,780 --> 00:25:57,590 Prehlasujem, premenné n, a potom Znovu a znovu som sa obťažovať užívateľa 575 00:25:57,590 --> 00:26:01,880 pre kladné celé číslo pomocou vezmi_int, a jediný výstup z tejto slučky 576 00:26:01,880 --> 00:26:03,280 Akonáhle užívateľ splnil. 577 00:26:03,280 --> 00:26:05,670 Robiť, keď sme použili na obťažovať užívateľa v tomto zmysle. 578 00:26:05,670 --> 00:26:06,670 Teraz je to zaujímavé. 579 00:26:06,670 --> 00:26:08,510 Prehlasujem, int s názvom "odpoveď". 580 00:26:08,510 --> 00:26:11,420 Aj priradiť je návratová hodnota o funkciu nazvanú "sigma". 581 00:26:11,420 --> 00:26:15,200 Ja neviem, čo to ešte robí, ale Spomínam si, deklarovať ju pred chvíľou. 582 00:26:15,200 --> 00:26:18,310 A potom som okolo v hodnota, ktorú užívateľ zadal, n, 583 00:26:18,310 --> 00:26:20,420 a potom som nahlásiť odpoveď. 584 00:26:20,420 --> 00:26:22,260 No poďme sa posunúť späť len na chvíľu. 585 00:26:22,260 --> 00:26:28,620 Poďme ďalej do tohto adresára, aby sigma 0, a v skutočnosti spustiť tento program 586 00:26:28,620 --> 00:26:30,490 a uvidíme, čo sa stane. 587 00:26:30,490 --> 00:26:35,930 Takže keď som sa do toho pustite a beh tento program, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 som sa a zadajte pozitívny číslo ako dve, Sigma, 589 00:26:40,139 --> 00:26:43,180 ako grécky symbol znamená, je len chystá sčítať všetky čísla od 590 00:26:43,180 --> 00:26:44,320 nulu až na dva. 591 00:26:44,320 --> 00:26:46,560 Takže 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 Tak by to malo snáď mi dať 3. 593 00:26:48,830 --> 00:26:49,750 To je všetko, čo robí. 594 00:26:49,750 --> 00:26:52,690 A podobne, keď som spustiť tento znova a dám mu číslo tri, 595 00:26:52,690 --> 00:26:56,721 to je 3 plus 2, tak to je 5 plus 1 by mi šesť. 596 00:26:56,721 --> 00:26:59,470 A potom keď som naozaj blázon a začnite písať vo väčších počtoch, 597 00:26:59,470 --> 00:27:01,290 to by mi väčšie a väčšie sumy. 598 00:27:01,290 --> 00:27:02,250 Takže to je všetko. 599 00:27:02,250 --> 00:27:04,010 >> Tak co sigma vyzerá? 600 00:27:04,010 --> 00:27:05,430 No, je to celkom jednoduché. 601 00:27:05,430 --> 00:27:08,940 To je, ako sme mohli realizovať to za posledných pár týždňov. 602 00:27:08,940 --> 00:27:11,120 "Int" bude návratový typ. 603 00:27:11,120 --> 00:27:14,330 Sigma je názov, a to trvá Premenná m namiesto n. 604 00:27:14,330 --> 00:27:15,940 Zmením to až hore. 605 00:27:15,940 --> 00:27:17,340 Potom je to len kontrola zdravý rozum. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Uvidíme, prečo za chvíľu. 608 00:27:19,950 --> 00:27:24,220 Teraz Prehlasujem ďalšie premenné, suma, inicializovať na nulu. 609 00:27:24,220 --> 00:27:28,140 Potom som to pre sláčiky iterácie, zrejme pre prehľadnosť, 610 00:27:28,140 --> 00:27:33,810 od i = 1 až na an = m, čo je čo užívateľ zadal, a potom som 611 00:27:33,810 --> 00:27:35,690 zvýšiť sumu, ako je tento. 612 00:27:35,690 --> 00:27:37,360 A potom sa vrátiť čiastku. 613 00:27:37,360 --> 00:27:38,440 >> Takže pár otázok. 614 00:27:38,440 --> 00:27:42,370 Raz som nárok na môj komentár, že tento zabraňuje riziku nekonečnej slučke. 615 00:27:42,370 --> 00:27:45,620 Prečo by odovzdaním záporného čísla vyvolať potenciálne nekonečnú slučku? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> Divákov: Nikdy dosiahnuť metrov. 618 00:27:51,290 --> 00:27:52,880 >> SPEAKER 1: Nikdy nesiahajte m. 619 00:27:52,880 --> 00:27:55,880 Ale m je odovzdaný, takže poďme zvážiť jednoduchý príklad. 620 00:27:55,880 --> 00:27:58,510 Ak m je odovzdaný do užívateľ ako negatívneho. 621 00:27:58,510 --> 00:28:00,059 Bez ohľadu na to hlavné. 622 00:28:00,059 --> 00:28:01,850 Hlavné nás chráni pred to taky, takže som len 623 00:28:01,850 --> 00:28:04,680 je naozaj anal s sigma sa tiež uistiť, 624 00:28:04,680 --> 00:28:06,540 že vstup nemôže byť záporná. 625 00:28:06,540 --> 00:28:10,130 Takže, ak m je záporný, niečo negatívne. 626 00:28:10,130 --> 00:28:11,930 Čo sa bude diať? 627 00:28:11,930 --> 00:28:14,390 No, ja sa chystá inicializáciu jedného, 628 00:28:14,390 --> 00:28:19,060 a potom aj bude menej ako alebo rovné m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Stand by. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 To byl-- poďme nie, poďme nix tento príbeh. 633 00:28:29,370 --> 00:28:32,780 Nepýtal som sa na túto otázku, pretože riziko, že som sa zmieňovať o 634 00:28:32,780 --> 00:28:38,360 sa to nestane, pretože aj je vždy bude mať väčší than-- OK, 635 00:28:38,360 --> 00:28:39,871 Aj odvolať na túto otázku. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Poďme sa zamerať len na túto časť tu. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Prečo ste Prehlasujem, niektoré mimo slučky? 640 00:28:48,830 --> 00:28:52,010 Oznámenie o linke 49 som vyhlásil aj vnútri slučky, 641 00:28:52,010 --> 00:28:54,950 ale on-line 48 som vyhlásil trochu mimo. 642 00:28:54,950 --> 00:28:55,695 Jo. 643 00:28:55,695 --> 00:28:56,611 Divákov: [nepočuteľné]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 SPEAKER 1: Iste. 646 00:28:59,400 --> 00:29:03,360 Takže v prvom rade určite nie chcú deklarovať a inicializovať čiastku 647 00:29:03,360 --> 00:29:06,130 na nulový vnútorný slučky na každej iterácii, 648 00:29:06,130 --> 00:29:09,370 pretože by to jasne poraziť Účelom sčítaním čísel. 649 00:29:09,370 --> 00:29:11,770 Ja by som sa neustále mení hodnota späť na nulu. 650 00:29:11,770 --> 00:29:17,992 A tiež to, čo je ďalšie viac tajomný Dôvodom pre toho istého rozhodnutia dizajnu? 651 00:29:17,992 --> 00:29:18,954 Jo. 652 00:29:18,954 --> 00:29:20,279 >> Divákov: [nepočuteľné]. 653 00:29:20,279 --> 00:29:21,070 SPEAKER 1: Presne tak. 654 00:29:21,070 --> 00:29:24,060 Chcem sa k nim dostať von slučky príliš na tom, čo online? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Na 53. 657 00:29:26,400 --> 00:29:29,910 A podľa nášho pravidlo od pár prednášok pred, 658 00:29:29,910 --> 00:29:33,680 premenné sú rozsahom, naozaj, na zložené zátvorky, ktoré ich zahŕňajú. 659 00:29:33,680 --> 00:29:38,190 Takže ak nemám deklarovať sumu vnútri z týchto vonkajších zložených zátvorkách, 660 00:29:38,190 --> 00:29:40,250 Nemôžem použiť v súlade 53. 661 00:29:40,250 --> 00:29:43,160 Inak povedané, keď som vyhlásil, suma sem, alebo dokonca v 662 00:29:43,160 --> 00:29:45,410 Pre slučku, mohol by som sa dostať ju do 53. 663 00:29:45,410 --> 00:29:47,150 Premenná by účinne preč. 664 00:29:47,150 --> 00:29:48,579 Takže pár dôvodov tam. 665 00:29:48,579 --> 00:29:50,370 Ale teraz sa vráťme a uvidíme, čo sa stane. 666 00:29:50,370 --> 00:29:51,730 Takže sigma volaná. 667 00:29:51,730 --> 00:29:55,640 Dodáva sa 1 plus 2, alebo 1 plus 2 plus 3 a vráti hodnotu, 668 00:29:55,640 --> 00:29:59,660 ukladá ich do odpovede, a printf tu je dôvod, prečo som videl na obrazovke. 669 00:29:59,660 --> 00:30:03,079 Tak toto je to, čo nazveme iteračné prístup, kde iterácie len 670 00:30:03,079 --> 00:30:03,870 znamená, že pomocou slučky. 671 00:30:03,870 --> 00:30:06,900 U slučky, while, robiť, keď slučky, proste robiť niečo znova 672 00:30:06,900 --> 00:30:08,380 a znovu a znovu. 673 00:30:08,380 --> 00:30:13,505 >> Ale sigma je celkom elegantný funkcie v že som mohol realizovať inak. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Čo o tom, ktoré len aby sa trochu v pohode, 676 00:30:19,120 --> 00:30:21,880 dovoľte mi, aby som naozaj zbaviť z mnohých rozptýlenie 677 00:30:21,880 --> 00:30:24,380 pretože túto funkciu je naozaj veľmi jednoduché. 678 00:30:24,380 --> 00:30:27,780 Poďme rezať ho len svojich štyroch hlavných línií 679 00:30:27,780 --> 00:30:30,410 a zbaviť sa všetkých pripomienky a zložené zátvorky. 680 00:30:30,410 --> 00:30:34,334 To je tak trochu ohromujúce Alternatívne implementácie. 681 00:30:34,334 --> 00:30:37,250 Dobre, možno nie ohromujúce, ale je to trochu zvodnejšie, v poriadku, 682 00:30:37,250 --> 00:30:39,920 pozrieť sa na to tak oveľa stručnejšie. 683 00:30:39,920 --> 00:30:43,120 S iba štyrmi riadky kódu, Prvýkrát som túto kontrolu zdravý rozum. 684 00:30:43,120 --> 00:30:45,732 Ak m je menšie ako alebo rovná nula, sigma nemá zmysel. 685 00:30:45,732 --> 00:30:48,190 Je to len má byť v v tomto prípade pre kladné čísla, 686 00:30:48,190 --> 00:30:50,340 tak som len tak vrátiť nulu ľubovoľne 687 00:30:50,340 --> 00:30:53,210 tak, že sme aspoň niektoré takzvané referenčný prípad. 688 00:30:53,210 --> 00:30:54,430 >> Ale tu je to krása. 689 00:30:54,430 --> 00:30:59,930 Celistvosť tejto myšlienky, dodáva Čísla od 1 po n, m, alebo v tomto prípade, 690 00:30:59,930 --> 00:31:02,630 môže byť vykonané podľa druhu absolvovanie babku. 691 00:31:02,630 --> 00:31:04,947 No, a čo je súčet 1 až m? 692 00:31:04,947 --> 00:31:05,780 No, vieš čo? 693 00:31:05,780 --> 00:31:11,949 Je to rovnaké ako súčet m plus súčet 1 až M mínus jedna. 694 00:31:11,949 --> 00:31:12,740 Tak vieš čo? 695 00:31:12,740 --> 00:31:13,940 Čo je to sigma z m mínus 1? 696 00:31:13,940 --> 00:31:17,860 No, ak ste trochu sledovať tento logicky, je to to isté ako M mínus 1 697 00:31:17,860 --> 00:31:21,415 navyše sigma M mínus dva. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Takže môžete trochu len-- to je ako, keď ste práve 700 00:31:26,012 --> 00:31:28,220 sa snažia otravovať priateľa a oni vás na niečo spýtať, 701 00:31:28,220 --> 00:31:31,344 tak nejako odpovedať na otázku, môžete trochu držať okolo babku. 702 00:31:31,344 --> 00:31:34,560 Ale čo je kľúčové je, že ak budete mať takže otázka, menšie a menšie, 703 00:31:34,560 --> 00:31:36,910 a menšie, ty si nie sa pýtať, čo je to sigma 704 00:31:36,910 --> 00:31:39,116 n, čo je sigma o n, čo je sigma n? 705 00:31:39,116 --> 00:31:40,990 Pýtate sa, čo je sigma n, čo je sigma 706 00:31:40,990 --> 00:31:42,839 n mínus 1, čo je sigma n mínus 2? 707 00:31:42,839 --> 00:31:44,880 Nakoniec vaša otázka sa stane čo? 708 00:31:44,880 --> 00:31:50,250 Čo je sigma jedného alebo nula, niektoré veľmi malé hodnoty, 709 00:31:50,250 --> 00:31:52,220 a akonáhle sa si, že váš priateľ, 710 00:31:52,220 --> 00:31:54,350 nebudete sa opýtať opäť rovnaká otázka, 711 00:31:54,350 --> 00:31:55,975 ste len chcel povedať, oh to je nula. 712 00:31:55,975 --> 00:31:58,490 Skončili sme hrať tento druh z hlúpe cyklické hry. 713 00:31:58,490 --> 00:32:02,950 >> Takže rekurzia je akt v programovaní z funkcie volá sama seba. 714 00:32:02,950 --> 00:32:06,630 Tento program, ktorý pri kompilácii a spustenie je bude správať presne rovnakým spôsobom, 715 00:32:06,630 --> 00:32:09,620 ale to, čo je kľúčové je, že vo vnútri o funkciu nazvanú sigma, 716 00:32:09,620 --> 00:32:13,150 je riadok kódu pričom Hovoríme sami, 717 00:32:13,150 --> 00:32:14,980 ktoré by za normálnych okolností bolo zlé. 718 00:32:14,980 --> 00:32:21,160 Napríklad, čo najskôr, ak I zostavil toto, takže sa sigma-- 719 00:32:21,160 --> 00:32:22,710 aby sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Kladné celé číslo, prosím, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Takže to, čo je funkcia Zdá sa, že byť, na základe jedného testu, správne. 723 00:32:30,810 --> 00:32:34,917 Ale čo keď mám trochu nebezpečné a odstrániť takzvanú základné veci, 724 00:32:34,917 --> 00:32:37,750 a len povedať, tak som len robiť to zložitejšie, než to je. 725 00:32:37,750 --> 00:32:42,450 Povedzme, výpočet sigma tým, že m a potom sa pridá 726 00:32:42,450 --> 00:32:44,564 v sigma m mínus jedna? 727 00:32:44,564 --> 00:32:45,980 No, a čo sa bude diať tu? 728 00:32:45,980 --> 00:32:47,140 Poďme oddialiť. 729 00:32:47,140 --> 00:32:52,920 Poďme prekompilovať program, uložiť, prekompilovať program, 730 00:32:52,920 --> 00:33:00,450 a teda pripravený ./sigma 1 priblíženia, zadajte kladné číslo, prosím, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Koľko z vás je ochotných na Fess až keď videl, že? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 Tak toto sa môže stať pre celý rad dôvodov, 735 00:33:06,690 --> 00:33:09,148 a úprimne povedané, tento týždeň sme o tom, aby vám viac z nich. 736 00:33:09,148 --> 00:33:11,780 Ale v tomto prípade sa pokúste rozum späť 737 00:33:11,780 --> 00:33:14,430 čo by sa tu stalo? 738 00:33:14,430 --> 00:33:17,400 Chyba segmentácie, povedali sme posledný čas, označuje segment pamäte. 739 00:33:17,400 --> 00:33:18,690 Niečo zlé sa stalo. 740 00:33:18,690 --> 00:33:21,550 Ale čo to bolo mechanicky to pokazilo 741 00:33:21,550 --> 00:33:25,000 tu kvôli môjmu odstráneniu tejto takzvanej základné veci, 742 00:33:25,000 --> 00:33:26,870 kde som sa vrátil pevne hodnotu? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Čo si myslíte, že sa stalo? 745 00:33:30,460 --> 00:33:31,219 Jo. 746 00:33:31,219 --> 00:33:32,135 >> Divákov: [nepočuteľné]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 SPEAKER 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Dobrá otázka. 750 00:33:37,550 --> 00:33:39,508 Takže veľkosť čísla že som sa sčítaním 751 00:33:39,508 --> 00:33:41,920 bol tak veľký, že je prekročená veľkosť pamäte. 752 00:33:41,920 --> 00:33:44,640 To je dobrý nápad, ale nie zásadne chystá spôsobiť pád. 753 00:33:44,640 --> 00:33:48,230 To by mohlo viesť k pretečeniu celého čísla, kde bity len otočiť 754 00:33:48,230 --> 00:33:51,760 a potom sme sa mylne naozaj veľký číslo ako záporné číslo, 755 00:33:51,760 --> 00:33:53,260 ale to samo o sebe nespôsobí pád. 756 00:33:53,260 --> 00:33:55,509 Pretože na konci deň int je stále 32 bitov. 757 00:33:55,509 --> 00:33:57,640 Vy nebudete náhodne ukradnúť 33. bit. 758 00:33:57,640 --> 00:33:58,431 Ale dobrá myšlienka. 759 00:33:58,431 --> 00:33:58,984 Jo. 760 00:33:58,984 --> 00:33:59,900 >> Divákov: [nepočuteľné]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 SPEAKER 1: Metóda nikdy zastaví, 763 00:34:02,300 --> 00:34:06,658 a naozaj to tak nazýva znova a znova a znova a znova 764 00:34:06,658 --> 00:34:08,449 a znova, a nikto z tie funkcie vôbec 765 00:34:08,449 --> 00:34:13,310 dokončiť, pretože ich jediným riadku Kód vlastného života volá znova a znova 766 00:34:13,310 --> 00:34:14,219 a znovu. 767 00:34:14,219 --> 00:34:16,080 A čo je naozaj sa tu deje, a teraz sme 768 00:34:16,080 --> 00:34:18,100 môže druh čerpať to obrazne. 769 00:34:18,100 --> 00:34:20,899 Nechajte ma prejsť do obraz na chvíľu. 770 00:34:20,899 --> 00:34:22,940 To je obraz, ktorý nakoniec zhmotniť 771 00:34:22,940 --> 00:34:26,336 podrobnejšie o tom, čo sa deje vnútornej pamäte vášho počítača. 772 00:34:26,336 --> 00:34:28,460 A ukázalo sa, že na Spodná časť tohto obrázku 773 00:34:28,460 --> 00:34:29,709 je niečo, čo nazýva zásobník. 774 00:34:29,709 --> 00:34:31,920 To je kus pamäti, kus pamäte RAM, 775 00:34:31,920 --> 00:34:33,920 to je len použiť kedykoľvek funkcia sa nazýva. 776 00:34:33,920 --> 00:34:36,239 Kedykoľvek, programátor, volanie funkcie, 777 00:34:36,239 --> 00:34:38,860 operačný systém, ako je Mac OS, Windows, alebo Linux, 778 00:34:38,860 --> 00:34:41,920 chytí banda bajtov, možno pár kilobajtov, možno pár megabajtov 779 00:34:41,920 --> 00:34:44,590 pamäti, odovzdá ich pre vás, a potom sa nechá 780 00:34:44,590 --> 00:34:47,650 môžete spustiť funkciu pomocou bez ohľadu na premenné, ktoré potrebujete. 781 00:34:47,650 --> 00:34:50,699 A ak si potom volať ďalšie funkcie a ďalšie funkcie, 782 00:34:50,699 --> 00:34:53,590 dostanete ďalší kus pamäte a ďalšie plátok pamäti. 783 00:34:53,590 --> 00:34:57,090 >> A skutočne, ak je týchto zelených zásobníkov od Annenberg predstavujú, že pamäť, 784 00:34:57,090 --> 00:34:59,870 tu je to, čo sa stane prvou keď budete volať funkciu sigma. 785 00:34:59,870 --> 00:35:04,510 Je to ako dávať zásobník takhle na to, čo je najprv prázdny zásobník. 786 00:35:04,510 --> 00:35:07,142 Ale potom keď je tento zásobník volá sám, aby som tak povedal, 787 00:35:07,142 --> 00:35:08,850 volá ďalšiu inštanciu sigma, je to 788 00:35:08,850 --> 00:35:11,640 ako sa pýtať, operačný systém, ooh, potrebujú trochu viac pamäte, 789 00:35:11,640 --> 00:35:12,520 daj mi to. 790 00:35:12,520 --> 00:35:14,840 A potom sa to dostane nahromadí na na vrchole. 791 00:35:14,840 --> 00:35:18,030 Ale to, čo je kľúčom je, že Prvý zásobník je stále tu, 792 00:35:18,030 --> 00:35:20,620 preto, že použil tento druhý zásobník. 793 00:35:20,620 --> 00:35:23,500 Teraz medzitým sigma sigma volanie, To je ako pýtať sa na viac pamäte. 794 00:35:23,500 --> 00:35:25,830 Dostane nahromadí na sem. 795 00:35:25,830 --> 00:35:29,350 sigma volať Sigma, to je ďalšia zásobník, ktorý sa nahromadí na tu. 796 00:35:29,350 --> 00:35:32,942 A ak budete mať, čo robíme, nakoniec, druh máp táto vizuálna 797 00:35:32,942 --> 00:35:35,525 tohto grafu, čo sa deje na stane s hromadou misiek? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 To bude vyššia ako výška pamäte má váš počítač. 800 00:35:41,160 --> 00:35:45,790 A akonáhle ekologickým zásobníka presahuje vodorovnú čiaru 801 00:35:45,790 --> 00:35:49,410 nad komínom a nad to slovo hromady, ktoré sa vrátime v budúcnosti, 802 00:35:49,410 --> 00:35:50,410 to je zlá vec. 803 00:35:50,410 --> 00:35:52,810 Halda je iný segment pamäte, 804 00:35:52,810 --> 00:35:55,190 a keď si nechať tieto zásobníky hromada a hromada na, 805 00:35:55,190 --> 00:35:57,800 budete prekročiť vlastný segment pamäte, 806 00:35:57,800 --> 00:36:00,420 a program je naozaj chystá k havárii. 807 00:36:00,420 --> 00:36:02,930 >> Teraz ako stranou, túto myšlienku rekurzia, teda 808 00:36:02,930 --> 00:36:06,500 jasne viesť k problémom, ale to nie je nevyhnutne zlá vec. 809 00:36:06,500 --> 00:36:08,840 Vzhľadom k tomu, zvážiť, po všetci, Jak-- a možno 810 00:36:08,840 --> 00:36:11,700 to trvá nejaký čas zvykať na --how elegantné alebo ako jednoduché 811 00:36:11,700 --> 00:36:14,890 že vykonávanie sigma je. 812 00:36:14,890 --> 00:36:17,440 A my nebudeme používať rekurzia tak moc v CS50, 813 00:36:17,440 --> 00:36:20,780 ale v CS51, a naozaj ktorákoľvek trieda kde sa manipulovať dátové štruktúry 814 00:36:20,780 --> 00:36:23,640 ako sú stromy, alebo rodinné stromy, ktoré majú určitú hierarchiu, 815 00:36:23,640 --> 00:36:26,000 je to super, super užitočné. 816 00:36:26,000 --> 00:36:29,750 Teraz, rovnako ako stranou, aby vás ako začínajúci počítačoví experti 817 00:36:29,750 --> 00:36:33,180 sú oboznámení s niektorými z Google je vnútri vtipy, ak idete na Google 818 00:36:33,180 --> 00:36:36,345 a pozrieť sa, čo je definície, povedzme, rekurzia, zadajte. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Uh-huh. 821 00:36:41,110 --> 00:36:42,670 Ako stranou, vytiahol som pár. 822 00:36:42,670 --> 00:36:45,470 To je ako 10 minút otáľania dnes ráno. 823 00:36:45,470 --> 00:36:52,890 Ak sa vám tiež Google "nakrivo" oznámenia nakláňaním hlavu slightly-- 824 00:36:52,890 --> 00:36:55,120 a toto je možná tých najdesivejších zo všetkých 825 00:36:55,120 --> 00:36:57,286 pretože niekto strávil ako ich deň vykonávanie tohto 826 00:36:57,286 --> 00:36:59,880 niekoľko rokov ago-- poď. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, počkaj to je chyba. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Tak beží na jednom z najväčšia svetová stránky 831 00:37:11,410 --> 00:37:13,510 sú tieto hlúpe veľkonočné vajíčka. 832 00:37:13,510 --> 00:37:16,690 Pravdepodobne konzumujú netriviálne počet riadkov kódu 833 00:37:16,690 --> 00:37:19,280 len preto, že môžeme mať malé zábavné veci, ako že. 834 00:37:19,280 --> 00:37:22,140 Ale aspon teraz dostanete niektoré z týchto vnútri vtipy. 835 00:37:22,140 --> 00:37:28,330 >> Teraz sa poďme pozrieť na niektoré z White Lies sme hovorili neskoré, 836 00:37:28,330 --> 00:37:30,707 a začať lúpať späť niektoré vrstvy technicky 837 00:37:30,707 --> 00:37:32,790 takže si naozaj pochopiť, čo sa deje 838 00:37:32,790 --> 00:37:34,860 a môžete pochopiť, niektoré z hrozieb, 839 00:37:34,860 --> 00:37:38,060 ako Shellshock, že sa teraz začínajú byť 840 00:37:38,060 --> 00:37:41,110 Na čele každého z nás pozornosť, prinajmenšom v médiách. 841 00:37:41,110 --> 00:37:45,810 Takže tu je veľmi jednoduchá funkcia že sa vráti nič neplatné. 842 00:37:45,810 --> 00:37:46,790 Jeho meno je odkladacia. 843 00:37:46,790 --> 00:37:50,880 Trvá dvoch premenných a vráti nič. 844 00:37:50,880 --> 00:37:52,260 Berie na A a B .. 845 00:37:52,260 --> 00:37:53,337 Tak rýchlo demonštrácie. 846 00:37:53,337 --> 00:37:54,170 Vzali sme to hore. 847 00:37:54,170 --> 00:37:56,100 Mohli by sme tiež vziať trochu zlomiť tu len na chvíľu 848 00:37:56,100 --> 00:37:57,250 a mať niečo na pitie. 849 00:37:57,250 --> 00:38:00,120 Ak niekto by mi nevadilo spojenie me up na chvíľu tu. 850 00:38:00,120 --> 00:38:01,830 Ako sa o vás v gaštanovo hnedej košeli? 851 00:38:01,830 --> 00:38:02,335 Poď hore. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Len jeden dnes. 854 00:38:05,260 --> 00:38:06,251 Ďakujem, aj keď. 855 00:38:06,251 --> 00:38:08,000 Tak jo, a máme prísť, kto tu? 856 00:38:08,000 --> 00:38:08,660 Ako sa voláte? 857 00:38:08,660 --> 00:38:09,360 >> SPEAKER 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> SPEAKER 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Poď hore. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Takže Laura, veľmi jednoduchá výzva dnes. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Nice to meet yo. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 V poriadku. 866 00:38:16,910 --> 00:38:21,179 Takže máme trochu mlieka sem a máme nejaký pomarančový džús sem 867 00:38:21,179 --> 00:38:23,345 a niektoré poháre, ktoré sme požičal si od Annenberg dnes. 868 00:38:23,345 --> 00:38:24,178 >> SPEAKER 4: Požičal. 869 00:38:24,178 --> 00:38:27,240 SPEAKER 1: A bude pokračovať a dá vám pol pohára tohto. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 V poriadku. 872 00:38:28,800 --> 00:38:30,750 A my vám dáme polovice pohár mlieka. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Jo, a len tak, že môžete spomenúť, čo to bolo, ako, 875 00:38:35,890 --> 00:38:38,860 Spomenul som si, aby to a dnes. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Dobre. 878 00:38:42,530 --> 00:38:45,470 Ak vám to nebude vadiť, pozrime sa, my je dať na svoje vlastné okuliare 879 00:38:45,470 --> 00:38:46,560 ak chcete. 880 00:38:46,560 --> 00:38:48,710 Bude to svet z Laurových očí. 881 00:38:48,710 --> 00:38:49,210 V poriadku. 882 00:38:49,210 --> 00:38:53,820 Takže váš cieľ, vzhľadom k tomu dva šálky Tu kvapalina, mlieko a pomarančový džús, 883 00:38:53,820 --> 00:38:58,370 je prehodiť obsah tak, aby sa pomarančová šťava ide do šálky mlieka 884 00:38:58,370 --> 00:39:00,710 a ide do mlieka pomarančový džús šálka. 885 00:39:00,710 --> 00:39:02,359 >> SPEAKER 4: Dostanem jedna šálka? 886 00:39:02,359 --> 00:39:05,650 SPEAKER 1: Som rád, že sa pýtaš, keď bolo by to oveľa lepšie zábery 887 00:39:05,650 --> 00:39:06,710 ak ste sa nepýtal. 888 00:39:06,710 --> 00:39:10,620 Ale áno, môžeme ponúknuť tretiny kalich je prázdna, samozrejme. 889 00:39:10,620 --> 00:39:11,120 V poriadku. 890 00:39:11,120 --> 00:39:12,300 Takže vymeniť obsah tam. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Very nice. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Veľmi dobre. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Robíš to pozoruhodne opatrne. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 A krok tri. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 V poriadku. 901 00:39:31,350 --> 00:39:31,930 Výborne. 902 00:39:31,930 --> 00:39:33,930 Veľký potlesk by bolo dobré pre Lauru. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 V poriadku. 905 00:39:37,000 --> 00:39:40,790 Máme malý darček na rozlúčku pre vás, ale dovoľte mi, aby som to. 906 00:39:40,790 --> 00:39:42,620 Ďakujem moc. 907 00:39:42,620 --> 00:39:46,170 Tak jednoduchý príklad, aj keď, dokázať, že ak si 908 00:39:46,170 --> 00:39:48,300 Chcete meniť obsah z dvoch nádob, 909 00:39:48,300 --> 00:39:52,360 alebo hovorme im premenné, budete potrebovať nejaké dočasné uskladnenie 910 00:39:52,360 --> 00:39:56,710 inscenovať jednu z obsahu v rozsahu, v že môžete skutočne urobiť swap. 911 00:39:56,710 --> 00:40:01,790 Takže naozaj, tento zdrojový kód tu v C je predstaviteľom presne to. 912 00:40:01,790 --> 00:40:06,340 V prípade, že pomarančový džús bol a mlieko Bol b, a my sme chceli vymeniť dve, 913 00:40:06,340 --> 00:40:08,990 môžete skúsiť niečo kreatívneho naliatím do seba, 914 00:40:08,990 --> 00:40:11,031 ale to asi nie koniec obzvlášť dobre. 915 00:40:11,031 --> 00:40:15,260 A tak sme sa použiť tretina šálky, hovor to tmp, T-M-P konvencií, 916 00:40:15,260 --> 00:40:19,370 a dať obsah EÚ v tom, že potom vymeniť jednu šálku, 917 00:40:19,370 --> 00:40:22,610 potom dal OJ do Originálny pohár, čím sa 918 00:40:22,610 --> 00:40:25,320 dosiahnutie, presne tak, ako Laura urobila, swap. 919 00:40:25,320 --> 00:40:26,850 >> Takže poďme robiť presne to. 920 00:40:26,850 --> 00:40:30,110 Nechaj ma ísť napred a otvoriť up príklad, ktorý je 921 00:40:30,110 --> 00:40:32,720 vlastne hovorí "nie vymeniť, "pretože to nie je 922 00:40:32,720 --> 00:40:36,180 ako jednoducho urobiť, ako by ste si mohli myslieť. 923 00:40:36,180 --> 00:40:41,190 Takže v rámci tohto programu, zistíte, že Ja používam stdio.h naša stará známa. 924 00:40:41,190 --> 00:40:43,130 Mám prototyp odkladací priestor tam, čo 925 00:40:43,130 --> 00:40:45,450 znamená, že jej realizácia je asi dole, 926 00:40:45,450 --> 00:40:48,050 a pozrime sa, čo to hlavné Program bude robiť pre mňa. 927 00:40:48,050 --> 00:40:52,020 Prvý Prehlasujem, int x dostane jeden, a int y dostane dva. 928 00:40:52,020 --> 00:40:54,930 Takže myslíte, že z tých, čo vestníku a mlieka, resp. 929 00:40:54,930 --> 00:40:57,100 A potom som sa printf hovoriť x je to 930 00:40:57,100 --> 00:41:00,120 a y je to, len tak môžem vizuálne vidieť, čo sa deje. 931 00:41:00,120 --> 00:41:03,810 Potom som printf tvrdí že som prečerpanie dva, 932 00:41:03,810 --> 00:41:07,100 a potom som vytlačiť tvrdia, že to vymenili, 933 00:41:07,100 --> 00:41:09,300 a ja znovu vytlačiť x a y. 934 00:41:09,300 --> 00:41:13,010 Takže tu v swap presne to, čo Laura urobila, 935 00:41:13,010 --> 00:41:16,240 a presne to, čo sme videli na obrazovka pred chvíľou. 936 00:41:16,240 --> 00:41:19,380 >> Tak poďme do toho a bude veľmi sklamaný. 937 00:41:19,380 --> 00:41:24,690 Nenechajte výmenu a spustiť žiadny swap, priblíženie na výstupe tu. 938 00:41:24,690 --> 00:41:28,320 Zadajte x 1, y je 2, swapping prehodené. 939 00:41:28,320 --> 00:41:32,700 x je stále 1, a y je ešte 2. 940 00:41:32,700 --> 00:41:37,630 Takže aj keď, úprimne povedané, to vyzerá presne páči, aj keď technicky, 941 00:41:37,630 --> 00:41:40,730 čo Laura urobila, nezdalo sa, že práca. 942 00:41:40,730 --> 00:41:42,130 Tak prečo to je? 943 00:41:42,130 --> 00:41:46,630 No, ukázalo sa, že pri napíšeme program, ako je tento 944 00:41:46,630 --> 00:41:51,590 ktorá oba hlavné, zdôraznil tu a potom ďalšie funkcie, ako odkladací priestor, 945 00:41:51,590 --> 00:41:54,230 tu zdôraznené, ktoré volá, svet 946 00:41:54,230 --> 00:41:57,030 vyzerá niečo ako Tieto zásobníky pred chvíľou. 947 00:41:57,030 --> 00:42:00,440 Keď hlavný najprv volaná, To je ako pýtať sa operačný systém 948 00:42:00,440 --> 00:42:04,030 o trochu pamäte pre akýkoľvek miestny premenných, ako je x a y, ktoré má hlavné, 949 00:42:04,030 --> 00:42:05,660 a skončí tady. 950 00:42:05,660 --> 00:42:10,920 Ale ak hlavná hovory prepínať, a hlavné prechádza vymeniť dva argumenty, A a B, 951 00:42:10,920 --> 00:42:16,410 pomarančový džús a mlieko, to nie je ako podal pomarančový džús a mlieko 952 00:42:16,410 --> 00:42:17,500 Laure. 953 00:42:17,500 --> 00:42:21,300 Čo robí počítač, je to odovzdá kópie pomarančového džúsu 954 00:42:21,300 --> 00:42:27,110 a kópie mlieka Laura, aby sa čo je nakoniec vnútri tohto zásobníka 955 00:42:27,110 --> 00:42:32,510 je jedna hodnota, a dva, alebo Ú a mlieka, ale ich kópie, 956 00:42:32,510 --> 00:42:34,790 tak, že v tomto bode v príbehu, tam 957 00:42:34,790 --> 00:42:36,930 je EÚ a mlieko v každej z týchto zásobníkov. 958 00:42:36,930 --> 00:42:39,260 K dispozícii je jedna a dve v každej z týchto zásobníkov, 959 00:42:39,260 --> 00:42:41,720 a funkcie odkladacie skutočne funguje. 960 00:42:41,720 --> 00:42:46,090 Je to vymení je vnútri z druhej najvyššej zásobníka, 961 00:42:46,090 --> 00:42:48,147 ale že odkladanie nemá žiadny vplyv. 962 00:42:48,147 --> 00:42:49,980 A na základe len niektoré Základným princípom máme 963 00:42:49,980 --> 00:42:52,970 hovoril o skôr, a síce pred pár minút, čo 964 00:42:52,970 --> 00:42:58,770 by mohlo vysvetliť, prečo zmeny a b vnútri swapu 965 00:42:58,770 --> 00:43:05,560 nemá žiadny vplyv na x a y, aj keď Prešiel som x a y na funkciu pamäti. 966 00:43:05,560 --> 00:43:08,750 Čo je kľúčové slovo tu, že môže zjednodušene vysvetliť? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Myslím, že je tu som počul? 969 00:43:12,627 --> 00:43:13,335 DIVÁKOV: Return. 970 00:43:13,335 --> 00:43:14,085 SPEAKER 1: Návrat? 971 00:43:14,085 --> 00:43:14,590 Nevráti. 972 00:43:14,590 --> 00:43:15,895 Poďme s jedným iný. 973 00:43:15,895 --> 00:43:16,395 Čo je to? 974 00:43:16,395 --> 00:43:17,080 >> Divákov: [nepočuteľné]. 975 00:43:17,080 --> 00:43:20,000 >> SPEAKER 1: OK, takže sme mohli return-- aby spiatočnej práca v príbehu, 976 00:43:20,000 --> 00:43:21,914 ale tam je ešte jednoduchšie vysvetlenie. 977 00:43:21,914 --> 00:43:22,580 DIVÁKOV: Scope. 978 00:43:22,580 --> 00:43:23,288 SPEAKER 1: Rozsah platnosti. 979 00:43:23,288 --> 00:43:24,300 Vezmem rozsahu. 980 00:43:24,300 --> 00:43:27,290 Takže rozsah, si spomenúť, kde Naše x a y vyhlásil. 981 00:43:27,290 --> 00:43:30,840 Sú deklarované vnútri z hlavnej až tu. 982 00:43:30,840 --> 00:43:33,200 a, b, zatiaľ, sú fakticky vyhlásil 983 00:43:33,200 --> 00:43:35,930 vnútri odkladací priestor, nie celkom Zložené zátvorky, ale stále 984 00:43:35,930 --> 00:43:37,690 vo všeobecnej časti swapu. 985 00:43:37,690 --> 00:43:40,560 A tak skutočne, a ab existujú len v rámci tohto zásobníka 986 00:43:40,560 --> 00:43:44,850 z Annenberg, toto Druhý kus kódu. 987 00:43:44,850 --> 00:43:49,500 Takže sme naozaj mení kópiu, ale to nie je naozaj všetko, že užitočné. 988 00:43:49,500 --> 00:43:52,190 >> Takže poďme sa pozrieť na to trochu nižšej úrovni. 989 00:43:52,190 --> 00:43:55,430 Chystám sa vrátiť do Source Directory, 990 00:43:55,430 --> 00:43:58,330 a ja budem prvý priblížiť tu, a len 991 00:43:58,330 --> 00:44:02,290 potvrdiť, že som v tomto väčšie okno terminálu, 992 00:44:02,290 --> 00:44:04,430 Program sa stále chová takto. 993 00:44:04,430 --> 00:44:06,840 Predpokladajme teraz, že tento nie je úmyselné. 994 00:44:06,840 --> 00:44:10,090 Jasne som chcel výmenu na práce, takže je to ako chyba. 995 00:44:10,090 --> 00:44:12,780 Teraz som mohol začať pridávať veľa printf rokov na mojom kódu, 996 00:44:12,780 --> 00:44:16,010 vytlačiť x sem, y po tu, tu, b sem. 997 00:44:16,010 --> 00:44:18,220 Ale úprimne povedané, to je asi to, čo si robil za pár týždňov 998 00:44:18,220 --> 00:44:20,190 Teraz, v úradných hodinách a doma pri práci 999 00:44:20,190 --> 00:44:22,150 na psets sa snažia nájsť nejaké chyby. 1000 00:44:22,150 --> 00:44:25,560 Ale uvidíte, ak ste tak už neurobili, že problém nastaviť tri vás zoznámi 1001 00:44:25,560 --> 00:44:31,630 k príkazu názvom GDB, kde GDB, GNU debugger, 1002 00:44:31,630 --> 00:44:34,040 má sama veľa funkcie, ktoré môžu v skutočnosti 1003 00:44:34,040 --> 00:44:38,160 aby sme pochopili situáciu takto, ale presvedčivo, 1004 00:44:38,160 --> 00:44:39,940 riešiť problémy a nájsť chyby. 1005 00:44:39,940 --> 00:44:40,940 Tak idem na to. 1006 00:44:40,940 --> 00:44:44,770 Namiesto toho, aby ./noswap som miesto bude bežať GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Inými slovami, budem bežať môj Program nie je Bash, náš nový priateľ 1009 00:44:51,200 --> 00:44:51,850 dnes. 1010 00:44:51,850 --> 00:44:53,970 Chystám sa spustiť môj Program noswap vnútri 1011 00:44:53,970 --> 00:44:56,900 tohto iného programu s názvom GDB, ktorý je debugger, ktorý 1012 00:44:56,900 --> 00:45:01,035 je program, ktorý je navrhnutý tak, aby Vy ľudia nájsť a odstrániť chyby. 1013 00:45:01,035 --> 00:45:03,410 Takže keď som narazila Spustiť tu, je tu ukrutný množstvo textu 1014 00:45:03,410 --> 00:45:04,868 že naozaj nikdy nebudete musieť čítať. 1015 00:45:04,868 --> 00:45:07,290 Je to v podstate rozptýlenie z príkazového riadku, ktorý 1016 00:45:07,290 --> 00:45:10,030 Chystám sa udrieť Control-L dostať sa na tam hore. 1017 00:45:10,030 --> 00:45:11,800 To je výzva GDB. 1018 00:45:11,800 --> 00:45:15,550 Ak chcem spustiť tento program teraz pretože tento malý ťahák na dnešné 1019 00:45:15,550 --> 00:45:21,860 snímka naznačuje, Run je prvá príkazy, ktoré nám chcel predstaviť. 1020 00:45:21,860 --> 00:45:25,150 A ja som jednoducho ísť s typom bežať až tu vnútri GDB, 1021 00:45:25,150 --> 00:45:26,811 a naozaj to bežal môj program. 1022 00:45:26,811 --> 00:45:29,310 Teraz tam je nejaký ďalší výstupy na obrazovku, ako je táto, 1023 00:45:29,310 --> 00:45:31,910 ale to je len GDB je análny a hovoriť nám, čo sa deje. 1024 00:45:31,910 --> 00:45:34,451 Tie naozaj nemajú na starosti o týchto údajov práve teraz. 1025 00:45:34,451 --> 00:45:36,890 Ale to, čo je naozaj v pohode GDB, ak je to urobiť again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L vymaže screen-- nechaj ma ísť dopredu a typu "break hlavné," tým, 1027 00:45:42,100 --> 00:45:45,743 keď som stlačte klávesu Enter, nastavenie, čo je volal zlom v noswap.c, 1028 00:45:45,743 --> 00:45:51,270 riadok 16, ktorý je tam, kde GDB prišiel môj program v skutočnosti 1029 00:45:51,270 --> 00:45:53,070 je moja funkcia je v skutočnosti. 1030 00:45:53,070 --> 00:45:55,070 To budeme ignorovať teraz ale to je adresa 1031 00:45:55,070 --> 00:45:57,310 v pamäti špecificky tejto funkcie. 1032 00:45:57,310 --> 00:46:00,240 Takže teraz, keď typ som bežať, Všimnite si, čo je v pohode tu. 1033 00:46:00,240 --> 00:46:05,650 Môj program vypukne v riadku I povedal GDB pozastaviť výkon na. 1034 00:46:05,650 --> 00:46:09,850 Takže nemám teraz zmeniť svoj kód, pridať nejaké printf je, prekompilovať to, repríza 1035 00:46:09,850 --> 00:46:13,300 to, zmeniť, pridať nejaké printf je, uložiť, prekompilovať ho spustiť. 1036 00:46:13,300 --> 00:46:18,100 Môžem len prejsť môj program krok za krokom za krokom pri ľudskou rýchlosťou, 1037 00:46:18,100 --> 00:46:20,880 nie na Intel-vnútri druhu rýchlosti. 1038 00:46:20,880 --> 00:46:24,580 >> Takže teraz všimnete tento riadok Tu sa zobrazí, a keď som sa vrátiť 1039 00:46:24,580 --> 00:46:27,800 do môjho programu v gedit, Všimnite si, že to je v skutočnosti 1040 00:46:27,800 --> 00:46:29,280 Prvý riadok kódu. 1041 00:46:29,280 --> 00:46:31,240 K dispozícii je rad 16 v gedit. 1042 00:46:31,240 --> 00:46:34,610 K dispozícii je rad 16 v GDB, a dokonca aj aj keď tento čierny a biely rozhrania 1043 00:46:34,610 --> 00:46:37,760 nie je zďaleka tak užívateľ priateľský, to znamená, že 1044 00:46:37,760 --> 00:46:41,680 že linka 16 nebol vykonaný ešte, ale je to o tom, že je. 1045 00:46:41,680 --> 00:46:46,220 Takže vlastne keď som typ tlače x, nie printf, len print x, 1046 00:46:46,220 --> 00:46:50,730 Mám nejakú falošnú hodnotu tam nula, pretože x nebol doteraz inicializovaný. 1047 00:46:50,730 --> 00:46:54,760 Takže budem písať ďalej, alebo, ak máte Chcete byť fantázie, len n na ďalšie. 1048 00:46:54,760 --> 00:46:59,090 Ale keď som typ budúci vstúpiť, teraz Všimnite si, že sa pohybuje na linke 17. 1049 00:46:59,090 --> 00:47:02,840 Takže logicky, ak som popravený riadok 16 a teraz napíšte print x, 1050 00:47:02,840 --> 00:47:03,640 čo by som mal vidieť? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 One. 1053 00:47:05,520 --> 00:47:07,820 >> A teraz je to síce mätúce. 1054 00:47:07,820 --> 00:47:11,260 2 dolárov je len ozdobný spôsob, ak máte chcete odkázať na túto hodnotu vyššiu, 1055 00:47:11,260 --> 00:47:12,510 môžete povedať "dolár podpísať dva." 1056 00:47:12,510 --> 00:47:13,480 Je to ako odkaz späť. 1057 00:47:13,480 --> 00:47:14,570 Ale teraz, jednoducho ignorovať. 1058 00:47:14,570 --> 00:47:17,070 Čo je zaujímavé je to, čo je vpravo od rovnítka. 1059 00:47:17,070 --> 00:47:21,000 A teraz keď som písať ďalší zase a tlač y, mal by som vidieť dva. 1060 00:47:21,000 --> 00:47:23,870 Môžem teraz tiež vytlačiť x znova, a úprimne povedané, 1061 00:47:23,870 --> 00:47:27,130 keď som stále trochu zmätená, tam, kde som, môžem písať zoznam pre zoznam 1062 00:47:27,130 --> 00:47:30,590 a jednoducho vidieť nejaký kontext okolo bod Vlastne som na. 1063 00:47:30,590 --> 00:47:35,180 A teraz môžem písať Ďalšie, a tam je 1 x. 1064 00:47:35,180 --> 00:47:36,300 Teraz píšem ďalej. 1065 00:47:36,300 --> 00:47:37,710 Oh, y je 2. 1066 00:47:37,710 --> 00:47:40,750 A opäť, je to mätúce, pretože výstup GDB je 1067 00:47:40,750 --> 00:47:43,044 je pomiešané s vlastnou výstup. 1068 00:47:43,044 --> 00:47:45,710 Ale ak budete mať na mysli tým, že pozrel sa tam a späť na váš kód 1069 00:47:45,710 --> 00:47:47,740 alebo ktorým ju z boku po boku možno budete 1070 00:47:47,740 --> 00:47:51,020 vidieť, že v skutočnosti som len krokovanie môjho programu. 1071 00:47:51,020 --> 00:47:54,620 >> Všimnime si ale, čo sa bude diať ďalej, a to doslova. 1072 00:47:54,620 --> 00:47:56,380 Tu je linka 22. 1073 00:47:56,380 --> 00:48:01,315 Nechaj ma ísť cez neho, čím sa posúva o na 23, a keď som vytlačiť x teraz ešte jeden. 1074 00:48:01,315 --> 00:48:03,890 A keď som vytlačiť y teraz ešte jeden. 1075 00:48:03,890 --> 00:48:05,820 Takže to nie je vhodné cvičenie. 1076 00:48:05,820 --> 00:48:07,450 Takže poďme zopakovať to. 1077 00:48:07,450 --> 00:48:10,069 Dovoľte mi, aby som sa vrátiť do opäť hore a typ beh. 1078 00:48:10,069 --> 00:48:12,110 A to hovorí program ktorý je ladený 1079 00:48:12,110 --> 00:48:14,109 začala už začal od začiatku. 1080 00:48:14,109 --> 00:48:15,420 Áno, poďme to urobiť znova. 1081 00:48:15,420 --> 00:48:22,000 A tentoraz poďme robiť ďalej, ďalšie, ďalšie, ďalšie, ďalšie, 1082 00:48:22,000 --> 00:48:24,180 ale teraz sa veci zaujímavé. 1083 00:48:24,180 --> 00:48:27,760 Teraz chcem vstúpiť do Swap, takže si nemyslím, písať ďalej. 1084 00:48:27,760 --> 00:48:34,380 Píšem krok, a teraz si toho skočil mi do noswap.c linke 33. 1085 00:48:34,380 --> 00:48:37,240 Ak sa mám vrátiť do gedit, čo je riadok 33? 1086 00:48:37,240 --> 00:48:40,500 To je prvý skutočný riadok kódu vnútri swapu. 1087 00:48:40,500 --> 00:48:44,150 Čo je pekné, pretože teraz môžem druh hrabať okolo seba a dostať zvedavý 1088 00:48:44,150 --> 00:48:46,052 o tom, čo sa deje naozaj tam. 1089 00:48:46,052 --> 00:48:46,760 Dovoľte mi, aby som vytlačiť tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Whoa. 1092 00:48:48,800 --> 00:48:51,438 Prečo tmp mať niektoré blázon, falošné odpadky hodnota? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 Divákov: To nebol inicializovaný. 1095 00:48:56,120 --> 00:48:57,150 SPEAKER 1: To nebol inicializovaný. 1096 00:48:57,150 --> 00:49:00,270 A skutočne, pri spustení programu, ste dostal veľa pamäte 1097 00:49:00,270 --> 00:49:03,392 operačným systémom, ale neboli inicializované žiadne hodnoty, 1098 00:49:03,392 --> 00:49:05,600 Takže bez ohľadu na bity ste videl sem, aj keď je to 1099 00:49:05,600 --> 00:49:07,770 tento šialený veľký negatívny číslo, jednoducho znamená, 1100 00:49:07,770 --> 00:49:10,750 že to sú zvyšky z niektoré predchádzajúce využitie tejto pamäte RAM, 1101 00:49:10,750 --> 00:49:13,050 aj keď nemám ja ho potreboval ešte. 1102 00:49:13,050 --> 00:49:17,086 Takže teraz idem do toho pustite a typ ďalšie, a keď som teraz písať tlačové tmp, 1103 00:49:17,086 --> 00:49:17,835 čo by som mal vidieť? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Či už je hodnota bola je prvý argument, len 1106 00:49:23,360 --> 00:49:25,550 ako X bol prvý čo boli prenesené do, 1107 00:49:25,550 --> 00:49:30,450 tak a x by mala byť rovnaká, tak tlačiť tmp by mi vytlačiť jeden. 1108 00:49:30,450 --> 00:49:36,360 >> Takže to, čo uvidíte v problémovej sady tri je výukový program svojho druhu na GDB, 1109 00:49:36,360 --> 00:49:40,020 ale si uvedomiť, že toto je začiatok z pohľadu na nástroj, ktorý bude skutočne 1110 00:49:40,020 --> 00:49:42,774 pomôcť pri riešení problémov tak oveľa efektívnejšie. 1111 00:49:42,774 --> 00:49:44,690 Čo sme nakoniec robiť v stredu 1112 00:49:44,690 --> 00:49:48,180 sa začne lúpať o niekoľko vrstiev a odstrániť niektoré tréningové kolesá. 1113 00:49:48,180 --> 00:49:50,496 To, čomu sa hovorí reťazec, ktorý sme dlhšiu dobu používať, 1114 00:49:50,496 --> 00:49:53,370 ideme pomaly brať preč od vás a začať hovoriť o 1115 00:49:53,370 --> 00:49:55,725 niečo ezoterického známy ako char *, 1116 00:49:55,725 --> 00:49:59,550 ale budeme to urobiť pekný a najprv mierne, aj keď ukazovatele, 1117 00:49:59,550 --> 00:50:02,730 ako sa im hovorí, môžete urobiť nejaké veľmi zlé veci, ak by bol zneužitý, 1118 00:50:02,730 --> 00:50:06,040 pri pohľade na malú claymation od náš priateľ Nick Parlante zo Stanforde 1119 00:50:06,040 --> 00:50:09,670 University, profesor v počítači vedy, ktorý dal dohromady tento náhľad 1120 00:50:09,670 --> 00:50:11,075 toho, čo je príde túto stredu. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [PREHRÁVANIE] 1123 00:50:13,400 --> 00:50:13,900 Hej, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Prebuď sa. 1126 00:50:15,780 --> 00:50:17,240 Je čas na ukazovateľ zábavy. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Čo je to? 1129 00:50:19,350 --> 00:50:21,150 Ďalšie informácie o ukazovateli? 1130 00:50:21,150 --> 00:50:22,050 Oh, dobrota! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END Videoprehrávanie] 1133 00:50:23,730 --> 00:50:25,396 SPEAKER 1: To na vás čaká v stredu. 1134 00:50:25,396 --> 00:50:26,440 Uvidíme sa potom. 1135 00:50:26,440 --> 00:50:27,106 [PREHRÁVANIE] 1136 00:50:27,106 --> 00:50:30,420 -A Teraz, hlboké myšlienky, od Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> Prečo sa učíme C? 1139 00:50:35,900 --> 00:50:36,785 Prečo nie +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [SMIECH] 1142 00:50:40,910 --> 00:50:42,160 >> [END Videoprehrávanie]