<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John</title>
    <description>The latest articles on DEV Community by John (@johncardenasp).</description>
    <link>https://dev.to/johncardenasp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482078%2F2f65734e-34a5-4b30-95e7-781f26449480.png</url>
      <title>DEV Community: John</title>
      <link>https://dev.to/johncardenasp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johncardenasp"/>
    <language>en</language>
    <item>
      <title>Cómo crear y vincular una llave SSH con GitHub</title>
      <dc:creator>John</dc:creator>
      <pubDate>Mon, 23 Nov 2020 22:50:13 +0000</pubDate>
      <link>https://dev.to/johncardenasp/como-crear-y-vincular-una-llave-ssh-con-github-42i4</link>
      <guid>https://dev.to/johncardenasp/como-crear-y-vincular-una-llave-ssh-con-github-42i4</guid>
      <description>&lt;p&gt;Crear una llave SSH no solo es la forma más rápida de trabajar con tus repositorios en GitHub, es también la forma más segura y recomendada en los entornos de desarrollo profesionales.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Que es una llave SSH?
&lt;/h2&gt;

&lt;p&gt;Una llave SSH es una clave que te permitirá autenticarte ante un servicio, en este caso, GitHub. Por lo general vienen 2 llaves: una pública y una privada. Con la pública puedes enviar y recibir información cifrada de la web, mientras que con la privada puedes descifrar esa información para poder su contenido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota: NUNCA compartas tu llave privada.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de crear la llave
&lt;/h2&gt;

&lt;p&gt;Antes de crear la llave, primero debes verificar que no tienes las llaves ya creadas. ¿Cómo lo haces? Simple, ejecuta este comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls -al .ssh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por lo general tienen estos nombres:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id_rsa.pub&lt;/li&gt;
&lt;li&gt;id_dsa.pub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así que si te topas con uno de ellos, lo más probable es que ya tengas las llaves y solo debes vincular esa llave con GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh2w1pcus13vo4ltowtj4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh2w1pcus13vo4ltowtj4.png" alt="verificar si se tiene una llave SSH"&gt;&lt;/a&gt;&lt;br&gt;
En este caso, no tengo llaves. Vamos a crearla.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo crear un llave SSH?
&lt;/h2&gt;

&lt;p&gt;Para crear una llave SSH, simplemente ejecuta este comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh-keygen -t rsa -b 4069 -C "j@ejemplo.com"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Recuerda poner tu correo electrónico.&lt;/p&gt;

&lt;p&gt;Una vez corras el comando se te presentarán dos preguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Si deseas que la llave SSH se guarde en el directorio por defecto. De no ser así, puedes poner el directorio donde quieras guardar la llave. Te recomiendo dejar la llave en el directorio por defecto.&lt;/li&gt;
&lt;li&gt;Luego de seleccionar el directorio, te pedirá una contraseña extra (passphrase). En lo personal te recomiendo no ponerla debido a que cada vez que quieras usar la llave te pedirá la contraseña, y eso es lo que queremos evitar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si haces todo según lo indicado, este sería el resultado:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6ut8n642zak0ojtemmm7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6ut8n642zak0ojtemmm7.png" alt="SSH Key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verificamos una vez más si tenemos la llave:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F18vdv8vmp3ub5px03ns3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F18vdv8vmp3ub5px03ns3.png" alt="Creación de  una llave ssh"&gt;&lt;/a&gt;&lt;br&gt;
Y efectivamente. It´s ready!&lt;/p&gt;

&lt;p&gt;Ahora, vamos a vincularla con nuestra cuenta de GitHub. Pero primero un breve paso más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardando la llave en el &lt;em&gt;SSH-Agent&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;En GitHub existe algo llamado &lt;em&gt;SSH-Agent&lt;/em&gt;. Esto nos permite recordar las llaves privadas de cada usuario mientras dura la sesión. De esta manera es que logramos la autenticación. Para lograr esto, vamos a ejecutar este comando en la consola:&lt;br&gt;
&lt;code&gt;eval "$(ssh-agent -s)" &amp;amp;&amp;amp; ssh-add ~/.ssh/id_rsa&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este debería ser el resultado:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4qst8j8bjqvmhiltqlw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4qst8j8bjqvmhiltqlw7.png" alt="ssh-agent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con este paso el &lt;em&gt;SSH-Agent&lt;/em&gt; recordará las llaves por nosotros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vincular llave SSH con GitHub
&lt;/h2&gt;

