Deno (software)

De Wikipedia, la enciclopedia libre
Deno
Información general
Tipo de programa software libre
Autor Ryan Dahl
Desarrollador Varios
Lanzamiento inicial 13 de mayo de 2018
Licencia MIT license[1][2]
Información técnica
Programado en
Versiones
Última versión estable 1.42.416 de abril de 2024
Enlaces

Deno es un runtime para JavaScript y TypeScript basado en el motor V8 y escrito en Rust. Fue creado por Ryan Dahl, creador original de Node.js, y se enfoca en seguridad y productividad.[4]​ Fue anunciado por Dahl en el 2018 durante su charla “10 cosas de las que me arrepiento de Node.js”.[5]​ Deno toma la función de ambos runtime y gestor de paquetes dentro de un solo ejecutable, en vez de requerir un programa de gestión de paquetes separado.[6][7]

Historia[editar]

Deno fue anunciado en JSConf UE 2018 por Ryan Dahl en su charla "10 cosas de las que me arrepiento de Node.js".[5]​ En su charla, Ryan mencionó sus remordimientos sobre las decisiones de diseño iniciales con Node.js, enfocándose en sus decisiones de no utilizar promesas en el diseño de API, usando del sistema de construcción anticuado GYP, node_modules y package.json.

Finalmente presentó el prototipo de Deno, buscando hacer las llamadas a sistema a través del paso de mensajes con herramientas de serialización tales como Protocol Buffers, y proporcionar banderas de línea de comando para control de acceso.

Deno fue inicialmente escrito en Go, utilizando Protocol Buffers para serialización entre los lados privilegiado (Go, con acceso de llamada del sistema) y no-privilegiado (V8).[8]​ Aun así, Go fue pronto reemplazado con Rust debido a preocupaciones por double runtime y la recolección de basura.[9]​ Usa Tokio en vez de libuv como la plataforma conducida por eventos (event drive) asíncrona, y se adopta FlatBuffers para una serialización y deserialización "Zero Copy" más rápida. Más tarde, en agosto de 2019, FlatBuffers era finalmente sacado después de haberse publicado benchmarks en abril de 2019 que medían una sobrecarga significativa de la serialización.[10][11][12][13]

Una librería estándar, modelada al estilo de la librería estándar de Go, fue creada en noviembre de 2018 para proporcionar una extensa cantidad de utilidades y herramientas, parcialmente solucionando el problema de Node.js de la explosión del árbol de dependencias.[14]

Deno 1.0 oficial fue liberado el 13 de mayo de 2020.[15]

Visión general[editar]

Deno busca ser un entorno de scripting productivo y seguro para el programador moderno.[6]​ Similar a Node.js, Deno enfatiza en arquitectura manejada por eventos, proveyendo un conjunto de utilidades de entrada/salida asíncronas(no bloqueantes), además de sus versiones síncronas(bloquenates). Deno puede ser usado para crear servidores web, llevar a cabo computación científica, etc.

Comparación con Node.js[editar]

Tanto Deno como Node.js son runtimes basados en el motor V8 de Google, el mismo motor utilizado en Google Chrome. Ambos tienen event loops, proporcionan interfaces de líneas de comando para ejecutar scripts, además de una amplia gama de utilidades de sistema.

Deno principalmente se diferencia de Node.js en los siguientes aspectos:[6]

  1. Usa el módulo ES como el sistema de módulo por omisión, en vez de CommonJS.
  2. Usa URLs para cargar dependencias locales o remotas, similar a los navegadores.
  3. Incluye un manejador de paquetes interno para la bajada de recursos, sin necesidad de npm.
  4. Soporta TypeScript nativamente usando un compilador TypeScript capturado (snapshotted TypeScript Compiler).
  5. Mejor compatibilidad con navegadores con una amplia gama de APIs Web.
  6. Permite controlar el sistema de archivos y el acceso de red para correr código en entorno de pruebas (Sandbox).
  7. Redefinición del API para utilizar Promesas, ES6 y características TypeScript.
  8. Minimiza el tamaño del API básico, mientras proporciona una biblioteca estándar grande sin dependencias externas.
  9. Utiliza canales de paso de mensajes para invocar APIs del sistema con privilegio y utilizar ligaduras (bindings).

