Javascript Compilado o Interpretado?... Today in Sick Sad Dev World

Si buscan en wikipedia o en blogs sobre lenguajes de programación se considera que JavaScript pertenece a la categoría de lenguajes interpretados, sin embargo esto es mentira (chan chan chan!! 😮) Javascript es de hecho un lenguaje compilado.

La cosa es que Javascript a diferencia de los lenguajes tradicionalmente compilados, no se compila de manera anticipada y tampoco los resultados de su compilación son portables entre varios sistemas distribuidos (como en el caso de Java, C/C++).

En JavaScript la compilación sucede justo antes de ejecutar el código.

¿Y que es lo que hace que un lenguaje sea compilado?

Para que un lenguaje sea considerado compilado debe pasar por un proceso que se conoce como el proceso de compilación.

Ok ok, esa explicación es parecida a la de el duelo a muerte con cuchillos 😅

Regresando al tema, y explicando de manera muy general, el proceso de compilación consiste en los siguientes 3 pasos:

  1. Tokenizing / Lexing: en este paso, se rompe una cadena de caracteres en pedazos (tokens), por ejemplo:
     var a = 2;
    
    Se divide en los tokens: var, a, =, 2, y ;.
  2. Parsing: Toma un stream de tokens (algo así como un array) y lo convierte en un árbol de elementos anidados, que colectivamente representan la estructura gramatical del programa. Este árbol se denomina AST (Abstract Syntax Tree) o en español árbol de sintaxis abstracto. Siguiendo el ejemplo:
    Despues de que var a = 2; sea convertido en tokens, el árbol para esa instrucción comienza con un nodo de nivel superior llamado VariableDeclaration, con un nodo secundario llamado Identifier (cuyo valor es a), y otro llamado AssignmentExpression que tiene un nodo hijo llamado NumericLiteral (cuyo valor es 2).
  3. Code-Generation: es el proceso de tomar un AST y convertirlo en código ejecutable. Esta parte varía mucho dependiendo del lenguaje, la plataforma a la que se está dirigiendo, etc. Regresando al ejemplo:
    Despues de que var a = 2; sea convertido en tokens y despues en un AST, en este paso se convierte en un conjunto de instrucciones de máquina para crear una variable llamada a (incluida la reserva de memoria) y luego almacenar un valor (2) en a.

En conclusión, Javascript es un lenguaje compilado y por lo tanto, cualquier fragmento de código tiene que ser compilado inmediatamente antes de que se ejecute. La razón de porque se creé que Javascript es interpretado es porque el navegador es un interprete que traduce código HTML y CSS (tambien php el cual es un lenguaje interpretado), sin embargo como recordaran los navegadores tambien tienen embebidos un Engine para trabajar con Javascript, un ejemplo claro es el caso del V8 Engine en Chrome, el cual se comunica con el compilador y el scope (de este ultimo les contaré mas adelante).