1 00:00:00,000 --> 00:00:12,040 >> [МУЗИКА ГРАЄ] 2 00:00:12,040 --> 00:00:16,460 >> СПІКЕР 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, або Баш двері, 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 ОК, не повинно бути набагато, набагато більше рук прямо зараз, з причин, ми побачимо. 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 >> СПІКЕР 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 також відомий як Bash помилка, програмне забезпечення вона використовує. 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 для тяжкості Національним Уразливість База даних. 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 СПІКЕР 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 СПІКЕР 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 >> СПІКЕР 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 Це Bourne-Again 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 Ви знаєте, що є команди, як кд і 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 це програма під назвою Terminal. 94 00:04:55,620 --> 00:04:58,800 Він поставляється вбудована в нічиї комп'ютер, який має Mac в цій кімнаті, 95 00:04:58,800 --> 00:05:03,640 і ви можете зробити те ж саме в Mac ОС, але ви можете піти більш за що. 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 >> [АУДІО ВІДТВОРЕННЯ] 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 >> СПІКЕР 1: Так, справедливості заради, це не було насправді "привіт". 109 00:05:35,030 --> 00:05:36,894 Це, як правило, було щось більше схоже на that-- 110 00:05:36,894 --> 00:05:37,560 [АУДІО ВІДТВОРЕННЯ] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 СПІКЕР 1: --that я 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 Ви можете спробувати ввести в тому, що Програма називається Термінал. 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 але ті з вас з Macs можете ввести це у вікно, як я зроблю тут, 128 00:06:22,310 --> 00:06:24,210 і якщо ви введіть що в цю програму 129 00:06:24,210 --> 00:06:28,830 називається Термінал, як я зроблю зараз, якщо ви бачите слово "вразливими" 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 називається х, і присвоюємо його що жовтий шматок коду там. 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 але те, що якщо ви зробили щось насправді злий, як РМ-РФ *, 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 гт робить що, звичайно? 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 Все. 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 або функція називається х, але тоді обманюючи комп'ютер у виконанні 186 00:08:56,810 --> 00:09:00,030 за межі, що Функція, за цією точкою з коми, 187 00:09:00,030 --> 00:09:04,430 Ви дійсно може обдурити комп'ютер у виконанні то як РМ-РФ 188 00:09:04,430 --> 00:09:07,810 або команда E-mail або команда Копіювати. 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 Ну, є багато комп'ютерів на інтернет проточною Bash. 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 Вікна знову отримує щодо гачка 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 Інтернет Провідник, User-Agent Firefox, це 220 00:10:42,420 --> 00:10:44,590 просто вашого браузера спосіб ідентифікації себе. 221 00:10:44,590 --> 00:10:46,605 Але якщо поганий хлопець дуже розумно говорить, мм-мм, я 222 00:10:46,605 --> 00:10:47,930 не збираюся говорити вам, що мій браузер, 223 00:10:47,930 --> 00:10:50,888 Я замість пошлю тобі це загадковий вигляд річ з РМ-РФ 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 і ми були компіляції їм з Clang. 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 Маріо, і Жадібні та Кредит. 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 про Clang в компілятор. 294 00:14:04,850 --> 00:14:08,360 Чому нас довіряючи Clang протягом останніх двох-трьох тижнів? 295 00:14:08,360 --> 00:14:12,650 Хто може сказати, що той, хто писав Clang не було "якщо" умова в там 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 Ми маємо таку системи честь праворуч Тепер, коли ми віримо, що Clang є законним. 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 на відміну від тих, кого ми мали доступ в порожньому. 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 ми змогли б дуже швидко з нуля, і тепер з 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 Але майте на увазі, що це зовсім як нуля. 344 00:16:26,281 --> 00:16:28,780 Швидше за все ви не використали всі частини головоломки в порожньому місці. 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, Контузія, чи інакше? 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 СПІКЕР 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 мову, як C, але це кінцевому рахунку, все процедурний. 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 >> АУДИТОРІЯ: н § п? 391 00:18:19,360 --> 00:18:20,819 >> СПІКЕР 1: п увійти н, право. н увійти н. 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 Так н квадрат. н квадрат більше, ніж це, 396 00:18:30,610 --> 00:18:34,650 і навіть якщо це не зовсім очевидно, знаю, що журнал н менше п, 397 00:18:34,650 --> 00:18:36,910 так що якщо ви п раз то менше, ніж п, 398 00:18:36,910 --> 00:18:38,680 це буде менше п квадрат. 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 >> АУДИТОРІЯ: Пам'ять. 405 00:18:53,591 --> 00:18:54,465 СПІКЕР 1: Скажіть ще раз? 406 00:18:54,465 --> 00:18:55,173 АУДИТОРІЯ: Пам'ять. 407 00:18:55,173 --> 00:18:57,040 СПІКЕР 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, жорсткий диск space-- 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 Сортувати сказав нам робити було що? 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 СПІКЕР 1: Скажіть ще раз? 426 00:19:38,663 --> 00:19:39,650 АУДИТОРІЯ: Розділити на дві частини. 427 00:19:39,650 --> 00:19:40,610 СПІКЕР 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 >> Як ви впорядкувати список тепер, в жовтий, розмір два, використовуючи Злиття Сортувати? 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 Сортувати? 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 Сортувати, перемотування в пам'яті. 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 >> Отже, дозвольте мені просто крок через це без розмові точку занадто багато. 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 Злиття це, і зараз те, що крок залишається? 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 У загальній складності п, чи не так? 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 якщо п <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 є розмір входу, так Т (п), тільки химерний спосіб 502 00:22:54,150 --> 00:22:56,330 сказати біг Час дано вхід обсягу п 503 00:22:56,330 --> 00:23:00,220 буде порядку постійної часу, в O (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 Так що, якщо час роботи в Взагалі ми просто сказати, Т (п). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 А тепер ти роду понтіровавшего тут і кажучи, ну просто впорядкувати ліву половину, 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 п над ними. 519 00:23:31,057 --> 00:23:32,140 Чому б мені просто не сказати, що? 520 00:23:32,140 --> 00:23:36,449 І тоді це ще один Т (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 Т (п) є тільки час роботи Т (п / 2), плюс Т (п / 2), залишив половину і праву половину, 527 00:23:51,140 --> 00:23:55,360 плюс O (п), що, ймовірно, п кроків, але може бути, якщо я використовую два пальця, 528 00:23:55,360 --> 00:23:57,960 це в два рази більше кроки, але це лінійна. 529 00:23:57,960 --> 00:24:00,440 Це деяка кількість кроків ось фактор п, 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 ми, що рецидиву в кінцевому рахунку, закінчується зрівнявшись це, п раз увійти н, 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 Прототип. 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 СПІКЕР 1: Що це? 558 00:25:16,905 --> 00:25:17,800 АУДИТОРІЯ: Ми оголошуємо його. 559 00:25:17,800 --> 00:25:18,883 СПІКЕР 1: Ми оголошуємо його. 560 00:25:18,883 --> 00:25:22,290 Таким чином, ви вчите Clang, агов, фактично не здійснює це ще, 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 і сказати Int N І Край це збирається повернути Int, 567 00:25:36,570 --> 00:25:39,900 але крапка з комою означає, мм, я обійти в реалізації цього трохи пізніше. 568 00:25:39,900 --> 00:25:40,989 Знову ж, Clang є німим. 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 Я оголосити змінну п, а потім Я приставати користувачеві знову і знову 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 Я оголосити Int під назвою "Відповідь". 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 ось 3 плюс 2, так що це 5, плюс 1 повинен дати мені 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 Сигма це ім'я, і ​​він приймає змінна м замість п. 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 від я = 1 на до = т, що є що користувач ввів в, а потім я 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 Один, я стверджую, на мій коментар, який це уникає ризику нескінченний цикл. 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 >> АУДИТОРІЯ: Ви ніколи не будете досягати м. 618 00:27:51,290 --> 00:27:52,880 >> СПІКЕР 1: Ніколи не лізьте м. 619 00:27:52,880 --> 00:27:55,880 Але м передається в, так що давайте Розглянемо простий приклад. 620 00:27:55,880 --> 00:27:58,510 Якщо м передається в по Користувач, як негативного. 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 Таким чином, якщо негативна м, то як негативного. 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 Це was-- давайте ні, давайте Нікс цю історію. 633 00:28:29,370 --> 00:28:32,780 Я не задати це питання, тому що ризик того, що я, натякаючи на 634 00:28:32,780 --> 00:28:38,360 не відбудеться, тому що я це завжди буде бути більше than-- ОК, 635 00:28:38,360 --> 00:28:39,871 Я відрікаюся це питання. 636 00:28:39,871 --> 00:28:40,370 Добре. 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 У мене оголошені I всередині петлі, 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 СПІКЕР 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 СПІКЕР 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 Для циклу, в той час як цикл, 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 Якщо т менше або дорівнює нулю, сигма не має сенсу. 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 до п, або м в цьому випадку, 690 00:30:59,930 --> 00:31:02,630 може бути зроблено за видами перекладання відповідальності. 691 00:31:02,630 --> 00:31:04,947 Ну, те, що є сумою 1 до т? 692 00:31:04,947 --> 00:31:05,780 Ну, ви знаєте, що? 693 00:31:05,780 --> 00:31:11,949 Це те ж саме як сума м плюс сума 1 до т мінус 1. 694 00:31:11,949 --> 00:31:12,740 Ну ви знаєте, що? 695 00:31:12,740 --> 00:31:13,940 Що сигма м мінус 1? 696 00:31:13,940 --> 00:31:17,860 Ну, якщо ви начебто слідувати цьому логічно, це те ж саме, як м мінус 1 697 00:31:17,860 --> 00:31:21,415 плюс сигма м мінус 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 п, що сигма п, що сигма п? 705 00:31:39,116 --> 00:31:40,990 Ти просиш що сигма п, що сигма 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 Що Sigma з одного або нулю, деякі дуже мале значення, 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 Давайте просто обчислити сигма приймаючи м з подальшим додаванням 726 00:32:42,450 --> 00:32:44,564 в сигма м мінус один? 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 >> Добре. 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 СПІКЕР 1: Ах. 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 Бо врешті день Int ще 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 СПІКЕР 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 закінчити, тому що їх єдиною лінії код викликає сам собі знову і знову 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 Це шматок пам'яті, шматок пам'яті, 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 >> І справді, якщо цих зелених літаків від Анненберг представляють цю пам'ять, 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 це вимагає деякого звикання щоб --Как елегантний або як просто 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 О, wait-- це помилка. 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 >> СПІКЕР 4: Лаура. 858 00:38:09,360 --> 00:38:09,740 >> СПІКЕР 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 і деякі чашки, які ми запозичені з Анненберг сьогодні. 868 00:38:23,345 --> 00:38:24,178 >> СПІКЕР 4: Позикові. 869 00:38:24,178 --> 00:38:27,240 СПІКЕР 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 >> СПІКЕР 4: Чи можу я отримати ще одну чашку? 886 00:39:02,359 --> 00:39:05,650 СПІКЕР 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 Великий вибух аплодисментів було б добре для Лаури. 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 і помістити вміст OJ в тому, що, то поміняти одну чашку, 917 00:40:19,370 --> 00:40:22,610 потім покласти OJ в Оригінальний кубок, тим самим 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 х отримує один, і десяткового у отримує два. 928 00:40:52,020 --> 00:40:54,930 Так думати про тих, як OJ і молоко, відповідно. 929 00:40:54,930 --> 00:40:57,100 А потім я просто є Е кажучи х це 930 00:40:57,100 --> 00:41:00,120 і у це, тільки так я можу наочно побачити, що відбувається. 931 00:41:00,120 --> 00:41:03,810 Тоді я PRINTF стверджуючи що я перекачки два, 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, у 2, перекачування місцями. 939 00:41:28,320 --> 00:41:32,700 х і раніше 1, а у ще 2. 940 00:41:32,700 --> 00:41:37,630 Таким чином, навіть при тому, що, відверто кажучи, це виглядає точно як, хоча і більш технічно, 941 00:41:37,630 --> 00:41:40,730 що зробив Лаура, не схоже на роботу. 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 для трохи пам'яті для будь-який місцевий змінні, такі як х і у, що основна має, 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 і копії молока до Лаури, так що що в кінцевому підсумку всередині цього лотка 955 00:42:27,110 --> 00:42:32,510 це одне значення, і два чи OJ і молоко, але їх копії, 956 00:42:32,510 --> 00:42:34,790 так що на даний момент в історії, є 957 00:42:34,790 --> 00:42:36,930 це OJ і молоко в кожному з цих літаків. 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 не має жодного впливу на х і у, хоча Я пройшов х і у функції підкачування. 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 АУДИТОРІЯ: Return. 970 00:43:13,335 --> 00:43:14,085 СПІКЕР 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 >> СПІКЕР 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 СПІКЕР 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 Так що я не повинен тепер змінити свій код, додати PRINTF-х, пересобрать їх повтор 1035 00:46:09,850 --> 00:46:13,300 його, змінити, додати деякі PRINTF-х, зберегти його, перекомпілювати його, запустити його. 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 Так адже якщо я типу друку х, чи не Е, просто роздрукувати х, 1046 00:46:46,220 --> 00:46:50,730 Я отримую деякі фіктивні значення там нуля, тому х ні инициализирован ще. 1047 00:46:50,730 --> 00:46:54,760 Так що я збираюся ввести наступний, або, якщо вам хочу бути незвичайний, просто п на наступний. 1048 00:46:54,760 --> 00:46:59,090 Але коли я друкую наступний введіть, тепер помітите, що він переходить до рядка 17. 1049 00:46:59,090 --> 00:47:02,840 Так логічно, якщо я виконується рядок 16 і тепер я друкую Print 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 Один. 1053 00:47:05,520 --> 00:47:07,820 >> А тепер це, за загальним визнанням в оману. 1054 00:47:07,820 --> 00:47:11,260 $ 2 це просто химерний спосіб, якщо вам хочу звернутися до цього значення пізніше, 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 І тепер, якщо я друкую наступний раз і друк у, я повинен бачити 2. 1060 00:47:21,000 --> 00:47:23,870 Я також можу зараз друкувати х знову, і, чесно кажучи, 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 О, у є 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 Я друкую крок, і тепер помічають підскочила мене 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 Дозвольте мені друкувати TMP. 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 Чому TMP є деякі з розуму, підробленим значення сміття? 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 СПІКЕР 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 що ті залишки від деякі попередні використання цієї пам'яті, 1101 00:49:10,750 --> 00:49:13,050 хоча у мене не я потребував в ньому ще. 1102 00:49:13,050 --> 00:49:17,086 Так що тепер я збираюся йти вперед і тип Наступний, і, якщо я тепер типу друку TMP, 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 як х був першим річ передається в, 1107 00:49:25,550 --> 00:49:30,450 так і х повинні бути такими ж, так друкувати TMP повинні надрукувати мені один. 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 зі Стенфорда 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 >> [Відеовідтворення] 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 СПІКЕР 1: Це чекає вас в середу. 1134 00:50:25,396 --> 00:50:26,440 Побачимося тоді. 1135 00:50:26,440 --> 00:50:27,106 [Відеовідтворення] 1136 00:50:27,106 --> 00:50:30,420 -И Зараз, Deep Thoughts, по Daven Фарнем. 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 Чому б не +? 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 відеовідтворення]