Skip to content

Introducción en Español

Ignacio Perez edited this page Dec 5, 2023 · 5 revisions

Introducción

Note

Este panorama puede cambiar, ya que el lenguaje está en desarrollo y evolución; apenas se encuentra en sus primeras etapas y por ahora, es simplemente un lenguaje de juguete.

Ignis es un lenguaje de programación de propósito general, con tipado estático y fuerte, además de inmutabilidad por defecto en variables. Los lenguajes que inspiraron a Ignis son TypeScript y Rust. Este cuenta con un Garbage Collector para la gestión de memoria de las clases y reglas de ownership y borrowing similares a las de Rust. El objetivo de Ignis no es ser utilizado por todo el mundo, sino ser un lenguaje que me permita aprender cómo se crea y funciona un lenguaje de programación. Y, si de paso puedo usarlo para crear scripts que reemplacen código escrito en Bash u otros lenguajes, especialmente Lua y Python (odio Lua), sería ideal.

Objetivos del Lenguaje

El principal objetivo es que sea un lenguaje parecido a TypeScript, sin los aspectos negativos de este, que son el transpilalado a JavaScript y evitar los problemas que ello conlleva. También se busca que posea características de Rust, como la inmutabilidad de las variables, el tipado estático, y el ownership y borrowing de variables y funciones.

También tendrá un Garbage Collector pequeño para la gestión de memoria de clases y estructuras de datos, pero con reglas de ownership de variables como en Rust. La intención de establecer esto como un punto medio entre las dos ideas es evitar la penalización de un GC enorme y no tener los problemas de lifetime que existen en Rust con las estructuras, es decir, aprovechar lo mejor de ambos mundos.

Además, transpilará a Lua (odio Lua) para no tener que usar Lua directamente nunca más. Existen alternativas para Lua que transpilan a este con tipado estático, pero ninguna me satisface.

import { println } from "std:io";

function main(): void {
  println("Hello World");
}

Inicialmente, el lenguaje iba a ser compilado a binario por defecto, con la opción de ser interpretado para reemplazar scripts en Bash o Python. Sin embargo, la primera opción aún no está disponible debido a su complejidad y a ciertos problemas con LLVM. Esta sigue siendo una opción, pero por ahora y por razones de practicidad, se optará por un ByteCode y una máquina virtual.

Objetivos Específicos

Tener una Sintaxis Estilo TypeScript

Ya la tiene; es una de las primeras cosas que se implementaron. Aún faltan características, como las clases, enums, template literal, arrow functions, etc. Pero se irán añadiendo poco a poco.

Compilado

Como mencioné, no es compilado por el momento debido a limitaciones técnicas.

Tipado Estático y Estricto

Esta es una de las mejores características del lenguaje. Nunca más tendré que aguantar que un objeto devuelva undefined porque su propiedad no existe o que se sume un número y un string porque no sabes qué te está llegando como parámetro de una función.

Posibilidad de Transpilado a Lua

La idea es que el lenguaje pueda transpilarse a Lua con el objetivo de configurar NeoVim. La meta sería tener una librería de Ignis con la firma de la API de NeoVim y facilitar la adición de las APIs de los plugins que se elijan.

Compatibilidad con Scripting

No quiero que esta sea la función principal, pero tal vez con el ByteCode, se pueda sortear esta restricción. Mi objetivo con esto es reemplazar los scripts que tengo en mi sistema con código en Ignis.

Librería Estándar

Obviamente, un lenguaje digno debe contar con una buena librería estándar. Cosas que quiero que tenga esta librería:

Una Buena Librería HTTP

No puede ser que un desarrollador de backend tenga una librería HTTP deficiente. Mi objetivo es que se pueda hacer un backend 100% funcional con la librería estándar.

Librería de Test

Similar a la librería que viene incluida con Rust.

Librería CLI

Para facilitarme la vida al hacer scripts y comandos. Al estilo de clap de Rust pero integrado en la librería estándar.

IO

No hay lenguaje serio que no tenga entrada y salida estándar.

Gestión de Memoria

Principalmente para poder reimplementar el GC en Ignis sin problemas.

Env

Para acompañar a la librería HTTP.

Regex

Una librería de Regex.

Math

Funciones y constantes para realizar matemáticas en Ignis.

Time

Esto me gustaría hacer un énfasis importante y correcto para no tener un Date de JavaScript y no depender de una librería externa.

Primitivos

La principal idea de los primitivos no es los primitivos per se, sino los métodos asociados a ellos, como puede ser un .toString() en todos los tipos de datos, o un conversor de string a int, por ejemplo. Cosas necesarias para poder trabajar en un lenguaje de programación con tipado estático y estricto.

"Package" Manager

No es algo que sí o sí tiene que estar, pero sería bueno que si se crean librerías o programas en Ignis, puedan bajarse, instalarse o agregarse a un proyecto. Más o menos como sería Cargo en Rust o NPM para Node. No tengo grandes aspiraciones, no creo tener un repositorio central donde se descarguen las cosas; simplemente que se descarguen desde GitHub o un repositorio git sirve.