1 00:00:00,000 --> 00:00:12,040 >> [MUSIC JOC] 2 00:00:12,040 --> 00:00:16,460 >> SPEAKER 1: Bine, acest lucru este CS50, iar acesta este începutul de patru saptamani, 3 00:00:16,460 --> 00:00:20,420 și cum poate ați auzit sau citit, lumea a fost încheiată. 4 00:00:20,420 --> 00:00:23,520 Mergând tot în jurul pe internet a fost cunoașterea și conștientizarea 5 00:00:23,520 --> 00:00:27,100 de o eroare într-un program, o limbaj de programare numit Bash. 6 00:00:27,100 --> 00:00:32,729 Acest lucru a fost tatuat minunat ca Shellshock, sau ușa Bash, 7 00:00:32,729 --> 00:00:35,485 dar articole ca acestea nu au fost mai puțin frecvente. 8 00:00:35,485 --> 00:00:38,807 De fapt, multe dintre ele aduc amintiri din spate a Heartbleed, 9 00:00:38,807 --> 00:00:41,640 care este posibil să fi observat în apăsați din nou primăvara trecută, care 10 00:00:41,640 --> 00:00:43,980 a fost în mod similar destul de dramatic. 11 00:00:43,980 --> 00:00:47,110 Acum, de cei dintre voi aici astăzi, cât de mulți dintre voi au, 12 00:00:47,110 --> 00:00:50,330 chiar dacă nu înțeleg ce este vorba, a auzit de Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Bine, și cât de mulți dintre voi au computere care sunt vulnerabile? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, nu ar trebui să fie mult, mult mai multe mâini chiar acum, pentru motive pe care le va vedea. 17 00:01:00,250 --> 00:01:02,580 >> Să aruncăm o privire la ceea ce este se petrece în mass-media 18 00:01:02,580 --> 00:01:05,304 și apoi să explice un pic aici pentru noi punct de vedere tehnic. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> SPEAKER 2: Experții în securitate au a avertizat că un defect grav ar putea 21 00:01:11,250 --> 00:01:15,650 fie pe cale de a afecta sute de milioane de utilizatori de internet din lume. 22 00:01:15,650 --> 00:01:20,600 Deci, exact ceea ce este bug-ul care a fost numit Shellshock, și ce face? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Ei bine, Shellshock este, de asemenea, cunoscut sub numele de Bash bug, software-ul se exploatează. 25 00:01:28,910 --> 00:01:33,230 Hackerii folosesc virusul pentru a scana vulnerabile sistemele care rulează Linux și Unix 26 00:01:33,230 --> 00:01:36,300 sisteme de operare și apoi le infecta. 27 00:01:36,300 --> 00:01:38,730 Bash este un shell linie de comandă. 28 00:01:38,730 --> 00:01:43,460 Acest lucru permite utilizatorilor aspect comenzi pentru a lansa programe și caracteristici în cadrul software-ului 29 00:01:43,460 --> 00:01:45,250 prin tastarea în text. 30 00:01:45,250 --> 00:01:49,980 Este de obicei folosit de programatori, și nu ar trebui să fie deschis către lume, 31 00:01:49,980 --> 00:01:51,590 deși Shellshock schimba asta. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Ei bine, worringly, unii analiști avertizează că ar putea fi o amenințare mai mare, 34 00:01:57,910 --> 00:02:01,580 deoarece Shellshock permite complet controlul asupra unui sistem infectat, 35 00:02:01,580 --> 00:02:06,030 în timp ce Heartbleed permis numai hackeri pentru a spiona pe computere. 36 00:02:06,030 --> 00:02:09,130 Este atât de gravă, că este fost evaluat un 10 din 10 37 00:02:09,130 --> 00:02:11,900 pentru severitate de către National Vulnerabilitate baza de date. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 din toate serverele web sunt la risc, inclusiv unele computere Mac. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Ei bine, asigurați-vă că patch sistemele de acum. 42 00:02:25,600 --> 00:02:29,330 Oricine gazduieste un site web care rulează sistemele de operare afectate 43 00:02:29,330 --> 00:02:31,800 ar trebui să ia măsuri cât mai curând posibil. 44 00:02:31,800 --> 00:02:35,390 Oricine își poate permite ar trebui să arate la cererea lor de monitorizare și web 45 00:02:35,390 --> 00:02:37,355 firewall-uri pentru a privi afară pentru orice atacuri. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 SPEAKER 3: Cel mai rău lucru care se poate întâmpla este 48 00:02:41,770 --> 00:02:45,080 că cineva va scrie cod care ar merge în mod automat și scanare 49 00:02:45,080 --> 00:02:48,280 pe internet și ar afecta toate aceste calculatoare. 50 00:02:48,280 --> 00:02:50,710 Și odată ce ei fac asta, bine, cel mai rău lucru pe care ar putea face 51 00:02:50,710 --> 00:02:53,300 este doar șterge totul, sau închide site-urile jos. 52 00:02:53,300 --> 00:02:55,360 Deci, am putea vedea daune din acest punct de vedere, 53 00:02:55,360 --> 00:02:58,300 în cazul în care am avea oameni malware care tocmai a decide de a provoca haos 54 00:02:58,300 --> 00:03:02,534 de sisteme de aducerea în jos sau ștergerea fișiere, și lucruri de genul asta. 55 00:03:02,534 --> 00:03:05,200 SPEAKER 2: Unii spun că aceasta este una dintre cele mai dificile pentru a măsura 56 00:03:05,200 --> 00:03:08,080 bug-uri în ani, și-l poate dura săptămâni sau chiar 57 00:03:08,080 --> 00:03:10,820 luni pentru a determina impactul final. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> SPEAKER 1: Deci, toate acestea sunt adevărate, dar un lucru amuzant este, aproape toate 60 00:03:15,560 --> 00:03:18,330 de imaginile care tocmai ați văzut, cu excepția, poate, tastatura, 61 00:03:18,330 --> 00:03:20,930 nu are nimic de-a face cu un fel de bug-ul. 62 00:03:20,930 --> 00:03:23,960 Servere și cabluri și așa mai departe, E un fel de tangențial legate, 63 00:03:23,960 --> 00:03:27,410 dar la baza este de fapt destul de familiar ce se întâmplă aici. 64 00:03:27,410 --> 00:03:30,050 De fapt, lasă-mă să intru în aparat noastră CS50. 65 00:03:30,050 --> 00:03:32,910 Lasă-mă să mergeți mai departe și de a maximiza fereastra terminalului aici. 66 00:03:32,910 --> 00:03:36,020 Și voi ați fost folosind acest, sau versiune embedded acestora, 67 00:03:36,020 --> 00:03:39,460 în gedit, în scopul de a scrie programe, tip de comenzi, și așa mai departe, 68 00:03:39,460 --> 00:03:43,690 și aceasta este, de fapt, și are fost de săptămâni, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Aceasta este Bourne-Again Shell, care este doar un mod fantezist de a spune, 70 00:03:46,890 --> 00:03:50,220 acesta este un program care are o clipește rapid, eficient, 71 00:03:50,220 --> 00:03:51,970 că stă acolo de așteptare pentru intrare pentru tine. 72 00:03:51,970 --> 00:03:53,920 Și e comanda linii de interfață prin care 73 00:03:53,920 --> 00:03:57,650 voi au fost difuzate de comenzi și în cele din urmă compilarea și apoi rularea 74 00:03:57,650 --> 00:03:58,400 programe. 75 00:03:58,400 --> 00:04:01,320 >> Dar Bash este, de asemenea, o programare Limba în următorul sens. 76 00:04:01,320 --> 00:04:05,460 Știți că există comenzi, cum ar fi cd și ls și, de asemenea, zăngăni și alții, 77 00:04:05,460 --> 00:04:09,580 dar vă puteți defini propriile comenzi prin punerea în aplicare a acestora în Bash. 78 00:04:09,580 --> 00:04:11,420 Acum, noi nu vom du-te în detaliu 79 00:04:11,420 --> 00:04:16,089 ca pentru a bash limbajul de programare, dar Știu, de exemplu, că în acest moment, 80 00:04:16,089 --> 00:04:17,607 nu exista nici o comandă numit "hello". 81 00:04:17,607 --> 00:04:19,440 Deci, poate fi găsit în unul dintre aceste pachete. 82 00:04:19,440 --> 00:04:20,856 Nu este instalat pe computerul meu. 83 00:04:20,856 --> 00:04:21,870 Întrebați administratorul. 84 00:04:21,870 --> 00:04:26,030 Dar dacă vreau să existe un program de numit "hello" în Bash sau la promptă mea, 85 00:04:26,030 --> 00:04:30,810 Eu pot folosi de fapt sintaxă care este destul ca C. Nu e chiar același lucru, 86 00:04:30,810 --> 00:04:35,020 dar se pare destul de similar cu o funcție, chiar dacă lipsesc unele detalii. 87 00:04:35,020 --> 00:04:38,090 Nimic nu pare să se întâmple, dar acum, dacă am de tip "salut" 88 00:04:38,090 --> 00:04:40,960 puteți scrie de fapt o Programul, nu în C, nu în Java, 89 00:04:40,960 --> 00:04:44,280 nu într-o altă programare limbă, dar în Bash sine. 90 00:04:44,280 --> 00:04:47,630 >> Acum Cheia aici este că am scris nume am vrut să dau această nouă comandă, 91 00:04:47,630 --> 00:04:50,820 și parantezele sunt, de asemenea, simbolic de aceasta fiind o functie. 92 00:04:50,820 --> 00:04:54,010 Ca o paranteza, puteți face, de asemenea, distractiv lucruri, și, de fapt, chiar de pe Mac OS, 93 00:04:54,010 --> 00:04:55,620 acesta este un program numit Terminal. 94 00:04:55,620 --> 00:04:58,800 Ea vine construit în oricui computer care are un Mac în această cameră, 95 00:04:58,800 --> 00:05:03,640 și poți face lucruri similare în Mac OS, dar poti sa te duci mai mult dincolo de asta. 96 00:05:03,640 --> 00:05:07,110 Și acest lucru este un pic tangential, dar e un fel de distracție. 97 00:05:07,110 --> 00:05:09,715 Mi-am amintit în această dimineață, atunci când ne gândim la asta, 98 00:05:09,715 --> 00:05:13,279 de un mic joc am folosit pentru a juca cu unul dintre foștii TFS CS50 lui 99 00:05:13,279 --> 00:05:16,570 prin care în orice moment ar pleca de la Tastatura lui cu ecran său deblocat, 100 00:05:16,570 --> 00:05:23,611 Mi-ar executa o comanda ca asta-- "salut". 101 00:05:23,611 --> 00:05:26,610 Și acum orice moment a venit înapoi la lui tastatură după ce am eliminat pe ecran 102 00:05:26,610 --> 00:05:27,985 și el va sta jos, încercați să faceți ceva de lucru, 103 00:05:27,985 --> 00:05:29,250 lista conținutul directory-- său 104 00:05:29,250 --> 00:05:29,510 >> [Redare audio] 105 00:05:29,510 --> 00:05:30,010 >> Alo. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Buna ziua. 108 00:05:32,120 --> 00:05:35,030 >> SPEAKER 1: Deci, în echitate, nu a fost de fapt "salut". 109 00:05:35,030 --> 00:05:36,894 Acesta a fost, de obicei, ceva mai asemănător cu asta-- 110 00:05:36,894 --> 00:05:37,560 [Redare audio] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 SPEAKER 1: acea experiență am would-- astfel încât computerul său ar fi 113 00:05:39,320 --> 00:05:42,170 Jur la el orice moment el de fapt așezat la tastatura lui. 114 00:05:42,170 --> 00:05:46,265 Și foarte repede el a dat seama de a nu părăsi ecranul său deblocat. 115 00:05:46,265 --> 00:05:48,730 Dar acest lucru sugerează genul de distracție stupid pe care le 116 00:05:48,730 --> 00:05:50,210 poate avea cu ceva de genul Bash. 117 00:05:50,210 --> 00:05:52,770 Dar e un pic mai mult serios, pentru a fi siguri, decât că. 118 00:05:52,770 --> 00:05:57,235 Și, de fapt, acesta este unul dintre cele mai multe bug-uri periculoase și de lungă durată 119 00:05:57,235 --> 00:05:58,860 care a lovit într-adevăr lumea la nivel global. 120 00:05:58,860 --> 00:06:02,060 Acest bug a fost în jur de 20 de ani, 121 00:06:02,060 --> 00:06:05,780 și veți fi lovit în doar un clipă de simplitatea sa relativă. 122 00:06:05,780 --> 00:06:07,990 >> Deci, acest lucru este un reprezentant poruncește ca, dacă 123 00:06:07,990 --> 00:06:10,448 detin un Mac, literalmente chiar acum atunci când aveți capac deschis, 124 00:06:10,448 --> 00:06:12,940 aveți posibilitatea să încercați să introduceți în care program numit Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminal este sub Aplicații Utilities-- 126 00:06:15,410 --> 00:06:18,790 pentru o dată, utilizatorii de Windows nu trebuie să vă faceți griji cu privire la acest threat-- special 127 00:06:18,790 --> 00:06:22,310 dar cei cu Mac-uri posibilitatea să tastați aceasta într-o fereastră ca voi face aici, 128 00:06:22,310 --> 00:06:24,210 și dacă tastați că în acest program 129 00:06:24,210 --> 00:06:28,830 numit Terminal, ca voi face acum, dacă vedeți cuvântul "vulnerabil", 130 00:06:28,830 --> 00:06:32,200 computerul este vulnerabili la exploatare. 131 00:06:32,200 --> 00:06:33,850 >> Acum, ce înseamnă asta de fapt înseamnă? 132 00:06:33,850 --> 00:06:35,870 Și acest lucru este, desigur, unele sintaxa destul de nebun, 133 00:06:35,870 --> 00:06:39,050 dar hai, cel puțin scoate unele dintre aspectele interesante. 134 00:06:39,050 --> 00:06:42,567 Deci, există unele sintaxă care arată un pic familiar, cel puțin de la C 135 00:06:42,567 --> 00:06:43,950 și programarea mai general. 136 00:06:43,950 --> 00:06:47,550 Văd niște paranteze, punct și virgulă, acolade, și astfel, 137 00:06:47,550 --> 00:06:50,820 dar se pare că acest lucru stupid aici în galben 138 00:06:50,820 --> 00:06:53,580 este în esență o funcție care nu face nimic. 139 00:06:53,580 --> 00:06:57,840 Mijloacele de colon face nimic, și punct și virgulă înseamnă nu mai faci nimic. 140 00:06:57,840 --> 00:07:00,250 Deci interiorul acestora acolade, faptul 141 00:07:00,250 --> 00:07:02,440 că am un egal semneze la stânga, acest lucru 142 00:07:02,440 --> 00:07:05,500 este crearea, în esență, o comandă, sau o variabilă, 143 00:07:05,500 --> 00:07:09,520 numita x, și atribuindu-se că pic galben de cod acolo. 144 00:07:09,520 --> 00:07:14,040 Asta ar putea fi ceva de genul "ecou salut "sau" spune beep "sau ceva 145 00:07:14,040 --> 00:07:15,120 asemănător cu asta. 146 00:07:15,120 --> 00:07:17,780 Dar observați dacă ochii tăi umbla mai mult spre dreapta, 147 00:07:17,780 --> 00:07:22,150 e mai mult decât această linie doar la sfârșitul acelui punct și virgulă. 148 00:07:22,150 --> 00:07:25,160 "Echo vulnerabil," și apoi dincolo de faptul că există chiar mai mult. 149 00:07:25,160 --> 00:07:26,530 Un alt punct și virgulă, bash C :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Deci, pe scurt, această linie de cod este 152 00:07:34,050 --> 00:07:36,660 suficient pentru convingatoare un calculator care este 153 00:07:36,660 --> 00:07:39,830 vulnerabile la a face ceva care doriți să-l fac, 154 00:07:39,830 --> 00:07:44,290 pentru că există un bug în Bash, prin care chiar dacă Bash ar fi trebuit să se oprească 155 00:07:44,290 --> 00:07:48,980 linii de lectură de drept comandă acolo după textul galben, 156 00:07:48,980 --> 00:07:52,520 pentru un plus de 20 de ani bug vechi, Bash a fost de fapt de lectură 157 00:07:52,520 --> 00:07:56,780 dincolo de care virgulă și destul de mult a face ceea ce i se spune. 158 00:07:56,780 --> 00:07:59,070 >> Deci, ce este implicarea de care în final? 159 00:07:59,070 --> 00:08:01,340 Am spus doar "echo hello" sau "echo vulnerabil," 160 00:08:01,340 --> 00:08:05,449 dar ce se întâmplă dacă ai făcut ceva de fapt malware, cum ar fi rm-rf *, 161 00:08:05,449 --> 00:08:07,240 care nu s-ar putea au scris vreodată înainte, 162 00:08:07,240 --> 00:08:08,920 si sincer, probabil, ar trebui să nu prea curând, 163 00:08:08,920 --> 00:08:10,700 pentru ca poti face o mulțime de daune cu ea. 164 00:08:10,700 --> 00:08:11,210 De ce? 165 00:08:11,210 --> 00:08:12,990 rm ceea ce, desigur nu? 166 00:08:12,990 --> 00:08:14,270 Elimină. 167 00:08:14,270 --> 00:08:15,930 * Înseamnă asta? 168 00:08:15,930 --> 00:08:16,430 Toate. 169 00:08:16,430 --> 00:08:18,180 Deci, este un așa-numit wild card, așa că înseamnă 170 00:08:18,180 --> 00:08:20,410 șterge totul în directorul curent. 171 00:08:20,410 --> 00:08:23,379 r se întâmplă să însemne recursiv, ceea ce înseamnă că, dacă ceea ce ștergerea 172 00:08:23,379 --> 00:08:26,420 este un director, și în interiorul acolo este alte fișiere și alte directoare, 173 00:08:26,420 --> 00:08:28,950 recursiv arunca cu capul în acolo și a șterge tot de asta. 174 00:08:28,950 --> 00:08:31,040 Și -f este cel mai rău dintre toate. 175 00:08:31,040 --> 00:08:32,580 Oricine știe ce înseamnă aici f? 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 Deci forța mijloace, chiar în cazul în care acest lucru este o idee rea, 179 00:08:37,830 --> 00:08:40,939 fă-o fără să mă ia determinat pentru confirmarea ulterioară. 180 00:08:40,939 --> 00:08:43,230 Deci, știți, am râde de aceasta, dar sincer, eu, probabil, 181 00:08:43,230 --> 00:08:44,972 acest tip de mai multe ori o zi, pentru că realitatea 182 00:08:44,972 --> 00:08:47,210 este că e cel mai rapid mod de a șterge o grămadă de lucruri. 183 00:08:47,210 --> 00:08:48,590 Dar chiar am făcut unele daune. 184 00:08:48,590 --> 00:08:53,100 >> Dar dacă ar fi să păcălească un calculator în definirea unor variabile stupid 185 00:08:53,100 --> 00:08:56,810 sau funcție numită x, dar apoi pacalirea calculatorul în executare 186 00:08:56,810 --> 00:09:00,030 dincolo de limitele pe care funcție, dincolo de faptul că punct și virgulă, 187 00:09:00,030 --> 00:09:04,430 ai putea pacali într-adevăr un calculator în executarea ceva de genul rm-rf 188 00:09:04,430 --> 00:09:07,810 sau comanda e-mail sau comanda Copy. 189 00:09:07,810 --> 00:09:11,400 Orice literalmente se poate face cu calculator, fie că este vorba ștergerea fișierelor, 190 00:09:11,400 --> 00:09:15,350 crearea de fișiere, spam-ul pe cineva, ataca un server de la distanță, 191 00:09:15,350 --> 00:09:17,190 daca se poate exprima cu o comandă, 192 00:09:17,190 --> 00:09:19,120 poate pacali un calculator in a face asta. 193 00:09:19,120 --> 00:09:21,510 >> Acum, ceea ce este un exemplu de cum s-ar putea face acest lucru? 194 00:09:21,510 --> 00:09:24,300 Ei bine, există o mulțime de calculatoare pe Bash rulare internet. 195 00:09:24,300 --> 00:09:26,390 Toți utilizatorii de noi Mac sunt printre ei. 196 00:09:26,390 --> 00:09:30,390 O mulțime de servere Linux sunt printre ele, de asemenea, și servere Unix. 197 00:09:30,390 --> 00:09:32,630 Ferestre devine din nou relativ de pe cârlig 198 00:09:32,630 --> 00:09:34,590 cu excepția cazului în care le-ați instalat software special. 199 00:09:34,590 --> 00:09:37,130 Acum, o mulțime de servere, pentru exemplu, servere web rula, 200 00:09:37,130 --> 00:09:39,840 și, de fapt, Linux este, probabil, cele mai populare sisteme de operare 201 00:09:39,840 --> 00:09:43,060 pentru a rula pe computerele de pe Internet care servesc pagini web. 202 00:09:43,060 --> 00:09:44,910 Acum, așa cum vom vedea mai târziu în semestrul, atunci când 203 00:09:44,910 --> 00:09:48,470 trimiteți o solicitare de la dumneavoastră browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, o fi la un server de la distanță, 205 00:09:50,790 --> 00:09:53,730 se pare că, deși doar ați tastat www.example.com, 206 00:09:53,730 --> 00:09:59,590 Browser-ul dumneavoastră este de a trimite un mesaj că e un pic mai mult arcane, ca aceasta. 207 00:09:59,590 --> 00:10:01,239 >> Dar observați ceva ciudat. 208 00:10:01,239 --> 00:10:03,030 Primele două linii N-am mai văzut până acum, 209 00:10:03,030 --> 00:10:04,904 dar ei nu te uita în special în pericol. 210 00:10:04,904 --> 00:10:08,030 Dar observați ce am furat pentru a treia linie de aici. 211 00:10:08,030 --> 00:10:13,390 În cazul în care un tip rău a fost de a trimite un mesaj ca aceasta din calculatorul lui sau a ei 212 00:10:13,390 --> 00:10:17,270 la un Mac vulnerabil sau un server Linux vulnerabil, 213 00:10:17,270 --> 00:10:21,580 Lucrul amuzant este că Bash, că simplu prompt de mic de comandă, 214 00:10:21,580 --> 00:10:27,450 este omniprezent și este de multe ori utilizat pentru a executa, în esență, 215 00:10:27,450 --> 00:10:30,020 conținutul unui mesaj pe care-l primește. 216 00:10:30,020 --> 00:10:33,490 Și de această logică, puteți truc un server web, prin urmare, 217 00:10:33,490 --> 00:10:36,370 prin trimiterea ceva de genul User-Agent, care, de obicei, 218 00:10:36,370 --> 00:10:38,300 ar trebui să spun Numele browser-ul dumneavoastră. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, această 220 00:10:42,420 --> 00:10:44,590 este doar browser-ul dvs. modalitate de a identifica în sine. 221 00:10:44,590 --> 00:10:46,605 Dar dacă un om rău foarte ingenios spune, mm-mm, sunt 222 00:10:46,605 --> 00:10:47,930 Nu o să-ți spun ceea ce browser-ul meu este, 223 00:10:47,930 --> 00:10:50,888 Am în schimb o să vă trimită această lucru criptic aspect cu un rf rm 224 00:10:50,888 --> 00:10:55,840 * În ea, poți păcăli literalmente o server web vulnerabil pe internet 225 00:10:55,840 --> 00:10:59,055 în executarea exact ca în acolo pentru a șterge toate fișierele. 226 00:10:59,055 --> 00:11:00,930 Și sincer, asta nu-i chiar mai rău de ea. 227 00:11:00,930 --> 00:11:01,763 Puteți face nimic. 228 00:11:01,763 --> 00:11:04,480 Ai putea începe un distribuită atac denial of service 229 00:11:04,480 --> 00:11:07,030 dacă te-a trimis acest mesaj pentru buchete întregi de servere web 230 00:11:07,030 --> 00:11:10,256 și apoi a avut-le pe toate coboare, pentru exemplu, pe serverele Harvard.edu, 231 00:11:10,256 --> 00:11:12,130 și se pot sorta a-bang-ului naiba din ele 232 00:11:12,130 --> 00:11:15,490 de un trafic de rețea care a fost în caz contrar declanșat de acest tip rău. 233 00:11:15,490 --> 00:11:18,760 >> Deci, pe scurt, aproape toată lumea în această cameră, care deține un Mac 234 00:11:18,760 --> 00:11:20,240 este vulnerabil la acest lucru. 235 00:11:20,240 --> 00:11:24,100 Linia de argint este ca daca nu esti rulează un server web de pe laptop-ul, 236 00:11:24,100 --> 00:11:27,780 și dacă nu le-ați configurat de fapt , pentru a permite ceva de genul SSH în ea, 237 00:11:27,780 --> 00:11:28,670 tu ești de fapt în siguranță. 238 00:11:28,670 --> 00:11:31,710 Este vulnerabil, dar nu există nici e o încercarea de a obține în laptop-ul, 239 00:11:31,710 --> 00:11:33,290 astfel încât să puteți să fiți un fel de siguri. 240 00:11:33,290 --> 00:11:36,210 Cu toate acestea, Apple va fi în curând fi actualizarea un fix pentru acest lucru. 241 00:11:36,210 --> 00:11:39,660 Lumea de Linux a lansat deja o serie de remedii pentru Fedora și Ubuntu 242 00:11:39,660 --> 00:11:43,790 și alte versiuni de Linux, și într-adevăr dacă aveți o actualizare 50 în aparat, 243 00:11:43,790 --> 00:11:45,930 chiar asta vor fi actualizate și corectate. 244 00:11:45,930 --> 00:11:47,764 Dar asta nu are într-adevăr a fost vulnerabil, 245 00:11:47,764 --> 00:11:49,804 pentru că dacă nu ai tinkered cu aparatul 246 00:11:49,804 --> 00:11:52,770 și a făcut laptop-ul public accesibilă pe internet, care nu este 247 00:11:52,770 --> 00:11:54,910 în mod implicit, ai de fapt, a fost bine pentru că 248 00:11:54,910 --> 00:11:56,890 de firewall și alte tehnici. 249 00:11:56,890 --> 00:12:01,000 >> Dar este un exemplu extrem de un bug pe care le-am trăit de la literalmente 20 250 00:12:01,000 --> 00:12:04,050 ani, și cine știe dacă cineva în tot acest timp a cunoscut despre el? 251 00:12:04,050 --> 00:12:06,300 Și, de fapt, aceasta este una dintre provocările fundamentale 252 00:12:06,300 --> 00:12:08,690 că vom vedea mai târziu, în semestru de securitate, 253 00:12:08,690 --> 00:12:13,020 este că la fel ca în lumea reală, baietii buni sunt la dezavantajul. 254 00:12:13,020 --> 00:12:16,500 Pentru a păstra băieții răi afară, trebuie să asigurați-vă că fiecare ușă este blocat, 255 00:12:16,500 --> 00:12:20,340 că fiecare fereastră este sigur, că fiecare punct de intrare într-o casă 256 00:12:20,340 --> 00:12:21,980 este sigur de a păstra băieții răi. 257 00:12:21,980 --> 00:12:26,870 Dar ceea ce face tipul cel rău trebuie să face pentru a compromite de fapt, casa ta 258 00:12:26,870 --> 00:12:28,200 si fura de la tine? 259 00:12:28,200 --> 00:12:32,574 El sau ea trebuie doar să găsească un deblocat ușă, o fereastră spartă, sau ceva 260 00:12:32,574 --> 00:12:35,240 de-a lungul acestor linii, și este același lucru în securitatea calculatoarelor. 261 00:12:35,240 --> 00:12:37,660 Putem scrie milioane de de linii de cod de programare 262 00:12:37,660 --> 00:12:40,570 și petrece sute sau mii de ore încercând să-l corect, 263 00:12:40,570 --> 00:12:43,370 dar dacă faci doar un singur greșeală în corectitudine, 264 00:12:43,370 --> 00:12:47,030 puteți pune întregul sistem și într-adevăr, în acest caz, întregul internet 265 00:12:47,030 --> 00:12:48,660 și lumea în pericol. 266 00:12:48,660 --> 00:12:51,950 >> Deci, dacă doriți să aflați mai multe despre aceasta, du-te la acest URL aici. 267 00:12:51,950 --> 00:12:54,450 Nu este nevoie de acțiune in seara asta daca nu esti 268 00:12:54,450 --> 00:12:57,116 printre cei mai confortabil care au fost difuzate propria ta web 269 00:12:57,116 --> 00:12:59,810 Server, în cazul în care ar trebui să care, în fapt, actualiza software-ul. 270 00:12:59,810 --> 00:13:03,244 >> Și acest lucru este de asemenea titlul de un discurs, iar acum o hârtie, 271 00:13:03,244 --> 00:13:05,410 pe care le-am legat cu privire la site-ul curs pentru azi. 272 00:13:05,410 --> 00:13:07,600 A fost de un coleg nume Ken Thompson, care 273 00:13:07,600 --> 00:13:10,120 a fost acceptarea unui foarte celebru premiu în informatică, 274 00:13:10,120 --> 00:13:13,495 și le-a dat acest discurs câțiva ani în urmă, în esență, pe aceeași temă. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Solicitarea oameni buni întrebarea, ar trebui într-adevăr 277 00:13:20,520 --> 00:13:23,480 încredere, în cele din urmă, software-ul care le-ați dat? 278 00:13:23,480 --> 00:13:26,100 De exemplu, cu toții avem a fost scris de programe, 279 00:13:26,100 --> 00:13:27,820 și am fost compilarea le cu răsune. 280 00:13:27,820 --> 00:13:31,830 Și pentru cunoștințele dumneavoastră, ați scris programe pentru CS50 cazul în care există 281 00:13:31,830 --> 00:13:35,310 o usa din spate de felul, există o cale că un tip rău, în cazul în care rulează programul, 282 00:13:35,310 --> 00:13:37,410 ar putea prelua computerul dumneavoastră? 283 00:13:37,410 --> 00:13:38,310 Probabil că nu, corect? 284 00:13:38,310 --> 00:13:40,180 Mario, și lacomi, și de credit. 285 00:13:40,180 --> 00:13:41,680 Acestea sunt toate programele destul de mici. 286 00:13:41,680 --> 00:13:43,910 Ar trebui să fie destul de rău dacă tu de fapt 287 00:13:43,910 --> 00:13:47,310 a făcut tot computerul vulnerabil după ce a scris 10 sau 20 de linii de cod, 288 00:13:47,310 --> 00:13:49,690 sau cel puțin nu cunosc unele de implicațiile de securitate. 289 00:13:49,690 --> 00:13:52,023 Acum, eu spun că în glumă, dar vom vedea astăzi 290 00:13:52,023 --> 00:13:54,600 și în această săptămână este de fapt într-adevăr, într-adevăr ușor 291 00:13:54,600 --> 00:13:57,980 să fie rău și să facă chiar programe scurte vulnerabile. 292 00:13:57,980 --> 00:14:02,880 >> Dar pentru moment, cel puțin, seama ca intrebarea care se pune aici 293 00:14:02,880 --> 00:14:04,850 este de aproximativ răsune într-un compilator. 294 00:14:04,850 --> 00:14:08,360 De ce am avut încredere în răsune pentru ultimele două sau trei săptămâni? 295 00:14:08,360 --> 00:14:12,650 Cine poate spune că oricine a scris răsune nu a avut un "dacă" starea acolo 296 00:14:12,650 --> 00:14:17,680 că injectat în esență, niște zerouri și cele în fiecare program compileaza 297 00:14:17,680 --> 00:14:21,180 care ar permite el sau ea acces calculatorului atunci când dormi 298 00:14:21,180 --> 00:14:23,580 și capac laptop este deschis și pe computer se execută? 299 00:14:23,580 --> 00:14:24,080 Corect? 300 00:14:24,080 --> 00:14:28,350 Avem acest tip de drept sistem de onoare acum unde avem încredere că răsune este legal. 301 00:14:28,350 --> 00:14:30,000 Ai încredere că aparatul este legal. 302 00:14:30,000 --> 00:14:34,430 Ai încredere că literalmente fiecare program pe Mac sau PC-ul dvs. este de încredere. 303 00:14:34,430 --> 00:14:37,510 Și, după cum sugerează acest bug simplu, chiar dacă nu este rău intenționat, 304 00:14:37,510 --> 00:14:40,580 că nu este absolut probabil să fie cazul. 305 00:14:40,580 --> 00:14:42,350 >> Deci, ar trebui să fie speriat ca dracu '. 306 00:14:42,350 --> 00:14:45,560 Sincer, nu e nici simplu soluție la această altă 307 00:14:45,560 --> 00:14:48,185 decât un fel de conștientizare a societății de creșterea complexității 308 00:14:48,185 --> 00:14:50,310 că suntem bazându-se pe partea de sus de sistemele noastre informatice, 309 00:14:50,310 --> 00:14:53,740 și cum în ce mai vulnerabilă am putea fi foarte bine. 310 00:14:53,740 --> 00:14:55,570 >> Acum, cu care a spus, Breakout. 311 00:14:55,570 --> 00:14:59,889 Deci, Breakout este problema stabilit trei, și Breakout este un joc de odinioară 312 00:14:59,889 --> 00:15:02,180 pe care le-ar putea aminti, dar pentru noi în problema set de trei, 313 00:15:02,180 --> 00:15:04,450 ne permite să ia lucrurile înapoi la un alt nivel 314 00:15:04,450 --> 00:15:08,880 astfel încât atunci când scriem programe, chiar într-o fereastră terminal de acest fel, 315 00:15:08,880 --> 00:15:14,670 putem rula de fapt, în cele din urmă, programe grafice nu 316 00:15:14,670 --> 00:15:17,800 spre deosebire de cele pe care le au acces la Scratch. 317 00:15:17,800 --> 00:15:20,910 Deci, aceasta este a personalului punerea în aplicare a Breakout, 318 00:15:20,910 --> 00:15:23,930 care este doar acest caramida-rupere joc, care vă deplasați cu zbaturi înapoi 319 00:15:23,930 --> 00:15:27,590 și mai departe, și te-a lovit mingea împotriva acelor cărămizi colorate sus. 320 00:15:27,590 --> 00:15:30,020 Deci, acest lucru ne aduce un fel de înapoi de unde 321 00:15:30,020 --> 00:15:33,180 am reușit să fie foarte rapid cu Scratch, iar acum cu C, 322 00:15:33,180 --> 00:15:35,800 de punere în aplicare propria noastră interfețe grafice. 323 00:15:35,800 --> 00:15:38,960 >> Dar mai mult decât atât, această set problemă reprezintă primul 324 00:15:38,960 --> 00:15:41,000 în care vom da ai o grămadă de cod. 325 00:15:41,000 --> 00:15:43,940 Și, de fapt, eu aduc explicit atenție la acest lucru, deoarece mai ales 326 00:15:43,940 --> 00:15:47,090 pentru cei mai puțin confortabil, acest problema stabilit, cel puțin la prima vedere, 327 00:15:47,090 --> 00:15:49,170 se va simti ca ne-am luat-o la un alt nivel. 328 00:15:49,170 --> 00:15:51,540 Pentru că ne-am dat, pentru unele dintre căutării 329 00:15:51,540 --> 00:15:54,930 și sortarea probleme în PSET, o grămadă de cod pe care am scris, 330 00:15:54,930 --> 00:15:56,680 și o pereche de comentarii care spune "a face", 331 00:15:56,680 --> 00:15:58,221 în cazul în care va trebui să umple golurile. 332 00:15:58,221 --> 00:16:00,020 Deci, nu prea înfricoșător, dar e prima dată 333 00:16:00,020 --> 00:16:03,370 te vom preda cod pe care aveți nevoie pentru a prima citire, să înțeleagă, și apoi se adaugă la 334 00:16:03,370 --> 00:16:04,290 și-l finalizeze. 335 00:16:04,290 --> 00:16:05,940 >> Și apoi cu Breakout, vom face la fel, 336 00:16:05,940 --> 00:16:08,740 oferindu-vă câteva zeci de mai multe linii de cod care, sincer, vă dau 337 00:16:08,740 --> 00:16:11,490 o mulțime de cadrul de joc, dar nu mai scurt 338 00:16:11,490 --> 00:16:14,304 de punere în aplicare cărămizi și mingea și paleta, 339 00:16:14,304 --> 00:16:15,970 dar vom face implementarea unor alte caracteristici. 340 00:16:15,970 --> 00:16:18,280 Și chiar că, la prima vedere, din nou, mai ales în cazul în care mai puțin confortabil, 341 00:16:18,280 --> 00:16:21,480 s-ar putea părea deosebit de descurajatoare și crezi că e atât de multe funcții noi 342 00:16:21,480 --> 00:16:24,070 aveți nevoie să-și încheie mintea ta în jurul, și asta e adevărat. 343 00:16:24,070 --> 00:16:26,281 Dar tineti minte, e destul ca Scratch. 344 00:16:26,281 --> 00:16:28,780 Cote sunt nu ai folosit toate piesele de puzzle din zero. 345 00:16:28,780 --> 00:16:31,120 Șansele sunt că nu-i păsa să-și încheie mintea ta în jurul toate 346 00:16:31,120 --> 00:16:33,617 pentru că tot ce a luat a fost o privire rapidă pentru a înțelege, oh, 347 00:16:33,617 --> 00:16:35,450 asta e ceea ce pot face cu această piesă de puzzle. 348 00:16:35,450 --> 00:16:38,260 Și, într-adevăr, în problema stabilit 3 spec, vă vom punct 349 00:16:38,260 --> 00:16:41,370 la documentația care va vi-l prezint la unele funcții noi, 350 00:16:41,370 --> 00:16:43,570 și în cele din urmă de programare construiește utilizați. 351 00:16:43,570 --> 00:16:47,610 Condiții, mai rapide, variabile și funcții 352 00:16:47,610 --> 00:16:50,720 va fi identic cu ceea ce am văzut până acum. 353 00:16:50,720 --> 00:16:53,560 >> Deci, într-adevăr, ceea ce vom da ce este un cod de probă care 354 00:16:53,560 --> 00:16:56,110 vă permite să creați o fereastră care nu se uită spre deosebire de aceasta, 355 00:16:56,110 --> 00:16:59,540 și în cele din urmă se transforma într- ceva destul de genul asta. 356 00:16:59,540 --> 00:17:02,250 Deci, să profite de CS50, discuta orelor de program și mai mult, 357 00:17:02,250 --> 00:17:05,290 și să ia de confort în faptul că cantitatea de cod ce trebuie să scrie 358 00:17:05,290 --> 00:17:06,760 este, de fapt, nu tot atât de mult. 359 00:17:06,760 --> 00:17:10,359 Prima provocare este doar să se aclimatizeze te la un cod care le-am scris. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Orice întrebări cu privire la pset3, Shellshock, sau altfel? 362 00:17:15,810 --> 00:17:19,226 >> Audiența: Se pare ca merge prin cu Breakout 363 00:17:19,226 --> 00:17:22,154 care codul este aproape un stil orientat-obiect, 364 00:17:22,154 --> 00:17:24,675 dar m-am gândit C a fost un program orientat-obiect. 365 00:17:24,675 --> 00:17:26,050 SPEAKER 1: O întrebare excelentă. 366 00:17:26,050 --> 00:17:28,258 Deci, în căutarea prin Codul de distribuție, codul 367 00:17:28,258 --> 00:17:30,180 am scris pentru pset3, pentru cei familiarizați, ea 368 00:17:30,180 --> 00:17:32,230 se pare ca este o puțin orientat-obiect. 369 00:17:32,230 --> 00:17:33,800 Răspunsul scurt este, este. 370 00:17:33,800 --> 00:17:38,130 Este o aproximare a modului în care s-ar putea face cod orientat pe obiect, folosind 371 00:17:38,130 --> 00:17:41,850 un limbaj cum ar fi C, dar este încă în cele din urmă procedural. 372 00:17:41,850 --> 00:17:44,900 Nu există metode interiorul variabilele, după cum veți vedea. 373 00:17:44,900 --> 00:17:46,180 Dar este o reminiscență de asta. 374 00:17:46,180 --> 00:17:48,780 Și vom vedea din nou această caracteristică când vom ajunge la PHP și JavaScript 375 00:17:48,780 --> 00:17:49,946 spre sfârșitul semestrului. 376 00:17:49,946 --> 00:17:53,667 Dar pentru acum, cred că de ea ca un indiciu a ceea ce este de a veni. 377 00:17:53,667 --> 00:17:54,250 Bună întrebare. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 În regulă. 380 00:17:56,550 --> 00:17:59,730 Deci fuziona fel a fost cum ne-am lucruri pe care ultima oara. 381 00:17:59,730 --> 00:18:03,250 Și îmbinarea fel a fost rece în sens că a fost atât de mult mai repede, 382 00:18:03,250 --> 00:18:07,100 cel puțin pe baza testelor sumare am făcut săptămâna trecută, decât, să zicem, cu bule 383 00:18:07,100 --> 00:18:08,710 sortare, selecție fel, inserare fel. 384 00:18:08,710 --> 00:18:11,780 Și ceea ce a fost prea curat este doar cum succint și curat 385 00:18:11,780 --> 00:18:12,810 puteți exprima. 386 00:18:12,810 --> 00:18:15,840 Și ce-am spus că a fost un superior legat de timpul de funcționare de îmbinare 387 00:18:15,840 --> 00:18:16,340 sortarea? 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 >> Audiența: n log n? 391 00:18:19,360 --> 00:18:20,819 >> SPEAKER 1: n log n, chiar. n log n. 392 00:18:20,819 --> 00:18:23,776 Și ne vom întoarce la ceea ce că înseamnă de fapt sau de unde vine, 393 00:18:23,776 --> 00:18:25,570 dar acest lucru a fost mai bine decât ceea ce timp de funcționare 394 00:18:25,570 --> 00:18:28,440 că am văzut de balon selecție și inserare fel? 395 00:18:28,440 --> 00:18:30,610 Deci, n pătrat. n pătrat este mai mare decât aceasta, 396 00:18:30,610 --> 00:18:34,650 și chiar dacă nu este destul de evident, știu că log n este mai mic decât n, 397 00:18:34,650 --> 00:18:36,910 asa ca daca faci de n ori ceva mai mic decât n, 398 00:18:36,910 --> 00:18:38,680 aceasta va fi mai mică decât n pătrat. 399 00:18:38,680 --> 00:18:40,130 Este un pic de intuiție acolo. 400 00:18:40,130 --> 00:18:42,190 Dar am plătit un preț pentru acest lucru. 401 00:18:42,190 --> 00:18:47,000 Acesta a fost mai rapid, dar o temă care a început să apară săptămâna trecută a fost acest compromis. 402 00:18:47,000 --> 00:18:49,804 Am o performanță mai bună timp înțelept, dar ceea ce 403 00:18:49,804 --> 00:18:52,470 am avut eu să-și petreacă pe de altă parte parte, pentru a atinge acest? 404 00:18:52,470 --> 00:18:53,591 >> Audiența: memorie. 405 00:18:53,591 --> 00:18:54,465 SPEAKER 1: Spune din nou? 406 00:18:54,465 --> 00:18:55,173 Audiența: memorie. 407 00:18:55,173 --> 00:18:57,040 SPEAKER 1: memorie, sau mai mult spațiu în general. 408 00:18:57,040 --> 00:18:59,040 Și nu a fost super evident cu oamenii noștri, 409 00:18:59,040 --> 00:19:02,240 dar reamintească faptul că voluntarii noștri au fost un pas înainte și pas cu pas 410 00:19:02,240 --> 00:19:04,780 înapoi ca și cum nu este o matrice aici, și ca și cum nu există 411 00:19:04,780 --> 00:19:07,130 un al doilea tablou aici că acestea ar putea folosi, pentru că ne-am 412 00:19:07,130 --> 00:19:09,080 undeva necesare pentru a fuziona acei oameni. 413 00:19:09,080 --> 00:19:11,480 Noi nu putea să le schimba în loc. 414 00:19:11,480 --> 00:19:13,800 Deci fuziona levier fel este mai mult spațiu, care 415 00:19:13,800 --> 00:19:15,620 nu am nevoie de alte algoritmi, 416 00:19:15,620 --> 00:19:17,410 dar partea buna este ca e mult mai rapid. 417 00:19:17,410 --> 00:19:20,780 Și sincer, în spațiul lumea reală acestea RAM days--, hard disk spatiu-- 418 00:19:20,780 --> 00:19:25,030 este relativ ieftin, și așa că e nu neapărat un lucru rău. 419 00:19:25,030 --> 00:19:28,320 >> Deci, haideți să aruncăm o privire rapidă, un pic mai metodic, la ceea ce am făcut 420 00:19:28,320 --> 00:19:30,220 și de ce am spus că este o n log n. 421 00:19:30,220 --> 00:19:33,260 Deci, aici sunt cele opt numere și opt voluntari am avut ultima dată. 422 00:19:33,260 --> 00:19:35,718 Și primul lucru pe care Merge Sorteaza ne-a spus să fac a fost ce? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 Audiența: Divide în două. 425 00:19:38,010 --> 00:19:38,663 SPEAKER 1: Spune din nou? 426 00:19:38,663 --> 00:19:39,650 Audiența: Divide în două. 427 00:19:39,650 --> 00:19:40,610 SPEAKER 1: Divide în două, chiar. 428 00:19:40,610 --> 00:19:42,818 Acest lucru este foarte amintește de cartea de telefon, de divizare 429 00:19:42,818 --> 00:19:44,220 și cuceri mai general. 430 00:19:44,220 --> 00:19:45,640 Așa că ne-am uitat la jumătatea stângă. 431 00:19:45,640 --> 00:19:48,700 Și apoi, o dată am spus, un fel jumătatea stângă a elementelor, 432 00:19:48,700 --> 00:19:49,690 ceea ce am spus în continuare? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Sortarea jumătatea stângă a stânga jumătate, ceea ce ne-a permis sa, 435 00:19:54,860 --> 00:19:57,570 după împărțirea în două, se concentreze pe patru și două. 436 00:19:57,570 --> 00:20:01,280 >> Cum se sorta o listă acum, în galben, de dimensiune doi, folosind Merge Sort? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Ei bine, se împart în două, și sorta jumătatea stângă. 439 00:20:04,580 --> 00:20:07,100 Și acest lucru a fost în cazul în care lucrurile am un pic scurt stupid. 440 00:20:07,100 --> 00:20:10,720 Cum se sorta o listă care este de Dimensiunea unul, ca acest număr de patru aici? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Este sortate. 443 00:20:13,210 --> 00:20:14,200 Ai terminat. 444 00:20:14,200 --> 00:20:17,300 >> Dar atunci cum să sortați o listă de Dimensiunea una, atunci când este numarul doi? 445 00:20:17,300 --> 00:20:21,640 Ei bine, același lucru, dar acum ceea ce a fost al treilea și pas important în Merge Sort? 446 00:20:21,640 --> 00:20:24,020 Trebuia să fuzioneze stânga jumătate și jumătatea din dreapta. 447 00:20:24,020 --> 00:20:26,580 Și odată ce am făcut asta, ne-am uitat la patru, ne-am uitat la două. 448 00:20:26,580 --> 00:20:28,750 Am decis în regulă, în mod evident, doi este pe primul loc, 449 00:20:28,750 --> 00:20:31,840 asa ca am pus două în ei loc, urmat de patru. 450 00:20:31,840 --> 00:20:35,010 Și acum trebuie să fel de înapoi, iar acest lucru este un fel de caracteristică 451 00:20:35,010 --> 00:20:37,570 unui algoritm ca Merge Sortare, înapoi în memorie. 452 00:20:37,570 --> 00:20:40,240 Care a fost următoarea linie de poveste? 453 00:20:40,240 --> 00:20:41,780 Ce ar trebui să se concentreze pe viitor? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Jumătatea din dreapta în stânga jumătate, care este de șase și opt. 456 00:20:47,350 --> 00:20:50,320 >> Deci, permiteți-mi să pas prin acest fără belaboring punctul de prea mult. 457 00:20:50,320 --> 00:20:53,330 Șase și opt, apoi șase este sortate, opt sunt sortate. 458 00:20:53,330 --> 00:20:57,190 Merge-le împreună așa, iar acum urmatorul pas mare 459 00:20:57,190 --> 00:21:00,990 este, desigur, sorta jumătatea din dreapta de la chiar primul pas al acestui algoritm. 460 00:21:00,990 --> 00:21:02,870 Deci, ne vom concentra pe unul, trei, șapte, cinci. 461 00:21:02,870 --> 00:21:04,540 Apoi ne vom concentra pe jumătatea stângă. 462 00:21:04,540 --> 00:21:09,400 Jumătatea stângă a că, jumătatea din dreapta a că, și apoi fuziona într-o singură și trei. 463 00:21:09,400 --> 00:21:13,100 Apoi, jumătatea din dreapta, apoi la stânga pe jumătate de aceasta, atunci jumătatea din dreapta a acesteia. 464 00:21:13,100 --> 00:21:15,985 Merge-l în, și acum ceea ce rămâne pas? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Merge mare jumătatea stângă și Big pe jumătate dreptate, așa că unul se duce acolo, 467 00:21:22,460 --> 00:21:27,330 apoi două, apoi trei, apoi patru, apoi cinci, apoi șase, apoi șapte, apoi opt. 468 00:21:27,330 --> 00:21:31,990 >> Deci, acum, de ce este acest lucru în cele din urmă revelatoare, mai ales în cazul în care n și logaritmi mai mult 469 00:21:31,990 --> 00:21:35,487 în general, prefera să scape, cel puțin din ultimul timp? 470 00:21:35,487 --> 00:21:37,070 Ei bine, observa înălțimea de acest lucru. 471 00:21:37,070 --> 00:21:41,230 Am avut opt ​​elemente, și ne-am împărțit prin două, câte două, câte două. 472 00:21:41,230 --> 00:21:44,590 Deci, jurnal de bază doi de opt ani ne dă trei. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 Și crede-mă pe faptul că, dacă un pic neclar pe care. 475 00:21:48,540 --> 00:21:54,710 Dar log baza doi din opt este de trei, așa că am făcut trei straturi de fuziune. 476 00:21:54,710 --> 00:21:57,170 Și când am fuzionat Elemente, cât de multe elemente 477 00:21:57,170 --> 00:21:58,950 ne-am uita la fiecare dintre aceste rânduri? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Un total de n, corect? 480 00:22:01,437 --> 00:22:04,020 Pentru ca să fuzioneze rândul de sus, chiar dacă am făcut-o bucată cu bucată, 481 00:22:04,020 --> 00:22:05,990 ne-am atins în cele din urmă fiecare număr o dată. 482 00:22:05,990 --> 00:22:09,054 Și în al doilea rând, pentru a îmbina aceste liste de dimensiune doi, 483 00:22:09,054 --> 00:22:10,470 am avut de a atinge fiecare element dată. 484 00:22:10,470 --> 00:22:12,690 Și apoi aici într-adevăr în mod clar, în ultimul rând, 485 00:22:12,690 --> 00:22:15,430 am avut de a atinge fiecare dintre cele elemente de dată, dar numai o dată, 486 00:22:15,430 --> 00:22:18,400 deci aici se află, apoi, n log n nostru. 487 00:22:18,400 --> 00:22:21,780 >> Și acum doar pentru a face lucrurile un pic mai formal pentru o clipă, dacă 488 00:22:21,780 --> 00:22:24,260 au fost de a analiza acum acest la un fel de nivel superior 489 00:22:24,260 --> 00:22:28,340 și să încerce să decidă, bine cum s-ar putea merge cu privire la exprimarea 490 00:22:28,340 --> 00:22:31,780 timpul de execuție a acestui algoritm doar uitandu-te la ea și nu 491 00:22:31,780 --> 00:22:33,590 prin utilizarea unui exemplu inventate? 492 00:22:33,590 --> 00:22:36,590 Ei bine, cât de mult timp ai spune un pas ca acest lucru în galben s-ar lua, 493 00:22:36,590 --> 00:22:37,173 dacă n <2 schimb? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 Asta-i o O mare de ce? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Deci, eu văd unul, așa un pas, poate două etape, pentru că, dacă 498 00:22:44,540 --> 00:22:47,110 și apoi să se întoarcă, dar este constantă de timp, nu? 499 00:22:47,110 --> 00:22:49,960 Așa că am spus O (1), și care este cum voi exprima acest lucru. 500 00:22:49,960 --> 00:22:51,480 T, fie doar timpul de funcționare. 501 00:22:51,480 --> 00:22:54,150 n este mărimea de intrare, deci T (n), doar un fel de lux 502 00:22:54,150 --> 00:22:56,330 de a spune funcționare Timp de intrare dat de dimensiune n 503 00:22:56,330 --> 00:23:00,220 va fi pe ordinea de timp constant, în O (1). 504 00:23:00,220 --> 00:23:01,970 >> Dar altfel, ce zici de asta? 505 00:23:01,970 --> 00:23:05,660 Cum te-ai exprima Timp de această linie galbenă care rulează? 506 00:23:05,660 --> 00:23:06,250 T de ce? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Puteți fel de ieftin aici și răspunde la întrebarea mea ciclic. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Deci, în cazul în care timpul de execuție în general putem spune doar este T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 Și acum un fel de punting aici și zis, bine, sorta doar jumătatea stângă, 513 00:23:22,490 --> 00:23:23,920 și apoi sorta jumătatea din dreapta. 514 00:23:23,920 --> 00:23:27,520 Cum am putea reprezenta simbolic timpul de execuție a acestei linii de culoare galbenă? 515 00:23:27,520 --> 00:23:28,020 T de ce? 516 00:23:28,020 --> 00:23:29,360 Care este mărimea de intrare? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n peste două. 519 00:23:31,057 --> 00:23:32,140 De ce nu am spus asta? 520 00:23:32,140 --> 00:23:36,449 Apoi acesta este un alt T (n / 2) și apoi din nou, dacă am uni două jumătăți sortate, 521 00:23:36,449 --> 00:23:38,615 cât de multe elemente de voi trebui să atingă totală? 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 Deci, eu pot exprima acest lucru, doar pentru a fi un fel de fantezie, 525 00:23:42,790 --> 00:23:44,430 ca timpul de execuție, în general. 526 00:23:44,430 --> 00:23:51,140 T (n) este doar timpul de execuție a T (n / 2), plus T (n / 2), la stânga pe jumătate și jumătate drept, 527 00:23:51,140 --> 00:23:55,360 plus O (n), care este, probabil n pași, dar poate că, dacă eu sunt, folosind două degete, 528 00:23:55,360 --> 00:23:57,960 este de două ori mai multe pași, dar e liniar. 529 00:23:57,960 --> 00:24:00,440 E un număr de pași care este un factor de n, 530 00:24:00,440 --> 00:24:02,270 așa că s-ar putea exprima acest lucru ca aceasta. 531 00:24:02,270 --> 00:24:05,550 Și acest lucru este în cazul în care acum ne vom punt la din spate a noastră matematica manual de liceu 532 00:24:05,550 --> 00:24:10,290 suntem că recurenta în cele din urmă sfârșește prin a egala acest lucru, n log n ori, 533 00:24:10,290 --> 00:24:12,530 dacă aveți de fapt, nu afară matematica mai mult formal. 534 00:24:12,530 --> 00:24:13,950 >> Deci, asta e doar două perspective. 535 00:24:13,950 --> 00:24:17,500 Unul numeric cu o hard-coded exemplu reprezentativ 536 00:24:17,500 --> 00:24:21,140 folosind opt numere, si o mai mult privire generală la cum am ajuns acolo. 537 00:24:21,140 --> 00:24:25,670 Dar ceea ce este cu adevarat interesant aici este, din nou, această noțiune de ciclism. 538 00:24:25,670 --> 00:24:26,900 Nu folosesc pentru bucle. 539 00:24:26,900 --> 00:24:29,860 Sunt un fel de definire ceva în termeni de sine, 540 00:24:29,860 --> 00:24:31,950 nu numai cu această funcție matematică, 541 00:24:31,950 --> 00:24:34,860 dar, de asemenea, în ceea ce privește acest cod pseudo. 542 00:24:34,860 --> 00:24:38,260 Acest cod pseudo este recursiv în care doi dintre liniile sale 543 00:24:38,260 --> 00:24:42,310 este, în esență, se spune pentru a merge folosi în sine pentru a rezolva o mică 544 00:24:42,310 --> 00:24:45,400 problemă de dimensiuni mai mici, și apoi din nou și din nou 545 00:24:45,400 --> 00:24:48,820 și din nou, până când ne-am Whittle se până la această așa-numitul caz de bază. 546 00:24:48,820 --> 00:24:52,810 >> Deci, haideți să de fapt desena o mai convingătoare ia-departe de această, după cum urmează. 547 00:24:52,810 --> 00:24:58,420 Lasă-mă să intru în gedit și să ia o uita-te la o parte din codul sursă de astăzi, 548 00:24:58,420 --> 00:24:59,930 în special acest exemplu aici. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, care adaugă aparent numerele de la unu la n. 550 00:25:03,709 --> 00:25:05,750 Deci, hai sa vedem ce este familiar și nefamiliare aici. 551 00:25:05,750 --> 00:25:08,690 În primul rând, avem o pereche de include, deci nimic nou acolo. 552 00:25:08,690 --> 00:25:09,190 Prototype. 553 00:25:09,190 --> 00:25:11,370 Sunt un pic neclar pe această după câteva zile, 554 00:25:11,370 --> 00:25:13,790 dar ceea ce am spus-o prototip al unei funcții este? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 Audiența: [inaudibil]. 557 00:25:16,015 --> 00:25:16,905 SPEAKER 1: Ce-i asta? 558 00:25:16,905 --> 00:25:17,800 Audiența: Am anunța. 559 00:25:17,800 --> 00:25:18,883 SPEAKER 1: Am anunța. 560 00:25:18,883 --> 00:25:22,290 Deci, sunteți de predare răsune, hei, Nu, de fapt punerea în aplicare acest lucru încă, 561 00:25:22,290 --> 00:25:25,740 dar undeva în acest dosar, probabil, va fi o funcție numită ce? 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 Și aceasta este doar o promisiune care o sa arate asa. 565 00:25:30,540 --> 00:25:33,720 O să iau un număr întreg de input-- și eu pot fi mai explicit 566 00:25:33,720 --> 00:25:36,570 și spune int n --and e O să se întoarcă un int, 567 00:25:36,570 --> 00:25:39,900 dar mijloace punct și virgulă, mm, voi primi în jurul pentru punerea în aplicare a acestei un pic mai târziu. 568 00:25:39,900 --> 00:25:40,989 Din nou, răsune este prost. 569 00:25:40,989 --> 00:25:43,280 Este doar o să știe ce l-ai spune de sus în jos, 570 00:25:43,280 --> 00:25:45,765 asa ca am nevoie de cel puțin da un indiciu a ceea ce este de a veni. 571 00:25:45,765 --> 00:25:47,330 >> Acum, să ne uităm la principal aici. 572 00:25:47,330 --> 00:25:50,040 Să defilați în jos și aici vezi ce principal este de a face. 573 00:25:50,040 --> 00:25:53,780 Nu este atât de mult de o funcție, și de fapt, constructul aici este familiar. 574 00:25:53,780 --> 00:25:57,590 Declar o variabilă n, și apoi Am hartuiti din nou și din nou a utilizatorului 575 00:25:57,590 --> 00:26:01,880 pentru un număr întreg pozitiv folosind getint, și numai ieșirea din această buclă 576 00:26:01,880 --> 00:26:03,280 Odată ce utilizatorul a respectat. 577 00:26:03,280 --> 00:26:05,670 Face în timp, ne-am folosit pentru a hartuiti utilizatorul în acest fel. 578 00:26:05,670 --> 00:26:06,670 Acum, acest lucru este interesant. 579 00:26:06,670 --> 00:26:08,510 Declar un int numit "răspuns". 580 00:26:08,510 --> 00:26:11,420 Am valoarea de returnare atribui de o funcție numită "sigma." 581 00:26:11,420 --> 00:26:15,200 Nu știu ce face inca asta, dar Îmi amintesc ao declara în urmă cu o clipă. 582 00:26:15,200 --> 00:26:18,310 Și apoi voi trece în Valoarea pe care utilizatorul introduce, n, 583 00:26:18,310 --> 00:26:20,420 și apoi m-am raporta răspunsul. 584 00:26:20,420 --> 00:26:22,260 Ei bine, să derulați înapoi pentru doar o clipă. 585 00:26:22,260 --> 00:26:28,620 Să mergem mai departe în acest director, face sigma 0, și a alerga de fapt acest program 586 00:26:28,620 --> 00:26:30,490 și să vedem ce se întâmplă. 587 00:26:30,490 --> 00:26:35,930 Deci, dacă am merge mai departe și a alerga acest program, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 și eu de tip într-o pozitiv număr întreg cum ar fi două, Sigma, 589 00:26:40,139 --> 00:26:43,180 ca simbol grecesc implică, este doar Va aduna toate numerele de la 590 00:26:43,180 --> 00:26:44,320 zero până la două. 591 00:26:44,320 --> 00:26:46,560 Deci 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 Deci, acest lucru ar trebui să sperăm, da-mi 3. 593 00:26:48,830 --> 00:26:49,750 Asta e tot ce face. 594 00:26:49,750 --> 00:26:52,690 Și în mod similar, dacă Eu conduc din nou si eu dau numărul trei, 595 00:26:52,690 --> 00:26:56,721 asta e 3 plus 2, astfel încât este 5, plus 1 ar trebui să-mi dea 6. 596 00:26:56,721 --> 00:26:59,470 Și apoi, dacă ajung într-adevăr nebun și începeți să tastați în număr mai mare, 597 00:26:59,470 --> 00:27:01,290 ar trebui să-mi dea sume mai mari și mai mari. 598 00:27:01,290 --> 00:27:02,250 Deci, asta e tot. 599 00:27:02,250 --> 00:27:04,010 >> Deci, ce se sigma arata? 600 00:27:04,010 --> 00:27:05,430 Ei bine, e destul de simplu. 601 00:27:05,430 --> 00:27:08,940 Este modul în care ne-ar fi pus în aplicare aceasta pentru ultimele două săptămâni. 602 00:27:08,940 --> 00:27:11,120 "Int" va fi tipul de întoarcere. 603 00:27:11,120 --> 00:27:14,330 Sigma este numele, și este nevoie de o m variabilă în loc de n. 604 00:27:14,330 --> 00:27:15,940 Voi schimba asta sus. 605 00:27:15,940 --> 00:27:17,340 Apoi, acesta este doar un cec bun-simț. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Vom vedea de ce într-o clipă. 608 00:27:19,950 --> 00:27:24,220 Acum declara o altă variabilă, sumă, se inițializează cu zero. 609 00:27:24,220 --> 00:27:28,140 Apoi am această buclă iterarea, aparent pentru claritate, 610 00:27:28,140 --> 00:27:33,810 de la i = 1 la până la o = m, care este indiferent de utilizatorul tastat în, și apoi am 611 00:27:33,810 --> 00:27:35,690 incrementarea suma de genul asta. 612 00:27:35,690 --> 00:27:37,360 Și apoi să se întoarcă suma. 613 00:27:37,360 --> 00:27:38,440 >> Deci, o serie de întrebări. 614 00:27:38,440 --> 00:27:42,370 O, eu susțin în comentariul meu că această evită riscul de o buclă infinită. 615 00:27:42,370 --> 00:27:45,620 De ce ar trece într-un număr negativ induce, potențial, o buclă infinită? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> Audiența: Nu vei ajunge la m. 618 00:27:51,290 --> 00:27:52,880 >> SPEAKER 1: Nu ajunge m. 619 00:27:52,880 --> 00:27:55,880 Dar m este trecut în, Să ia în considerare un exemplu simplu. 620 00:27:55,880 --> 00:27:58,510 Dacă m este trecut în de utilizator ca unul negativ. 621 00:27:58,510 --> 00:28:00,059 Indiferent de principal. 622 00:28:00,059 --> 00:28:01,850 Principala ne protejează de acest prea, așa că eu sunt doar 623 00:28:01,850 --> 00:28:04,680 fiind într-adevăr anal cu sigma pentru a face, de asemenea sigur 624 00:28:04,680 --> 00:28:06,540 că intrarea nu poate fi negativ. 625 00:28:06,540 --> 00:28:10,130 Deci, dacă m este negativ, ceva de genul unul negativ. 626 00:28:10,130 --> 00:28:11,930 Ce se va întâmpla? 627 00:28:11,930 --> 00:28:14,390 Ei bine, i se va se inițializat la unul, 628 00:28:14,390 --> 00:28:19,060 și apoi i se va fi mai mic sau egal cu m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Stand de. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 Asta fost-- nu-i lăsăm, hai nix această poveste. 633 00:28:29,370 --> 00:28:32,780 Nu am cerut această întrebare, pentru că riscul pe care am aluzie la 634 00:28:32,780 --> 00:28:38,360 nu se va întâmpla pentru că i se întotdeauna va fi mai mare bine than--, 635 00:28:38,360 --> 00:28:39,871 Am retrage această întrebare. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Să ne concentrăm doar pe această parte aici. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 De ce sa declar ceva în afara buclei? 640 00:28:48,830 --> 00:28:52,010 Aviz pe linia 49 am i declarat în interiorul buclei, 641 00:28:52,010 --> 00:28:54,950 dar on-line 48 am a declarat ceva din afara. 642 00:28:54,950 --> 00:28:55,695 Da. 643 00:28:55,695 --> 00:28:56,611 Audiența: [inaudibil]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 SPEAKER 1: Sigur. 646 00:28:59,400 --> 00:29:03,360 Deci, în primul rând eu cu siguranță nu doresc să declare și să inițializa sumă 647 00:29:03,360 --> 00:29:06,130 la zero în interiorul bucla pe fiecare iterație, 648 00:29:06,130 --> 00:29:09,370 deoarece acest lucru ar anula în mod clar Scopul insumarea numerelor. 649 00:29:09,370 --> 00:29:11,770 Mi-ar continua să se schimbe valoarea la zero. 650 00:29:11,770 --> 00:29:17,992 Și, de asemenea, ceea ce este un alt mai multe arcane motiv pentru care aceeași decizie de design? 651 00:29:17,992 --> 00:29:18,954 Da. 652 00:29:18,954 --> 00:29:20,279 >> Audiența: [inaudibil]. 653 00:29:20,279 --> 00:29:21,070 SPEAKER 1: Exact. 654 00:29:21,070 --> 00:29:24,060 Vreau să-l acceseze în afara din bucla prea pe ce linie? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Pe 53. 657 00:29:26,400 --> 00:29:29,910 Și se bazează pe regula noastră de degetul mare de la un cuplu de prelegeri în urmă, 658 00:29:29,910 --> 00:29:33,680 variabile cad, într-adevăr, la acolade care le cuprind. 659 00:29:33,680 --> 00:29:38,190 Deci, dacă eu nu declar sumă interior dintre aceste acolade exterioare, 660 00:29:38,190 --> 00:29:40,250 Nu pot folosi în linie 53. 661 00:29:40,250 --> 00:29:43,160 Pune-un alt mod, în cazul în care am declarat Suma aici, sau chiar în cadrul 662 00:29:43,160 --> 00:29:45,410 Pentru bucla, nu am putut accesa în 53. 663 00:29:45,410 --> 00:29:47,150 Variabila va fi eficient plecat. 664 00:29:47,150 --> 00:29:48,579 Deci, un cuplu de motive de acolo. 665 00:29:48,579 --> 00:29:50,370 Dar acum să ne întoarcem și să vedem ce se întâmplă. 666 00:29:50,370 --> 00:29:51,730 Deci, sigma este chemat. 667 00:29:51,730 --> 00:29:55,640 Se adaugă cu 1 plus 2, sau 1 plus 2 plus 3, după care revine la valoarea, 668 00:29:55,640 --> 00:29:59,660 stochează într-un răspuns, și printf aici De aceea, eu văd pe ecran. 669 00:29:59,660 --> 00:30:03,079 Deci, asta este ceea ce vom numi un iterativ abordare, în cazul în care repetare doar 670 00:30:03,079 --> 00:30:03,870 înseamnă a folosi o buclă. 671 00:30:03,870 --> 00:30:06,900 A Pentru buclă, o buclă în timp ce, o face în timp ce buclă, a face ceva din nou 672 00:30:06,900 --> 00:30:08,380 și din nou și din nou. 673 00:30:08,380 --> 00:30:13,505 >> Dar sigma este un fel de funcție curat în că aș putea să o pună în aplicare în mod diferit. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Ce zici de asta, care doar pentru a fi un fel de rece, 676 00:30:19,120 --> 00:30:21,880 Lasă-mă să scap într-adevăr de o mulțime de distracție 677 00:30:21,880 --> 00:30:24,380 deoarece această funcție este într-adevăr destul de simplu. 678 00:30:24,380 --> 00:30:27,780 Să Whittle-l în jos doar la patru linii sale de bază 679 00:30:27,780 --> 00:30:30,410 și de a scăpa de toate comentarii și acolade. 680 00:30:30,410 --> 00:30:34,334 Aceasta este un fel de minte-suflare implementare alternativă. 681 00:30:34,334 --> 00:30:37,250 Bine, poate nu minte-suflare, dar e un fel de sexy, bine, 682 00:30:37,250 --> 00:30:39,920 să se uite la acest atât de mult mai succint. 683 00:30:39,920 --> 00:30:43,120 Cu doar patru linii de cod, Am prima dată această verificare bun-simț. 684 00:30:43,120 --> 00:30:45,732 Dacă m este mai mic sau egal cu la zero, sigma are nici un sens. 685 00:30:45,732 --> 00:30:48,190 Ar trebui doar să fie în acest caz pentru numere pozitive, 686 00:30:48,190 --> 00:30:50,340 așa că am de gând doar să a reveni la zero arbitrar 687 00:30:50,340 --> 00:30:53,210 astfel încât să putem avea cel puțin unii așa-numitul caz de bază. 688 00:30:53,210 --> 00:30:54,430 >> Dar aici e frumusețea. 689 00:30:54,430 --> 00:30:59,930 Totalitatea acestei idei, adăugând numere de la 1 la n, sau m în acest caz, 690 00:30:59,930 --> 00:31:02,630 se poate face prin fel de trecerea dolar. 691 00:31:02,630 --> 00:31:04,947 Ei bine, ceea ce este suma de la 1 la m? 692 00:31:04,947 --> 00:31:05,780 Ei bine, știi ce? 693 00:31:05,780 --> 00:31:11,949 Este la fel ca suma m plus suma de la 1 la m minus 1. 694 00:31:11,949 --> 00:31:12,740 Ei bine, știi ce? 695 00:31:12,740 --> 00:31:13,940 Ce-i sigma de m minus 1? 696 00:31:13,940 --> 00:31:17,860 Ei bine, dacă ai un fel de urma acestui logic, e la fel ca m minus 1 697 00:31:17,860 --> 00:31:21,415 plus sigma de m minus 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Astfel încât să puteți fel de doar-- acest lucru este ca, daca esti doar 700 00:31:26,012 --> 00:31:28,220 încercarea de a enerva un prieten și ei vă pun o întrebare, 701 00:31:28,220 --> 00:31:31,344 ai un fel de a răspunde cu o întrebare, puteți fel de păstra trece dolar. 702 00:31:31,344 --> 00:31:34,560 Dar ceea ce este important este că, dacă vă păstrați făcând întrebarea în ce mai mici 703 00:31:34,560 --> 00:31:36,910 și mai mic, tu esti nu cer ceea ce este sigma 704 00:31:36,910 --> 00:31:39,116 de n, ceea ce este sigma de n, ceea ce este sigma de n? 705 00:31:39,116 --> 00:31:40,990 Ceri ce-i sigma de n, ceea ce este sigma 706 00:31:40,990 --> 00:31:42,839 de n minus 1, ceea ce este sigma de n minus 2? 707 00:31:42,839 --> 00:31:44,880 În cele din urmă întrebarea dvs. va deveni ceea ce? 708 00:31:44,880 --> 00:31:50,250 Ce este sigma de unul sau de zero, o anumită valoare foarte mică, 709 00:31:50,250 --> 00:31:52,220 și de îndată ce te că, prietenul tău, 710 00:31:52,220 --> 00:31:54,350 nu sunteți de gând să ceară aceeași întrebare din nou, 711 00:31:54,350 --> 00:31:55,975 esti doar de gând să spun, oh e zero. 712 00:31:55,975 --> 00:31:58,490 Am terminat joaca acest fel de joc ciclic stupid. 713 00:31:58,490 --> 00:32:02,950 >> Deci, recursivitate este actul în programare unei funcții numindu-se. 714 00:32:02,950 --> 00:32:06,630 Acest program, atunci când sunt compilate și a alerga, este O să se comporte exact în același mod, 715 00:32:06,630 --> 00:32:09,620 dar ceea ce este important este că în interiorul de o funcție numită sigma, 716 00:32:09,620 --> 00:32:13,150 există o linie de cod care suntem noi înșine de asteptare, 717 00:32:13,150 --> 00:32:14,980 care ar fi în mod normal de rău. 718 00:32:14,980 --> 00:32:21,160 De exemplu, dacă eu primul compilat acest lucru, asa ca sigma-- 719 00:32:21,160 --> 00:32:22,710 face sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Întreg pozitiv, vă rugăm, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Deci, ceea ce funcția pare să fie, bazat pe un test, corect. 723 00:32:30,810 --> 00:32:34,917 Dar dacă am obține un pic periculos și șterge așa-numitul caz de bază, 724 00:32:34,917 --> 00:32:37,750 și să spunem, ei bine eu sunt doar a face acest lucru mai complicat decât este. 725 00:32:37,750 --> 00:32:42,450 Să calculăm sigma prin luarea m și apoi adăugarea 726 00:32:42,450 --> 00:32:44,564 în sigma de m minus unul? 727 00:32:44,564 --> 00:32:45,980 Ei bine, ce se va întâmpla aici? 728 00:32:45,980 --> 00:32:47,140 Să zoom out. 729 00:32:47,140 --> 00:32:52,920 Să recompilați programul, salvați-l, recompilați programul, 730 00:32:52,920 --> 00:33:00,450 și apoi gata ./sigma-1 zoom in, intra întreg pozitiv, vă rugăm, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Câți dintre voi sunteți dispuși pentru Fess până la văzând că? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 Deci, acest lucru se poate întâmpla pentru un număr de motive, 735 00:33:06,690 --> 00:33:09,148 și sincer în această săptămână suntem pe cale de a vă oferi mai multe dintre ele. 736 00:33:09,148 --> 00:33:11,780 Dar, în acest caz, încercați a raționa înapoi 737 00:33:11,780 --> 00:33:14,430 ce s-ar fi întâmplat aici? 738 00:33:14,430 --> 00:33:17,400 Eroare de segmentare, ne-a declarat trecut timp, se referă la un segment de memorie. 739 00:33:17,400 --> 00:33:18,690 Ceva sa întâmplat rău. 740 00:33:18,690 --> 00:33:21,550 Dar ce-a fost mecanic care a mers prost 741 00:33:21,550 --> 00:33:25,000 aici din cauza îndepărtării mele de care așa-numitul cazul de bază, 742 00:33:25,000 --> 00:33:26,870 unde m-am întors o valoare hard-coded? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Ce crezi că a mers prost? 745 00:33:30,460 --> 00:33:31,219 Da. 746 00:33:31,219 --> 00:33:32,135 >> Audiența: [inaudibil]. 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 Bună întrebare. 750 00:33:37,550 --> 00:33:39,508 Deci mărimea numărului că am fost insumarea 751 00:33:39,508 --> 00:33:41,920 ajuns atât de mare, încât a depășit mărimea spațiului de memorie. 752 00:33:41,920 --> 00:33:44,640 Bună idee, dar nu fundamental va provoca un accident. 753 00:33:44,640 --> 00:33:48,230 Asta ar putea duce la overflow întreg, în cazul în care biții doar flip peste 754 00:33:48,230 --> 00:33:51,760 și apoi ne-am confundat-o foarte mare număr de ca un număr negativ, 755 00:33:51,760 --> 00:33:53,260 dar care în sine nu va provoca un accident. 756 00:33:53,260 --> 00:33:55,509 Pentru că, la sfârșitul a zi un întreg este încă 32 de biți. 757 00:33:55,509 --> 00:33:57,640 Nu te duci la fura accidental un pic 33. 758 00:33:57,640 --> 00:33:58,431 Dar un gand bun. 759 00:33:58,431 --> 00:33:58,984 Da. 760 00:33:58,984 --> 00:33:59,900 >> Audiența: [inaudibil]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 SPEAKER 1: Metoda nu opreste, 763 00:34:02,300 --> 00:34:06,658 și într-adevăr, se solicită din nou și din nou și din nou și din nou 764 00:34:06,658 --> 00:34:08,449 și din nou, și nici unul dintre aceste funcții vreodată 765 00:34:08,449 --> 00:34:13,310 termina pentru că linia lor unic de Codul themself cheamă din nou și din nou 766 00:34:13,310 --> 00:34:14,219 și din nou. 767 00:34:14,219 --> 00:34:16,080 Si ceea ce este cu adevărat întâmplă aici, iar acum ne-am 768 00:34:16,080 --> 00:34:18,100 poate desena un fel de acest pictural. 769 00:34:18,100 --> 00:34:20,899 Lasă-mă să merg pe la un imagine pentru doar o clipă. 770 00:34:20,899 --> 00:34:22,940 Aceasta este o imagine, care va carne în cele din urmă 771 00:34:22,940 --> 00:34:26,336 mai în detaliu, de ce se întâmplă în interiorul memoria computerului. 772 00:34:26,336 --> 00:34:28,460 Și se pare că pe în partea de jos a acestui tablou 773 00:34:28,460 --> 00:34:29,709 este ceva numit stiva. 774 00:34:29,709 --> 00:34:31,920 Aceasta este o bucată de memorie, o bucată de RAM, 775 00:34:31,920 --> 00:34:33,920 asta e doar folosit in orice moment o funcție se numește. 776 00:34:33,920 --> 00:34:36,239 De fiecare dată când, un programator, apela o funcție, 777 00:34:36,239 --> 00:34:38,860 sistemul de operare, cum ar fi Mac OS, Windows, Linux sau, 778 00:34:38,860 --> 00:34:41,920 apucă un buchet de bytes, poate o câteva kilobytes, poate câteva megaocteți 779 00:34:41,920 --> 00:34:44,590 de memorie, ele mâinile pentru tine, și apoi vă permite 780 00:34:44,590 --> 00:34:47,650 aveți o funcție utilizând indiferent de variabile care aveți nevoie. 781 00:34:47,650 --> 00:34:50,699 Și dacă apoi apel altul Funcția și o altă funcție, 782 00:34:50,699 --> 00:34:53,590 te un alt felie de memorie și o altă felie de memorie. 783 00:34:53,590 --> 00:34:57,090 >> Și, într-adevăr, dacă aceste tăvi verzi de la Annenberg reprezintă acea memorie, 784 00:34:57,090 --> 00:34:59,870 aici e ceea ce se întâmplă primul timp te sun funcție sigma. 785 00:34:59,870 --> 00:35:04,510 E ca și cum pune o tavă de genul asta pe ceea ce este inițial o stivă de gol. 786 00:35:04,510 --> 00:35:07,142 Dar, apoi, în cazul în care tava se numește, ca să spunem așa, 787 00:35:07,142 --> 00:35:08,850 de asteptare un alt exemplu de sigma, care este 788 00:35:08,850 --> 00:35:11,640 ca și cum cere sistemul de operare, ooh, au nevoie de un pic mai mult de memorie, 789 00:35:11,640 --> 00:35:12,520 da-mi asta. 790 00:35:12,520 --> 00:35:14,840 Și apoi se îngrămădite pe partea de sus. 791 00:35:14,840 --> 00:35:18,030 Dar ceea ce este esențial aici este că prima tava este încă acolo, 792 00:35:18,030 --> 00:35:20,620 pentru că a invocat această a doua tavă. 793 00:35:20,620 --> 00:35:23,500 Acum între timp, sigma suna sigma, asta e ca cere mai multă memorie. 794 00:35:23,500 --> 00:35:25,830 Se îngrămădite pe aici. 795 00:35:25,830 --> 00:35:29,350 sigma numesc sigma, asta e un alt tavă care se îngrămădite pe aici. 796 00:35:29,350 --> 00:35:32,942 Și dacă tot faci asta, în cele din urmă, un fel de hartă acestei vizual 797 00:35:32,942 --> 00:35:35,525 pentru că grafic, ceea ce va întâmpla cu teancul de tăvi? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Acesta va depăși suma de memorie în care computerul are. 800 00:35:41,160 --> 00:35:45,790 Și, de îndată ce acest lucru tavă verde depășește linia orizontală 801 00:35:45,790 --> 00:35:49,410 de mai sus stivă și mai sus că grămadă cuvânt, care ne vom întoarce în viitor, 802 00:35:49,410 --> 00:35:50,410 că este un lucru rău. 803 00:35:50,410 --> 00:35:52,810 Heap este un alt segment de memorie, 804 00:35:52,810 --> 00:35:55,190 iar dacă ai lăsat aceste tăvi morman morman și pe, 805 00:35:55,190 --> 00:35:57,800 ai de gând să depășească propriul segment de memorie, 806 00:35:57,800 --> 00:36:00,420 și un program este într-adevăr de gând să se prăbușească. 807 00:36:00,420 --> 00:36:02,930 >> Acum, ca o paranteza, aceasta idee de recursie, prin urmare, 808 00:36:02,930 --> 00:36:06,500 poate conduce în mod clar la probleme, dar nu este neapărat un lucru rău. 809 00:36:06,500 --> 00:36:08,840 Pentru că ia în considerare, după toate, cum-- și poate 810 00:36:08,840 --> 00:36:11,700 aceasta ia ceva timp sa folosit la reușești elegant sau cât de simplu 811 00:36:11,700 --> 00:36:14,890 că punerea în aplicare a sigma a fost. 812 00:36:14,890 --> 00:36:17,440 Iar noi nu vom folosi recursivitate tot atât de mult în CS50, 813 00:36:17,440 --> 00:36:20,780 dar în CS51, și într-adevăr orice clasă în cazul în care manipula structuri de date 814 00:36:20,780 --> 00:36:23,640 cum ar fi copaci, sau arbori de familie, care au unele ierarhie, 815 00:36:23,640 --> 00:36:26,000 e super, super util. 816 00:36:26,000 --> 00:36:29,750 Acum, ca o paranteza, astfel încât să ca aspiră oamenii de știință de calculator 817 00:36:29,750 --> 00:36:33,180 sunt familiarizați cu unele de Google glume interior, dacă te duci la Google 818 00:36:33,180 --> 00:36:36,345 și te uiți la ceea ce este definiție de, să zicem, recursivitate, intra. 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 Ca o paranteza, am tras câteva. 822 00:36:42,670 --> 00:36:45,470 Acest lucru a fost ca 10 de minute de amânare în această dimineață. 823 00:36:45,470 --> 00:36:52,890 În cazul în care, de asemenea, Google "strâmb," Notă prin înclinarea capului slightly-- 824 00:36:52,890 --> 00:36:55,120 iar apoi acesta este, probabil, cel mai atroce de toate 825 00:36:55,120 --> 00:36:57,286 deoarece cineva a petrecut ca zi de punere în aplicare a acestei 826 00:36:57,286 --> 00:36:59,880 câțiva ani ago-- haide. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, Asteapta-- că e un bug. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Deci, care rulează pe unul dintre cele mai mari site-uri din lume 831 00:37:11,410 --> 00:37:13,510 sunt aceste ouă stupide mici de Paști. 832 00:37:13,510 --> 00:37:16,690 Probabil că consuma o număr trivial de linii de cod 833 00:37:16,690 --> 00:37:19,280 doar astfel încât să putem avea mici lucruri amuzante de genul asta. 834 00:37:19,280 --> 00:37:22,140 Dar cel puțin acum te unele dintre aceste glume interior. 835 00:37:22,140 --> 00:37:28,330 >> Acum, haideți să aruncăm o privire la unele dintre cele mai alb se află noi am spus în ultima vreme, 836 00:37:28,330 --> 00:37:30,707 și începe să coaja înapoi mai multe straturi de vedere tehnic 837 00:37:30,707 --> 00:37:32,790 astfel încât să înțelegeți cu adevărat ceea ce se întâmplă 838 00:37:32,790 --> 00:37:34,860 și puteți înțelege unele dintre amenințările, 839 00:37:34,860 --> 00:37:38,060 ca Shellshock, care au început acum să devină 840 00:37:38,060 --> 00:37:41,110 pe prima linie a tuturor atenție, cel puțin în mass-media. 841 00:37:41,110 --> 00:37:45,810 Deci, aici este o funcție foarte simplu care returnează nimic, nul. 842 00:37:45,810 --> 00:37:46,790 Numele său este de swap. 843 00:37:46,790 --> 00:37:50,880 Este nevoie de două variabile și returnează nimic. 844 00:37:50,880 --> 00:37:52,260 Ia într-o și b. 845 00:37:52,260 --> 00:37:53,337 Deci, o demonstrație rapidă. 846 00:37:53,337 --> 00:37:54,170 Am adus astea. 847 00:37:54,170 --> 00:37:56,100 Am putea foarte bine să ia un pic pauză aici pentru un moment 848 00:37:56,100 --> 00:37:57,250 și au un pic de ceva de băut. 849 00:37:57,250 --> 00:38:00,120 În cazul în care cineva nu ar deranja aderarea ma aici pentru doar o clipă. 850 00:38:00,120 --> 00:38:01,830 Cum despre tine în tricoul maro? 851 00:38:01,830 --> 00:38:02,335 Hai sus. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Doar cea de astăzi. 854 00:38:05,260 --> 00:38:06,251 Mulțumesc, totuși. 855 00:38:06,251 --> 00:38:08,000 Bine, și ne-am vine cine aici? 856 00:38:08,000 --> 00:38:08,660 Care e numele tău? 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 Hai sus. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Deci Laura, provocare foarte simplu de azi. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Mă bucur să yo cunosc. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 În regulă. 866 00:38:16,910 --> 00:38:21,179 Deci avem niște lapte pe aici și Avem niște suc de portocale pe aici 867 00:38:21,179 --> 00:38:23,345 și unele cupe pe care le împrumutat de la Annenberg astăzi. 868 00:38:23,345 --> 00:38:24,178 >> SPEAKER 4: imprumutat. 869 00:38:24,178 --> 00:38:27,240 SPEAKER 1: Si va merge mai departe și vă va oferi o jumatate de pahar de aceasta. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 În regulă. 872 00:38:28,800 --> 00:38:30,750 Și vă vom oferi jumătate un pahar de lapte. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Oh, și doar astfel încât să puteți amintiți-vă cum a fost aceasta ca, 875 00:38:35,890 --> 00:38:38,860 Mi-am amintit de a aduce asta și astăzi. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Bine. 878 00:38:42,530 --> 00:38:45,470 Dacă nu te superi, să vedem, ne-am le pot pune pe propriile ochelari 879 00:38:45,470 --> 00:38:46,560 dacă doriți. 880 00:38:46,560 --> 00:38:48,710 Acest lucru va fi lumea din ochii Laurei. 881 00:38:48,710 --> 00:38:49,210 În regulă. 882 00:38:49,210 --> 00:38:53,820 Deci, obiectivul tău, dat doua cesti de lichid aici, lapte și suc de portocale, 883 00:38:53,820 --> 00:38:58,370 se schimba cele două conținutul, astfel încât suc de portocale merge în ceașcă de lapte 884 00:38:58,370 --> 00:39:00,710 iar laptele intră în cana de suc de portocale. 885 00:39:00,710 --> 00:39:02,359 >> SPEAKER 4: Primesc o ceașcă? 886 00:39:02,359 --> 00:39:05,650 SPEAKER 1: Mă bucur că ați întrebat, deși ar fi fost mult mai bine imagini 887 00:39:05,650 --> 00:39:06,710 dacă nu ai fi întrebat. 888 00:39:06,710 --> 00:39:10,620 Dar da, vă putem oferi un al treilea ceașcă e gol, desigur. 889 00:39:10,620 --> 00:39:11,120 În regulă. 890 00:39:11,120 --> 00:39:12,300 Deci, schimba conținutul acolo. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Foarte frumos. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Foarte bine. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Faci asta remarcabil cu atenție. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 Și pasul trei. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 În regulă. 901 00:39:31,350 --> 00:39:31,930 Excelent. 902 00:39:31,930 --> 00:39:33,930 O rundă mare de aplauze ar fi bine pentru Laura. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 În regulă. 905 00:39:37,000 --> 00:39:40,790 Avem un cadou de despărțire mic pentru tine, dar lasă-mă să iau astea. 906 00:39:40,790 --> 00:39:42,620 Vă mulțumesc foarte mult. 907 00:39:42,620 --> 00:39:46,170 Deci, un exemplu simplu, deși, pentru a demonstra că dacă faci 908 00:39:46,170 --> 00:39:48,300 vreau să schimb conținutul a doua containere, 909 00:39:48,300 --> 00:39:52,360 sau hai sa le numim variabile, aveți nevoie de depozitare temporară 910 00:39:52,360 --> 00:39:56,710 să organizeze una dintre conținutul în așa pe care le puteți face de fapt swap. 911 00:39:56,710 --> 00:40:01,790 Deci, într-adevăr, acest cod sursă de aici până în C este reprezentativ pentru exact acest lucru. 912 00:40:01,790 --> 00:40:06,340 Dacă sucul de portocale fost și laptele a fost b, și ne-am dorit pentru a schimba cele două, 913 00:40:06,340 --> 00:40:08,990 ai putea încerca ceva creativ prin turnarea unul în celălalt, 914 00:40:08,990 --> 00:40:11,031 dar că, probabil, nu ar fi termina deosebit de bine. 915 00:40:11,031 --> 00:40:15,260 Și așa vom folosi o ceașcă treilea, apel ea tmp, T-M-P prin convenție, 916 00:40:15,260 --> 00:40:19,370 și pune conținutul JO în care, atunci schimba-o cana, 917 00:40:19,370 --> 00:40:22,610 apoi pune JO în cupa originală, astfel 918 00:40:22,610 --> 00:40:25,320 realizarea, exact așa cum Laura a făcut, swap. 919 00:40:25,320 --> 00:40:26,850 >> Deci, hai sa facem exact acest lucru. 920 00:40:26,850 --> 00:40:30,110 Lasă-mă să mergeți mai departe și deschide up un exemplu care este 921 00:40:30,110 --> 00:40:32,720 de fapt, numit "nu schimba, "pentru că acest lucru nu este 922 00:40:32,720 --> 00:40:36,180 ca pur si simplu face ca s-ar putea crede. 923 00:40:36,180 --> 00:40:41,190 Deci, în acest program, observăm că Sunt folosind stdio.h, vechiul nostru prieten. 924 00:40:41,190 --> 00:40:43,130 Am prototipul pentru schimb de acolo, care 925 00:40:43,130 --> 00:40:45,450 înseamnă punerea în aplicare a acesteia probabil în jos de mai jos, 926 00:40:45,450 --> 00:40:48,050 și să vedem ce acest principal Programul va face pentru mine. 927 00:40:48,050 --> 00:40:52,020 Declar prima int x devine unul, și int y devine doi. 928 00:40:52,020 --> 00:40:54,930 Deci, cred că de cele de JO și lapte, respectiv. 929 00:40:54,930 --> 00:40:57,100 Și atunci am avea o printf spune x este aceasta 930 00:40:57,100 --> 00:41:00,120 iar y este aceasta, doar așa pot vezi vizual ce se întâmplă. 931 00:41:00,120 --> 00:41:03,810 Apoi am printf susținând că eu sunt schimbarea celor doi, 932 00:41:03,810 --> 00:41:07,100 și apoi am imprima un susțin că acestea sunt schimbate, 933 00:41:07,100 --> 00:41:09,300 și am imprima x și y din nou. 934 00:41:09,300 --> 00:41:13,010 Deci, aici, în schimb este exact ceea ce a făcut Laura, 935 00:41:13,010 --> 00:41:16,240 și exact ceea ce am văzut pe ecran în urmă cu o clipă. 936 00:41:16,240 --> 00:41:19,380 >> Deci, să mergem mai departe și fi crunt dezamăgiți. 937 00:41:19,380 --> 00:41:24,690 Nu fac nici de swap, și a alerga nu de swap, zoom pe ieșirea de aici. 938 00:41:24,690 --> 00:41:28,320 Introduceti x este 1, y este 2, swapping schimbat. 939 00:41:28,320 --> 00:41:32,700 x este încă 1, iar y este încă 2. 940 00:41:32,700 --> 00:41:37,630 Deci, chiar dacă, sincer, acest lucru pare ca exact, deși mai mult de vedere tehnic, 941 00:41:37,630 --> 00:41:40,730 ceea ce a făcut Laura nu părea, la locul de muncă. 942 00:41:40,730 --> 00:41:42,130 Deci, de ce este asta? 943 00:41:42,130 --> 00:41:46,630 Ei bine, se pare că, atunci când vom scrie un program de genul asta 944 00:41:46,630 --> 00:41:51,590 care are atât principal, a subliniat aici, și apoi o altă funcție, cum ar fi swap, 945 00:41:51,590 --> 00:41:54,230 evidențiate aici, care se numește, în lume 946 00:41:54,230 --> 00:41:57,030 arată un pic ceva de genul aceste tăvi în urmă o clipă. 947 00:41:57,030 --> 00:42:00,440 Când principal primul este chemat, e ca și cum cere sistemul de operare 948 00:42:00,440 --> 00:42:04,030 pentru un pic de memorie pentru orice locală variabile cum ar fi x și y, care are principal, 949 00:42:04,030 --> 00:42:05,660 și se sfârșesc aici. 950 00:42:05,660 --> 00:42:10,920 Dar, în cazul în care apelurile principale schimba, și principalul trece de a schimba două argumente, A și B, 951 00:42:10,920 --> 00:42:16,410 suc de portocale și lapte, nu e ca predarea sucul de portocale și lapte 952 00:42:16,410 --> 00:42:17,500 la Laura. 953 00:42:17,500 --> 00:42:21,300 Ce face un calculator, este trece de exemplare ale sucului de portocale 954 00:42:21,300 --> 00:42:27,110 și copii ale laptelui la Laura, astfel încât ceea ce este în cele din urmă în interiorul acestui tavă 955 00:42:27,110 --> 00:42:32,510 este cel de valoare și două, sau JO și lapte, dar copii ale acestora, 956 00:42:32,510 --> 00:42:34,790 astfel încât în ​​acest moment în poveste, acolo 957 00:42:34,790 --> 00:42:36,930 este JO și lapte în fiecare din aceste tăvi. 958 00:42:36,930 --> 00:42:39,260 Există o unul și două în fiecare dintre aceste tăvi, 959 00:42:39,260 --> 00:42:41,720 și funcția de swap este într-adevăr de lucru. 960 00:42:41,720 --> 00:42:46,090 Este le pompare în interiorul de-al doilea cel mai de sus tava, 961 00:42:46,090 --> 00:42:48,147 dar care nu are impact pompare. 962 00:42:48,147 --> 00:42:49,980 Și se bazează pe doar câteva Principiul de bază care le-am 963 00:42:49,980 --> 00:42:52,970 a vorbit despre înainte, și într-adevăr în urmă cu doar câteva minute, ceea ce 964 00:42:52,970 --> 00:42:58,770 s-ar putea explica de ce schimbarea a și b interior de schimb 965 00:42:58,770 --> 00:43:05,560 are nici un efect asupra x și y, chiar dacă Am trecut x și y pentru funcția de swap. 966 00:43:05,560 --> 00:43:08,750 Care este cuvantul cheie aici s-ar putea explica simplist? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Cred că l-am auzit aici? 969 00:43:12,627 --> 00:43:13,335 Audiența: Return. 970 00:43:13,335 --> 00:43:14,085 SPEAKER 1: Înapoi? 971 00:43:14,085 --> 00:43:14,590 Nu se mai întoarcă. 972 00:43:14,590 --> 00:43:15,895 Să mergem cu un altul. 973 00:43:15,895 --> 00:43:16,395 Ce-i asta? 974 00:43:16,395 --> 00:43:17,080 >> Audiența: [inaudibil]. 975 00:43:17,080 --> 00:43:20,000 >> SPEAKER 1: OK, deci revenim am putut face munca de întoarcere în poveste, 976 00:43:20,000 --> 00:43:21,914 dar există o explicație mai simplă. 977 00:43:21,914 --> 00:43:22,580 Audiența: Domeniul de aplicare. 978 00:43:22,580 --> 00:43:23,288 SPEAKER 1: Domeniul de aplicare. 979 00:43:23,288 --> 00:43:24,300 Voi lua domeniu. 980 00:43:24,300 --> 00:43:27,290 Deci domeniul de aplicare, amintiți-vă unde x și y noastre declarate. 981 00:43:27,290 --> 00:43:30,840 Ei au declarat în interiorul de principal chiar aici. 982 00:43:30,840 --> 00:43:33,200 A și B, între timp, sunt a declarat în mod eficient 983 00:43:33,200 --> 00:43:35,930 interior de swap, nu destul de în acolade, dar încă 984 00:43:35,930 --> 00:43:37,690 în domeniul general de swap. 985 00:43:37,690 --> 00:43:40,560 Și astfel, într-adevăr, a și b există numai în această tavă 986 00:43:40,560 --> 00:43:44,850 din Annenberg, această a doua bucată de cod. 987 00:43:44,850 --> 00:43:49,500 Deci, vom schimba într-adevăr copia, dar că nu-i chiar atât de util. 988 00:43:49,500 --> 00:43:52,190 >> Deci, haideți să aruncăm o privire la acest nivel un pic mai jos. 989 00:43:52,190 --> 00:43:55,430 Am de gând să mă întorc în directorul sursă, 990 00:43:55,430 --> 00:43:58,330 și am de gând să primul mări aici, și doar 991 00:43:58,330 --> 00:44:02,290 pentru a confirma că sunt în acest fereastră terminal mai mare, 992 00:44:02,290 --> 00:44:04,430 Programul încă se comportă așa. 993 00:44:04,430 --> 00:44:06,840 Să presupunem acum că această nu este intenționată. 994 00:44:06,840 --> 00:44:10,090 În mod clar am vrut să schimb de lucru, asa ca se simte ca un bug. 995 00:44:10,090 --> 00:44:12,780 Acum am putea începe adăugarea unei mulțime de printf lui la codul meu, 996 00:44:12,780 --> 00:44:16,010 imprimarea x pe aici, y peste aici, un peste aici, b aici. 997 00:44:16,010 --> 00:44:18,220 Dar, sincer, asta e, probabil, ceea ce care le-ați făcut pentru câteva săptămâni 998 00:44:18,220 --> 00:44:20,190 acum, în ore de birou și la domiciliu atunci când se lucrează 999 00:44:20,190 --> 00:44:22,150 pe psets încercarea de a găsi unele bug-uri. 1000 00:44:22,150 --> 00:44:25,560 Dar veți vedea, dacă nu ați făcut deja, că problema stabilit trei va introduce 1001 00:44:25,560 --> 00:44:31,630 la o comandă numită GDB, unde GDB, GNU debugger, 1002 00:44:31,630 --> 00:44:34,040 are în sine o grămadă de caracteristici care pot de fapt 1003 00:44:34,040 --> 00:44:38,160 să ne înțelegem situații în acest fel, dar mai convingător, 1004 00:44:38,160 --> 00:44:39,940 rezolva problemele și pentru a găsi bug-uri. 1005 00:44:39,940 --> 00:44:40,940 Așa că am de gând să fac asta. 1006 00:44:40,940 --> 00:44:44,770 În loc de ./noswap, eu sunt în schimb va rula GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Cu alte cuvinte, am de gând să ruleze meu Programul nu în Bash, noul nostru prieten 1009 00:44:51,200 --> 00:44:51,850 astăzi. 1010 00:44:51,850 --> 00:44:53,970 Am de gând să ruleze meu Programul noswap interior 1011 00:44:53,970 --> 00:44:56,900 din acest alt program numit GDB, care este un program de depanare, care 1012 00:44:56,900 --> 00:45:01,035 este un program care este proiectat pentru a ajuta la Voi oamenii găsi și elimina bug-uri. 1013 00:45:01,035 --> 00:45:03,410 Deci, dacă am lovit Fugi de aici, nu e o cantitate atroce de text 1014 00:45:03,410 --> 00:45:04,868 că nu va trebui într-adevăr să citească. 1015 00:45:04,868 --> 00:45:07,290 Este, în esență, o distragere a atenției de prompt, care 1016 00:45:07,290 --> 00:45:10,030 Am de gând să lovit de control-L să se ridice la partea de sus acolo. 1017 00:45:10,030 --> 00:45:11,800 Aceasta este prompt GDB. 1018 00:45:11,800 --> 00:45:15,550 Dacă vreau să rulați acest program acum, ca această foaie de ieftin mic pe azi 1019 00:45:15,550 --> 00:45:21,860 diapozitiv sugerează, Run este primul Comenzile pe care le menirea de a introduce. 1020 00:45:21,860 --> 00:45:25,150 Și am de gând doar să tastați rula pe aici în interiorul GDB, 1021 00:45:25,150 --> 00:45:26,811 și într-adevăr, ea a fugit programul meu. 1022 00:45:26,811 --> 00:45:29,310 Acum, există unele suplimentare ieșiri de pe ecran ca aceasta, 1023 00:45:29,310 --> 00:45:31,910 dar asta e doar GDB fiind anal și să ne spună ce se întâmplă. 1024 00:45:31,910 --> 00:45:34,451 Nu trebuie într-adevăr să vă faceți griji despre aceste detalii chiar acum. 1025 00:45:34,451 --> 00:45:36,890 Dar ceea ce este cu adevarat misto despre GDB, dacă am face acest lucru again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L șterge screen-- lasă-mă să merg înainte și de tip "sparge principal," astfel, 1027 00:45:42,100 --> 00:45:45,743 când am lovit Enter, stabilind ce este numit un punct de pauză la noswap.c, 1028 00:45:45,743 --> 00:45:51,270 linia 16, care este în cazul GDB a dat seama programul meu de fapt 1029 00:45:51,270 --> 00:45:53,070 este, funcția mea este de fapt. 1030 00:45:53,070 --> 00:45:55,070 Acest vom ignora pentru acum dar asta e adresa 1031 00:45:55,070 --> 00:45:57,310 în memorie în mod special a acestei funcții. 1032 00:45:57,310 --> 00:46:00,240 Așa că acum, când am tip alerga, observa ceea ce e bine aici. 1033 00:46:00,240 --> 00:46:05,650 Programul meu rupe la linia I a spus GDB pentru a întrerupe executarea la. 1034 00:46:05,650 --> 00:46:09,850 Așa că nu trebuie să se schimbe acum codul meu, adăuga unele lui printf, recompilați ea, reluare 1035 00:46:09,850 --> 00:46:13,300 l, schimba, adăuga unele lui printf, salvați-l, recompilați-l, l rulați. 1036 00:46:13,300 --> 00:46:18,100 Eu pot merge doar prin intermediul programului meu pas cu pas cu pas la viteza uman, 1037 00:46:18,100 --> 00:46:20,880 nu la fel Intel-interior de viteză. 1038 00:46:20,880 --> 00:46:24,580 >> Deci, observăm acum această linie Apare aici, iar dacă mă duc înapoi 1039 00:46:24,580 --> 00:46:27,800 la programul meu in gedit, observă că aceasta este de fapt 1040 00:46:27,800 --> 00:46:29,280 prima linie de cod. 1041 00:46:29,280 --> 00:46:31,240 Nu e linia 16 in gedit. 1042 00:46:31,240 --> 00:46:34,610 Nu e linia 16 în GDB, și chiar deși această interfață alb-negru 1043 00:46:34,610 --> 00:46:37,760 nu este aproape la fel de utilizator prietenos, acest lucru înseamnă 1044 00:46:37,760 --> 00:46:41,680 că linia 16 nu a fost executată încă, dar este pe cale de a fi. 1045 00:46:41,680 --> 00:46:46,220 Deci, într-adevăr, dacă am tip de imprimare x, nu printf, doar de imprimare x, 1046 00:46:46,220 --> 00:46:50,730 Am obține o valoare fals acolo de la zero, deoarece x nu a fost inițializat încă. 1047 00:46:50,730 --> 00:46:54,760 Așa că am de gând să tastați următor, sau, dacă vrea să fie fantezie, doar N pentru viitor. 1048 00:46:54,760 --> 00:46:59,090 Dar când am tip următor intra, acum observați că trece la linia 17. 1049 00:46:59,090 --> 00:47:02,840 Deci, logic, dacă l-am executat linia 16 și de tip acum de imprimare x, 1050 00:47:02,840 --> 00:47:03,640 ceea ce ar trebui să văd? 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 >> Iar acum acest lucru este, desigur, confuz. 1054 00:47:07,820 --> 00:47:11,260 2 dolari este doar un mod fantezist de, dacă vreau să mă refer la faptul că valoarea mai târziu, 1055 00:47:11,260 --> 00:47:12,510 vă pot spune "dolar semneze două." 1056 00:47:12,510 --> 00:47:13,480 E ca o referință spate. 1057 00:47:13,480 --> 00:47:14,570 Dar pentru acum, doar ignora-l. 1058 00:47:14,570 --> 00:47:17,070 Ce este interesant este ceea ce-i pe partea dreaptă a semnului egal. 1059 00:47:17,070 --> 00:47:21,000 Și acum, dacă am introduce următorul nou și imprimare y, eu ar trebui sa vedeti 2. 1060 00:47:21,000 --> 00:47:23,870 Pot, de asemenea, acum a imprima x din nou, și sincer, 1061 00:47:23,870 --> 00:47:27,130 dacă Primesc un pic confuz cu privire la unde sunt, am posibilitatea să tastați lista de lista 1062 00:47:27,130 --> 00:47:30,590 și vezi doar câteva context în jurul punctul de fapt sunt la. 1063 00:47:30,590 --> 00:47:35,180 Și acum am posibilitatea să tastați următor, și acolo x este 1. 1064 00:47:35,180 --> 00:47:36,300 Acum tip următor. 1065 00:47:36,300 --> 00:47:37,710 Oh, y este 2. 1066 00:47:37,710 --> 00:47:40,750 Și din nou, ea este confuz, deoarece producția GDB lui 1067 00:47:40,750 --> 00:47:43,044 este amestecat cu propria mea ieșire. 1068 00:47:43,044 --> 00:47:45,710 Dar, dacă vă păstrați în minte, de uitându-se înainte și înapoi la codul 1069 00:47:45,710 --> 00:47:47,740 sau de stabilire în parte by-side poate, veți 1070 00:47:47,740 --> 00:47:51,020 vedea că într-adevăr sunt doar pas cu pas prin programul meu. 1071 00:47:51,020 --> 00:47:54,620 >> Dar observați ce se întâmplă în continuare, la propriu. 1072 00:47:54,620 --> 00:47:56,380 Iată linia 22. 1073 00:47:56,380 --> 00:48:01,315 Lasă-mă să merg pe ea, se deplasează astfel pe la 23, iar în cazul în care am imprima x acum, încă unul. 1074 00:48:01,315 --> 00:48:03,890 Și dacă y imprima acum, încă unul. 1075 00:48:03,890 --> 00:48:05,820 Deci, acest lucru nu este un exercițiu util. 1076 00:48:05,820 --> 00:48:07,450 Deci, să refaceți acest lucru. 1077 00:48:07,450 --> 00:48:10,069 Lasă-mă să mă întorc până la alerga top și de tip nou. 1078 00:48:10,069 --> 00:48:12,110 Și spune programului care fiind depanate 1079 00:48:12,110 --> 00:48:14,109 a început deja, a pornit de la început. 1080 00:48:14,109 --> 00:48:15,420 Da, hai să facem asta din nou. 1081 00:48:15,420 --> 00:48:22,000 Și de această dată să facă în continuare, următor, next, next, next, 1082 00:48:22,000 --> 00:48:24,180 dar acum lucrurile devin interesante. 1083 00:48:24,180 --> 00:48:27,760 Acum vreau să-și intensifice în swap, așa că nu tastați următoarea. 1084 00:48:27,760 --> 00:48:34,380 Am de tip pas, iar acum observăm o mi-a sărit în linie noswap.c 33. 1085 00:48:34,380 --> 00:48:37,240 Dacă mă întorc la gedit, ceea ce-i linia 33? 1086 00:48:37,240 --> 00:48:40,500 Acesta este primul real linie de cod în interiorul de swap. 1087 00:48:40,500 --> 00:48:44,150 Ceea ce este frumos, pentru că acum pot fel de poke în jurul și de a lua curios 1088 00:48:44,150 --> 00:48:46,052 ca la ceea ce se întâmplă cu adevărat acolo. 1089 00:48:46,052 --> 00:48:46,760 Lasă-mă să imprimați tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Uau. 1092 00:48:48,800 --> 00:48:51,438 De ce are tmp avea unele nebun, valoare gunoi fals? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 Audiența: Nu a fost inițializat. 1095 00:48:56,120 --> 00:48:57,150 SPEAKER 1: Nu a fost inițializat. 1096 00:48:57,150 --> 00:49:00,270 Și într-adevăr, atunci când executați un program, ai dat o grămadă de memorie 1097 00:49:00,270 --> 00:49:03,392 de sistemul de operare, dar tu nu s-au inițializat valori, 1098 00:49:03,392 --> 00:49:05,600 deci indiferent de biți esti văd aici, chiar dacă este 1099 00:49:05,600 --> 00:49:07,770 acest negativ nebun mare număr, înseamnă doar 1100 00:49:07,770 --> 00:49:10,750 că acestea sunt rămășițele de la unele utilizarea anterioară a acelui RAM, 1101 00:49:10,750 --> 00:49:13,050 chiar dacă eu nu am am nevoie de el încă. 1102 00:49:13,050 --> 00:49:17,086 Așa că acum am de gând să merg mai departe și de tip următor, iar dacă am introduce acum tmp imprimare, 1103 00:49:17,086 --> 00:49:17,835 ceea ce ar trebui să văd? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Oricare ar fi valoarea unui fost, o este primul argument, doar 1106 00:49:23,360 --> 00:49:25,550 ca x a fost primul lucru fiind trecut în, 1107 00:49:25,550 --> 00:49:30,450 așa a și x trebuie să fie aceeași, astfel imprima tmp ar trebui să-mi imprima o. 1108 00:49:30,450 --> 00:49:36,360 >> Deci, ceea ce veți vedea în set problemă trei este un tutorial de felul pe GDB, 1109 00:49:36,360 --> 00:49:40,020 dar dau seama că acesta este începutul de o privire la un instrument care va de fapt 1110 00:49:40,020 --> 00:49:42,774 ajuta să rezolvați problemele mult mai eficient. 1111 00:49:42,774 --> 00:49:44,690 Ce suntem în cele din urmă va face miercuri 1112 00:49:44,690 --> 00:49:48,180 se începe cu coaja înapoi câteva straturi și scoate niște roți de formare. 1113 00:49:48,180 --> 00:49:50,496 Asta șir lucru numit ca ne-am folosit de ceva timp, 1114 00:49:50,496 --> 00:49:53,370 vom lua încet că departe de la tine și începe să vorbești despre 1115 00:49:53,370 --> 00:49:55,725 ceva mai ezoteric cunoscut ca char *, 1116 00:49:55,725 --> 00:49:59,550 dar vom face acest lucru frumos și mai întâi ușor, chiar dacă indicii, 1117 00:49:59,550 --> 00:50:02,730 cum se numesc, se poate face ceva lucruri foarte rele, dacă abuzate, 1118 00:50:02,730 --> 00:50:06,040 uitandu-se la un mic claymation de la prietenul nostru Nick Parlante de la Stanford 1119 00:50:06,040 --> 00:50:09,670 Universitatea, un profesor de la calculator știință care au pus împreună acest preview 1120 00:50:09,670 --> 00:50:11,075 de ceea ce va urma această miercuri. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [VIDEO PLAYBACK] 1123 00:50:13,400 --> 00:50:13,900 Hei, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Trezește-te. 1126 00:50:15,780 --> 00:50:17,240 E timpul pentru distracție pointer. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Ce-i asta? 1129 00:50:19,350 --> 00:50:21,150 Aflați mai multe despre indicii? 1130 00:50:21,150 --> 00:50:22,050 Ce bine! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END VIDEO PLAYBACK] 1133 00:50:23,730 --> 00:50:25,396 SPEAKER 1: Asta va asteapta miercuri. 1134 00:50:25,396 --> 00:50:26,440 Ne vedem atunci. 1135 00:50:26,440 --> 00:50:27,106 [VIDEO PLAYBACK] 1136 00:50:27,106 --> 00:50:30,420 -Si Acum, Deep Gânduri, de Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> De ce suntem noi de învățare C? 1139 00:50:35,900 --> 00:50:36,785 De ce nu A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Râsete] 1142 00:50:40,910 --> 00:50:42,160 >> [END VIDEO PLAYBACK]