JavaScript Basics : Y al final que es eso de JS?

Elizabeth Portilla
Laboratoria Devs
Published in
6 min readSep 15, 2017

--

Bueno, aquí comienza. JavaScript, o JS para los amigos y familiares es, según la definición algo formal:

If you are already familiar with other programming languages, it may help you to know that JavaScript is a high-level, dynamic, untyped interpreted programming language that is well-suited to object-oriented and functional programming styles.

JavaScript: The Definitive Guide. Flanagan 2011, p. 1.

Que en español más o menos sería:

“ Si ya estas familiarizado con otros lenguajes de programación, puede ayudarte saber que JavaScript es un lenguaje de alto nivel, dinámico, no tipado interpretado que esta bien adecuado a estilos de programación orientada a objetos y funcional.”

Como muchos lenguajes de programación, está diseñado para traducir de código que podemos leer los humanos a instrucciones que puede leer la máquina. Veremos cada uno de sus adjetivos a un poco más de detalle.

High Level — Lenguaje de alto nivel

Uno de los aspectos que define a un lenguaje de programación es su nivel de abstracción del lenguaje de máquinas.

¿Qué es la abstracción?

abstracción

f. Consideración aislada de las cualidades esenciales de un objeto, o del mismo objeto en su pura esencia o noción:

Concentración del pensamiento, prescindiendo de la realidad exterior:

Idea abstracta o construcción mental sin correspondencia exacta con la realidad.

hacer abstracción de algo loc. Prescindir de, dejar aparte:
haciendo abstracción de algunas manías, me encanta tu forma de ser.

Hay varios espectros entre que tan entendible (abstracto) es un lenguaje de programación, mientras sea más entendible para nosotros (los humanos) lo llamamos high level. Y mientras más entendible sea para la máquina le llamamos low level. En los lenguajes de bajo nivel tienes que lidiar directamente con direcciones de memoria, call stacks y similares.

Mientras más se abstrae y sea más entendible o leíble para los humanos, lo llamamos high-level.

High— low level languages

Cuando decimos que se abstrae, es que en el lenguaje se crean nuevas estructuras que manejan decisiones del tipo de dato, manejo de memoria, callstack y cosas similares, dejándonos mas bien lidiar con variables, objetos, arreglos, estructuras complejas en matemática y computación.

Es bueno, porque se asemeja más al lenguaje en el que hablamos y comprendemos, pero viene con una penalidad. Para casos de alta optimización o integraciones a hardware, es muy probable que se necesite un lenguaje de bajo nivel, que luego con librerías y adaptadores puedan usarse en el lenguaje de alto nivel. JavaScript es en sí un lenguaje de alto nivel.

Untyped — No tipado

JavaScript es un lenguaje untyped. En realidad, no es que no tenga tipos de datos. JavaScript no usa tipos de datos estáticos. Como indica el propio creador de JavaScript:

Lo que para nosotros significa que al crear una variable no atamos la variable a un tipo específico de dato, sino que tendrá un significado y valor dependiendo del contexto. Pero no sólo eso, sino que en casos donde el valor de la variable pueda cambiar en el tiempo, esta puede tener diferentes tipos de datos y estructuras en diferentes momentos de la ejecución.

Estrictamente, en JavaScript, una variable en JavaScript es dynamically typed, es decir que si bien hay variables, estas se adecuan a guardar un value, y representa un valor de cualquiera de los tipos de dato existente en el lenguaje.

Por ejemplo en otros lenguajes, como C, que son fuertemente tipados (strong typed) si queremos crear una variable, debemos indicar forzosamente su tipo de datos. Para C, la variable a sería un entero de valor 8. Mientras que s sería un string de valor “hola” :

int a = 8; char s = "hola";

En cambio en JavaScript (ES5) es weakly typed, es decir una vez que la variable ha sido creada, su tipo de datos no es forzado al resto de las instrucciones.

var a = 8; var s="hola";

Durante la ejecución toma su tipo de datos del valor que contiene en el contexto en el que se encuentra. Por ejemplo en JavaScript es posible re-asignar la variable a otro valor, la variable cambia de tipo ya que esta refiriendo a otro valor de tipo diferente:

a = "Hola"; s = 6;

Para los lenguajes weakly typed, implica que la implementación que se hace del lenguaje debe ser lo suficientemente robusta pero a la vez flexible como para asignar el valor que se necesita de acuerdo al contexto de la ejecución. Puedes leer más de la discusión en stackoverflow y revisar más sobre las diferencias entre weakly typed y strong typed en este post de Steve Ferg.

Dynamic Language — Lenguaje dinámico

Cuando hablamos de lenguaje dinámico, en realidad hablamos de la optimización que tiene para el uso de variables y la ejecución. Hablamos de un lenguaje dinámico cuando el tipo de datos es dinámico o se tiene una variable que guarda un valor, pero este valor puede variar de tipo de dato en el tiempo. Además el lenguaje incluye features que están orientados a extenderse y manejarse en el momento de la ejecución del programa en sí.

Interpreted — Lenguaje interpretado

De hecho hay algunas discusiones sobre el término a nivel académico. Pero, para simplificarlo, digamos lo siguiente: En un lenguaje interpretado, el source se lee, traduce y ejecuta en el momento de la ejecución. En contraste, en un lenguaje compilado tenemos la figura del build, que se genera por un programa desde el lenguaje de programación hacia lenguaje de máquina, lo que genera un output o salida como los obj y los exe los cuales son producto de la compilación y es lo que ejecutarás.

JavaScript es un lenguaje interpretado, las líneas de un proyecto en JS son traducidas y ejecutadas en el momento de ejecutarlo.

El ejecutar un archivo JavaScript, se realizarán dos fases, la interpretación, en el que se traducirá el código a lenguaje de máquina, y luego la compilación en la que se ejecutarán línea por línea lo que se haya traducido.

Y llega un nuevo dilema, el tiempo en el que se hace la compilación, esta es una breve descripción, pero creo que lo extenderé adelante en otro post:

AOT : Ahead of time, en este caso el compilado se hace antes y luego se ejecutan las líneas.

JIT : Just in time, por el contrario, se compila mientra se ejecutan las líneas de código. Este es el método que usan el engine de Chrome (V8). Puedes leer más a detalle sobre esto en este answer:

Quizás ahora tengas más preguntas sobre como funciona el engine, por ejemplo V8. Te recomiendo esta guía.

De hecho, hay varios engines, y algunas implementaciones de JavaScript pueden tener pequeñas variciones o flavors (sabores). Pero no desesperes, hay gente creando el estándar de qué se debe implementar y cómo debería funcionar. Algunas de las definiciones son un poco amplias lo que deja espacio para cambios un poco raros en algunos casos. La organización encargada de mantener este estandar es ECMA, y el estándar al que nos referimos es al de ECMASCRIPT. Pero con todo esto, creo que basta para darte una mirada a lo que es JavaScript.

Este es el primero de una mini serie de artículos JavaScript Basics sobre algunos de mis propios findings alrededor de JavaScript que pueden ser útiles a otras personas. Un poco académico, un poco como notas personales.

--

--

Elizabeth Portilla
Laboratoria Devs

🚀 Software Engineer.🎵 Music producer. Collaborator at @limajsorg, Perú dev, and #vuevixens Perú. #javascript ❤️ linktr.ee/lizzie136