1 00:00:00,000 --> 00:00:12,040 >> [MUSIQUE LECTURE] 2 00:00:12,040 --> 00:00:16,460 >> ENCEINTE 1: Très bien, c'est CS50, et c'est le début de la quatrième semaine, 3 00:00:16,460 --> 00:00:20,420 et comme vous avez pu entendre ou lire, le monde a été à sa fin. 4 00:00:20,420 --> 00:00:23,520 Aller tout autour de l'Internet a été la connaissance et de la sensibilisation 5 00:00:23,520 --> 00:00:27,100 d'un bogue dans un programme, un langage de programmation appelé Bash. 6 00:00:27,100 --> 00:00:32,729 Cela a été merveilleux de marque comme Shellshock, ou la porte de Bash, 7 00:00:32,729 --> 00:00:35,485 mais des articles comme ceux-ci n'ont pas été rares. 8 00:00:35,485 --> 00:00:38,807 Et en fait, beaucoup d'entre eux apportent souvenirs de retour de Heartbleed, 9 00:00:38,807 --> 00:00:41,640 que vous avez peut-être remarqué dans le refouler le printemps dernier, qui 10 00:00:41,640 --> 00:00:43,980 était de même assez dramatique. 11 00:00:43,980 --> 00:00:47,110 Maintenant, ceux d'entre vous ici aujourd'hui, combien d'entre vous ont, 12 00:00:47,110 --> 00:00:50,330 même si vous ne comprenez pas ce il est tout au sujet, entendu parler de Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Très bien, et combien d'entre vous avoir des ordinateurs qui sont vulnérables? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, il devrait y avoir beaucoup, beaucoup plus de mains jusqu'à ce moment, pour des raisons que nous verrons. 17 00:01:00,250 --> 00:01:02,580 >> Jetons un oeil à ce qui est se passe dans les médias 18 00:01:02,580 --> 00:01:05,304 puis l'expliquer un peu ici pour nous sur le plan technique. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> ENCEINTE 2: Les experts en sécurité ont averti qu'une grave lacune pourrait 21 00:01:11,250 --> 00:01:15,650 être sur le point de toucher des centaines de millions d'utilisateurs d'Internet dans le monde. 22 00:01:15,650 --> 00:01:20,600 Alors, quel est exactement le bug qui a été surnommé Shellshock, et que fait-il? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Eh bien, Shellshock est également connu comme l' bug de Bash, le logiciel qu'il exploite. 25 00:01:28,910 --> 00:01:33,230 Les pirates utilisent le virus pour scanner vulnérables systèmes fonctionnant sous Linux et Unix 26 00:01:33,230 --> 00:01:36,300 les systèmes d'exploitation et les infecter. 27 00:01:36,300 --> 00:01:38,730 Bash est un shell en ligne de commande. 28 00:01:38,730 --> 00:01:43,460 Cela permet aux utilisateurs de question de lancer des commandes programmes et fonctionnalités dans le logiciel 29 00:01:43,460 --> 00:01:45,250 par la saisie de texte. 30 00:01:45,250 --> 00:01:49,980 Il est généralement utilisé par les programmeurs, et ne devrait pas être ouvert au reste du monde, 31 00:01:49,980 --> 00:01:51,590 si Shellshock change cela. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Eh bien, worringly, certains analystes avertir qu'il pourrait être une plus grande menace, 34 00:01:57,910 --> 00:02:01,580 parce Shellshock permet complète le contrôle d'une machine infectée, 35 00:02:01,580 --> 00:02:06,030 alors que Heartbleed seulement permis les pirates pour espionner les ordinateurs. 36 00:02:06,030 --> 00:02:09,130 C'est tellement grave, c'est été évalué à 10 sur 10 37 00:02:09,130 --> 00:02:11,900 de la gravité par le National Base de données de vulnérabilité. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 de tous les serveurs Web sont à risque, y compris des ordinateurs Mac. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Eh bien, assurez-vous patcher votre système maintenant. 42 00:02:25,600 --> 00:02:29,330 N'importe qui héberge un site Internet marche les systèmes d'exploitation affectés 43 00:02:29,330 --> 00:02:31,800 devraient prendre des mesures dès que possible. 44 00:02:31,800 --> 00:02:35,390 N'importe qui peut se permettre il devrait ressembler à leur application de surveillance et web 45 00:02:35,390 --> 00:02:37,355 pare-feu à regarder dehors pour toutes les attaques. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 ENCEINTE 3: Le pire qui pourrait arriver, c'est 48 00:02:41,770 --> 00:02:45,080 que quelqu'un écrire du code qui serait automatiquement aller et numériser 49 00:02:45,080 --> 00:02:48,280 Internet et affecterait l'ensemble de ces ordinateurs. 50 00:02:48,280 --> 00:02:50,710 Et une fois qu'ils le font, bien, la pire chose qu'ils pouvaient faire 51 00:02:50,710 --> 00:02:53,300 est il suffit de supprimer tout ou fermer les sites potentiels. 52 00:02:53,300 --> 00:02:55,360 Donc, nous pourrions voir des dommages de ce point de vue, 53 00:02:55,360 --> 00:02:58,300 où nous aurions des personnes mal intentionnées qui décident juste de causer des ravages 54 00:02:58,300 --> 00:03:02,534 en amenant vers le bas ou la suppression des systèmes fichiers, et des choses comme ça. 55 00:03:02,534 --> 00:03:05,200 ENCEINTE 2: Certains disent que c'est un des plus difficiles à mesurer 56 00:03:05,200 --> 00:03:08,080 bogues dans les années, et il peut prendre des semaines ou même 57 00:03:08,080 --> 00:03:10,820 mois afin de déterminer son impact final. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> ENCEINTE 1: Donc tout cela est vrai, mais le plus drôle est, la quasi-totalité 60 00:03:15,560 --> 00:03:18,330 de l'imagerie vous venez de voir, sauf peut-être le clavier, 61 00:03:18,330 --> 00:03:20,930 n'a rien à voir avec le bug que ce soit. 62 00:03:20,930 --> 00:03:23,960 Les serveurs et les fils et ainsi de suite, C'est une sorte de qu'accessoirement, 63 00:03:23,960 --> 00:03:27,410 mais à la base, il est en fait assez familier ce qui se passe ici. 64 00:03:27,410 --> 00:03:30,050 En fait, laissez-moi aller dans notre appareil de CS50. 65 00:03:30,050 --> 00:03:32,910 Permettez-moi aller de l'avant et de maximiser la fenêtre de terminal ici. 66 00:03:32,910 --> 00:03:36,020 Et vous les gars ont eu recours à cela, ou la version embarquée de celui-ci, 67 00:03:36,020 --> 00:03:39,460 dans gedit pour écrire des programmes, entrer des commandes, et ainsi de suite, 68 00:03:39,460 --> 00:03:43,690 et c'est effectivement, et a été pendant des semaines, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Il s'agit de la Bourne again shell, qui est juste une façon élégante de dire, 70 00:03:46,890 --> 00:03:50,220 il s'agit d'un programme qui a un clignotement rapide, efficace, 71 00:03:50,220 --> 00:03:51,970 qui est assis là à attendre pour l'entrée pour vous. 72 00:03:51,970 --> 00:03:53,920 Et c'est la commande interface de ligne par l'intermédiaire duquel 73 00:03:53,920 --> 00:03:57,650 vous les gars ont été l'exécution de commandes et finalement, la compilation et l'exécution 74 00:03:57,650 --> 00:03:58,400 programmes. 75 00:03:58,400 --> 00:04:01,320 >> Mais Bash est également une programmation langue dans le sens suivant. 76 00:04:01,320 --> 00:04:05,460 Vous savez qu'il ya des commandes comme cd et ls et aussi clang et autres, 77 00:04:05,460 --> 00:04:09,580 mais vous pouvez définir vos propres commandes par leur mise en œuvre dans Bash. 78 00:04:09,580 --> 00:04:11,420 Maintenant, nous n'allons pas entrer dans les détails 79 00:04:11,420 --> 00:04:16,089 à bash le langage de programmation, mais savoir, par exemple, que pour le moment, 80 00:04:16,089 --> 00:04:17,607 il n'y a pas de commande appelé «bonjour». 81 00:04:17,607 --> 00:04:19,440 Donc, il peut être trouvé dans un de ces paquets. 82 00:04:19,440 --> 00:04:20,856 Il n'est pas installé sur mon ordinateur. 83 00:04:20,856 --> 00:04:21,870 Demandez à votre administrateur. 84 00:04:21,870 --> 00:04:26,030 Mais si je veux qu'il y ait un programme appelé «bonjour» en Bash ou à mon invite, 85 00:04:26,030 --> 00:04:30,810 Je peux effectivement utiliser la syntaxe c'est tout à fait comme C. Ce n'est pas tout à fait la même, 86 00:04:30,810 --> 00:04:35,020 mais il semble assez similaire à un fonction, mais manque quelques détails. 87 00:04:35,020 --> 00:04:38,090 Rien ne semble se passer, mais maintenant, si je tape "bonjour" 88 00:04:38,090 --> 00:04:40,960 vous pouvez réellement écrire un programme, pas en C, pas en Java, 89 00:04:40,960 --> 00:04:44,280 pas dans une autre programmation langue, mais en Bash lui-même. 90 00:04:44,280 --> 00:04:47,630 >> Maintenant, la clé ici est que j'ai écrit l' nom que je voulais donner à cette nouvelle commande, 91 00:04:47,630 --> 00:04:50,820 et les parenthèses sont également symbolique de ce qui est une fonction. 92 00:04:50,820 --> 00:04:54,010 En passant, vous pouvez également faire plaisir choses, et en fait, même sur Mac OS, 93 00:04:54,010 --> 00:04:55,620 il s'agit d'un programme appelé Terminal. 94 00:04:55,620 --> 00:04:58,800 Il est livré intégré dans n'importe qui ordinateur équipé d'un Mac dans cette salle, 95 00:04:58,800 --> 00:05:03,640 et vous pouvez faire des choses similaires à Mac OS, mais vous pouvez aller plus loin. 96 00:05:03,640 --> 00:05:07,110 Et c'est un peu tangent, mais c'est le genre de plaisir. 97 00:05:07,110 --> 00:05:09,715 Je me suis rappelé ce matin, en pensant ce travers, 98 00:05:09,715 --> 00:05:13,279 d'un petit jeu que j'ai l'habitude de jouer avec l'un des anciens de FO CS50 99 00:05:13,279 --> 00:05:16,570 lequel tout moment il quitterait son clavier avec son écran déverrouillé, 100 00:05:16,570 --> 00:05:23,611 Je voudrais exécuter une commande comme this-- "dire bonjour." 101 00:05:23,611 --> 00:05:26,610 Et maintenant, chaque fois qu'il est revenu à son clavier après j'ai effacé l'écran 102 00:05:26,610 --> 00:05:27,985 et il s'asseyait, essayer de faire un peu de travail, 103 00:05:27,985 --> 00:05:29,250 lister le contenu de son directory-- 104 00:05:29,250 --> 00:05:29,510 >> [LECTURE AUDIO] 105 00:05:29,510 --> 00:05:30,010 >> -Hello. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Bonjour. 108 00:05:32,120 --> 00:05:35,030 >> ENCEINTE 1: Donc, en toute équité, il n'a pas été fait "bonjour." 109 00:05:35,030 --> 00:05:36,894 Il était généralement quelque chose plus proche de that-- 110 00:05:36,894 --> 00:05:37,560 [LECTURE AUDIO] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 ENCEINTE 1: --que je would-- si son ordinateur serait 113 00:05:39,320 --> 00:05:42,170 jure à lui chaque fois qu'il fait assis à son clavier. 114 00:05:42,170 --> 00:05:46,265 Et très vite, il a compris de ne pas laisser son écran déverrouillé. 115 00:05:46,265 --> 00:05:48,730 Mais cela suggère le genre de plaisir stupide que vous 116 00:05:48,730 --> 00:05:50,210 peut avoir avec quelque chose comme Bash. 117 00:05:50,210 --> 00:05:52,770 Mais il est un peu plus grave, bien sûr, que cela. 118 00:05:52,770 --> 00:05:57,235 Et en fait, c'est l'un des la plupart des bogues dangereux et durables 119 00:05:57,235 --> 00:05:58,860 qui a vraiment touché le monde entier dans le monde. 120 00:05:58,860 --> 00:06:02,060 Ce bug a été autour depuis 20 ans, 121 00:06:02,060 --> 00:06:05,780 et vous serez frappé en seulement instant de sa relative simplicité. 122 00:06:05,780 --> 00:06:07,990 >> Il s'agit donc d'un représentant commander que si vous 123 00:06:07,990 --> 00:06:10,448 posséder un Mac, littéralement dès maintenant quand vous avez votre couvercle ouvert, 124 00:06:10,448 --> 00:06:12,940 vous pouvez essayer de taper dans cette programme appelé Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminal est en cours Applications Utilities-- 126 00:06:15,410 --> 00:06:18,790 pour une fois, les utilisateurs de Windows n'ont pas à s'inquiéter à ce sujet threat-- particulier 127 00:06:18,790 --> 00:06:22,310 mais ceux d'entre vous avec les Mac peut taper ce dans une fenêtre comme je vais le faire ici, 128 00:06:22,310 --> 00:06:24,210 et si vous ne tapez que dans ce programme, 129 00:06:24,210 --> 00:06:28,830 appelé Terminal, comme je vais le faire maintenant, si vous voyez le mot «vulnérable» 130 00:06:28,830 --> 00:06:32,200 votre ordinateur est vulnérables à l'exploitation. 131 00:06:32,200 --> 00:06:33,850 >> Maintenant, qu'est-ce que signifie réellement? 132 00:06:33,850 --> 00:06:35,870 Et ce n'est certes une syntaxe assez fou, 133 00:06:35,870 --> 00:06:39,050 mais nous allons au moins tirer certains des aspects intéressants. 134 00:06:39,050 --> 00:06:42,567 Donc, il ya une syntaxe qui ressemble un peu familier, au moins à partir de C 135 00:06:42,567 --> 00:06:43,950 et la programmation en général. 136 00:06:43,950 --> 00:06:47,550 Je vois des parenthèses, des points-virgules, des accolades, et comme, 137 00:06:47,550 --> 00:06:50,820 mais il se trouve que ce stupide ici en jaune 138 00:06:50,820 --> 00:06:53,580 est essentiellement une fonction qui ne fait rien. 139 00:06:53,580 --> 00:06:57,840 Les moyens du côlon ne font rien, et la virgule signifie arrêter de ne rien faire. 140 00:06:57,840 --> 00:07:00,250 Ainsi, à l'intérieur de ceux-ci accolades, le fait 141 00:07:00,250 --> 00:07:02,440 que j'ai un pied d'égalité signer vers la gauche, ce 142 00:07:02,440 --> 00:07:05,500 est essentiellement la création d' une commande ou une variable, 143 00:07:05,500 --> 00:07:09,520 appelé x, et en lui attribuant que peu jaune de code là. 144 00:07:09,520 --> 00:07:14,040 Cela pourrait être quelque chose comme "écho bonjour »ou« dire bip "ou quelque chose 145 00:07:14,040 --> 00:07:15,120 semblable à celle. 146 00:07:15,120 --> 00:07:17,780 Mais remarquez si vos yeux promener un peu plus vers la droite, 147 00:07:17,780 --> 00:07:22,150 il ya plus à cette ligne de juste à la fin de ce point-virgule. 148 00:07:22,150 --> 00:07:25,160 "Echo vulnérables», puis au-delà il ya encore plus. 149 00:07:25,160 --> 00:07:26,530 Un autre point-virgule, bash-c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Donc, longue histoire courte, cette ligne de code est 152 00:07:34,050 --> 00:07:36,660 suffisante pour contraindre un ordinateur qui est 153 00:07:36,660 --> 00:07:39,830 vulnérables à faire quelque chose que vous voulez qu'il fasse, 154 00:07:39,830 --> 00:07:44,290 parce qu'il ya un bug dans lequel Bash même si Bash était censé arrêter 155 00:07:44,290 --> 00:07:48,980 lecture des lignes de commande à droite il après le texte jaune, 156 00:07:48,980 --> 00:07:52,520 un de plus de 20 ans bug, Bash a été effectivement lecture 157 00:07:52,520 --> 00:07:56,780 au-delà point-virgule et jolie beaucoup faire ce qu'on lui dit. 158 00:07:56,780 --> 00:07:59,070 >> Alors, quelle est l'implication en fin de compte que de? 159 00:07:59,070 --> 00:08:01,340 Je viens de dire "echo bonjour" ou "echo vulnérables», 160 00:08:01,340 --> 00:08:05,449 mais que faire si vous avez fait quelque chose effectivement malveillant, comme rm-rf *, 161 00:08:05,449 --> 00:08:07,240 qui vous ne pourriez pas ont déjà tapé avant, 162 00:08:07,240 --> 00:08:08,920 et franchement vous avez probablement ne devrait pas trop tôt, 163 00:08:08,920 --> 00:08:10,700 parce que vous pouvez faire beaucoup de dégâts avec elle. 164 00:08:10,700 --> 00:08:11,210 Pourquoi? 165 00:08:11,210 --> 00:08:12,990 rm fait quoi, bien sûr? 166 00:08:12,990 --> 00:08:14,270 Supprime. 167 00:08:14,270 --> 00:08:15,930 * Signifie quoi? 168 00:08:15,930 --> 00:08:16,430 Tous. 169 00:08:16,430 --> 00:08:18,180 C'est donc un soi-disant wild card, donc cela signifie 170 00:08:18,180 --> 00:08:20,410 supprimer tout le répertoire courant. 171 00:08:20,410 --> 00:08:23,379 r arrive à signifier récursive, qui signifie que si ce que vous la suppression 172 00:08:23,379 --> 00:08:26,420 est un répertoire, et à l'intérieur de là est d'autres fichiers et d'autres répertoires, 173 00:08:26,420 --> 00:08:28,950 plonger de manière récursive en y et supprimer tout cela. 174 00:08:28,950 --> 00:08:31,040 Et f est le pire de tous. 175 00:08:31,040 --> 00:08:32,580 Quelqu'un sait ce que signifie ici f? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Vigueur. 178 00:08:34,360 --> 00:08:37,830 Donc forcer les moyens, même si c'est une mauvaise idée, 179 00:08:37,830 --> 00:08:40,939 le faire sans me demandant pour confirmation. 180 00:08:40,939 --> 00:08:43,230 Donc, vous le savez, nous rions , mais franchement, je doute 181 00:08:43,230 --> 00:08:44,972 Ce type plusieurs fois un jour, parce que la réalité 182 00:08:44,972 --> 00:08:47,210 c'est que c'est le meilleur moyen de supprimer tout un tas de choses. 183 00:08:47,210 --> 00:08:48,590 Mais même j'ai fait quelques dégâts. 184 00:08:48,590 --> 00:08:53,100 >> Mais si vous étiez à tromper un ordinateur en définissant une variable stupide 185 00:08:53,100 --> 00:08:56,810 ou fonction appelée x, mais incitant l'ordinateur en exécutant 186 00:08:56,810 --> 00:09:00,030 au-delà des limites de cette fonction, au-delà de ce point-virgule, 187 00:09:00,030 --> 00:09:04,430 vous pouvez en effet tromper un ordinateur dans l'exécution de quelque chose comme rm-rf 188 00:09:04,430 --> 00:09:07,810 ou la commande Email ou la commande Copier. 189 00:09:07,810 --> 00:09:11,400 Tout littéralement vous pouvez faire avec la ordinateur, qu'il s'agisse de la suppression de fichiers, 190 00:09:11,400 --> 00:09:15,350 la création de fichiers, spamming de quelqu'un, attaquer un serveur à distance, 191 00:09:15,350 --> 00:09:17,190 si vous pouvez l'exprimer avec une commande, vous 192 00:09:17,190 --> 00:09:19,120 peut tromper un ordinateur en faisant cela. 193 00:09:19,120 --> 00:09:21,510 >> Maintenant, ce qui est un exemple de comment vous pouvez faire cela? 194 00:09:21,510 --> 00:09:24,300 Eh bien, il ya beaucoup d'ordinateurs sur le Bash internet en cours d'exécution. 195 00:09:24,300 --> 00:09:26,390 Tous les utilisateurs de Mac nous sont parmi eux. 196 00:09:26,390 --> 00:09:30,390 Un grand nombre de serveurs Linux sont parmi eux aussi, et les serveurs Unix. 197 00:09:30,390 --> 00:09:32,630 Fenêtres obtient à nouveau relativement décroché 198 00:09:32,630 --> 00:09:34,590 sauf si vous avez installé logiciel spécial. 199 00:09:34,590 --> 00:09:37,130 Maintenant, beaucoup de serveurs, pour exemple, les serveurs Web gérés, 200 00:09:37,130 --> 00:09:39,840 et en fait, Linux est peut-être le plus le système d'exploitation populaire 201 00:09:39,840 --> 00:09:43,060 pour fonctionner sur des ordinateurs sur l'Internet qui purgent des pages web. 202 00:09:43,060 --> 00:09:44,910 Maintenant, comme nous le verrons plus tard au cours du semestre, quand 203 00:09:44,910 --> 00:09:48,470 vous envoyez une demande de votre browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- à un serveur distant, 205 00:09:50,790 --> 00:09:53,730 il s'avère que, même si vous venez de taper www.example.com, 206 00:09:53,730 --> 00:09:59,590 votre navigateur envoie un message c'est un peu plus mystérieux, comme ça. 207 00:09:59,590 --> 00:10:01,239 >> Mais remarquez un peu quelque chose d'étrange. 208 00:10:01,239 --> 00:10:03,030 Les deux premières lignes Je n'ai jamais vu avant, 209 00:10:03,030 --> 00:10:04,904 mais ils ne semblent pas particulièrement menaçant. 210 00:10:04,904 --> 00:10:08,030 Mais remarque ce que je t'ai volé pour la troisième ligne ici. 211 00:10:08,030 --> 00:10:13,390 Si un mauvais gars devait envoyer un message comme cela de son ordinateur 212 00:10:13,390 --> 00:10:17,270 à un Mac ou un vulnérables serveur Linux vulnérables, 213 00:10:17,270 --> 00:10:21,580 le plus drôle, c'est que Bash, aussi simple que rapide peu de commande, 214 00:10:21,580 --> 00:10:27,450 est omniprésent et est souvent Utilisé pour exécuter l'essentiel 215 00:10:27,450 --> 00:10:30,020 le contenu d'un un message qu'il reçoit. 216 00:10:30,020 --> 00:10:33,490 Et cette logique, vous pouvez piéger un serveur web, donc, 217 00:10:33,490 --> 00:10:36,370 en envoyant quelque chose comme User-Agent, qui, généralement, 218 00:10:36,370 --> 00:10:38,300 est censé dire la Nom de votre navigateur. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent Internet Explorer, Firefox User-Agent, ce 220 00:10:42,420 --> 00:10:44,590 est juste le navigateur de votre façon de s'identifier. 221 00:10:44,590 --> 00:10:46,605 Mais si un méchant très dit habilement, mm-mm, je suis 222 00:10:46,605 --> 00:10:47,930 ne vais pas vous dire ce que mon navigateur est, 223 00:10:47,930 --> 00:10:50,888 Je place va vous envoyer ce chose cryptique vers l'avenir avec un rm -rf 224 00:10:50,888 --> 00:10:55,840 * En elle, vous pouvez littéralement tromper un le serveur web vulnérable sur Internet 225 00:10:55,840 --> 00:10:59,055 dans l'exécution exactement que dans y pour la suppression de tous les fichiers. 226 00:10:59,055 --> 00:11:00,930 Et franchement, ce n'est pas même le pire. 227 00:11:00,930 --> 00:11:01,763 Vous pouvez faire n'importe quoi. 228 00:11:01,763 --> 00:11:04,480 Vous pouvez commencer une distribués déni de service 229 00:11:04,480 --> 00:11:07,030 si vous avez envoyé ce message grappes entières de serveurs web 230 00:11:07,030 --> 00:11:10,256 puis avaient tous descendent, pour exemple, sur les serveurs Harvard.edu, 231 00:11:10,256 --> 00:11:12,130 et vous pouvez trier de coup le diable hors de leur 232 00:11:12,130 --> 00:11:15,490 par un trafic de réseau qui était déclenché contraire de ce méchant. 233 00:11:15,490 --> 00:11:18,760 >> Alors, longue histoire courte, presque tout le monde dans cette salle qui possède un Mac 234 00:11:18,760 --> 00:11:20,240 est vulnérable à cela. 235 00:11:20,240 --> 00:11:24,100 La doublure d'argent est que si vous êtes l'exécution d'un serveur Web sur votre ordinateur portable, 236 00:11:24,100 --> 00:11:27,780 et si vous avez réellement configuré à permettre quelque chose comme SSH en elle, 237 00:11:27,780 --> 00:11:28,670 vous êtes réellement sans danger. 238 00:11:28,670 --> 00:11:31,710 Il est vulnérable, mais il n'y a pas celle qui tente de pénétrer dans votre ordinateur portable, 239 00:11:31,710 --> 00:11:33,290 de sorte que vous pouvez sorte de tranquille. 240 00:11:33,290 --> 00:11:36,210 Toutefois, Apple va bientôt être mise à jour d'un correctif pour cela. 241 00:11:36,210 --> 00:11:39,660 Le monde de Linux a déjà publié un certain nombre de correctifs pour Fedora et Ubuntu 242 00:11:39,660 --> 00:11:43,790 et d'autres versions de Linux, et en effet si vous exécutez la mise à jour 50 dans l'appareil, 243 00:11:43,790 --> 00:11:45,930 même qui trop être mise à jour et corrigée. 244 00:11:45,930 --> 00:11:47,764 Mais cela n'a pas trop vraiment été vulnérables, 245 00:11:47,764 --> 00:11:49,804 parce que si vous avez bricolé avec l'appareil 246 00:11:49,804 --> 00:11:52,770 et fait de votre ordinateur portable publiquement accessible sur Internet, qui n'est pas 247 00:11:52,770 --> 00:11:54,910 par défaut, vous avez effectivement été bien parce que 248 00:11:54,910 --> 00:11:56,890 de pare-feu et d'autres techniques. 249 00:11:56,890 --> 00:12:01,000 >> Mais c'est un exemple extrême d'un bug que nous avons vécu pour pour littéralement 20 250 00:12:01,000 --> 00:12:04,050 ans, et qui sait si quelqu'un tout ce temps a connu à ce sujet? 251 00:12:04,050 --> 00:12:06,300 Et en fait, c'est l'un des les défis fondamentaux 252 00:12:06,300 --> 00:12:08,690 que nous verrons plus tard dans la semestre sur la sécurité, 253 00:12:08,690 --> 00:12:13,020 est que, tout comme dans le monde réel, les bons sont à l'inconvénient. 254 00:12:13,020 --> 00:12:16,500 Pour garder les méchants, nous devons s'assurer que chaque porte est verrouillée, 255 00:12:16,500 --> 00:12:20,340 que chaque fenêtre est sécurisé, que chaque point d'entrée dans une maison 256 00:12:20,340 --> 00:12:21,980 est sûr de garder les méchants. 257 00:12:21,980 --> 00:12:26,870 Mais qu'est-ce que le méchant doivent faire réellement compromettre votre maison 258 00:12:26,870 --> 00:12:28,200 et vous voler? 259 00:12:28,200 --> 00:12:32,574 Il ou elle a juste besoin de trouver un déverrouillé porte, une fenêtre cassée, ou quelque chose 260 00:12:32,574 --> 00:12:35,240 le long de ces lignes, et c'est la même chose dans la sécurité informatique. 261 00:12:35,240 --> 00:12:37,660 Nous pouvons écrire des millions de lignes de code de programmation 262 00:12:37,660 --> 00:12:40,570 et dépenser des centaines ou des milliers des heures à essayer de l'obtenir correcte, 263 00:12:40,570 --> 00:12:43,370 Mais si vous faites juste un erreur dans l'exactitude, 264 00:12:43,370 --> 00:12:47,030 vous pouvez mettre l'ensemble du système et en effet, dans ce cas, tout l'Internet 265 00:12:47,030 --> 00:12:48,660 et dans le monde en danger. 266 00:12:48,660 --> 00:12:51,950 >> Donc, si vous souhaitez en savoir plus à ce sujet, allez à cette adresse ici. 267 00:12:51,950 --> 00:12:54,450 Il n'y a pas nécessité d'une action ce soir, sauf si vous êtes 268 00:12:54,450 --> 00:12:57,116 parmi ceux plus à l'aise que ont été la gestion de votre propre site web 269 00:12:57,116 --> 00:12:59,810 serveur, auquel cas vous devriez, en fait, de mettre à jour votre logiciel. 270 00:12:59,810 --> 00:13:03,244 >> Et c'est aussi le titre de un discours, et maintenant un document, 271 00:13:03,244 --> 00:13:05,410 que nous avons relié à la le site Web de cours pour aujourd'hui. 272 00:13:05,410 --> 00:13:07,600 C'était par un collègue nommé Ken Thompson, qui 273 00:13:07,600 --> 00:13:10,120 a été d'accepter un très célèbre prix en informatique, 274 00:13:10,120 --> 00:13:13,495 et il a donné ce discours quelques années Il ya, essentiellement sur le même sujet. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Les gens se poser la question, devriez-vous vraiment 277 00:13:20,520 --> 00:13:23,480 confiance, en fin de compte, la logiciel que vous avez reçu? 278 00:13:23,480 --> 00:13:26,100 Par exemple, nous avons tous été l'écriture de programmes, 279 00:13:26,100 --> 00:13:27,820 et nous avons compilons eux avec Clang. 280 00:13:27,820 --> 00:13:31,830 Et à votre connaissance, avez-vous écrit des programmes pour CS50 où il ya 281 00:13:31,830 --> 00:13:35,310 une porte arrière de toutes sortes, il ya une façon que un mauvais gars, si vous exécutez votre programme, 282 00:13:35,310 --> 00:13:37,410 pourrait prendre contrôle de votre ordinateur? 283 00:13:37,410 --> 00:13:38,310 Probablement pas, non? 284 00:13:38,310 --> 00:13:40,180 Mario et gourmand, et crédit. 285 00:13:40,180 --> 00:13:41,680 Ce sont tous très petits programmes. 286 00:13:41,680 --> 00:13:43,910 Vous devriez être assez mauvais si vous avez réellement 287 00:13:43,910 --> 00:13:47,310 fait toute votre ordinateur vulnérable après avoir écrit 10 ou 20 lignes de code, 288 00:13:47,310 --> 00:13:49,690 ou au moins pas au courant de certaines des implications de sécurité. 289 00:13:49,690 --> 00:13:52,023 Maintenant, je dis que la blague, mais nous allons voir aujourd'hui 290 00:13:52,023 --> 00:13:54,600 et cette semaine, il s'agit en fait d' vraiment, vraiment facile 291 00:13:54,600 --> 00:13:57,980 être mauvais et de faire encore programmes courts vulnérables. 292 00:13:57,980 --> 00:14:02,880 >> Mais pour l'instant, au moins, réaliser que la question qui se pose ici 293 00:14:02,880 --> 00:14:04,850 est d'environ Clang dans un compilateur. 294 00:14:04,850 --> 00:14:08,360 Pourquoi avons-nous fait confiance à Clang pour les deux ou trois dernières semaines? 295 00:14:08,360 --> 00:14:12,650 Qui est-à-dire que celui qui a écrit Clang ne pas avoir un "si" condition il 296 00:14:12,650 --> 00:14:17,680 que des zéros essentiellement injecté et ceux dans chaque programme, il compile 297 00:14:17,680 --> 00:14:21,180 cela laissez-lui l'accès votre ordinateur lorsque vous êtes endormi 298 00:14:21,180 --> 00:14:23,580 et le couvercle de votre ordinateur portable est ouvert et votre ordinateur est en marche? 299 00:14:23,580 --> 00:14:24,080 Droite? 300 00:14:24,080 --> 00:14:28,350 Nous avons cette sorte de droit de système d'honneur maintenant où nous espérons que Clang est légitime. 301 00:14:28,350 --> 00:14:30,000 Vous faites confiance que l'appareil est légitime. 302 00:14:30,000 --> 00:14:34,430 Vous faites confiance que littéralement chaque programme sur votre Mac ou PC est digne de confiance. 303 00:14:34,430 --> 00:14:37,510 Et comme cette simple bug suggère, même si ce n'est pas malveillant, 304 00:14:37,510 --> 00:14:40,580 qui n'est absolument pas susceptible d'être le cas. 305 00:14:40,580 --> 00:14:42,350 >> Donc, vous devriez avoir peur comme l'enfer. 306 00:14:42,350 --> 00:14:45,560 Franchement, il n'y a pas de simples solution à cet autre 307 00:14:45,560 --> 00:14:48,185 qu'une sorte de conscience sociale de la complexité croissante 308 00:14:48,185 --> 00:14:50,310 que nous construisons sur le dessus de nos systèmes informatiques, 309 00:14:50,310 --> 00:14:53,740 et comment de plus en plus vulnérables nous pourrions très bien être. 310 00:14:53,740 --> 00:14:55,570 >> Maintenant, avec cela dit, Breakout. 311 00:14:55,570 --> 00:14:59,889 Donc Breakout est le problème réglé trois, et Breakout est un jeu d'antan 312 00:14:59,889 --> 00:15:02,180 que vous vous en souvenez, mais pour nous problème posé trois, 313 00:15:02,180 --> 00:15:04,450 il nous permet de prendre les choses d'un cran 314 00:15:04,450 --> 00:15:08,880 de sorte que lorsque nous écrivons des programmes, même dans une fenêtre de terminal comme cela, 315 00:15:08,880 --> 00:15:14,670 nous pouvons réellement fonctionner, en fin de compte, programmes graphiques non 316 00:15:14,670 --> 00:15:17,800 contrairement à ceux que nous avions l'accès au Scratch. 317 00:15:17,800 --> 00:15:20,910 Donc, c'est le personnel de la mise en œuvre de Breakout, 318 00:15:20,910 --> 00:15:23,930 qui est juste de ce casse-briques jeu, que vous déplacez votre pagaie retour 319 00:15:23,930 --> 00:15:27,590 et-vient, et vous frappez la balle contre ces briques de couleur en haut. 320 00:15:27,590 --> 00:15:30,020 Donc, cela nous apporte sorte de retour à l'endroit où 321 00:15:30,020 --> 00:15:33,180 nous avons pu être très rapidement avec Scratch, et maintenant avec C, 322 00:15:33,180 --> 00:15:35,800 mise en œuvre de notre propre des interfaces utilisateur graphiques. 323 00:15:35,800 --> 00:15:38,960 >> Mais plus que cela, ce ensemble de problème représente la première 324 00:15:38,960 --> 00:15:41,000 dans laquelle nous donnons vous un tas de code. 325 00:15:41,000 --> 00:15:43,940 Et en fait, je vous apporte explicite attention à cela, car en particulier 326 00:15:43,940 --> 00:15:47,090 pour ceux qui sont moins à l'aise, ce problème réglé, au moins à première vue, 327 00:15:47,090 --> 00:15:49,170 va se sentir comme nous avons pris un cran. 328 00:15:49,170 --> 00:15:51,540 Parce que nous vous avons donné, pour une partie de la recherche 329 00:15:51,540 --> 00:15:54,930 et le tri des problèmes dans le jeu de processeurs, un tas de code que nous avons écrit, 330 00:15:54,930 --> 00:15:56,680 et un couple de commentaires que dire «à faire», 331 00:15:56,680 --> 00:15:58,221 où vous devez remplir les blancs. 332 00:15:58,221 --> 00:16:00,020 Donc, pas trop effrayant, mais c'est la première fois 333 00:16:00,020 --> 00:16:03,370 nous vous remettre le code que vous devez d'abord lire, comprendre, et puis ajouter au 334 00:16:03,370 --> 00:16:04,290 et le compléter. 335 00:16:04,290 --> 00:16:05,940 >> Et puis avec Breakout, nous allons faire la même chose, 336 00:16:05,940 --> 00:16:08,740 vous donnant quelques dizaines de plusieurs lignes de code qui, franchement, vous donner 337 00:16:08,740 --> 00:16:11,490 une grande partie du cadre de le jeu, mais s'arrêter 338 00:16:11,490 --> 00:16:14,304 de mise en œuvre des briques et la balle et la raquette, 339 00:16:14,304 --> 00:16:15,970 mais nous faisons la mise en œuvre d'autres fonctionnalités. 340 00:16:15,970 --> 00:16:18,280 Et même que, à première vue, encore une fois, en particulier si elle est inférieure à l'aise, 341 00:16:18,280 --> 00:16:21,480 peut sembler particulièrement difficile et vous pensez qu'il ya tellement de nouvelles fonctions 342 00:16:21,480 --> 00:16:24,070 vous avez besoin d'envelopper votre esprit autour, et c'est vrai. 343 00:16:24,070 --> 00:16:26,281 Mais gardez à l'esprit, il est tout à fait comme Scratch. 344 00:16:26,281 --> 00:16:28,780 Les chances sont que vous n'avez pas utilisé tous les pièces du puzzle à zéro. 345 00:16:28,780 --> 00:16:31,120 Les chances sont que vous n'avez pas soin d'envelopper votre esprit autour de tous les 346 00:16:31,120 --> 00:16:33,617 car il a suffi d'un coup d'oeil rapide à comprendre, oh, 347 00:16:33,617 --> 00:16:35,450 c'est ce que je peux faire avec ce morceau de puzzle. 348 00:16:35,450 --> 00:16:38,260 Et en effet, en problème posé 3 spec, nous vous indiquerons 349 00:16:38,260 --> 00:16:41,370 à la documentation qui sera vous présenter quelques nouvelles fonctions, 350 00:16:41,370 --> 00:16:43,570 et, finalement, la programmation constructions que vous utilisez. 351 00:16:43,570 --> 00:16:47,610 Conditions, boucles, variables et fonctions 352 00:16:47,610 --> 00:16:50,720 sera identique à ce que nous avons vu jusqu'à présent. 353 00:16:50,720 --> 00:16:53,560 >> Donc, en effet, ce que nous allons donner vous est un exemple de code qui 354 00:16:53,560 --> 00:16:56,110 vous permet de créer une fenêtre qui ressemble un peu comme cela, 355 00:16:56,110 --> 00:16:59,540 et, finalement, de le transformer en quelque chose de tout à fait comme ça. 356 00:16:59,540 --> 00:17:02,250 Alors, profitez de CS50, discuter des heures de bureau et plus, 357 00:17:02,250 --> 00:17:05,290 et réconfort dans le fait que la quantité de code que vous devez écrire 358 00:17:05,290 --> 00:17:06,760 est en fait pas tant que ça. 359 00:17:06,760 --> 00:17:10,359 Le premier défi est juste à s'acclimater vous un peu de code que nous avons écrit. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Des questions sur pset3, Shellshock, ou autrement? 362 00:17:15,810 --> 00:17:19,226 >> PUBLIC: Il semblait en passant par des petits groupes 363 00:17:19,226 --> 00:17:22,154 que le code est presque un style orienté objet, 364 00:17:22,154 --> 00:17:24,675 mais je pensais que c'était un C orientée objet programme. 365 00:17:24,675 --> 00:17:26,050 ENCEINTE 1: Une excellente question. 366 00:17:26,050 --> 00:17:28,258 Donc, en regardant à travers la le code de répartition, le code 367 00:17:28,258 --> 00:17:30,180 nous avons écrit pour pset3, pour ceux qui connaissent, il 368 00:17:30,180 --> 00:17:32,230 On dirait que c'est un peu orienté objet. 369 00:17:32,230 --> 00:17:33,800 Réponse courte est, il est. 370 00:17:33,800 --> 00:17:38,130 C'est une approximation de la façon dont vous pourrait faire du code orienté objet à l'aide 371 00:17:38,130 --> 00:17:41,850 un langage comme C, mais il est toujours en fin de compte de la procédure. 372 00:17:41,850 --> 00:17:44,900 Il n'y a pas de méthodes à l'intérieur de les variables, comme vous le verrez. 373 00:17:44,900 --> 00:17:46,180 Mais il rappelle que. 374 00:17:46,180 --> 00:17:48,780 Et nous verrons cette fonction à nouveau quand nous arrivons à PHP et JavaScript 375 00:17:48,780 --> 00:17:49,946 vers la fin du semestre. 376 00:17:49,946 --> 00:17:53,667 Mais pour l'instant, penser que c'est un soupçon de ce qui est à venir. 377 00:17:53,667 --> 00:17:54,250 Bonne question. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 Bien. 380 00:17:56,550 --> 00:17:59,730 Donc, le tri par fusion était de savoir comment nous laissé les choses la dernière fois. 381 00:17:59,730 --> 00:18:03,250 Et le tri par fusion était cool dans le sens où il était beaucoup plus rapide, 382 00:18:03,250 --> 00:18:07,100 au moins sur la base des essais sommaires nous l'avons fait la semaine dernière, que, par exemple, bulle 383 00:18:07,100 --> 00:18:08,710 sorte, la sélection sorte, le tri par insertion. 384 00:18:08,710 --> 00:18:11,780 Et ce qui était soigné est trop juste comment succinctement et propre 385 00:18:11,780 --> 00:18:12,810 vous pouvez exprimer. 386 00:18:12,810 --> 00:18:15,840 Et qu'avons-nous dire que c'était un supérieur lié à la durée de fusion 387 00:18:15,840 --> 00:18:16,340 trier? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Ouais? 390 00:18:18,495 --> 00:18:19,360 >> PUBLIC: n log n? 391 00:18:19,360 --> 00:18:20,819 >> ENCEINTE 1: n log n, à droite. n log n. 392 00:18:20,819 --> 00:18:23,776 Et nous allons revenir à ce que signifie vraiment ou d'où ça vient, 393 00:18:23,776 --> 00:18:25,570 mais c'était mieux que ce temps de marche 394 00:18:25,570 --> 00:18:28,440 que nous avons vu pour la bulle la sélection et le tri par insertion? 395 00:18:28,440 --> 00:18:30,610 Alors n carré. n carré est plus grande que cela, 396 00:18:30,610 --> 00:18:34,650 et même si ce n'est pas tout à fait évident, savoir que log n est plus petit que n, 397 00:18:34,650 --> 00:18:36,910 donc si vous faites n fois quelque chose plus petit que n, 398 00:18:36,910 --> 00:18:38,680 ça va être inférieure à n carré. 399 00:18:38,680 --> 00:18:40,130 C'est un peu de l'intuition il. 400 00:18:40,130 --> 00:18:42,190 Mais nous avons payé un prix pour cela. 401 00:18:42,190 --> 00:18:47,000 Il a été plus rapide, mais un thème qui a commencé de sortir la semaine dernière était ce compromis. 402 00:18:47,000 --> 00:18:49,804 J'ai eu une meilleure performance temps sage, mais ce 403 00:18:49,804 --> 00:18:52,470 ai-je eu à passer de l'autre main, afin de parvenir à cela? 404 00:18:52,470 --> 00:18:53,591 >> PUBLIC: Mémoire. 405 00:18:53,591 --> 00:18:54,465 ENCEINTE 1: Dites à nouveau? 406 00:18:54,465 --> 00:18:55,173 PUBLIC: Mémoire. 407 00:18:55,173 --> 00:18:57,040 ENCEINTE 1: mémoire, ou plus d'espace en général. 408 00:18:57,040 --> 00:18:59,040 Et c'était pas super évident avec les êtres humains, 409 00:18:59,040 --> 00:19:02,240 mais rappeler que nos bénévoles ont été un pas en avant et pas à pas 410 00:19:02,240 --> 00:19:04,780 dos comme s'il y avait un tableau ici, et comme s'il y avait 411 00:19:04,780 --> 00:19:07,130 un second réseau ici que qu'ils pourraient utiliser, parce que nous 412 00:19:07,130 --> 00:19:09,080 quelque part nécessaires pour fusionner ces gens. 413 00:19:09,080 --> 00:19:11,480 Nous ne pouvions pas les échanger en place. 414 00:19:11,480 --> 00:19:13,800 Donc, le tri par fusion levier plus d'espace, ce qui 415 00:19:13,800 --> 00:19:15,620 nous n'avons pas besoin de les autres algorithmes, 416 00:19:15,620 --> 00:19:17,410 mais l'avantage est que c'est beaucoup plus rapide. 417 00:19:17,410 --> 00:19:20,780 Et franchement, dans l'espace du monde réel ces RAM days--, disque dur space-- 418 00:19:20,780 --> 00:19:25,030 est relativement pas cher, et c'est donc pas nécessairement une mauvaise chose. 419 00:19:25,030 --> 00:19:28,320 >> Donc, nous allons jeter un coup d'œil, un peu plus méthodiquement, à ce que nous avons fait 420 00:19:28,320 --> 00:19:30,220 et pourquoi nous l'avons dit, il a été n log n. 421 00:19:30,220 --> 00:19:33,260 Voici donc les huit numéros et le huit bénévoles, nous avons eu la dernière fois. 422 00:19:33,260 --> 00:19:35,718 Et la première chose que Merge Trier nous a dit de faire, c'était quoi? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 PUBLIC: Diviser en deux. 425 00:19:38,010 --> 00:19:38,663 ENCEINTE 1: Dites à nouveau? 426 00:19:38,663 --> 00:19:39,650 PUBLIC: Diviser en deux. 427 00:19:39,650 --> 00:19:40,610 ENCEINTE 1: Diviser en deux, à droite. 428 00:19:40,610 --> 00:19:42,818 Cela rappelle de le livre de téléphone, de fracture 429 00:19:42,818 --> 00:19:44,220 et de conquérir plus généralement. 430 00:19:44,220 --> 00:19:45,640 Nous avons donc examiné la moitié gauche. 431 00:19:45,640 --> 00:19:48,700 Et puis une fois que nous avons dit, en quelque sorte la moitié gauche des éléments, 432 00:19:48,700 --> 00:19:49,690 qu'est-ce que nous disons prochaine? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Trier la moitié gauche de la gauche moitié, ce qui nous a permis d', 435 00:19:54,860 --> 00:19:57,570 après avoir divisé en deux, se concentrer sur quatre et deux. 436 00:19:57,570 --> 00:20:01,280 >> Comment vous triez-vous une liste maintenant, dans jaune, de taille deux, en utilisant le tri par fusion? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Eh bien diviser en deux, et trier la moitié gauche. 439 00:20:04,580 --> 00:20:07,100 Et c'est là que les choses Vous avez un petit brièvement stupide. 440 00:20:07,100 --> 00:20:10,720 Comment vous triez-vous une liste qui est de taille un, comme ce nombre quatre ici? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Il est triée. 443 00:20:13,210 --> 00:20:14,200 Vous avez terminé. 444 00:20:14,200 --> 00:20:17,300 >> Mais alors comment voulez-vous trier une liste de taille un quand il est le numéro deux? 445 00:20:17,300 --> 00:20:21,640 Eh bien, la même chose, mais maintenant ce qui était la troisième et l'étape clé dans la fusion Trier? 446 00:20:21,640 --> 00:20:24,020 Vous avez eu à fusionner la gauche la moitié et la moitié droite. 447 00:20:24,020 --> 00:20:26,580 Et une fois que nous l'avons fait, nous avons examiné à quatre heures, nous avons examiné deux. 448 00:20:26,580 --> 00:20:28,750 Nous avons décidé de tout droit, de toute évidence deux vient en premier, 449 00:20:28,750 --> 00:20:31,840 nous avons donc mis deux dans son place, suivi par quatre. 450 00:20:31,840 --> 00:20:35,010 Et maintenant que vous avez à type de rembobinage, et c'est une sorte de caractéristique 451 00:20:35,010 --> 00:20:37,570 d'un algorithme comme Merge Trier, revenir en arrière dans la mémoire. 452 00:20:37,570 --> 00:20:40,240 Quelle était la ligne suivante de l'histoire? 453 00:20:40,240 --> 00:20:41,780 Que dois-je concentrerai sur la prochaine? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 La moitié droite de la gauche la moitié, qui est six et huit. 456 00:20:47,350 --> 00:20:50,320 >> Permettez-moi donc de suivre cet sans belaboring point trop. 457 00:20:50,320 --> 00:20:53,330 Six et huit ans, puis six est triés, huit sont triés. 458 00:20:53,330 --> 00:20:57,190 Les fusionner comme ça, et maintenant la prochaine grande étape 459 00:20:57,190 --> 00:21:00,990 est, bien sûr, trier la moitié droite de la première étape de cet algorithme. 460 00:21:00,990 --> 00:21:02,870 Donc, nous nous concentrons sur un, trois, sept, cinq. 461 00:21:02,870 --> 00:21:04,540 Nous nous concentrons alors sur la moitié gauche. 462 00:21:04,540 --> 00:21:09,400 La moitié gauche de ce que la moitié droite de que, puis fusionnent en un et trois. 463 00:21:09,400 --> 00:21:13,100 Ensuite, la moitié droite, puis à gauche la moitié de celui-ci, puis la moitié droite de celui-ci. 464 00:21:13,100 --> 00:21:15,985 Fusionner dans, et maintenant ce que l'étape reste? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Fusionner la grande moitié gauche et la grande moitié droite, donc on va là-bas, 467 00:21:22,460 --> 00:21:27,330 puis deux, puis trois, puis quatre, puis cinq, puis six, puis sept, puis huit. 468 00:21:27,330 --> 00:21:31,990 >> Alors maintenant, pourquoi est-ce finalement révélateur, en particulier si n et logarithmes plus 469 00:21:31,990 --> 00:21:35,487 généralement assez vous échapper, au moins dans la mémoire récente? 470 00:21:35,487 --> 00:21:37,070 Eh bien, vous remarquerez la hauteur de cette chose. 471 00:21:37,070 --> 00:21:41,230 Nous avons eu huit éléments, et nous divisé par deux, par deux, par deux. 472 00:21:41,230 --> 00:21:44,590 Alors connectez base deux de huit nous donne trois. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 Et croyez-moi sur que si un peu brumeux sur ce point. 475 00:21:48,540 --> 00:21:54,710 Mais log base deux de huit est trois, de sorte que nous avons fait de trois couches de fusion. 476 00:21:54,710 --> 00:21:57,170 Et quand nous avons fusionné éléments, le nombre des éléments 477 00:21:57,170 --> 00:21:58,950 n'avons nous regardons sur chacune de ces lignes? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Un total de n, non? 480 00:22:01,437 --> 00:22:04,020 Parce que de fusionner la rangée du haut, même si nous l'avons fait au coup par coup, 481 00:22:04,020 --> 00:22:05,990 nous avons finalement abordé chaque numéro une fois. 482 00:22:05,990 --> 00:22:09,054 Et dans la deuxième rangée, à fusionner les listes de taille deux, 483 00:22:09,054 --> 00:22:10,470 nous avons eu à toucher chaque élément une fois. 484 00:22:10,470 --> 00:22:12,690 Et puis ici vraiment clairement dans la dernière rangée, 485 00:22:12,690 --> 00:22:15,430 nous avons eu à toucher chacun de ces éléments une fois, mais une seule fois, 486 00:22:15,430 --> 00:22:18,400 si se trouve ici, alors, notre n log n. 487 00:22:18,400 --> 00:22:21,780 >> Et maintenant, juste pour rendre les choses un peu plus formel pour un instant, si vous 488 00:22:21,780 --> 00:22:24,260 étaient d'analyser maintenant ce à une sorte de niveau supérieur 489 00:22:24,260 --> 00:22:28,340 et essayer de décider, bien comment pourriez-vous aller à exprimer 490 00:22:28,340 --> 00:22:31,780 le temps d'exécution de cet algorithme juste en regardant et ne pas 491 00:22:31,780 --> 00:22:33,590 l'aide d'un exemple artificiel? 492 00:22:33,590 --> 00:22:36,590 Eh bien, combien de temps voulez-vous dire un étape de ce type en jaune faudrait, 493 00:22:36,590 --> 00:22:37,173 si n <2 retour? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 C'est un grand O de quoi? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Donc, je vois un, donc une seule étape, peut-être à deux pas parce que c'est si 498 00:22:44,540 --> 00:22:47,110 puis revenir, mais c'est constante de temps, non? 499 00:22:47,110 --> 00:22:49,960 Alors nous avons dit O (1), et c'est comment je vais exprimer cela. 500 00:22:49,960 --> 00:22:51,480 T, soit juste le temps courir. 501 00:22:51,480 --> 00:22:54,150 n est la taille de l'entrée, si T (n), juste une façon élégante 502 00:22:54,150 --> 00:22:56,330 de dire le fonctionnement temps entrée donnée de taille n 503 00:22:56,330 --> 00:23:00,220 va être de l'ordre de la constante de temps, en O (1). 504 00:23:00,220 --> 00:23:01,970 >> Mais sinon, ce à ce sujet? 505 00:23:01,970 --> 00:23:05,660 Comment voulez-vous exprimer la temps de cette ligne jaune en cours d'exécution? 506 00:23:05,660 --> 00:23:06,250 T de quoi? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Vous pouvez sorte de tricher ici et répondre à ma question de manière cyclique. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Donc, si le temps d'exécution dans général, nous disons juste est T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 Et maintenant, vous êtes sorte de barque ici et dire, eh bien, en quelque sorte la moitié gauche, 513 00:23:22,490 --> 00:23:23,920 puis trier la moitié droite. 514 00:23:23,920 --> 00:23:27,520 Comment pourrions-nous représenter symboliquement le temps d'exécution de cette ligne jaune? 515 00:23:27,520 --> 00:23:28,020 T de quoi? 516 00:23:28,020 --> 00:23:29,360 Quelle est la taille de l'entrée? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n sur deux. 519 00:23:31,057 --> 00:23:32,140 Pourquoi dois-je vous dire que pas? 520 00:23:32,140 --> 00:23:36,449 Et alors c'est un autre T (n / 2), puis encore une fois, si je fusionne deux moitiés triées, 521 00:23:36,449 --> 00:23:38,615 le nombre d'éléments que je vais avoir à toucher au total? 522 00:23:38,615 --> 00:23:39,780 523 00:23:39,780 --> 00:23:40,320 n. 524 00:23:40,320 --> 00:23:42,790 Donc, je peux exprimer ce, juste pour être une sorte de fantaisie, 525 00:23:42,790 --> 00:23:44,430 comme le temps d'exécution en général. 526 00:23:44,430 --> 00:23:51,140 T (n) est juste le temps d'exécution de T (n / 2), ainsi que T (n / 2), moitié gauche et la moitié droite, 527 00:23:51,140 --> 00:23:55,360 en plus O (n), qui est probablement n étapes, mais peut-être, si je suis en utilisant deux doigts, 528 00:23:55,360 --> 00:23:57,960 c'est deux fois plus nombreux étapes, mais il est linéaire. 529 00:23:57,960 --> 00:24:00,440 C'est un certain nombre de mesures c'est un facteur de n, 530 00:24:00,440 --> 00:24:02,270 afin que nous puissions exprimer ce que cela. 531 00:24:02,270 --> 00:24:05,550 Et c'est là que nous allons maintenant botté de dégagement à l' arrière de notre manuel de mathématiques de lycée 532 00:24:05,550 --> 00:24:10,290 nous sommes en fin de compte que la récurrence finit par égaler ce, n log n fois, 533 00:24:10,290 --> 00:24:12,530 si vous faites réellement sur les mathématiques de façon plus formelle. 534 00:24:12,530 --> 00:24:13,950 >> C'est donc seulement deux points de vue. 535 00:24:13,950 --> 00:24:17,500 Une numériquement avec un codé en dur exemple représentatif 536 00:24:17,500 --> 00:24:21,140 l'aide de huit chiffres, et un plus aperçu général de la façon dont nous y sommes arrivés. 537 00:24:21,140 --> 00:24:25,670 Mais ce qui est vraiment intéressant ici est, de nouveau, cette notion de cyclisme. 538 00:24:25,670 --> 00:24:26,900 Je n'utilise pas de boucles. 539 00:24:26,900 --> 00:24:29,860 Je suis une sorte de définition quelque chose en termes de lui-même, 540 00:24:29,860 --> 00:24:31,950 non seulement avec ce fonction mathématique, 541 00:24:31,950 --> 00:24:34,860 mais aussi en termes de ce code pseudo. 542 00:24:34,860 --> 00:24:38,260 Ce pseudo-code est récursive en ce que deux de ses lignes 543 00:24:38,260 --> 00:24:42,310 est essentiellement lui disant d'aller utiliser elle-même pour résoudre un petit 544 00:24:42,310 --> 00:24:45,400 problème de plus petite taille, et puis encore et encore 545 00:24:45,400 --> 00:24:48,820 et encore jusqu'à ce que nous rogner il jusqu'à ce que l'on appelle cas de base. 546 00:24:48,820 --> 00:24:52,810 >> Donc, nous allons effectivement tirer un plus convaincant à emporter de cette manière suivante. 547 00:24:52,810 --> 00:24:58,420 Laissez-moi aller dans gedit et prends un examiner certaines de code source d'aujourd'hui, 548 00:24:58,420 --> 00:24:59,930 en particulier cet exemple ici. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, ce qui ajoute apparemment les numéros un à n. 550 00:25:03,709 --> 00:25:05,750 Voyons donc ce qui est familier et inconnu ici. 551 00:25:05,750 --> 00:25:08,690 D'abord, nous avons un couple de comprend, donc rien de nouveau. 552 00:25:08,690 --> 00:25:09,190 Prototype. 553 00:25:09,190 --> 00:25:11,370 Je suis un peu brumeux sur ce après quelques jours, 554 00:25:11,370 --> 00:25:13,790 mais qu'est-ce que nous disons une prototype d'une fonction est? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 PUBLIC: [inaudible]. 557 00:25:16,015 --> 00:25:16,905 ENCEINTE 1: Qu'est-ce que c'est? 558 00:25:16,905 --> 00:25:17,800 PUBLIC: Nous annonçons. 559 00:25:17,800 --> 00:25:18,883 ENCEINTE 1: Nous annonçons. 560 00:25:18,883 --> 00:25:22,290 Donc, vous enseignez Clang, hé, pas réellement mise en œuvre de cette encore, 561 00:25:22,290 --> 00:25:25,740 mais quelque part dans ce dossier, sans doute, va être une fonction appelée quoi? 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 Et ce n'est que la promesse que ça va ressembler à ceci. 565 00:25:30,540 --> 00:25:33,720 Il va prendre un entier comme input-- et je peux être plus explicite 566 00:25:33,720 --> 00:25:36,570 et dire int n --et c'est va retourner un int, 567 00:25:36,570 --> 00:25:39,900 mais les moyens virgules, mm, je vais contourner à la mise en œuvre un peu plus tard. 568 00:25:39,900 --> 00:25:40,989 Encore une fois, Clang est muet. 569 00:25:40,989 --> 00:25:43,280 Il va seulement de savoir ce que vous lui dites de haut en bas, 570 00:25:43,280 --> 00:25:45,765 Nous devons donc donner au moins un soupçon de ce qui est à venir. 571 00:25:45,765 --> 00:25:47,330 >> Maintenant regardons principal ici. 572 00:25:47,330 --> 00:25:50,040 Disons faites défiler ici et voir ce principal est fait. 573 00:25:50,040 --> 00:25:53,780 C'est pas si longtemps d'une fonction, et en fait, la construction ici est familier. 574 00:25:53,780 --> 00:25:57,590 Je déclare une variable n, puis Je harceler l'utilisateur encore et encore 575 00:25:57,590 --> 00:26:01,880 pour un nombre entier positif en utilisant getInt, et que la sortie de cette boucle 576 00:26:01,880 --> 00:26:03,280 fois que l'utilisateur s'est conformé. 577 00:26:03,280 --> 00:26:05,670 Alors que faire, nous avons utilisé pour harceler l'utilisateur de cette façon. 578 00:26:05,670 --> 00:26:06,670 Maintenant, ce qui est intéressant. 579 00:26:06,670 --> 00:26:08,510 Je déclare un int appelé «réponse». 580 00:26:08,510 --> 00:26:11,420 Je lui attribuer la valeur de retour d'une fonction appelée «sigma». 581 00:26:11,420 --> 00:26:15,200 Je ne sais pas ce que cela fait encore, mais Je me souviens de déclarer il ya un instant. 582 00:26:15,200 --> 00:26:18,310 Et puis je suis de passage dans la valeur que l'utilisateur a tapé dans, n, 583 00:26:18,310 --> 00:26:20,420 puis-je signaler la réponse. 584 00:26:20,420 --> 00:26:22,260 Eh bien nous allons revenir en arrière pour un instant. 585 00:26:22,260 --> 00:26:28,620 Allons de l'avant dans ce répertoire, assurez- sigma 0, et fait exécuter ce programme 586 00:26:28,620 --> 00:26:30,490 et voir ce qui se passe. 587 00:26:30,490 --> 00:26:35,930 Donc, si je vais de l'avant et l'exécution ce programme, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 et je tape dans un esprit positif entier comme deux, Sigma, 589 00:26:40,139 --> 00:26:43,180 comme le symbole grec l'indique, est juste aller à additionner tous les nombres de 590 00:26:43,180 --> 00:26:44,320 zéro à un maximum de deux. 591 00:26:44,320 --> 00:26:46,560 Donc 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 Ce qui devrait, espérons-donnez-moi 3. 593 00:26:48,830 --> 00:26:49,750 C'est tout ce qu'il fait. 594 00:26:49,750 --> 00:26:52,690 Et de même, si je lance ce message et je lui donne le numéro trois, 595 00:26:52,690 --> 00:26:56,721 c'est 3 plus 2, de sorte que c'est 5, plus 1 devrait me donner 6. 596 00:26:56,721 --> 00:26:59,470 Et puis si je suis vraiment fou et commencez à taper en plus grand nombre, 597 00:26:59,470 --> 00:27:01,290 il devrait me donner sommes de plus en plus grandes. 598 00:27:01,290 --> 00:27:02,250 Donc, c'est tout. 599 00:27:02,250 --> 00:27:04,010 >> Alors qu'est-ce sigma ressemble? 600 00:27:04,010 --> 00:27:05,430 Eh bien, c'est assez simple. 601 00:27:05,430 --> 00:27:08,940 C'est la façon dont nous pourrions avons mis en place ce pour les deux dernières semaines. 602 00:27:08,940 --> 00:27:11,120 "Int" va être le type de retour. 603 00:27:11,120 --> 00:27:14,330 Sigma est le nom, et il faut une variable m au lieu de n. 604 00:27:14,330 --> 00:27:15,940 Je vais changer que là-haut. 605 00:27:15,940 --> 00:27:17,340 Ensuite, c'est juste un test de cohérence. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Nous verrons pourquoi dans un instant. 608 00:27:19,950 --> 00:27:24,220 Maintenant, je déclare une autre variable, somme, l'initialiser à zéro. 609 00:27:24,220 --> 00:27:28,140 Puis j'ai cette boucle For itération, apparemment pour plus de clarté, 610 00:27:28,140 --> 00:27:33,810 de i = 1 sur un maximum de un = m, ce qui est quel que soit l'utilisateur a tapé dans, et puis je 611 00:27:33,810 --> 00:27:35,690 incrémenter la somme comme ça. 612 00:27:35,690 --> 00:27:37,360 Et puis retourner la somme. 613 00:27:37,360 --> 00:27:38,440 >> Alors quelques questions. 614 00:27:38,440 --> 00:27:42,370 Un, je demander à mon commentaire que ce évite le risque d'une boucle infinie. 615 00:27:42,370 --> 00:27:45,620 Pourquoi les passant dans un nombre négatif induire, potentiellement, une boucle infinie? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> PUBLIC: Vous ne serez jamais atteindre m. 618 00:27:51,290 --> 00:27:52,880 >> ENCEINTE 1: Ne jamais atteindre m. 619 00:27:52,880 --> 00:27:55,880 Mais m est passé, donc nous allons Prenons un exemple simple. 620 00:27:55,880 --> 00:27:58,510 Si m est transmise par la utilisateur comme un négatif. 621 00:27:58,510 --> 00:28:00,059 Indépendamment du principal. 622 00:28:00,059 --> 00:28:01,850 Principal nous protège des ce trop, donc je suis juste 623 00:28:01,850 --> 00:28:04,680 être vraiment anal avec sigma aussi s'assurer 624 00:28:04,680 --> 00:28:06,540 que l'entrée ne peut pas être négatif. 625 00:28:06,540 --> 00:28:10,130 Donc, si m est négatif, quelque chose comme un négatif. 626 00:28:10,130 --> 00:28:11,930 Qu'est-ce qui va se passer? 627 00:28:11,930 --> 00:28:14,390 Eh bien, je va s'initialiser à un, 628 00:28:14,390 --> 00:28:19,060 et puis je va être inférieur ou égal à m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Etre prêt. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 C'est était-- de laissez pas, nous allons Nix cette histoire. 633 00:28:29,370 --> 00:28:32,780 Je n'ai pas posé cette question, parce que le risque que je fais allusion à 634 00:28:32,780 --> 00:28:38,360 ne va pas se produire parce que i est va toujours être plus grande OK than--, 635 00:28:38,360 --> 00:28:39,871 Je retire cette question. 636 00:28:39,871 --> 00:28:40,370 Dáccord. 637 00:28:40,370 --> 00:28:42,030 Concentrons-nous uniquement sur cette partie ici. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Pourquoi ai-je déclare une certaine à l'extérieur de la boucle? 640 00:28:48,830 --> 00:28:52,010 Avis sur la ligne 49, je n'ai i déclaré à l'intérieur de la boucle, 641 00:28:52,010 --> 00:28:54,950 mais en ligne 48 j'ai déclaré un peu en dehors. 642 00:28:54,950 --> 00:28:55,695 Ouais. 643 00:28:55,695 --> 00:28:56,611 PUBLIC: [inaudible]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 ENCEINTE 1: Bien sûr. 646 00:28:59,400 --> 00:29:03,360 Alors d'abord et avant tout, je n'ai certainement pas vouloir déclarer et initialiser somme 647 00:29:03,360 --> 00:29:06,130 de zéro à l'intérieur de la à chaque itération de boucle, 648 00:29:06,130 --> 00:29:09,370 parce que ce serait contraire clairement la but de résumer les chiffres. 649 00:29:09,370 --> 00:29:11,770 Je voudrais continuer à changer la valeur à zéro. 650 00:29:11,770 --> 00:29:17,992 Et aussi, ce qui est une autre plus mystérieux raison de cette même décision de conception? 651 00:29:17,992 --> 00:29:18,954 Ouais. 652 00:29:18,954 --> 00:29:20,279 >> PUBLIC: [inaudible]. 653 00:29:20,279 --> 00:29:21,070 ENCEINTE 1: Exactement. 654 00:29:21,070 --> 00:29:24,060 Je veux accéder à l'extérieur de la boucle trop sur quelle ligne? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Sur 53. 657 00:29:26,400 --> 00:29:29,910 Et sur la base de notre règle d'or il ya un couple de conférences, 658 00:29:29,910 --> 00:29:33,680 les variables ont une portée limitée, vraiment, à la accolades qui les englobent. 659 00:29:33,680 --> 00:29:38,190 Donc, si je ne déclare pas la somme à l'intérieur de ces accolades extérieures, 660 00:29:38,190 --> 00:29:40,250 Je ne peux pas l'utiliser dans la ligne 53. 661 00:29:40,250 --> 00:29:43,160 En d'autres termes, si je déclarais somme ici, ou même au sein de la 662 00:29:43,160 --> 00:29:45,410 Pour la boucle, je ne pouvais pas accéder à 53. 663 00:29:45,410 --> 00:29:47,150 La variable serait effectivement disparu. 664 00:29:47,150 --> 00:29:48,579 Ainsi, un certain nombre de raisons là. 665 00:29:48,579 --> 00:29:50,370 Mais maintenant revenons et voir ce qui se passe. 666 00:29:50,370 --> 00:29:51,730 Donc sigma est appelé. 667 00:29:51,730 --> 00:29:55,640 Il ajoute une plus 2 ou 1 + 2 plus 3, puis renvoie la valeur, 668 00:29:55,640 --> 00:29:59,660 stocke dans la réponse, et printf ici C'est pourquoi je vois sur l'écran. 669 00:29:59,660 --> 00:30:03,079 Donc, c'est ce que nous appellerons un processus itératif approche, où itération juste 670 00:30:03,079 --> 00:30:03,870 des moyens à l'aide d'une boucle. 671 00:30:03,870 --> 00:30:06,900 Une boucle For, une boucle While, un Do While boucle, juste faire quelque chose de nouveau 672 00:30:06,900 --> 00:30:08,380 et encore et encore. 673 00:30:08,380 --> 00:30:13,505 >> Mais sigma est une sorte de fonction propre dans que je pouvais mettre en œuvre différemment. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Que dire de ce qui juste pour être plutôt cool, 676 00:30:19,120 --> 00:30:21,880 permettez-moi de me débarrasser vraiment de beaucoup de distraction 677 00:30:21,880 --> 00:30:24,380 parce que cette fonction est vraiment très simple. 678 00:30:24,380 --> 00:30:27,780 Passons en rogner le bas juste à ses quatre principaux 679 00:30:27,780 --> 00:30:30,410 et se débarrasser de tous les commentaires et accolades. 680 00:30:30,410 --> 00:30:34,334 C'est en quelque sorte d'un époustouflant mise en œuvre alternative. 681 00:30:34,334 --> 00:30:37,250 D'accord, peut-être pas vous tourner la tête, mais c'est le genre de sexy, tout droit, 682 00:30:37,250 --> 00:30:39,920 regarder cette tellement plus succinctement. 683 00:30:39,920 --> 00:30:43,120 Avec seulement quatre lignes de code, Je dois d'abord ce test de cohérence. 684 00:30:43,120 --> 00:30:45,732 Si m est inférieur ou égal à zéro, sigma n'a pas de sens. 685 00:30:45,732 --> 00:30:48,190 C'est seulement censé être en ce cas pour les nombres positifs, 686 00:30:48,190 --> 00:30:50,340 donc je vais juste retourner zéro arbitraire 687 00:30:50,340 --> 00:30:53,210 de sorte que nous avons au moins certains soi-disant cas de base. 688 00:30:53,210 --> 00:30:54,430 >> Mais voici la beauté. 689 00:30:54,430 --> 00:30:59,930 L'intégralité de cette idée, en ajoutant le nombres de 1 à n, m ou, dans ce cas, 690 00:30:59,930 --> 00:31:02,630 peut être fait par type de renvoyer la balle. 691 00:31:02,630 --> 00:31:04,947 Eh bien, ce qui est la somme de 1 à m? 692 00:31:04,947 --> 00:31:05,780 Eh bien, vous savez quoi? 693 00:31:05,780 --> 00:31:11,949 C'est la même que la somme de m plus la somme de 1 et m ± 1. 694 00:31:11,949 --> 00:31:12,740 Eh bien, vous savez quoi? 695 00:31:12,740 --> 00:31:13,940 Quel est le sigma m moins 1? 696 00:31:13,940 --> 00:31:17,860 Eh bien, si vous suivez ce genre de logiquement, c'est le même que m moins 1 697 00:31:17,860 --> 00:31:21,415 ainsi sigma m moins 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Ainsi, vous pouvez sorte de just-- c'est comme, si vous êtes juste 700 00:31:26,012 --> 00:31:28,220 essayer de déranger un ami et ils vous posent une question, 701 00:31:28,220 --> 00:31:31,344 vous sorte de répondre à une question, vous pouvez sorte de garder renvoyer la balle. 702 00:31:31,344 --> 00:31:34,560 Mais ce qui est essentiel, c'est que si vous continuez à faire la question plus en plus petits 703 00:31:34,560 --> 00:31:36,910 et plus petit, vous êtes ne demande pas ce qui est sigma 704 00:31:36,910 --> 00:31:39,116 de n, ce qui est le sigma n, ce qui est de sigma n? 705 00:31:39,116 --> 00:31:40,990 Vous vous demandez ce qui est sigma de n, ce qui est sigma 706 00:31:40,990 --> 00:31:42,839 de n moins 1, ce qui est le sigma n moins 2? 707 00:31:42,839 --> 00:31:44,880 Finalement, votre question va devenir quoi? 708 00:31:44,880 --> 00:31:50,250 Qu'est-ce que sigma d'un ou zéro, de très faible valeur, 709 00:31:50,250 --> 00:31:52,220 et dès que vous obtenir, votre ami, 710 00:31:52,220 --> 00:31:54,350 vous n'allez pas demander la même question, 711 00:31:54,350 --> 00:31:55,975 vous allez juste de dire, oh c'est zéro. 712 00:31:55,975 --> 00:31:58,490 Nous avons terminé la lecture de ce type de jeu cyclique stupide. 713 00:31:58,490 --> 00:32:02,950 >> Donc, la récursivité est l'acte dans la programmation d'une fonction qui se fait appeler. 714 00:32:02,950 --> 00:32:06,630 Ce programme, lorsqu'il est compilé et exécuté, est va se comporter exactement de la même manière, 715 00:32:06,630 --> 00:32:09,620 mais ce qui est important est que l'intérieur d'une fonction appelée sigma, 716 00:32:09,620 --> 00:32:13,150 il ya une ligne de code dans laquelle nous nous appeler, 717 00:32:13,150 --> 00:32:14,980 qui devrait normalement être mauvais. 718 00:32:14,980 --> 00:32:21,160 Par exemple, si j'ai compilé ce, alors assurez-sigma-- 719 00:32:21,160 --> 00:32:22,710 faire sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Entier positif, s'il vous plaît, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Alors quelle est la fonction semble être, basée sur un test, correct. 723 00:32:30,810 --> 00:32:34,917 Mais que faire si je suis un peu dangereux et supprimer l'affaire dite de base, 724 00:32:34,917 --> 00:32:37,750 et je dis juste, eh bien je fais juste ce plus compliqué que ça. 725 00:32:37,750 --> 00:32:42,450 Disons simplement calculer la sigma m et en prenant ensuite l'ajout d' 726 00:32:42,450 --> 00:32:44,564 dans sigma m moins un? 727 00:32:44,564 --> 00:32:45,980 Eh bien, qu'est-ce qui va se passer ici? 728 00:32:45,980 --> 00:32:47,140 Voyons un zoom arrière. 729 00:32:47,140 --> 00:32:52,920 Disons recompiler le programme, enregistrer, recompiler le programme, 730 00:32:52,920 --> 00:33:00,450 et alors prêt ./sigma-1 zoom avant, entrer entier positif s'il vous plaît, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Combien d'entre vous sont prêts à coupé sur place de voir ça? 733 00:33:04,430 --> 00:33:04,950 >> Dáccord. 734 00:33:04,950 --> 00:33:06,690 Donc cela peut se produire pour un certain nombre de raisons, 735 00:33:06,690 --> 00:33:09,148 et franchement cette semaine, nous sommes sur le point de vous donner plus d'eux. 736 00:33:09,148 --> 00:33:11,780 Mais dans ce cas, essayez de raisonner à l'envers 737 00:33:11,780 --> 00:33:14,430 ce qui serait arrivé ici? 738 00:33:14,430 --> 00:33:17,400 Segmentation fault, nous dit la dernière temps, se réfère à un segment de mémoire. 739 00:33:17,400 --> 00:33:18,690 Quelque chose de mauvais s'est passé. 740 00:33:18,690 --> 00:33:21,550 Mais ce qui était il mécanique qui a mal tourné 741 00:33:21,550 --> 00:33:25,000 ici en raison de mon déménagement de cette affaire dite de base, 742 00:33:25,000 --> 00:33:26,870 où je suis retourné une valeur codée en dur? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Que pensez-vous allé mal? 745 00:33:30,460 --> 00:33:31,219 Ouais. 746 00:33:31,219 --> 00:33:32,135 >> PUBLIC: [inaudible]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 ENCEINTE 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Bonne question. 750 00:33:37,550 --> 00:33:39,508 Ainsi, la taille du nombre que je résumant 751 00:33:39,508 --> 00:33:41,920 devenu si grand qu'il dépasse la taille de l'espace de mémoire. 752 00:33:41,920 --> 00:33:44,640 Bonne idée, mais pas fondamentalement va causer un accident. 753 00:33:44,640 --> 00:33:48,230 Cela pourrait provoquer un débordement entier, où les bits seulement se renversent 754 00:33:48,230 --> 00:33:51,760 puis nous prenons un très gros nombre de comme un nombre négatif, 755 00:33:51,760 --> 00:33:53,260 mais que lui-même ne sera pas causer un accident. 756 00:33:53,260 --> 00:33:55,509 Parce que, à la fin de l' jour un int est toujours de 32 bits. 757 00:33:55,509 --> 00:33:57,640 Vous n'allez pas accidentellement voler un peu 33e. 758 00:33:57,640 --> 00:33:58,431 Mais une bonne pensée. 759 00:33:58,431 --> 00:33:58,984 Ouais. 760 00:33:58,984 --> 00:33:59,900 >> PUBLIC: [inaudible]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 ENCEINTE 1: La méthode ne cesse de courir, 763 00:34:02,300 --> 00:34:06,658 et en effet il se dit à nouveau et encore et encore et encore 764 00:34:06,658 --> 00:34:08,449 et encore une fois, et aucun des ces fonctions jamais 765 00:34:08,449 --> 00:34:13,310 terminer parce que leur seule ligne de code appelle encore et encore themself 766 00:34:13,310 --> 00:34:14,219 et de nouveau. 767 00:34:14,219 --> 00:34:16,080 Et ce qui est vraiment se passe ici, et maintenant nous 768 00:34:16,080 --> 00:34:18,100 peut sorte de tirer cette imagée. 769 00:34:18,100 --> 00:34:20,899 Permettez-moi de passer à un image pour un instant. 770 00:34:20,899 --> 00:34:22,940 Il s'agit d'une image, que finira étoffer 771 00:34:22,940 --> 00:34:26,336 plus en détail, de ce qui se passe l'intérieur de la mémoire de votre ordinateur. 772 00:34:26,336 --> 00:34:28,460 Et il se trouve que sur le fond de cette image 773 00:34:28,460 --> 00:34:29,709 est quelque chose qui s'appelle la pile. 774 00:34:29,709 --> 00:34:31,920 Il s'agit d'un morceau de mémoire, un morceau de RAM, 775 00:34:31,920 --> 00:34:33,920 c'est juste utilisé tout moment une fonction est appelée. 776 00:34:33,920 --> 00:34:36,239 Chaque fois que vous, un programmeur, appeler une fonction, 777 00:34:36,239 --> 00:34:38,860 le système d'exploitation, comme Mac OS, Windows ou Linux, 778 00:34:38,860 --> 00:34:41,920 attrape un tas d'octets, peut-être un quelques kilo-octets, peut-être quelques mégaoctets 779 00:34:41,920 --> 00:34:44,590 de la mémoire, les remet à vous, et vous permet alors 780 00:34:44,590 --> 00:34:47,650 vous exécutez votre fonction à l'aide que les variables qui vous avez besoin. 781 00:34:47,650 --> 00:34:50,699 Et si vous établissez une autre fonction et une autre fonction, 782 00:34:50,699 --> 00:34:53,590 vous obtenez une autre tranche de mémoire et une autre tranche de mémoire. 783 00:34:53,590 --> 00:34:57,090 >> Et en effet, si ces plateaux verts de Annenberg représenter que la mémoire, 784 00:34:57,090 --> 00:34:59,870 voici ce qui arrive le premier fois que vous appelez la fonction sigma. 785 00:34:59,870 --> 00:35:04,510 C'est comme mettre un plateau comme celui-ci sur ce qui est d'abord une pile vide. 786 00:35:04,510 --> 00:35:07,142 Mais alors, si ce bac appelle lui-même, pour ainsi dire, 787 00:35:07,142 --> 00:35:08,850 appeler un autre exemple de sigma, c'est 788 00:35:08,850 --> 00:35:11,640 comme demander au système d'exploitation, ooh, besoin d'un peu plus de mémoire, 789 00:35:11,640 --> 00:35:12,520 donnez-moi cela. 790 00:35:12,520 --> 00:35:14,840 Et puis il se empilés sur le dessus. 791 00:35:14,840 --> 00:35:18,030 Mais ce qui est important ici est que le premier plateau est toujours là, 792 00:35:18,030 --> 00:35:20,620 car il a invoqué ce deuxième plateau. 793 00:35:20,620 --> 00:35:23,500 Maintenant, quant à lui, appellent sigma sigma, c'est comme demander plus de mémoire. 794 00:35:23,500 --> 00:35:25,830 Obtient empilés sur ici. 795 00:35:25,830 --> 00:35:29,350 sigma appeler sigma, c'est une autre plateau qui obtient empilés sur ici. 796 00:35:29,350 --> 00:35:32,942 Et si vous continuez à faire cela, éventuellement, type de carte ce visuel 797 00:35:32,942 --> 00:35:35,525 à ce tableau, ce qui se passe à produire avec la pile de plateaux? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Il va dépasser le montant de la mémoire de votre ordinateur a. 800 00:35:41,160 --> 00:35:45,790 Et dès que ce bac vert dépasse la ligne horizontale 801 00:35:45,790 --> 00:35:49,410 ci-dessus et ci-dessus pile ce mot tas, qui nous y reviendrons à l'avenir, 802 00:35:49,410 --> 00:35:50,410 c'est une mauvaise chose. 803 00:35:50,410 --> 00:35:52,810 Le tas est un autre le segment de mémoire, 804 00:35:52,810 --> 00:35:55,190 et si vous laissez ce plateaux pile et pile sur, 805 00:35:55,190 --> 00:35:57,800 vous allez dépasser votre propre segment de mémoire, 806 00:35:57,800 --> 00:36:00,420 et un programme est en effet va s'écraser. 807 00:36:00,420 --> 00:36:02,930 >> Maintenant, en passant, cette idée de récurrence, par conséquent, 808 00:36:02,930 --> 00:36:06,500 peut clairement entraîner des problèmes, mais ce n'est pas nécessairement une mauvaise chose. 809 00:36:06,500 --> 00:36:08,840 Parce envisager, après tout, et peut-être how-- 810 00:36:08,840 --> 00:36:11,700 cela prend un certain temps pour s'y habituer à --Comment élégante ou la simplicité 811 00:36:11,700 --> 00:36:14,890 que la mise en œuvre de sigma était. 812 00:36:14,890 --> 00:36:17,440 Et nous n'allons pas utiliser récursion tant que ça en CS50, 813 00:36:17,440 --> 00:36:20,780 mais dans CS51, et vraiment toute catégorie où vous manipuler des structures de données 814 00:36:20,780 --> 00:36:23,640 comme des arbres ou des arbres de la famille, qui ont une certaine hiérarchie, 815 00:36:23,640 --> 00:36:26,000 c'est super, super utile. 816 00:36:26,000 --> 00:36:29,750 Maintenant, en passant, de sorte que vous comme aspirant des informaticiens 817 00:36:29,750 --> 00:36:33,180 sont familiers avec certains de Google l'intérieur des blagues, si vous allez sur Google 818 00:36:33,180 --> 00:36:36,345 et vous regardez ce qui est le définition de, disons, la récursivité, entrez. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Uh-huh. 821 00:36:41,110 --> 00:36:42,670 En passant, je me suis arrêtée un peu. 822 00:36:42,670 --> 00:36:45,470 Ce fut comme 10 minutes de procrastination ce matin. 823 00:36:45,470 --> 00:36:52,890 Si vous aussi vous Google "de travers" avis en inclinant votre tête slightly-- 824 00:36:52,890 --> 00:36:55,120 puis celui-ci est peut-être plus atroce de tous 825 00:36:55,120 --> 00:36:57,286 puisque quelqu'un a passé comme leur journée la mise en œuvre de cette 826 00:36:57,286 --> 00:36:59,880 ago-- quelques années à venir. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, wait-- c'est un bug. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Ainsi, en cours d'exécution sur l'un des plus grands sites mondiaux 831 00:37:11,410 --> 00:37:13,510 sont ces stupides petits œufs de Pâques. 832 00:37:13,510 --> 00:37:16,690 Ils consomment probablement une nombre non négligeable de lignes de code 833 00:37:16,690 --> 00:37:19,280 juste pour que nous puissions avoir petites choses amusantes comme ça. 834 00:37:19,280 --> 00:37:22,140 Mais au moins maintenant vous avez certaines de ces blagues. 835 00:37:22,140 --> 00:37:28,330 >> Maintenant, nous allons jeter un oeil à quelques-uns des White Lies nous avons dit à la fin, 836 00:37:28,330 --> 00:37:30,707 et commencer à décoller certaines couches techniquement 837 00:37:30,707 --> 00:37:32,790 afin que vous compreniez vraiment ce qui se passe 838 00:37:32,790 --> 00:37:34,860 et vous pouvez comprendre certaines des menaces, 839 00:37:34,860 --> 00:37:38,060 comme Shellshock, que ont maintenant commencé à devenir 840 00:37:38,060 --> 00:37:41,110 à la pointe de tout le monde est attention, au moins dans les médias. 841 00:37:41,110 --> 00:37:45,810 Voici donc une fonction très simple qui renvoie rien, vide. 842 00:37:45,810 --> 00:37:46,790 Son nom est swap. 843 00:37:46,790 --> 00:37:50,880 Il faut à deux variables et il ne renvoie rien. 844 00:37:50,880 --> 00:37:52,260 Prend en a et b. 845 00:37:52,260 --> 00:37:53,337 Donc, une démonstration rapide. 846 00:37:53,337 --> 00:37:54,170 Nous avons fait cela en compte. 847 00:37:54,170 --> 00:37:56,100 Nous pourrions aussi bien prendre un peu de briser ici pendant un moment 848 00:37:56,100 --> 00:37:57,250 et avoir un petit quelque chose à boire. 849 00:37:57,250 --> 00:38:00,120 Si quelqu'un ne me dérangerait pas de rejoindre moi ici pendant un moment. 850 00:38:00,120 --> 00:38:01,830 Que diriez-vous de la chemise marron? 851 00:38:01,830 --> 00:38:02,335 Venez sur place. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Juste celle d'aujourd'hui. 854 00:38:05,260 --> 00:38:06,251 Merci, cependant. 855 00:38:06,251 --> 00:38:08,000 Très bien, et nous avons venir qui ici? 856 00:38:08,000 --> 00:38:08,660 Quel est votre nom? 857 00:38:08,660 --> 00:38:09,360 >> ENCEINTE 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> ENCEINTE 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Venez sur place. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Donc, Laura, très simple défi aujourd'hui. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Nice yo répondre. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 Bien. 866 00:38:16,910 --> 00:38:21,179 Donc, nous avons un peu de lait ici et nous avons un peu de jus d'orange ici 867 00:38:21,179 --> 00:38:23,345 et des tasses qu'on emprunté à Annenberg aujourd'hui. 868 00:38:23,345 --> 00:38:24,178 >> ENCEINTE 4: Borrowed. 869 00:38:24,178 --> 00:38:27,240 ENCEINTE 1: Et aller de l'avant et vous donner un demi-verre de ce. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 Bien. 872 00:38:28,800 --> 00:38:30,750 Et nous allons vous donner la moitié un verre de lait. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Oh, et juste afin que vous puissiez rappelez-vous ce que c'était, 875 00:38:35,890 --> 00:38:38,860 Je me suis souvenu d'apporter cette place et aujourd'hui. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Bien. 878 00:38:42,530 --> 00:38:45,470 Si vous le voulez bien, nous allons voir, nous peut les mettre sur vos propres lunettes 879 00:38:45,470 --> 00:38:46,560 si vous voulez. 880 00:38:46,560 --> 00:38:48,710 Ce sera le monde dans les yeux de Laura. 881 00:38:48,710 --> 00:38:49,210 Bien. 882 00:38:49,210 --> 00:38:53,820 Donc, votre objectif, étant donné deux tasses de liquide ici, le lait et le jus d'orange, 883 00:38:53,820 --> 00:38:58,370 est permuter les deux contenus de sorte que la jus d'orange va dans la tasse de lait 884 00:38:58,370 --> 00:39:00,710 et le lait va dans la coupe du jus d'orange. 885 00:39:00,710 --> 00:39:02,359 >> ENCEINTE 4: Est-ce que je reçois une autre tasse? 886 00:39:02,359 --> 00:39:05,650 ENCEINTE 1: Je suis tellement content que vous posiez, si il aurait été beaucoup mieux de vidéos 887 00:39:05,650 --> 00:39:06,710 si vous n'aviez pas demandé. 888 00:39:06,710 --> 00:39:10,620 Mais oui, nous pouvons vous offrir un troisième tasse qui est vide, bien sûr. 889 00:39:10,620 --> 00:39:11,120 Bien. 890 00:39:11,120 --> 00:39:12,300 Donc échange de contenu là-bas. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Très agréable. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Très bon. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Vous faites cela remarquablement bien. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 Et la troisième étape. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 Bien. 901 00:39:31,350 --> 00:39:31,930 Excellente. 902 00:39:31,930 --> 00:39:33,930 Une salve d'applaudissements serait bon pour Laura. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 Bien. 905 00:39:37,000 --> 00:39:40,790 Nous avons un petit cadeau d'adieu pour vous, mais permettez-moi de prendre ces. 906 00:39:40,790 --> 00:39:42,620 Merci beaucoup. 907 00:39:42,620 --> 00:39:46,170 Ainsi, un exemple simple, si, de démontrer que si vous faites 908 00:39:46,170 --> 00:39:48,300 vouloir échanger le contenu de deux récipients, 909 00:39:48,300 --> 00:39:52,360 ou appelons-les les variables, vous avez besoin de stockage temporaire 910 00:39:52,360 --> 00:39:56,710 de mettre en scène l'un des contenus dans la que vous pouvez réellement faire l'échange. 911 00:39:56,710 --> 00:40:01,790 Donc, en effet, le code source de ici en C est représentatif de exactement cela. 912 00:40:01,790 --> 00:40:06,340 Si le jus d'orange a une et le lait était b, et nous voulions échanger les deux, 913 00:40:06,340 --> 00:40:08,990 vous pouvez essayer quelque chose de créatif en versant une dans l'autre, 914 00:40:08,990 --> 00:40:11,031 mais qui ne serait pas probablement fin particulièrement bien. 915 00:40:11,031 --> 00:40:15,260 Et si nous utilisons une tasse troisième appel il tmp, T-M-P, par convention, 916 00:40:15,260 --> 00:40:19,370 et mettre le contenu de la JO de cela, alors échanger une tasse, 917 00:40:19,370 --> 00:40:22,610 puis mettez le dans le JO tasse d'origine, ainsi 918 00:40:22,610 --> 00:40:25,320 la réalisation, exactement comme Laura fait, le swap. 919 00:40:25,320 --> 00:40:26,850 >> Donc, nous allons faire exactement cela. 920 00:40:26,850 --> 00:40:30,110 Permettez-moi d'aller de l'avant et ouvrir jusqu'à un exemple qui est 921 00:40:30,110 --> 00:40:32,720 réellement appelé «non échanger, "parce que ce n'est pas 922 00:40:32,720 --> 00:40:36,180 comme un simple fait que vous pourriez penser. 923 00:40:36,180 --> 00:40:41,190 Donc, dans ce programme, vous remarquerez que J'utilise stdio.h, notre vieil ami. 924 00:40:41,190 --> 00:40:43,130 J'ai le prototype pour le swap là-haut, qui 925 00:40:43,130 --> 00:40:45,450 des moyens de sa mise en œuvre probablement vers le bas ci-dessous, 926 00:40:45,450 --> 00:40:48,050 et voyons ce que ce principal programme va faire pour moi. 927 00:40:48,050 --> 00:40:52,020 J'ai d'abord déclare int x obtient un, et int y obtient deux. 928 00:40:52,020 --> 00:40:54,930 Alors, pensez à ceux que JO et du lait, respectivement. 929 00:40:54,930 --> 00:40:57,100 Et puis j'ai juste un printf dire x est ce 930 00:40:57,100 --> 00:41:00,120 et y est présent, juste pour que je puisse voir visuellement ce qui se passe. 931 00:41:00,120 --> 00:41:03,810 Puis j'ai printf prétendant que je échangeant les deux, 932 00:41:03,810 --> 00:41:07,100 puis-je imprimer une affirment qu'ils sont échangés, 933 00:41:07,100 --> 00:41:09,300 et j'imprime x et y de nouveau. 934 00:41:09,300 --> 00:41:13,010 Donc, ici, dans swap est exactement ce que Laura a fait, 935 00:41:13,010 --> 00:41:16,240 et exactement ce que nous avons vu sur l'écran il ya un instant. 936 00:41:16,240 --> 00:41:19,380 >> Donc, nous allons aller de l'avant et être cruellement déçus. 937 00:41:19,380 --> 00:41:24,690 Ne faites pas d'échange, et de fonctionner sans swap, zoom sur la sortie ici. 938 00:41:24,690 --> 00:41:28,320 Entrez x est 1, y est 2, l'échange échangé. 939 00:41:28,320 --> 00:41:32,700 x est toujours 1, et y est toujours 2. 940 00:41:32,700 --> 00:41:37,630 Ainsi, même si, franchement, cela ressemble voulez exactement, mais techniquement plus, 941 00:41:37,630 --> 00:41:40,730 ce Laura fait, ne semble pas fonctionner. 942 00:41:40,730 --> 00:41:42,130 Alors, pourquoi est-ce? 943 00:41:42,130 --> 00:41:46,630 Eh bien, il s'avère que lorsque nous écrivons un programme comme celui-ci 944 00:41:46,630 --> 00:41:51,590 qui a à la fois principal, mis en évidence ici, puis une autre fonction, comme swap, 945 00:41:51,590 --> 00:41:54,230 mis en évidence ici, qui il appelle, le monde 946 00:41:54,230 --> 00:41:57,030 regarde un petit quelque chose comme ces plateaux il ya un moment. 947 00:41:57,030 --> 00:42:00,440 Lorsque principale première est appelée, c'est comme si on demandait système d'exploitation 948 00:42:00,440 --> 00:42:04,030 pour un peu de mémoire pour toute locale variables telles que x et y qui a principale, 949 00:42:04,030 --> 00:42:05,660 et ils finissent là. 950 00:42:05,660 --> 00:42:10,920 Mais si les appels principaux échanger, et principal passe à échanger deux arguments, a et b, 951 00:42:10,920 --> 00:42:16,410 jus d'orange et le lait, ce n'est pas comme remettre le jus d'orange et le lait 952 00:42:16,410 --> 00:42:17,500 à Laura. 953 00:42:17,500 --> 00:42:21,300 Quel ordinateur fait, est-il transmet des copies du jus d'orange 954 00:42:21,300 --> 00:42:27,110 et des copies de lait de Laura, de sorte que ce qui est en fin de compte à l'intérieur de ce bac 955 00:42:27,110 --> 00:42:32,510 est celui de la valeur et de deux, ou JO et le lait, mais des copies de celui-ci, 956 00:42:32,510 --> 00:42:34,790 de sorte que, à ce stade dans l'histoire, il 957 00:42:34,790 --> 00:42:36,930 est JO et le lait dans chacun de ces plateaux. 958 00:42:36,930 --> 00:42:39,260 Il ya un et un deux dans chacun de ces bacs, 959 00:42:39,260 --> 00:42:41,720 et la fonction de permutation travaille en effet. 960 00:42:41,720 --> 00:42:46,090 C'est les échanger à l'intérieur du second plateau le plus élevé, 961 00:42:46,090 --> 00:42:48,147 mais que la permutation n'a pas d'impact. 962 00:42:48,147 --> 00:42:49,980 Et sur la base de quelques-uns principe de base que nous avons 963 00:42:49,980 --> 00:42:52,970 parlé avant, et même il ya quelques minutes, ce qui 964 00:42:52,970 --> 00:42:58,770 pourrait expliquer pourquoi le changement a et b à l'intérieur de swaps 965 00:42:58,770 --> 00:43:05,560 n'a pas d'effet sur x et y, alors que Je passai x et y à la fonction d'échange. 966 00:43:05,560 --> 00:43:08,750 Quel est le mot clé ici que pourrait expliquer simpliste? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Je pense que je l'ai entendu ici? 969 00:43:12,627 --> 00:43:13,335 PUBLIC: Retour. 970 00:43:13,335 --> 00:43:14,085 ENCEINTE 1: Retour? 971 00:43:14,085 --> 00:43:14,590 Ne reviendra pas. 972 00:43:14,590 --> 00:43:15,895 Allons avec une autre. 973 00:43:15,895 --> 00:43:16,395 Qu'est ce que c'est? 974 00:43:16,395 --> 00:43:17,080 >> PUBLIC: [inaudible]. 975 00:43:17,080 --> 00:43:20,000 >> ENCEINTE 1: OK, donc nous avons pu return-- rendre le travail de retour dans l'histoire, 976 00:43:20,000 --> 00:43:21,914 mais il ya une explication encore plus simple. 977 00:43:21,914 --> 00:43:22,580 PUBLIC: Champ d'application. 978 00:43:22,580 --> 00:43:23,288 ENCEINTE 1: Champ d'application. 979 00:43:23,288 --> 00:43:24,300 Je prends portée. 980 00:43:24,300 --> 00:43:27,290 Donc portée, se rappeler où notre x et y déclarés. 981 00:43:27,290 --> 00:43:30,840 Ils sont déclarées à l'intérieur de principal droit ici. 982 00:43:30,840 --> 00:43:33,200 a et b, en attendant, sont effectivement déclarée 983 00:43:33,200 --> 00:43:35,930 l'intérieur de swap, pas tout à fait les accolades, mais encore 984 00:43:35,930 --> 00:43:37,690 dans le domaine général de swap. 985 00:43:37,690 --> 00:43:40,560 Et en effet, a et b exister que dans ce bac 986 00:43:40,560 --> 00:43:44,850 de Annenberg, ce deuxième morceau de code. 987 00:43:44,850 --> 00:43:49,500 Donc, nous sommes en effet modifier la copie, mais ce n'est pas vraiment tout ce qui utile. 988 00:43:49,500 --> 00:43:52,190 >> Donc, nous allons jeter un oeil à ce niveau un peu plus bas. 989 00:43:52,190 --> 00:43:55,430 Je vais retourner dans le répertoire source, 990 00:43:55,430 --> 00:43:58,330 et je vais d'abord agrandir ici, et juste 991 00:43:58,330 --> 00:44:02,290 pour confirmer que je suis dans ce plus grande fenêtre de terminal, 992 00:44:02,290 --> 00:44:04,430 le programme est toujours comporter comme ça. 993 00:44:04,430 --> 00:44:06,840 Supposons maintenant que cette n'est pas intentionnelle. 994 00:44:06,840 --> 00:44:10,090 Il est clair que je voulais échange de travail, il se sent comme un bug. 995 00:44:10,090 --> 00:44:12,780 Maintenant, je pourrais commencer à ajouter un beaucoup de printf du à mon code, 996 00:44:12,780 --> 00:44:16,010 imprimer x ici, y sur ici, un ici, b ici. 997 00:44:16,010 --> 00:44:18,220 Mais franchement, c'est probablement ce que vous avez fait pour un couple de semaines 998 00:44:18,220 --> 00:44:20,190 maintenant, aux heures de bureau et à la maison lorsque vous travaillez 999 00:44:20,190 --> 00:44:22,150 sur psets essayer de trouver quelques bugs. 1000 00:44:22,150 --> 00:44:25,560 Mais vous verrez, si vous n'avez pas déjà, ce problème réglé trois vous présente 1001 00:44:25,560 --> 00:44:31,630 à une commande appelée GDB, où GDB, GNU débogueur, 1002 00:44:31,630 --> 00:44:34,040 lui-même a tout un tas de caractéristiques qui peuvent effectivement 1003 00:44:34,040 --> 00:44:38,160 laissez-nous comprendre les situations comme ça, mais plus convaincante, 1004 00:44:38,160 --> 00:44:39,940 résoudre les problèmes et trouver des bogues. 1005 00:44:39,940 --> 00:44:40,940 Donc, je vais le faire. 1006 00:44:40,940 --> 00:44:44,770 Au lieu de ./noswap, je suis à la place va courir GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 En d'autres termes, je vais courir ma programme pas dans Bash, notre nouvel ami 1009 00:44:51,200 --> 00:44:51,850 aujourd'hui. 1010 00:44:51,850 --> 00:44:53,970 Je vais courir mon programme NOSWAP l'intérieur 1011 00:44:53,970 --> 00:44:56,900 de cet autre programme appelé GDB, un débogueur, qui 1012 00:44:56,900 --> 00:45:01,035 est un programme qui est conçu pour aider Vous les humains trouver et supprimer les bugs. 1013 00:45:01,035 --> 00:45:03,410 Donc, si je frappe exécuter ici, il n'y a un montant atroce de texte 1014 00:45:03,410 --> 00:45:04,868 que vous avez vraiment jamais à lire. 1015 00:45:04,868 --> 00:45:07,290 Il s'agit essentiellement d'une distraction partir de l'invite, qui 1016 00:45:07,290 --> 00:45:10,030 Je vais frapper Control-L pour obtenir au sommet il. 1017 00:45:10,030 --> 00:45:11,800 C'est l'invite GDB. 1018 00:45:11,800 --> 00:45:15,550 Si je veux exécuter ce programme maintenant, comme ce petit aide-mémoire sur aujourd'hui 1019 00:45:15,550 --> 00:45:21,860 diapositive indique, Run est le premier commandes que nous voulions présenter. 1020 00:45:21,860 --> 00:45:25,150 Et je vais juste à taper courir ici à l'intérieur de GDB, 1021 00:45:25,150 --> 00:45:26,811 et en effet il a couru mon programme. 1022 00:45:26,811 --> 00:45:29,310 Maintenant, il ya un certain supplémentaires sorties de l'écran comme celui-ci, 1023 00:45:29,310 --> 00:45:31,910 mais c'est juste GDB étant anal et nous dire ce qui se passe. 1024 00:45:31,910 --> 00:45:34,451 Vous n'avez pas vraiment à vous soucier sur ces détails pour le moment. 1025 00:45:34,451 --> 00:45:36,890 Mais ce qui est vraiment cool GDB, si je fais ce again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L efface le screen-- Let Me Go de l'avant et de type "briser principal," ce qui, 1027 00:45:42,100 --> 00:45:45,743 lorsque je tape sur Entrée, ce qui est la mise en appelé point à noswap.c de pause, 1028 00:45:45,743 --> 00:45:51,270 ligne 16, qui est l'endroit où GDB compris mon programme fait 1029 00:45:51,270 --> 00:45:53,070 est, ma fonction est en réalité. 1030 00:45:53,070 --> 00:45:55,070 C'est ce que nous allons ignorer pour l'instant mais c'est l'adresse 1031 00:45:55,070 --> 00:45:57,310 dans la mémoire de cette fonction spécifique. 1032 00:45:57,310 --> 00:46:00,240 Alors maintenant, quand je saisir run, remarquer ce qui est cool ici. 1033 00:46:00,240 --> 00:46:05,650 Mon programme se brise sur la ligne I dit GDB à suspendre l'exécution à. 1034 00:46:05,650 --> 00:46:09,850 Donc, je n'ai pas à changer maintenant mon code, ajouter des printf de, recompiler, reprise 1035 00:46:09,850 --> 00:46:13,300 il, changer, ajouter des printf de, enregistrer, recompiler, exécutez-le. 1036 00:46:13,300 --> 00:46:18,100 Je peux encore marcher dans mon programme étape par étape par étape à vitesse humaine, 1037 00:46:18,100 --> 00:46:20,880 pas au type Intel à l'intérieur de la vitesse. 1038 00:46:20,880 --> 00:46:24,580 >> Alors maintenant remarquer cette ligne apparaît ici, et si je reviens 1039 00:46:24,580 --> 00:46:27,800 à mon programme dans gedit, Remarquons que c'est fait 1040 00:46:27,800 --> 00:46:29,280 la première ligne de code. 1041 00:46:29,280 --> 00:46:31,240 Il ya la ligne 16 de gedit. 1042 00:46:31,240 --> 00:46:34,610 Il ya la ligne 16 dans GDB, et même si cette interface en noir et blanc 1043 00:46:34,610 --> 00:46:37,760 est loin d'être aussi utilisateur amical, cela signifie 1044 00:46:37,760 --> 00:46:41,680 que la ligne 16 n'a pas été exécutée encore, mais il est sur le point de l'être. 1045 00:46:41,680 --> 00:46:46,220 Donc, en effet, si je tape impression x, pas printf, juste print x, 1046 00:46:46,220 --> 00:46:50,730 Je reçois une certaine valeur faux il de zéro, car x n'a pas encore été initialisé. 1047 00:46:50,730 --> 00:46:54,760 Donc, je vais taper à côté, ou, si vous vouloir être de fantaisie, juste pour N prochaine. 1048 00:46:54,760 --> 00:46:59,090 Mais quand je tape suivante entrer, maintenant remarque il passe à la ligne 17. 1049 00:46:59,090 --> 00:47:02,840 Donc, logiquement, si j'ai exécuté ligne 16 et je tape maintenant print x, 1050 00:47:02,840 --> 00:47:03,640 que dois-je voir? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 One. 1053 00:47:05,520 --> 00:47:07,820 >> Et maintenant, ce n'est certes déroutant. 1054 00:47:07,820 --> 00:47:11,260 $ 2 est juste une façon élégante de, si vous vous référer à cette valeur plus tard, 1055 00:47:11,260 --> 00:47:12,510 vous pouvez dire «dollar signer deux." 1056 00:47:12,510 --> 00:47:13,480 C'est comme une référence arrière. 1057 00:47:13,480 --> 00:47:14,570 Mais pour l'instant, juste l'ignorer. 1058 00:47:14,570 --> 00:47:17,070 Ce qui est intéressant est ce qui est sur la droite du signe égal. 1059 00:47:17,070 --> 00:47:21,000 Et maintenant, si je tape prochaine fois et print y, je devrais voir 2. 1060 00:47:21,000 --> 00:47:23,870 Je peux aussi maintenant imprimer x fois, et franchement, 1061 00:47:23,870 --> 00:47:27,130 si je suis un peu confus quant à où je suis, je peux liste pour le type de liste 1062 00:47:27,130 --> 00:47:30,590 et juste voir un peu de contexte autour le point que je suis en fait à. 1063 00:47:30,590 --> 00:47:35,180 Et maintenant, je peux taper suivante, et x est égal à 1. 1064 00:47:35,180 --> 00:47:36,300 Maintenant je tape suivante. 1065 00:47:36,300 --> 00:47:37,710 Oh, y est 2. 1066 00:47:37,710 --> 00:47:40,750 Et encore une fois, il est source de confusion, car la sortie de GDB 1067 00:47:40,750 --> 00:47:43,044 est mélangé avec ma propre production. 1068 00:47:43,044 --> 00:47:45,710 Mais si vous gardez à l'esprit, par en regardant en arrière à votre code 1069 00:47:45,710 --> 00:47:47,740 ou posant sur côté de l'autre peut-être, vous aurez 1070 00:47:47,740 --> 00:47:51,020 vois que vraiment je suis juste pas à pas dans mon programme. 1071 00:47:51,020 --> 00:47:54,620 >> Mais remarquez ce qui se passe à côté, littéralement. 1072 00:47:54,620 --> 00:47:56,380 Voici la ligne 22. 1073 00:47:56,380 --> 00:48:01,315 Laissez-moi aller sur elle, déplaçant ainsi sur à 23, et si j'imprime x maintenant, encore un. 1074 00:48:01,315 --> 00:48:03,890 Et si je y imprimer maintenant, encore un. 1075 00:48:03,890 --> 00:48:05,820 Ce n'est donc pas un exercice utile. 1076 00:48:05,820 --> 00:48:07,450 Donc, nous allons refaire cela. 1077 00:48:07,450 --> 00:48:10,069 Permettez-moi de revenir à la dessus et tapez run nouveau. 1078 00:48:10,069 --> 00:48:12,110 Et c'est dire le programme que cela en cours de débogage 1079 00:48:12,110 --> 00:48:14,109 a déjà commencé, commencé dès le début. 1080 00:48:14,109 --> 00:48:15,420 Oui, nous allons le faire à nouveau. 1081 00:48:15,420 --> 00:48:22,000 Et cette fois, nous allons faire ensuite, Suivant, Suivant, Suivant, Suivant, 1082 00:48:22,000 --> 00:48:24,180 mais maintenant les choses deviennent intéressantes. 1083 00:48:24,180 --> 00:48:27,760 Maintenant, je veux entrer dans swap, donc je ne tape pas à côté. 1084 00:48:27,760 --> 00:48:34,380 Je tape pas, et maintenant le remarquer m'a sauté à la ligne de noswap.c 33. 1085 00:48:34,380 --> 00:48:37,240 Si je reviens à gedit, ce qui est la ligne 33? 1086 00:48:37,240 --> 00:48:40,500 C'est la première réelle ligne de code à l'intérieur de swap. 1087 00:48:40,500 --> 00:48:44,150 Ce qui est bien, parce que maintenant je peux type de fouiller et obtenir curieux 1088 00:48:44,150 --> 00:48:46,052 à ce qui se passe vraiment là-dedans. 1089 00:48:46,052 --> 00:48:46,760 Permettez-moi imprimer tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Whoa. 1092 00:48:48,800 --> 00:48:51,438 Pourquoi ne tmp ont une certaine fou, la valeur des ordures faux? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 PUBLIC: Il n'a pas été initialisé. 1095 00:48:56,120 --> 00:48:57,150 ENCEINTE 1: Il n'a pas été initialisé. 1096 00:48:57,150 --> 00:49:00,270 Et en effet, lorsque vous exécutez un programme, vous êtes donné tout un tas de mémoire 1097 00:49:00,270 --> 00:49:03,392 par le système d'exploitation, mais vous n'ont pas initialisé toutes les valeurs, 1098 00:49:03,392 --> 00:49:05,600 donc tout ce que vous êtes morceaux voir ici, même si c'est 1099 00:49:05,600 --> 00:49:07,770 ce grand point négatif fou nombre, signifie simplement 1100 00:49:07,770 --> 00:49:10,750 que ce sont les restes de certains usages précédente de cette RAM, 1101 00:49:10,750 --> 00:49:13,050 même si je n'ai pas me faut il encore. 1102 00:49:13,050 --> 00:49:17,086 Alors maintenant, je vais aller de l'avant et le type prochaine, et si je tape maintenant imprimer tmp, 1103 00:49:17,086 --> 00:49:17,835 que dois-je voir? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Quelle que soit la valeur d'un été, un est le premier argument, juste 1106 00:49:23,360 --> 00:49:25,550 comme x a été le premier chose qui est transmis, 1107 00:49:25,550 --> 00:49:30,450 si a et x doivent être les mêmes, donc imprimer tmp devrait me imprimer un. 1108 00:49:30,450 --> 00:49:36,360 >> Donc, ce que vous verrez dans le jeu de problème trois est un tutoriel de toutes sortes sur GDB, 1109 00:49:36,360 --> 00:49:40,020 mais se rendent compte que c'est le début d'un coup d'œil à un outil qui sera effectivement 1110 00:49:40,020 --> 00:49:42,774 vous aider à résoudre les problèmes de manière beaucoup plus efficace. 1111 00:49:42,774 --> 00:49:44,690 Ce que nous sommes en fin de compte va faire le mercredi 1112 00:49:44,690 --> 00:49:48,180 est de commencer à éplucher quelques couches et enlever des roues de formation. 1113 00:49:48,180 --> 00:49:50,496 Cette chose appelée chaîne nous avons utilisé pendant un certain temps, 1114 00:49:50,496 --> 00:49:53,370 nous allons prendre lentement que l'écart de vous et de commencer à parler de 1115 00:49:53,370 --> 00:49:55,725 quelque chose de plus ésotérique connu en tant que char *, 1116 00:49:55,725 --> 00:49:59,550 mais nous allons faire cette belle et d'abord doucement, même si des pointeurs, 1117 00:49:59,550 --> 00:50:02,730 comme on les appelle, peuvent faire des très mauvaises choses si on en abuse, 1118 00:50:02,730 --> 00:50:06,040 en regardant un peu de pâte à modeler de notre ami Nick Parlante de Stanford 1119 00:50:06,040 --> 00:50:09,670 Université, un professeur en informatique la science qui mis ensemble cet aperçu 1120 00:50:09,670 --> 00:50:11,075 de ce qui est à venir ce mercredi. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [VIDEO LECTURE] 1123 00:50:13,400 --> 00:50:13,900 Hé, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Réveillez-vous. 1126 00:50:15,780 --> 00:50:17,240 Il est temps pour pointeur plaisir. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> -Quel Ce que c'est? 1129 00:50:19,350 --> 00:50:21,150 En savoir plus sur les pointeurs? 1130 00:50:21,150 --> 00:50:22,050 Oh, Goody! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [FIN LECTURE VIDÉO] 1133 00:50:23,730 --> 00:50:25,396 ENCEINTE 1: ce qui vous attend le mercredi. 1134 00:50:25,396 --> 00:50:26,440 Nous vous verrons alors. 1135 00:50:26,440 --> 00:50:27,106 [VIDEO LECTURE] 1136 00:50:27,106 --> 00:50:30,420 -Et Maintenant, pensées profondes, par Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> -Pourquoi Nous apprennent C? 1139 00:50:35,900 --> 00:50:36,785 Pourquoi ne pas A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Rires] 1142 00:50:40,910 --> 00:50:42,160 >> [FIN LECTURE VIDÉO]