&lt;p&gt;Para poder vincular la llave SSH con tu cuenta de GitHub debes ir a:&lt;br&gt;
&lt;em&gt;Tu perfil (click en tu avatar) &lt;strong&gt;-&amp;gt;&lt;/strong&gt; Opción settings &lt;strong&gt;-&amp;gt;&lt;/strong&gt; En la barra izquierda seleccionas la opción &lt;strong&gt;SHH Keys and GPG Keys&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una vez allí, seleccionas la opción &lt;em&gt;&lt;strong&gt;New SSH Key&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp6xbqn2tikrnk5iiwami.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp6xbqn2tikrnk5iiwami.png" alt="SSH Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la opción title te recomiendo poner un título descriptivo, por ejemplo: PC de John, PC de trabajo (nombre de empresa), etc... Y en la opción Key deberás pegar &lt;strong&gt;tu llave pública&lt;/strong&gt;. Para eso, vamos a la consola y ejecutamos este comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cat ~/.ssh/id_rsa.pub&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este comando mostrará tu llave pública:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feu092h38vdomso3dl6up.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feu092h38vdomso3dl6up.png" alt="SSH Public"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copiala y pegala en la opción Key. Así:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fum67n8xrbmm8m1qrnz67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fum67n8xrbmm8m1qrnz67.png" alt="Aprende a crear una llave ssh"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le das en la opción &lt;em&gt;&lt;strong&gt;Add SSH Key&lt;/strong&gt;&lt;/em&gt; y por motivos de seguridad GitHub te pedirá hacer login nuevamente. Una vez haga el login, vas nuevamente a la opción &lt;em&gt;&lt;strong&gt;SSH and GPG Keys&lt;/strong&gt;&lt;/em&gt; y tendrás tu llave guardada.&lt;/p&gt;

&lt;p&gt;Y eso es todo. Ya puedes clonar repositorios mediante llaves SSH sin ningún tipo de problema. Trabajar más rápido y como un/una profesional.&lt;/p&gt;

&lt;p&gt;¡Nos vemos en el próximo post! 🚀&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Prototype y herencia prototipal en JavaScript</title>
      <dc:creator>John</dc:creator>
      <pubDate>Sun, 08 Nov 2020 04:44:24 +0000</pubDate>
      <link>https://dev.to/johncardenasp/prototype-y-herencia-prototipal-javascript-kc7</link>
      <guid>https://dev.to/johncardenasp/prototype-y-herencia-prototipal-javascript-kc7</guid>
      <description>&lt;p&gt;El prototype o prototipo es un concepto casi único de JavaScript. Este concepto se aleja de la forma en la cual normalmente se manejan las clases en un lenguaje de programación. En JAVA, por ejemplo, creamos una clase y luego la instanciamos. Pero en JS eso no se puede hacer, porque el pequeño gran detalle es que: &lt;strong&gt;en JavaScript no existen las clases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Al todo ser objetos en este lenguaje de programación debemos instanciarlos a partir de un objeto original, o bien, heredar a otros objetos. Y es aquí donde aparecen los conceptos de prototipo y su modelo de herencia prototipal.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Que es un prototipo y la herencia prototipal?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Un prototipo es un objeto que existe como una propiedad en todas las funciones de JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;¿No recuerdas que es una propiedad? Tranqui, a todos nos pasa. Como ya lo mencioné antes, JavaScript está basado en objetos. Entonces, &lt;strong&gt;un objeto es una colección de propiedades, y una propiedad es una llave (key) y un valor para esa llave (value)&lt;/strong&gt;. Aquí un ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbz0810b6jioxav7sdz8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbz0810b6jioxav7sdz8f.png" alt="Prototype y herencia prototipal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Siempre que pedimos una propiedad o un método a una función y no se encuentra, se busca en el prototipo del objeto. El prototipo, a su vez es también un objeto llamado &lt;code&gt;_Prototype_&lt;/code&gt; y este objeto &lt;code&gt;_Prototype_&lt;/code&gt; es una propiedad del objeto global: &lt;code&gt;_Object_&lt;/code&gt;. Y como a todo objeto en JavaScript, se le pueden agregar nuevas propiedades y métodos. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;// En este lenguaje pasan cosas raras... Lo sé. Sigamos:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esto se le conoce como &lt;strong&gt;cadena de prototipos&lt;/strong&gt;. Y es la razón por la cual otros objetos pueden tener disponibles propiedades y métodos de otros objetos. Veamos unos ejemplos:&lt;/p&gt;

