1 00:00:00,000 --> 00:00:12,040 >> [За възпроизвеждане на музика] 2 00:00:12,040 --> 00:00:16,460 >> SPEAKER 1: Добре, това е CS50, и това е началото на четири седмици, 3 00:00:16,460 --> 00:00:20,420 и както може би сте чували или прочетете, светът е бил край. 4 00:00:20,420 --> 00:00:23,520 Отивате всички из интернет е бил на познанията и информираността 5 00:00:23,520 --> 00:00:27,100 на бъг в една програма, език за програмиране, наречен Bash. 6 00:00:27,100 --> 00:00:32,729 Това е чудесно маркови като Shellshock, или вратата на Bash, 7 00:00:32,729 --> 00:00:35,485 но статии като тези не са били рядкост. 8 00:00:35,485 --> 00:00:38,807 И в действителност, много от тях донесе обратно спомени от Heartbleed, 9 00:00:38,807 --> 00:00:41,640 които може би сте забелязали в натиснете отново тази пролет, което 10 00:00:41,640 --> 00:00:43,980 беше по същия начин доста драматично. 11 00:00:43,980 --> 00:00:47,110 Сега на тези от вас, тук днес, колко от вас имат, 12 00:00:47,110 --> 00:00:50,330 дори и да не разбирам какво всичко е въпрос, чувал Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Добре, а колко от вас има компютри, които са в уязвимо положение? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, трябва да има много, много повече ръце точно сега, по причини, ще видим. 17 00:01:00,250 --> 00:01:02,580 >> Нека хвърлим един поглед към това, което е продължава в медиите 18 00:01:02,580 --> 00:01:05,304 и след това да го обясня малко тук за нас е технически. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> SPEAKER 2: Експерти по сигурността са предупреди, че сериозен недостатък може 21 00:01:11,250 --> 00:01:15,650 да за да засегне стотици милиони потребители на интернет в света. 22 00:01:15,650 --> 00:01:20,600 И така, какво точно е бъг, който е бил наречен Shellshock, и какво прави той? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Е, Shellshock е известен също като Баш бъг, софтуерът го експлоатира. 25 00:01:28,910 --> 00:01:33,230 Хакерите използват вируса да сканира уязвими системи, работещи под Linux и Unix 26 00:01:33,230 --> 00:01:36,300 операционни системи и след това да ги заразят. 27 00:01:36,300 --> 00:01:38,730 Bash е обвивка на командния ред. 28 00:01:38,730 --> 00:01:43,460 Това позволява издаване потребители заповядва да започне програми и функции в рамките на софтуер 29 00:01:43,460 --> 00:01:45,250 чрез въвеждане на текст. 30 00:01:45,250 --> 00:01:49,980 Това обикновено се използва от програмистите, и не трябва да бъдат отворени към широкия свят, 31 00:01:49,980 --> 00:01:51,590 макар Shellshock променя това. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Е, worringly, някои анализатори предупреждават, че то би могло да бъде по-голяма заплаха, 34 00:01:57,910 --> 00:02:01,580 защото Shellshock позволява пълна контрол на заразената машина, 35 00:02:01,580 --> 00:02:06,030 като има предвид, Heartbleed разрешено само хакери, за да шпионира компютри. 36 00:02:06,030 --> 00:02:09,130 Това е толкова сериозна, че е е класиран на 10 място от 10 37 00:02:09,130 --> 00:02:11,900 за тежест от Националната Уязвимост Database. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2.3 на всички уеб сървъри са най- риск, включително и някои Mac компютри. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Е, не забравяйте да закърпи вашите системи сега. 42 00:02:25,600 --> 00:02:29,330 Всеки хостинг уебсайт бягане засегнатите операционни системи 43 00:02:29,330 --> 00:02:31,800 трябва да предприемат действия възможно най-скоро. 44 00:02:31,800 --> 00:02:35,390 Всеки, който може да си позволи това трябва да изглежда за прилагането им наблюдение и уеб 45 00:02:35,390 --> 00:02:37,355 защитни стени, за да се грижа за някакви атаки. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 SPEAKER 3: Най-лошото нещо, че може да се случи е 48 00:02:41,770 --> 00:02:45,080 че някой би могъл да напише код, който автоматично ще отида и да сканирате 49 00:02:45,080 --> 00:02:48,280 интернет и това би засегнало Всички тези компютри. 50 00:02:48,280 --> 00:02:50,710 И след като го правят, добре, най-лошото нещо, което можеше да направи 51 00:02:50,710 --> 00:02:53,300 е просто да изтриете всичко, или затвори обектите надолу. 52 00:02:53,300 --> 00:02:55,360 Така че ние може да видите щети от тази гледна точка, 53 00:02:55,360 --> 00:02:58,300 където ще имаме злонамерени хора който току-що реши да предизвика хаос 54 00:02:58,300 --> 00:03:02,534 като приведе системи надолу или изтриване файлове, и такива неща. 55 00:03:02,534 --> 00:03:05,200 SPEAKER 2: Някои казват, че това е един от най-трудно да се измери 56 00:03:05,200 --> 00:03:08,080 бъгове в година, и го може да отнеме седмици или дори 57 00:03:08,080 --> 00:03:10,820 месеца, за да определят крайната му въздействие. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> SPEAKER 1: Така че всичко това е вярно, но смешното е, че почти всички 60 00:03:15,560 --> 00:03:18,330 на образността току-що видяхте, с изключение може би на клавиатурата, 61 00:03:18,330 --> 00:03:20,930 няма нищо общо с бъг, каквато. 62 00:03:20,930 --> 00:03:23,960 Сървъри и кабели и така нататък, Това е нещо тангенциално, свързани, 63 00:03:23,960 --> 00:03:27,410 но в основата е всъщност доста запознати какво става тук. 64 00:03:27,410 --> 00:03:30,050 Всъщност, нека да отидат в нашата CS50 уред. 65 00:03:30,050 --> 00:03:32,910 Нека да вървим напред и да се максимизира терминален прозорец тук. 66 00:03:32,910 --> 00:03:36,020 А вие момчета са използвали това, или вградения версия от него, 67 00:03:36,020 --> 00:03:39,460 в Gedit, за да пишат програми, въведете команди, и така нататък, 68 00:03:39,460 --> 00:03:43,690 и това е действително, и има бил в продължение на седмици, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Това е най-Борн отново Shell, който е само един луксозен начин на казвайки: 70 00:03:46,890 --> 00:03:50,220 това е програма, която има мига бързо, ефективно, 71 00:03:50,220 --> 00:03:51,970 който седи там и те чака за вход за вас. 72 00:03:51,970 --> 00:03:53,920 И това е командата линия интерфейс, чрез който 73 00:03:53,920 --> 00:03:57,650 момчета са били работещи команди и в крайна сметка съставянето и след това работи 74 00:03:57,650 --> 00:03:58,400 програми. 75 00:03:58,400 --> 00:04:01,320 >> Но Bash е и програмиране език в следния смисъл. 76 00:04:01,320 --> 00:04:05,460 Вие знаете, че има команди като CD и LS, а също и звъня и други, 77 00:04:05,460 --> 00:04:09,580 но можете да зададете вашите собствени команди от прилагането им в Bash. 78 00:04:09,580 --> 00:04:11,420 Сега ние няма да навлиза в големи подробности 79 00:04:11,420 --> 00:04:16,089 за да Баш на езика за програмиране, но Знам, например, че в момента, 80 00:04:16,089 --> 00:04:17,607 там не е команда, наречена "здравей". 81 00:04:17,607 --> 00:04:19,440 Така че може да се намери в един от тези пакети. 82 00:04:19,440 --> 00:04:20,856 Това не е инсталиран на компютъра ми. 83 00:04:20,856 --> 00:04:21,870 Помолете вашия администратор. 84 00:04:21,870 --> 00:04:26,030 Но ако искам да има една програма наречен "здравей" в Bash или в моя ред 85 00:04:26,030 --> 00:04:30,810 Аз всъщност може да се използва синтаксис, който е съвсем като C. Това не е съвсем същото, 86 00:04:30,810 --> 00:04:35,020 но тя изглежда доста сходен с функция, макар и липсват някои подробности. 87 00:04:35,020 --> 00:04:38,090 Сякаш нищо не може да се случи, но сега, ако напишете "здравей" 88 00:04:38,090 --> 00:04:40,960 всъщност можете да напишете програма, а не в C не, в Java, 89 00:04:40,960 --> 00:04:44,280 не в друг програмиране език, но сам по себе си Bash. 90 00:04:44,280 --> 00:04:47,630 >> Сега ключът тук е, че аз написах назовем Исках да дам тази нова команда, 91 00:04:47,630 --> 00:04:50,820 и скобите също са символ на това е функция. 92 00:04:50,820 --> 00:04:54,010 Като настрана, вие също може да направи забавно неща, а в действителност, дори и за Mac OS, 93 00:04:54,010 --> 00:04:55,620 това е програма, наречена терминал. 94 00:04:55,620 --> 00:04:58,800 Той идва вграден в ничии компютър, който има Mac в тази стая, 95 00:04:58,800 --> 00:05:03,640 и можете да направите подобни неща в Mac OS, но можете да отидете по-далеч. 96 00:05:03,640 --> 00:05:07,110 И това е малко по допирателна, но това е вид забавление. 97 00:05:07,110 --> 00:05:09,715 Тази сутрин ми напомни, когато мисля това чрез, 98 00:05:09,715 --> 00:05:13,279 на малка игра Използвах да играе с един от бившите TFS CS50 е 99 00:05:13,279 --> 00:05:16,570 при което всеки път, когато той ще си тръгне от клавиатурата си с екранния си отключена, 100 00:05:16,570 --> 00:05:23,611 Бих изпълни команда като това-- "казват здравей". 101 00:05:23,611 --> 00:05:26,610 И сега всеки път, когато той се върна, за да му клавиатура, след като изчисти екрана 102 00:05:26,610 --> 00:05:27,985 и той ще седне, Опитвам се да направя някаква работа, 103 00:05:27,985 --> 00:05:29,250 списък на съдържанието на неговата directory-- 104 00:05:29,250 --> 00:05:29,510 >> [AUDIO PLAYBACK] 105 00:05:29,510 --> 00:05:30,010 >> Здравейте. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Здравейте. 108 00:05:32,120 --> 00:05:35,030 >> SPEAKER 1: Така че, в справедливост, това не е всъщност "здравей". 109 00:05:35,030 --> 00:05:36,894 Той обикновено е нещо, по-близко до че-- 110 00:05:36,894 --> 00:05:37,560 [AUDIO PLAYBACK] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 SPEAKER 1: --that I would-- така че компютърът му ще 113 00:05:39,320 --> 00:05:42,170 Кълна се в него всеки път, когато той действително седна на клавиатурата си. 114 00:05:42,170 --> 00:05:46,265 И много бързо той измисли да не напускат екрана си отключена. 115 00:05:46,265 --> 00:05:48,730 Но това предполага вид глупаво забавно, че 116 00:05:48,730 --> 00:05:50,210 може да има с нещо като Bash. 117 00:05:50,210 --> 00:05:52,770 Но това е малко по- сериозна, за да бъде сигурен, от това. 118 00:05:52,770 --> 00:05:57,235 И в действителност, това е един от най- Най-опасното и дълго-трайни бъгове 119 00:05:57,235 --> 00:05:58,860 че е наистина хит на света в глобален мащаб. 120 00:05:58,860 --> 00:06:02,060 Този бъг е бил около за около 20 години, 121 00:06:02,060 --> 00:06:05,780 и ще бъде постигнат само с момент от относителната му простота. 122 00:06:05,780 --> 00:06:07,990 >> Така че това е представител заповядай ако 123 00:06:07,990 --> 00:06:10,448 притежавате Mac, буквално точно сега когато имате капак си отворени, 124 00:06:10,448 --> 00:06:12,940 можете да се опитате да пишете в тази програма, наречена Terminal. 125 00:06:12,940 --> 00:06:15,410 Терминал е под Заявленията Utilities-- 126 00:06:15,410 --> 00:06:18,790 за пръв път, потребителите на Windows, не трябва да притеснявате за този конкретен threat-- 127 00:06:18,790 --> 00:06:22,310 но тези от вас, с Mac-ове може да въведете това в един прозорец като аз ще направя тук, 128 00:06:22,310 --> 00:06:24,210 и ако се объркате че в тази програма 129 00:06:24,210 --> 00:06:28,830 наречена Terminal, като аз ще направя сега, Ако видите думата "уязвим" 130 00:06:28,830 --> 00:06:32,200 компютърът ви е уязвими към експлоатация. 131 00:06:32,200 --> 00:06:33,850 >> Сега какво означава това всъщност означава? 132 00:06:33,850 --> 00:06:35,870 И това е наистина някои доста луд синтаксис, 133 00:06:35,870 --> 00:06:39,050 но нека поне да очертае някои интересни аспекти. 134 00:06:39,050 --> 00:06:42,567 Така че има някакъв синтаксис, който изглежда малко запознати, най-малко от C 135 00:06:42,567 --> 00:06:43,950 и програмирането като цяло. 136 00:06:43,950 --> 00:06:47,550 Виждам някои скоби, точка и запетая, фигурни скоби, както и такива, 137 00:06:47,550 --> 00:06:50,820 но се оказва, че този глупаво нещо тук в жълто 138 00:06:50,820 --> 00:06:53,580 е основно функция който не прави нищо. 139 00:06:53,580 --> 00:06:57,840 Средствата за дебелото черво не правят нищо, и запетая означава да спрем да правим нищо. 140 00:06:57,840 --> 00:07:00,250 Така вътре на тези фигурни скоби, фактът, 141 00:07:00,250 --> 00:07:02,440 че имам равен подпише наляво, това 142 00:07:02,440 --> 00:07:05,500 е по същество създаване команда или променлива, 143 00:07:05,500 --> 00:07:09,520 наречена X, и да го възлагане че жълто малко код там. 144 00:07:09,520 --> 00:07:14,040 Това може да бъде нещо като "ехо здравей "или" казват звуков сигнал "или нещо 145 00:07:14,040 --> 00:07:15,120 близко до това. 146 00:07:15,120 --> 00:07:17,780 Но забележете, ако очите ви скитат допълнително надясно, 147 00:07:17,780 --> 00:07:22,150 има още за тази линия от само до края на тази точка и запетая. 148 00:07:22,150 --> 00:07:25,160 "Ехо уязвими", а след това отвъд това има още повече. 149 00:07:25,160 --> 00:07:26,530 Друга точка и запетая, Баш -c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Така че, дълга история кратко, тази линия на код е 152 00:07:34,050 --> 00:07:36,660 достатъчни за убедителна компютър, на който е 153 00:07:36,660 --> 00:07:39,830 уязвими към правя нещо че вие ​​искате да направите, 154 00:07:39,830 --> 00:07:44,290 защото има бъг в Bash, при която макар Bash е трябвало да спре 155 00:07:44,290 --> 00:07:48,980 нощни линии на команда полето там след жълт текст 156 00:07:48,980 --> 00:07:52,520 за 20-те години стар бъг, Всъщност Bash е бил четене 157 00:07:52,520 --> 00:07:56,780 отвъд тази точка и запетая и доста много прави това, което е казал. 158 00:07:56,780 --> 00:07:59,070 >> И така, какво е отражението от които в крайна сметка? 159 00:07:59,070 --> 00:08:01,340 Току-що каза, че "ехо здравей" или "ехо-уязвими", 160 00:08:01,340 --> 00:08:05,449 Но какво, ако си направил нещо всъщност злонамерени, като RM-RF * 161 00:08:05,449 --> 00:08:07,240 които може да не някога сте написали преди, 162 00:08:07,240 --> 00:08:08,920 и честно казано, най-вероятно не трябва да е твърде скоро, 163 00:08:08,920 --> 00:08:10,700 защото можете да направите много на увреждане с него. 164 00:08:10,700 --> 00:08:11,210 Защо? 165 00:08:11,210 --> 00:08:12,990 RM прави това, което, разбира се? 166 00:08:12,990 --> 00:08:14,270 Премахва. 167 00:08:14,270 --> 00:08:15,930 * И какво означава това? 168 00:08:15,930 --> 00:08:16,430 All. 169 00:08:16,430 --> 00:08:18,180 Така че това е така наречената див карта, така че това означава 170 00:08:18,180 --> 00:08:20,410 изтриете всичко в текущата директория. 171 00:08:20,410 --> 00:08:23,379 -r случва да означава рекурсивно, което означава, че ако това, което изтриване 172 00:08:23,379 --> 00:08:26,420 е директория, а вътре от там е други файлове и други директории, 173 00:08:26,420 --> 00:08:28,950 рекурсивно потопите в там и да изтриете всичко това. 174 00:08:28,950 --> 00:08:31,040 И -f е най-лошото от всички тях. 175 00:08:31,040 --> 00:08:32,580 Някой знае ли какво означава -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 Така принуди средства, дори ако това е лоша идея, 179 00:08:37,830 --> 00:08:40,939 го направя, без да ме накара за по-нататъшно потвърждение. 180 00:08:40,939 --> 00:08:43,230 Така че, знаете ли, ние се смеят това, но честно казано, аз вероятно 181 00:08:43,230 --> 00:08:44,972 тип, това няколко пъти на ден, защото реалността 182 00:08:44,972 --> 00:08:47,210 е, че е най-бързият начин да се изтриете цял куп неща. 183 00:08:47,210 --> 00:08:48,590 Но дори и аз направих някои щети. 184 00:08:48,590 --> 00:08:53,100 >> Но ако ви се налага да подвежда компютър в определянето на някаква глупава променлива 185 00:08:53,100 --> 00:08:56,810 или функция, наречена X, но тогава разиграва компютъра в изпълняващата 186 00:08:56,810 --> 00:09:00,030 извън границите на тази функция, след тази точка и запетая, 187 00:09:00,030 --> 00:09:04,430 бихте могли наистина трик компютър в изпълнение на нещо като RM-RF 188 00:09:04,430 --> 00:09:07,810 или командата Email или командата Copy. 189 00:09:07,810 --> 00:09:11,400 Всичко, буквално можеш да направиш с компютър, независимо дали това е изтриване на файлове, 190 00:09:11,400 --> 00:09:15,350 създаване на файлове, спам някой, атакува някои сървър от разстояние, 191 00:09:15,350 --> 00:09:17,190 ако можете да го изразя с команда, можете 192 00:09:17,190 --> 00:09:19,120 може да подвежда компютър в правиш това. 193 00:09:19,120 --> 00:09:21,510 >> Сега това, което е пример за как можете да направите това? 194 00:09:21,510 --> 00:09:24,300 Е, има много компютри на интернет бягане Баш. 195 00:09:24,300 --> 00:09:26,390 Всички потребители нас Mac са сред тях. 196 00:09:26,390 --> 00:09:30,390 Много от Linux сървъри са сред тях, както и Unix сървъри. 197 00:09:30,390 --> 00:09:32,630 Windows отново получава относително разстояние от куката 198 00:09:32,630 --> 00:09:34,590 освен ако не сте инсталирали специален софтуер. 199 00:09:34,590 --> 00:09:37,130 Сега много от сървъри, за Например, работят уеб сървъри, 200 00:09:37,130 --> 00:09:39,840 и в действителност Linux е може би най- най-популярната операционна система 201 00:09:39,840 --> 00:09:43,060 да работи на компютри в интернет които са генерирането на уеб страници. 202 00:09:43,060 --> 00:09:44,910 Сега, както ще видим по-късно в семестъра, когато 203 00:09:44,910 --> 00:09:48,470 ви изпрати искане от Вашата browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- към отдалечен сървър, 205 00:09:50,790 --> 00:09:53,730 Оказва се, че въпреки че просто написали www.example.com, 206 00:09:53,730 --> 00:09:59,590 Вашия браузър е изпращане на съобщение това е малко по-тайнствена, като този. 207 00:09:59,590 --> 00:10:01,239 >> Но забележите нещо странно. 208 00:10:01,239 --> 00:10:03,030 Първите два реда Никога не съм виждал преди, 209 00:10:03,030 --> 00:10:04,904 но те не изглеждат особено заплашително. 210 00:10:04,904 --> 00:10:08,030 Но забележете какво съм откраднал за третия ред тук. 211 00:10:08,030 --> 00:10:13,390 Ако лош човек е трябвало да изпрати съобщение като това от своя компютър 212 00:10:13,390 --> 00:10:17,270 към уязвима Mac или уязвима Linux сървър, 213 00:10:17,270 --> 00:10:21,580 Най-смешното е, че Bash, че просто малко командния ред, 214 00:10:21,580 --> 00:10:27,450 е вездесъщ и често е употребяван по същество изпълни 215 00:10:27,450 --> 00:10:30,020 съдържанието на съобщение, което го получава. 216 00:10:30,020 --> 00:10:33,490 И от тази логика, може да трик уеб сървър, следователно, 217 00:10:33,490 --> 00:10:36,370 чрез изпращане на нещо подобно User-Agent, който обикновено 218 00:10:36,370 --> 00:10:38,300 е трябвало да се каже, името на вашия браузър. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent интернет Explorer, User-Agent Firefox, тази 220 00:10:42,420 --> 00:10:44,590 е само на вашия браузър начин на самия идентифициране. 221 00:10:44,590 --> 00:10:46,605 Но ако лош човек много умело казва, mm-mm, аз съм 222 00:10:46,605 --> 00:10:47,930 Няма да ви кажа, какво ми браузър е, 223 00:10:47,930 --> 00:10:50,888 Аз, вместо да ти изпратя това загадъчен изглеждащи нещо с RM-RF 224 00:10:50,888 --> 00:10:55,840 * В нея, вие можете буквално да измамят уязвими уеб сървър в интернет 225 00:10:55,840 --> 00:10:59,055 в изпълнение на точно това в има за изтриване на всички файлове. 226 00:10:59,055 --> 00:11:00,930 И честно казано, това не е дори и най-лошото от него. 227 00:11:00,930 --> 00:11:01,763 Можете да направите нищо. 228 00:11:01,763 --> 00:11:04,480 Можете да започнете разпределена отказ на услуга атака 229 00:11:04,480 --> 00:11:07,030 ако ви изпрати това съобщение до цели букети от уеб сървъри 230 00:11:07,030 --> 00:11:10,256 и след това трябваше всички тях се спускат, за Например, на Harvard.edu сървъри, 231 00:11:10,256 --> 00:11:12,130 и можете да сортирате от взрив по дяволите от тях 232 00:11:12,130 --> 00:11:15,490 от трафика в мрежата, че е задейства по друг начин от този лош човек. 233 00:11:15,490 --> 00:11:18,760 >> Така че, дълга история кратко, почти всички в тази зала, който е собственик на Mac 234 00:11:18,760 --> 00:11:20,240 е уязвима за това. 235 00:11:20,240 --> 00:11:24,100 Сребърната облицовка е, че освен ако не сте работещ уеб сървър на вашия лаптоп, 236 00:11:24,100 --> 00:11:27,780 и освен ако не сте в действителност конфигуриран да позволи нещо подобно SSH в нея, 237 00:11:27,780 --> 00:11:28,670 вие сте всъщност безопасно. 238 00:11:28,670 --> 00:11:31,710 Тя е уязвима, но няма едно се опитва да получите във вашия лаптоп, 239 00:11:31,710 --> 00:11:33,290 така че можете да бъдете сигурни, някак. 240 00:11:33,290 --> 00:11:36,210 Въпреки това, Apple скоро ще бъде актуализиране на решение за това. 241 00:11:36,210 --> 00:11:39,660 В света на Linux вече е освободен редица поправки за Fedora и Ubuntu 242 00:11:39,660 --> 00:11:43,790 и други версии на Linux, и наистина ако ви свършат актуализация 50 в уреда, 243 00:11:43,790 --> 00:11:45,930 дори и това също ще бъде актуализирани и коригирани. 244 00:11:45,930 --> 00:11:47,764 Но това също не е наистина е уязвима, 245 00:11:47,764 --> 00:11:49,804 защото освен ако не сте поиграл с уреда 246 00:11:49,804 --> 00:11:52,770 и да направи своя лаптоп публично достъпни в интернет, което не е 247 00:11:52,770 --> 00:11:54,910 по подразбиране, вие сте всъщност е добре, защото 248 00:11:54,910 --> 00:11:56,890 на защитни стени и други техники. 249 00:11:56,890 --> 00:12:01,000 >> Но това е краен пример за бъг че сме живели в продължение на буквално 20 250 00:12:01,000 --> 00:12:04,050 години, и кой знае, ако някой през цялото това време е известно за него? 251 00:12:04,050 --> 00:12:06,300 И в действителност, това е една от основните предизвикателства 252 00:12:06,300 --> 00:12:08,690 че ние ще видим по-късно в семестър за сигурността, 253 00:12:08,690 --> 00:12:13,020 е, че точно както в реалния свят, добрите момчета са в неизгодно положение. 254 00:12:13,020 --> 00:12:16,500 За да се запази на лошите момчета, ние трябва да уверете се, че всяка врата е заключена, 255 00:12:16,500 --> 00:12:20,340 че всеки прозорец е сигурна, че всяка точка на влизане в дома 256 00:12:20,340 --> 00:12:21,980 е сигурен, за да запази лошите момчета. 257 00:12:21,980 --> 00:12:26,870 Но това, което прави лош човек трябва да направя, за да всъщност компрометира вашия дом 258 00:12:26,870 --> 00:12:28,200 и да открадне от вас? 259 00:12:28,200 --> 00:12:32,574 Той или тя просто трябва да се намери един отключен врата, един счупен прозорец, или нещо 260 00:12:32,574 --> 00:12:35,240 по тези линии, и това е най- едно и също нещо в компютърната сигурност. 261 00:12:35,240 --> 00:12:37,660 Можем да напишем милиони линии на програмния код 262 00:12:37,660 --> 00:12:40,570 и прекарват стотици или хиляди на час, които се опитват да го правилно, 263 00:12:40,570 --> 00:12:43,370 но ако се направи само едно грешка в коректност, 264 00:12:43,370 --> 00:12:47,030 можете да поставите цялата система и Наистина в този случай, целият интернет 265 00:12:47,030 --> 00:12:48,660 и световно застрашени. 266 00:12:48,660 --> 00:12:51,950 >> Така че, ако искате да научите повече за това, отидете на този адрес тук. 267 00:12:51,950 --> 00:12:54,450 Няма нужда за действие тази вечер, освен ако не сте 268 00:12:54,450 --> 00:12:57,116 сред тези, по-удобно, че са Стартирането на собствен уеб 269 00:12:57,116 --> 00:12:59,810 сървър, в който случай трябва, В действителност, да се актуализира софтуера си. 270 00:12:59,810 --> 00:13:03,244 >> И това също е заглавието на реч, а сега и на хартия, 271 00:13:03,244 --> 00:13:05,410 че сме свързани въз уебсайт курс за днес. 272 00:13:05,410 --> 00:13:07,600 Това беше от колега на име Кен Томпсън, който 273 00:13:07,600 --> 00:13:10,120 приемаше много известен награда в областта на компютърните науки, 274 00:13:10,120 --> 00:13:13,495 и той е дал тази реч от няколко години Преди, по същество на същата тази тема. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Питам хора на въпроса, трябва ли наистина 277 00:13:20,520 --> 00:13:23,480 доверие, в крайна сметка, на софтуер, който ми е даден? 278 00:13:23,480 --> 00:13:26,100 Например, всички ние имаме писането на програми, 279 00:13:26,100 --> 00:13:27,820 и ние сме били съставяне тях с звъня. 280 00:13:27,820 --> 00:13:31,830 И за да ви е известно, си написал всички програми за CS50, където има 281 00:13:31,830 --> 00:13:35,310 с гръб към вратата на видове, има и начин , че е лош човек, ако използвате вашата програма, 282 00:13:35,310 --> 00:13:37,410 може да поеме вашия компютър? 283 00:13:37,410 --> 00:13:38,310 Вероятно не, нали? 284 00:13:38,310 --> 00:13:40,180 Марио и алчни, и Credit. 285 00:13:40,180 --> 00:13:41,680 Това са всички доста малки програми. 286 00:13:41,680 --> 00:13:43,910 Вие ще трябва да бъде доста лошо, ако действително 287 00:13:43,910 --> 00:13:47,310 направи целия си компютър уязвими след писмено 10 или 20 реда код, 288 00:13:47,310 --> 00:13:49,690 или най-малко знае на някои на последиците за сигурността. 289 00:13:49,690 --> 00:13:52,023 Сега мога да кажа, че шеговито, но ние отиваме да се види днес 290 00:13:52,023 --> 00:13:54,600 и тази седмица това е всъщност наистина, много лесно 291 00:13:54,600 --> 00:13:57,980 да бъде лошо и да направи дори кратки програми уязвими. 292 00:13:57,980 --> 00:14:02,880 >> Но за сега, най-малко, да разбере, че въпросът се иска тук 293 00:14:02,880 --> 00:14:04,850 е около звъня в компилатор. 294 00:14:04,850 --> 00:14:08,360 Защо сме били доверявайки звъня за последните две или три седмици? 295 00:14:08,360 --> 00:14:12,650 Кой е казал, че всеки, който пише звъня не разполага с "ако" състояние там 296 00:14:12,650 --> 00:14:17,680 която по същество се инжектира някои нули и такива във всяка програма го компилира 297 00:14:17,680 --> 00:14:21,180 че ще позволи на него или нея достъп вашия компютър, когато сте заспали 298 00:14:21,180 --> 00:14:23,580 и вашия лаптоп капак е отворен и компютърът ви работи? 299 00:14:23,580 --> 00:14:24,080 Така ли е? 300 00:14:24,080 --> 00:14:28,350 Ние имаме този вид на полето чест система Сега, когато ние вярваме, че звъня е легален. 301 00:14:28,350 --> 00:14:30,000 Вярваш ли, че уредът е легален. 302 00:14:30,000 --> 00:14:34,430 Вярваш ли, че буквално всяка програма на вашия Mac или PC е надежден. 303 00:14:34,430 --> 00:14:37,510 И тъй като тази проста бъг предполага, дори ако това не е злонамерен, 304 00:14:37,510 --> 00:14:40,580 че абсолютно не е вероятно да се случи. 305 00:14:40,580 --> 00:14:42,350 >> Така че трябва да се плаши като ада. 306 00:14:42,350 --> 00:14:45,560 Честно казано, няма прост разтвор на другия 307 00:14:45,560 --> 00:14:48,185 от един вид на информираност на обществото на нарастващата сложност 308 00:14:48,185 --> 00:14:50,310 че ние строим на върха на нашите компютърни системи, 309 00:14:50,310 --> 00:14:53,740 и как все по-уязвими ние може да бъде много добре. 310 00:14:53,740 --> 00:14:55,570 >> Сега с това каза, Breakout. 311 00:14:55,570 --> 00:14:59,889 Така Breakout е проблем постави три, и Breakout е игра от недалечното минало 312 00:14:59,889 --> 00:15:02,180 , че може да си припомни, но за нас в проблем зададете три, 313 00:15:02,180 --> 00:15:04,450 тя ни позволява да предприемем нещата обратно с една степен 314 00:15:04,450 --> 00:15:08,880 така че когато пишем програми, дори в терминален прозорец, подобен на този, 315 00:15:08,880 --> 00:15:14,670 всъщност ние може да работи, в крайна сметка, графични програми не 316 00:15:14,670 --> 00:15:17,800 за разлика от тези, които имахме достъп в Scratch. 317 00:15:17,800 --> 00:15:20,910 Така че това е те години на персонала изпълнение на Breakout, 318 00:15:20,910 --> 00:15:23,930 който е само на тази тухла-чупене игра, която се движите гребло обратно 319 00:15:23,930 --> 00:15:27,590 и т.н., и те удари топката срещу тези цветни тухли до върха. 320 00:15:27,590 --> 00:15:30,020 Така че това ни доставят нещо обратно до мястото, където 321 00:15:30,020 --> 00:15:33,180 ние бяхме в състояние да бъде много бързо със Scratch, а сега с C, 322 00:15:33,180 --> 00:15:35,800 прилагане на собствената ни графични потребителски интерфейси. 323 00:15:35,800 --> 00:15:38,960 >> Нещо повече, този проблем набор представлява първия 324 00:15:38,960 --> 00:15:41,000 в която ние даваме ви куп код. 325 00:15:41,000 --> 00:15:43,940 И в действителност, аз донесе изрична внимание на това, тъй като особено 326 00:15:43,940 --> 00:15:47,090 за тези, които по-малко удобни, тази проблем настроен, поне на пръв поглед, 327 00:15:47,090 --> 00:15:49,170 ще се чувстват като сме го вземе с една степен. 328 00:15:49,170 --> 00:15:51,540 Защото ние сме ви дали, за някои от търсенето 329 00:15:51,540 --> 00:15:54,930 и сортиране проблеми в pset, куп код, който ние написахме, 330 00:15:54,930 --> 00:15:56,680 и няколко коментари които казват "да направя", 331 00:15:56,680 --> 00:15:58,221 където ще трябва да попълнят празните места. 332 00:15:58,221 --> 00:16:00,020 Така че не е твърде страшно, но това е първият път, 333 00:16:00,020 --> 00:16:03,370 ние ви раздава код, който трябва да първо четене, разбиране, и след това се добавят към 334 00:16:03,370 --> 00:16:04,290 и го завърши. 335 00:16:04,290 --> 00:16:05,940 >> И след това с Breakout, отиваме да направят същото, 336 00:16:05,940 --> 00:16:08,740 който ви дава няколко десетки повече линии на код, който, честно казано, да ви даде 337 00:16:08,740 --> 00:16:11,490 много на рамката за игра, но спрете кратко 338 00:16:11,490 --> 00:16:14,304 на прилагането на тухли и топката и гребло, 339 00:16:14,304 --> 00:16:15,970 но правим изпълнява някои други функции. 340 00:16:15,970 --> 00:16:18,280 И въпреки че на пръв поглед, отново, особено ако по-малко удобни, 341 00:16:18,280 --> 00:16:21,480 може да изглежда особено трудна и ли, че има толкова много нови функции 342 00:16:21,480 --> 00:16:24,070 , което трябва да приключи ума си наоколо, и това е вярно. 343 00:16:24,070 --> 00:16:26,281 Но имайте предвид, че е съвсем като Scratch. 344 00:16:26,281 --> 00:16:28,780 Коефициентите са, че не се е възползвал от всички пъзел парчета в Scratch. 345 00:16:28,780 --> 00:16:31,120 Коефициентите са, че не се грижи за увиване ума си около всички от тях 346 00:16:31,120 --> 00:16:33,617 защото всичко, което се е бърз поглед да се разбере, о, 347 00:16:33,617 --> 00:16:35,450 това е, което мога да направя с това парче пъзел. 348 00:16:35,450 --> 00:16:38,260 И наистина, в проблем зададете 3 спекулация, ние ще ви насочи 349 00:16:38,260 --> 00:16:41,370 в документацията, която ще ви запозная с някои нови функции, 350 00:16:41,370 --> 00:16:43,570 и в крайна сметка на програмирането изгражда, който използвате. 351 00:16:43,570 --> 00:16:47,610 Условия, шлейфове, променливи и функции 352 00:16:47,610 --> 00:16:50,720 ще бъде идентично това, което сме виждали до този момент. 353 00:16:50,720 --> 00:16:53,560 >> Така че, наистина, какво ще даде ви е някакъв код проба, която 354 00:16:53,560 --> 00:16:56,110 ви позволява да създадете прозорец че не изглежда за разлика от това, 355 00:16:56,110 --> 00:16:59,540 и в крайна сметка да го превърне в нещо доста подобно. 356 00:16:59,540 --> 00:17:02,250 Така че да се възползват от CS50, обсъдят работно време и повече, 357 00:17:02,250 --> 00:17:05,290 и спокоен, в това, че размера на код, който трябва да напишете 358 00:17:05,290 --> 00:17:06,760 всъщност не е чак толкова много. 359 00:17:06,760 --> 00:17:10,359 Първото предизвикателство е само за да се аклиматизира себе си до известна код сме написали. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Всякакви въпроси относно pset3, Shellshock, или по друг начин? 362 00:17:15,810 --> 00:17:19,226 >> АУДИТОРИЯ: Той изглеждаше като преживява с Breakout 363 00:17:19,226 --> 00:17:22,154 че кодът е почти обектно-ориентиран стил, 364 00:17:22,154 --> 00:17:24,675 но мислех, че C е обектно-ориентирана програма. 365 00:17:24,675 --> 00:17:26,050 SPEAKER 1: Един отличен въпрос. 366 00:17:26,050 --> 00:17:28,258 Така че в гледа през код разпределение, кодът 367 00:17:28,258 --> 00:17:30,180 писахме за pset3, за тези, запознати, тя 368 00:17:30,180 --> 00:17:32,230 Изглежда, че това е малко обектно-ориентиран. 369 00:17:32,230 --> 00:17:33,800 Краткият отговор е, че това е така. 370 00:17:33,800 --> 00:17:38,130 Това е сближаване на начина, по който може да направи обектно-ориентиран код, като използвате 371 00:17:38,130 --> 00:17:41,850 език като С, но е все пак в крайна сметка процедурно. 372 00:17:41,850 --> 00:17:44,900 Все още няма методи вътре в променливи, както ще видите. 373 00:17:44,900 --> 00:17:46,180 Но това е напомнящ за това. 374 00:17:46,180 --> 00:17:48,780 И ние ще видим, че черта отново когато стигнем до PHP и JavaScript 375 00:17:48,780 --> 00:17:49,946 към края на семестъра. 376 00:17:49,946 --> 00:17:53,667 Но за сега, мисля за него като намек за това какво е да дойде. 377 00:17:53,667 --> 00:17:54,250 Добър въпрос. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 Добре. 380 00:17:56,550 --> 00:17:59,730 Така се сливат вид е как ние леви неща за последен път. 381 00:17:59,730 --> 00:18:03,250 И се сливат вид е готино в смисъл, че е много по-бързо, 382 00:18:03,250 --> 00:18:07,100 най-малко на базата на повърхностни тестове направихме миналата седмица, отколкото, да речем, балон 383 00:18:07,100 --> 00:18:08,710 вид, подбор на сортиране, вмъкване вид. 384 00:18:08,710 --> 00:18:11,780 И това, което е чист прекалено е просто как сбито и чисто 385 00:18:11,780 --> 00:18:12,810 можете да го изразя. 386 00:18:12,810 --> 00:18:15,840 А какво да кажем, че е горна граница на времето за работа на сливане 387 00:18:15,840 --> 00:18:16,340 сортирате? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Да? 390 00:18:18,495 --> 00:18:19,360 >> АУДИТОРИЯ: N влезете п? 391 00:18:19,360 --> 00:18:20,819 >> SPEAKER 1: N влезете N, нали. п влезете п. 392 00:18:20,819 --> 00:18:23,776 И ние ще се върнем към това, че всъщност означава или, когато това идва от, 393 00:18:23,776 --> 00:18:25,570 но това е по-добре от това време на работа 394 00:18:25,570 --> 00:18:28,440 че видяхме за балон подбор и вмъкване вид? 395 00:18:28,440 --> 00:18:30,610 Така н квадрат. N на квадрат е по-голям от този, 396 00:18:30,610 --> 00:18:34,650 и дори и да не е съвсем очевидно, Знам, че дневник н е по-малък от N, 397 00:18:34,650 --> 00:18:36,910 така че ако направя N пъти нещо по-малко от N, 398 00:18:36,910 --> 00:18:38,680 тя ще бъде по-малко от N на квадрат. 399 00:18:38,680 --> 00:18:40,130 Това е малко на интуиция там. 400 00:18:40,130 --> 00:18:42,190 Но ние платихме цената за това. 401 00:18:42,190 --> 00:18:47,000 Тя е по-бързо, но една тема, която започна да се появи миналата седмица беше този компромис. 402 00:18:47,000 --> 00:18:49,804 Имам по-добра производителност време мъдър, но какво 403 00:18:49,804 --> 00:18:52,470 ми трябваше да се харчат за другия ръка, за да се постигне това? 404 00:18:52,470 --> 00:18:53,591 >> АУДИТОРИЯ: Memory. 405 00:18:53,591 --> 00:18:54,465 SPEAKER 1: Кажи го отново? 406 00:18:54,465 --> 00:18:55,173 АУДИТОРИЯ: Memory. 407 00:18:55,173 --> 00:18:57,040 SPEAKER 1: Памет, или пространство като цяло. 408 00:18:57,040 --> 00:18:59,040 И това не е супер очевидно с нашите хора, 409 00:18:59,040 --> 00:19:02,240 но припомни, че нашите доброволци бяха пристъпи напред и засилването 410 00:19:02,240 --> 00:19:04,780 назад, като че ли има един масив тук, и като че ли е 411 00:19:04,780 --> 00:19:07,130 втори масив тук, че те биха могли да използват, защото ние 412 00:19:07,130 --> 00:19:09,080 необходима някъде да се слеят тези хора. 413 00:19:09,080 --> 00:19:11,480 Ние не може просто да ги сменяте на място. 414 00:19:11,480 --> 00:19:13,800 Така се сливат вид ливъридж е по-голямо пространство, което 415 00:19:13,800 --> 00:19:15,620 ние не трябва с други алгоритми 416 00:19:15,620 --> 00:19:17,410 но главата е, че е много по-бързо. 417 00:19:17,410 --> 00:19:20,780 И честно казано, в реалния свят пространство тези days-- RAM, твърд диск Космосът 418 00:19:20,780 --> 00:19:25,030 е сравнително евтин и затова, че е не е непременно нещо лошо. 419 00:19:25,030 --> 00:19:28,320 >> Така че нека хвърлим един бърз поглед, малко по-методично, в това, което сме направили 420 00:19:28,320 --> 00:19:30,220 и защо каза, че е п влезете п. 421 00:19:30,220 --> 00:19:33,260 Така че тук са осем номера, както и осем доброволци, които имахме за последен път. 422 00:19:33,260 --> 00:19:35,718 И първото нещо, което Merge Sort ни каза да направя, е какво? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 АУДИТОРИЯ: Разделя се на две. 425 00:19:38,010 --> 00:19:38,663 SPEAKER 1: Кажи го отново? 426 00:19:38,663 --> 00:19:39,650 АУДИТОРИЯ: Разделя се на две. 427 00:19:39,650 --> 00:19:40,610 SPEAKER 1: Разделя се на две, нали. 428 00:19:40,610 --> 00:19:42,818 Това е много напомня на телефонния указател, разделяй 429 00:19:42,818 --> 00:19:44,220 и да завладее по-общо. 430 00:19:44,220 --> 00:19:45,640 Така че ние погледна към лявата половина. 431 00:19:45,640 --> 00:19:48,700 И тогава, след като ние казахме, нещо лявата половина на елементите, 432 00:19:48,700 --> 00:19:49,690 Какво сме следващия кажа? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Подреди лявата половина на ляво половина, което ни позволи да, 435 00:19:54,860 --> 00:19:57,570 След като се разделят на две, съсредоточи върху четири и две. 436 00:19:57,570 --> 00:20:01,280 >> Как да сортирате списък сега, в жълто, с размер на две, като се използва Merge Sort? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Ами тя се разделя на две, и сортиране на лявата половина. 439 00:20:04,580 --> 00:20:07,100 И това е мястото, където нещата имам малко глупаво за кратко. 440 00:20:07,100 --> 00:20:10,720 Как да сортирате списък, който е на размер един, като този номер четири тук? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Това е сортиран. 443 00:20:13,210 --> 00:20:14,200 Вие сте готови. 444 00:20:14,200 --> 00:20:17,300 >> Но тогава как да сортирате списък на размер един, когато това е номер две? 445 00:20:17,300 --> 00:20:21,640 Е, едно и също нещо, но сега какво е трето и ключовата стъпка в Merge Sort? 446 00:20:21,640 --> 00:20:24,020 Вие трябваше да се слеят в ляво половина и дясната половина. 447 00:20:24,020 --> 00:20:26,580 И след като направихме това, ние погледна на четири, разгледахме две. 448 00:20:26,580 --> 00:20:28,750 Решихме наред, Очевидно две идва на първо място, 449 00:20:28,750 --> 00:20:31,840 така ще се постави две в своята място, последвано от четири. 450 00:20:31,840 --> 00:20:35,010 И сега ще трябва да вид назад, и това е нещо характерно 451 00:20:35,010 --> 00:20:37,570 на алгоритъм като Merge Sort, назад в паметта. 452 00:20:37,570 --> 00:20:40,240 Каква е следващата линия на историята? 453 00:20:40,240 --> 00:20:41,780 Какво трябва да се фокусира върху следващия? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 В дясната половина на ляво половина, което е шест и осем. 456 00:20:47,350 --> 00:20:50,320 >> Така че нека просто да преминете през този без belaboring точката прекалено много. 457 00:20:50,320 --> 00:20:53,330 Шест и осем, а след това шест е подредени, осем се сортира. 458 00:20:53,330 --> 00:20:57,190 Да ги обедините заедно по този начин, и сега следващата голяма стъпка 459 00:20:57,190 --> 00:21:00,990 е, разбира се, сортирате дясната половина от най-първата стъпка на този алгоритъм. 460 00:21:00,990 --> 00:21:02,870 Така че ние се фокусираме върху една, три, седем, пет. 461 00:21:02,870 --> 00:21:04,540 Ние след това се съсредоточи върху лявата половина. 462 00:21:04,540 --> 00:21:09,400 Лявата половина на тази, дясната половина на че и след това се сливат в едно и три. 463 00:21:09,400 --> 00:21:13,100 Тогава дясната половина, след което се оставя половин на него, след това дясната половина от него. 464 00:21:13,100 --> 00:21:15,985 Това Merge в, и сега какво стъпка остава? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Обединяване на големия лявата половина и големите дясната половина, така че човек отива там, 467 00:21:22,460 --> 00:21:27,330 след две, след това три, след това четири, тогава пет, след шест, след седем, след осем. 468 00:21:27,330 --> 00:21:31,990 >> Така че сега, защо е това в крайна сметка разкрива, особено ако п и логаритми повече 469 00:21:31,990 --> 00:21:35,487 като цяло по-скоро да ви избяга, поне в близкото минало? 470 00:21:35,487 --> 00:21:37,070 Е, забележите, че височината на това нещо. 471 00:21:37,070 --> 00:21:41,230 Имахме осем елемента, и ние това разделени на две, като две от две. 472 00:21:41,230 --> 00:21:44,590 Така че влезте база две от осемте ни дава три. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 И повярвай ми, че ако малко неясен за това. 475 00:21:48,540 --> 00:21:54,710 Но влезте база две от осем е три, така че ние сме направили три слоя на сливане. 476 00:21:54,710 --> 00:21:57,170 И когато ние се сляха елементи, колко много елементи 477 00:21:57,170 --> 00:21:58,950 го гледаме на всеки един от тези редове? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Общо N, нали? 480 00:22:01,437 --> 00:22:04,020 Защото, за да се слеят най-горния ред, въпреки че ние го направихме на парче, 481 00:22:04,020 --> 00:22:05,990 ние в крайна сметка докосна всеки брой веднъж. 482 00:22:05,990 --> 00:22:09,054 И във втория ред, за обедините тези списъци с размер два, 483 00:22:09,054 --> 00:22:10,470 ние трябваше да се докосне всеки елемент веднъж. 484 00:22:10,470 --> 00:22:12,690 И след това тук наистина ясно в последния ред 485 00:22:12,690 --> 00:22:15,430 ние трябваше да се докоснат всяка от тези елементи веднъж, но само веднъж, 486 00:22:15,430 --> 00:22:18,400 така че тук се крие, а след това, нашата п дневник п. 487 00:22:18,400 --> 00:22:21,780 >> А сега, само за да направи нещата малко по- по-официално само за миг, ако сте 488 00:22:21,780 --> 00:22:24,260 бяха до сега да анализираме този в един вид на по-високо ниво 489 00:22:24,260 --> 00:22:28,340 и се опитват да решат, и как може да отидеш за изразяване 490 00:22:28,340 --> 00:22:31,780 времето за работа на този алгоритъм само като погледнете в него и да не 491 00:22:31,780 --> 00:22:33,590 чрез използване на скалъпен например? 492 00:22:33,590 --> 00:22:36,590 Е, колко време ще ви кажа стъпка като тази в жълто ще отнеме, 493 00:22:36,590 --> 00:22:37,173 ако N <2 замяна? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 Това е голяма O на какво? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Така че аз виждам едно, така че една стъпка, може би две стъпки, защото това е, ако 498 00:22:44,540 --> 00:22:47,110 и след това се върнете, но това е константно време, нали? 499 00:22:47,110 --> 00:22:49,960 Така че ние казахме O (1), и това е как аз ще изразя това. 500 00:22:49,960 --> 00:22:51,480 T, просто да бъде времето за работа. 501 00:22:51,480 --> 00:22:54,150 N е размерът на вложените материали, така че T (п), само един луксозен начин 502 00:22:54,150 --> 00:22:56,330 Споменаването на протичане време на подадената от размера н 503 00:22:56,330 --> 00:23:00,220 ще бъде от порядъка на постоянно време, в Н (1). 504 00:23:00,220 --> 00:23:01,970 >> А иначе, какво ще кажеш за това? 505 00:23:01,970 --> 00:23:05,660 Как бихте се изрази времето за работа на тази жълта линия? 506 00:23:05,660 --> 00:23:06,250 T на какво? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Можете да вид мамят тук и отговори на въпроса ми циклично. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Така че, ако времето за работа в цяло можем да кажем, е T (N). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 И сега си вид Punting тук и казва, добре, просто сортирате лявата половина, 513 00:23:22,490 --> 00:23:23,920 и след това се справи дясната половина. 514 00:23:23,920 --> 00:23:27,520 Как може ние символично представлява времето за работа на тази жълта линия? 515 00:23:27,520 --> 00:23:28,020 T на какво? 516 00:23:28,020 --> 00:23:29,360 Какъв е размерът на входа? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 N над две. 519 00:23:31,057 --> 00:23:32,140 Защо не мога просто да кажа, че? 520 00:23:32,140 --> 00:23:36,449 И след това е друг T (N / 2) и след това отново, ако се слеят две сортираните половинки, 521 00:23:36,449 --> 00:23:38,615 колко елемента отивам трябва да се докоснат общо? 522 00:23:38,615 --> 00:23:39,780 523 00:23:39,780 --> 00:23:40,320 п. 524 00:23:40,320 --> 00:23:42,790 Така че мога да изразя това, само за да бъде вид фантазия, 525 00:23:42,790 --> 00:23:44,430 като времето за работа като цяло. 526 00:23:44,430 --> 00:23:51,140 Т (п) е само на времето за работа на T (N / 2), плюс T (N / 2), лявата половина и дясната половина, 527 00:23:51,140 --> 00:23:55,360 плюс О (N), който е вероятно N стъпки но може би, ако аз съм с два пръста, 528 00:23:55,360 --> 00:23:57,960 това е два пъти повече стъпки, но това е линейна. 529 00:23:57,960 --> 00:24:00,440 Това е някакъв номер от стъпки това е фактор от N, 530 00:24:00,440 --> 00:24:02,270 така че можем да изразим това, тъй като това. 531 00:24:02,270 --> 00:24:05,550 И това е мястото, където сега ние ще шута към обратно на нашия учебник по математика в гимназията 532 00:24:05,550 --> 00:24:10,290 сме, че повторение в крайна сметка завършва равняващо това, N пъти вляза N, 533 00:24:10,290 --> 00:24:12,530 ако действително направим навън по математика по-официално. 534 00:24:12,530 --> 00:24:13,950 >> Така че това е само на две гледни точки. 535 00:24:13,950 --> 00:24:17,500 Един числено с трудно кодирани представителен пример 536 00:24:17,500 --> 00:24:21,140 с помощта на осем цифри и повече общ поглед към това как сме се озовали там. 537 00:24:21,140 --> 00:24:25,670 Но това, което е наистина интересно тук е, отново, това понятие за колоездене. 538 00:24:25,670 --> 00:24:26,900 Аз не съм с помощта на примки. 539 00:24:26,900 --> 00:24:29,860 Аз съм един вид на определяне нещо по отношение на себе си, 540 00:24:29,860 --> 00:24:31,950 не само с този математическа функция, 541 00:24:31,950 --> 00:24:34,860 но също така и по отношение на тази псевдо-код. 542 00:24:34,860 --> 00:24:38,260 Този псевдо код е рекурсивно в който двама от неговите линии 543 00:24:38,260 --> 00:24:42,310 по същество той казва да отидете Самата използват за решаване на по-малък 544 00:24:42,310 --> 00:24:45,400 проблем с по-малък размер, и след това отново и отново 545 00:24:45,400 --> 00:24:48,820 и отново, докато не го омаловажавам до този така наречен базов модел. 546 00:24:48,820 --> 00:24:52,810 >> Така че нека всъщност направи по-убедителна взема-далеч от това, както следва. 547 00:24:52,810 --> 00:24:58,420 Позволете ми да отида в Gedit и да вземе разгледаме някои от днес изходния код, 548 00:24:58,420 --> 00:24:59,930 по-специално този пример тук. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, което очевидно добавя цифрите един чрез п. 550 00:25:03,709 --> 00:25:05,750 Така че нека да видим какво е запознат и непознати тук. 551 00:25:05,750 --> 00:25:08,690 Първо имаме няколко включва, така че нищо ново там. 552 00:25:08,690 --> 00:25:09,190 Prototype. 553 00:25:09,190 --> 00:25:11,370 Аз съм малко неясен за това след няколко дни, 554 00:25:11,370 --> 00:25:13,790 Но какво да кажем за прототип на функция е? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 АУДИТОРИЯ: [недоловим]. 557 00:25:16,015 --> 00:25:16,905 SPEAKER 1: Какво е това? 558 00:25:16,905 --> 00:25:17,800 АУДИТОРИЯ: Ние го обявим. 559 00:25:17,800 --> 00:25:18,883 SPEAKER 1: Ние го обявим. 560 00:25:18,883 --> 00:25:22,290 Значи вие преподавате звъня, хей, не действително прилагане на настоящия все пак, 561 00:25:22,290 --> 00:25:25,740 но някъде в този файл, вероятно, ще бъде функция, наречена какво? 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 И това е само обещание, че тя ще изглежда по този начин. 565 00:25:30,540 --> 00:25:33,720 Това ще отнеме цяло число, както е input-- и мога да бъда по-ясен 566 00:25:33,720 --> 00:25:36,570 и да кажа, вътр н --and това е ще се върне на ПНА, 567 00:25:36,570 --> 00:25:39,900 но на точка и запетайка средства, mm, ще получават около прилагането на този малко по-късно. 568 00:25:39,900 --> 00:25:40,989 Отново звъня е тъпо. 569 00:25:40,989 --> 00:25:43,280 Това е само да знаем какво ти го кажа горе до долу, 570 00:25:43,280 --> 00:25:45,765 така че ние трябва да даде най-малко това намек за това какво е да дойде. 571 00:25:45,765 --> 00:25:47,330 >> Сега нека да разгледаме основната тук. 572 00:25:47,330 --> 00:25:50,040 Нека да превъртите надолу тук и вижте какво главния прави. 573 00:25:50,040 --> 00:25:53,780 Това не е толкова дълго на функция, и в действителност конструкцията тук е запознат. 574 00:25:53,780 --> 00:25:57,590 Декларирам променлива N, и след това I досаждам потребителят отново и отново 575 00:25:57,590 --> 00:26:01,880 за положително число използвайки getInt, и само изход от този цикъл 576 00:26:01,880 --> 00:26:03,280 След като потребителят се е съобразил. 577 00:26:03,280 --> 00:26:05,670 Направете Докато сме се използва за досаждам на потребителя по този начин. 578 00:26:05,670 --> 00:26:06,670 Сега това е интересно. 579 00:26:06,670 --> 00:26:08,510 Декларирам, едно цяло число, наречено "отговор." 580 00:26:08,510 --> 00:26:11,420 Аз го върнатата стойност зададете на функция, наречена "сигма". 581 00:26:11,420 --> 00:26:15,200 Аз не знам какво още, но Спомням си, че се обявява преди малко. 582 00:26:15,200 --> 00:26:18,310 И тогава аз съм преминаване в стойност, която потребителят въведена, N, 583 00:26:18,310 --> 00:26:20,420 и след това да съобщя отговора. 584 00:26:20,420 --> 00:26:22,260 Ами нека да превъртите обратно само за миг. 585 00:26:22,260 --> 00:26:28,620 Нека вървим напред в тази директория, уверете сигма 0, и всъщност стартирате тази програма 586 00:26:28,620 --> 00:26:30,490 и да видим какво ще стане. 587 00:26:30,490 --> 00:26:35,930 Така че, ако отидете напред и да тичам тази програма, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 и аз въведете в положителна число като две, Sigma, 589 00:26:40,139 --> 00:26:43,180 като гръцкия символ предполага, е само щеше да добавите до всички номера от 590 00:26:43,180 --> 00:26:44,320 нула до два. 591 00:26:44,320 --> 00:26:46,560 Така че 0 плюс 1 плюс 2. 592 00:26:46,560 --> 00:26:48,830 Така че това трябва да се надяваме да ми даде 3. 593 00:26:48,830 --> 00:26:49,750 Това е всичко, което прави. 594 00:26:49,750 --> 00:26:52,690 И по същия начин, ако аз тичам отново и аз я давам на номер три, 595 00:26:52,690 --> 00:26:56,721 това е три плюс две, така че това е 5, плюс един трябва да ми даде 6. 596 00:26:56,721 --> 00:26:59,470 И тогава, ако получа наистина луд и започнете да пишете в по-големи номера, 597 00:26:59,470 --> 00:27:01,290 той трябва да ми даде по-големи и по-големи суми. 598 00:27:01,290 --> 00:27:02,250 Така че това е всичко. 599 00:27:02,250 --> 00:27:04,010 >> Е, какво значи сигма изглежда? 600 00:27:04,010 --> 00:27:05,430 Е, това е доста ясен. 601 00:27:05,430 --> 00:27:08,940 Това е начина, по който може да са приложени това за последните няколко седмици. 602 00:27:08,940 --> 00:27:11,120 "INT" ще бъде типа замяна. 603 00:27:11,120 --> 00:27:14,330 Sigma е името, и това отнема променлива m вместо п. 604 00:27:14,330 --> 00:27:15,940 Ще променим това до върха. 605 00:27:15,940 --> 00:27:17,340 Тогава това е просто проверка на здрав разум. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Ще видим защо в един миг. 608 00:27:19,950 --> 00:27:24,220 Сега аз декларирам друга променлива, Накратко, това се инициализира на нула. 609 00:27:24,220 --> 00:27:28,140 Тогава аз имам този за Контур итерации, очевидно за по-голяма яснота, 610 00:27:28,140 --> 00:27:33,810 от I = 1 на до един = m, което е независимо от потребителя написали в, а след това 611 00:27:33,810 --> 00:27:35,690 нарастване на сумата по този начин. 612 00:27:35,690 --> 00:27:37,360 И след това се върнете сумата. 613 00:27:37,360 --> 00:27:38,440 >> Така няколко въпроса. 614 00:27:38,440 --> 00:27:42,370 One, аз твърдя, в моя коментар, че това избягва риск от безкраен цикъл. 615 00:27:42,370 --> 00:27:45,620 Защо ще преминава в отрицателно число предизвиквайте, потенциално, един безкраен цикъл? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> Публика: Ти никога няма да достигне m. 618 00:27:51,290 --> 00:27:52,880 >> SPEAKER 1: Никога не достигне m. 619 00:27:52,880 --> 00:27:55,880 Но m е преминал в, така че нека да помисли за един прост пример. 620 00:27:55,880 --> 00:27:58,510 Ако m е преминал в от потребител като отрицателен. 621 00:27:58,510 --> 00:28:00,059 Независимо от основната. 622 00:28:00,059 --> 00:28:01,850 Основна ни предпазва от това също, така че аз съм просто 623 00:28:01,850 --> 00:28:04,680 е наистина анален с сигма също да се уверите, 624 00:28:04,680 --> 00:28:06,540 че входът не може да бъде отрицателна. 625 00:28:06,540 --> 00:28:10,130 Така че, ако m е отрицателна, нещо като отрицателен. 626 00:28:10,130 --> 00:28:11,930 Какво ще се случи? 627 00:28:11,930 --> 00:28:14,390 Е, аз ще се се инициализира с един, 628 00:28:14,390 --> 00:28:19,060 и тогава аз ще бъде по-малко от или равно на М? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Изчакайте. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 Това беше-- оставим не, нека никс тази история. 633 00:28:29,370 --> 00:28:32,780 Не съм искал на този въпрос, защото рискът, че съм визирайки 634 00:28:32,780 --> 00:28:38,360 няма да се случи, защото аз е винаги ще бъде по-голяма отколкото-- OK, 635 00:28:38,360 --> 00:28:39,871 I прибере този въпрос. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Нека да се съсредоточи само върху тази част тук. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Защо Декларирам, някои извън линия? 640 00:28:48,830 --> 00:28:52,010 Известие по линия 49 Нямам обявен аз вътре на цикъла, 641 00:28:52,010 --> 00:28:54,950 но 48 онлайн Нямам обявиха някои отвън. 642 00:28:54,950 --> 00:28:55,695 Да. 643 00:28:55,695 --> 00:28:56,611 АУДИТОРИЯ: [недоловим]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 SPEAKER 1: Разбира се. 646 00:28:59,400 --> 00:29:03,360 Така че на първо място и преди всичко аз със сигурност не го правят искат да декларира и инициализира сума 647 00:29:03,360 --> 00:29:06,130 до нула вътрешността на контур на всяка итерация, 648 00:29:06,130 --> 00:29:09,370 тъй като това очевидно ще победят Цел на сумиране на номерата. 649 00:29:09,370 --> 00:29:11,770 Бих продължава да се променя стойността обратно до нула. 650 00:29:11,770 --> 00:29:17,992 И също така, каква е друг, по-тайнствена причина за това същото решение дизайн? 651 00:29:17,992 --> 00:29:18,954 Да. 652 00:29:18,954 --> 00:29:20,279 >> АУДИТОРИЯ: [недоловим]. 653 00:29:20,279 --> 00:29:21,070 SPEAKER 1: Точно така. 654 00:29:21,070 --> 00:29:24,060 Искам да го достъп извън на цикъла прекалено върху това, което линия? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 На 53. 657 00:29:26,400 --> 00:29:29,910 И въз основа на нашето правило на палеца от преди няколко лекции, 658 00:29:29,910 --> 00:29:33,680 променливи са обхванати, наистина, към фигурни скоби, които ги обхващат. 659 00:29:33,680 --> 00:29:38,190 Така че, ако не се декларира сума вътре от тези външните фигурни скоби, 660 00:29:38,190 --> 00:29:40,250 Не мога да го използвам в съответствие 53. 661 00:29:40,250 --> 00:29:43,160 Казано по друг начин, ако декларираната сума в тук, или дори в рамките на 662 00:29:43,160 --> 00:29:45,410 За контур, аз не можех да го отворите в 53. 663 00:29:45,410 --> 00:29:47,150 Променливата ефективно ще бъдат унищожени. 664 00:29:47,150 --> 00:29:48,579 Така няколко причини там. 665 00:29:48,579 --> 00:29:50,370 Но сега нека се върнем и да видим какво ще стане. 666 00:29:50,370 --> 00:29:51,730 Така че сигма получава обади. 667 00:29:51,730 --> 00:29:55,640 Тя добавя, до 1 плюс 2, или 1 плюс 2 плюс 3, и след това се връща на стойността, 668 00:29:55,640 --> 00:29:59,660 го съхранява в отговор, и ФОРМАТ тук Ето защо аз се виждам на екрана. 669 00:29:59,660 --> 00:30:03,079 Така че това е, което ние ще се обадя на един повтарящ се подход, при повторение само 670 00:30:03,079 --> 00:30:03,870 означава използване на една линия. 671 00:30:03,870 --> 00:30:06,900 A За контур, а Докато контур, а Do Докато контур, просто правиш нещо отново 672 00:30:06,900 --> 00:30:08,380 и отново и отново. 673 00:30:08,380 --> 00:30:13,505 >> Но сигма е вид чист функция в че мога да го приложи по различен начин. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Какво ще кажете за това, което само за да бъде нещо страхотно, 676 00:30:19,120 --> 00:30:21,880 нека наистина да се отървете на много отвличане на вниманието 677 00:30:21,880 --> 00:30:24,380 защото тази функция всъщност е доста прост. 678 00:30:24,380 --> 00:30:27,780 Нека да омаловажавам това надолу просто на своите четири основни линии 679 00:30:27,780 --> 00:30:30,410 и да се отървете от всички коментари и фигурни скоби. 680 00:30:30,410 --> 00:30:34,334 Това е вид на ум-разпенващ алтернативно изпълнение. 681 00:30:34,334 --> 00:30:37,250 Добре, може би не е умопомрачаващо, но това е нещо по-секси, добре, 682 00:30:37,250 --> 00:30:39,920 да погледнем в това, така много по-сбито. 683 00:30:39,920 --> 00:30:43,120 Със само четири реда код, За първи път имаме тази проверка здрав разум. 684 00:30:43,120 --> 00:30:45,732 Ако m е по-малко от или равно на нула, сигма няма смисъл. 685 00:30:45,732 --> 00:30:48,190 Той е трябвало само да бъде в този случай за положителни числа, 686 00:30:48,190 --> 00:30:50,340 така че аз съм просто ще върнете нула произволно 687 00:30:50,340 --> 00:30:53,210 така че да можем поне да има някои така наречения базов модел. 688 00:30:53,210 --> 00:30:54,430 >> Но тук е красотата. 689 00:30:54,430 --> 00:30:59,930 Същността на тази идея, като се добавят номера от 1 до N, или м в този случай, 690 00:30:59,930 --> 00:31:02,630 може да се направи по вид на преминаване отмятат. 691 00:31:02,630 --> 00:31:04,947 Е, каква е сумата от 1 до m? 692 00:31:04,947 --> 00:31:05,780 Ами, знаете ли какво? 693 00:31:05,780 --> 00:31:11,949 Това е същото като сумата от т плюс сумата от 1 до m минус 1. 694 00:31:11,949 --> 00:31:12,740 Ами знаеш ли какво? 695 00:31:12,740 --> 00:31:13,940 Какво е сигма на m минус 1? 696 00:31:13,940 --> 00:31:17,860 Е, ако сте вид следват тази Логично, това е същото като m минус 1 697 00:31:17,860 --> 00:31:21,415 плюс Sigma М минус 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Така че можете да вид просто-- това е като, ако сте просто 700 00:31:26,012 --> 00:31:28,220 се опитва да дразни приятел и те да ви задам един въпрос, 701 00:31:28,220 --> 00:31:31,344 някак си отговори с въпрос, можете да вид запази прехвърляха отмятат. 702 00:31:31,344 --> 00:31:34,560 Но това, което е ключ е, че ако продължаваш вземане на въпрос по-малък и по-малък 703 00:31:34,560 --> 00:31:36,910 и по-малък, вие сте Не питам какво е сигма 704 00:31:36,910 --> 00:31:39,116 на N, което е сигма на н, какъв е сигма на п? 705 00:31:39,116 --> 00:31:40,990 Питате какво е сигма на N, което е сигма 706 00:31:40,990 --> 00:31:42,839 п минус 1, какво е сигма на п минус 2? 707 00:31:42,839 --> 00:31:44,880 В крайна сметка вашия въпрос ще стане това? 708 00:31:44,880 --> 00:31:50,250 Какво е сигма на една или нула, някои много малка стойност, 709 00:31:50,250 --> 00:31:52,220 и веднага след като си се, че си приятел, 710 00:31:52,220 --> 00:31:54,350 вие няма да питам същия въпрос отново, 711 00:31:54,350 --> 00:31:55,975 вие просто ще кажа, о, това е нула. 712 00:31:55,975 --> 00:31:58,490 Ние сме готови да играете този вид глупаво циклична игра. 713 00:31:58,490 --> 00:32:02,950 >> Така рекурсия е акт по програмиране на функция, наричаща себе си. 714 00:32:02,950 --> 00:32:06,630 Тази програма, когато са съставени и тичам, е ще се държат точно по същия начин, 715 00:32:06,630 --> 00:32:09,620 но това, което е ключ е, че вътре на функция, наречена Sigma, 716 00:32:09,620 --> 00:32:13,150 има една линия на код, където ние сме се обажда, 717 00:32:13,150 --> 00:32:14,980 което нормално би било лошо. 718 00:32:14,980 --> 00:32:21,160 Например, какво ще стане ако аз първи компилиран това, така че се уверете sigma-- 719 00:32:21,160 --> 00:32:22,710 направи сигма 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Положително число, моля, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Така че това, което функцията изглежда да, въз основа на един тест, вярна. 723 00:32:30,810 --> 00:32:34,917 Но какво, ако получа малко опасно и изтриване на така наречената база случая, 724 00:32:34,917 --> 00:32:37,750 и просто да кажа, ами аз съм просто направи това по-сложно, отколкото е то. 725 00:32:37,750 --> 00:32:42,450 Нека просто да се изчисли сигма , като m и след това прибавяне 726 00:32:42,450 --> 00:32:44,564 в сигма на m минус едно? 727 00:32:44,564 --> 00:32:45,980 Е, какво ще се случи тук? 728 00:32:45,980 --> 00:32:47,140 Да намалите. 729 00:32:47,140 --> 00:32:52,920 Нека да компилирате програмата, го спаси, компилирате програмата, 730 00:32:52,920 --> 00:33:00,450 и след това е готов ./sigma-1 мащабиране в, въведете положително число, моля, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Колко от вас са готови до Фес до виждайки, че? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 Така че това може да се случи редица причини, 735 00:33:06,690 --> 00:33:09,148 и честно казано тази седмица сме за да ви даде повече от тях. 736 00:33:09,148 --> 00:33:11,780 Но в този случай, опитайте да се разсъждава назад 737 00:33:11,780 --> 00:33:14,430 какво може да се случи тук? 738 00:33:14,430 --> 00:33:17,400 Сегментация вина, казахме последно време, се отнася до сегмент на паметта. 739 00:33:17,400 --> 00:33:18,690 Нещо лошо се е случило. 740 00:33:18,690 --> 00:33:21,550 Но това, което беше механично, че отиде проваля 741 00:33:21,550 --> 00:33:25,000 тук, защото на моето отстраняване на тази т.нар базов модел, 742 00:33:25,000 --> 00:33:26,870 когато се върнах трудно кодирани стойност? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Какво мислиш, че се е объркало? 745 00:33:30,460 --> 00:33:31,219 Да. 746 00:33:31,219 --> 00:33:32,135 >> АУДИТОРИЯ: [недоловим]. 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 Добър въпрос. 750 00:33:37,550 --> 00:33:39,508 Така размерът на броя че бях обобщавайки 751 00:33:39,508 --> 00:33:41,920 имам толкова голям, че тя е превишила размера на пространството памет. 752 00:33:41,920 --> 00:33:44,640 Добра идея, но не фундаментално ще доведе до катастрофа. 753 00:33:44,640 --> 00:33:48,230 Това може да доведе до цяло число преливник, където битовете просто обърнете 754 00:33:48,230 --> 00:33:51,760 и тогава ние бъркаме наистина голям номер за като отрицателна стойност, 755 00:33:51,760 --> 00:33:53,260 но себе си не ще доведе до катастрофа. 756 00:33:53,260 --> 00:33:55,509 Защото в края на ден пад все още е 32 бита. 757 00:33:55,509 --> 00:33:57,640 Вие не започваш да се случайно открадне 33тата малко. 758 00:33:57,640 --> 00:33:58,431 Но една добра мисъл. 759 00:33:58,431 --> 00:33:58,984 Да. 760 00:33:58,984 --> 00:33:59,900 >> АУДИТОРИЯ: [недоловим]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 SPEAKER 1: Методът никога не спира да работи, 763 00:34:02,300 --> 00:34:06,658 и наистина отново нарича себе си и отново и отново и отново 764 00:34:06,658 --> 00:34:08,449 и отново, и нито един от тези функции всякога 765 00:34:08,449 --> 00:34:13,310 довърши, защото тяхната единствена линия на код themself призовава отново и отново 766 00:34:13,310 --> 00:34:14,219 и отново. 767 00:34:14,219 --> 00:34:16,080 И това, което е наистина се случва тук и сега 768 00:34:16,080 --> 00:34:18,100 може да се направи този вид картинно. 769 00:34:18,100 --> 00:34:20,899 Нека да преминем към по- снимка само за момент. 770 00:34:20,899 --> 00:34:22,940 Това е снимка, че в крайна сметка ще плът 771 00:34:22,940 --> 00:34:26,336 по-подробно за това какво се случва вътре в паметта на компютъра си. 772 00:34:26,336 --> 00:34:28,460 И се оказва, че на дъното на тази снимка 773 00:34:28,460 --> 00:34:29,709 е нещо, наречено стека. 774 00:34:29,709 --> 00:34:31,920 Това е парче памет, парче от RAM, 775 00:34:31,920 --> 00:34:33,920 това е просто използва по всяко време функция се нарича. 776 00:34:33,920 --> 00:34:36,239 Всеки ли време, програмист, наричаме функция, 777 00:34:36,239 --> 00:34:38,860 операционната система, като Mac OS, Windows или Linux, 778 00:34:38,860 --> 00:34:41,920 грабва куп байта, може би няколко килобайта, може би няколко мегабайта 779 00:34:41,920 --> 00:34:44,590 на паметта, да ги раздава за вас, а след това ви позволява 780 00:34:44,590 --> 00:34:47,650 стартирате функцията си, използвайки каквото и променливи, което трябва. 781 00:34:47,650 --> 00:34:50,699 И ако тогава се обади друг функция и друга функция, 782 00:34:50,699 --> 00:34:53,590 можете да получите друго парче на паметта и друго парче от памет. 783 00:34:53,590 --> 00:34:57,090 >> И наистина, ако тези зелени тави от Annenberg декларирате, че паметта, 784 00:34:57,090 --> 00:34:59,870 ето какво се случва на първия време ти се обадя функция сигма. 785 00:34:59,870 --> 00:35:04,510 Това е като да сложиш на поднос като този върху това, което е първоначално празен стак. 786 00:35:04,510 --> 00:35:07,142 Но след това, ако тази тава нарича себе си, така да се каже, 787 00:35:07,142 --> 00:35:08,850 призовава друга инстанция на сигма, че е 788 00:35:08,850 --> 00:35:11,640 като иска от операционната система, ох, трябва малко повече памет, 789 00:35:11,640 --> 00:35:12,520 Дай ми това. 790 00:35:12,520 --> 00:35:14,840 И тогава той се струпват на върха. 791 00:35:14,840 --> 00:35:18,030 Но това, което е ключът тук е, че първата тава е все още там, 792 00:35:18,030 --> 00:35:20,620 защото той позоваване на тази втора тава. 793 00:35:20,620 --> 00:35:23,500 Сега Междувременно сигма наричат ​​сигма, това е все едно да питаме за повече памет. 794 00:35:23,500 --> 00:35:25,830 Взима се струпват тук. 795 00:35:25,830 --> 00:35:29,350 сигма сигма наричаме, това е друга тава, която получава прибрана тук. 796 00:35:29,350 --> 00:35:32,942 И ако продължаваш да правиш това, в крайна сметка, вид на картата този визуален 797 00:35:32,942 --> 00:35:35,525 към тази диаграма, какво ще се се случи с топчето тави? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Това се случва, да надвиши размера на паметта на компютъра ви има. 800 00:35:41,160 --> 00:35:45,790 И веднага след като тази зелена тава надвишава хоризонталната линия 801 00:35:45,790 --> 00:35:49,410 горе стак и над тази дума грамада които ще се върнем в бъдещето, 802 00:35:49,410 --> 00:35:50,410 че е нещо лошо. 803 00:35:50,410 --> 00:35:52,810 Купчината е различен сегмент на памет, 804 00:35:52,810 --> 00:35:55,190 и ако искаш да те тави купчина и купчина, 805 00:35:55,190 --> 00:35:57,800 ти започваш да надвишава свой собствен сегмент от паметта, 806 00:35:57,800 --> 00:36:00,420 и програма е наистина ще се разбие. 807 00:36:00,420 --> 00:36:02,930 >> Сега като настрана, тази идея на рекурсия, следователно, 808 00:36:02,930 --> 00:36:06,500 може ясно да доведе до проблеми, но това не е непременно нещо лошо. 809 00:36:06,500 --> 00:36:08,840 Тъй като разгледа, след всички, how-- и може би 810 00:36:08,840 --> 00:36:11,700 това отнема известно привикване да --how елегантен или колко е лесно 811 00:36:11,700 --> 00:36:14,890 че изпълнението на сигма беше. 812 00:36:14,890 --> 00:36:17,440 И ние няма да използвате рекурсия чак толкова много в CS50, 813 00:36:17,440 --> 00:36:20,780 но в CS51, и наистина всеки клас където ви манипулират структури от данни 814 00:36:20,780 --> 00:36:23,640 като дървета, или семейни дървета, че има някаква йерархия, 815 00:36:23,640 --> 00:36:26,000 това е супер, супер полезно. 816 00:36:26,000 --> 00:36:29,750 Сега, като настрана, така че да можете като се стремят компютърни учени 817 00:36:29,750 --> 00:36:33,180 са запознати с някои от на Google вътре вицове, ако отидете на Google 818 00:36:33,180 --> 00:36:36,345 и погледнете нагоре, което е определение на, да речем, рекурсия, влиза. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Аха. 821 00:36:41,110 --> 00:36:42,670 Като настрана, аз спря няколко. 822 00:36:42,670 --> 00:36:45,470 Това е като 10 минути отлагането тази сутрин. 823 00:36:45,470 --> 00:36:52,890 Ако вие също Google "накриво" известие като наклоните главата си slightly-- 824 00:36:52,890 --> 00:36:55,120 и след това е може би най-жестокото от всички 825 00:36:55,120 --> 00:36:57,286 тъй като някой, прекарал като ден им прилагане на настоящия 826 00:36:57,286 --> 00:36:59,880 няколко години ago-- хайде. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 О, Чакай, че е бъг. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Така че работи на един от най- най-големите сайтове в света 831 00:37:11,410 --> 00:37:13,510 са тези глупави малки великденски яйца. 832 00:37:13,510 --> 00:37:16,690 Те вероятно консумират нетривиални брой редове код 833 00:37:16,690 --> 00:37:19,280 просто така, че ние можем да имаме малки забавни неща. 834 00:37:19,280 --> 00:37:22,140 Но поне сега ще получите някои от тези вътре шеги. 835 00:37:22,140 --> 00:37:28,330 >> Сега нека да разгледаме някои от най- бяла лежи ние сме били казвам напоследък, 836 00:37:28,330 --> 00:37:30,707 и да започне да се бели обратно някои слоеве технически 837 00:37:30,707 --> 00:37:32,790 така че да можете наистина да разберем какво става на 838 00:37:32,790 --> 00:37:34,860 и можете да разберете някои от заплахите, 839 00:37:34,860 --> 00:37:38,060 като Shellshock, че вече са започнали да се превърне 840 00:37:38,060 --> 00:37:41,110 на преден план на всеки внимание, поне в медиите. 841 00:37:41,110 --> 00:37:45,810 Така че тук е много проста функция който се връща нищо, за невалидни. 842 00:37:45,810 --> 00:37:46,790 Името му е суап. 843 00:37:46,790 --> 00:37:50,880 Това отнема в две променливи и го връща нищо. 844 00:37:50,880 --> 00:37:52,260 Счита в а и б. 845 00:37:52,260 --> 00:37:53,337 Така бързо демонстрация. 846 00:37:53,337 --> 00:37:54,170 Донесохме тези нагоре. 847 00:37:54,170 --> 00:37:56,100 Ние може и да отнеме малко пробие тук само за миг 848 00:37:56,100 --> 00:37:57,250 и да има нещо за пиене. 849 00:37:57,250 --> 00:38:00,120 Ако някой не би имал нищо против присъединяването ми до тук само за миг. 850 00:38:00,120 --> 00:38:01,830 Какво ще кажете за вас в кестеняво риза? 851 00:38:01,830 --> 00:38:02,335 Хайде нагоре. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Само една днес. 854 00:38:05,260 --> 00:38:06,251 Благодаря ви, все пак. 855 00:38:06,251 --> 00:38:08,000 Добре, и ние имаме идва, който тук? 856 00:38:08,000 --> 00:38:08,660 Как ти е името? 857 00:38:08,660 --> 00:38:09,360 >> SPEAKER 4: Лора. 858 00:38:09,360 --> 00:38:09,740 >> SPEAKER 1: Лора. 859 00:38:09,740 --> 00:38:10,370 Хайде нагоре. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Така Лора, много проста предизвикателство днес. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Приятно ми е да се срещне йо. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 Добре. 866 00:38:16,910 --> 00:38:21,179 Така че ние имаме малко мляко тук и имаме някои портокалов сок тук 867 00:38:21,179 --> 00:38:23,345 и някои чаши, които ние назаем от Annenberg днес. 868 00:38:23,345 --> 00:38:24,178 >> SPEAKER 4: назаем. 869 00:38:24,178 --> 00:38:27,240 SPEAKER 1: И ще вървим напред и ще ви даде половин чаша от това. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 Добре. 872 00:38:28,800 --> 00:38:30,750 И ние ще ви дам половината чаша мляко. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 О, и просто така, че можете да Спомням си какво беше като, 875 00:38:35,890 --> 00:38:38,860 Спомних си, за да донесе това и днес. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Добре. 878 00:38:42,530 --> 00:38:45,470 Ако не би имал нищо против, нека да видим, ние може да ги постави над вашите собствени очила 879 00:38:45,470 --> 00:38:46,560 ако искаш. 880 00:38:46,560 --> 00:38:48,710 Това ще бъде в света от очите на Лора. 881 00:38:48,710 --> 00:38:49,210 Добре. 882 00:38:49,210 --> 00:38:53,820 Така че вашата цел, като се има предвид две чаши течност тук, мляко и портокалов сок, 883 00:38:53,820 --> 00:38:58,370 се разменят двата съдържанието, така че портокалов сок отива в чашата на млякото 884 00:38:58,370 --> 00:39:00,710 и отива в млякото чашата портокалов сок. 885 00:39:00,710 --> 00:39:02,359 >> SPEAKER 4: Обичате ли да получа още една чаша? 886 00:39:02,359 --> 00:39:05,650 SPEAKER 1: Аз съм толкова се радвам, че попита, макар че би било много по-добре кадри 887 00:39:05,650 --> 00:39:06,710 ако не беше поискал. 888 00:39:06,710 --> 00:39:10,620 Но да, ние можем да Ви предложим една трета чаша, че е празна, разбира се. 889 00:39:10,620 --> 00:39:11,120 Добре. 890 00:39:11,120 --> 00:39:12,300 Така че сменяте съдържанието там. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Много хубаво. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Много добре. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Правиш това забележително внимателно. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 И стъпка три. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 Добре. 901 00:39:31,350 --> 00:39:31,930 Отлично. 902 00:39:31,930 --> 00:39:33,930 A голям кръг от аплодисменти би било добре за Лора. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 Добре. 905 00:39:37,000 --> 00:39:40,790 Имаме малък прощален подарък за вас, но нека ми отнеме това. 906 00:39:40,790 --> 00:39:42,620 Благодаря ви толкова много. 907 00:39:42,620 --> 00:39:46,170 Така че един прост пример, все пак, да докаже, че ако го направите 908 00:39:46,170 --> 00:39:48,300 искате да сменяте съдържанието на два контейнера, 909 00:39:48,300 --> 00:39:52,360 или нека ги наречем променливи, имате нужда от временно складиране 910 00:39:52,360 --> 00:39:56,710 да организира един от съдържанието на така че всъщност можете да направите на суапа. 911 00:39:56,710 --> 00:40:01,790 Така че наистина, това изходния код тук в C е представител на точно това. 912 00:40:01,790 --> 00:40:06,340 Ако портокалов сок е и млякото е б, и ние искахме да сменяте два, 913 00:40:06,340 --> 00:40:08,990 бихте могли да опитате нещо творческо чрез изливане една в друга, 914 00:40:08,990 --> 00:40:11,031 но това вероятно няма да края особено добре. 915 00:40:11,031 --> 00:40:15,260 И така, ние използваме една трета чаша, повикване тя TMP, T-M-P от конвенция, 916 00:40:15,260 --> 00:40:19,370 и пуснати на съдържанието на ОВ в това, тогава сменяте една чаша, 917 00:40:19,370 --> 00:40:22,610 след това пуснати на ОВ в оригиналната чаша, като по този начин 918 00:40:22,610 --> 00:40:25,320 постигане, точно както Лора направи, суапа. 919 00:40:25,320 --> 00:40:26,850 >> Така че нека да направим точно това. 920 00:40:26,850 --> 00:40:30,110 Нека да вървим напред и да се отвори до един пример, който е 921 00:40:30,110 --> 00:40:32,720 всъщност се нарича "не суап ", защото това не е 922 00:40:32,720 --> 00:40:36,180 като просто направи колкото може би си мислите. 923 00:40:36,180 --> 00:40:41,190 Така че в тази програма, да забележите, че Аз съм с stdio.h, нашият стар приятел. 924 00:40:41,190 --> 00:40:43,130 Имам прототип за суап там, които 925 00:40:43,130 --> 00:40:45,450 означава прилагането му е вероятно по-долу, 926 00:40:45,450 --> 00:40:48,050 и нека видим какво тази основна програма ще направите за мен. 927 00:40:48,050 --> 00:40:52,020 За първи път декларира INT х получава една и INT г. получава две. 928 00:40:52,020 --> 00:40:54,930 Така че мисля, че на тези, като ОВ и мляко, съответно. 929 00:40:54,930 --> 00:40:57,100 И тогава аз просто имат ФОРМАТ казва х е това 930 00:40:57,100 --> 00:41:00,120 и Y е това, само за да мога да визуално да видим какво става. 931 00:41:00,120 --> 00:41:03,810 Тогава съм ФОРМАТ твърдейки че аз съм смяна на две, 932 00:41:03,810 --> 00:41:07,100 и тогава аз отпечатате твърдят, че те са разменени, 933 00:41:07,100 --> 00:41:09,300 и аз отново разпечатате х и у. 934 00:41:09,300 --> 00:41:13,010 Така че тук надолу в суап е точно това, което Лора направи, 935 00:41:13,010 --> 00:41:16,240 и точно това, което видяхме на екрана преди малко. 936 00:41:16,240 --> 00:41:19,380 >> Така че нека да вървим напред и да бъде крайно разочарован. 937 00:41:19,380 --> 00:41:24,690 Не се суап, и тичам не суап, мащабиране на изхода тук. 938 00:41:24,690 --> 00:41:28,320 Въведете х е 1, Y е 2, размяна разменят. 939 00:41:28,320 --> 00:41:32,700 X е все още 1, и Y е все още 2. 940 00:41:32,700 --> 00:41:37,630 Така че, въпреки че, честно казано, това изглежда точно харесва, макар и по-технически, 941 00:41:37,630 --> 00:41:40,730 какво Laura направил, не изглежда да работи. 942 00:41:40,730 --> 00:41:42,130 Така че, защо е това? 943 00:41:42,130 --> 00:41:46,630 Е, оказва се, че когато пишем програма като тази 944 00:41:46,630 --> 00:41:51,590 , която има основна, подчертано тук, и после още една функция, като суап, 945 00:41:51,590 --> 00:41:54,230 подчертани тук, който го нарича, светът 946 00:41:54,230 --> 00:41:57,030 изглежда малко нещо като тези тави преди малко. 947 00:41:57,030 --> 00:42:00,440 Когато основната първо получава нарича, това е като да питаш операционна система 948 00:42:00,440 --> 00:42:04,030 за малко памет за всеки местен променливи, като X и Y, че основното е, 949 00:42:04,030 --> 00:42:05,660 и те в крайна сметка точно там. 950 00:42:05,660 --> 00:42:10,920 Но ако основните разговори разменят, и основната минава да сменяте два аргумента, а и б, 951 00:42:10,920 --> 00:42:16,410 портокалов сок и мляко, не е като да подавайки портокалов сок и млякото 952 00:42:16,410 --> 00:42:17,500 Лора. 953 00:42:17,500 --> 00:42:21,300 Какъв компютър прави, е, че преминава копия от портокалов сок 954 00:42:21,300 --> 00:42:27,110 и копия на млякото да Laura, така че какво е в крайна сметка вътре в тази тава 955 00:42:27,110 --> 00:42:32,510 е една стойност и две, или ОВ и мляко, а копия от него, 956 00:42:32,510 --> 00:42:34,790 така че в тази точка в историята, има 957 00:42:34,790 --> 00:42:36,930 е ОВ и мляко във всяка от тези тави. 958 00:42:36,930 --> 00:42:39,260 Има едно и две във всяка от тези тави, 959 00:42:39,260 --> 00:42:41,720 и функцията за суап се наистина работи. 960 00:42:41,720 --> 00:42:46,090 Той ги е смяна вътре на втория горната тава 961 00:42:46,090 --> 00:42:48,147 но че смяна не оказва влияние. 962 00:42:48,147 --> 00:42:49,980 И въз основа на само някои основен принцип сме 963 00:42:49,980 --> 00:42:52,970 говорихме и преди, и наистина Само преди няколко минути, какво 964 00:42:52,970 --> 00:42:58,770 може да обясни защо се променя А и В в на размяна 965 00:42:58,770 --> 00:43:05,560 няма ефект на X и Y, макар Минах х и у на функцията суап. 966 00:43:05,560 --> 00:43:08,750 Каква е ключовата дума тук, че може опростенчески обясни? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Мисля, че го чух тук? 969 00:43:12,627 --> 00:43:13,335 АУДИТОРИЯ: Завръщането. 970 00:43:13,335 --> 00:43:14,085 SPEAKER 1: замяна? 971 00:43:14,085 --> 00:43:14,590 Не се върне. 972 00:43:14,590 --> 00:43:15,895 Нека да отидем с един друг. 973 00:43:15,895 --> 00:43:16,395 Какво е това? 974 00:43:16,395 --> 00:43:17,080 >> АУДИТОРИЯ: [недоловим]. 975 00:43:17,080 --> 00:43:20,000 >> SPEAKER 1: ОК, така return-- можехме направи завръщане на работа в историята, 976 00:43:20,000 --> 00:43:21,914 но там е още по-просто обяснение. 977 00:43:21,914 --> 00:43:22,580 АУДИТОРИЯ: Приложно поле. 978 00:43:22,580 --> 00:43:23,288 SPEAKER 1: Обхват. 979 00:43:23,288 --> 00:43:24,300 Ще взема обхват. 980 00:43:24,300 --> 00:43:27,290 Така обхват, не забравяйте, когато нашата х и у декларирани. 981 00:43:27,290 --> 00:43:30,840 Те са обявени за вътре на главния чак тук. 982 00:43:30,840 --> 00:43:33,200 А и Б, междувременно, са ефективно обявена 983 00:43:33,200 --> 00:43:35,930 вътре на суап, не съвсем в фигурните скоби, но все още 984 00:43:35,930 --> 00:43:37,690 в широката зона на суап. 985 00:43:37,690 --> 00:43:40,560 И така, наистина, а и б съществува само в рамките на тази тава 986 00:43:40,560 --> 00:43:44,850 от Аненберг, този второ парче код. 987 00:43:44,850 --> 00:43:49,500 Така че ние сме наистина промяна на копието, но това не е наистина всичко, което е полезно. 988 00:43:49,500 --> 00:43:52,190 >> Така че нека да разгледаме най- това е малко по-ниско ниво. 989 00:43:52,190 --> 00:43:55,430 Отивам да се върне в Директория източник 990 00:43:55,430 --> 00:43:58,330 и аз отивам към първия увеличите тук, а просто 991 00:43:58,330 --> 00:44:02,290 , за да потвърдите, че аз съм в тази голяма терминален прозорец, 992 00:44:02,290 --> 00:44:04,430 Програмата все още се държи по този начин. 993 00:44:04,430 --> 00:44:06,840 Да предположим сега, че това не е умишлено. 994 00:44:06,840 --> 00:44:10,090 Ясно е, че искам да суап работа, така че тя се чувства като буболечка. 995 00:44:10,090 --> 00:44:12,780 Сега може да започне добавяне на много ФОРМАТ е на моя код, 996 00:44:12,780 --> 00:44:16,010 отпечатване х тук, у над Тук, тук, б тук. 997 00:44:16,010 --> 00:44:18,220 Но честно казано, това е може би това, което сте били прави в продължение на няколко седмици 998 00:44:18,220 --> 00:44:20,190 сега, в работно време и у дома, когато се работи 999 00:44:20,190 --> 00:44:22,150 на psets опитват да намерят някои бъгове. 1000 00:44:22,150 --> 00:44:25,560 Но вие ще видите, ако вече не сте, този проблем определя три ви запознава 1001 00:44:25,560 --> 00:44:31,630 на команда, наречена GDB, където GDB, GNU дебъгер, 1002 00:44:31,630 --> 00:44:34,040 Самата има цял куп функции, които могат действително 1003 00:44:34,040 --> 00:44:38,160 нека разберем ситуации по този начин, но по-интригуващи, 1004 00:44:38,160 --> 00:44:39,940 решаване на проблеми и да намерят грешки. 1005 00:44:39,940 --> 00:44:40,940 Така че аз отивам да правя това. 1006 00:44:40,940 --> 00:44:44,770 Вместо ./noswap, аз вместо съм ще избяга GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 С други думи, аз отивам да тичам ми програма не в Bash, нашият нов приятел 1009 00:44:51,200 --> 00:44:51,850 днес. 1010 00:44:51,850 --> 00:44:53,970 Отивам да тече ми програма noswap вътре 1011 00:44:53,970 --> 00:44:56,900 на тази друга програма, наречена GDB, което е корекция на грешки, която 1012 00:44:56,900 --> 00:45:01,035 е програма, която е предназначена да помогне на вие хората намиране и премахване на бъгове. 1013 00:45:01,035 --> 00:45:03,410 Така че, ако се удари Пусни тук, има отвратителен размер на текста 1014 00:45:03,410 --> 00:45:04,868 че наистина никога не трябва да се чете. 1015 00:45:04,868 --> 00:45:07,290 Това е по същество една разсейване от командния ред, който 1016 00:45:07,290 --> 00:45:10,030 Отивам да се удари Control-L да се изправи на върха там. 1017 00:45:10,030 --> 00:45:11,800 Това е ред GDB. 1018 00:45:11,800 --> 00:45:15,550 Ако искате да стартирате тази програма сега, тъй като това малко мамят лист на днешния 1019 00:45:15,550 --> 00:45:21,860 слайд показва, Run е първият команди, които ние за цел да въведе. 1020 00:45:21,860 --> 00:45:25,150 И аз съм просто ще да въведете тичам тук вътре в GDB, 1021 00:45:25,150 --> 00:45:26,811 и наистина се завтече моята програма. 1022 00:45:26,811 --> 00:45:29,310 Сега има някои допълнителни изходи на екран като този, 1023 00:45:29,310 --> 00:45:31,910 но това е GDB просто е анален и ни казва какво става. 1024 00:45:31,910 --> 00:45:34,451 Вие наистина не трябва да се притеснявате за тези детайли точно сега. 1025 00:45:34,451 --> 00:45:36,890 Но това, което е наистина страхотно за GDB, ако направя това again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L изчиства screen-- ме пусна напред и тип "пробие основната," по този начин, 1027 00:45:42,100 --> 00:45:45,743 когато ударих Enter, за определяне какво е нарича точка почивка в noswap.c, 1028 00:45:45,743 --> 00:45:51,270 линия 16, което е мястото, където GDB измисли моята програма всъщност 1029 00:45:51,270 --> 00:45:53,070 е, моята функция в действителност. 1030 00:45:53,070 --> 00:45:55,070 Това ще игнорира за сега но това е адреса 1031 00:45:55,070 --> 00:45:57,310 в памет специално на тази функция. 1032 00:45:57,310 --> 00:46:00,240 Така че сега, когато пиша тичам, Забележете какво е готино тук. 1033 00:46:00,240 --> 00:46:05,650 Моята програма разбива в съответствие I каза GDB за пауза при изпълнение. 1034 00:46:05,650 --> 00:46:09,850 Така че аз не трябва да се променят кода си, добавите някои ФОРМАТ, той прекомпилирате, повторение 1035 00:46:09,850 --> 00:46:13,300 това, да се промени, добави някои ФОРМАТ е, го спаси, да го компилирате, пуснете го. 1036 00:46:13,300 --> 00:46:18,100 Мога само да минеш през моята програма стъпка по стъпка по стъпка в човешката скорост, 1037 00:46:18,100 --> 00:46:20,880 не на Intel-вътре вид на скорост. 1038 00:46:20,880 --> 00:46:24,580 >> Така че сега забележите тази линия се появява тук, и ако се върна 1039 00:46:24,580 --> 00:46:27,800 към програмата ми в Gedit, се отбележи, че това е действително 1040 00:46:27,800 --> 00:46:29,280 най-първата линия на код. 1041 00:46:29,280 --> 00:46:31,240 Има линия 16 в Gedit. 1042 00:46:31,240 --> 00:46:34,610 Има линия 16 в GDB, и дори че този черен и бял интерфейс 1043 00:46:34,610 --> 00:46:37,760 не е почти като потребител приятелски, това означава, 1044 00:46:37,760 --> 00:46:41,680 тази линия 16 не е била изпълнена все още, но това е на път да бъде. 1045 00:46:41,680 --> 00:46:46,220 Така че наистина, ако напишете печат X, не ФОРМАТ, просто печат X, 1046 00:46:46,220 --> 00:46:50,730 Получа някои фалшив стойност там на нула, защото X все още не е инициализиран. 1047 00:46:50,730 --> 00:46:54,760 Така че аз отивам да въведете следващия, или, ако сте Искам да се фантазия, просто N за следващия. 1048 00:46:54,760 --> 00:46:59,090 Но когато пиша следващия влиза, сега забележите, че се движи по линията 17. 1049 00:46:59,090 --> 00:47:02,840 Така че, логично, ако съм изпълнен линия 16 и сега напишете печат X, 1050 00:47:02,840 --> 00:47:03,640 какво трябва да видим? 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 >> И сега това е наистина объркващо. 1054 00:47:07,820 --> 00:47:11,260 $две Е само един луксозен начин на това, ако сте Искам да се позове на тази стойност по-късно, 1055 00:47:11,260 --> 00:47:12,510 може да се каже "долар подпише две." 1056 00:47:12,510 --> 00:47:13,480 Това е като препратка назад. 1057 00:47:13,480 --> 00:47:14,570 Но за сега, просто го игнорира. 1058 00:47:14,570 --> 00:47:17,070 Какво е интересно е това, което е относно правото на знака за равенство. 1059 00:47:17,070 --> 00:47:21,000 И сега, ако пиша следващия път и печат Y, аз трябва да видите 2. 1060 00:47:21,000 --> 00:47:23,870 Също така мога да се отпечата X отново, и честно казано, 1061 00:47:23,870 --> 00:47:27,130 ако аз съм се малко объркан, че да къде съм, не мога да въведете списък за списък 1062 00:47:27,130 --> 00:47:30,590 и просто да видя някакъв контекст около точката, аз съм всъщност в. 1063 00:47:30,590 --> 00:47:35,180 И сега мога да напишете На следващо място, и там х е 1. 1064 00:47:35,180 --> 00:47:36,300 Сега пиша следващия. 1065 00:47:36,300 --> 00:47:37,710 О, Y е 2. 1066 00:47:37,710 --> 00:47:40,750 И отново, това е объркващо, защото изход GDB е 1067 00:47:40,750 --> 00:47:43,044 се смесват с моя собствена продукция. 1068 00:47:43,044 --> 00:47:45,710 Но ако продължаваш да се има предвид, от поглеждайки назад и напред в кода си, 1069 00:47:45,710 --> 00:47:47,740 или да го регламентираща страна от страна може би, вие ще 1070 00:47:47,740 --> 00:47:51,020 се види, че наистина съм просто засилване чрез моята програма. 1071 00:47:51,020 --> 00:47:54,620 >> Забележете какво се случва след това, буквално. 1072 00:47:54,620 --> 00:47:56,380 Тук е ред 22. 1073 00:47:56,380 --> 00:48:01,315 Позволете ми да отида над него, като по този начин се движат по до 23, и ако аз отпечатате х сега, все едно. 1074 00:48:01,315 --> 00:48:03,890 И ако аз сега отпечатате г., все още е един. 1075 00:48:03,890 --> 00:48:05,820 Така че това не е полезно упражнение. 1076 00:48:05,820 --> 00:48:07,450 Така че нека да ремонтирам тази. 1077 00:48:07,450 --> 00:48:10,069 Позволете ми да се върна до отгоре и тип се кандидатира отново. 1078 00:48:10,069 --> 00:48:12,110 И тя казва програмата че е се дебъгва 1079 00:48:12,110 --> 00:48:14,109 е започнала вече, започна от самото начало. 1080 00:48:14,109 --> 00:48:15,420 Да, нека да го направим отново. 1081 00:48:15,420 --> 00:48:22,000 И този път да го направим следващия, следващото, следващото, следващото, следващото, 1082 00:48:22,000 --> 00:48:24,180 но сега нещата стават интересни. 1083 00:48:24,180 --> 00:48:27,760 Сега искам да се оттегли в суап, така че аз не напишете следващата. 1084 00:48:27,760 --> 00:48:34,380 I тип стъпка, а сега го забележите ми скочи до noswap.c ред 33. 1085 00:48:34,380 --> 00:48:37,240 Ако се върна към Gedit, какво е ред 33? 1086 00:48:37,240 --> 00:48:40,500 Това е първата действително ред код във вътрешността на суап. 1087 00:48:40,500 --> 00:48:44,150 Което е хубаво, защото сега мога да вид мушкам наоколо и да получите любопитна 1088 00:48:44,150 --> 00:48:46,052 за това какво се случва наистина там. 1089 00:48:46,052 --> 00:48:46,760 Позволете ми да отпечатате ПТУ. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Уау. 1092 00:48:48,800 --> 00:48:51,438 Защо ПТУ има някои луд, фалшива стойност боклук? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 АУДИТОРИЯ: Това не е инициализиран. 1095 00:48:56,120 --> 00:48:57,150 SPEAKER 1: Той не е инициализиран. 1096 00:48:57,150 --> 00:49:00,270 И наистина, когато стартирате програмата, Вие сте даде цял куп памет 1097 00:49:00,270 --> 00:49:03,392 от операционната система, но не са инициализира всички стойности, 1098 00:49:03,392 --> 00:49:05,600 така че каквото и бита си виждате тук, въпреки че е 1099 00:49:05,600 --> 00:49:07,770 този луд голям отрицателен номер, просто означава, 1100 00:49:07,770 --> 00:49:10,750 че това са останките от някои предишни използване на тази RAM, 1101 00:49:10,750 --> 00:49:13,050 въпреки че не съм самият той все още е необходимо. 1102 00:49:13,050 --> 00:49:17,086 Така че сега аз отивам да вървим напред и тип На следващо място, и ако сега пиша печат ПТУ, 1103 00:49:17,086 --> 00:49:17,835 какво трябва да видим? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Каквато и да е стойност на А е, а е първият аргумент, просто 1106 00:49:23,360 --> 00:49:25,550 като X е първият нещо, което се предава в, 1107 00:49:25,550 --> 00:49:30,450 така че и X трябва да бъдат еднакви, така отпечатате ПТУ трябва да ми отпечата един. 1108 00:49:30,450 --> 00:49:36,360 >> Така че това, което ще видите в проблем набор три е урок на видове на GDB, 1109 00:49:36,360 --> 00:49:40,020 но осъзнавам, че това е началото на поглед към един инструмент, който действително ще 1110 00:49:40,020 --> 00:49:42,774 да ви помогне да решаване на проблеми толкова по-ефективно. 1111 00:49:42,774 --> 00:49:44,690 Това, което ние сме в крайна сметка ще направи в сряда 1112 00:49:44,690 --> 00:49:48,180 се започне да се бели обратно няколко слоя и премахване на някои помощни колела. 1113 00:49:48,180 --> 00:49:50,496 Това нещо, наречено низ сме използвали за известно време, 1114 00:49:50,496 --> 00:49:53,370 отиваме да се вземат бавно, че далеч от вас и започнем да говорим за 1115 00:49:53,370 --> 00:49:55,725 нещо по-езотерично известен като знак * 1116 00:49:55,725 --> 00:49:59,550 но ние ще направим това хубаво и внимателно в началото, въпреки че указатели, 1117 00:49:59,550 --> 00:50:02,730 тъй като те се наричат, може да се направят някои много лоши неща, ако се злоупотребява, 1118 00:50:02,730 --> 00:50:06,040 , като погледнете в малко claymation от нашият приятел Ник Parlante от Stanford 1119 00:50:06,040 --> 00:50:09,670 Университет, професор по компютърни науката, които, взети заедно този преглед 1120 00:50:09,670 --> 00:50:11,075 за това какво е да дойде тази сряда. 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 Хей, Бинки. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Събуди се. 1126 00:50:15,780 --> 00:50:17,240 Това е време, за показалка забавно. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Какво е това? 1129 00:50:19,350 --> 00:50:21,150 Научете повече за указатели? 1130 00:50:21,150 --> 00:50:22,050 О, лакомство! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END възпроизвеждане на видео] 1133 00:50:23,730 --> 00:50:25,396 SPEAKER 1: Това ви очаква в сряда. 1134 00:50:25,396 --> 00:50:26,440 Ще се видим тогава. 1135 00:50:26,440 --> 00:50:27,106 [VIDEO PLAYBACK] 1136 00:50:27,106 --> 00:50:30,420 -А Сега, Deep Thoughts, от Дейвън Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> Защо са ни учи C? 1139 00:50:35,900 --> 00:50:36,785 Защо не A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [СМЯХ] 1142 00:50:40,910 --> 00:50:42,160 >> [END възпроизвеждане на видео]