Así que hablé sobre el motor de JavaScript
en la última lección, pero ¿qué es ese motor en realidad?
¿Y qué es un tiempo de ejecución de JavaScript?
Además, ¿cómo se traduce el código JavaScript a un código de máquina?
Esos son solo algunos de los temas.
del que hablamos en el último vídeo.
Y ahora vamos a averiguar cómo funcionan en esta conferencia.
Así que un motor de JavaScript es simplemente
un programa de computadora que ejecuta código JavaScript.
Hay muchos pasos involucrados en hacer eso,
pero esencialmente ejecutando código JavaScript
es lo que hace un motor.
Ahora cada navegador tiene su propio motor JavaScript
pero probablemente el motor más conocido es el V-Eight de Google.
El motor V ocho impulsa Google Chrome,
pero también Node.js, que es ese tiempo de ejecución de JavaScript
de lo que hablábamos al principio del curso,
entonces el que podemos usar para construir aplicaciones del lado del servidor
con JavaScript, por lo que fuera de cualquier navegador.
Y, por supuesto, todos los demás navegadores.
tienen sus propios motores de JavaScript
que puede buscar en línea si está interesado.
De todos modos, es bastante fácil entender qué es un motor.
pero lo más importante es entender realmente
Sus componentes y su funcionamiento.
Así que cualquier motor de JavaScript siempre contiene
una pila de llamadas y un montón.
La pila de llamadas es donde nuestro código se ejecuta realmente
usando algo llamado contextos de ejecución.
Entonces el montón es un grupo de memoria no estructurado
que almacena todos los objetos que necesita nuestra aplicación.
Muy bien, con este vistazo al motor,
hemos respondido donde se ejecuta nuestro código.
Pero ahora la pregunta es
cómo se compila el código a código de máquina
para que realmente se pueda ejecutar después.
Bueno, averigüémoslo.
Pero primero tenemos que hacer
una breve nota al margen de informática aquí
y hablar de la diferencia entre
compilación e interpretación.
Así que en la última conferencia,
aprendimos que el procesador de la computadora
solo entiende ceros y unos
y eso es, por lo tanto, cada programa de computadora
en última instancia, debe convertirse en este código de máquina
y esto puede suceder usando compilación o interpretación.
Entonces, en compilación, todo el código fuente
se convierte en código de máquina a la vez.
Y este código de máquina luego se escribe
en un archivo portátil que se puede ejecutar en cualquier computadora.
Así que tenemos dos pasos diferentes aquí.
Primero, se construye el código máquina.
y luego se ejecuta en la CPU por lo que en el procesador.
Y la ejecución puede suceder
mucho después de la compilación, por supuesto.
Por ejemplo, cualquier aplicación que esté utilizando
en su computadora en este momento ha sido compilado antes
y ahora lo estás ejecutando mucho después de su compilación.
Ahora, por otro lado en la interpretación,
hay un intérprete que se ejecuta a través del código fuente
y lo ejecuta línea por línea.
Así que aquí no tenemos los mismos dos pasos que antes.
En cambio, el código se lee y ejecuta todo al mismo tiempo.
Por supuesto, el código fuente todavía
necesita ser convertido en código de máquina,
pero simplemente sucede justo antes de que se ejecute
y no antes de tiempo.
Ahora JavaScript solía ser un lenguaje puramente interpretado
pero el problema con los lenguajes interpretados
es que son mucho, mucho más lentos que los lenguajes compilados.
Esto solía estar bien para JavaScript,
pero ahora con JavaScript moderno
y aplicaciones web completas que construimos
y uso hoy en día, el bajo rendimiento ya no es aceptable.
Imagínese que estaba usando mapas de Google en su navegador
y estabas arrastrando el mapa y cada vez que arrastrabas
tardaría un segundo en moverse.
Eso sería completamente inaceptable, ¿verdad?
Ahora mucha gente todavía piensa
que JavaScript es un lenguaje interpretado
pero eso ya no es cierto.
Entonces, en lugar de una interpretación simple
El motor JavaScript moderno ahora usa una mezcla entre
recopilacion e interpretacion
que se llama compilación justo a tiempo.
Este enfoque básicamente compila todo el código.
en código de máquina a la vez y luego lo ejecuta de inmediato.
Así que todavía tenemos los dos pasos.
de la compilación regular antes de tiempo
pero no hay ningún archivo portátil para ejecutar.
Y la ejecución ocurre inmediatamente después de una compilación.
Y esto es perfecto para JavaScript.
ya que es mucho más rápido que simplemente ejecutar código
linea por linea.
Ahora hojeé algunos detalles aquí
pero esto es realmente todo lo que necesitas saber.
De todos modos, ahora entendamos cómo funciona esto.
en el caso particular de JavaScript.
Entonces, cuando una pieza de código JavaScript ingresa al motor
el primer paso es analizar el código
lo que esencialmente significa leer el código.
Durante el proceso de análisis, el código se analiza
en una estructura de datos llamada
el árbol de sintaxis abstracta o AST.
Esto funciona dividiendo primero cada línea de código
en piezas que son significativas para el lenguaje
como las palabras clave const o function,
y luego guardar todas estas piezas
en el árbol de forma estructurada.
Este paso también comprueba si hay errores de sintaxis.
y el árbol resultante se utilizará más adelante
para generar el código máquina.
Ahora digamos que tenemos un programa muy simple.
Todo lo que hace es declarar una variable como esta,
y esto es lo que dice el AST
porque solo se ve esta línea de código.
Así que tenemos una declaración de variable
que debe ser una constante
con el nombre X y el valor de 23.
Y además de eso hay muchas otras cosas aquí,
como se puede ver.
Así que imagina cómo sería
para una gran aplicación real.
Y por supuesto que no necesitas saber
cómo se ve un AST.
Esto es solo por curiosidad ok.
Ahora a veces me preguntan
si este árbol tiene algo que ver con el árbol DOM
y la respuesta es un no muy claro.
Entonces este árbol no tiene absolutamente nada que ver con el DOM.
No está relacionado de ninguna manera.
es solo una representacion
de todo nuestro código dentro del motor.
De todos modos, el siguiente paso es la compilación.
que toma el AST generado
y lo compila en código de máquina
tal como aprendimos en la diapositiva anterior.
Este código de máquina se ejecuta de inmediato
porque recuerda el uso moderno del motor JavaScript
compilación justo a tiempo.
Y recuerda que la ejecución sucede
en la pila de llamadas de los motores de JavaScript
pero vamos a profundizar en esto en la próxima lección.
Muy bien, hasta ahora todo bien.
Tenemos nuestro código ejecutándose para que podamos terminar aquí, ¿verdad?
Bueno, no tan rápido porque los motores modernos de JavaScript
en realidad tienen algunas estrategias de optimización bastante inteligentes.
Lo que hacen es crear una versión muy desoptimizada.
de código máquina al principio
solo para que pueda comenzar a ejecutarse lo más rápido posible.
Luego, en segundo plano, este código se está optimizando.
y recompilado durante la ejecución del programa ya en ejecución.
Y esto se puede hacer la mayoría de las veces.
y después de cada optimización
el código no optimizado simplemente se barre
para el nuevo código más optimizado
sin detener nunca la ejecución, por supuesto.
Y este proceso es lo que hace que los motores modernos
como el V-Eight tan rápido
y todo este análisis, compilación y optimización
sucede en algunos hilos especiales dentro del motor
que no podemos acceder desde nuestro código.
Tan completamente separado del hilo principal.
que básicamente se está ejecutando en la pila de llamadas
ejecutando nuestro propio código.
Ahora diferentes motores implementan de formas ligeramente diferentes,
pero en pocas palabras esto es lo moderno
la compilación justo a tiempo se parece a JavaScript.
Y la próxima vez que alguien te diga
JavaScript es un lenguaje interpretado,
simplemente muéstreles esta diapositiva para que puedan aprender
cómo funciona realmente.
Muy bien, miramos el motor de JavaScript
y cómo funciona detrás de escena con bastante detalle.
Ahora para terminar esta conferencia
también echemos un vistazo a lo que es un tiempo de ejecución de JavaScript.
Y en particular, el más común,
que es el navegador y al hacer esto,
podemos obtener una imagen más grande
de cómo encajan todas las piezas cuando usamos JavaScript.
Así que esta es una diapositiva muy importante.
Entonces podemos imaginar un tiempo de ejecución de JavaScript como una caja grande
o un recipiente grande
que incluye todas las cosas que necesitamos
para usar JavaScript en este caso, en el navegador.
Y al corazón de cualquier JavaScript,
runtime es siempre un motor de JavaScript.
Así que exactamente del que hemos estado hablando.
Por eso tiene sentido hablar de motores
y tiempos de ejecución juntos.
Sin motor no hay autonomía
y no hay JavaScript en absoluto.
Sin embargo, el motor por sí solo no es suficiente.
Para que funcione correctamente,
también necesitamos acceso a las API web,
y hablamos antes de las API web, ¿recuerdas?
Así que eso es todo lo relacionado con el DOM.
o temporizadores o incluso el console.log que usamos todo el tiempo.
Entonces, esencialmente, las API web son funcionalidades provistas
al motor,
pero que en realidad no son parte
del propio lenguaje JavaScript.
JavaScript simplemente obtiene acceso a estas API
a través del objeto de ventana global.
Pero aún tiene sentido que las API web
también son parte del tiempo de ejecución,
porque nuevamente un tiempo de ejecución es como una caja
que contiene todo el material relacionado con JavaScript que necesitamos.
A continuación, un tiempo de ejecución típico de JavaScript
también incluye una llamada cola de devolución de llamada.
Esta es una estructura de datos que contiene
todas las funciones de devolución de llamada que están listas para ser ejecutadas.
Por ejemplo, adjuntamos funciones de controlador de eventos.
a elementos DOM como un botón
para reaccionar a ciertos eventos, ¿verdad?
Y estas funciones de controlador de eventos
también se denominan funciones de devolución de llamada.
Entonces, a medida que sucede el evento,
por ejemplo, un clic, se llamará a la función de devolución de llamada.
Y así es como funciona realmente detrás de escena.
Entonces, lo primero que realmente sucede después del evento
es que la función de devolución de llamada se pone
en la cola de devolución de llamada.
Luego, cuando la pila está vacía
la función de devolución de llamada se pasa a la pila
para que se pueda ejecutar.
Y esto sucede por algo llamado bucle de eventos.
Entonces, básicamente, el ciclo de eventos toma funciones de devolución de llamada
de la cola de devolución de llamada
y los pone en la pila de llamadas
para que puedan ser ejecutados.
Y recuerda cómo dije en la última conferencia
que el bucle de eventos
es cómo el modelo de concurrencia sin bloqueo de JavaScript
¿está implementado?
Bueno, aquí hay una descripción general de cómo funciona.
Ahora veremos por qué esto hace que JavaScript no bloquee
en una conferencia especial sobre el bucle de eventos
más adelante en el curso,
porque esta es realmente una pieza fundamental
de desarrollo JavaScript
que todo desarrollador necesita entender profundamente.
Muy bien, como ya dijeron, el enfoque en este curso
está en JavaScript en el navegador
y es por eso que analizamos el tiempo de ejecución de JavaScript del navegador.
Sin embargo, también es importante recordar
que JavaScript puede existir fuera de los navegadores,
por ejemplo, en Node.js.
Y esto es lo que el tiempo de ejecución de JavaScript JS del nodo
parece.
Es bastante similar, pero como no tenemos un navegador
por supuesto, no podemos tener las API web
porque es el navegador quien los proporciona.
En cambio, tenemos múltiples enlaces C ++
y un llamado grupo de subprocesos.
Ahora los detalles no importan aquí en absoluto.
Solo quiero que sepas
que existen diferentes tiempos de ejecución de JavaScript.
Muy bien, genial, eso es todo lo que tenía que decirte.
sobre motores y tiempos de ejecución de JavaScript.
En nuestra próxima lección, aprenderemos cómo se ejecuta JavaScript.
en la pila de llamadas.