&lt;p&gt;Primero, creamos un objeto normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      const character = {
        name: "Vegeta",
      };

      character.hi = function () {
        alert(`Me llamo ${this.name} y soy un personaje`);
      };

      character.hi();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto con un objeto puede estar bien y no causar problemas. Pero, ¿y si tenemos más de 50 objetos? ¿vamos a crear un función saludar por cada objeto? Esto es muy poco escalable. Busquemos otra forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      const characterMethods = {
        hi: function () {
          console.log(`Me llamo ${this.name} y soy un personaje`);
        },
      };

      function Character(name) {
        const character = {
          name: name,
        };

        character.saludar = characterMethods.hi;
        return character;
      }

      const vegeta = Character("Vegeta");
      vegeta.hi();

      const pikachu = Character("Pikachu");
      pikachu.hi();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Más sencillo y más funcional ¿cierto? Simplemente creamos dos objetos, uno donde guardamos los métodos y propiedades (&lt;em&gt;characterMethods&lt;/em&gt;) y otro donde guardamos nuestros personajes (Characters). Pero... esto se puede hacer de forma mucho más sencilla con los prototipos y la herencia prototipal.&lt;/p&gt;

&lt;p&gt;Y aquí veremos algo nuevo llamado: &lt;code&gt;object.create&lt;/code&gt;. Básicamente, es uno de los métodos para crear objetos en JavaScript. Recibe dos argumentos: &lt;code&gt;Object.create(prototypeObject, propertiesObject)&lt;/code&gt;. El prototipo del objeto y las propiedades del objeto. Veamos su funcionamiento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      function Character(name) {
        // Iniciamos el uso del Object.create.
        const character = Object.create(Character.prototype);
        character.name = name;

        return character;
      }

      // Iniciamos el uso de Object.prototype
      Character.prototype;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como lo mencioné al principio de este post en la definición de prototipo, todas las funciones tienen un objeto prototype. Al principio &lt;code&gt;Character.prototype&lt;/code&gt; (el objeto de las funciones) es un objeto vacío. Pero, una vez más, como lo dije al principio: a todo objeto se le pueden agregar nuevas propiedades y métodos. Hagamos que &lt;code&gt;prototype&lt;/code&gt; deje de estar vacío 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      function Character(name) {
        // Iniciamos el uso del Object.create.

        const character = Object.create(Character.prototype);
        character.name = name;

        return character;
      }

      // Iniciamos el uso de Object.prototype
      Character.prototype;

      // Agregamos un método a Character.prototype
      Character.prototype.hi = function () {
        console.log(`Me llamo ${this.name} y soy un personaje`);
      };

      const vegeta = Character("Vegeta");
      // Usamos el método agregado a Character.prototype
      vegeta.hi();

      const pikachu = Character("Pikachu");
      pikachu.hi();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Y listo! ¡Funciona! El código en el que trabajamos ahora es mucho más limpio, hay menos código repetido y sobre todo y más importante, es mucho más reutilizable y mantenible. Podemos agregar nuevos métodos y propiedades sin que todo se rompa, simplemente tendríamos que agregar un nuevo método a &lt;code&gt;Character.prototype&lt;/code&gt;. No tendremos que crear muchas funciones o hacer que muchas propiedades y métodos dependan de un solo objeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué aprendizaje te puedes llevar de este post?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Todo en JavaScript acaba en el objeto &lt;code&gt;Object&lt;/code&gt;, el cual es el objeto global. Todo se hereda de allí y si alguna función no encuentra un método o una propiedad la buscará en el objeto global. Si no la encuentra en el objeto global se imprimirá un error.&lt;/li&gt;
