Ahora, ¿qué significa esto realmente? Por ejemplo, en un portátil con 12 núcleos, que es lo que vemos aquí en esta imagen, solo utilizamos parte de esa potencia de cálculo. Podemos ver que incluso mientras se ejecuta la construcción, hay mucha potencia de CPU que aún se deja sin utilizar. Muchos núcleos de CPU que simplemente están allí inactivos. Así que definitivamente no es un buen comienzo para ejecutar cosas en paralelo.
Veamos a veces qué tipo de mejoras podríamos obtener si hiciéramos esto? Y la respuesta es que definitivamente obtendremos mejoras, pero simplemente no son tan grandes. Quiero decir, hay una mejora de aproximadamente el 10-20% que obtenemos al ejecutar cosas en paralelo utilizando este enfoque, que es nuevamente mejor que lo que teníamos, pero no es algo que vaya a ser dramático.
Entonces, ¿cómo podemos aumentar el paralelismo disponible? ¿Cómo podemos ejecutar más cosas en paralelo? Bueno, para eso, primero necesitamos entender exactamente qué es lo que TypeScript realmente hace, y lo que hace son tres cosas. Realiza la comprobación de tipos, emite declaraciones, y emite JavaScript. Ahora, estas cosas no son perfectamente independientes, a saber, la emisión de declaraciones depende del resultado de la comprobación de tipos. Pero para cada uno de nuestros proyectos, TypeScript hará estas tres cosas. Así que, dentro de la construcción de cada uno de nuestros proyectos, estas tres cosas tienen que suceder.
Ahora, hay una idea clave aquí, a saber, que lo que se necesita para desbloquear un proyecto para iniciar su fase de comprobación de tipos es que necesita tener disponibles todas las declaraciones de sus dependencias. Así que, la emisión de declaraciones es lo que realmente se necesita para las dependencias. Realmente no nos importa si la dependencia ha terminado la comprobación de tipos si podemos obtener sus declaraciones. Así que, la cola de dependencias real se vería más como esto, ¿verdad? Cada fase de comprobación de tipos depende de la emisión de declaraciones de sus dependencias, no necesariamente de la comprobación de tipos. Eso es una idea interesante, pero mientras todavía tengamos esta dependencia entre la comprobación de tipos y la emisión de declaraciones, el hecho de que este sea el caso, el hecho de que dependamos de la emisión de declaraciones realmente no nos ayuda porque necesitamos hacer la comprobación de tipos de todos modos. Entonces, ¿podríamos eliminar esta dependencia? Bueno, para eso, deberíamos primero mirar por qué la emisión de JavaScript es tan independiente de la comprobación de tipos. ¿Cómo es eso? De hecho, incluso tenemos herramientas que emiten JavaScript sin la necesidad de un comprobador de tipos. Lo hacen completamente independientemente de TypeScript. ¿Cómo se permite esto? Bueno, hace unos años, TypeScript añadió un nuevo modo a TypeScript llamado módulos aislados. Entonces, ¿qué hace exactamente los módulos aislados? Bueno, asegura que cada archivo puede ser transpilado de TypeScript a JavaScript individualmente. Básicamente elimina cualquier dependencia en la comprobación de tipos de la emisión de JavaScript. Así que esto significa que la emisión de JavaScript se convierte en un proceso puramente sintáctico. Las herramientas todavía necesitan entender la sintaxis de TypeScript. Así que, cada vez que obtenemos una nueva sintaxis en TypeScript, todas las herramientas que emiten JavaScript necesitan entender esta nueva sintaxis. Pero la ventaja es que en realidad no necesitan entender todas las reglas semánticas de TypeScript. Solo necesitan entender la sintaxis lo suficiente como para poder eliminarla. Así que, básicamente, cuando hacemos la emisión de JavaScript, empezamos con un archivo de TypeScript, y lo que sucede dentro de un emisor de JavaScript es que todas las anotaciones de tipo son eliminadas, ¿verdad? Y este es un proceso muy simple. No es difícil construir tal transformación. Al menos no es difícil comparado con la construcción de un comprobador de tipos completo.
Comments