1 00:00:00,000 --> 00:00:12,040 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:12,040 --> 00:00:16,460 >> ALTAVOZ 1: Muy bien, esto es CS50, y este es el comienzo de la semana cuatro, 3 00:00:16,460 --> 00:00:20,420 y como usted puede haber oído o leer, el mundo ha estado llegando a su fin. 4 00:00:20,420 --> 00:00:23,520 El ir por todo el internet ha sido el conocimiento y la conciencia 5 00:00:23,520 --> 00:00:27,100 de un error en un programa, una lenguaje de programación llamado Bash. 6 00:00:27,100 --> 00:00:32,729 Este ha sido marcado maravillosamente como Shellshock, o la puerta Bash, 7 00:00:32,729 --> 00:00:35,485 pero artículos como estos no han sido infrecuentes. 8 00:00:35,485 --> 00:00:38,807 Y, de hecho, muchos de ellos traen recuerdos posteriores de Heartbleed, 9 00:00:38,807 --> 00:00:41,640 que usted puede haber notado en el comprimir la primavera pasada, que 10 00:00:41,640 --> 00:00:43,980 fue igualmente bastante dramático. 11 00:00:43,980 --> 00:00:47,110 Ahora, por aquellos de ustedes aquí hoy, ¿cuántos de ustedes tienen, 12 00:00:47,110 --> 00:00:50,330 incluso si usted no entiende lo que es todo sobre, oído hablar de Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Muy bien, y ¿cuántos de ustedes tener equipos que son vulnerables? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 Aceptar, debe haber mucho, mucho más manos hasta ahora, por razones que veremos. 17 00:01:00,250 --> 00:01:02,580 >> Echemos un vistazo a lo que estado sucediendo en los medios de comunicación 18 00:01:02,580 --> 00:01:05,304 y luego explicarlo un poco aquí para nosotros técnicamente. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> ALTAVOZ 2: Los expertos en seguridad tienen advertido que una grave falla podría 21 00:01:11,250 --> 00:01:15,650 estar a punto de afectar a cientos de millones de usuarios de Internet del mundo. 22 00:01:15,650 --> 00:01:20,600 Entonces, ¿qué es exactamente el error que ha sido apodado Shellshock, y lo que hace? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Bueno, Shellshock también se conoce como el Bug Bash, el software que explota. 25 00:01:28,910 --> 00:01:33,230 Los hackers utilizan virus para escanear vulnerables sistemas que ejecutan Linux y Unix 26 00:01:33,230 --> 00:01:36,300 sistemas operativos y luego infectar a ellos. 27 00:01:36,300 --> 00:01:38,730 Bash es un shell de línea de comandos. 28 00:01:38,730 --> 00:01:43,460 Esto permite que los usuarios de los comandos de edición para lanzar programas y características en el software 29 00:01:43,460 --> 00:01:45,250 por la introducción de texto. 30 00:01:45,250 --> 00:01:49,980 Se utiliza normalmente por los programadores, y no debe estar abierto al resto del mundo, 31 00:01:49,980 --> 00:01:51,590 aunque Shellshock cambia eso. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Bueno, worringly, algunos analistas advierten que podría ser una amenaza mayor, 34 00:01:57,910 --> 00:02:01,580 porque Shellshock permite completa el control de una máquina infectada, 35 00:02:01,580 --> 00:02:06,030 mientras que sólo se permite Heartbleed hackers para espiar en computadoras. 36 00:02:06,030 --> 00:02:09,130 Es tan grave, es ha clasificado un 10 sobre 10 37 00:02:09,130 --> 00:02:11,900 de la gravedad por la National Base de datos de vulnerabilidades. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2.3 de todos los servidores web están en riesgo, incluyendo algunos ordenadores Mac. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Bueno, asegúrese de que parchear sus sistemas ahora. 42 00:02:25,600 --> 00:02:29,330 Cualquiera que alojar un sitio web en funcionamiento los sistemas operativos afectados 43 00:02:29,330 --> 00:02:31,800 debe tomar medidas tan pronto como sea posible. 44 00:02:31,800 --> 00:02:35,390 Cualquiera que pueda permitírselo debe mirar a su aplicación de monitoreo y web 45 00:02:35,390 --> 00:02:37,355 firewalls a tener en cuenta cualquier ataque. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 ALTAVOZ 3: Lo peor que podría pasar es 48 00:02:41,770 --> 00:02:45,080 que alguien escribiría código que iría automáticamente y escanear 49 00:02:45,080 --> 00:02:48,280 internet y afectaría todos estos equipos. 50 00:02:48,280 --> 00:02:50,710 Y una vez que lo hacen, así, lo peor que podían hacer 51 00:02:50,710 --> 00:02:53,300 se acaba de borrar todo, o cerrar los sitios de abajo. 52 00:02:53,300 --> 00:02:55,360 Así que podríamos ver el daño desde ese punto de vista, 53 00:02:55,360 --> 00:02:58,300 donde tendríamos personas maliciosas que acaba de decidir a causar estragos 54 00:02:58,300 --> 00:03:02,534 trayendo sistemas abajo o eliminar archivos, y cosas como esas. 55 00:03:02,534 --> 00:03:05,200 ALTAVOZ 2: Algunos dicen que esta es una de las más difíciles de medir 56 00:03:05,200 --> 00:03:08,080 errores en años, y que puede llevar semanas o incluso 57 00:03:08,080 --> 00:03:10,820 meses para determinar su impacto final. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> ALTAVOZ 1: Así que todo eso es cierto, pero lo curioso es que casi todos 60 00:03:15,560 --> 00:03:18,330 de las imágenes que acabas de ver, excepto quizás el teclado, 61 00:03:18,330 --> 00:03:20,930 no tiene nada que ver con el error absoluto. 62 00:03:20,930 --> 00:03:23,960 Servidores y alambres y así sucesivamente, Es una especie de tangencialmente relacionado, 63 00:03:23,960 --> 00:03:27,410 pero en el fondo es en realidad bastante familiarizado lo que está pasando aquí. 64 00:03:27,410 --> 00:03:30,050 De hecho, déjame ir a nuestro aparato CS50. 65 00:03:30,050 --> 00:03:32,910 Déjame ir por delante y maximizar la ventana de terminal aquí. 66 00:03:32,910 --> 00:03:36,020 Y ustedes han estado utilizando este, o la versión incorporada de la misma, 67 00:03:36,020 --> 00:03:39,460 en gedit para escribir programas, escribir comandos, y así sucesivamente, 68 00:03:39,460 --> 00:03:43,690 y esto es en realidad, y tiene sido durante semanas, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Este es el Bourne-again shell, que es sólo una forma elegante de decir, 70 00:03:46,890 --> 00:03:50,220 este es un programa que tiene un parpadeo rápido, eficaz, 71 00:03:50,220 --> 00:03:51,970 que se sienta allí esperando para la entrada para usted. 72 00:03:51,970 --> 00:03:53,920 Y es el comando interfaz de línea a través del cual 73 00:03:53,920 --> 00:03:57,650 que ustedes han estado ejecutando comandos y en última instancia, la compilación y luego corriendo 74 00:03:57,650 --> 00:03:58,400 programas. 75 00:03:58,400 --> 00:04:01,320 >> Pero Bash es también una programación idioma en el siguiente sentido. 76 00:04:01,320 --> 00:04:05,460 Usted sabe que hay comandos como cd y ls y también clang y otros, 77 00:04:05,460 --> 00:04:09,580 pero usted puede definir sus propios comandos mediante la implementación de ellos en Bash. 78 00:04:09,580 --> 00:04:11,420 Ahora no vamos a entrar en gran detalle 79 00:04:11,420 --> 00:04:16,089 como para golpear el lenguaje de programación, pero Sabemos, por ejemplo, que en este momento, 80 00:04:16,089 --> 00:04:17,607 no hay comando llamado "hola." 81 00:04:17,607 --> 00:04:19,440 Por lo tanto, se puede encontrar en uno de estos paquetes. 82 00:04:19,440 --> 00:04:20,856 No está instalado en mi equipo. 83 00:04:20,856 --> 00:04:21,870 Pregunte a su administrador. 84 00:04:21,870 --> 00:04:26,030 Pero si yo quiero que haya un programa llamado "hola" en Bash o en mi pronta, 85 00:04:26,030 --> 00:04:30,810 De hecho, puedo utilizar la sintaxis que es absolutamente como C. No es exactamente lo mismo, 86 00:04:30,810 --> 00:04:35,020 pero se ve bastante similar a un función, aunque faltan algunos detalles. 87 00:04:35,020 --> 00:04:38,090 Nada parece suceder, pero ahora si escribo "hola" 88 00:04:38,090 --> 00:04:40,960 en realidad se puede escribir una programa, no en C, no en Java, 89 00:04:40,960 --> 00:04:44,280 no en otra programación idioma, pero en sí Bash. 90 00:04:44,280 --> 00:04:47,630 >> Ahora la clave aquí es que escribí el nombro yo quería dar a este nuevo comando, 91 00:04:47,630 --> 00:04:50,820 y los paréntesis son también simbólico de que esto sea una función. 92 00:04:50,820 --> 00:04:54,010 Como acotación al margen, también se puede hacer la diversión cosas, y de hecho, incluso en Mac OS, 93 00:04:54,010 --> 00:04:55,620 este es un programa que se llama Terminal. 94 00:04:55,620 --> 00:04:58,800 Viene integrado en cualquiera de equipo que tiene un Mac en esta sala, 95 00:04:58,800 --> 00:05:03,640 y se pueden hacer cosas similares en Mac OS, pero se puede ir más allá de eso. 96 00:05:03,640 --> 00:05:07,110 Y esto es un poco tangencial, pero es bastante divertido. 97 00:05:07,110 --> 00:05:09,715 Me acordé de esta mañana, al pensar en esto, 98 00:05:09,715 --> 00:05:13,279 de un pequeño juego que solía jugar con uno de los ex TFS del CS50 99 00:05:13,279 --> 00:05:16,570 mediante el cual cualquier momento iba a alejarse de su teclado con su pantalla desbloqueado, 100 00:05:16,570 --> 00:05:23,611 Me gustaría ejecutar un comando así- "saludar". 101 00:05:23,611 --> 00:05:26,610 Y ahora toda vez que volvía a su teclado después limpié la pantalla 102 00:05:26,610 --> 00:05:27,985 y se sentaba, tratar de hacer un poco de trabajo, 103 00:05:27,985 --> 00:05:29,250 listar el contenido de su directory-- 104 00:05:29,250 --> 00:05:29,510 >> [AUDIO REPRODUCCIÓN] 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 Hola. 108 00:05:32,120 --> 00:05:35,030 >> ALTAVOZ 1: Así que, para ser justos, que no era en realidad "hola." 109 00:05:35,030 --> 00:05:36,894 Por lo general era algo más parecido a eso-- 110 00:05:36,894 --> 00:05:37,560 [AUDIO REPRODUCCIÓN] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 ALTAVOZ 1: --que I would-- por lo que su equipo haría 113 00:05:39,320 --> 00:05:42,170 juro a él en cualquier momento que en realidad se sentó a su teclado. 114 00:05:42,170 --> 00:05:46,265 Y muy pronto se descubrió no dejar desbloqueado su pantalla. 115 00:05:46,265 --> 00:05:48,730 Pero esto sugiere que la especie divertido estúpido que 116 00:05:48,730 --> 00:05:50,210 puede tener con algo como Bash. 117 00:05:50,210 --> 00:05:52,770 Pero es un poco más grave, sin duda, que eso. 118 00:05:52,770 --> 00:05:57,235 Y de hecho, este es uno de los la mayoría de los insectos peligrosos y de larga duración 119 00:05:57,235 --> 00:05:58,860 que realmente ha golpeado el mundo global. 120 00:05:58,860 --> 00:06:02,060 Este error ha sido de alrededor durante unos 20 años, 121 00:06:02,060 --> 00:06:05,780 y serás golpeado en tan sólo un momento por su relativa simplicidad. 122 00:06:05,780 --> 00:06:07,990 >> Así que este es un representante di que si 123 00:06:07,990 --> 00:06:10,448 poseer un Mac, literalmente, en este momento cuando usted tiene su tapa abierta, 124 00:06:10,448 --> 00:06:12,940 puedes probar a escribir en esa programa llamado Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminal está bajo Aplicaciones Utilities-- 126 00:06:15,410 --> 00:06:18,790 por una vez, los usuarios de Windows no tienen que preocuparse por esto threat-- particular, 127 00:06:18,790 --> 00:06:22,310 pero aquellos de ustedes con Macs puede escribir esto en una ventana como la que voy a hacer aquí, 128 00:06:22,310 --> 00:06:24,210 y si usted escribe que en este programa 129 00:06:24,210 --> 00:06:28,830 llamada Terminal, como voy a hacer ahora, si usted ve la palabra "vulnerable" 130 00:06:28,830 --> 00:06:32,200 el equipo es vulnerables a la explotación. 131 00:06:32,200 --> 00:06:33,850 >> Ahora, ¿qué significa en realidad? 132 00:06:33,850 --> 00:06:35,870 Y esto es cierto una sintaxis bastante loco, 133 00:06:35,870 --> 00:06:39,050 pero vamos a por lo menos derramares algunos de los aspectos interesantes. 134 00:06:39,050 --> 00:06:42,567 Así que hay una sintaxis que se ve un poco familiar, al menos desde C 135 00:06:42,567 --> 00:06:43,950 y la programación en general. 136 00:06:43,950 --> 00:06:47,550 Veo algunos paréntesis, punto y coma, llaves, y tal, 137 00:06:47,550 --> 00:06:50,820 pero resulta que este estupidez aquí en amarillo 138 00:06:50,820 --> 00:06:53,580 es esencialmente una función eso no hace nada. 139 00:06:53,580 --> 00:06:57,840 Los medios de colon no hacen nada, y la punto y coma significa dejar de hacer nada. 140 00:06:57,840 --> 00:07:00,250 Así en el interior de estos llaves, el hecho de 141 00:07:00,250 --> 00:07:02,440 que tengo una igual firmar a la izquierda, esta 142 00:07:02,440 --> 00:07:05,500 es esencialmente la creación un comando, o una variable, 143 00:07:05,500 --> 00:07:09,520 llamada x, y asignándole que poco amarilla de código allí. 144 00:07:09,520 --> 00:07:14,040 Eso podría ser algo así como "eco hola "o" decir bip "o algo 145 00:07:14,040 --> 00:07:15,120 similar a eso. 146 00:07:15,120 --> 00:07:17,780 Pero fíjate si sus ojos pasear más a la derecha, 147 00:07:17,780 --> 00:07:22,150 hay más en esta línea de sólo el final de ese punto y coma. 148 00:07:22,150 --> 00:07:25,160 "Echo vulnerables", y luego más allá de que hay aún más. 149 00:07:25,160 --> 00:07:26,530 Otro punto y coma, -c fiesta :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Así que cuento largo, esta línea de código es 152 00:07:34,050 --> 00:07:36,660 suficiente para obligar un equipo que es 153 00:07:36,660 --> 00:07:39,830 vulnerables a hacer algo que usted quiere que haga, 154 00:07:39,830 --> 00:07:44,290 porque hay un error en el cual Bash aunque Bash debía dejar de 155 00:07:44,290 --> 00:07:48,980 líneas de lectura de comando de la derecha allí después del texto amarillo, 156 00:07:48,980 --> 00:07:52,520 para un 20-plus años bug de edad, Bash ha sido en realidad la lectura 157 00:07:52,520 --> 00:07:56,780 más allá de ese punto y coma y bastante mucho haciendo lo que se le dice. 158 00:07:56,780 --> 00:07:59,070 >> ¿Cuál es la implicación de que en última instancia? 159 00:07:59,070 --> 00:08:01,340 Que acabo de decir "echo hola" o "eco vulnerables" 160 00:08:01,340 --> 00:08:05,449 pero lo que si usted hizo algo realmente maliciosos, como rm-rf *, 161 00:08:05,449 --> 00:08:07,240 que tal vez no alguna vez ha escrito antes, 162 00:08:07,240 --> 00:08:08,920 y, francamente, es probable que no debe demasiado pronto, 163 00:08:08,920 --> 00:08:10,700 porque se puede hacer una mucho daño con ella. 164 00:08:10,700 --> 00:08:11,210 ¿Por qué? 165 00:08:11,210 --> 00:08:12,990 rm hace qué, por supuesto? 166 00:08:12,990 --> 00:08:14,270 Elimina. 167 00:08:14,270 --> 00:08:15,930 * Significa qué? 168 00:08:15,930 --> 00:08:16,430 Todos. 169 00:08:16,430 --> 00:08:18,180 Así que es una llamada comodín, por lo que significa 170 00:08:18,180 --> 00:08:20,410 borrar todo en el directorio actual. 171 00:08:20,410 --> 00:08:23,379 -r pasa a significar recursiva, que quiere decir que si lo que estás borrando 172 00:08:23,379 --> 00:08:26,420 es un directorio, y dentro de ahí es otros archivos y otros directorios, 173 00:08:26,420 --> 00:08:28,950 recursiva sumergirse en allí y borrar todo eso. 174 00:08:28,950 --> 00:08:31,040 Y f es el peor de todos ellos. 175 00:08:31,040 --> 00:08:32,580 Alguien sabe lo que significa -f aquí? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Fuerza. 178 00:08:34,360 --> 00:08:37,830 Así forzar medios, incluso si esto es una mala idea, 179 00:08:37,830 --> 00:08:40,939 hacerlo sin mí que provocó para su posterior confirmación. 180 00:08:40,939 --> 00:08:43,230 Así que, ya sabes, nos reímos de esto, pero, francamente, yo probablemente 181 00:08:43,230 --> 00:08:44,972 escriba esto varias veces un día, porque la realidad 182 00:08:44,972 --> 00:08:47,210 es que es la manera más rápida de eliminar un montón de cosas. 183 00:08:47,210 --> 00:08:48,590 Pero incluso he hecho un poco de daño. 184 00:08:48,590 --> 00:08:53,100 >> Pero si usted fuera a engañar a un ordenador en definir alguna variable estúpido 185 00:08:53,100 --> 00:08:56,810 o función llama x, pero luego engañar a la computadora que ejecute 186 00:08:56,810 --> 00:09:00,030 más allá de los límites de esa función, más allá de ese punto y coma, 187 00:09:00,030 --> 00:09:04,430 que de hecho podría engañar a un ordenador en la ejecución de algo como rm-rf 188 00:09:04,430 --> 00:09:07,810 o el comando Email o el comando Copiar. 189 00:09:07,810 --> 00:09:11,400 Cualquier cosa, literalmente, le puede ver con el ordenador, si se trata de la eliminación de archivos, 190 00:09:11,400 --> 00:09:15,350 la creación de archivos, envío de correo basura a alguien, atacando a algún servidor de forma remota, 191 00:09:15,350 --> 00:09:17,190 si usted puede expresarlo con un comando, 192 00:09:17,190 --> 00:09:19,120 puede engañar a una computadora para que haga eso. 193 00:09:19,120 --> 00:09:21,510 >> Ahora lo que es un ejemplo de cómo se puede hacer esto? 194 00:09:21,510 --> 00:09:24,300 Bueno, hay un montón de ordenadores en el Bash internet en ejecución. 195 00:09:24,300 --> 00:09:26,390 Todos los usuarios de Mac nos están entre ellos. 196 00:09:26,390 --> 00:09:30,390 Una gran cantidad de servidores Linux se encuentran entre ellos también, y servidores Unix. 197 00:09:30,390 --> 00:09:32,630 Ventanas obtiene de nuevo relativamente fuera del gancho 198 00:09:32,630 --> 00:09:34,590 a menos que haya instalado software especial. 199 00:09:34,590 --> 00:09:37,130 Ahora un montón de servidores, para ejemplo, para ejecutar servidores web, 200 00:09:37,130 --> 00:09:39,840 y de hecho Linux es quizás el más popular sistema operativo 201 00:09:39,840 --> 00:09:43,060 para ejecutarse en ordenadores en Internet que se servir las páginas web. 202 00:09:43,060 --> 00:09:44,910 Ahora bien, como veremos más adelante en el semestre, cuando 203 00:09:44,910 --> 00:09:48,470 se envía una solicitud de su browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- a un servidor remoto, 205 00:09:50,790 --> 00:09:53,730 resulta que a pesar de que que acaba de escribir www.example.com, 206 00:09:53,730 --> 00:09:59,590 su navegador está enviando un mensaje eso es un poco más arcano, como éste. 207 00:09:59,590 --> 00:10:01,239 >> Pero note algo extraño. 208 00:10:01,239 --> 00:10:03,030 Las dos primeras líneas Yo nunca he visto antes, 209 00:10:03,030 --> 00:10:04,904 pero que no se ven particularmente mortal. 210 00:10:04,904 --> 00:10:08,030 Pero noto lo que yo he robado para la tercera línea de aquí. 211 00:10:08,030 --> 00:10:13,390 Si un intruso fuera a enviar un mensaje así desde su ordenador 212 00:10:13,390 --> 00:10:17,270 a un Mac o un vulnerable servidor Linux vulnerables, 213 00:10:17,270 --> 00:10:21,580 lo curioso es que Bash, que pronta poco simple comando, 214 00:10:21,580 --> 00:10:27,450 es omnipresente y es a menudo Se usa para ejecutar esencialmente 215 00:10:27,450 --> 00:10:30,020 el contenido de un mensaje que recibe. 216 00:10:30,020 --> 00:10:33,490 Y por esa lógica, se puede engañar a un servidor web, por lo tanto, 217 00:10:33,490 --> 00:10:36,370 enviando algo así User-Agent, que por lo general 218 00:10:36,370 --> 00:10:38,300 se supone que es decir lo Nombre de tu navegador. 219 00:10:38,300 --> 00:10:42,420 User-Agent Cromo, User-Agent Internet Explorer, Firefox User-Agent, este 220 00:10:42,420 --> 00:10:44,590 es sólo el navegador de forma de identificar a sí mismo. 221 00:10:44,590 --> 00:10:46,605 Pero si uno de los malos muy inteligentemente dice, mm-mm, estoy 222 00:10:46,605 --> 00:10:47,930 No voy a decir lo que mi navegador es, 223 00:10:47,930 --> 00:10:50,888 Estoy en vez de ir a hacerle llegar esta Lo críptico de aspecto con un rm-rf 224 00:10:50,888 --> 00:10:55,840 * En el mismo, que, literalmente, puede engañar a un servidor web vulnerable en Internet 225 00:10:55,840 --> 00:10:59,055 para que ejecute exactamente eso en allí para borrar todos los archivos. 226 00:10:59,055 --> 00:11:00,930 Y, francamente, eso no es incluso la peor parte. 227 00:11:00,930 --> 00:11:01,763 Usted puede hacer cualquier cosa. 228 00:11:01,763 --> 00:11:04,480 Usted podría comenzar una distribuida ataque de denegación de servicio 229 00:11:04,480 --> 00:11:07,030 si envió este mensaje a racimos enteros de servidores web 230 00:11:07,030 --> 00:11:10,256 y luego tuvieron todos ellos descienden, por ejemplo, en servidores Harvard.edu, 231 00:11:10,256 --> 00:11:12,130 y se puede ordenar de explosión los diablos de ellos 232 00:11:12,130 --> 00:11:15,490 por un tráfico de red que se desencadenada en contrario de este chico malo. 233 00:11:15,490 --> 00:11:18,760 >> Por lo tanto, cuento largo, casi todos en esta sala que es dueño de un Mac 234 00:11:18,760 --> 00:11:20,240 es vulnerable a este. 235 00:11:20,240 --> 00:11:24,100 El lado positivo es que a menos que seas ejecutar un servidor web en su computadora portátil, 236 00:11:24,100 --> 00:11:27,780 y, a menos que haya configurado en realidad para permitir que algo así como SSH en él, 237 00:11:27,780 --> 00:11:28,670 estás realmente seguro. 238 00:11:28,670 --> 00:11:31,710 Es vulnerable, pero no es uno tratando de entrar en su computadora portátil, 239 00:11:31,710 --> 00:11:33,290 así que usted puede ordenar de contar. 240 00:11:33,290 --> 00:11:36,210 Sin embargo, Apple pronto ser la actualización de una solución para este. 241 00:11:36,210 --> 00:11:39,660 El mundo de Linux ya ha lanzado una serie de correcciones para Fedora y Ubuntu 242 00:11:39,660 --> 00:11:43,790 y otras versiones de Linux, y de hecho si ejecuta la actualización 50 en el aparato, 243 00:11:43,790 --> 00:11:45,930 aunque eso también será actualizada y corregida. 244 00:11:45,930 --> 00:11:47,764 Pero eso tampoco tiene sido realmente vulnerable, 245 00:11:47,764 --> 00:11:49,804 porque a menos que usted tiene vanamente con el aparato 246 00:11:49,804 --> 00:11:52,770 e hizo su portátil públicamente accesibles en Internet, que no es 247 00:11:52,770 --> 00:11:54,910 por defecto, que haya en realidad estado bien porque 248 00:11:54,910 --> 00:11:56,890 de cortafuegos y otras técnicas. 249 00:11:56,890 --> 00:12:01,000 >> Pero es un ejemplo extremo de un error que hemos vivido para para, literalmente, 20 250 00:12:01,000 --> 00:12:04,050 años, y quién sabe si alguien todo este tiempo se ha sabido de ella? 251 00:12:04,050 --> 00:12:06,300 Y de hecho, esta es una de los retos fundamentales 252 00:12:06,300 --> 00:12:08,690 que veremos más adelante en el semestre por la seguridad, 253 00:12:08,690 --> 00:12:13,020 es que al igual que en el mundo real, los buenos están en la desventaja. 254 00:12:13,020 --> 00:12:16,500 Para mantener a los chicos malos, tenemos que asegurarse de que cada puerta está cerrada, 255 00:12:16,500 --> 00:12:20,340 que cada ventana es seguro, que cada punto de entrada en un hogar 256 00:12:20,340 --> 00:12:21,980 es seguro para mantener a los chicos malos. 257 00:12:21,980 --> 00:12:26,870 Pero lo que hace el malo de la película tiene que hacer para comprometer realmente su casa 258 00:12:26,870 --> 00:12:28,200 y robar de usted? 259 00:12:28,200 --> 00:12:32,574 Él o ella sólo tiene que encontrar uno desbloqueado puerta, una ventana rota o algo 260 00:12:32,574 --> 00:12:35,240 en ese sentido, y es la lo mismo en la seguridad informática. 261 00:12:35,240 --> 00:12:37,660 Podemos escribir a millones de líneas de código de programación 262 00:12:37,660 --> 00:12:40,570 y gastar cientos o miles de horas tratando de conseguirlo correcto, 263 00:12:40,570 --> 00:12:43,370 pero si lo hacen sólo una error en la corrección, 264 00:12:43,370 --> 00:12:47,030 usted puede poner todo el sistema y de hecho, en este caso, la totalidad de internet 265 00:12:47,030 --> 00:12:48,660 y el mundo en riesgo. 266 00:12:48,660 --> 00:12:51,950 >> Así que si desea aprender más sobre esto, vaya a esta URL aquí. 267 00:12:51,950 --> 00:12:54,450 No hay necesidad de una acción esta noche a menos que esté 268 00:12:54,450 --> 00:12:57,116 entre los más cómodos que han sido la gestión de su propia web 269 00:12:57,116 --> 00:12:59,810 servidor, en cuyo caso usted debe, de hecho, actualizar el software. 270 00:12:59,810 --> 00:13:03,244 >> Y esto también es el título de un discurso, y ahora un papel, 271 00:13:03,244 --> 00:13:05,410 que nos hemos vinculado en la la página web del curso para hoy. 272 00:13:05,410 --> 00:13:07,600 Fue por un compañero llamado Ken Thompson, quien 273 00:13:07,600 --> 00:13:10,120 fue la aceptación de un muy famoso premio en ciencias de la computación, 274 00:13:10,120 --> 00:13:13,495 y él dio este discurso algunos años hace, esencialmente sobre el mismo tema. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 La gente que hace la pregunta, Si usted realmente 277 00:13:20,520 --> 00:13:23,480 confianza, en última instancia, la software que te han dado? 278 00:13:23,480 --> 00:13:26,100 Por ejemplo, todos tenemos estado escribiendo programas, 279 00:13:26,100 --> 00:13:27,820 y hemos estado recopilando con Clang. 280 00:13:27,820 --> 00:13:31,830 Y a su conocimiento, ¿has escrito cualquier programa de CS50 donde hay 281 00:13:31,830 --> 00:13:35,310 una puerta trasera de tipo, hay una manera que un tipo malo, si se ejecuta el programa, 282 00:13:35,310 --> 00:13:37,410 podría hacerse cargo de su equipo? 283 00:13:37,410 --> 00:13:38,310 Probablemente no, ¿verdad? 284 00:13:38,310 --> 00:13:40,180 Mario y codicioso, y Crédito. 285 00:13:40,180 --> 00:13:41,680 Estos son todos los programas bastante pequeños. 286 00:13:41,680 --> 00:13:43,910 Usted tendría que ser bastante mal si en realidad 287 00:13:43,910 --> 00:13:47,310 hecho todo el equipo sea vulnerable después de escribir 10 o 20 líneas de código, 288 00:13:47,310 --> 00:13:49,690 o al menos consciente de algunos de las implicaciones de seguridad. 289 00:13:49,690 --> 00:13:52,023 Ahora digo que en tono de burla, pero vamos a ver hoy 290 00:13:52,023 --> 00:13:54,600 y esta semana es en realidad muy, muy fácil 291 00:13:54,600 --> 00:13:57,980 a ser malo y hacer aún programas cortos vulnerables. 292 00:13:57,980 --> 00:14:02,880 >> Pero, por ahora, al menos, darse cuenta que la pregunta que se hace aquí 293 00:14:02,880 --> 00:14:04,850 está a punto Clang en un compilador. 294 00:14:04,850 --> 00:14:08,360 ¿Por qué hemos estado confiando en Clang durante los últimos dos o tres semanas? 295 00:14:08,360 --> 00:14:12,650 ¿Quién puede decir que quien escribió Clang no tenía un "si" condición en la que hay 296 00:14:12,650 --> 00:14:17,680 que esencialmente se inyecta algunos ceros y los en cada programa se compila 297 00:14:17,680 --> 00:14:21,180 eso sería dejar que él o ella el acceso cuando el equipo está dormido 298 00:14:21,180 --> 00:14:23,580 y su tapa del portátil está abierto y el equipo se ejecuta? 299 00:14:23,580 --> 00:14:24,080 ¿Cierto? 300 00:14:24,080 --> 00:14:28,350 Tenemos este tipo de sistema de honor derecho ahora donde confiamos en que Clang es de fiar. 301 00:14:28,350 --> 00:14:30,000 Usted confía en que el aparato es de fiar. 302 00:14:30,000 --> 00:14:34,430 Usted confía en que, literalmente, todos los programas en tu Mac o PC es digno de confianza. 303 00:14:34,430 --> 00:14:37,510 Y como este simple error sugiere, incluso si no es malicioso, 304 00:14:37,510 --> 00:14:40,580 eso no es absolutamente probable que sea el caso. 305 00:14:40,580 --> 00:14:42,350 >> Así que usted debe tener miedo como el infierno. 306 00:14:42,350 --> 00:14:45,560 Francamente, no hay sencillo solución a este otro 307 00:14:45,560 --> 00:14:48,185 que una especie de conciencia social de la complejidad cada vez mayor 308 00:14:48,185 --> 00:14:50,310 que estamos construyendo en la parte superior de nuestros sistemas informáticos, 309 00:14:50,310 --> 00:14:53,740 y cómo cada vez más vulnerables podríamos muy bien ser. 310 00:14:53,740 --> 00:14:55,570 >> Ahora, con esto dicho, Breakout. 311 00:14:55,570 --> 00:14:59,889 Así Breakout es problema establece tres, y Breakout es un juego de antaño 312 00:14:59,889 --> 00:15:02,180 que se puede recordar, pero para nosotros en un problema establecido tres, 313 00:15:02,180 --> 00:15:04,450 que nos permite tomar las cosas vuelvan a un nivel superior 314 00:15:04,450 --> 00:15:08,880 de manera que cuando estamos escribiendo programas, incluso en una ventana de terminal como este, 315 00:15:08,880 --> 00:15:14,670 en realidad podemos ejecutar, en última instancia, no los programas de gráficos 316 00:15:14,670 --> 00:15:17,800 a diferencia de aquellos que tuvimos en el acceso a los arañazos. 317 00:15:17,800 --> 00:15:20,910 Así que esta es la década de los funcionarios implementación de Breakout, 318 00:15:20,910 --> 00:15:23,930 que es precisamente esta romper ladrillos juego, que se mueve la pala hacia atrás 319 00:15:23,930 --> 00:15:27,590 adelante y hacia atrás, y golpear la bola contra los ladrillos de colores hasta la parte superior. 320 00:15:27,590 --> 00:15:30,020 Así que esto nos está trayendo especie de vuelta a donde 321 00:15:30,020 --> 00:15:33,180 hemos sido capaces de ser muy rápido con Scratch, y ahora con C, 322 00:15:33,180 --> 00:15:35,800 la implementación de nuestra propia interfaces gráficas de usuario. 323 00:15:35,800 --> 00:15:38,960 >> Pero más que eso, este conjunto de problemas representa la primera 324 00:15:38,960 --> 00:15:41,000 en la que estamos dando que un montón de código. 325 00:15:41,000 --> 00:15:43,940 Y, de hecho, les traigo explícita atención a esto, porque todo 326 00:15:43,940 --> 00:15:47,090 para los menos confortable, este problema configurado, al menos a primera vista, 327 00:15:47,090 --> 00:15:49,170 se va a sentir como hemos llevado a un nivel superior. 328 00:15:49,170 --> 00:15:51,540 Debido a que les hemos dado, para algunos de la búsqueda 329 00:15:51,540 --> 00:15:54,930 y clasificación de los problemas en el conjunto de procesadores, un montón de código que escribimos, 330 00:15:54,930 --> 00:15:56,680 y un par de comentarios que dicen "hacer" 331 00:15:56,680 --> 00:15:58,221 donde usted tiene que llenar los espacios en blanco. 332 00:15:58,221 --> 00:16:00,020 Así que no demasiado miedo, pero que es la primera vez 333 00:16:00,020 --> 00:16:03,370 le estamos entregando código que usted necesita leer primero, entender, y luego añadir a 334 00:16:03,370 --> 00:16:04,290 y completarlo. 335 00:16:04,290 --> 00:16:05,940 >> Y luego, con Breakout, vamos a hacer lo mismo, 336 00:16:05,940 --> 00:16:08,740 dándole unas pocas docenas más líneas de código que, francamente, le dará 337 00:16:08,740 --> 00:16:11,490 una gran parte del marco para el juego, pero detenerse 338 00:16:11,490 --> 00:16:14,304 de la aplicación de los ladrillos y la pelota y la paleta, 339 00:16:14,304 --> 00:16:15,970 pero sí implementamos algunas otras características. 340 00:16:15,970 --> 00:16:18,280 E incluso que, a primera vista, de nuevo, especialmente si menos cómodo, 341 00:16:18,280 --> 00:16:21,480 podría parecer especialmente difícil y Crees que hay tantas nuevas funciones 342 00:16:21,480 --> 00:16:24,070 que necesita para envolver su mente alrededor, y eso es verdad. 343 00:16:24,070 --> 00:16:26,281 Pero tenga en cuenta, es absolutamente como arañazos. 344 00:16:26,281 --> 00:16:28,780 Lo más probable es que no ha utilizado todas las piezas del rompecabezas en cero. 345 00:16:28,780 --> 00:16:31,120 Lo más probable es que no te importaba para envolver su mente alrededor de todos ellos 346 00:16:31,120 --> 00:16:33,617 porque todo lo que hizo fue un rápida mirada para comprender, oh, 347 00:16:33,617 --> 00:16:35,450 eso es lo que puedo hacer con esa pieza del rompecabezas. 348 00:16:35,450 --> 00:16:38,260 Y de hecho, en conjunto de problemas 3 spec, vamos a señalar que 349 00:16:38,260 --> 00:16:41,370 en la documentación que presentarles a algunas funciones nuevas, 350 00:16:41,370 --> 00:16:43,570 y en última instancia la programación construcciones que utilice. 351 00:16:43,570 --> 00:16:47,610 Condiciones, bucles, variables y funciones 352 00:16:47,610 --> 00:16:50,720 será idéntico al lo que hemos visto hasta el momento. 353 00:16:50,720 --> 00:16:53,560 >> Así que de hecho, lo que vamos a dar usted es un código de ejemplo que 354 00:16:53,560 --> 00:16:56,110 le permite crear una ventana que no se ve a diferencia de este, 355 00:16:56,110 --> 00:16:59,540 y en última instancia, convertirlo en algo como esto. 356 00:16:59,540 --> 00:17:02,250 Así que toma ventaja de CS50, discutir horas de oficina y más, 357 00:17:02,250 --> 00:17:05,290 y consolarse con el hecho de que la cantidad de código que tiene que escribir 358 00:17:05,290 --> 00:17:06,760 en realidad no es tanto. 359 00:17:06,760 --> 00:17:10,359 El primer reto es sólo para aclimatarse usted mismo a algún código que hemos escrito. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Cualquier pregunta sobre pset3, Shellshock, o de otra manera? 362 00:17:15,810 --> 00:17:19,226 >> AUDIENCIA: Parecía que ir a través con Breakout 363 00:17:19,226 --> 00:17:22,154 que el código es casi un estilo orientado a objetos, 364 00:17:22,154 --> 00:17:24,675 pero pensé que era un C programa orientado a objetos. 365 00:17:24,675 --> 00:17:26,050 ALTAVOZ 1: Una excelente pregunta. 366 00:17:26,050 --> 00:17:28,258 Así que en mirar a través de la código de distribución, el código 367 00:17:28,258 --> 00:17:30,180 escribimos para pset3, Para aquellos familiarizados, se 368 00:17:30,180 --> 00:17:32,230 parece que es un poco orientado a objetos. 369 00:17:32,230 --> 00:17:33,800 Respuesta corta es, lo es. 370 00:17:33,800 --> 00:17:38,130 Es una aproximación de cómo se podría hacer código orientado a objetos utilizando 371 00:17:38,130 --> 00:17:41,850 un lenguaje como C, pero es todavía en última instancia de procedimiento. 372 00:17:41,850 --> 00:17:44,900 No hay métodos dentro de las variables, como verás. 373 00:17:44,900 --> 00:17:46,180 Pero recuerda que. 374 00:17:46,180 --> 00:17:48,780 Y veremos que la función de nuevo cuando lleguemos a PHP y JavaScript 375 00:17:48,780 --> 00:17:49,946 hacia el final del semestre. 376 00:17:49,946 --> 00:17:53,667 Pero por ahora, pensar en ella como una pista de lo que está por venir. 377 00:17:53,667 --> 00:17:54,250 Buena pregunta. 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 Así merge sort era cómo cosas izquierda última vez. 381 00:17:59,730 --> 00:18:03,250 Y fusionar especie estaba fresco en la sentido de que era mucho más rápido, 382 00:18:03,250 --> 00:18:07,100 al menos sobre la base de las pruebas superficiales que hicimos la semana pasada, que, por ejemplo, la burbuja 383 00:18:07,100 --> 00:18:08,710 especie, ordenamiento por selección, ordenación por inserción. 384 00:18:08,710 --> 00:18:11,780 Y lo que era demasiado limpio es sólo cómo sucinta y limpiamente 385 00:18:11,780 --> 00:18:12,810 puedes expresarlo. 386 00:18:12,810 --> 00:18:15,840 Y lo que dijimos que era un superior con destino en el tiempo de ejecución de la fusión 387 00:18:15,840 --> 00:18:16,340 ordenar? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 ¿Sí? 390 00:18:18,495 --> 00:18:19,360 >> AUDIENCIA: n log n? 391 00:18:19,360 --> 00:18:20,819 >> ALTAVOZ 1: n log n, derecho. n log n. 392 00:18:20,819 --> 00:18:23,776 Y vamos a volver a lo que realmente significa o de dónde viene, 393 00:18:23,776 --> 00:18:25,570 pero esto era mejor que lo que el tiempo de funcionamiento 394 00:18:25,570 --> 00:18:28,440 que vimos durante la burbuja selección y ordenación por inserción? 395 00:18:28,440 --> 00:18:30,610 Así que n al cuadrado. n al cuadrado es más grande que esto, 396 00:18:30,610 --> 00:18:34,650 e incluso si no es bastante obvio, sabe que log n es menor que n, 397 00:18:34,650 --> 00:18:36,910 así que si usted lo hace n veces algo menor que n, 398 00:18:36,910 --> 00:18:38,680 que va a ser menor que n al cuadrado. 399 00:18:38,680 --> 00:18:40,130 Es un poco de intuición allí. 400 00:18:40,130 --> 00:18:42,190 Pero pagamos un precio por ello. 401 00:18:42,190 --> 00:18:47,000 Era más rápido, pero un tema que comenzó emerja la semana pasada era este sacrificio. 402 00:18:47,000 --> 00:18:49,804 Tengo un mejor rendimiento en cuanto a tiempo, pero lo que 403 00:18:49,804 --> 00:18:52,470 Por qué tengo que pasar por otro parte, con el fin de lograr eso? 404 00:18:52,470 --> 00:18:53,591 >> AUDIENCIA: Memoria. 405 00:18:53,591 --> 00:18:54,465 ALTAVOZ 1: Dilo de nuevo? 406 00:18:54,465 --> 00:18:55,173 AUDIENCIA: Memoria. 407 00:18:55,173 --> 00:18:57,040 ALTAVOZ 1: Memoria, o el espacio de forma más general. 408 00:18:57,040 --> 00:18:59,040 Y no era súper obvia con nuestros seres humanos, 409 00:18:59,040 --> 00:19:02,240 pero recordar que nuestros voluntarios fueron dando un paso adelante y paso a paso 410 00:19:02,240 --> 00:19:04,780 hacia atrás como si hay una matriz aquí, y como si hay 411 00:19:04,780 --> 00:19:07,130 una segunda matriz que aquí que podrían utilizar, porque nos 412 00:19:07,130 --> 00:19:09,080 algún lugar necesaria para fusionar esas personas. 413 00:19:09,080 --> 00:19:11,480 No podíamos cambiar en su lugar. 414 00:19:11,480 --> 00:19:13,800 Así fusionar especie de apalancamiento es más espacio, lo cual 415 00:19:13,800 --> 00:19:15,620 que no era necesario con los otros algoritmos, 416 00:19:15,620 --> 00:19:17,410 pero la ventaja es que es mucho más rápido. 417 00:19:17,410 --> 00:19:20,780 Y, francamente, en el espacio del mundo real éstos RAM días--, disco duro espacio-- 418 00:19:20,780 --> 00:19:25,030 es relativamente barato, y por lo que es no es necesariamente algo malo. 419 00:19:25,030 --> 00:19:28,320 >> Así que vamos a echar un vistazo rápido, un poco más metódicamente, en lo que hicimos 420 00:19:28,320 --> 00:19:30,220 y por qué dijimos que fue n log n. 421 00:19:30,220 --> 00:19:33,260 Así que aquí están los ocho números y la ocho voluntarios que tenían la última vez. 422 00:19:33,260 --> 00:19:35,718 Y lo primero que Merge Ordenar nos dijo que hacer era qué? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 AUDIENCIA: Divide en dos. 425 00:19:38,010 --> 00:19:38,663 ALTAVOZ 1: Dilo de nuevo? 426 00:19:38,663 --> 00:19:39,650 AUDIENCIA: Divide en dos. 427 00:19:39,650 --> 00:19:40,610 ALTAVOZ 1: Dividir en dos, derecha. 428 00:19:40,610 --> 00:19:42,818 Esto recuerda mucho a la guía telefónica, de división 429 00:19:42,818 --> 00:19:44,220 y conquistar de manera más general. 430 00:19:44,220 --> 00:19:45,640 Así que buscamos en la mitad izquierda. 431 00:19:45,640 --> 00:19:48,700 Y entonces una vez dijimos, una especie la mitad izquierda de los elementos, 432 00:19:48,700 --> 00:19:49,690 ¿qué hicimos junto decimos? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Ordenar la mitad izquierda de la izquierda la mitad, lo que nos permitió, 435 00:19:54,860 --> 00:19:57,570 después de dividir en dos, centrarse en cuatro y dos. 436 00:19:57,570 --> 00:20:01,280 >> ¿Cómo ordenar una lista ahora, en amarillo, de tamaño dos, utilizando Combinar Ordenar? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Bueno dividir por la mitad, y ordenar la mitad izquierda. 439 00:20:04,580 --> 00:20:07,100 Y este era el lugar donde las cosas se puso un poco brevemente estúpido. 440 00:20:07,100 --> 00:20:10,720 ¿Cómo ordenar una lista que es de tamaño de uno, como este número cuatro en esta lista? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Está ordenada. 443 00:20:13,210 --> 00:20:14,200 Ha terminado. 444 00:20:14,200 --> 00:20:17,300 >> Pero entonces, ¿cómo ordenar una lista de tamaño de uno cuando es el número dos? 445 00:20:17,300 --> 00:20:21,640 Bueno, lo mismo, pero ahora lo que fue la tercero y el paso clave en Merge Ordenar? 446 00:20:21,640 --> 00:20:24,020 Había que combinar la izquierda la mitad y la mitad derecha. 447 00:20:24,020 --> 00:20:26,580 Y una vez que lo hicimos, nos miramos a las cuatro, nos fijamos en dos. 448 00:20:26,580 --> 00:20:28,750 Decidimos bien, obviamente dos que ocurra primero, 449 00:20:28,750 --> 00:20:31,840 así que pusimos dos en su lugar, seguido por cuatro. 450 00:20:31,840 --> 00:20:35,010 Y ahora tienes que tipo de rebobinado, y esto es una especie de característica 451 00:20:35,010 --> 00:20:37,570 de un algoritmo como Merge Ordena, rebobinar en la memoria. 452 00:20:37,570 --> 00:20:40,240 ¿Cuál fue la siguiente línea de la historia? 453 00:20:40,240 --> 00:20:41,780 ¿Qué debería estar centrado en el próximo? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 La mitad derecha de la izquierda media, que es de seis y ocho. 456 00:20:47,350 --> 00:20:50,320 >> Así que permítanme simplemente un paso a través de esta sin machacar el punto demasiado. 457 00:20:50,320 --> 00:20:53,330 Seis y ocho, a continuación, seis es ordenados, ocho se ordena. 458 00:20:53,330 --> 00:20:57,190 Combinar juntos de esa manera, y ahora el próximo gran paso 459 00:20:57,190 --> 00:21:00,990 está, por supuesto, ordenar la mitad derecha desde el primer paso de este algoritmo. 460 00:21:00,990 --> 00:21:02,870 Así que nos centramos en uno, tres, siete, cinco. 461 00:21:02,870 --> 00:21:04,540 Luego nos centramos en la mitad izquierda. 462 00:21:04,540 --> 00:21:09,400 La mitad izquierda de que, la mitad derecha de eso y, a continuación, se funden en uno y tres. 463 00:21:09,400 --> 00:21:13,100 Entonces la mitad derecha, luego a la izquierda la mitad de él, entonces la mitad derecha de la misma. 464 00:21:13,100 --> 00:21:15,985 Combinar en, y ahora lo que queda paso? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Combinar la gran mitad izquierda y la gran mitad derecha, por lo que uno se pone allí, 467 00:21:22,460 --> 00:21:27,330 luego dos, luego tres, luego cuatro, luego cinco, luego seis, luego siete, luego ocho. 468 00:21:27,330 --> 00:21:31,990 >> Así que ahora por qué se esta revelando en última instancia, especialmente si n y logaritmos más 469 00:21:31,990 --> 00:21:35,487 en general, más bien escapar, al menos en los últimos tiempos? 470 00:21:35,487 --> 00:21:37,070 Bueno, fíjate en la altura de esta cosa. 471 00:21:37,070 --> 00:21:41,230 Tuvimos ocho elementos, y nos dividido por dos, por dos, por dos. 472 00:21:41,230 --> 00:21:44,590 Así que la base ingrese dos de las ocho nos da tres. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 Y confía en mí en que si un poco nebuloso sobre eso. 475 00:21:48,540 --> 00:21:54,710 Pero el registro de base de dos de ocho es tres, por lo que hemos hecho tres capas de fusión. 476 00:21:54,710 --> 00:21:57,170 Y cuando nos fusionamos elementos, el número de elementos 477 00:21:57,170 --> 00:21:58,950 nos vemos en cada una de las filas? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Un total de n, ¿verdad? 480 00:22:01,437 --> 00:22:04,020 Debido a la fusión de la fila superior, a pesar de que lo hicimos poco a poco, 481 00:22:04,020 --> 00:22:05,990 que en última instancia, tocamos cada número una vez. 482 00:22:05,990 --> 00:22:09,054 Y en la segunda fila, a fusionar dichas listas de tamaño dos, 483 00:22:09,054 --> 00:22:10,470 tuvimos que tocar cada elemento una vez. 484 00:22:10,470 --> 00:22:12,690 Y entonces aquí realmente claramente en la última fila, 485 00:22:12,690 --> 00:22:15,430 tuvimos que tocar cada uno de los elementos de una vez, pero sólo una vez, 486 00:22:15,430 --> 00:22:18,400 así que en este documento se encuentra, entonces, nuestro n log n. 487 00:22:18,400 --> 00:22:21,780 >> Y ahora sólo para hacer las cosas un poco más formal para un momento, si 488 00:22:21,780 --> 00:22:24,260 estaban ahora a analizar este en una especie de mayor nivel 489 00:22:24,260 --> 00:22:28,340 y tratar de decidir, así cómo podrías ir al expresar 490 00:22:28,340 --> 00:22:31,780 el tiempo de ejecución de este algoritmo sólo mirando a ella y no 491 00:22:31,780 --> 00:22:33,590 utilizando un ejemplo artificioso? 492 00:22:33,590 --> 00:22:36,590 Bueno, ¿cuánto tiempo le dirías a paso como éste en amarillo tomaría, 493 00:22:36,590 --> 00:22:37,173 si n <2 vuelta? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 Esa es una gran O de qué? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Así que yo estoy viendo uno, así que un paso, tal vez dos pasos porque es si 498 00:22:44,540 --> 00:22:47,110 y luego regresar, pero es constante de tiempo, ¿verdad? 499 00:22:47,110 --> 00:22:49,960 Así que dijimos O (1), y eso es cómo voy a expresar esto. 500 00:22:49,960 --> 00:22:51,480 T, acaba de ser tiempo de ejecución. 501 00:22:51,480 --> 00:22:54,150 n es el tamaño de la entrada, así que T (n), sólo una forma elegante 502 00:22:54,150 --> 00:22:56,330 de decir el funcionamiento tiempo de entrada dado de tamaño n 503 00:22:56,330 --> 00:23:00,220 va a ser del orden de constante de tiempo, en O (1). 504 00:23:00,220 --> 00:23:01,970 >> Pero por lo demás, ¿qué pasa con esto? 505 00:23:01,970 --> 00:23:05,660 ¿Cómo expresar la momento de esta línea amarilla corriendo? 506 00:23:05,660 --> 00:23:06,250 T ¿de qué? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Puede tipo de trampas aquí y responder a mi pregunta de forma cíclica. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Así que si el tiempo de funcionamiento en en general nos limitamos a decir es T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 Y ahora usted está especie de batea aquí y diciendo, bueno, sólo ordenar la mitad izquierda, 513 00:23:22,490 --> 00:23:23,920 y luego ordenar la mitad derecha. 514 00:23:23,920 --> 00:23:27,520 ¿Cómo podríamos representar simbólicamente el tiempo de ejecución de esta línea amarilla? 515 00:23:27,520 --> 00:23:28,020 T ¿de qué? 516 00:23:28,020 --> 00:23:29,360 ¿Cuál es el tamaño de la entrada? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n más de dos. 519 00:23:31,057 --> 00:23:32,140 ¿Por qué no me acaba de decir eso? 520 00:23:32,140 --> 00:23:36,449 Y entonces este es otro T (n / 2) y luego de nuevo, si puedo combinar dos mitades ordenadas, 521 00:23:36,449 --> 00:23:38,615 cuántos elementos voy a tener que tocar total de? 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 Así que puedo expresar esto, sólo para ser un poco de fantasía, 525 00:23:42,790 --> 00:23:44,430 como el tiempo de funcionamiento en general. 526 00:23:44,430 --> 00:23:51,140 T (n) es el tiempo de duración de T (n / 2), además de T (n / 2), la mitad izquierda y la mitad derecha, 527 00:23:51,140 --> 00:23:55,360 además de O (n), que es probablemente n pasos, pero tal vez, si estoy usando dos dedos, 528 00:23:55,360 --> 00:23:57,960 que es el doble que pasos, pero es lineal. 529 00:23:57,960 --> 00:24:00,440 Es cierto número de pasos eso es un factor de n, 530 00:24:00,440 --> 00:24:02,270 por lo que podríamos expresar esto como esta. 531 00:24:02,270 --> 00:24:05,550 Y aquí es donde ahora vamos a Punt a la parte posterior de nuestro libro de texto de matemáticas de la escuela secundaria 532 00:24:05,550 --> 00:24:10,290 estamos que la recurrencia en última instancia termina igualando esto, n log n veces, 533 00:24:10,290 --> 00:24:12,530 si usted hace realmente fuera los cálculos de manera más formal. 534 00:24:12,530 --> 00:24:13,950 >> Así que eso es sólo dos puntos de vista. 535 00:24:13,950 --> 00:24:17,500 Una numéricamente con un duro con código de ejemplo representativo 536 00:24:17,500 --> 00:24:21,140 con ocho números y una más vistazo general a la forma en que llegamos allí. 537 00:24:21,140 --> 00:24:25,670 Pero lo que es realmente interesante aquí es, de nuevo, esta noción de ciclismo. 538 00:24:25,670 --> 00:24:26,900 No estoy usando para bucles. 539 00:24:26,900 --> 00:24:29,860 Soy una especie de definición algo en términos de sí mismo, 540 00:24:29,860 --> 00:24:31,950 no sólo con esta función matemática, 541 00:24:31,950 --> 00:24:34,860 sino también en términos de este pseudo código. 542 00:24:34,860 --> 00:24:38,260 Esta pseudo código es recursiva en que dos de sus líneas 543 00:24:38,260 --> 00:24:42,310 está esencialmente diciendo que se vaya utilice a sí mismo para resolver un menor 544 00:24:42,310 --> 00:24:45,400 problema de tamaño más pequeño, y luego otra vez y otra vez 545 00:24:45,400 --> 00:24:48,820 y otra vez hasta que reducir gradualmente hacia a este llamado caso base. 546 00:24:48,820 --> 00:24:52,810 >> Así que vamos a dibujar una realidad más convincente para llevar de la siguiente manera. 547 00:24:52,810 --> 00:24:58,420 Déjame ir en gedit y tomo un ver algunas de código fuente actual, 548 00:24:58,420 --> 00:24:59,930 en particular, este ejemplo aquí. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, que aparentemente añade los números del uno al n. 550 00:25:03,709 --> 00:25:05,750 Así que vamos a ver lo que es familiar y desconocido aquí. 551 00:25:05,750 --> 00:25:08,690 En primer lugar tenemos un par de incluye, así que nada nuevo. 552 00:25:08,690 --> 00:25:09,190 Prototype. 553 00:25:09,190 --> 00:25:11,370 Estoy un poco confusa en esto después de pocos días, 554 00:25:11,370 --> 00:25:13,790 pero lo dijimos una prototipo de una función es? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 AUDIENCIA: [inaudible]. 557 00:25:16,015 --> 00:25:16,905 ALTAVOZ 1: ¿Qué es eso? 558 00:25:16,905 --> 00:25:17,800 AUDIENCIA: Anunciamos ella. 559 00:25:17,800 --> 00:25:18,883 ALTAVOZ 1: Anunciamos ella. 560 00:25:18,883 --> 00:25:22,290 Así que usted está enseñando Clang, hey, no la aplicación real de esto todavía, 561 00:25:22,290 --> 00:25:25,740 pero en algún lugar de este archivo, presumiblemente, va a ser una función llamada qué? 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 Y esto es sólo una promesa que que va a tener este aspecto. 565 00:25:30,540 --> 00:25:33,720 Va a tomar un entero como Entrada-- y puedo ser más explícito 566 00:25:33,720 --> 00:25:36,570 y decir int n --y es va a devolver un int, 567 00:25:36,570 --> 00:25:39,900 pero medio punto y coma, mm, voy a llegar alrededor de a la implementación de este un poco más tarde. 568 00:25:39,900 --> 00:25:40,989 Una vez más, Clang es tonto. 569 00:25:40,989 --> 00:25:43,280 Sólo va a saber lo que le dices que arriba a abajo, 570 00:25:43,280 --> 00:25:45,765 así que tenemos que dar por lo menos es un indicio de lo que está por venir. 571 00:25:45,765 --> 00:25:47,330 >> Ahora echemos un vistazo a principal aquí. 572 00:25:47,330 --> 00:25:50,040 Vamos a desplazarse hasta aquí y ver lo principal está haciendo. 573 00:25:50,040 --> 00:25:53,780 No es que a largo de una función, y de hecho, el constructo aquí es familiar. 574 00:25:53,780 --> 00:25:57,590 Declaro una variable n, y luego Me molestan al usuario una y otra vez 575 00:25:57,590 --> 00:26:01,880 para un entero positivo utilizando getInt, y única salida de este bucle 576 00:26:01,880 --> 00:26:03,280 una vez que el usuario ha cumplido. 577 00:26:03,280 --> 00:26:05,670 Do While, que hemos utilizado para molestar al usuario de esa manera. 578 00:26:05,670 --> 00:26:06,670 Ahora esto es interesante. 579 00:26:06,670 --> 00:26:08,510 Declaro un int llamada "respuesta". 580 00:26:08,510 --> 00:26:11,420 Asigno que el valor de retorno de una función llamada "sigma". 581 00:26:11,420 --> 00:26:15,200 No sé lo que eso hace todavía, pero Me acuerdo que declara que hace un momento. 582 00:26:15,200 --> 00:26:18,310 Y entonces yo estoy pasando en el valor que el usuario escribió en, n, 583 00:26:18,310 --> 00:26:20,420 y luego informo la respuesta. 584 00:26:20,420 --> 00:26:22,260 Bueno, vamos a retroceder sólo por un momento. 585 00:26:22,260 --> 00:26:28,620 Vamos a seguir adelante en este directorio, hacen sigma 0, y en realidad ejecutar este programa 586 00:26:28,620 --> 00:26:30,490 y ver qué pasa. 587 00:26:30,490 --> 00:26:35,930 Así que si sigo adelante y correr este programa, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 y escribo en un positivo entero como dos, Sigma, 589 00:26:40,139 --> 00:26:43,180 como el símbolo griego lo indica, es sólo va a sumar todos los números del 590 00:26:43,180 --> 00:26:44,320 cero en un máximo de dos. 591 00:26:44,320 --> 00:26:46,560 Así 0 más 1 más 2. 592 00:26:46,560 --> 00:26:48,830 Así que espero que este debe darme 3. 593 00:26:48,830 --> 00:26:49,750 Eso es todo lo que está haciendo. 594 00:26:49,750 --> 00:26:52,690 Y del mismo modo, si se me acaba el mensaje y le doy el número tres, 595 00:26:52,690 --> 00:26:56,721 eso es 3 más 2, por lo que es 5, más 1 me debería dar 6. 596 00:26:56,721 --> 00:26:59,470 Y luego, si me pongo muy loco y empieza a escribir en números más grandes, 597 00:26:59,470 --> 00:27:01,290 me debería dar sumas cada vez más grandes. 598 00:27:01,290 --> 00:27:02,250 Así que eso es todo. 599 00:27:02,250 --> 00:27:04,010 >> Entonces, ¿qué sigma parece? 600 00:27:04,010 --> 00:27:05,430 Bueno, es bastante sencillo. 601 00:27:05,430 --> 00:27:08,940 Es la forma en que podríamos haber implementado esto para el último par de semanas. 602 00:27:08,940 --> 00:27:11,120 "Int" va a ser el tipo de retorno. 603 00:27:11,120 --> 00:27:14,330 Sigma es el nombre, y se necesita una variable m en lugar de n. 604 00:27:14,330 --> 00:27:15,940 Cambiaré que encima de la tapa. 605 00:27:15,940 --> 00:27:17,340 Entonces esto es sólo una prueba de cordura. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Veremos por qué en un momento. 608 00:27:19,950 --> 00:27:24,220 Ahora declaro otra variable, suma, inicializar a cero. 609 00:27:24,220 --> 00:27:28,140 Entonces tengo este bucle For iteración, al parecer, para mayor claridad, 610 00:27:28,140 --> 00:27:33,810 desde i = 1 hasta en un = m, que es cualquiera que sea el usuario escribió en, y luego me 611 00:27:33,810 --> 00:27:35,690 incrementar la suma de esta manera. 612 00:27:35,690 --> 00:27:37,360 Y a continuación, devolver la suma. 613 00:27:37,360 --> 00:27:38,440 >> Así que un par de preguntas. 614 00:27:38,440 --> 00:27:42,370 Uno, me dicen en mi comentario de que esta evita el riesgo de un bucle infinito. 615 00:27:42,370 --> 00:27:45,620 ¿Por qué habría de pasar en un número negativo inducir, potencialmente, un bucle infinito? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> AUDIENCIA: Usted nunca llegará a m. 618 00:27:51,290 --> 00:27:52,880 >> ALTAVOZ 1: Nunca llegar m. 619 00:27:52,880 --> 00:27:55,880 Pero m se pasa, así que vamos a considerar un ejemplo sencillo. 620 00:27:55,880 --> 00:27:58,510 Si m se pasa por el usuario como uno negativo. 621 00:27:58,510 --> 00:28:00,059 Independientemente de principal. 622 00:28:00,059 --> 00:28:01,850 Principal nos protege de esto también, así que estoy solo 623 00:28:01,850 --> 00:28:04,680 siendo muy anal con sigma también cerciorarse 624 00:28:04,680 --> 00:28:06,540 que la entrada no puede ser negativo. 625 00:28:06,540 --> 00:28:10,130 Así que si m es negativo, algo así como una cosa negativa. 626 00:28:10,130 --> 00:28:11,930 ¿Qué va a pasar? 627 00:28:11,930 --> 00:28:14,390 Bueno, va a que éste se inicia a uno, 628 00:28:14,390 --> 00:28:19,060 y luego me va a ser menos de o igual a m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Colocarse. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 Eso fue-- no vamos, vamos a Nix esta historia. 633 00:28:29,370 --> 00:28:32,780 Yo no pedí esa pregunta, porque el riesgo de que aludo 634 00:28:32,780 --> 00:28:38,360 no va a suceder porque i es siempre va ser mayor Aceptar que--, 635 00:28:38,360 --> 00:28:39,871 Me retracto de que se trate. 636 00:28:39,871 --> 00:28:40,370 Okay. 637 00:28:40,370 --> 00:28:42,030 Vamos a centrarnos sólo en esta parte aquí. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 ¿Por qué me declaro algunos fuera del bucle? 640 00:28:48,830 --> 00:28:52,010 Aviso sobre la línea 49 no tengo i declarada dentro del bucle, 641 00:28:52,010 --> 00:28:54,950 pero en línea 48 que he declarado algunos de fuera. 642 00:28:54,950 --> 00:28:55,695 Sí. 643 00:28:55,695 --> 00:28:56,611 AUDIENCIA: [inaudible]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 ALTAVOZ 1: Seguro. 646 00:28:59,400 --> 00:29:03,360 Así que, ante todo, yo desde luego no lo hago querer declarar e inicializar suma 647 00:29:03,360 --> 00:29:06,130 a cero en el interior de la bucle en cada iteración, 648 00:29:06,130 --> 00:29:09,370 porque esto iría en contra de la claridad propósito de resumir los números. 649 00:29:09,370 --> 00:29:11,770 Me gustaría mantener el cambio el valor a cero. 650 00:29:11,770 --> 00:29:17,992 Y también, lo que es otra más arcana razón de esa misma decisión de diseño? 651 00:29:17,992 --> 00:29:18,954 Sí. 652 00:29:18,954 --> 00:29:20,279 >> AUDIENCIA: [inaudible]. 653 00:29:20,279 --> 00:29:21,070 ALTAVOZ 1: Exactamente. 654 00:29:21,070 --> 00:29:24,060 Quiero acceder a ella fuera del bucle demasiado en qué línea? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 En 53. 657 00:29:26,400 --> 00:29:29,910 Y en base a nuestra regla de oro desde hace un par de conferencias, 658 00:29:29,910 --> 00:29:33,680 variables que están en el ámbito, de verdad, a la llaves que ellos abarcan. 659 00:29:33,680 --> 00:29:38,190 Así que si no declaro suma dentro de estas llaves exteriores, 660 00:29:38,190 --> 00:29:40,250 Yo no lo puedo usar en la línea 53. 661 00:29:40,250 --> 00:29:43,160 Dicho de otra manera, si yo declaré suma aquí, o incluso dentro de la 662 00:29:43,160 --> 00:29:45,410 Para bucle, no podía acceder a él en el 53. 663 00:29:45,410 --> 00:29:47,150 La variable efectivamente se habría ido. 664 00:29:47,150 --> 00:29:48,579 Así que un par de razones allí. 665 00:29:48,579 --> 00:29:50,370 Pero ahora vamos a volver y ver qué pasa. 666 00:29:50,370 --> 00:29:51,730 Así sigma se llama. 667 00:29:51,730 --> 00:29:55,640 Se suma 1 más 2 o 1 más 2 más 3, y luego devuelve el valor, 668 00:29:55,640 --> 00:29:59,660 almacena en respuesta, y printf aquí es por lo que estoy viendo en la pantalla. 669 00:29:59,660 --> 00:30:03,079 Así que esto es lo que vamos a llamar a un proceso iterativo enfoque, donde iteración sólo 670 00:30:03,079 --> 00:30:03,870 significa usar un bucle. 671 00:30:03,870 --> 00:30:06,900 Un bucle For, un bucle while, un Do While bucle, simplemente hacer algo nuevo 672 00:30:06,900 --> 00:30:08,380 y una y otra vez. 673 00:30:08,380 --> 00:30:13,505 >> Pero sigma es una especie de función ordenada en que podría poner en práctica de manera diferente. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 ¿Qué pasa con esto, que sólo para ser una especie de fresco, 676 00:30:19,120 --> 00:30:21,880 permítanme realmente deshago de una gran cantidad de distracción 677 00:30:21,880 --> 00:30:24,380 porque esta función es realmente muy simple. 678 00:30:24,380 --> 00:30:27,780 Vamos a reducir gradualmente hacia abajo apenas a sus cuatro líneas básicas 679 00:30:27,780 --> 00:30:30,410 y deshacerse de toda la comentarios y llaves. 680 00:30:30,410 --> 00:30:34,334 Esta es una especie de alucinante implementación alternativa. 681 00:30:34,334 --> 00:30:37,250 Está bien, tal vez no alucinante, pero es un poco más sexy, de acuerdo, 682 00:30:37,250 --> 00:30:39,920 ver esta mucho más sucinta. 683 00:30:39,920 --> 00:30:43,120 Con sólo cuatro líneas de código, La primera vez que tengo esta prueba de cordura. 684 00:30:43,120 --> 00:30:45,732 Si m es menor que o igual a cero, sigma no tiene sentido. 685 00:30:45,732 --> 00:30:48,190 Sólo se supone que es en este caso para los números positivos, 686 00:30:48,190 --> 00:30:50,340 así que sólo voy a devolver cero arbitrariamente 687 00:30:50,340 --> 00:30:53,210 de manera que al menos tenemos algunos llamado caso base. 688 00:30:53,210 --> 00:30:54,430 >> Pero aquí está la belleza. 689 00:30:54,430 --> 00:30:59,930 La totalidad de esta idea, añadiendo la números del 1 al n, m, o en este caso, 690 00:30:59,930 --> 00:31:02,630 se puede hacer por la clase de pasar la pelota. 691 00:31:02,630 --> 00:31:04,947 Bueno, ¿cuál es la suma de 1 a m? 692 00:31:04,947 --> 00:31:05,780 Bueno, ¿sabes qué? 693 00:31:05,780 --> 00:31:11,949 Es lo mismo que la suma de m más la suma de 1 m de menos 1. 694 00:31:11,949 --> 00:31:12,740 Pues ¿sabes qué? 695 00:31:12,740 --> 00:31:13,940 ¿Qué hay de sigma m menos 1? 696 00:31:13,940 --> 00:31:17,860 Bueno, si usted sigue este tipo de lógicamente, es el mismo que m menos 1 697 00:31:17,860 --> 00:31:21,415 además de sigma m menos 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Así que usted puede tipo de solo-- esto es como, si eres 700 00:31:26,012 --> 00:31:28,220 tratando de molestar a un amigo y te hacen una pregunta, 701 00:31:28,220 --> 00:31:31,344 que clase de responder con una pregunta, usted puede tipo de mantener escurrir el bulto. 702 00:31:31,344 --> 00:31:34,560 Pero lo que es clave es que si se mantiene haciendo la pregunta más y más pequeña 703 00:31:34,560 --> 00:31:36,910 y más pequeño, usted es no pedir lo que es sigma 704 00:31:36,910 --> 00:31:39,116 de n, lo que es de sigma n, lo que es sigma de n? 705 00:31:39,116 --> 00:31:40,990 Le estás preguntando cuál es sigma de n, lo que es sigma 706 00:31:40,990 --> 00:31:42,839 n de menos 1, lo que es de sigma n menos 2? 707 00:31:42,839 --> 00:31:44,880 Eventualmente su pregunta va a ser qué? 708 00:31:44,880 --> 00:31:50,250 ¿Qué es la sigma de uno o cero, un valor muy pequeño, 709 00:31:50,250 --> 00:31:52,220 y tan pronto como se conseguir que, a su amigo, 710 00:31:52,220 --> 00:31:54,350 usted no va a pedir la misma pregunta de nuevo, 711 00:31:54,350 --> 00:31:55,975 sólo vamos a decir, oh es cero. 712 00:31:55,975 --> 00:31:58,490 Hemos terminado de jugar este tipo de juego cíclico estúpido. 713 00:31:58,490 --> 00:32:02,950 >> Así que la recursividad es el acto en la programación de una función que se hace llamar. 714 00:32:02,950 --> 00:32:06,630 Este programa, cuando se compila y ejecuta, es va a comportarse de la misma manera, 715 00:32:06,630 --> 00:32:09,620 pero lo que es clave es que en el interior de una función llamada sigma, 716 00:32:09,620 --> 00:32:13,150 hay una línea de código en el que que llamamos nosotros mismos, 717 00:32:13,150 --> 00:32:14,980 que normalmente sería malo. 718 00:32:14,980 --> 00:32:21,160 Por ejemplo, ¿qué pasa si yo primero compilado esta, así que sigma-- 719 00:32:21,160 --> 00:32:22,710 hacer sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Entero positivo, por favor, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Así que lo que la función parece ser, basado en una prueba, correcta. 723 00:32:30,810 --> 00:32:34,917 Pero lo que si me da un poco peligroso y eliminar el llamado caso base, 724 00:32:34,917 --> 00:32:37,750 y acabo de decir, bueno, yo sólo estoy haciendo esto más complicado de lo que es. 725 00:32:37,750 --> 00:32:42,450 Vamos a computar el sigma tomando m y después añadiendo 726 00:32:42,450 --> 00:32:44,564 en sigma de m menos uno? 727 00:32:44,564 --> 00:32:45,980 Bueno, ¿qué va a pasar aquí? 728 00:32:45,980 --> 00:32:47,140 Vamos a alejar. 729 00:32:47,140 --> 00:32:52,920 Vamos a volver a compilar el programa, guardarlo, volver a compilar el programa, 730 00:32:52,920 --> 00:33:00,450 y entonces listo ./sigma-1 el zoom, introducir entero positivo favor, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 ¿Cuántos de ustedes están dispuestos a confesar a ver eso? 733 00:33:04,430 --> 00:33:04,950 >> Okay. 734 00:33:04,950 --> 00:33:06,690 Así que esto puede suceder por una serie de razones, 735 00:33:06,690 --> 00:33:09,148 y, francamente, esta semana estamos a punto de darle más de ellos. 736 00:33:09,148 --> 00:33:11,780 Pero en este caso, intente para razonar hacia atrás 737 00:33:11,780 --> 00:33:14,430 lo que podría haber sucedido aquí? 738 00:33:14,430 --> 00:33:17,400 Fallo de segmentación, dijimos última tiempo, se refiere a un segmento de memoria. 739 00:33:17,400 --> 00:33:18,690 Algo malo ha pasado. 740 00:33:18,690 --> 00:33:21,550 Pero ¿qué era mecánicamente que salió mal 741 00:33:21,550 --> 00:33:25,000 aquí debido a mi retirada de que el llamado caso base, 742 00:33:25,000 --> 00:33:26,870 donde volví un valor codificado? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 ¿Qué crees que salió mal? 745 00:33:30,460 --> 00:33:31,219 Sí. 746 00:33:31,219 --> 00:33:32,135 >> AUDIENCIA: [inaudible]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 ALTAVOZ 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Buena pregunta. 750 00:33:37,550 --> 00:33:39,508 Así que el tamaño del número que estaba resumiendo 751 00:33:39,508 --> 00:33:41,920 puso tan grande que supera el tamaño del espacio de memoria. 752 00:33:41,920 --> 00:33:44,640 Buena idea, pero no fundamentalmente va a causar un accidente. 753 00:33:44,640 --> 00:33:48,230 Eso podría causar desbordamiento de enteros, donde los bits sólo voltean 754 00:33:48,230 --> 00:33:51,760 y luego confundimos una muy grande número como por un número negativo, 755 00:33:51,760 --> 00:33:53,260 pero que en sí no va a causar un accidente. 756 00:33:53,260 --> 00:33:55,509 Debido a que al final de la día un int es todavía 32 bits. 757 00:33:55,509 --> 00:33:57,640 Usted no va a robar accidentalmente un poco 33a. 758 00:33:57,640 --> 00:33:58,431 Pero un buen pensamiento. 759 00:33:58,431 --> 00:33:58,984 Sí. 760 00:33:58,984 --> 00:33:59,900 >> AUDIENCIA: [inaudible]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 ALTAVOZ 1: El método nunca deja de correr, 763 00:34:02,300 --> 00:34:06,658 y he aquí que se llama de nuevo y una y otra vez y otra vez 764 00:34:06,658 --> 00:34:08,449 y otra vez, y ninguno de esas funciones cada vez 765 00:34:08,449 --> 00:34:13,310 terminar porque su única línea de código si misma llama una y otra vez 766 00:34:13,310 --> 00:34:14,219 y otra vez. 767 00:34:14,219 --> 00:34:16,080 Y lo que es realmente pasando aquí, y ahora nos 768 00:34:16,080 --> 00:34:18,100 puede dibujar este tipo de ilustraciones. 769 00:34:18,100 --> 00:34:20,899 Déjame ir a un foto por un momento. 770 00:34:20,899 --> 00:34:22,940 Esta es una imagen, que eventualmente dar cuerpo a 771 00:34:22,940 --> 00:34:26,336 con más detalle, de lo que está pasando dentro de la memoria del equipo. 772 00:34:26,336 --> 00:34:28,460 Y resulta que en la parte inferior de esta imagen 773 00:34:28,460 --> 00:34:29,709 es algo que se llama la pila. 774 00:34:29,709 --> 00:34:31,920 Se trata de un trozo de memoria, un trozo de memoria RAM, 775 00:34:31,920 --> 00:34:33,920 eso es sólo utilizan cualquier momento una función es llamada. 776 00:34:33,920 --> 00:34:36,239 Cada vez que, un programador, llamar a una función, 777 00:34:36,239 --> 00:34:38,860 el sistema operativo, como Mac OS, Windows, o Linux, 778 00:34:38,860 --> 00:34:41,920 agarra un puñado de bytes, tal vez un pocos kilobytes, tal vez pocos megabytes 779 00:34:41,920 --> 00:34:44,590 de la memoria, los entrega a usted y, a continuación, le permite 780 00:34:44,590 --> 00:34:47,650 ejecuta su función utilizando lo variables que usted necesita. 781 00:34:47,650 --> 00:34:50,699 Y si luego llamar a otro la función y la otra función, 782 00:34:50,699 --> 00:34:53,590 le da otra rebanada de memoria y otra rebanada de memoria. 783 00:34:53,590 --> 00:34:57,090 >> Y de hecho, si estas bandejas verdes de Annenberg representar esa memoria, 784 00:34:57,090 --> 00:34:59,870 esto es lo que sucede el primer vez que se llame a la función sigma. 785 00:34:59,870 --> 00:35:04,510 Es como poner una bandeja como ésta en lo que es inicialmente una pila vacía. 786 00:35:04,510 --> 00:35:07,142 Pero entonces, si esa bandeja llama a sí mismo, por así decirlo, 787 00:35:07,142 --> 00:35:08,850 llamar a otra instancia de sigma, eso es 788 00:35:08,850 --> 00:35:11,640 como preguntar el sistema operativo, ooh, necesitará un poco más de memoria, 789 00:35:11,640 --> 00:35:12,520 dame eso. 790 00:35:12,520 --> 00:35:14,840 Y entonces se apilan en la parte superior. 791 00:35:14,840 --> 00:35:18,030 Pero lo que es clave aquí es que la primera bandeja está todavía allí, 792 00:35:18,030 --> 00:35:20,620 porque él invocó esta segunda bandeja. 793 00:35:20,620 --> 00:35:23,500 Ahora mientras tanto, sigma llaman sigma, eso es como pedir más memoria. 794 00:35:23,500 --> 00:35:25,830 Obtiene apilados por aquí. 795 00:35:25,830 --> 00:35:29,350 sigma llamar sigma, esa es otra bandeja que consigue apilados en aquí. 796 00:35:29,350 --> 00:35:32,942 Y si sigues haciendo esto, finalmente, una especie de mapa de esta visual 797 00:35:32,942 --> 00:35:35,525 a esa carta, lo que va a ocurrir con la pila de bandejas? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Se va a exceder la cantidad de memoria el equipo tiene. 800 00:35:41,160 --> 00:35:45,790 Y tan pronto como esta bandeja verde excede la línea horizontal 801 00:35:45,790 --> 00:35:49,410 por encima de la pila y por encima de esa palabra montón, que vamos a volver en el futuro, 802 00:35:49,410 --> 00:35:50,410 eso es una mala cosa. 803 00:35:50,410 --> 00:35:52,810 El montón es una diferente segmento de la memoria, 804 00:35:52,810 --> 00:35:55,190 y si dejas que estos bandejas de pila y pila en, 805 00:35:55,190 --> 00:35:57,800 usted va a superar su propio segmento de la memoria, 806 00:35:57,800 --> 00:36:00,420 y un programa está de hecho va a estrellar. 807 00:36:00,420 --> 00:36:02,930 >> Ahora como un aparte, esta idea de la recursión, por lo tanto, 808 00:36:02,930 --> 00:36:06,500 puede conducir a problemas claramente, pero no es necesariamente una mala cosa. 809 00:36:06,500 --> 00:36:08,840 Debido a considerar, después de todo, y tal vez cómo-- 810 00:36:08,840 --> 00:36:11,700 esto toma algún tiempo acostumbrarse a --¿Cómo elegante o lo simple 811 00:36:11,700 --> 00:36:14,890 que la aplicación de sigma fue. 812 00:36:14,890 --> 00:36:17,440 Y no vamos a utilizar recursividad casi nada en CS50, 813 00:36:17,440 --> 00:36:20,780 pero en CS51, y realmente cualquier clase donde se manipulan estructuras de datos 814 00:36:20,780 --> 00:36:23,640 como árboles o árboles de la familia, que tienen cierta jerarquía, 815 00:36:23,640 --> 00:36:26,000 es super, super útil. 816 00:36:26,000 --> 00:36:29,750 Ahora, como un aparte, de modo que usted como aspirantes a científicos de la computación 817 00:36:29,750 --> 00:36:33,180 están familiarizados con algunos de Google de bromas internas, si usted va a Google 818 00:36:33,180 --> 00:36:36,345 y usted mira para arriba lo que es la definición de, por ejemplo, la recursividad, escriba. 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 Como acotación al margen, me detuve unos pocos. 822 00:36:42,670 --> 00:36:45,470 Esto fue como de 10 minutos de la dilación de esta mañana. 823 00:36:45,470 --> 00:36:52,890 Si también Google "torcida" aviso inclinando la cabeza slightly-- 824 00:36:52,890 --> 00:36:55,120 y entonces éste es quizás más atroz de todos 825 00:36:55,120 --> 00:36:57,286 ya que alguien pasó como su día de la aplicación de esta 826 00:36:57,286 --> 00:36:59,880 algunos años ago-- vamos. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, espera-- eso es un error. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Así que se ejecuta en uno de los mayores sitios web del mundo 831 00:37:11,410 --> 00:37:13,510 son estos estúpidos pequeños huevos de Pascua. 832 00:37:13,510 --> 00:37:16,690 Probablemente consumen una número no trivial de líneas de código 833 00:37:16,690 --> 00:37:19,280 sólo para que podamos tener pequeñas cosas divertidas como esas. 834 00:37:19,280 --> 00:37:22,140 Pero por lo menos ahora usted consigue algunas de esas bromas. 835 00:37:22,140 --> 00:37:28,330 >> Ahora echemos un vistazo a algunos de los blanco se encuentra que hemos estado diciendo en los últimos tiempos, 836 00:37:28,330 --> 00:37:30,707 y empezar a pelar algunas capas técnicamente 837 00:37:30,707 --> 00:37:32,790 de modo que usted realmente entiende lo que ha estado pasando 838 00:37:32,790 --> 00:37:34,860 y se puede entender algunas de las amenazas, 839 00:37:34,860 --> 00:37:38,060 como Shellshock, que Ahora han comenzado a convertirse en 840 00:37:38,060 --> 00:37:41,110 en la vanguardia de todo el mundo de atención, al menos en los medios de comunicación. 841 00:37:41,110 --> 00:37:45,810 Así que aquí es una función muy simple que devuelve nada, el vacío. 842 00:37:45,810 --> 00:37:46,790 Su nombre es de intercambio. 843 00:37:46,790 --> 00:37:50,880 Se necesita en dos variables y no devuelve nada. 844 00:37:50,880 --> 00:37:52,260 Toma en ay b. 845 00:37:52,260 --> 00:37:53,337 Así que una demostración rápida. 846 00:37:53,337 --> 00:37:54,170 Trajimos estos. 847 00:37:54,170 --> 00:37:56,100 Puede ser que también tome un poco romper aquí por un momento 848 00:37:56,100 --> 00:37:57,250 y tener un poco de algo para beber. 849 00:37:57,250 --> 00:38:00,120 Si a alguien no le importaría unirse me hasta aquí por un momento. 850 00:38:00,120 --> 00:38:01,830 ¿Qué tal si en la camisa marrón? 851 00:38:01,830 --> 00:38:02,335 Vamos arriba. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Sólo la de hoy. 854 00:38:05,260 --> 00:38:06,251 Gracias, sin embargo. 855 00:38:06,251 --> 00:38:08,000 Muy bien, y tenemos viene que aquí? 856 00:38:08,000 --> 00:38:08,660 Cuál es tu nombre? 857 00:38:08,660 --> 00:38:09,360 >> ALTAVOZ 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> ALTAVOZ 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Vamos arriba. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Así que Laura, muy simple desafío de hoy. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Encantado de conocerte yo. 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 Así que tenemos un poco de leche aquí y tenemos un poco de jugo de naranja por aquí 867 00:38:21,179 --> 00:38:23,345 y algunas tazas que nos tomado de Annenberg hoy. 868 00:38:23,345 --> 00:38:24,178 >> ALTAVOZ 4: Borrowed. 869 00:38:24,178 --> 00:38:27,240 ALTAVOZ 1: Y va a seguir adelante y le dará la mitad de un vaso de esto. 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 Y le daremos la mitad un vaso de leche. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Ah, y para que pueda recuerde cómo era esto, 875 00:38:35,890 --> 00:38:38,860 Me acordé de traer esto y en la actualidad. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Bueno. 878 00:38:42,530 --> 00:38:45,470 Si no te importa, vamos a ver, nos puede ponerlos en sus propias gafas 879 00:38:45,470 --> 00:38:46,560 si quieres. 880 00:38:46,560 --> 00:38:48,710 Este va a ser el mundo desde los ojos de Laura. 881 00:38:48,710 --> 00:38:49,210 Bien. 882 00:38:49,210 --> 00:38:53,820 Así que su objetivo, le dieron dos tazas de líquido aquí, leche y zumo de naranja, 883 00:38:53,820 --> 00:38:58,370 se intercambie los dos contenidos de forma que el jugo de naranja va a la taza de leche 884 00:38:58,370 --> 00:39:00,710 y la leche entra en la taza de jugo de naranja. 885 00:39:00,710 --> 00:39:02,359 >> ALTAVOZ 4: ¿Tengo otra taza? 886 00:39:02,359 --> 00:39:05,650 ALTAVOZ 1: Estoy tan bueno que lo preguntas, aunque habría sido mucho mejor material de archivo 887 00:39:05,650 --> 00:39:06,710 si no hubieras preguntado. 888 00:39:06,710 --> 00:39:10,620 Pero sí, podemos ofrecerle una tercera vaso que está vacía, por supuesto. 889 00:39:10,620 --> 00:39:11,120 Bien. 890 00:39:11,120 --> 00:39:12,300 Así que cambiar el contenido allí. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Muy agradable. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Muy buena. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Estás haciendo esto muy cuidadosamente. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 Y el tercer paso. 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 Excelente. 902 00:39:31,930 --> 00:39:33,930 Un gran aplauso sería bueno para 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 Tenemos un pequeño regalo de despedida para usted, pero quiero aprovechar estos. 906 00:39:40,790 --> 00:39:42,620 Muchas gracias. 907 00:39:42,620 --> 00:39:46,170 Así, un ejemplo sencillo, sin embargo, para demostrar que si lo hace 908 00:39:46,170 --> 00:39:48,300 querer cambiar el contenido de dos contenedores, 909 00:39:48,300 --> 00:39:52,360 o vamos a llamarlos las variables, necesitas algo de almacenamiento temporal 910 00:39:52,360 --> 00:39:56,710 para organizar uno de los contenidos en la que en realidad se puede hacer el canje. 911 00:39:56,710 --> 00:40:01,790 Así que de hecho, el código fuente aquí en C es representante de exactamente eso. 912 00:40:01,790 --> 00:40:06,340 Si el zumo de naranja era una y la leche era b, y queríamos cambiar los dos, 913 00:40:06,340 --> 00:40:08,990 usted podría intentar algo creativo mediante el vertido de una en la otra, 914 00:40:08,990 --> 00:40:11,031 pero que probablemente no lo haría terminar particularmente bien. 915 00:40:11,031 --> 00:40:15,260 Y por lo que utilizar una taza tercera, llamada que tmp, T-M-P por convención, 916 00:40:15,260 --> 00:40:19,370 y poner el contenido del DO en que, a continuación, intercambiar una taza, 917 00:40:19,370 --> 00:40:22,610 a continuación, poner la DO en el taza original, de ese modo 918 00:40:22,610 --> 00:40:25,320 lograr, exactamente como se Laura hizo, el canje. 919 00:40:25,320 --> 00:40:26,850 >> Así que vamos a hacer exactamente eso. 920 00:40:26,850 --> 00:40:30,110 Déjame ir adelante y abrir hasta un ejemplo de que es 921 00:40:30,110 --> 00:40:32,720 llama en realidad "no cambiar, "porque esto no es 922 00:40:32,720 --> 00:40:36,180 como un simple hecho como usted podría pensar. 923 00:40:36,180 --> 00:40:41,190 Así que en este programa, observe que Estoy usando stdio.h, nuestro viejo amigo. 924 00:40:41,190 --> 00:40:43,130 Tengo el prototipo para swap ahí arriba, que 925 00:40:43,130 --> 00:40:45,450 significa la aplicación de probablemente por debajo, 926 00:40:45,450 --> 00:40:48,050 y vamos a ver lo que este principal programa va a hacer por mí. 927 00:40:48,050 --> 00:40:52,020 La primera vez que declaro int x se uno, y int y consigue dos. 928 00:40:52,020 --> 00:40:54,930 Así que pensar en aquellos como DO y leche, respectivamente. 929 00:40:54,930 --> 00:40:57,100 Y entonces yo sólo tengo un printf diciendo x es esta 930 00:40:57,100 --> 00:41:00,120 e y es esto, para que yo pueda ver visualmente lo que está pasando. 931 00:41:00,120 --> 00:41:03,810 Luego he printf reclamando que estoy intercambiando los dos, 932 00:41:03,810 --> 00:41:07,100 y luego imprimo un afirman que están intercambiados, 933 00:41:07,100 --> 00:41:09,300 y yo imprimo x e y otra vez. 934 00:41:09,300 --> 00:41:13,010 Así que aquí en intercambio es exactamente lo que hizo Laura, 935 00:41:13,010 --> 00:41:16,240 y es exactamente lo que vimos en la pantalla hace un momento. 936 00:41:16,240 --> 00:41:19,380 >> Así que vamos a seguir adelante y muy decepcionado. 937 00:41:19,380 --> 00:41:24,690 No nos swap, y ejecutar sin swap, hacer zoom sobre la salida de aquí. 938 00:41:24,690 --> 00:41:28,320 Ingrese x es 1, y es 2, intercambiando intercambiado. 939 00:41:28,320 --> 00:41:32,700 x es todavía 1, e y es todavía 2. 940 00:41:32,700 --> 00:41:37,630 Así que, aunque, francamente, esto parece exactamente igual, aunque de forma más técnica, 941 00:41:37,630 --> 00:41:40,730 Laura lo hizo, no parece funcionar. 942 00:41:40,730 --> 00:41:42,130 Entonces ¿por qué es eso? 943 00:41:42,130 --> 00:41:46,630 Bueno, resulta que cuando escribimos un programa como este 944 00:41:46,630 --> 00:41:51,590 que tiene tanto principal, puesto de relieve aquí, y luego otra función, como canje, 945 00:41:51,590 --> 00:41:54,230 resaltado aquí, lo cual que llama, el mundo 946 00:41:54,230 --> 00:41:57,030 se ve un poco de algo como estas bandejas hace un momento. 947 00:41:57,030 --> 00:42:00,440 Cuando principal primero se vuelve a llamar, eso es como preguntarle sistema operativo 948 00:42:00,440 --> 00:42:04,030 para un poco de memoria para cualquier local de variables como x e y que tiene principal, 949 00:42:04,030 --> 00:42:05,660 y terminan ahí. 950 00:42:05,660 --> 00:42:10,920 Pero si las llamadas principales de intercambio, y principal pasa a intercambiar dos argumentos, a y b, 951 00:42:10,920 --> 00:42:16,410 jugo de naranja y la leche, que no es como entregándole el jugo de naranja y la leche 952 00:42:16,410 --> 00:42:17,500 a Laura. 953 00:42:17,500 --> 00:42:21,300 ¿Qué hace una computadora, ¿es pasa copias del zumo de naranja 954 00:42:21,300 --> 00:42:27,110 y copias de la leche a Laura, por lo que lo que es en última instancia dentro de esta bandeja 955 00:42:27,110 --> 00:42:32,510 es el valor de uno y dos, o DO y leche, pero las copias de los mismos, 956 00:42:32,510 --> 00:42:34,790 de manera que en este punto en la historia, hay 957 00:42:34,790 --> 00:42:36,930 es DO y la leche en cada una de estas bandejas. 958 00:42:36,930 --> 00:42:39,260 Hay un uno y un dos en cada una de estas bandejas, 959 00:42:39,260 --> 00:42:41,720 y la función de intercambio es de hecho trabajando. 960 00:42:41,720 --> 00:42:46,090 Les está intercambiando el interior de la segunda bandeja superior, 961 00:42:46,090 --> 00:42:48,147 pero que el intercambio no tiene impacto. 962 00:42:48,147 --> 00:42:49,980 Y en base a algunas principio básico que hemos 963 00:42:49,980 --> 00:42:52,970 hablado antes, y de hecho Hace tan sólo unos minutos, lo que 964 00:42:52,970 --> 00:42:58,770 podría explicar por qué el cambio a y b en el interior de canje 965 00:42:58,770 --> 00:43:05,560 no tiene efecto en x e y, aunque Pasé x e y para la función de intercambio. 966 00:43:05,560 --> 00:43:08,750 ¿Cuál es la palabra clave aquí que podría explicar de manera simplista? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Creo que he oído aquí? 969 00:43:12,627 --> 00:43:13,335 AUDIENCIA: Retorno. 970 00:43:13,335 --> 00:43:14,085 ALTAVOZ 1: Regreso? 971 00:43:14,085 --> 00:43:14,590 No volver. 972 00:43:14,590 --> 00:43:15,895 Vamos a ir con otra. 973 00:43:15,895 --> 00:43:16,395 Qué es eso? 974 00:43:16,395 --> 00:43:17,080 >> AUDIENCIA: [inaudible]. 975 00:43:17,080 --> 00:43:20,000 >> ALTAVOZ 1: OK, así que pudimos return-- hacer que el trabajo de retorno en la historia, 976 00:43:20,000 --> 00:43:21,914 pero hay una explicación aún más simple. 977 00:43:21,914 --> 00:43:22,580 AUDIENCIA: Ámbito de aplicación. 978 00:43:22,580 --> 00:43:23,288 ALTAVOZ 1: Ámbito de aplicación. 979 00:43:23,288 --> 00:43:24,300 Tomaré alcance. 980 00:43:24,300 --> 00:43:27,290 Así alcance, recordar dónde nuestra xey declarados. 981 00:43:27,290 --> 00:43:30,840 Están declaran dentro de principal hasta aquí. 982 00:43:30,840 --> 00:43:33,200 A y B, por su parte, están declarado efectivamente 983 00:43:33,200 --> 00:43:35,930 dentro de swap, no del todo en las llaves, pero todavía 984 00:43:35,930 --> 00:43:37,690 en el área general de swap. 985 00:43:37,690 --> 00:43:40,560 Y así de hecho, a y b sólo existen dentro de esta bandeja 986 00:43:40,560 --> 00:43:44,850 de Annenberg, este segundo trozo de código. 987 00:43:44,850 --> 00:43:49,500 Así que estamos de hecho el cambio de la copia, pero eso no es realmente tan útil. 988 00:43:49,500 --> 00:43:52,190 >> Así que echemos un vistazo a este nivel un poco más bajo. 989 00:43:52,190 --> 00:43:55,430 Voy a volver a El directorio de origen, 990 00:43:55,430 --> 00:43:58,330 y yo voy a primero zoom aquí, y sólo 991 00:43:58,330 --> 00:44:02,290 para confirmar que estoy en esta ventana de terminal más grande, 992 00:44:02,290 --> 00:44:04,430 el programa todavía se está comportando así. 993 00:44:04,430 --> 00:44:06,840 Supongamos ahora que este no es intencional. 994 00:44:06,840 --> 00:44:10,090 Claramente quería intercambio para trabajo, así que se siente como un bicho. 995 00:44:10,090 --> 00:44:12,780 Ahora podía empezar a añadir un mucha printf de a mi código, 996 00:44:12,780 --> 00:44:16,010 imprimir x aquí, y sobre aquí, una aquí, b por aquí. 997 00:44:16,010 --> 00:44:18,220 Pero, francamente, eso es probablemente lo que que has estado haciendo durante un par de semanas 998 00:44:18,220 --> 00:44:20,190 ahora, en horario de oficina y en la casa cuando se trabaja 999 00:44:20,190 --> 00:44:22,150 en conjuntos de procesadores tratando de encontrar algunos errores. 1000 00:44:22,150 --> 00:44:25,560 Pero vas a ver, si no lo ha hecho, ese problema se establecieron tres que introduce 1001 00:44:25,560 --> 00:44:31,630 a un comando llamado GDB, donde GDB, GNU debugger, 1002 00:44:31,630 --> 00:44:34,040 tiene en sí un montón de características que realmente puede 1003 00:44:34,040 --> 00:44:38,160 vamos a entender situaciones como éste, pero más convincente, 1004 00:44:38,160 --> 00:44:39,940 resolver problemas y encontrar errores. 1005 00:44:39,940 --> 00:44:40,940 Así que voy a hacer esto. 1006 00:44:40,940 --> 00:44:44,770 En lugar de ./noswap, estoy en su lugar va a correr GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 En otras palabras, voy a dirigir mi programa no en Bash, nuestro nuevo amigo 1009 00:44:51,200 --> 00:44:51,850 hoy en día. 1010 00:44:51,850 --> 00:44:53,970 Voy a llevar mi programa noswap interior 1011 00:44:53,970 --> 00:44:56,900 de este otro programa llamado GDB, que es un depurador, que 1012 00:44:56,900 --> 00:45:01,035 es un programa que está diseñado para ayudar a que los seres humanos encontrar y eliminar errores. 1013 00:45:01,035 --> 00:45:03,410 Así que si golpeo Ejecute aquí, hay una cantidad atroz de texto 1014 00:45:03,410 --> 00:45:04,868 que realmente no tiene que leer. 1015 00:45:04,868 --> 00:45:07,290 Básicamente se trata de una distracción desde el símbolo, que 1016 00:45:07,290 --> 00:45:10,030 Voy a golpear Control-L levantarse en la parte superior existe. 1017 00:45:10,030 --> 00:45:11,800 Este es el símbolo del BGF. 1018 00:45:11,800 --> 00:45:15,550 Si quiero ejecutar este programa ahora, como esta pequeña hoja de trucos en la actualidad de 1019 00:45:15,550 --> 00:45:21,860 diapositiva sugiere, Run es la primera Los comandos que nos referíamos a introducir. 1020 00:45:21,860 --> 00:45:25,150 Y yo sólo voy a escribir correr hasta aquí dentro de GDB, 1021 00:45:25,150 --> 00:45:26,811 y de hecho funcionó mi programa. 1022 00:45:26,811 --> 00:45:29,310 Ahora hay un poco de adicional salidas de la pantalla como esta, 1023 00:45:29,310 --> 00:45:31,910 pero eso es sólo estar GDB anal y nos dice lo que está pasando. 1024 00:45:31,910 --> 00:45:34,451 Usted realmente no tiene que preocuparse sobre estos detalles ahora mismo. 1025 00:45:34,451 --> 00:45:36,890 Pero lo que es realmente bueno de GDB, si hago esto nuevo-- 1026 00:45:36,890 --> 00:45:42,100 Control-L despeja el screen-- me dejes ir por delante y el tipo "romper principal", por lo tanto, 1027 00:45:42,100 --> 00:45:45,743 cuando pulso Enter, estableciendo lo que es llamado un punto de quiebre en noswap.c, 1028 00:45:45,743 --> 00:45:51,270 línea 16, que es donde GDB descubierto mi programa de realidad 1029 00:45:51,270 --> 00:45:53,070 Es decir, mi función es en realidad. 1030 00:45:53,070 --> 00:45:55,070 Esta ignoraremos por ahora pero esa es la dirección de 1031 00:45:55,070 --> 00:45:57,310 específicamente en la memoria de esta función. 1032 00:45:57,310 --> 00:46:00,240 Así que ahora cuando me escriba Ejecutar, notar lo que está bien aquí. 1033 00:46:00,240 --> 00:46:05,650 Mi programa se rompe en la línea I dicho GDB para detener la ejecución en. 1034 00:46:05,650 --> 00:46:09,850 Así que no tengo que cambiar ahora mi código, añadir algunos de printf, recompilar, vuelva a ejecutar 1035 00:46:09,850 --> 00:46:13,300 ella, cambiar, añadir algunos de printf, guardarlo, compilarlo, ejecutarlo. 1036 00:46:13,300 --> 00:46:18,100 Yo sólo puedo caminar a través de mi programa paso a paso a paso a la velocidad humana, 1037 00:46:18,100 --> 00:46:20,880 no en Intel-inside tipo de velocidad. 1038 00:46:20,880 --> 00:46:24,580 >> Así que ahora cuenta esta línea aparece aquí, y si vuelvo 1039 00:46:24,580 --> 00:46:27,800 a mi programa en gedit, cuenta de que esto es en realidad 1040 00:46:27,800 --> 00:46:29,280 la primera línea de código. 1041 00:46:29,280 --> 00:46:31,240 Hay línea 16 en gedit. 1042 00:46:31,240 --> 00:46:34,610 Hay línea 16 dentro del BGF, e incluso aunque esta interfaz blanco y negro 1043 00:46:34,610 --> 00:46:37,760 no es tan de usuario amable, esto significa 1044 00:46:37,760 --> 00:46:41,680 esa línea 16 no se ha ejecutado aún, pero está a punto de ser. 1045 00:46:41,680 --> 00:46:46,220 Así que de hecho, si escribo de impresión x, no printf, sólo print x, 1046 00:46:46,220 --> 00:46:50,730 Me sale algún valor falso no de cero, porque x no se ha inicializado todavía. 1047 00:46:50,730 --> 00:46:54,760 Así que voy a escribir a continuación, o, si quiero ser presuntuoso, N para el próximo. 1048 00:46:54,760 --> 00:46:59,090 Pero cuando introduzco siguiente entro, ahora cuenta se pasa a la línea 17. 1049 00:46:59,090 --> 00:47:02,840 Así que, lógicamente, si he ejecutado línea 16 y ahora escribo print x, 1050 00:47:02,840 --> 00:47:03,640 ¿qué debo ver? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 Una. 1053 00:47:05,520 --> 00:47:07,820 >> Y ahora esto es ciertamente confuso. 1054 00:47:07,820 --> 00:47:11,260 $ 2 es sólo una forma elegante de, si desee hacer referencia a ese valor más adelante, 1055 00:47:11,260 --> 00:47:12,510 se puede decir "signo de dólar dos." 1056 00:47:12,510 --> 00:47:13,480 Es como una referencia hacia atrás. 1057 00:47:13,480 --> 00:47:14,570 Pero por ahora, simplemente lo ignoran. 1058 00:47:14,570 --> 00:47:17,070 Lo interesante es lo que hay a la derecha del signo igual. 1059 00:47:17,070 --> 00:47:21,000 Y ahora si escribo la próxima vez y de impresión y, debo ver 2. 1060 00:47:21,000 --> 00:47:23,870 También puedo ahora imprimir x de nuevo, y, francamente, 1061 00:47:23,870 --> 00:47:27,130 si me estoy poniendo un poco confundido en cuanto a donde estoy, puedo tipo de lista para la lista 1062 00:47:27,130 --> 00:47:30,590 y sólo ver un poco de contexto alrededor El punto que estoy realmente en. 1063 00:47:30,590 --> 00:47:35,180 Y ahora puedo escribir siguiente, y no es x 1. 1064 00:47:35,180 --> 00:47:36,300 Ahora escribo siguiente. 1065 00:47:36,300 --> 00:47:37,710 Oh, y es 2. 1066 00:47:37,710 --> 00:47:40,750 Y de nuevo, es confuso, porque la producción del BGF 1067 00:47:40,750 --> 00:47:43,044 está siendo mezclado con mi propia producción. 1068 00:47:43,044 --> 00:47:45,710 Pero si se tiene en cuenta, por mirando hacia atrás y hacia adelante en su código 1069 00:47:45,710 --> 00:47:47,740 o por el que se fuera del lado a lado tal vez, usted 1070 00:47:47,740 --> 00:47:51,020 veo que en realidad sólo soy pasando a través de mi programa. 1071 00:47:51,020 --> 00:47:54,620 >> Pero darse cuenta de lo que sucede a continuación, literalmente. 1072 00:47:54,620 --> 00:47:56,380 Aquí está la línea 22. 1073 00:47:56,380 --> 00:48:01,315 Déjame ir sobre él, moviendo así el a 23, y si imprimo x ahora, sigue siendo uno. 1074 00:48:01,315 --> 00:48:03,890 Y si imprimo y ahora, sigue siendo uno. 1075 00:48:03,890 --> 00:48:05,820 Así que esto no es un ejercicio útil. 1076 00:48:05,820 --> 00:48:07,450 Así que vamos a rehacer este. 1077 00:48:07,450 --> 00:48:10,069 Permítanme volver a la superior y tipo de ejecución de nuevo. 1078 00:48:10,069 --> 00:48:12,110 Y está diciendo que el programa que está siendo depurado 1079 00:48:12,110 --> 00:48:14,109 ha comenzado ya, comenzado desde el principio. 1080 00:48:14,109 --> 00:48:15,420 Sí, vamos a hacer esto de nuevo. 1081 00:48:15,420 --> 00:48:22,000 Y esta vez vamos a hacerlo la próxima, siguiente, siguiente, siguiente, siguiente, 1082 00:48:22,000 --> 00:48:24,180 pero ahora las cosas se ponen interesantes. 1083 00:48:24,180 --> 00:48:27,760 Ahora quiero entrar en intercambio, así que no me escriba a continuación. 1084 00:48:27,760 --> 00:48:34,380 Escribo paso, y ahora notarlo me ha saltado a la línea noswap.c 33. 1085 00:48:34,380 --> 00:48:37,240 Si vuelvo a gedit, lo que es la línea 33? 1086 00:48:37,240 --> 00:48:40,500 Esa es la primera real línea de código dentro de swap. 1087 00:48:40,500 --> 00:48:44,150 Lo cual es bueno, porque ahora puedo tipo de hurgar y sentir curiosidad 1088 00:48:44,150 --> 00:48:46,052 en cuanto a lo que está pasando realmente en ese país. 1089 00:48:46,052 --> 00:48:46,760 Permítanme imprimo 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 ¿Por qué tmp tiene alguna , el valor de la basura falsa loco? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 AUDIENCIA: No se ha inicializado. 1095 00:48:56,120 --> 00:48:57,150 ALTAVOZ 1: No se ha inicializado. 1096 00:48:57,150 --> 00:49:00,270 Y de hecho, cuando se ejecuta un programa, te dan un montón de memoria 1097 00:49:00,270 --> 00:49:03,392 por el sistema operativo, pero no han inicializado ningún valor, 1098 00:49:03,392 --> 00:49:05,600 así que lo que los bits que eres viendo aquí, aunque es 1099 00:49:05,600 --> 00:49:07,770 este gran negativo loco número, sólo significa 1100 00:49:07,770 --> 00:49:10,750 que esos son los restos de cierto uso anterior de que la memoria RAM, 1101 00:49:10,750 --> 00:49:13,050 aunque yo no tengo yo lo necesitaba todavía. 1102 00:49:13,050 --> 00:49:17,086 Así que ahora voy a seguir adelante y tipo siguiente, y si ahora escribo tmp de impresión, 1103 00:49:17,086 --> 00:49:17,835 ¿qué debo ver? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Cualquiera que sea el valor de una era, a es el primer argumento, sólo 1106 00:49:23,360 --> 00:49:25,550 como x fue la primera Lo que se pasa en, 1107 00:49:25,550 --> 00:49:30,450 por lo que una y X debe ser el mismo, así imprimir tmp me debe imprimir una. 1108 00:49:30,450 --> 00:49:36,360 >> Así que lo que usted verá en el conjunto de problemas tres es un tutorial de clases en GDB, 1109 00:49:36,360 --> 00:49:40,020 pero se dan cuenta de que este es el comienzo de un vistazo a una herramienta que lo hará realidad 1110 00:49:40,020 --> 00:49:42,774 ayudarle a resolver problemas de manera mucho más eficaz. 1111 00:49:42,774 --> 00:49:44,690 Lo que estamos en última instancia vamos a hacer el miércoles 1112 00:49:44,690 --> 00:49:48,180 se comenzará a pelar unas pocas capas y eliminar algunas ruedas de entrenamiento. 1113 00:49:48,180 --> 00:49:50,496 Esa cadena cosa llamada que que hemos utilizado durante algún tiempo, 1114 00:49:50,496 --> 00:49:53,370 vamos a tomar poco a poco de que fuera de usted y empezar a hablar de 1115 00:49:53,370 --> 00:49:55,725 algo más esotéricamente conocido como char *, 1116 00:49:55,725 --> 00:49:59,550 pero vamos a hacerlo bien y suavemente al principio, a pesar de que los punteros, 1117 00:49:59,550 --> 00:50:02,730 como se les llama, se puede hacer un poco de cosas muy malas si se abusa, 1118 00:50:02,730 --> 00:50:06,040 mirando un poco de animación con plastilina nuestro amigo Nick Parlante de Stanford 1119 00:50:06,040 --> 00:50:09,670 Universidad, profesor en la computadora la ciencia que armó esta vista previa 1120 00:50:09,670 --> 00:50:11,075 de lo que está por venir este miércoles. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [REPRODUCCIÓN DE VÍDEO] 1123 00:50:13,400 --> 00:50:13,900 Oye, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Despertarse. 1126 00:50:15,780 --> 00:50:17,240 Es tiempo para la diversión puntero. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> ¿Qué es eso? 1129 00:50:19,350 --> 00:50:21,150 Aprenda acerca de los punteros? 1130 00:50:21,150 --> 00:50:22,050 Qué bien! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [FIN REPRODUCCIÓN DE VÍDEO] 1133 00:50:23,730 --> 00:50:25,396 ALTAVOZ 1: Que le espera el miércoles. 1134 00:50:25,396 --> 00:50:26,440 Nos vemos entonces. 1135 00:50:26,440 --> 00:50:27,106 [REPRODUCCIÓN DE VÍDEO] 1136 00:50:27,106 --> 00:50:30,420 -Y Ahora, pensamientos profundos, por Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> Por qué estamos aprendiendo C? 1139 00:50:35,900 --> 00:50:36,785 ¿Por qué no A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Risas] 1142 00:50:40,910 --> 00:50:42,160 >> [FIN REPRODUCCIÓN DE VÍDEO]