Ejemplo[editar]

La siguiente ejecuta un script básico de Deno sin ningún permiso de lectura/escritura/red (modo sandbox):

deno run main.ts

Banderas explícitas son requeridas para activar permisos:

deno run --allow-read --allow-net main.ts

Para inspeccionar el árbol de dependencia del script, use el subcomando info:

deno info main.ts

Un programa Hola-mundo básico en Deno se parece es algo así a (como en Node.js):

console.log("Hello world");

Deno proporciona un espacio de nombre global para la mayoría de las APIs de Deno que no están disponibles en el navegador. Un programa Cat de Unix podría ser implementado como sigue:

/* cat.ts */

/* Las APIs de Deno están expuestas a través del namespace `Deno`. */
const { readFile, args } = Deno;

// await de alto nivel es soportado
for (const file of args) {                              // Itera por cada elemento de los argumentos
    const bytes = await readFile(file);                 // Abre el archivo correspondiente para lectura (en un Uint8Array)
    const plainText = new TextDecoder().decode(bytes)   // Usa la API TextDecoder del navegador para decodificar los bytes
    console.log(plainText)                              // Muestra en la consola el texto decodificado
}

La función Deno.copy de arriba trabaja de manera similar como io.Copy de Go, donde stdout (Salida estándar) es el destino Writer y file es la fuente Reader. Para correr este programa, necesitamos proporcionar el permiso de lectura del sistema de archivos:

deno run --allow-read cat.ts myfile

El siguiente script de Deno implementa un servidor de HTTP básico:

// Importa `serve` desde la librería estandar remota de Deno, usando URL.
import { serve } from "https://deno.land/std@v0.195.0/http/server.ts";

// La función `serve` retorna un iterador asíncrono, invocando un flujo de llamadas
for await (const req of serve({ port: 8000 })) {
    req.respond({ body: "Hello World\n" });
}

Cuando se ejecuta este programa, Deno automáticamente descarga y cachea las librerías remotas y compila el código. De forma similar, podemos correr un script de librería estándar (como un servidor de archivo) directamente sin explícitamente descargarlo, proporcionando la URL como archivo de entrada ( -A activa todos los permisos):

$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file_server.ts
Compile https://deno.land/std/http/file_server.ts
...
HTTP server listening on http://0.0.0.0:4500/

Referencias[editar]

  1. «deno/LICENSE at master». GitHub. Consultado el 5 de julio de 2019. 
  2. «The MIT License». Open Source Initiative. 17 de septiembre de 2018. Consultado el 17 de septiembre de 2018. 
  3. «Deno 1.3.1». Consultado el 21 de agosto de 2020 – via GitHub. 
  4. «Deno: Secure V8 TypeScript Runtime from Original Node.js Creator». InfoQ. Consultado el 17 de mayo de 2019. 
  5. a b JSConf (6 de junio de 2018), 10 Things I Regret About Node.js - Ryan Dahl - JSConf EU 2018, consultado el 17 de mayo de 2019 .
  6. a b c «Deno Manual». deno.land. Archivado desde el original el 15 de abril de 2020. Consultado el 17 de mayo de 2019. 
  7. Paul Krill (21 de junio de 2018). «Ryan Dahl’s Node.js regrets lead to Deno». InfoWorld. 
  8. «denoland/deno, branch "golang"». Github. 
  9. «Suggestion: Look into porting to Rust and using Tokio». GitHub. 
  10. «Tokio - The asynchronous run-time for the Rust programming language.». Tokio.rs. 
  11. «Protobuf seems like a lot of overhead for this use case?». Github. 
  12. «Remove flatbuffers». GitHub. 
  13. «Replace flatbuffers». GitHub. 
  14. «denoland/deno_std: deno standard modules». Github. 
  15. «Deno 1.0». deno.land. Consultado el 14 de mayo de 2020. 

Enlaces externos[editar]