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 ВИДЕОВОСПРОИЗВЕДЕНИЕ]