Rápido significa básicamente poder ejecutar Node.js, ya que necesitamos poder enfrentar una situación en la que el código no solo se genera en tiempo de ejecución, sino que también se modifica en tiempo de ejecución, tal vez se modifica en su lugar o simplemente se elimina y se coloca en otro lugar. Esto también ocurre al ejecutar código con V8, porque el código en sí mismo es un recolector de basura y se mueve en la memoria con el tiempo.
Y luego queríamos construir algo escalable. Esto significa que, aunque les mostré solo un montón de palabras amarillas, esta cosa puede funcionar en bases de código mucho más grandes. Queríamos construir algo que pueda trabajar con programas en el mundo real, lo que significa que queremos admitir multiprocesamiento, multihilo, miles de archivos y todas las características que son utilizadas efectivamente por programas reales, no solo juguetes.
Para darles una idea de lo que hemos visto hasta ahora, ChirpX es este entorno en el que ocurre toda la ejecución. Y todo es del lado del cliente. Todo está en el navegador. No hay un componente del lado del servidor que haga la ejecución por nosotros. Esto no es un truco. Y lo primero que se inicia es Bash. Entonces Bash es el proceso principal. Y luego Bash mismo puede generar subprocesos, procesos secundarios, y les mostré GCC y Python, y todos estos son completamente independientes en otros espacios. Tienen su propio código y tienen sus propios datos.
Pero el problema es que, desde el punto de vista del sistema, realmente no sabemos qué es código y qué es datos. Estas dos cosas son solo bytes. Es solo datos antiguos en la memoria. Y para resolver este problema, en realidad tenemos un motor de ejecución de dos niveles. El primer nivel es un intérprete y el segundo nivel es un motor JIT real que puede generar código altamente optimizado. Y el intérprete es capaz de ejecutar código prácticamente sin ninguna información. Comenzará desde la primera instrucción y la pasará a la siguiente y así sucesivamente. Y a medida que lo hace, también construirá internamente los metadatos sobre cómo está estructurado el código. Y con eso, ahora es posible iniciar el motor JIT para generar un código optimizado y robusto a partir de esto.
Y eventualmente, todas estas aplicaciones necesitarán llegar al navegador de alguna manera porque necesitamos mostrar texto en la pantalla, por ejemplo. Y esto sucede como esperarías en un sistema nativo a través de llamadas al sistema. Y las llamadas al sistema, las implementamos nosotros mismos. Entonces, lo que viste hasta ahora no es un kernel de Linux. Es una ABI compatible con Linux, por lo que puede ejecutar cualquier ejecutable de Linux, pero no es Linux en sí mismo. Y la llamada al sistema es el lugar donde nos detenemos e implementamos la llamada al sistema manualmente para que puedan interactuar con el navegador. Y ahora te preguntarás por qué no ejecutamos todo en el JIT, ya que probablemente sea más eficiente.
Comments