WEBVTT 00:00:01.270 --> 00:00:04.570 Ya has visto pequeños trosos de código javascript 00:00:04.570 --> 00:00:08.120 En esta sección, quiero hablar sobre lo que conecta ese mundo 00:00:08.120 --> 00:00:11.432 con el código de máquina en el CPU 00:00:11.432 --> 00:00:13.596 Así que esto será generalmente sobre el tema de los lenguajes informáticos. 00:00:13.596 --> 00:00:18.682 Por lo tanto un programador trabaja en algunos lenguajes de programación. 00:00:18.682 --> 00:00:23.080 Y se dice que los lenguajes de programación tienen funciones de alto nivel. 00:00:23.080 --> 00:00:27.020 Y eso quiere decir, cosas como, bucles (loops), y si las sentencias "if" 00:00:27.020 --> 00:00:30.033 y cadenas (strings) y aquellas facilidades que son más complicadas 00:00:30.033 --> 00:00:32.512 y que están en un simple código de máquina en el CPU. 00:00:32.512 --> 00:00:36.298 Por lo que el programador escribe lo que se denomina código fuente 00:00:36.298 --> 00:00:39.515 en cualquier lenguaje de programación, que estén escribiendo 00:00:39.776 --> 00:00:42.498 Aquí hay un ejemplo de algún código fuente de C++. 00:00:42.498 --> 00:00:45.769 Esto asigna una cadena (string), a una variable y a continuación pone un 00:00:45.769 --> 00:00:48.765 signo de exclamación (!) al final de la cadena. 00:00:48.765 --> 00:00:50.218 Esto es un poco similar al código javascript que hemos visto. 00:00:50.218 --> 00:00:52.465 Todos estos lenguajes a nivel de sintaxis 00:00:52.465 --> 00:00:54.166 son un poco similares. 00:00:54.166 --> 00:01:02.805 Así, um, ¿cómo se consigue que el código fuente de C++, digamos, se ejecute en la CPU? 00:01:02.805 --> 00:01:06.736 una estrategia utiliza lo que se llama un compilador. 00:01:06.736 --> 00:01:09.974 el compilador es un programa separado y lo que el 00:01:09.974 --> 00:01:13.597 compilador hace es que mirar todo el código fuente 00:01:13.597 --> 00:01:18.577 y hace una traducción mayor para crear un gran cuerpo de código máquina. 00:01:18.577 --> 00:01:23.156 Así, por ejemplo, puede ser que haya una parte del código fuente, 00:01:23.156 --> 00:01:26.968 donde hay una instrucción "if" y no hay una 00:01:26.968 --> 00:01:28.922 instrucción específica de código máquina para una instruccion "if" 00:01:28.922 --> 00:01:31.003 pero puede haber una secuencia de 5 instrucciones de código máquina 00:01:31.003 --> 00:01:33.726 que de hecho constituyen una sentencia "if" 00:01:33.726 --> 00:01:36.516 Por lo que el compilador hace ese tipo de expansión. 00:01:36.516 --> 00:01:40.924 Así que, sólo como ejemplo, Firefox está escrito en C++. 00:01:40.924 --> 00:01:47.095 Por lo tanto, para hacer una nueva versión de Firefox, alguien corre 00:01:47.095 --> 00:01:51.910 el compilador de C++ y este lee en los muchos archivos fuentes, 00:01:51.910 --> 00:01:54.594 el "gran cuerpo" de código fuente que conforma a firefox, 00:01:54.594 --> 00:01:57.157 y básicamente produce firefox.exe 00:01:57.157 --> 00:02:00.159 Firefox.exe es la salida del compilador al 00:02:00.159 --> 00:02:03.620 traducir todo ese código fuente. 00:02:03.620 --> 00:02:06.859 Un par de cosas a señalar es que, 00:02:06.859 --> 00:02:09.880 la compilación sólo tiene que pasar una vez. 00:02:09.880 --> 00:02:12.185 Así, algunos cuerpo de código fuente, alguien hace firefox.exe 00:02:12.185 --> 00:02:15.886 y, a continuación, sólo puede enviarse firefox.exe 00:02:15.886 --> 00:02:18.448 Los usuarios finales no necesita el código fuente y 00:02:18.448 --> 00:02:20.610 no necesitan el compilador. Por lo que realmente se realiza la compilación 00:02:20.610 --> 00:02:26.124 en la fábrica, de hecho. Otra característica es 00:02:26.124 --> 00:02:30.382 no funciona al revés. Por lo que yo puedo distribuir firefox.exe 00:02:30.382 --> 00:02:34.296 todas esta máquina código, pero no algo que 00:02:34.296 --> 00:02:36.899 puede leer en e ir hacia atrás para darme un gran cuerpo de código fuente. 00:02:36.899 --> 00:02:38.880 Al menos no perfectamente, puede hacerlo de modo imperfecto. 00:02:38.880 --> 00:02:41.982 Lo ideal, para producir una inversión realmente desea 00:02:41.982 --> 00:02:44.761 el código fuente. Por lo tanto, hablemos sobre el código fuente. 00:02:44.761 --> 00:02:51.948 Por lo tanto, si desea agregar una funcionalidad o corregir un error en firefox, realmente 00:02:51.948 --> 00:02:53.965 la forma de hacerlo es volver al código fuente, 00:02:53.965 --> 00:02:56.592 y repasarlo, sólo una que he hecho en java script. 00:02:56.592 --> 00:02:58.267 Así que añadir unas líneas o un si instrucción para cambiar algunos 00:02:58.267 --> 00:03:01.664 comportamiento de alguna manera, en el código fuente y, a continuación, ejecutar 00:03:01.664 --> 00:03:03.654 el compilador una vez más, de hecho para hacer una nueva versión de 00:03:03.654 --> 00:03:07.143 Firefox que tiene este pequeño cambio que ha puesto 00:03:07.143 --> 00:03:10.971 en el código fuente. Como estamos tomando sobre código fuente, 00:03:10.971 --> 00:03:14.415 Esto también le da un buen sentido de qué abierto 00:03:14.415 --> 00:03:18.870 software de origen significa. Un software de código abierto es una 00:03:18.870 --> 00:03:21.860 formato donde se distribuye el programa, sino también 00:03:21.860 --> 00:03:25.742 no hay acceso al código fuente original, a la 00:03:25.742 --> 00:03:27.735 programa. Y esto viene normalmente con una licencia, 00:03:27.735 --> 00:03:29.714 diciendo: ' Hey, aquí está el código fuente. Si desea 00:03:29.714 --> 00:03:32.879 hacer su propia versión o corregir un error o lo que sea, este programa, 00:03:32.879 --> 00:03:36.755 Siéntase libre. " Eso de las 2 principales características del software de código abierto 00:03:36.755 --> 00:03:42.555 uno, normalmente se distribuye gratuitamente, por lo que saben, su barata. Pero el 00:03:42.555 --> 00:03:45.985 otra característica es que viene con una especie de libertad. 00:03:45.985 --> 00:03:50.945 Porque si el software es un código cerrado y 00:03:50.945 --> 00:03:52.942 desea alguna característica diferente, hay que algunos fallos 00:03:52.942 --> 00:03:55.671 necesario se aplique, usted realmente depende del proveedor, quien tiene la 00:03:55.671 --> 00:03:58.311 código fuente, como bien-do se sienten como aplicación 00:03:58.311 --> 00:04:01.098 ¿esa característica? En contraste con el software de código abierto, 00:04:01.098 --> 00:04:04.182 es como que no hay esposas. El código fuente está disponible, 00:04:04.182 --> 00:04:06.861 y si hay algo que realmente quieres hacer, 00:04:06.861 --> 00:04:10.061 o decir que el proveedor original va fuera del negocio, entonces 00:04:10.061 --> 00:04:15.029 porque tienes el código fuente, usted sabe, usted puede puede ser 00:04:15.029 --> 00:04:17.321 pagar a alguien para hacer un cambio y producir sus propios 00:04:17.321 --> 00:04:19.577 versión personalizada. Por lo que viene con este tipo de profundidad, uh- 00:04:19.577 --> 00:04:21.650 puede considerar como una póliza de seguro. 00:04:21.650 --> 00:04:26.142 A menudo hay muchos tipos diferentes de los términos de licencia 00:04:26.142 --> 00:04:28.796 para un software de código abierto, pero, más a menudo 00:04:28.796 --> 00:04:31.016 requieren en algunos casos, que si usted tomar sus 00:04:31.016 --> 00:04:34.938 código fuente y agregar alguna característica, entonces debe ofrecer 00:04:34.938 --> 00:04:37.564 esos cambios a la comunidad. Así, en el mismo 00:04:37.564 --> 00:04:39.767 manera han beneficiado del otro trabajo, puede beneficiarse de su trabajo. 00:04:39.767 --> 00:04:43.644 Los detalles de cómo se puede hacer es complicado. 00:04:43.644 --> 00:04:45.843 Hay muchas formas diferentes de la misma. 00:04:45.843 --> 00:04:47.530 Me vas a hablar del software de código abierto un 00:04:47.530 --> 00:04:48.856 poco más tarde, sólo menciono esto ahora, 00:04:48.856 --> 00:04:51.187 porque nos da la idea de lo que es el código fuente 00:04:51.187 --> 00:04:54.602 del programa vs sólo tener el archivo .exe de algo. 00:04:54.602 --> 00:05:01.682 Así que hasta el momento hablé acerca de C++, por lo que es esto 00:05:01.682 --> 00:05:04.771 toda otra gran categoría de lenguas, que 00:05:04.771 --> 00:05:07.219 Me va a llamar, lenguajes dinámicos o a veces 00:05:07.219 --> 00:05:11.393 Idiomas de intérprete. Y esto es una especie de una gran prueba 00:05:11.393 --> 00:05:12.436 estrategia y hay muchos idiomas diferentes con 00:05:12.436 --> 00:05:15.234 muchas cualidades diferentes y yo apenas estoy va a ordenar de bulto, 00:05:15.234 --> 00:05:17.156 tumor les en esta gran categoría. 00:05:17.156 --> 00:05:19.453 Ejemplos de lenguajes dinámicos son actualmente Java, 00:05:19.453 --> 00:05:24.390 Secuencia de comandos de Java y Python. Por lo tanto, va a una manera de que estos son 00:05:24.390 --> 00:05:26.506 el trabajo es que se apliquen por lo que se llama 00:05:26.506 --> 00:05:30.293 un intérprete. Supongo que el caso de compilador estaba tomando antes. 00:05:30.293 --> 00:05:36.157 Un intérprete es un programa que toma en código escrito en algún lenguaje 00:05:36.157 --> 00:05:42.729 y tipo de [inaudible] lo ejecuta. El mejor ejemplo es 00:05:42.729 --> 00:05:45.703 hay este lenguaje informático llamado java script, 00:05:45.703 --> 00:05:49.272 que realmente han estado utilizando y navegadores que son web 00:05:49.272 --> 00:05:52.017 incluye programas como una parte de ellos, un java 00:05:52.017 --> 00:05:55.148 intérprete de comandos. Y cuando viene el navegador web 00:05:55.148 --> 00:05:57.471 a través de una página con código java script 00:05:57.471 --> 00:06:00.604 puede utilizar el intérprete para ejecutar ese código para que sea 00:06:00.604 --> 00:06:06.015 hacer todo lo que se va a hacer. Así que la forma del intérprete 00:06:06.015 --> 00:06:10.809 obras son que trata con el programa 1 línea a la vez. 00:06:10.809 --> 00:06:13.892 Así que aquí es un poco de código de secuencia de comandos de java, 00:06:13.892 --> 00:06:16.139 Si el intérprete quería ejecutar este, bien 00:06:16.139 --> 00:06:17.727 se verá en la primera línea y a mirar 00:06:17.727 --> 00:06:19.669 lo que dice esa línea y, a continuación, el intérprete 00:06:19.669 --> 00:06:22.260 lo haría. Así que en este caso, el intérprete dirá, 00:06:22.260 --> 00:06:24.182 UH-así que supongo que necesito una variable denominada A, y 00:06:24.182 --> 00:06:25.992 Necesito poner un 1 en ella. Así que una vez se realiza con esa línea 00:06:25.992 --> 00:06:28.531 luego va hacia adelante, y lo hace la siguiente línea. 00:06:28.531 --> 00:06:32.647 Y así sucesivamente. Lo mismo ocurre con el compilador de este gran grueso 00:06:32.647 --> 00:06:36.718 traducción del código fuente en el código de máquina 00:06:36.718 --> 00:06:38.077 Pero no realmente está ejecutando el código, su justo 00:06:38.077 --> 00:06:39.658 haciendo la traducción para ejecutarse en el futuro. 00:06:39.658 --> 00:06:42.848 Por el contrario intérprete vive realmente en el momento. 00:06:42.848 --> 00:06:45.144 Sólo pasando por el código línea por línea y sólo 00:06:45.144 --> 00:06:49.393 hacerlo. Así que permítanme hablar un poco sobre las diferencias 00:06:49.393 --> 00:06:53.284 entre estos dos. Debo decir como una renuncia, 00:06:53.284 --> 00:06:55.774 Hay muchos lenguajes de programación, no hay ninguna mejor 00:06:55.774 --> 00:06:59.419 el viejo chiste de lenguaje, es que realmente saben, 00:06:59.419 --> 00:07:00.769 cuando estás en el seminario y cuando estás 00:07:00.769 --> 00:07:01.917 argumentando sobre los pros y los contras de algo, 00:07:01.917 --> 00:07:04.872 en última instancia, la respuesta es simplemente, depende. 00:07:04.872 --> 00:07:08.107 Como no hay ninguna mejores idiomas, pero bien lo que es 00:07:08.107 --> 00:07:09.484 los idiomas mejores esta situación, con todos los 00:07:09.484 --> 00:07:13.337 características. Tan ampliamente hablando, código de compilador justo 00:07:13.337 --> 00:07:16.725 tiende a correr más rápido. Cuando se compila un código de C++ 00:07:16.725 --> 00:07:19.426 y producir ese .exe, es una especie de en un sentido magro, 00:07:19.426 --> 00:07:23.747 gran cantidad de detalles y decisiones ha sido despojado 00:07:23.747 --> 00:07:26.886 tanto como sea posible. Por otro lado dinámico o 00:07:26.886 --> 00:07:30.715 idiomas de intérprete, tienden a tener más funciones. 00:07:30.715 --> 00:07:32.965 Más funciones que hace el trabajo del programador un 00:07:32.965 --> 00:07:35.845 poco más fácil. O puesto de otra manera, ampliamente 00:07:35.845 --> 00:07:39.197 hablando, el programador puede tienden a hacer más trabajo 00:07:39.197 --> 00:07:41.907 por hora, en lenguajes dinámicos, que lo hacen en la compilación 00:07:41.907 --> 00:07:46.812 Idiomas. Sin embargo hay no hay almuerzo gratis, es 00:07:46.812 --> 00:07:49.784 también el caso de que el código de lenguaje dinámico tiende a 00:07:49.784 --> 00:07:52.660 ejecutar más lento de la CPU en términos de sólo obtener sólo 00:07:52.660 --> 00:07:57.232 el trabajo realizado, en comparación con las lenguas de compilador. 00:07:57.232 --> 00:07:59.344 Código de fuente del compilador se va a hacer lo mismo. 00:07:59.344 --> 00:08:04.848 Así que un ejemplo de esto, es un gran ejemplo de esto, 00:08:04.848 --> 00:08:06.885 Administración de memoria. Por lo que la administración de memoria se refiere a la 00:08:06.885 --> 00:08:09.869 problema en el código de saber cuántos bytes son 00:08:09.869 --> 00:08:12.286 ¿necesarios para almacenar algo y, en particular por cuánto tiempo? 00:08:12.286 --> 00:08:16.174 Bueno necesito esos bytes para la línea 6, sabes, pero 00:08:16.174 --> 00:08:18.277 quizás en la línea 20, y no necesitan ya 00:08:18.277 --> 00:08:20.594 y realmente puedo reutilizarlos para algo más. 00:08:20.594 --> 00:08:23.145 Y en realidad es un problema de tipo de complicted. 00:08:23.145 --> 00:08:27.007 En c y C++, administración de memoria es un grado 00:08:27.007 --> 00:08:29.773 Manual. y eso sólo significa que el programador 00:08:29.773 --> 00:08:31.315 se están produciendo todas estas líneas de códigos para cosas 00:08:31.315 --> 00:08:33.329 y va a ser a veces, cuando puede tener a 00:08:33.329 --> 00:08:35.555 agregar algunas líneas para hacer algún pensamiento, para ayudar a la Guía 00:08:35.555 --> 00:08:38.174 la administración de la memoria. Así que hay algunos 00:08:38.174 --> 00:08:41.438 esfuerzo de programador requerido. En contraste, la mayoría 00:08:41.438 --> 00:08:43.926 lenguajes dinámicos tienen lo que se llama, automático 00:08:43.926 --> 00:08:46.870 Administración de memoria. Y esto significa que, no 00:08:46.870 --> 00:08:53.009 entrada de programador es necesario. El lenguaje se va 00:08:53.009 --> 00:08:56.945 a notar automáticamente, cuando se necesita memoria, 00:08:56.945 --> 00:08:58.065 Cuando memoria no es necesaria ya, 00:08:58.065 --> 00:09:03.489 puede ser reciclado y eche en ese conjunto 00:09:03.489 --> 00:09:04.806 problema. Por lo tanto, esto encaja dentro de la tendencia de 00:09:04.806 --> 00:09:06.977 lenguajes dinámicos que estaba mencionando anteriormente, 00:09:06.977 --> 00:09:09.406 Por eso, este un ejemplo de cómo, bueno, ya sabes, porque 00:09:09.406 --> 00:09:11.736 el programador tiene menos que ver, son capaces de justo 00:09:11.736 --> 00:09:13.526 obtener cosas hecho un poco más rápido. Administración de memoria tan 00:09:13.526 --> 00:09:15.735 es un gran ejemplo de ello. Sin embargo también se puede imaginar 00:09:15.735 --> 00:09:17.190 Esta es una de las cosas que hace dinámico 00:09:17.190 --> 00:09:19.060 código de idioma ejecutar un poco más lento. Porque, 00:09:19.060 --> 00:09:22.914 la CPU tiene ahora suggestional libro manteniendo el problema, 00:09:22.914 --> 00:09:25.292 donde su mirando la memoria y tratando de 00:09:25.292 --> 00:09:27.842 figura fuera, cuando puede ser reutilizado. Por lo tanto, muy amplia 00:09:27.842 --> 00:09:32.320 hablando, la tendencia para el equipo de programación hoy 00:09:32.320 --> 00:09:37.047 es hacia los lenguajes dinámicos. El rasgo que la 00:09:37.047 --> 00:09:40.776 programador obtendrá un liitle rápido, cosas 00:09:40.776 --> 00:09:43.243 a expensas de utilizar un poco más CPU o más 00:09:43.243 --> 00:09:45.931 memoria, es un equilibrio bastante atractivo para 00:09:45.931 --> 00:09:49.162 muchos de los problemas. Esto puede ser un poco intuitiva, 00:09:49.162 --> 00:09:51.875 pero se puede pensar lo que es la escasa calidad, 00:09:51.875 --> 00:09:54.877 para un programa de ordenador y muchas veces es el 00:09:54.877 --> 00:09:59.390 programador, que tenga programador experto trabajando 00:09:59.390 --> 00:10:01.205 en que, sabes, trabajando en este dominio, mucho 00:10:01.205 --> 00:10:06.287 de los tiempos son difíciles de encontrar. Y así 00:10:06.287 --> 00:10:09.105 sus horas, es decir, utilizando algunas de sus horas, 00:10:09.105 --> 00:10:12.636 luce atractivo, en contraste, la CPU siempre 00:10:12.636 --> 00:10:13.929 quiero trabajar tan rápido como sea posible, pero 00:10:13.929 --> 00:10:17.425 CPUs son bastante barato y bastante eficaz 00:10:17.425 --> 00:10:19.073 y hay incluso este efecto curioso donde esta Moore 00:10:19.073 --> 00:10:24.256 Derecho, sigue haciendo más cierto, donde la CPU cada año obtiene más barata 00:10:24.256 --> 00:10:27.230 y si pensamos en el equilibrio entre el programador 00:10:27.230 --> 00:10:29.185 costo y el costo de CPU de conseguir algo, 00:10:29.185 --> 00:10:31.781 Esto significa en términos de la parte del pastel, 00:10:31.781 --> 00:10:33.478 el programador de hecho cada vez más caro 00:10:33.478 --> 00:10:36.169 cada año, un poco más escaso. Por lo que estos se ajusta 00:10:36.169 --> 00:10:41.365 en el patrón. En el conjunto de los lenguajes dinámicos 00:10:41.365 --> 00:10:43.830 se están volviendo populares. La última cosa que será 00:10:43.830 --> 00:10:46.561 mención es que existe una cosa llamada "JIT", 00:10:46.561 --> 00:10:50.144 un compilador Just In Time. Y este tipo de 00:10:50.144 --> 00:10:52.646 la síntesis natural del compilador e intérprete 00:10:52.646 --> 00:10:54.772 estrategias, de tratar de obtener lo mejor de ambos mundos. 00:10:54.772 --> 00:10:56.796 Tan su parecido, bueno, nos gustaría tener un lenguaje dinámico, 00:10:56.796 --> 00:10:58.693 con todas estas funciones, todas estas favorables de programador 00:10:58.693 --> 00:11:02.020 características, pero nos quieren correr rápido. Y así 00:11:02.020 --> 00:11:04.542 Este JIT tomar partes del código y probar 00:11:04.542 --> 00:11:07.086 y compilar sobre la marcha. Por lo que trata de una especie de 00:11:07.086 --> 00:11:11.831 para casarse con dos de ellos. Resulta funciona 00:11:11.831 --> 00:11:14.630 bastante bien. Así que todos los navegadores tienen ahora 00:11:14.630 --> 00:11:18.695 JITs para código de secuencia de comandos de Java. Así que realmente cuando usted 00:11:18.695 --> 00:11:22.317 está ejecutando código Java Script en esta clase, 00:11:22.317 --> 00:11:24.617 dentro del explorador había un JIT que estaba en el 00:11:24.617 --> 00:11:28.409 mosca, teniendo esos trozos de código Java Script y 00:11:28.409 --> 00:11:31.615 compilarlos sobre la marcha, en el código de máquina. 00:11:31.615 --> 00:11:35.363 De todos modos, no obtendrá exactamente los formatos del compilador 00:11:35.363 --> 00:11:39.041 código, pero se obtiene bastante estrecha. SO. Esto es realmente 00:11:39.041 --> 00:11:41.983 Cómo funciona la mayoría de los lenguajes dinámicos. Es un activo 00:11:41.983 --> 00:11:44.390 área de investigación. Pero parece que funciona bastante bien.