&lt;li&gt;La forma en la que un objeto puede acceder a propiedades y métodos de otro objeto hasta llegar al objeto global se llama &lt;strong&gt;herencia prototipal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;propotype&lt;/code&gt; es un objeto que tienen todas las funciones en JavaScript. Inicia vacío pero se le pueden ir agregando nuevos métodos y propiedades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que hayas podido comprender un poco más este tema.&lt;/p&gt;

&lt;p&gt;Nos vemos en un próximo post. 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  Fuentes consultadas:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/Object_prototypes" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.platzi.com" rel="noopener noreferrer"&gt;Platzi&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Cómo funciona el motor de JavaScript</title>
      <dc:creator>John</dc:creator>
      <pubDate>Mon, 05 Oct 2020 20:58:37 +0000</pubDate>
      <link>https://dev.to/johncardenasp/como-funciona-el-motor-de-javascript-jfb</link>
      <guid>https://dev.to/johncardenasp/como-funciona-el-motor-de-javascript-jfb</guid>
      <description>&lt;p&gt;Hoy vas a entender de una vez por todas cómo funciona el JavaScript Engine para que sepas que pasa con cada línea de código que escribes en tu proyecto.&lt;/p&gt;

&lt;p&gt;¡Comencemos! 👩‍💻&lt;/p&gt;

&lt;h2&gt;
  
  
  Motores
&lt;/h2&gt;

&lt;p&gt;Los motores son esas programas que se encargan de convertir código de alto nivel (JavaScript, Python, C) a código de bajo nivel (Machine Code, Bytecode). Cada navegador tiene su propio motor para compilar e interpretar JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V8 Engine (Google Chrome), el cual también es motor de Node.js (En este nos basaremos para la explicación).&lt;/li&gt;
&lt;li&gt;Spider Monkey (Mozilla Firefox).&lt;/li&gt;
&lt;li&gt;Chakra (Microsoft Edge).&lt;/li&gt;
&lt;li&gt;JavaScriptCore (Apple Safari).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  La llegada de V8 y su importancia
&lt;/h3&gt;

&lt;p&gt;El día 2 de septiembre de 2008 se lanzó la primera versión del motor V8, sin saber del todo que iban a ser el gran cambio en la interpretación de JavaScript en el navegador, este dejaría de ser tan lento como lo era.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo lo hicieron?&lt;/strong&gt;&lt;br&gt;
Entre todas las razones, la principal está en los conceptos &lt;strong&gt;compilador&lt;/strong&gt; e &lt;strong&gt;intérprete&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;compilador&lt;/strong&gt; es el programa encargado de convertir código escrito en un lenguaje de programación a otro lenguaje de programación de bajo nivel. Por ejemplo, el compilador del V8 es el encargado de transformar JavaScript a Bytecode y luego a Machine Code.&lt;/p&gt;

