1 00:00:00,000 --> 00:00:12,040 >> [Muziciranja] 2 00:00:12,040 --> 00:00:16,460 >> Zvučnik 1: U redu, ovo je CS50, i to je početak četiri tjedna, 3 00:00:16,460 --> 00:00:20,420 i kao što ste možda čuli ili pročitati, svijet je završio. 4 00:00:20,420 --> 00:00:23,520 Ide sve oko interneta ima bio znanja i svijesti 5 00:00:23,520 --> 00:00:27,100 buga u program, programski jezik zove bash. 6 00:00:27,100 --> 00:00:32,729 To je čudesno je označen kao što je potres mozga, ili Bash vrata, 7 00:00:32,729 --> 00:00:35,485 ali članci poput ovih nisu bili rijetkost. 8 00:00:35,485 --> 00:00:38,807 A u stvari, mnogi od njih donijeti sjećanja na Heartbleed, 9 00:00:38,807 --> 00:00:41,640 što ste možda primijetili u pritisnite vratio prošlog proljeća, koje 10 00:00:41,640 --> 00:00:43,980 bio sličan prilično dramatična. 11 00:00:43,980 --> 00:00:47,110 Sada od one od vas ovdje Danas, koliko vas ima, 12 00:00:47,110 --> 00:00:50,330 čak i ako ne razumiju što to je sve o, čuli za potres mozga? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 U redu, i koliko vas je imaju računala koja su ranjiva? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 U redu, ne bi trebalo biti daleko, daleko više ruku do sada, iz razloga što ćemo vidjeti. 17 00:01:00,250 --> 00:01:02,580 >> Uzmimo pogled na ono što je traje u medijima 18 00:01:02,580 --> 00:01:05,304 a zatim objasniti malo Ovdje nam je tehnički. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> ZVUČNIK 2: Sigurnosni stručnjaci imaju upozorio da je ozbiljan propust može 21 00:01:11,250 --> 00:01:15,650 biti oko utjecati na stotine milijuni svjetskih korisnika weba. 22 00:01:15,650 --> 00:01:20,600 Dakle, točno ono što je bug koji je bio nazvan potres mozga, a što učiniti? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Dakle, kontuzija također poznat kao Bash bug, softver se iskorištava. 25 00:01:28,910 --> 00:01:33,230 Hakeri koriste virus skeniranje ranjiva Sustavi za trčanje Linux i Unix 26 00:01:33,230 --> 00:01:36,300 operacijskim sustavima, a zatim ih zaraziti. 27 00:01:36,300 --> 00:01:38,730 Bash je ljuska naredbenog retka. 28 00:01:38,730 --> 00:01:43,460 To omogućuje korisnicima pitanje naredbe za pokretanje programi i značajke unutar softvera 29 00:01:43,460 --> 00:01:45,250 upisivanjem u tekstu. 30 00:01:45,250 --> 00:01:49,980 To obično se koristi od strane programera, a Ne bi trebao biti otvoren za širu svijetu, 31 00:01:49,980 --> 00:01:51,590 iako je potres mozga mijenja to. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Pa, worringly, neki analitičari upozoravaju da bi mogla biti veća prijetnja, 34 00:01:57,910 --> 00:02:01,580 zbog kontuzija omogućuje potpuni kontrolu nad zaraženim računalima, 35 00:02:01,580 --> 00:02:06,030 dok Heartbleed dopušteno samo hakeri da izvidi na računalima. 36 00:02:06,030 --> 00:02:09,130 To je tako ozbiljna, da je ocijenjeno je 10 od 10 37 00:02:09,130 --> 00:02:11,900 za ozbiljnost od strane Nacionalnog Ranjivost baze. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 svih web poslužitelja su na rizik, uključujući i neke Mac računala. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Pa, pobrinite se da krpa svoje sustave sada. 42 00:02:25,600 --> 00:02:29,330 Svatko hosting web stranice trčanje pogođenim operacijski sustavi 43 00:02:29,330 --> 00:02:31,800 treba poduzeti što je prije moguće. 44 00:02:31,800 --> 00:02:35,390 Svatko tko može priuštiti to treba izgledati za njihovo praćenje i web aplikacija 45 00:02:35,390 --> 00:02:37,355 firewall paziti na bilo napada. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 Zvučnik 3: Najgora stvar da bi se moglo dogoditi je 48 00:02:41,770 --> 00:02:45,080 da bi netko napisati kod koji će automatski otići i skeniranje 49 00:02:45,080 --> 00:02:48,280 Internet i da će utjecati na svim tim računalima. 50 00:02:48,280 --> 00:02:50,710 I kad su to učiniti, dobro, Najgore što se može učiniti 51 00:02:50,710 --> 00:02:53,300 je samo izbrisati sve, ili zatvorio web stranice prema dolje. 52 00:02:53,300 --> 00:02:55,360 Tako smo mogli vidjeti štetu od te točke gledišta, 53 00:02:55,360 --> 00:02:58,300 gdje bi Zlobnici koji je upravo odluče izazvati pustoš 54 00:02:58,300 --> 00:03:02,534 dovođenjem sustava dolje ili brisanje datoteke, i takve stvari. 55 00:03:02,534 --> 00:03:05,200 ZVUČNIK 2: Neki kažu da je ovo jedan od najtežih za mjerenje 56 00:03:05,200 --> 00:03:08,080 bube u godinama, i to može potrajati tjednima ili čak 57 00:03:08,080 --> 00:03:10,820 mjeseci kako bi se utvrdilo konačan učinak. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> Zvučnik 1: Dakle, sve je to istina, ali smiješno je, gotovo sve 60 00:03:15,560 --> 00:03:18,330 od slika koje ste upravo vidjeli, osim možda na tipkovnici, 61 00:03:18,330 --> 00:03:20,930 nema nikakve veze s Bug god. 62 00:03:20,930 --> 00:03:23,960 Serveri i žice i tako dalje, To je vrsta tangencijalno povezano, 63 00:03:23,960 --> 00:03:27,410 ali u srži je zapravo prilično upoznati ono što se ovdje događa. 64 00:03:27,410 --> 00:03:30,050 U stvari, pustite me u Naš CS50 aparata. 65 00:03:30,050 --> 00:03:32,910 Dopustite mi ići naprijed i povećali Terminal prozor ovdje. 66 00:03:32,910 --> 00:03:36,020 A ti dečki su pomoću toga, ili ugrađen verziju istog, 67 00:03:36,020 --> 00:03:39,460 u gedit kako pisati programe, upišite naredbe, i tako dalje, 68 00:03:39,460 --> 00:03:43,690 , a to je zapravo, i ima bio tjednima, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 To je Bourne-opet ljuska, koji je samo fancy način govoreći, 70 00:03:46,890 --> 00:03:50,220 To je program koji ima treperi brz, učinkovit, 71 00:03:50,220 --> 00:03:51,970 koji sjedi tamo čeka za ulaz za vas. 72 00:03:51,970 --> 00:03:53,920 I to je naredba linija sučelje preko kojega 73 00:03:53,920 --> 00:03:57,650 ti dečki su trčanje naredbe i konačnici sastavljanje i onda trčanje 74 00:03:57,650 --> 00:03:58,400 programi. 75 00:03:58,400 --> 00:04:01,320 >> No, bash je i programiranje jezik u sljedećem smislu. 76 00:04:01,320 --> 00:04:05,460 Vi znate da postoje naredbe poput CD i LS i zveket i drugi, 77 00:04:05,460 --> 00:04:09,580 ali možete definirati svoje vlastite naredbe tako da ih provodi u Bash. 78 00:04:09,580 --> 00:04:11,420 Sada mi ne idemo u ići u pojedinosti 79 00:04:11,420 --> 00:04:16,089 kao da Bash programski jezik, ali Znam, primjerice, da je u ovom trenutku, 80 00:04:16,089 --> 00:04:17,607 ne postoji naredba zove "Zdravo." 81 00:04:17,607 --> 00:04:19,440 Dakle, može se naći u jedan od ovih paketa. 82 00:04:19,440 --> 00:04:20,856 To nije instaliran na mom računalu. 83 00:04:20,856 --> 00:04:21,870 Pitajte administratora. 84 00:04:21,870 --> 00:04:26,030 No, ako želim da postoji program pod nazivom "Hello" u Bash ili na moj redak 85 00:04:26,030 --> 00:04:30,810 Ja zapravo mogu koristiti sintaksu da je kao što je prilično C. To nije sasvim isti, 86 00:04:30,810 --> 00:04:35,020 ali to izgleda prilično slično funkcija, iako nedostaju neke pojedinosti. 87 00:04:35,020 --> 00:04:38,090 Ništa se čini da se dogodi, ali sada, ako sam tip "Hello" 88 00:04:38,090 --> 00:04:40,960 zapravo možete pisati Program, a ne u C, a ne u Javi, 89 00:04:40,960 --> 00:04:44,280 ne u nekom drugom programu jezik, ali u Bash sama. 90 00:04:44,280 --> 00:04:47,630 >> Sada ključ ovdje je da sam pisao imenovati Htio sam dati ovu novu naredbu, 91 00:04:47,630 --> 00:04:50,820 a zagrade su također simboliku jer je to funkcija. 92 00:04:50,820 --> 00:04:54,010 Kao na stranu, također možete napraviti zabavu stvari, i zapravo, čak i na Mac OS, 93 00:04:54,010 --> 00:04:55,620 To je program koji se zove terminal. 94 00:04:55,620 --> 00:04:58,800 Ona dolazi s ugrađenim u bilo tko je računalo koje ima Mac u ovoj sobi, 95 00:04:58,800 --> 00:05:03,640 , a možete napraviti slične stvari u Mac OS, ali možete ići još dalje od toga. 96 00:05:03,640 --> 00:05:07,110 A to je malo tangencijalno, ali to je neka vrsta zabave. 97 00:05:07,110 --> 00:05:09,715 Toga sam se sjetio jutros, kada razmišljam o ovome, 98 00:05:09,715 --> 00:05:13,279 od malo igra sam se igrala s jednim od CS50 bivših TFS 99 00:05:13,279 --> 00:05:16,570 pri čemu svaki put kad bi otići od njegova tipkovnica s njegovom ekranu otključana, 100 00:05:16,570 --> 00:05:23,611 Ja bih izvršiti naredbu kao ovo-- "pozdraviti". 101 00:05:23,611 --> 00:05:26,610 I sada svaki put kad bi se vratio na njegov tipkovnice nakon što sam očistio ekran 102 00:05:26,610 --> 00:05:27,985 i on će sjesti, pokušati napraviti neki posao, 103 00:05:27,985 --> 00:05:29,250 popis sadržaj svojoj directory-- 104 00:05:29,250 --> 00:05:29,510 >> [Audio reprodukcije] 105 00:05:29,510 --> 00:05:30,010 >> Halo. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Pozdrav. 108 00:05:32,120 --> 00:05:35,030 >> Zvučnik 1: Dakle, u pravednosti, to zapravo nije "zdravo". 109 00:05:35,030 --> 00:05:36,894 To je obično nešto više srodan to-- 110 00:05:36,894 --> 00:05:37,560 [Audio reprodukcije] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 Zvučnik 1: --that sam would-- tako da bi njegovo računalo 113 00:05:39,320 --> 00:05:42,170 Kunem se u njega u bilo koje vrijeme je on zapravo sjeo za tipkovnicu. 114 00:05:42,170 --> 00:05:46,265 I vrlo brzo je shvatio Ne napustiti njegov zaslon otključan. 115 00:05:46,265 --> 00:05:48,730 No, to ukazuje na neku vrstu glupo zabave koja vas 116 00:05:48,730 --> 00:05:50,210 Možete imati nešto poput Bash. 117 00:05:50,210 --> 00:05:52,770 Ali to je malo više ozbiljno, kako bi bili sigurni, od toga. 118 00:05:52,770 --> 00:05:57,235 A u stvari, to je jedan od najopasniji i dugotrajan bugova 119 00:05:57,235 --> 00:05:58,860 da stvarno je hit u svijetu na globalnoj razini. 120 00:05:58,860 --> 00:06:02,060 Ovaj bug je oko za 20-ak godina 121 00:06:02,060 --> 00:06:05,780 a vi ćete biti pogođen u samo Trenutak po relativne jednostavnosti. 122 00:06:05,780 --> 00:06:07,990 >> Dakle, to je predstavnik zapovijedam da ako vas 123 00:06:07,990 --> 00:06:10,448 posjedujete Mac, doslovno odmah kada imate svoj poklopac otvoren, 124 00:06:10,448 --> 00:06:12,940 možete pokušati upisivanjem u to Program se zove terminal. 125 00:06:12,940 --> 00:06:15,410 Terminal je pod Prijave Utilities-- 126 00:06:15,410 --> 00:06:18,790 jednom, Windows korisnici ne moraju brinuti o ovom konkretnom threat-- 127 00:06:18,790 --> 00:06:22,310 ali one od vas s Macove možete upisati ovo u prozor kao da ću napraviti ovdje, 128 00:06:22,310 --> 00:06:24,210 i ako ne upišete da se u tom programu 129 00:06:24,210 --> 00:06:28,830 zove terminal, kao što ću učiniti sada, ako vidite riječ "ranjiva", 130 00:06:28,830 --> 00:06:32,200 računalo ranjivi. 131 00:06:32,200 --> 00:06:33,850 >> Sada, što to zapravo znači? 132 00:06:33,850 --> 00:06:35,870 A to je, doduše, neki prilično ludo sintakse, 133 00:06:35,870 --> 00:06:39,050 ali neka je barem izvući neke od zanimljivih aspekata. 134 00:06:39,050 --> 00:06:42,567 Dakle, postoji neki sintaksa koja izgleda Malo poznati, barem iz C 135 00:06:42,567 --> 00:06:43,950 i programiranja općenito. 136 00:06:43,950 --> 00:06:47,550 Vidim neke zagrade, zarezom, kovrčava aparatića, i kao što, 137 00:06:47,550 --> 00:06:50,820 ali ispada da je ova glupa stvar ovdje u žutom 138 00:06:50,820 --> 00:06:53,580 u biti funkciju da ne radi ništa. 139 00:06:53,580 --> 00:06:57,840 Debelog crijeva znači ne raditi ništa, a zarez znači prestati raditi ništa. 140 00:06:57,840 --> 00:07:00,250 Dakle, unutar tih vitičastim zagradama, činjenica 141 00:07:00,250 --> 00:07:02,440 da imam jednaka prijavite se lijevo, to 142 00:07:02,440 --> 00:07:05,500 je u biti stvaranje naredbe, ili promjenjiva, 143 00:07:05,500 --> 00:07:09,520 zove x, i to dodjeljivanje da je žuta malo koda postoji. 144 00:07:09,520 --> 00:07:14,040 To bi moglo biti nešto poput "jeke Halo "ili" kažu piskutavi "ili tako nešto 145 00:07:14,040 --> 00:07:15,120 slično tome. 146 00:07:15,120 --> 00:07:17,780 No primijetite li svojim očima lutati dalje na desno, 147 00:07:17,780 --> 00:07:22,150 ima još na toj liniji od samo kraj tog zarezom. 148 00:07:22,150 --> 00:07:25,160 "Echo ranjiva", a zatim izvan toga postoji još više. 149 00:07:25,160 --> 00:07:26,530 Još jedan zarez, bash -c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Dakle, ne duljimo, Ova linija koda 152 00:07:34,050 --> 00:07:36,660 dovoljno za uvjerljiv Računalo koje je 153 00:07:36,660 --> 00:07:39,830 ranjiva na radiš nešto da li želite to učiniti, 154 00:07:39,830 --> 00:07:44,290 jer postoji bug u Bash pri čemu iako bash je trebao zaustaviti 155 00:07:44,290 --> 00:07:48,980 čitanje linijom zapovijedanja prava tamo nakon žutog teksta, 156 00:07:48,980 --> 00:07:52,520 za 20-plus godina star bug, Bash je zapravo bio čitanje 157 00:07:52,520 --> 00:07:56,780 Iznad toga zarezom i prilično koliko radiš ono što je rekla. 158 00:07:56,780 --> 00:07:59,070 >> Dakle, što je implikacija od toga u konačnici? 159 00:07:59,070 --> 00:08:01,340 Samo sam rekao "odjek Hello" ili "echo ranjiva" 160 00:08:01,340 --> 00:08:05,449 No, što ako ste učinili nešto zapravo zlonamjerni, kao što su rm-rf *, 161 00:08:05,449 --> 00:08:07,240 koje možda nećete ikada upisali prije, 162 00:08:07,240 --> 00:08:08,920 i iskreno vjerojatno ne treba prerano, 163 00:08:08,920 --> 00:08:10,700 jer možete napraviti Puno štete s njom. 164 00:08:10,700 --> 00:08:11,210 Zašto? 165 00:08:11,210 --> 00:08:12,990 RM što radi, naravno? 166 00:08:12,990 --> 00:08:14,270 Uklanja. 167 00:08:14,270 --> 00:08:15,930 * Znači što? 168 00:08:15,930 --> 00:08:16,430 Sve. 169 00:08:16,430 --> 00:08:18,180 Dakle, to je tzv wild card, tako da to znači 170 00:08:18,180 --> 00:08:20,410 izbrisati sve što je u trenutna imenik. 171 00:08:20,410 --> 00:08:23,379 r se događa da znači rekurzivna, što znači ako je ono što brisanja 172 00:08:23,379 --> 00:08:26,420 je katalog, i iznutra postoji je druga slika i druge direktorije, 173 00:08:26,420 --> 00:08:28,950 rekurzivno zaroniti u tu i izbrisati sve to. 174 00:08:28,950 --> 00:08:31,040 I f je najgora od svih. 175 00:08:31,040 --> 00:08:32,580 Zna li itko što znači f ovdje? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Sila. 178 00:08:34,360 --> 00:08:37,830 Dakle prisiliti sredstva, čak i ako je to loša ideja, 179 00:08:37,830 --> 00:08:40,939 to učiniti bez mene pitajući za daljnju potvrdu. 180 00:08:40,939 --> 00:08:43,230 Pa, znate, mi se smijati to, ali iskreno, ja vjerojatno 181 00:08:43,230 --> 00:08:44,972 upišite ovaj više puta dan, jer je stvarnost 182 00:08:44,972 --> 00:08:47,210 je da je najbrži način da se izbrisali hrpu stvari. 183 00:08:47,210 --> 00:08:48,590 No, čak sam učinio neke štete. 184 00:08:48,590 --> 00:08:53,100 >> Ali, ako ste bili na trik računala u definiranju neke glupe varijablu 185 00:08:53,100 --> 00:08:56,810 ili funkcija zove x, ali onda tjeranjem računalo u izvršavanju 186 00:08:56,810 --> 00:09:00,030 izvan granica koje funkcija, iza tog zarezom, 187 00:09:00,030 --> 00:09:04,430 vi doista mogao izigrati računalo u izvršavanju nešto kao rm-rf 188 00:09:04,430 --> 00:09:07,810 ili e-naredba ili Kopiraj naredbe. 189 00:09:07,810 --> 00:09:11,400 Sve doslovce možete učiniti s računalo, bilo da je brisanje datoteka, 190 00:09:11,400 --> 00:09:15,350 kreiranje datoteke, spam nekoga, napadaju neki server na daljinu, 191 00:09:15,350 --> 00:09:17,190 ako ga može izraziti s naredbom, što 192 00:09:17,190 --> 00:09:19,120 može izigrati računalo na taj događaj. 193 00:09:19,120 --> 00:09:21,510 >> Sad, što je primjer kako ste mogli to učiniti? 194 00:09:21,510 --> 00:09:24,300 Pa, ima puno računala na Internetu trčanje Bash. 195 00:09:24,300 --> 00:09:26,390 Svi od nas korisnike Mac računala su među njima. 196 00:09:26,390 --> 00:09:30,390 Puno Linux poslužitelja su među ih, kao i Unix poslužitelja. 197 00:09:30,390 --> 00:09:32,630 Prozori opet dobiva Relativno izvući iz nevolje 198 00:09:32,630 --> 00:09:34,590 osim ako ste instalirali poseban softver. 199 00:09:34,590 --> 00:09:37,130 Sada puno poslužitelja, za instanca, izvode web poslužitelji, 200 00:09:37,130 --> 00:09:39,840 i zapravo Linux je možda najpopularniji operativni sustav 201 00:09:39,840 --> 00:09:43,060 za rad na računalima na internetu koji su služeći se web stranice. 202 00:09:43,060 --> 00:09:44,910 Sada kao što ćemo kasnije vidjeti u semestru, kada 203 00:09:44,910 --> 00:09:48,470 šaljete zahtjev Vaš browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- na udaljenom poslužitelju, 205 00:09:50,790 --> 00:09:53,730 ispada da iako ste upravo upisali www.example.com, 206 00:09:53,730 --> 00:09:59,590 Vaš preglednik šalje poruku to je malo više kompliciranih, kao što je ovaj. 207 00:09:59,590 --> 00:10:01,239 >> Ali primijetiti malo nešto čudno. 208 00:10:01,239 --> 00:10:03,030 Prve dvije linije Nikad prije nisam vidio, 209 00:10:03,030 --> 00:10:04,904 ali oni ne izgledaju Posebno opasne. 210 00:10:04,904 --> 00:10:08,030 Ali primijetiti ono što sam ukrao za treću liniju ovdje. 211 00:10:08,030 --> 00:10:13,390 Ako negativac su poslati poruku kao što je ovaj iz svog računala 212 00:10:13,390 --> 00:10:17,270 ranjivoj Mac ili ranjiva Linux poslužitelj, 213 00:10:17,270 --> 00:10:21,580 Smiješno je da bash, tako jednostavno malo naredbenog retka, 214 00:10:21,580 --> 00:10:27,450 je sveprisutan i često je naviknuti na osnovi izvršiti 215 00:10:27,450 --> 00:10:30,020 Sadržaj Poruka koja se prima. 216 00:10:30,020 --> 00:10:33,490 I po toj logici, možete trik web poslužitelj, dakle, 217 00:10:33,490 --> 00:10:36,370 slanjem nešto slično Korisnički agent, koji se obično 218 00:10:36,370 --> 00:10:38,300 je trebao reći naziv web pregledniku. 219 00:10:38,300 --> 00:10:42,420 Korisnički agent Chrome, User-agent internetu Explorer, User-agent Firefox, ovo 220 00:10:42,420 --> 00:10:44,590 je samo vaš preglednik a način poistovjećujući. 221 00:10:44,590 --> 00:10:46,605 Ali ako negativac vrlo pametno kaže, mm-mm, ja sam 222 00:10:46,605 --> 00:10:47,930 Ne ide ti reći ono što je moj preglednik, 223 00:10:47,930 --> 00:10:50,888 Ja sam umjesto toga će vam poslati ovo zagonetna izgleda stvar s rm-rf 224 00:10:50,888 --> 00:10:55,840 * U njemu, možete doslovno trik ranjivi web poslužitelj na internetu 225 00:10:55,840 --> 00:10:59,055 u izvršavanju točno da je u tu za brisanje svih datoteka. 226 00:10:59,055 --> 00:11:00,930 I iskreno, to nije čak i najgore od njega. 227 00:11:00,930 --> 00:11:01,763 To možete učiniti ništa. 228 00:11:01,763 --> 00:11:04,480 Ti bi mogao početi distribuirati denial of service napada 229 00:11:04,480 --> 00:11:07,030 ako je poslao ovu poruku cijeli trsovi web poslužitelja 230 00:11:07,030 --> 00:11:10,256 a zatim ih je sve spustiti, za primjer, na Harvard.edu poslužiteljima, 231 00:11:10,256 --> 00:11:12,130 , a možete sortirati od prasak pakao iz njih 232 00:11:12,130 --> 00:11:15,490 strane mrežnog prometa koji je bio inače pokreću ove negativca. 233 00:11:15,490 --> 00:11:18,760 >> Dakle, ne duljimo, gotovo svatko u ovoj sobi koji posjeduje Mac 234 00:11:18,760 --> 00:11:20,240 je osjetljiva na to. 235 00:11:20,240 --> 00:11:24,100 Srebro podstava je da ako nisi pokrenut web poslužitelj na prijenosnom računalu, 236 00:11:24,100 --> 00:11:27,780 i ako ste zapravo konfiguriran to dopustiti nešto poput SSH u nju, 237 00:11:27,780 --> 00:11:28,670 ti si zapravo sigurna. 238 00:11:28,670 --> 00:11:31,710 To je ranjiva, ali nema jedan težak da biste dobili u svoj laptop, 239 00:11:31,710 --> 00:11:33,290 tako da možete na neki način biti sigurni. 240 00:11:33,290 --> 00:11:36,210 Međutim, Apple će uskoro biti ažuriranje popraviti za to. 241 00:11:36,210 --> 00:11:39,660 Svijet Linux je već pušten broj grešaka za Fedora i Ubuntu 242 00:11:39,660 --> 00:11:43,790 i druge verzije Linux, i doista ako naiđete ažuriranje 50 u aparatu, 243 00:11:43,790 --> 00:11:45,930 čak i da previše će biti obnovljeno i ispraviti. 244 00:11:45,930 --> 00:11:47,764 No, da previše nije Stvarno je ranjiva, 245 00:11:47,764 --> 00:11:49,804 jer ako ste tinkered s aparatom 246 00:11:49,804 --> 00:11:52,770 i napravio svoj laptop javno dostupni na internetu, što nije 247 00:11:52,770 --> 00:11:54,910 po defaultu, ste zapravo bilo u redu, jer 248 00:11:54,910 --> 00:11:56,890 od firewall i drugim tehnikama. 249 00:11:56,890 --> 00:12:01,000 >> No, to je ekstremni primjer bug da smo živjeli za doslovno 20 250 00:12:01,000 --> 00:12:04,050 godine, a tko zna, ako je netko sve ovo vrijeme nije znao o tome? 251 00:12:04,050 --> 00:12:06,300 A u stvari, to je jedan od temeljni izazovi 252 00:12:06,300 --> 00:12:08,690 kako ćemo vidjeti kasnije u semestar o sigurnosti, 253 00:12:08,690 --> 00:12:13,020 je, baš kao u stvarnom svijetu, dobri dečki su u nepovoljnom položaju. 254 00:12:13,020 --> 00:12:16,500 Da bi negativci van, moramo pobrinite se da svaka vrata zaključana, 255 00:12:16,500 --> 00:12:20,340 da je svaki prozor je siguran, da svaka točka ulaska u dom 256 00:12:20,340 --> 00:12:21,980 je siguran da bi negativci van. 257 00:12:21,980 --> 00:12:26,870 No, što se negativac moraju učiniti da se zapravo kompromis svoj dom 258 00:12:26,870 --> 00:12:28,200 i kradu od vas? 259 00:12:28,200 --> 00:12:32,574 On ili ona jednostavno mora naći jedan otključan vrata, jedan razbijeni prozor, ili tako nešto 260 00:12:32,574 --> 00:12:35,240 u tom smjeru, a to je Ista stvar u računalnoj sigurnosti. 261 00:12:35,240 --> 00:12:37,660 Možemo pisati milijune linija programskog koda 262 00:12:37,660 --> 00:12:40,570 i potrošiti stotine ili tisuće sati pokušavaju dobiti to ispraviti, 263 00:12:40,570 --> 00:12:43,370 ali ako bi samo jedan pogreška u ispravnost, 264 00:12:43,370 --> 00:12:47,030 možete staviti cijeli sustav i Doista, u ovom slučaju, cijeli internet 265 00:12:47,030 --> 00:12:48,660 i svijet u opasnosti. 266 00:12:48,660 --> 00:12:51,950 >> Dakle, ako želite saznati više o tome, ići na ovaj URL ovdje. 267 00:12:51,950 --> 00:12:54,450 Nema potrebe za akciju Večeras, osim ako ste 268 00:12:54,450 --> 00:12:57,116 među onima ugodnije da su pokretanje vlastitog weba 269 00:12:57,116 --> 00:12:59,810 poslužitelja, u kojem slučaju bi trebali, u stvari, ažurirajte softver. 270 00:12:59,810 --> 00:13:03,244 >> I ovo je naslov govor, a sada papira, 271 00:13:03,244 --> 00:13:05,410 da smo povezani na Naravno stranice je za danas. 272 00:13:05,410 --> 00:13:07,600 To je za momka zove Ken Thompson, koji je 273 00:13:07,600 --> 00:13:10,120 je prihvaćanje vrlo poznati Nagrada u računalnoj znanosti, 274 00:13:10,120 --> 00:13:13,495 i on je dao ovaj govor nekoliko godina Prije, u biti na ovoj istoj temi. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Pitajući ljudi pitanje, trebali ste stvarno 277 00:13:20,520 --> 00:13:23,480 povjerenja, u konačnici, Softver koji ste dobili? 278 00:13:23,480 --> 00:13:26,100 Na primjer, svi mi imamo pisanje programa, 279 00:13:26,100 --> 00:13:27,820 a mi smo bili sastavljanja ih s jeka. 280 00:13:27,820 --> 00:13:31,830 I na svom znanju, što ste napisali svi programi za CS50 gdje postoji 281 00:13:31,830 --> 00:13:35,310 stražnja vrata sorti, postoji način da je loš čovjek, ako se izvodi svoj program, 282 00:13:35,310 --> 00:13:37,410 mogla preuzeti svoje računalo? 283 00:13:37,410 --> 00:13:38,310 Vjerojatno ne, zar ne? 284 00:13:38,310 --> 00:13:40,180 Mario, i pohlepni, i Credit. 285 00:13:40,180 --> 00:13:41,680 Sve su to prilično mali programi. 286 00:13:41,680 --> 00:13:43,910 Morao bi biti prilično loše ako vas zapravo 287 00:13:43,910 --> 00:13:47,310 je cijelo računalo ranjivim Nakon pisanja 10 ili 20 linija koda, 288 00:13:47,310 --> 00:13:49,690 ili barem svjesni nekih sigurnosnih implikacija. 289 00:13:49,690 --> 00:13:52,023 Sada sam reći da u šali, ali ćemo vidjeti danas 290 00:13:52,023 --> 00:13:54,600 a ovaj tjedan je zapravo jako, jako jednostavno 291 00:13:54,600 --> 00:13:57,980 kako bi bilo loše i napraviti još kratki programi ranjivi. 292 00:13:57,980 --> 00:14:02,880 >> Ali za sada, barem, shvatite da je pitanje pitao ovdje 293 00:14:02,880 --> 00:14:04,850 je oko jeka u prevodilac. 294 00:14:04,850 --> 00:14:08,360 Zašto smo bili vjerujući Zveket za posljednje dvije ili tri tjedna? 295 00:14:08,360 --> 00:14:12,650 Tko kaže da onaj tko je napisao Zveket nisu imali "ako" stanje u tu 296 00:14:12,650 --> 00:14:17,680 da je u biti ubrizgava neke nule i one u svakom programu se sastavlja 297 00:14:17,680 --> 00:14:21,180 da bi neka ili njezin pristup vaše računalo kada ste spavali 298 00:14:21,180 --> 00:14:23,580 i vaš laptop poklopac otvoren i vaše računalo radi? 299 00:14:23,580 --> 00:14:24,080 Zar ne? 300 00:14:24,080 --> 00:14:28,350 Imamo ovu vrstu prava čast sustava Sada, gdje vjerujemo da Zveket je čitljiv. 301 00:14:28,350 --> 00:14:30,000 Vi vjerujete da je aparat čitljiv. 302 00:14:30,000 --> 00:14:34,430 Vi vjerujete da je doslovno svaki program na vašem Mac ili PC je pouzdan. 303 00:14:34,430 --> 00:14:37,510 I kao što je ova jednostavna bug sugerira, čak i ako to nije zlonamjerno, 304 00:14:37,510 --> 00:14:40,580 to je apsolutno ne vjerojatno da će biti slučaj. 305 00:14:40,580 --> 00:14:42,350 >> Tako da bi trebao biti uplašen kao pakao. 306 00:14:42,350 --> 00:14:45,560 Iskreno, ne postoji jednostavan rješenje za taj drugi 307 00:14:45,560 --> 00:14:48,185 nego neka vrsta društvene svijesti sve veće složenosti 308 00:14:48,185 --> 00:14:50,310 da smo zgrada na vrhu od naših računalnih sustava, 309 00:14:50,310 --> 00:14:53,740 i kako sve više ranjiva možemo biti jako dobro. 310 00:14:53,740 --> 00:14:55,570 >> Sada s tim, rekao je, bijeg. 311 00:14:55,570 --> 00:14:59,889 Dakle, bijeg je problema postaviti tri, a Bijeg je igra od prošle 312 00:14:59,889 --> 00:15:02,180 da biste mogli sjetiti, ali za nas u problemu postaviti tri, 313 00:15:02,180 --> 00:15:04,450 što nam omogućuje da se stvari vratiti na višu razinu 314 00:15:04,450 --> 00:15:08,880 tako da kad smo pisanje programa, čak iu prozor terminala kao što je ovaj, 315 00:15:08,880 --> 00:15:14,670 mi zapravo može raditi, u konačnici, grafički programi ne 316 00:15:14,670 --> 00:15:17,800 za razliku od onih koje smo imali pristup u nule. 317 00:15:17,800 --> 00:15:20,910 Dakle, ovo je osoblja Provedba bijeg, 318 00:15:20,910 --> 00:15:23,930 što je upravo to cigla-razbijanje igra, da li premjestiti svoje veslo natrag 319 00:15:23,930 --> 00:15:27,590 i naprijed, a vi udariti loptu protiv onih boje cigle do vrha. 320 00:15:27,590 --> 00:15:30,020 Dakle, ovo je nas dovodi vrsta natrag do mjesta gdje 321 00:15:30,020 --> 00:15:33,180 bili smo u mogućnosti da se vrlo brzo s nule, a sada sa C, 322 00:15:33,180 --> 00:15:35,800 provedbu vlastitih grafičko korisničko sučelje. 323 00:15:35,800 --> 00:15:38,960 >> No, više od toga, to Problem skup prvi 324 00:15:38,960 --> 00:15:41,000 u kojima dajemo vi hrpa koda. 325 00:15:41,000 --> 00:15:43,940 A u stvari, sam donijeti eksplicitno pozornost na to, jer je posebno 326 00:15:43,940 --> 00:15:47,090 za one manje udobno, ovo Problem postaviti, barem na prvi pogled, 327 00:15:47,090 --> 00:15:49,170 će se osjećati kao mi smo ga uzeti gore zarezati. 328 00:15:49,170 --> 00:15:51,540 Zato smo vam dao, za neke pretraživanja 329 00:15:51,540 --> 00:15:54,930 i sortiranje probleme u pset, hrpa koda koji smo pisali, 330 00:15:54,930 --> 00:15:56,680 i par komentara da kažu "učiniti" 331 00:15:56,680 --> 00:15:58,221 u kojoj morate ispuniti praznine. 332 00:15:58,221 --> 00:16:00,020 Dakle, ne previše zastrašujuće, ali to je prvi put 333 00:16:00,020 --> 00:16:03,370 mi smo ti predaje kod koji trebate Prvi čitati, razumjeti, a zatim dodati 334 00:16:03,370 --> 00:16:04,290 i završiti ga. 335 00:16:04,290 --> 00:16:05,940 >> I onda sa bijeg, ćemo učiniti isto, 336 00:16:05,940 --> 00:16:08,740 dajući vam nekoliko desetaka više linija koda koji, iskreno rečeno, daju ti 337 00:16:08,740 --> 00:16:11,490 Puno okvira za igra, ali stajemo 338 00:16:11,490 --> 00:16:14,304 provedbenih cigle i loptu i veslo, 339 00:16:14,304 --> 00:16:15,970 ali mi provesti neke druge značajke. 340 00:16:15,970 --> 00:16:18,280 A čak i da je na prvi pogled, opet, pogotovo ako je manje ugodno, 341 00:16:18,280 --> 00:16:21,480 može činiti osobito zastrašujuće i misliš da ima mnogo novih funkcija 342 00:16:21,480 --> 00:16:24,070 morate wrap your mind okolo, i to je istina. 343 00:16:24,070 --> 00:16:26,281 No, imajte na umu, da je prilično poput nule. 344 00:16:26,281 --> 00:16:28,780 Izgledi su da ne koriste sve slagalice u nule. 345 00:16:28,780 --> 00:16:31,120 Tečajevi su vam nije stalo da zamotate vaš um oko svih njih 346 00:16:31,120 --> 00:16:33,617 jer sve što je bilo Brzi pogled shvatiti, oh, 347 00:16:33,617 --> 00:16:35,450 to je ono što ja mogu učiniti s tim puzzle komad. 348 00:16:35,450 --> 00:16:38,260 I doista, u problemu postaviti 3 spec, mi ćemo vas uputiti 349 00:16:38,260 --> 00:16:41,370 na dokumentaciji koja će Vas upoznati s nekim novim funkcijama, 350 00:16:41,370 --> 00:16:43,570 i na kraju programiranje konstruira koristite. 351 00:16:43,570 --> 00:16:47,610 Uvjeti, petlje, varijable i funkcije 352 00:16:47,610 --> 00:16:50,720 biti jednake ono što smo do sada vidjeli. 353 00:16:50,720 --> 00:16:53,560 >> Pa zaista, ono što ćemo dati što je neki uzorak koda koji 354 00:16:53,560 --> 00:16:56,110 Omogućuje stvaranje prozora da ne gleda razliku od toga, 355 00:16:56,110 --> 00:16:59,540 i na kraju se to pretvorilo u nešto sasvim kao što je ovaj. 356 00:16:59,540 --> 00:17:02,250 Dakle iskoristiti CS50, raspravljati radno vrijeme i više, 357 00:17:02,250 --> 00:17:05,290 i uzeti utjehu u činjenici da količina koda morate pisati 358 00:17:05,290 --> 00:17:06,760 zapravo nije sve toliko. 359 00:17:06,760 --> 00:17:10,359 Prvi izazov je samo da se vrati sebi da nekog koda smo pismeni. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Bilo kakva pitanja o pset3, Potres mozga, ili na neki drugi način? 362 00:17:15,810 --> 00:17:19,226 >> PUBLIKA: Činilo se kao ide kroz s bijeg 363 00:17:19,226 --> 00:17:22,154 da je kod gotovo objektno-orijentirani stil, 364 00:17:22,154 --> 00:17:24,675 ali mislio sam C je objektno-orijentirane programa. 365 00:17:24,675 --> 00:17:26,050 Zvučnik 1: izvrsno pitanje. 366 00:17:26,050 --> 00:17:28,258 Tako je u potrazi kroz distribucija broj, broj 367 00:17:28,258 --> 00:17:30,180 smo napisali za pset3, za one koji poznaju, to 368 00:17:30,180 --> 00:17:32,230 Izgleda kao da je Malo objektno-orijentirane. 369 00:17:32,230 --> 00:17:33,800 Kratak odgovor je, to je. 370 00:17:33,800 --> 00:17:38,130 To je aproksimacija kako ste moglo učiniti objektno-orijentirane kod pomoću 371 00:17:38,130 --> 00:17:41,850 jezik poput C, ali je Još uvijek u konačnici proceduralne. 372 00:17:41,850 --> 00:17:44,900 Ne postoje metode unutrašnjost varijable, kao što ćete vidjeti. 373 00:17:44,900 --> 00:17:46,180 No to podsjeća na to. 374 00:17:46,180 --> 00:17:48,780 I vidjet ćemo taj lik opet kad dođemo na PHP i JavaScript 375 00:17:48,780 --> 00:17:49,946 prema kraju semestra. 376 00:17:49,946 --> 00:17:53,667 Ali za sada, mislim da je to što je nagovještaj onoga što će doći. 377 00:17:53,667 --> 00:17:54,250 Dobro pitanje. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 U redu. 380 00:17:56,550 --> 00:17:59,730 Dakle spajaju svojevrsni je kako smo lijevi stvari zadnji put. 381 00:17:59,730 --> 00:18:03,250 I spajanje svojevrsni je cool u Osjećaj da je toliko brži, 382 00:18:03,250 --> 00:18:07,100 barem na temelju povrsan testovima smo učinili prošli tjedan, nego, recimo, mjehura 383 00:18:07,100 --> 00:18:08,710 sortiranje, odabir sortirati, umetanje vrst. 384 00:18:08,710 --> 00:18:11,780 A što je bio uredan previše je samo Kako jezgrovito i čisto 385 00:18:11,780 --> 00:18:12,810 možete ga izraziti. 386 00:18:12,810 --> 00:18:15,840 A ono što smo rekli da je gornja vezan na trčanje vrijeme spajanja 387 00:18:15,840 --> 00:18:16,340 sortirati? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Da? 390 00:18:18,495 --> 00:18:19,360 >> PUBLIKA: n log n? 391 00:18:19,360 --> 00:18:20,819 >> Zvučnik 1: n log n, zar ne. n log n. 392 00:18:20,819 --> 00:18:23,776 A mi ćemo se vratiti na ono što zapravo znači i gdje da dolazi, 393 00:18:23,776 --> 00:18:25,570 ali ovo je bio bolji od onoga vremena rada 394 00:18:25,570 --> 00:18:28,440 kako smo vidjeli za mjehur odabir i umetanje neka vrsta? 395 00:18:28,440 --> 00:18:30,610 Dakle, n kvadrat. n na kvadrat je veći od toga, 396 00:18:30,610 --> 00:18:34,650 pa čak i ako to nije sasvim očito, Znam da je dnevnik je n manji od n, 397 00:18:34,650 --> 00:18:36,910 pa ako ne n puta nešto manji od n, 398 00:18:36,910 --> 00:18:38,680 to će biti manji od n na kvadrat. 399 00:18:38,680 --> 00:18:40,130 To je malo intuicije postoji. 400 00:18:40,130 --> 00:18:42,190 No platili smo cijenu za to. 401 00:18:42,190 --> 00:18:47,000 To je bio brži, ali tema koje je započeo rađati prošlog tjedna bio je to tradeoff. 402 00:18:47,000 --> 00:18:49,804 Dobio sam bolju izvedbu Vrijeme mudar, ali ono što 403 00:18:49,804 --> 00:18:52,470 nisam ja moram potrošiti na druge ruka, kako to postići? 404 00:18:52,470 --> 00:18:53,591 >> PUBLIKA: memorije. 405 00:18:53,591 --> 00:18:54,465 Zvučnik 1: Molim? 406 00:18:54,465 --> 00:18:55,173 PUBLIKA: memorije. 407 00:18:55,173 --> 00:18:57,040 Zvučnik 1: Memorija, ili prostor općenito. 408 00:18:57,040 --> 00:18:59,040 I to ne bilo super Očito s našim ljudima, 409 00:18:59,040 --> 00:19:02,240 ali podsjećaju da naši volonteri su iskoraku i intenziviranju 410 00:19:02,240 --> 00:19:04,780 natrag kao da postoji niz ovdje, i kao da postoji 411 00:19:04,780 --> 00:19:07,130 Drugi niz se ovdje su mogli koristiti, jer mi 412 00:19:07,130 --> 00:19:09,080 Potrebna negdje spojiti te ljude. 413 00:19:09,080 --> 00:19:11,480 Nismo mogli samo ih zamijeniti na mjestu. 414 00:19:11,480 --> 00:19:13,800 Dakle, spajanje sortiranja poluge više prostora, što 415 00:19:13,800 --> 00:19:15,620 nismo trebali s drugih algoritama, 416 00:19:15,620 --> 00:19:17,410 ali naopako je da je puno brže. 417 00:19:17,410 --> 00:19:20,780 I iskreno, u stvarnom svijetu prostoru to days-- RAM-a, tvrdi disk space-- 418 00:19:20,780 --> 00:19:25,030 je relativno jeftino, a da je nije nužno loša stvar. 419 00:19:25,030 --> 00:19:28,320 >> Tako ćemo uzeti brzi pogled, malo više sustavno, na ono što smo učinili 420 00:19:28,320 --> 00:19:30,220 i zašto mi je rekao da je n log n. 421 00:19:30,220 --> 00:19:33,260 Dakle, ovdje su osam brojeva i Osam volonteri imali smo zadnji put. 422 00:19:33,260 --> 00:19:35,718 A prva stvar koja Spoji Sortiranje nam je rekao da to bilo što? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 PUBLIKA: Podijeliti na dva dijela. 425 00:19:38,010 --> 00:19:38,663 Zvučnik 1: Molim? 426 00:19:38,663 --> 00:19:39,650 PUBLIKA: Podijeliti na dva dijela. 427 00:19:39,650 --> 00:19:40,610 Zvučnik 1: Podijeliti na dva dijela, u pravu. 428 00:19:40,610 --> 00:19:42,818 To je vrlo podsjeća telefonski imenik, od podjele 429 00:19:42,818 --> 00:19:44,220 i osvojiti više općenito. 430 00:19:44,220 --> 00:19:45,640 Tako smo gledali na lijevoj polovici. 431 00:19:45,640 --> 00:19:48,700 I onda kada smo rekli, neka vrsta lijeva polovica elemenata, 432 00:19:48,700 --> 00:19:49,690 Što smo naprijed rekli? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Sortirati lijevu polovicu lijevo pola, što nam je omogućilo da se, 435 00:19:54,860 --> 00:19:57,570 nakon podjele na dva dijela, usredotočiti na četiri i dva. 436 00:19:57,570 --> 00:20:01,280 >> Kako sortirati popis sada, u žuta, veličine dva, pomoću Spoji Sortiraj? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Pa ga podijelite na dva dijela, i sortiranje lijevu polovicu. 439 00:20:04,580 --> 00:20:07,100 I to je bilo mjesto gdje se stvari dobio malo glupo kratko. 440 00:20:07,100 --> 00:20:10,720 Kako sortirati popis koji je od jedna veličina, kao što je ovaj broj četiri ovdje? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 To je riješeno. 443 00:20:13,210 --> 00:20:14,200 Ti si učinio. 444 00:20:14,200 --> 00:20:17,300 >> Ali kako onda ste sortirati popis Veličina jedan kada je broj dva? 445 00:20:17,300 --> 00:20:21,640 Pa, ista stvar, ali sada ono što je bio treći i ključan korak u Merge Sortiraj? 446 00:20:21,640 --> 00:20:24,020 Imali ste spojiti lijevu pola i desna polovica. 447 00:20:24,020 --> 00:20:26,580 A kad smo to učinili, mi izgledao u četiri sata, gledali smo dva. 448 00:20:26,580 --> 00:20:28,750 Odlučili smo sve u redu, Očito dva na prvom mjestu, 449 00:20:28,750 --> 00:20:31,840 pa smo stavili dva u mjesto, a slijede četiri. 450 00:20:31,840 --> 00:20:35,010 A sada morate vrsta unatrag, i to je neka vrsta obilježje 451 00:20:35,010 --> 00:20:37,570 algoritma poput pisma Sortiranje, natrag u memoriju. 452 00:20:37,570 --> 00:20:40,240 Koji je sljedeći redak ove priče? 453 00:20:40,240 --> 00:20:41,780 Što bih trebao biti usredotočen na sljedeće? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Pravo polovica lijevo pola, što je šest i osam. 456 00:20:47,350 --> 00:20:50,320 >> Pa neka mi samo korak kroz ovo bez belaboring točku previše. 457 00:20:50,320 --> 00:20:53,330 Šest i osam, a zatim je šest razvrstani, osam sortira. 458 00:20:53,330 --> 00:20:57,190 Spoji ih zajedno kao što je to, i sad sljedeći veliki korak 459 00:20:57,190 --> 00:21:00,990 je, naravno, sortiranje desnu polovicu od Prvi korak ovog algoritma. 460 00:21:00,990 --> 00:21:02,870 Tako ćemo se usredotočiti na jedan, tri, sedam, pet. 461 00:21:02,870 --> 00:21:04,540 Tada smo se fokusirati na lijevoj polovici. 462 00:21:04,540 --> 00:21:09,400 Lijeva polovica da, u pravu polovica da, a zatim spojiti u jedan i tri. 463 00:21:09,400 --> 00:21:13,100 Zatim pravo na pola, a zatim napustio pola nje, a zatim pravo na pola od toga. 464 00:21:13,100 --> 00:21:15,985 Spoji ga na, i što sad korak dalje? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Spoji veliki lijevu polovicu i velika Pravo na pola, pa se ide dolje, 467 00:21:22,460 --> 00:21:27,330 zatim dva, zatim tri, pa četiri, a zatim pet, a zatim šest, zatim sedam, zatim osam. 468 00:21:27,330 --> 00:21:31,990 >> Tako sada zašto je to u konačnici otkriva, pogotovo ako n i logaritmi više 469 00:21:31,990 --> 00:21:35,487 općenito, a ti pobjegne, barem u posljednje vrijeme? 470 00:21:35,487 --> 00:21:37,070 Pa, primijetit visinu ovu stvar. 471 00:21:37,070 --> 00:21:41,230 Imali smo osam elemenata, a mi to podijeli s dva, s dva, s dva. 472 00:21:41,230 --> 00:21:44,590 Dakle, prijavite baze dvoje osam daje nam tri. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 I vjerujte mi na to, ako malo maglovit na tome. 475 00:21:48,540 --> 00:21:54,710 No, prijavite baze dvoje osam je tri, tako da smo učinili tri sloja spajanjem. 476 00:21:54,710 --> 00:21:57,170 A kad smo spojili elementi, kako mnogi elementi 477 00:21:57,170 --> 00:21:58,950 nije gledamo na svakom od tih redaka? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Ukupno n, zar ne? 480 00:22:01,437 --> 00:22:04,020 Zbog spojiti gornji red, iako smo to učinili parče, 481 00:22:04,020 --> 00:22:05,990 smo u konačnici dotaknuo svaki broj jednom. 482 00:22:05,990 --> 00:22:09,054 I u drugom redu, na spojiti te popise veličine dva, 483 00:22:09,054 --> 00:22:10,470 smo morali dotaknuti svaki element jednom. 484 00:22:10,470 --> 00:22:12,690 I onda ovdje stvarno jasno u zadnjem redu, 485 00:22:12,690 --> 00:22:15,430 smo morali dotaknuti svaki od onih Elementi jednom, ali samo jednom, 486 00:22:15,430 --> 00:22:18,400 pa ovdje leži, dakle, naša n log n. 487 00:22:18,400 --> 00:22:21,780 >> A sada samo da bi stvari malo više formalno samo na trenutak, ako vas 488 00:22:21,780 --> 00:22:24,260 su se sada analizirati ovo na svojevrstan višoj razini 489 00:22:24,260 --> 00:22:28,340 i pokušati odlučiti, te kako možda da se o izražavanju 490 00:22:28,340 --> 00:22:31,780 vrijeme rada ovog algoritma samo gledanjem u njega, a ne 491 00:22:31,780 --> 00:22:33,590 pomoću neprirodan primjer? 492 00:22:33,590 --> 00:22:36,590 Pa, koliko vremena će vam reći korak kao što je ovaj u žutom će potrajati, 493 00:22:36,590 --> 00:22:37,173 Ako je n <2 povratak? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 To je veliki O čega? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Dakle, vidim jedan, pa jedan korak, možda dva koraka, jer to je, ako 498 00:22:44,540 --> 00:22:47,110 a zatim se vratiti, ali to je konstantna vremena, zar ne? 499 00:22:47,110 --> 00:22:49,960 Tako smo, rekao je O (1), a to je kako ću se izraziti. 500 00:22:49,960 --> 00:22:51,480 T, samo se prikazivati ​​vrijeme. 501 00:22:51,480 --> 00:22:54,150 n je veličina ulaza, pa T (n), samo fancy način 502 00:22:54,150 --> 00:22:56,330 govoreći prikazivati Vrijeme dao unos veličine n 503 00:22:56,330 --> 00:23:00,220 će biti na red konstantnog vremena u O (1). 504 00:23:00,220 --> 00:23:01,970 >> Ali inače, što je ovo? 505 00:23:01,970 --> 00:23:05,660 Kako bi vam izraziti vrijeme rada ove žute crte? 506 00:23:05,660 --> 00:23:06,250 T čega? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Možete vrsta varati i ovdje odgovoriti na moje pitanje ciklički. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Dakle, ako se radi put u Općenito možemo samo reći da je T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 I sada ste vrsta punting ovdje i govoreći, dobro, samo sortirati lijevu polovicu, 513 00:23:22,490 --> 00:23:23,920 a zatim sortirati desnu polovicu. 514 00:23:23,920 --> 00:23:27,520 Kako bismo mogli simbolično predstavljaju vrijeme rada ove žute crte? 515 00:23:27,520 --> 00:23:28,020 T čega? 516 00:23:28,020 --> 00:23:29,360 Što je veličina ulaz? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n više od dva. 519 00:23:31,057 --> 00:23:32,140 Zašto ne bih samo reći da? 520 00:23:32,140 --> 00:23:36,449 A onda je to još jedan T (n / 2), a zatim opet, ako sam spojiti dvije polovice razvrstane, 521 00:23:36,449 --> 00:23:38,615 Koliko elementi ću imati na dodir ukupno? 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 Dakle, ja mogu izraziti, samo da bude neka vrsta fancy, 525 00:23:42,790 --> 00:23:44,430 kao trčanje vremena općenito. 526 00:23:44,430 --> 00:23:51,140 T (n) je samo vrijeme rada T (n / 2), plus T (n / 2), lijeva polovica i desnu polovicu, 527 00:23:51,140 --> 00:23:55,360 plus O (n), što je vjerojatno n koraka, ali možda, ako sam pomoću dva prsta, 528 00:23:55,360 --> 00:23:57,960 to je dvostruko više koraci, ali to je linearno. 529 00:23:57,960 --> 00:24:00,440 To je neki broj koraka to je faktor n, 530 00:24:00,440 --> 00:24:02,270 pa možemo izraziti kao ovaj. 531 00:24:02,270 --> 00:24:05,550 I ovo je mjesto gdje sada ćemo čamac za natrag naše matematiku u srednjoj školi udžbenika 532 00:24:05,550 --> 00:24:10,290 smo da recidiva u konačnici završi izjednačavanje to, n puta log n, 533 00:24:10,290 --> 00:24:12,530 Ako ste zapravo učiniti izvan Matematika više formalno. 534 00:24:12,530 --> 00:24:13,950 >> Dakle, to je samo dvije perspektive. 535 00:24:13,950 --> 00:24:17,500 Jedan brojčano s hard-kodirane reprezentativni primjer 536 00:24:17,500 --> 00:24:21,140 pomoću osam brojeva i više Općenito pogledati kako smo došli tamo. 537 00:24:21,140 --> 00:24:25,670 No, ono što je stvarno zanimljivo ovdje je, opet, taj pojam biciklizam. 538 00:24:25,670 --> 00:24:26,900 Ja ne koriste za petlje. 539 00:24:26,900 --> 00:24:29,860 Ja sam vrsta definiranja nešto u smislu sama po sebi, 540 00:24:29,860 --> 00:24:31,950 ne samo s tim matematička funkcija, 541 00:24:31,950 --> 00:24:34,860 ali iu smislu ove pseudo koda. 542 00:24:34,860 --> 00:24:38,260 Ova pseudo kod je rekurzivna U tom dvojicom svojih linija 543 00:24:38,260 --> 00:24:42,310 je u biti to govori da ide se koristiti za rješavanje manji 544 00:24:42,310 --> 00:24:45,400 Problem manjih dimenzija, i onda opet i opet 545 00:24:45,400 --> 00:24:48,820 i opet sve dok ga strugati do tog tzv osnovnom scenariju. 546 00:24:48,820 --> 00:24:52,810 >> Tako ćemo doista privući više uvjerljiv potrajati-daleko od toga kako slijedi. 547 00:24:52,810 --> 00:24:58,420 Pusti me u gedit i uzeti Pogledajmo neke od današnjeg izvornog koda, 548 00:24:58,420 --> 00:24:59,930 osobito ovaj primjer ovdje. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, što je očito, dodaje brojeva od jedan do n. 550 00:25:03,709 --> 00:25:05,750 Pa da vidimo što je poznato i upoznati ovdje. 551 00:25:05,750 --> 00:25:08,690 Prvo imamo nekoliko uključuje, tako da ništa novo. 552 00:25:08,690 --> 00:25:09,190 Prototip. 553 00:25:09,190 --> 00:25:11,370 Ja sam malo maglovita na to nakon nekoliko dana, 554 00:25:11,370 --> 00:25:13,790 No, ono što smo rekli prototip funkcija je? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 PUBLIKA: [nečujan]. 557 00:25:16,015 --> 00:25:16,905 Zvučnik 1: Što je to? 558 00:25:16,905 --> 00:25:17,800 PUBLIKA: Mi ga objaviti. 559 00:25:17,800 --> 00:25:18,883 Zvučnik 1: Mi ga objaviti. 560 00:25:18,883 --> 00:25:22,290 Tako da uče zveket, hej, Nije zapravo provedbi ovaj još, 561 00:25:22,290 --> 00:25:25,740 ali negdje u ovoj datoteci, vjerojatno, koja će se funkcija zove ono? 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 samo obećanje da to će izgledati ovako. 565 00:25:30,540 --> 00:25:33,720 To će potrajati cijeli broj kao input-- i ja mogu biti jasniji 566 00:25:33,720 --> 00:25:36,570 i reći int n --and je će se vratiti int, 567 00:25:36,570 --> 00:25:39,900 ali-zarezom sredstva, mm, ja ću doći oko za provedbu toga malo kasnije. 568 00:25:39,900 --> 00:25:40,989 Opet, jeka je glupa. 569 00:25:40,989 --> 00:25:43,280 To je jedini će znati što što reći vrha do dna, 570 00:25:43,280 --> 00:25:45,765 tako da ćemo morati barem dati to nagovještaj onoga što će doći. 571 00:25:45,765 --> 00:25:47,330 >> Sada pogledajmo glavna ovdje. 572 00:25:47,330 --> 00:25:50,040 Idemo dođite ovamo i vidjeti što glavna radi. 573 00:25:50,040 --> 00:25:53,780 Nije to toliko dugo u funkciji, a zapravo konstrukt ovdje je poznato. 574 00:25:53,780 --> 00:25:57,590 Izjavljujem varijablu n, a zatim I opet sam gnjaviti korisnika 575 00:25:57,590 --> 00:26:01,880 za pozitivni cijeli pomoću getInt, i jedini izlaz iz ove petlje 576 00:26:01,880 --> 00:26:03,280 nakon što je korisnik postupio. 577 00:26:03,280 --> 00:26:05,670 Učiniti dok smo se koristi za dosađivati ​​korisniku na taj način. 578 00:26:05,670 --> 00:26:06,670 Sada je to zanimljivo. 579 00:26:06,670 --> 00:26:08,510 Izjavljujem int pod nazivom "odgovor". 580 00:26:08,510 --> 00:26:11,420 Ja to povratna vrijednost dodijeliti od ovisnosti pod nazivom "Sigma". 581 00:26:11,420 --> 00:26:15,200 Ne znam što to čini još uvijek, ali Sjećam ga progla trenutak prije. 582 00:26:15,200 --> 00:26:18,310 A onda sam u prolazu Vrijednost koju korisnik upisali u, n, 583 00:26:18,310 --> 00:26:20,420 a onda sam se prijaviti odgovor. 584 00:26:20,420 --> 00:26:22,260 Pa ajmo dođite natrag samo na trenutak. 585 00:26:22,260 --> 00:26:28,620 Idemo naprijed u ovaj imenik, napravite Sigma 0, a zapravo pokrenuti ovaj program 586 00:26:28,620 --> 00:26:30,490 i vidjeti što se događa. 587 00:26:30,490 --> 00:26:35,930 Dakle, ako sam ići naprijed i pokrenuti Ovaj program, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 i ja upisati pozitivno cijeli broj kao dva, Sigma, 589 00:26:40,139 --> 00:26:43,180 kao grčki simbol podrazumijeva, samo je će se zbrojiti sve brojeve iz 590 00:26:43,180 --> 00:26:44,320 usredotočiti na do dva. 591 00:26:44,320 --> 00:26:46,560 Dakle, 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 Dakle, ovo nadamo se treba dati mi 3. 593 00:26:48,830 --> 00:26:49,750 To je sve što radi. 594 00:26:49,750 --> 00:26:52,690 A na sličan način, ako sam pokrenuti ovaj opet i ja da je to broj tri, 595 00:26:52,690 --> 00:26:56,721 to je 3 plus 2, tako da je 5 plus 1 treba mi dati 6. 596 00:26:56,721 --> 00:26:59,470 A onda, ako sam se stvarno luda i početi upisivati ​​u većim brojevima, 597 00:26:59,470 --> 00:27:01,290 to mi treba dati veće i veće svote. 598 00:27:01,290 --> 00:27:02,250 Dakle, to je sve. 599 00:27:02,250 --> 00:27:04,010 >> Pa što ne Sigma izgledati? 600 00:27:04,010 --> 00:27:05,430 Pa, to je prilično jednostavan. 601 00:27:05,430 --> 00:27:08,940 To je kako smo mogli provoditi ovo za posljednjih nekoliko tjedana. 602 00:27:08,940 --> 00:27:11,120 "Int" će biti povratni tip. 603 00:27:11,120 --> 00:27:14,330 Sigma je ime, i to traje varijabla m umjesto n. 604 00:27:14,330 --> 00:27:15,940 Ja ću to promijeniti do vrha. 605 00:27:15,940 --> 00:27:17,340 Onda je ovo samo provjera razum. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Vidjet ćemo zašto je u ovom trenutku. 608 00:27:19,950 --> 00:27:24,220 Sada izjavljujem drugi varijablu, suma, inicijalizirati ga na nulu. 609 00:27:24,220 --> 00:27:28,140 Onda sam to za petlju iterating, očito zbog jasnoće, 610 00:27:28,140 --> 00:27:33,810 od i = 1 na do an = m, što je sve što korisnik upisali u, a onda sam 611 00:27:33,810 --> 00:27:35,690 povećajte iznos kao što je ovaj. 612 00:27:35,690 --> 00:27:37,360 A onda se vratiti svotu. 613 00:27:37,360 --> 00:27:38,440 >> Dakle, par pitanja. 614 00:27:38,440 --> 00:27:42,370 Jedan od njih, ja tvrdim u mom komentaru da to izbjegava rizik od beskonačnu petlju. 615 00:27:42,370 --> 00:27:45,620 Zašto bi prolazi u negativnom broj izazivati, potencijalno, beskonačnu petlju? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> PUBLIKA: Nikad nećeš doći metara. 618 00:27:51,290 --> 00:27:52,880 >> Zvučnik 1: Nikad do m. 619 00:27:52,880 --> 00:27:55,880 No, m je donesen u, pa neka je razmotriti jednostavan primjer. 620 00:27:55,880 --> 00:27:58,510 Ako m je donesen u po korisnik kao negativan. 621 00:27:58,510 --> 00:28:00,059 Bez obzira na glavni. 622 00:28:00,059 --> 00:28:01,850 Glavni nas štiti od ovo previše, pa sam samo 623 00:28:01,850 --> 00:28:04,680 što stvarno analni s Sigma je također kako bi bili sigurni 624 00:28:04,680 --> 00:28:06,540 da ulaz ne može biti negativan. 625 00:28:06,540 --> 00:28:10,130 Dakle, ako m je negativna, nešto kao negativan. 626 00:28:10,130 --> 00:28:11,930 Što će se dogoditi? 627 00:28:11,930 --> 00:28:14,390 Pa, ja se ide na se inicijalno jednom, 628 00:28:14,390 --> 00:28:19,060 a onda sam je idući u biti manji ili jednak 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 was-- Nemojmo, ajmo Nix ovu priču. 633 00:28:29,370 --> 00:28:32,780 Nisam pitao to pitanje, jer Rizik da sam aludirao na 634 00:28:32,780 --> 00:28:38,360 se neće dogoditi, jer sam je Uvijek će biti veća than-- redu, 635 00:28:38,360 --> 00:28:39,871 Ja uvući to pitanje. 636 00:28:39,871 --> 00:28:40,370 U redu. 637 00:28:40,370 --> 00:28:42,030 Idemo se fokusirati samo na ovaj dio ovdje. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Zašto sam proglasiti neki izvan petlje? 640 00:28:48,830 --> 00:28:52,010 Obavijest o liniji 49 Imam proglasio ja unutar petlje, 641 00:28:52,010 --> 00:28:54,950 ali on-line 48 Imam proglasio neki izvana. 642 00:28:54,950 --> 00:28:55,695 Da. 643 00:28:55,695 --> 00:28:56,611 PUBLIKA: [nečujan]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 Zvučnik 1: Svakako. 646 00:28:59,400 --> 00:29:03,360 Dakle, prije svega ja sigurno ne želite objaviti i inicijalizirati iznos 647 00:29:03,360 --> 00:29:06,130 nuli unutrašnjost petlje na svakoj iteraciji, 648 00:29:06,130 --> 00:29:09,370 jer bi to jasno poraz Svrha sumiranje brojeva. 649 00:29:09,370 --> 00:29:11,770 Ja bih stalno mijenja Vrijednost vratiti na nulu. 650 00:29:11,770 --> 00:29:17,992 I također, što je još jedan više kompliciranih Razlog za taj isti dizajn odluke? 651 00:29:17,992 --> 00:29:18,954 Da. 652 00:29:18,954 --> 00:29:20,279 >> PUBLIKA: [nečujan]. 653 00:29:20,279 --> 00:29:21,070 Zvučnik 1: Točno. 654 00:29:21,070 --> 00:29:24,060 Želim mu pristupiti izvana petlje previše o tome što liniji? 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 I na temelju naše pravilo od prije par predavanja, 658 00:29:29,910 --> 00:29:33,680 varijable scoped, zapravo, da se kovrčava aparatić koji ih obuhvaćaju. 659 00:29:33,680 --> 00:29:38,190 Dakle, ako ja ne proglasi iznos unutar od ovih vanjskih vitičastim zagradama, 660 00:29:38,190 --> 00:29:40,250 Ne mogu ga koristiti u skladu 53. 661 00:29:40,250 --> 00:29:43,160 Drugim riječima, ako sam proglasio suma u ovdje, ili čak i unutar 662 00:29:43,160 --> 00:29:45,410 Za petlje, nisam mogao pristupiti u 53. 663 00:29:45,410 --> 00:29:47,150 Varijabla bi učinkovito nestati. 664 00:29:47,150 --> 00:29:48,579 Dakle, nekoliko razloga tamo. 665 00:29:48,579 --> 00:29:50,370 Ali sada idemo natrag i vidjeti što se događa. 666 00:29:50,370 --> 00:29:51,730 Dakle Sigma dobiva zove. 667 00:29:51,730 --> 00:29:55,640 Ona dodaje do 1 plus 2 ili 1 plus 2 plus 3, a zatim vraća vrijednost, 668 00:29:55,640 --> 00:29:59,660 pohranjuje ga u odgovoru, i printf ovdje Zato vidim na ekranu. 669 00:29:59,660 --> 00:30:03,079 Dakle, to je ono što ćemo nazvati iterativni pristup, gdje iteracija samo 670 00:30:03,079 --> 00:30:03,870 znači pomoću petlje. 671 00:30:03,870 --> 00:30:06,900 Za petlje, while petlji učiniti dok petlja, upravo radi nešto opet 672 00:30:06,900 --> 00:30:08,380 i opet i opet. 673 00:30:08,380 --> 00:30:13,505 >> Ali Sigma je vrsta uredan funkcije u da sam mogao provesti drugačije. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Što je to, što samo da bude vrsta cool, 676 00:30:19,120 --> 00:30:21,880 neka mi stvarno riješiti od puno distrakcija 677 00:30:21,880 --> 00:30:24,380 jer ove funkcije je stvarno vrlo jednostavan. 678 00:30:24,380 --> 00:30:27,780 Idemo strugati ga dolje samo na četiri osnovne linije 679 00:30:27,780 --> 00:30:30,410 i riješiti sve komentari i vitičastim zagradama. 680 00:30:30,410 --> 00:30:34,334 To je neka vrsta nevjerojatnih alternativa implementacija. 681 00:30:34,334 --> 00:30:37,250 Dobro, možda ne smeta puhanje, ali to je vrsta seksi, u redu, 682 00:30:37,250 --> 00:30:39,920 gledati na to tako mnogo više jezgrovito. 683 00:30:39,920 --> 00:30:43,120 Sa samo četiri linija koda, Prvi put sam se ovaj duševne ček. 684 00:30:43,120 --> 00:30:45,732 Ako m je manji od ili jednak nula, Sigma nema smisla. 685 00:30:45,732 --> 00:30:48,190 To je samo trebao biti u ovaj slučaj za pozitivne brojeve, 686 00:30:48,190 --> 00:30:50,340 pa ja sam samo idući u povratak na nulu samovoljno 687 00:30:50,340 --> 00:30:53,210 tako da mi barem imamo Neki tzv osnovni scenarij. 688 00:30:53,210 --> 00:30:54,430 >> No, ovdje je ljepota. 689 00:30:54,430 --> 00:30:59,930 Cjelokupnost ove ideje, dodavši Brojevi od 1 do n, m ili u ovom slučaju, 690 00:30:59,930 --> 00:31:02,630 se može učiniti vrstom prolazi mužjak. 691 00:31:02,630 --> 00:31:04,947 Pa, što je suma od 1 do m? 692 00:31:04,947 --> 00:31:05,780 Pa, znate što? 693 00:31:05,780 --> 00:31:11,949 To je isto kao zbroj m plus suma od 1 do m minus 1. 694 00:31:11,949 --> 00:31:12,740 Pa znaš što? 695 00:31:12,740 --> 00:31:13,940 Što je sigma od minus 1 m? 696 00:31:13,940 --> 00:31:17,860 Pa, ako ste vrsta slijediti ovaj logično, to je isto kao m minus 1 697 00:31:17,860 --> 00:31:21,415 plus Sigma m minus 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Dakle, možete vrsta samo-- to je kao, ako si samo 700 00:31:26,012 --> 00:31:28,220 pokušavate ljutiti prijatelja i oni vam postaviti jedno pitanje, 701 00:31:28,220 --> 00:31:31,344 ste vrsta odgovoriti na pitanje, možete vrsta zadržati prolazi mužjak. 702 00:31:31,344 --> 00:31:34,560 No, ono što je ključno je da ako bi se čineći pitanje manji i manji 703 00:31:34,560 --> 00:31:36,910 i manja, ti si ne pita što je sigma 704 00:31:36,910 --> 00:31:39,116 n, što je sigma od nje, što je Sigma n? 705 00:31:39,116 --> 00:31:40,990 Pitaš što je Sigma n, što je sigma 706 00:31:40,990 --> 00:31:42,839 n minus 1, što je Sigma n minus 2? 707 00:31:42,839 --> 00:31:44,880 Na kraju vaše pitanje će postati ono? 708 00:31:44,880 --> 00:31:50,250 Što je sigma jednog ili nula, neke vrlo male vrijednosti, 709 00:31:50,250 --> 00:31:52,220 i čim vas dobiti taj, tvoj prijatelj, 710 00:31:52,220 --> 00:31:54,350 nećete pitati isto pitanje opet, 711 00:31:54,350 --> 00:31:55,975 ste samo reći, oh to je nula. 712 00:31:55,975 --> 00:31:58,490 Gotovi smo igrati ovu vrstu glupo cikličkog igre. 713 00:31:58,490 --> 00:32:02,950 >> Dakle rekurzija je čin u programiranju od funkcija koja sebe. 714 00:32:02,950 --> 00:32:06,630 Ovaj program, kada je sastavljen i trčanje, je će se ponašati na isti način, 715 00:32:06,630 --> 00:32:09,620 No, ono što je ključno je da unutar od funkcija zove Sigma, 716 00:32:09,620 --> 00:32:13,150 postoji linija koda pri čemu mi smo sami zovete, 717 00:32:13,150 --> 00:32:14,980 koji bi normalno biti loše. 718 00:32:14,980 --> 00:32:21,160 Na primjer, što ako sam prvi put sastavio ovo, pa bi sigma-- 719 00:32:21,160 --> 00:32:22,710 bi Sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Pozitivan broj, molimo, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Dakle, ono što je funkcija, čini se se, na temelju jednog testa, ispravan. 723 00:32:30,810 --> 00:32:34,917 No, što ako sam se malo opasno i brisanje tzv osnovni scenarij, 724 00:32:34,917 --> 00:32:37,750 i samo reći, ali ja sam samo to da to složeniji nego što jest. 725 00:32:37,750 --> 00:32:42,450 Ajmo izračunati SIGMA uzimanjem m, a zatim dodao 726 00:32:42,450 --> 00:32:44,564 u sigma od m minus jedan? 727 00:32:44,564 --> 00:32:45,980 Pa, što će se dogoditi? 728 00:32:45,980 --> 00:32:47,140 Idemo udaljavanje. 729 00:32:47,140 --> 00:32:52,920 Idemo rekompilirati programa, spremiti, kompilirati program, 730 00:32:52,920 --> 00:33:00,450 a zatim spremni ./sigma-1 uvećanjem, upišite pozitivni cijeli molimo, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Kako mnogi od vas su spremni do uživajte u onome što vidim da? 733 00:33:04,430 --> 00:33:04,950 >> U redu. 734 00:33:04,950 --> 00:33:06,690 Dakle, to se može dogoditi za nekoliko razloga, 735 00:33:06,690 --> 00:33:09,148 a iskreno ovaj tjedan smo o da vam dati više od njih. 736 00:33:09,148 --> 00:33:11,780 No, u tom slučaju, pokušajte razumu unatrag 737 00:33:11,780 --> 00:33:14,430 Što bi se dogodilo ovdje? 738 00:33:14,430 --> 00:33:17,400 Segmentacija kriv, rekli smo prošli vrijeme, odnosi se na segment memorije. 739 00:33:17,400 --> 00:33:18,690 Nešto loše se dogodilo. 740 00:33:18,690 --> 00:33:21,550 No, ono što ga je mehanički da ode po zlu 741 00:33:21,550 --> 00:33:25,000 ovdje zbog moje uklanjanje tog tzv osnovnom scenariju, 742 00:33:25,000 --> 00:33:26,870 gdje sam se vratio hard-kodirane vrijednosti? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Što mislite je pošlo po zlu? 745 00:33:30,460 --> 00:33:31,219 Da. 746 00:33:31,219 --> 00:33:32,135 >> PUBLIKA: [nečujan]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 Zvučnik 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Dobro pitanje. 750 00:33:37,550 --> 00:33:39,508 Dakle veličini broja da sam saželo 751 00:33:39,508 --> 00:33:41,920 Ima toliko velika da je premašen veličina memorije. 752 00:33:41,920 --> 00:33:44,640 Dobra ideja, ali nije bitno će izazvati sudar. 753 00:33:44,640 --> 00:33:48,230 To bi moglo izazvati cijeli preljev, gdje su bitovi samo flip preko 754 00:33:48,230 --> 00:33:51,760 i onda smo pogrešno stvarno velika broj za kao negativni broj, 755 00:33:51,760 --> 00:33:53,260 ali to samo po sebi neće izazvati sudar. 756 00:33:53,260 --> 00:33:55,509 Jer na kraju Dan int još 32 bita. 757 00:33:55,509 --> 00:33:57,640 Ti nećeš slučajno ukrasti 33. malo. 758 00:33:57,640 --> 00:33:58,431 No, dobra misao. 759 00:33:58,431 --> 00:33:58,984 Da. 760 00:33:58,984 --> 00:33:59,900 >> PUBLIKA: [nečujan]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 Zvučnik 1: Metoda nikada ne zaustavi, 763 00:34:02,300 --> 00:34:06,658 i doista se ponovno poziva i opet i opet i opet 764 00:34:06,658 --> 00:34:08,449 i opet, i nitko od ta funkcija ikad 765 00:34:08,449 --> 00:34:13,310 završiti jer je njihov jedini redak Kod uvijek iznova poziva themself 766 00:34:13,310 --> 00:34:14,219 i opet. 767 00:34:14,219 --> 00:34:16,080 A ono što je stvarno događa ovdje, a sada smo 768 00:34:16,080 --> 00:34:18,100 Možete vrsta draw to slikovito. 769 00:34:18,100 --> 00:34:20,899 Pustite me na to Slika samo na trenutak. 770 00:34:20,899 --> 00:34:22,940 To je slika, da na kraju će meso iz 771 00:34:22,940 --> 00:34:26,336 detaljnije, onoga što se događa unutar memorije računala. 772 00:34:26,336 --> 00:34:28,460 I ispada da se na dnu ove slike 773 00:34:28,460 --> 00:34:29,709 nešto što se zove stog. 774 00:34:29,709 --> 00:34:31,920 To je komad memorije, komad RAM-a, 775 00:34:31,920 --> 00:34:33,920 to je samo koristiti u bilo koje vrijeme Funkcija se zove. 776 00:34:33,920 --> 00:34:36,239 Svaki put kada, programer, pozvati funkciju, 777 00:34:36,239 --> 00:34:38,860 operativnog sustava, kao što su Mac OS, Windows ili Linux, 778 00:34:38,860 --> 00:34:41,920 zgrabi hrpa bitova, možda Nekoliko kilobajta, možda i nekoliko megabajta 779 00:34:41,920 --> 00:34:44,590 memorije, ruke im za vas, a onda vam 780 00:34:44,590 --> 00:34:47,650 pokrenete svoj funkcije pomoću sve što vam je potrebno varijabli. 781 00:34:47,650 --> 00:34:50,699 A ako onda pozvati drugu Funkcija i još jedna funkcija, 782 00:34:50,699 --> 00:34:53,590 li dobiti još jednu krišku memorije i još jedna kriška memorije. 783 00:34:53,590 --> 00:34:57,090 >> I doista, ako ovim zelenim ladicama iz Annenberg predstavlja tu uspomenu, 784 00:34:57,090 --> 00:34:59,870 Evo što se događa prvi koje vrijeme, na funkciju sigma. 785 00:34:59,870 --> 00:35:04,510 To je poput stavljanja ladicu ovako na ono što je u početku prazna stog. 786 00:35:04,510 --> 00:35:07,142 Ali onda, ako je ladica se poziva, da se tako izrazim, 787 00:35:07,142 --> 00:35:08,850 pozivanje drugi primjer Sigma, to je 788 00:35:08,850 --> 00:35:11,640 kao da pitate operativni sustav, Ooh, treba malo više memorije, 789 00:35:11,640 --> 00:35:12,520 Daj mi to. 790 00:35:12,520 --> 00:35:14,840 I onda to dobiva nagomilan na na vrhu. 791 00:35:14,840 --> 00:35:18,030 No, ono što je ovdje ključno je da Prva ladica je još uvijek tamo, 792 00:35:18,030 --> 00:35:20,620 jer je pozivati ​​ovu drugu ladicu. 793 00:35:20,620 --> 00:35:23,500 Sada je u međuvremenu, Sigma nazvati sigma, to je kao da pitate za više memorije. 794 00:35:23,500 --> 00:35:25,830 Dobiva nagomilan na ovamo. 795 00:35:25,830 --> 00:35:29,350 Sigma nazvati Sigma, to je druga pladanj koji se gomilali ovdje. 796 00:35:29,350 --> 00:35:32,942 A ako Ponavljajte taj, na kraju, vrsta map ovaj vizualni 797 00:35:32,942 --> 00:35:35,525 na toj ljestvici, što će se dogoditi s hrpom ladica? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 To će premašiti iznos memorije vaše računalo ima. 800 00:35:41,160 --> 00:35:45,790 I čim je ovaj zeleni ladice prelazi vodoravnu liniju 801 00:35:45,790 --> 00:35:49,410 stog gore i gore tu riječ hrpi, što ćemo se vratiti u budućnosti, 802 00:35:49,410 --> 00:35:50,410 to je loša stvar. 803 00:35:50,410 --> 00:35:52,810 Gomila je drugačija segment memorije, 804 00:35:52,810 --> 00:35:55,190 i ako neka to kade gomila i gomila na, 805 00:35:55,190 --> 00:35:57,800 ti ćeš prelaziti svoj segment memorije, 806 00:35:57,800 --> 00:36:00,420 i Program doista ide na sudar. 807 00:36:00,420 --> 00:36:02,930 >> Sada kao na stranu, ove ideje od rekurzije, dakle, 808 00:36:02,930 --> 00:36:06,500 jasno može dovesti do problema, ali to ne mora nužno biti loša stvar. 809 00:36:06,500 --> 00:36:08,840 Zato razmislite, nakon sve, how-- a možda 810 00:36:08,840 --> 00:36:11,700 to uzima neke koristi dobivanje da --how elegantan ili kako jednostavan 811 00:36:11,700 --> 00:36:14,890 da provedba sigma je. 812 00:36:14,890 --> 00:36:17,440 I nećemo koristiti rekurzija sve što je mnogo u CS50, 813 00:36:17,440 --> 00:36:20,780 ali u CS51, i stvarno bilo klase gdje se manipulirati strukture podataka 814 00:36:20,780 --> 00:36:23,640 poput stabala, ili obiteljskih stabala, da imaju neku hijerarhiju, 815 00:36:23,640 --> 00:36:26,000 to je super, super korisna. 816 00:36:26,000 --> 00:36:29,750 Sada, kao što je na stranu, tako da vas kao želja računalnih znanstvenika 817 00:36:29,750 --> 00:36:33,180 su upoznati s nekim od Google-a unutar šale, ako idete na Google 818 00:36:33,180 --> 00:36:36,345 a vi pogledati ono što je definicija, recimo, rekurzija, ući. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Aha. 821 00:36:41,110 --> 00:36:42,670 Kao na stranu, sam se zaustavio nekoliko. 822 00:36:42,670 --> 00:36:45,470 To je kao da 10 minuta odugovlačenje jutros. 823 00:36:45,470 --> 00:36:52,890 Ako ste i Google "iskosa", obavijest naginjanjem glavu slightly-- 824 00:36:52,890 --> 00:36:55,120 a onda ovo je možda najokrutniji od svih 825 00:36:55,120 --> 00:36:57,286 jer je netko proveo kao njihov dan provedbe ovog 826 00:36:57,286 --> 00:36:59,880 nekoliko godina ago-- hajde. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, wait-- da je bug. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Dakle, radi na jednom od Najveći svjetski web stranice 831 00:37:11,410 --> 00:37:13,510 su ovi glupi pisanica. 832 00:37:13,510 --> 00:37:16,690 Oni vjerojatno konzumirati svaki bitan broj linija koda 833 00:37:16,690 --> 00:37:19,280 samo tako da možemo imati malo zabave takve stvari. 834 00:37:19,280 --> 00:37:22,140 Ali barem sada ste dobili Neki od onih unutar viceva. 835 00:37:22,140 --> 00:37:28,330 >> Sada ćemo pogledati neke od White Lies smo se govori u posljednje vrijeme, 836 00:37:28,330 --> 00:37:30,707 i početi guliti natrag neki slojevi tehnički 837 00:37:30,707 --> 00:37:32,790 tako da stvarno razumiju Što se događa 838 00:37:32,790 --> 00:37:34,860 i možete razumjeti Neke od prijetnji, 839 00:37:34,860 --> 00:37:38,060 kao što je potres mozga, da sada su počeli da postanu 840 00:37:38,060 --> 00:37:41,110 na čelu svačijeg pažnje, barem u medijima. 841 00:37:41,110 --> 00:37:45,810 Dakle, ovdje je vrlo jednostavna funkcija koji vraća ništa, praznina. 842 00:37:45,810 --> 00:37:46,790 Njegovo ime je zamjena. 843 00:37:46,790 --> 00:37:50,880 To traje dvije nepoznanice i to vraća ništa. 844 00:37:50,880 --> 00:37:52,260 Uzeti u A i B. 845 00:37:52,260 --> 00:37:53,337 Tako brzo demonstracija. 846 00:37:53,337 --> 00:37:54,170 Donijeli smo ove gore. 847 00:37:54,170 --> 00:37:56,100 Mi možda i uzeti malo razbiti tu samo na trenutak 848 00:37:56,100 --> 00:37:57,250 i imaju nešto za popiti. 849 00:37:57,250 --> 00:38:00,120 Ako se netko ne bi smetalo pridružio ja ovdje samo na trenutak gore. 850 00:38:00,120 --> 00:38:01,830 Kako je s vama u kesten majicu? 851 00:38:01,830 --> 00:38:02,335 Dođi gore. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Samo jedan danas. 854 00:38:05,260 --> 00:38:06,251 Hvala ti, ipak. 855 00:38:06,251 --> 00:38:08,000 U redu, a imamo dolazi tko ovdje? 856 00:38:08,000 --> 00:38:08,660 Koje je tvoje ime? 857 00:38:08,660 --> 00:38:09,360 >> Zvučnik 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> Zvučnik 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Dođi gore. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Tako je Laura, vrlo jednostavan izazov danas. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Lijepo je jo susret. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 U redu. 866 00:38:16,910 --> 00:38:21,179 Dakle, imamo malo mlijeka ovamo i imamo neke sok od naranče ovamo 867 00:38:21,179 --> 00:38:23,345 i neke čaše koje smo posudio od Annenberg danas. 868 00:38:23,345 --> 00:38:24,178 >> Zvučnik 4: Posudio. 869 00:38:24,178 --> 00:38:27,240 Zvučnik 1: I ići dalje i dati vam pola čaše to. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 U redu. 872 00:38:28,800 --> 00:38:30,750 A mi ćemo vam dati pola Čaša mlijeka. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Oh, i jednostavno, tako da možete sjetiti što je to bilo, 875 00:38:35,890 --> 00:38:38,860 Sjetio sam se kako bi ovo gore i na danas. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Ok. 878 00:38:42,530 --> 00:38:45,470 Ako ti ne bi smetalo, da vidimo, mi Možete ih staviti preko vaših naočala 879 00:38:45,470 --> 00:38:46,560 ako želiš. 880 00:38:46,560 --> 00:38:48,710 To će biti svijet iz Laurinim očima. 881 00:38:48,710 --> 00:38:49,210 U redu. 882 00:38:49,210 --> 00:38:53,820 Dakle, vaš cilj, dao dvije šalice Tekućina ovdje, mlijeko i sok od naranče, 883 00:38:53,820 --> 00:38:58,370 se zamijeniti dva sadržaja, tako da Sok od naranče ide u šalici mlijeka 884 00:38:58,370 --> 00:39:00,710 a mlijeko ide u Sok od naranče čaša. 885 00:39:00,710 --> 00:39:02,359 >> Zvučnik 4: Hoću li dobiti još jednu šalicu? 886 00:39:02,359 --> 00:39:05,650 Zvučnik 1: Drago mi je što ste pitali, iako to bi bilo puno bolje snimke 887 00:39:05,650 --> 00:39:06,710 ako nije pitao. 888 00:39:06,710 --> 00:39:10,620 Ali da, možemo vam ponuditi i treći Šalica koja je prazna, naravno. 889 00:39:10,620 --> 00:39:11,120 U redu. 890 00:39:11,120 --> 00:39:12,300 Dakle, mijenjati sadržaj postoji. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Vrlo lijepo. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Vrlo dobro. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Vi ste to radili iznimno pažljivo. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 I treći korak. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 U redu. 901 00:39:31,350 --> 00:39:31,930 Izvrsno. 902 00:39:31,930 --> 00:39:33,930 Veliki pljesak bilo bi dobro za Lauru. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 U redu. 905 00:39:37,000 --> 00:39:40,790 Imamo mali oproštajni dar za vas, ali neka mi se to. 906 00:39:40,790 --> 00:39:42,620 Hvala ti puno. 907 00:39:42,620 --> 00:39:46,170 Tako jednostavan primjer, premda, pokazati da ako to ne učinite 908 00:39:46,170 --> 00:39:48,300 želite mijenjati sadržaj od dva kontejnera, 909 00:39:48,300 --> 00:39:52,360 ili nazovimo ih varijabli, Trebate li privremeno skladištenje 910 00:39:52,360 --> 00:39:56,710 na pozornici jednog od sadržaja u tako da zapravo možete napraviti swap. 911 00:39:56,710 --> 00:40:01,790 Dakle, doista, to izvorni kod ovdje u C prikazuje upravo to. 912 00:40:01,790 --> 00:40:06,340 Ako je sok od naranče i mlijeko Bio b, a mi htjeli zamijeniti dvije, 913 00:40:06,340 --> 00:40:08,990 možete pokušati nešto kreativno izlijevanjem jedna u drugu, 914 00:40:08,990 --> 00:40:11,031 ali to vjerojatno ne bi završiti osobito dobro. 915 00:40:11,031 --> 00:40:15,260 I tako mi koristimo treću čašu, poziv to tmp, T-M-P dogovorno 916 00:40:15,260 --> 00:40:19,370 i staviti sadržaj SL u to, onda zamijeniti jednu šalicu, 917 00:40:19,370 --> 00:40:22,610 zatim staviti u OJ Izvorni šalice, čime 918 00:40:22,610 --> 00:40:25,320 postizanje, točno onako kako Laura je, swap. 919 00:40:25,320 --> 00:40:26,850 >> Tako ćemo učiniti upravo to. 920 00:40:26,850 --> 00:40:30,110 Dopustite mi ići naprijed i otvoriti do primjer koji je 921 00:40:30,110 --> 00:40:32,720 zapravo se zove "ne zamijeniti, "jer to nije 922 00:40:32,720 --> 00:40:36,180 što je jednostavno učinio kao što možda mislite. 923 00:40:36,180 --> 00:40:41,190 Tako je u ovom programu, primijetiti da Ja sam koristeći stdio.h, naš stari prijatelj. 924 00:40:41,190 --> 00:40:43,130 Imam prototip za zamjenu tamo gore, što 925 00:40:43,130 --> 00:40:45,450 znači njegova primjena je Vjerojatno dolje, 926 00:40:45,450 --> 00:40:48,050 pa da vidimo što je to glavna Program će raditi za mene. 927 00:40:48,050 --> 00:40:52,020 Prvi put sam proglasiti int x dobiva jedan, a int y dobiva dva. 928 00:40:52,020 --> 00:40:54,930 Dakle, mislite o onima što SL i mlijeko, respektivno. 929 00:40:54,930 --> 00:40:57,100 I onda sam samo printf rekavši x je ovo 930 00:40:57,100 --> 00:41:00,120 i y je to, samo tako mogu vizualno vidjeti što se događa. 931 00:41:00,120 --> 00:41:03,810 Onda sam printf tvrdeći da sam zamjene dva, 932 00:41:03,810 --> 00:41:07,100 a onda sam se ispisati tvrde da su oni zamijenili, 933 00:41:07,100 --> 00:41:09,300 i ja opet ispisati X i Y. 934 00:41:09,300 --> 00:41:13,010 Dakle, ovdje je u swap upravo ono što je Laura, 935 00:41:13,010 --> 00:41:16,240 i upravo ono što smo vidjeli na Zaslon trenutak prije. 936 00:41:16,240 --> 00:41:19,380 >> Dakle, idemo naprijed i biti krajnje razočaran. 937 00:41:19,380 --> 00:41:24,690 Da ne bude zamjenu, i pokrenuti nikakvu zamjenu, zumiranje u na izlazu ovdje. 938 00:41:24,690 --> 00:41:28,320 Ulaz je x 1, y je 2, zamjene zamijenili. 939 00:41:28,320 --> 00:41:32,700 x je uvijek 1, a y je još 2. 940 00:41:32,700 --> 00:41:37,630 Dakle, iako, iskreno govoreći, ovo izgleda baš sviđa, iako više tehnički, 941 00:41:37,630 --> 00:41:40,730 što Laura učinio, nije se činilo da rade. 942 00:41:40,730 --> 00:41:42,130 Pa zašto je to tako? 943 00:41:42,130 --> 00:41:46,630 Pa, ispada da kad pišemo program kao što je to 944 00:41:46,630 --> 00:41:51,590 koji je i glavni, istaknuo ovdje, a zatim još jedna funkcija, kao što su izmjene u radu, 945 00:41:51,590 --> 00:41:54,230 istaknuta ovdje, koji ona naziva, svijet 946 00:41:54,230 --> 00:41:57,030 izgleda malo nešto slično ove ladice trenutak prije. 947 00:41:57,030 --> 00:42:00,440 Kada je glavni prvi dobiva zove, to je kao da pitate operativni sustav 948 00:42:00,440 --> 00:42:04,030 za malo memorije za bilo lokalno varijable kao što su xiy da glavna ima, 949 00:42:04,030 --> 00:42:05,660 i završe tamo gore. 950 00:42:05,660 --> 00:42:10,920 No, ako je glavni pozivi mijenjati, a glavna prolazi da zamijene dva argumenta, A i B, 951 00:42:10,920 --> 00:42:16,410 Sok od naranče i mlijeko, to nije kao predaje sok od naranče i mlijeko 952 00:42:16,410 --> 00:42:17,500 Lauri. 953 00:42:17,500 --> 00:42:21,300 Ono što računalo radi, to je prolazi kopije soka od naranče 954 00:42:21,300 --> 00:42:27,110 i kopije mlijeka Lauri, tako da što je u konačnici unutar ove ladice 955 00:42:27,110 --> 00:42:32,510 vrijednost je jedan i dva, ili OJ i njihovi mlijeka, ali primjeraka, 956 00:42:32,510 --> 00:42:34,790 tako da se u tom trenutku u priči, postoji 957 00:42:34,790 --> 00:42:36,930 je SL i mlijeko u svakoj od tih ladica. 958 00:42:36,930 --> 00:42:39,260 Ima jedan i dva U svakom od ovih ladica, 959 00:42:39,260 --> 00:42:41,720 i funkcija zamjena doista radi. 960 00:42:41,720 --> 00:42:46,090 To ih zamjene unutar na drugi najviši ladicu, 961 00:42:46,090 --> 00:42:48,147 ali da zamjene nema utjecaja. 962 00:42:48,147 --> 00:42:49,980 I na temelju samo neki Osnovni princip mi smo 963 00:42:49,980 --> 00:42:52,970 govorio o prije, i doista Prije samo nekoliko minuta, što 964 00:42:52,970 --> 00:42:58,770 moglo objasniti zašto mijenjaju ib unutar swapa 965 00:42:58,770 --> 00:43:05,560 nema učinka na X i Y, iako Prošao sam X i Y na funkciji zamjenu. 966 00:43:05,560 --> 00:43:08,750 Što je ključna riječ ovdje da možda pojednostavljeno objasniti? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Mislim da je to čuo sam ovdje? 969 00:43:12,627 --> 00:43:13,335 PUBLIKA: Povratak. 970 00:43:13,335 --> 00:43:14,085 Zvučnik 1: Povratak? 971 00:43:14,085 --> 00:43:14,590 Ne vrate. 972 00:43:14,590 --> 00:43:15,895 Idemo s jednim drugim. 973 00:43:15,895 --> 00:43:16,395 Što je to? 974 00:43:16,395 --> 00:43:17,080 >> PUBLIKA: [nečujan]. 975 00:43:17,080 --> 00:43:20,000 >> Zvučnik 1: U redu, tako da smo mogli return-- bi povratnu rad u priči, 976 00:43:20,000 --> 00:43:21,914 ali tu je još jednostavnije objašnjenje. 977 00:43:21,914 --> 00:43:22,580 PUBLIKA: Opseg. 978 00:43:22,580 --> 00:43:23,288 Zvučnik 1: Opseg. 979 00:43:23,288 --> 00:43:24,300 Uzet ću opseg. 980 00:43:24,300 --> 00:43:27,290 Dakle, opseg, sjetiti gdje Naš xiy proglasio. 981 00:43:27,290 --> 00:43:30,840 Oni proglasio unutar od Glavni pravu ovdje. 982 00:43:30,840 --> 00:43:33,200 i b, u međuvremenu, su učinkovito proglasio 983 00:43:33,200 --> 00:43:35,930 unutar swapa, ne sasvim u Kovrčava aparatić, ali još uvijek 984 00:43:35,930 --> 00:43:37,690 u općem području swapa. 985 00:43:37,690 --> 00:43:40,560 I tako je doista, i b postoje samo u ovoj ladici 986 00:43:40,560 --> 00:43:44,850 iz Annenberg, ovo Drugi komad koda. 987 00:43:44,850 --> 00:43:49,500 Dakle, mi doista Mijenjamo kopirati, ali to nije stvarno sve što je korisno. 988 00:43:49,500 --> 00:43:52,190 >> Tako ćemo pogledati ovo malo niža razina. 989 00:43:52,190 --> 00:43:55,430 Ja ću se vratiti u Izvor imenik, 990 00:43:55,430 --> 00:43:58,330 i ja ću prvi povećavanje ovdje, i samo 991 00:43:58,330 --> 00:44:02,290 potvrditi da sam u to veći terminal prozor, 992 00:44:02,290 --> 00:44:04,430 Program je još uvijek ponaša kao da je. 993 00:44:04,430 --> 00:44:06,840 Pretpostavimo sada da je ovaj nije namjerno. 994 00:44:06,840 --> 00:44:10,090 Jasno sam htjela zamjenu za radovi, tako da se osjeća kao kukac. 995 00:44:10,090 --> 00:44:12,780 Sada sam mogao početi dodavanjem Puno printf-a na moj broj, 996 00:44:12,780 --> 00:44:16,010 ispis x ovamo, y tijekom ovdje, ovamo, b ovamo. 997 00:44:16,010 --> 00:44:18,220 Ali iskreno, to je vjerojatno ono što što ste radili za par tjedana 998 00:44:18,220 --> 00:44:20,190 Sada, u radno vrijeme i kod kuće kada radite 999 00:44:20,190 --> 00:44:22,150 na psets pokušavaju naći neke greške. 1000 00:44:22,150 --> 00:44:25,560 No, vidjet ćete, ako već niste, da je problem postaviti tri uvodi vas 1001 00:44:25,560 --> 00:44:31,630 na naredbe zove GDB, gdje GDB, GNU debugger, 1002 00:44:31,630 --> 00:44:34,040 je sama cijela hrpa značajke koje mogu zapravo 1003 00:44:34,040 --> 00:44:38,160 neka nas razumjeti situacije kao što je ovaj, ali je još uvjerljivo, 1004 00:44:38,160 --> 00:44:39,940 rješavati probleme i pronaći greške. 1005 00:44:39,940 --> 00:44:40,940 Tako da ću to učiniti. 1006 00:44:40,940 --> 00:44:44,770 Umjesto ./noswap, ja sam umjesto će pokrenuti GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Drugim riječima, ja ću pokrenuti moje Program ne Bash, naš novi prijatelj 1009 00:44:51,200 --> 00:44:51,850 danas. 1010 00:44:51,850 --> 00:44:53,970 Idem na trčanje moj Program noswap unutar 1011 00:44:53,970 --> 00:44:56,900 ovog drugog programa pod nazivom GDB, što je za pronalaženje pogrešaka, što 1012 00:44:56,900 --> 00:45:01,035 je program koji je osmišljen kako bi pomogao Vi ljudi pronaći i ukloniti greške. 1013 00:45:01,035 --> 00:45:03,410 Dakle, ako sam pogodio Run ovdje, tu krvoločan količina teksta 1014 00:45:03,410 --> 00:45:04,868 da stvarno nikada ne morate čitati. 1015 00:45:04,868 --> 00:45:07,290 To je u biti distrakcija od redak, koji 1016 00:45:07,290 --> 00:45:10,030 Ja ću pogoditi Control-L ustati na vrhu tamo. 1017 00:45:10,030 --> 00:45:11,800 To je GDB brz. 1018 00:45:11,800 --> 00:45:15,550 Ako želim pokrenuti ovaj program, kao ovo mangupirati se plahta na današnjem 1019 00:45:15,550 --> 00:45:21,860 slide sugerira, Run je prvi zapovijeda da smo trebali uvesti. 1020 00:45:21,860 --> 00:45:25,150 I Samo ću upisati trčanje ovdje unutar GDB, 1021 00:45:25,150 --> 00:45:26,811 i doista je vodio moj program. 1022 00:45:26,811 --> 00:45:29,310 Sada postoji neka dodatna izlazi na zaslonu kao što je ovaj, 1023 00:45:29,310 --> 00:45:31,910 ali to je samo bio GDB analni i reći nam što se događa. 1024 00:45:31,910 --> 00:45:34,451 Vi stvarno ne morate brinuti o tim detaljima sada. 1025 00:45:34,451 --> 00:45:36,890 No, ono što je stvarno cool o GDB, ako sam to učiniti again-- 1026 00:45:36,890 --> 00:45:42,100 Kontrola-L briše screen-- me pusti naprijed i tipa "slomiti glavna", čime se, 1027 00:45:42,100 --> 00:45:45,743 kad sam udario Enter, postavljanje što je pod nazivom Point Break na noswap.c, 1028 00:45:45,743 --> 00:45:51,270 Linija 16, što je, gdje GDB shvatio moj program zapravo 1029 00:45:51,270 --> 00:45:53,070 je, moja je funkcija zapravo je. 1030 00:45:53,070 --> 00:45:55,070 To ćemo zanemariti za sada ali to je adresa 1031 00:45:55,070 --> 00:45:57,310 u spomen posebno ove funkcije. 1032 00:45:57,310 --> 00:46:00,240 Dakle, sada kada sam tip trčanje, primijetiti ono što je cool ovdje. 1033 00:46:00,240 --> 00:46:05,650 Moj program razbija na liniji I. Rekao GDB za pauzu na izvršenje. 1034 00:46:05,650 --> 00:46:09,850 Dakle, ne moram se sada promijeniti moj broj, dodati neke printf-a, kompilirati ga, ponoviti 1035 00:46:09,850 --> 00:46:13,300 da, promijeniti, dodati neke printf-a, spremiti, kompilirati ga, pokrenite ga. 1036 00:46:13,300 --> 00:46:18,100 Ja samo mogu prošetati kroz moj program korak po korak po korak u ljudskoj brzini, 1037 00:46:18,100 --> 00:46:20,880 Nije na Intel-unutar vrste brzine. 1038 00:46:20,880 --> 00:46:24,580 >> Tako sada primjetiti ovu liniju pojavljuje ovdje, a ako se vratim 1039 00:46:24,580 --> 00:46:27,800 mom programu u gedit, primijetiti da je to zapravo 1040 00:46:27,800 --> 00:46:29,280 Prva linija koda. 1041 00:46:29,280 --> 00:46:31,240 Tu je linija 16 u gedit. 1042 00:46:31,240 --> 00:46:34,610 Tu je linija 16 u GDB, pa čak i iako je ovaj crno-bijeli sučelje 1043 00:46:34,610 --> 00:46:37,760 nije gotovo kao korisnika prijateljski, to znači 1044 00:46:37,760 --> 00:46:41,680 da linija 16 nije izvršena , no riječ je o biti. 1045 00:46:41,680 --> 00:46:46,220 Pa doista, ako sam tip ispis x, ne printf, samo za ispis x, 1046 00:46:46,220 --> 00:46:50,730 Ja dobiti neke lažne vrijednosti postoji od nule, jer x još nije ponište. 1047 00:46:50,730 --> 00:46:54,760 Tako da ću upisati sljedeći, ili, ako vas želim biti fancy, samo n za sljedeći. 1048 00:46:54,760 --> 00:46:59,090 Ali kad sam Sljedećih ući, sada primijetiti da prelazi na liniji 17. 1049 00:46:59,090 --> 00:47:02,840 Pa logično, ako sam pogubljen Linija 16, a ja sada upisati ispisa x, 1050 00:47:02,840 --> 00:47:03,640 Što bih trebao vidjeti? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 Jedan. 1053 00:47:05,520 --> 00:47:07,820 >> I sada je to doduše zbunjujuće. 1054 00:47:07,820 --> 00:47:11,260 2 dolara je samo fancy način, ako vas žele da se odnosi na tu vrijednost naknadno, 1055 00:47:11,260 --> 00:47:12,510 možete reći: "Dolar potpisati dva." 1056 00:47:12,510 --> 00:47:13,480 To je kao back referencu. 1057 00:47:13,480 --> 00:47:14,570 No, za sada, samo ga ignorirati. 1058 00:47:14,570 --> 00:47:17,070 Ono što je zanimljivo je što je na desnoj strani znaka jednakosti. 1059 00:47:17,070 --> 00:47:21,000 I sad kad bih upisati sljedeći opet i ispis y, ja bi trebao vidjeti 2. 1060 00:47:21,000 --> 00:47:23,870 Ja sada mogu ispisivati x opet, i iskreno, 1061 00:47:23,870 --> 00:47:27,130 ako sam uzimajući malo zbunjeni o tome gdje sam ja, ja mogu upisati popis za popis 1062 00:47:27,130 --> 00:47:30,590 i samo vidjeti neke kontekst cijelog točka Ja sam zapravo u. 1063 00:47:30,590 --> 00:47:35,180 I sad ja mogu upisati Sljedeći, i tu je x 1. 1064 00:47:35,180 --> 00:47:36,300 Sada sam upisati sljedeći. 1065 00:47:36,300 --> 00:47:37,710 Oh, y je 2. 1066 00:47:37,710 --> 00:47:40,750 I opet, to je zbunjujuće, jer GDB je izlaz 1067 00:47:40,750 --> 00:47:43,044 se međusobno pomiješane s mojim vlastitim izlazom. 1068 00:47:43,044 --> 00:47:45,710 Ali, ako imate na umu, tako Bacimo li pogled unatrag i naprijed na kodu 1069 00:47:45,710 --> 00:47:47,740 ili polaganja stranu po strani možda, vi ćete 1070 00:47:47,740 --> 00:47:51,020 vidim da je stvarno samo sam korak kroz moj program. 1071 00:47:51,020 --> 00:47:54,620 >> Ali primijetiti ono što će se sljedeće dogoditi, doslovno. 1072 00:47:54,620 --> 00:47:56,380 Evo linija 22. 1073 00:47:56,380 --> 00:48:01,315 Pusti me preko nje, čime se kreće na do 23, a ako ja ispisati x sada, još uvijek jedan. 1074 00:48:01,315 --> 00:48:03,890 A ako sam y ispisati sada, još uvijek jedan. 1075 00:48:03,890 --> 00:48:05,820 Dakle, ovo nije korisna vježba. 1076 00:48:05,820 --> 00:48:07,450 Tako ćemo ponoviti ovo. 1077 00:48:07,450 --> 00:48:10,069 Pustite me da se vratim do Najbolje i tip ponovno pokrenuti. 1078 00:48:10,069 --> 00:48:12,110 I to govori program da je se debugged 1079 00:48:12,110 --> 00:48:14,109 počela je već, počeo od početka. 1080 00:48:14,109 --> 00:48:15,420 Da, učinimo to opet. 1081 00:48:15,420 --> 00:48:22,000 I ovaj put ćemo učiniti, sljedeći, sljedeći, sljedeći, sljedeći, 1082 00:48:22,000 --> 00:48:24,180 ali sada se stvari zanimljive. 1083 00:48:24,180 --> 00:48:27,760 Sada želim da stupim u swap, pa ne upisati sljedeći. 1084 00:48:27,760 --> 00:48:34,380 I tip korak, a sada ga primjetiti mi je skočio na noswap.c liniji 33. 1085 00:48:34,380 --> 00:48:37,240 Ako sam se vratiti u gedit, što je linija 33? 1086 00:48:37,240 --> 00:48:40,500 To je prva stvarna linija koda unutar swapa. 1087 00:48:40,500 --> 00:48:44,150 Što je lijepo, jer sada mogu vrsta džaku okolo i dobiti znatiželjan 1088 00:48:44,150 --> 00:48:46,052 o tome što se događa doista tamo. 1089 00:48:46,052 --> 00:48:46,760 Dopustite mi ispisati tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Opa. 1092 00:48:48,800 --> 00:48:51,438 Zašto tmp imaju neke luda, lažna vrijednost smeća? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 PUBLIKA: To nije ponište. 1095 00:48:56,120 --> 00:48:57,150 Zvučnik 1: To nije ponište. 1096 00:48:57,150 --> 00:49:00,270 I doista, kada pokrenete program, ti si dao hrpu memorije 1097 00:49:00,270 --> 00:49:03,392 od strane operativnog sustava, ali su nije pokrenut niti vrijednosti, 1098 00:49:03,392 --> 00:49:05,600 kako god bita ste vidim ovdje, iako je to 1099 00:49:05,600 --> 00:49:07,770 ovom ludom veliki negativni broj, samo znači 1100 00:49:07,770 --> 00:49:10,750 da su to ostaci iz Neki prethodni korištenje tog RAM-a, 1101 00:49:10,750 --> 00:49:13,050 iako nisam Osobno ga je potrebno još. 1102 00:49:13,050 --> 00:49:17,086 Dakle, sada ću ići naprijed i tip Sljedeći, a ako ja sada upisati ispisa tmp, 1103 00:49:17,086 --> 00:49:17,835 Što bih trebao vidjeti? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Bez obzira na vrijednost bila je prvi argument, samo 1106 00:49:23,360 --> 00:49:25,550 X kao što je prvi stvar bude donesen u, 1107 00:49:25,550 --> 00:49:30,450 tako i X bi trebao biti isti, tako ispisati tmp treba ispisati mi jednu. 1108 00:49:30,450 --> 00:49:36,360 >> Dakle, ono što ćete vidjeti u problemu setu tri je udžbenik sorti na GDB, 1109 00:49:36,360 --> 00:49:40,020 ali shvatite da je ovo početak od pogled na alat koji će zapravo 1110 00:49:40,020 --> 00:49:42,774 vam pomoći u rješavanju problema toliko mnogo učinkovitije. 1111 00:49:42,774 --> 00:49:44,690 Ono što smo u konačnici će učiniti u srijedu 1112 00:49:44,690 --> 00:49:48,180 se početi guliti natrag nekoliko slojeva i ukloniti neki trening kotača. 1113 00:49:48,180 --> 00:49:50,496 Ta stvar se zove niz koji smo se koristi za neko vrijeme, 1114 00:49:50,496 --> 00:49:53,370 idemo polako oduzeti od vas i početi govoriti o 1115 00:49:53,370 --> 00:49:55,725 nešto više ezoterički poznat kao char *, 1116 00:49:55,725 --> 00:49:59,550 ali ćemo učiniti ovaj lijepi i Na početku nježno, iako pokazivače, 1117 00:49:59,550 --> 00:50:02,730 kako ih nazivaju, može napraviti neki vrlo loše stvari, ako zlostavljani, 1118 00:50:02,730 --> 00:50:06,040 gledajući malo claymation iz naš prijatelj Nick Parlante Stanford 1119 00:50:06,040 --> 00:50:09,670 Sveučilište, profesor na računalu znanost koji su stavili zajedno ovaj pregled 1120 00:50:09,670 --> 00:50:11,075 od onoga što će doći u srijedu. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [Video reprodukciju] 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 Probudite se. 1126 00:50:15,780 --> 00:50:17,240 To je vrijeme za zabavu kazaljke. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Što je to? 1129 00:50:19,350 --> 00:50:21,150 Saznajte više o pokazivače? 1130 00:50:21,150 --> 00:50:22,050 Oh, slatkiši! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END video reprodukciju] 1133 00:50:23,730 --> 00:50:25,396 Zvučnik 1: To vas čeka u srijedu. 1134 00:50:25,396 --> 00:50:26,440 Vidimo se onda. 1135 00:50:26,440 --> 00:50:27,106 [Video reprodukciju] 1136 00:50:27,106 --> 00:50:30,420 -I Sada, Deep Misli, po Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> Zašto su mi učenje C? 1139 00:50:35,900 --> 00:50:36,785 Zašto ne +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Smijeh] 1142 00:50:40,910 --> 00:50:42,160 >> [END video reprodukciju]