&lt;p&gt;Por otra parte, el &lt;strong&gt;intérprete&lt;/strong&gt; es el encargado de revisar el código línea por línea y ejecutarlo directamente en la máquina de destino. Cabe resaltar que los intérpretes también realizan algún trabajo de traducción al igual que los compiladores.&lt;/p&gt;
&lt;h3&gt;
  
  
  Entendiendo como funciona V8
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fycl5kp4ep53ggky5h3p3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fycl5kp4ep53ggky5h3p3.png" alt="Motor de JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagen tomada del &lt;a href="https://platzi.com/clases/javascript-profesional/" rel="noopener noreferrer"&gt;Curso Profesional de JavaScript en Platzi&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cuando llega un script al navegador el motor V8 inicia un proceso el cual consta de:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recibir el código JavaScript como un flujo de bytes UTF-16 y pasarlo a un decodificador de flujo de bytes (el cual hace parte del motor).&lt;/li&gt;
&lt;li&gt;Parsear (transformar) el código y descomponerlo en tokens (los tokens son elementos de js como: &lt;strong&gt;let, new, símbolos de operaciones, functions, promises&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Gracias a el anterior parseo se genera una estructura de datos en forma de árbol, o bien, &lt;em&gt;Abstract Syntax Tree&lt;/em&gt; (AST). V8 cuenta con dos tipos de parseo que verás más abajo.&lt;/li&gt;
&lt;li&gt;El intérprete recorre el AST y va generando el bytecode.&lt;/li&gt;
&lt;li&gt;Luego de interpretar todo el código, el &lt;em&gt;profiling data&lt;/em&gt; va evaluando el bytecode varias veces más y de esta forma descubre que puede enviarle al &lt;em&gt;optimizing compiler&lt;/em&gt;, el cual se encarga de optimizar el código &lt;em&gt;bytecode&lt;/em&gt; a &lt;em&gt;machine code&lt;/em&gt; y así se reemplaza el código base para ejecutar el código JavaScript más rápido y usar menos recursos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El &lt;strong&gt;optimizing compiler&lt;/strong&gt; encuentra los puntos donde el código se puede optimizar. Normalmente optimiza el código que se repite varias veces. En caso de que la operación cambie por alguna razón, el código vuelve a la versión anterior (la des-optimizada). Esto se hace para consumir menos recursos y por lo tanto ejecutar el código más rápido.&lt;/p&gt;

&lt;p&gt;Por ejemplo, este código puede ser optimizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function add(a, b) {
   return a + b;
}

for(let i = 0; i &amp;lt; 1000; i++) {
   add(i, i)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando ese código se ejecute unas 50 veces, estará listo para ser optimizado porque el profiling data sabe que no cambiará.&lt;/p&gt;

&lt;p&gt;Si se cambia el código por alguna razón:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function add(a, b) {
   return a + b;
}

for(let i = 0; i &amp;lt; 1000; i++) {
   add(i, i)
}

add(1, "uno")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Volverá a su versión anterior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de parseo
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eager Parsing&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Encuentra errores de sintaxis.&lt;/li&gt;
&lt;li&gt;Crea el AST.&lt;/li&gt;
&lt;li&gt;Construye scopes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Parsing&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Doble de rápido que el eager.&lt;/li&gt;
&lt;li&gt;No crea el AST.&lt;/li&gt;
&lt;li&gt;Construye scopes parcialmente.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El proceso de parsing hace parte del 15% — 20% del proceso de ejecución así que hay que tenerlo muy en cuenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diferencias entre motores
&lt;/h3&gt;

&lt;p&gt;Los motores de los demás navegadores tienen casi el mismo proceso de ejecución del V8 Engine ya que fueron creados a partir de este. Cuentan solo con algunas pequeñas diferencias. Como por ejemplo en las capas de optimización:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V8 Engine (Chrome): 1 Sola capa de optimización.&lt;/li&gt;
&lt;li&gt;Spider Monkey (Firefox): Tiene 2 capas de optimización.&lt;/li&gt;
&lt;li&gt;Chakra (Edge): Tiene 2 capas de optimización.&lt;/li&gt;
&lt;li&gt;JavaScriptCore (Safari): Tiene 3 capas de optimización.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los de 2–3 capas se ejecutan un poco más lento pero se optimizan más rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concluyendo
&lt;/h3&gt;

&lt;p&gt;¡Eso es todo! Así funciona el motor V8 de JavaScript desarrollado para el navegador Chrome.&lt;/p&gt;

&lt;p&gt;No olvides practicar y nos vemos en el próximo post 🚀&lt;/p&gt;




&lt;p&gt;Cover image courtesy of &lt;a href="https://midu.dev/" rel="noopener noreferrer"&gt;midu.dev&lt;/a&gt;. For more credits, please contact me.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
