Un lenguaje de programación nica


Ni es un lenguaje de programación esotérico escrito por mí en Lua influenciado por Brainfuck. El nombre Ni viene de Nicaragua. No es un lenguaje de programación que deba tomarse en serio, si no mas bien, como un juguete.

Hace un tiempo hice un artículo sobre brainfuck que pueden ver aquí: https://www.deybismelendez.com/2020/01/interprete-brainfuck-lua.html

Ahí se explica básicamente cómo funcionan estos lenguajes, ahora bien, ¿Cómo funciona Ni?

Ni opera con un arreglo de números enteros, en referencia a la cinta de la máquina de Turing al igual que brainfuck, contiene un total de 65,536 celdas que se inicializan en cero. Cada celda contiene un número entero de 64 bits.

Ni tiene un cabezal que apunta a la memoria de una celda del array que puedes manipular con instrucciones.

Ni también maneja un clipboard, como una variable global a la que se puede acceder y modificar en cualquier momento.

Instrucciones

InstrucciónDescripción
>Mueve el cabezal a la derecha
<Mueve el cabezal a la izquierda
+Suma 1 al número de la celda apuntada
-Resta 1 al número de la celda apuntada
@Lee un byte, lo convierte a número y lo almacena en la celda apuntada
.Imprime en pantalla el número almacenado en la celda apuntada
!Imprime en pantalla el equivalente ASCII del número almacenado en la celda apuntada
#Establece un valor hexadecimal de dos dígitos en la celda apuntada
?Copia el número de la celda apuntada
=Almacena el número copiado en la celda apuntada
*Convierte a 0 el número de la celda apuntada
$Mueve el cabezal hacia el indice del número hexadecimal de 4 digitos que se escriba a continuación
[](While) Bucle que continua ejecución si la celda apuntada no es igual a 0
{}(For) Bucle que ejecuta las instrucciones el número de veces que indica la memoria de la celda apuntada
()(if) Ejecuta el conjunto de instrucciones si el número apuntado no es igual a 0
/Ignora el resto de la línea

Ejemplo:

Un ejemplo básico es crear un código que escriba los números enteros en orden, para hacer eso tendríamos que crear una variable con valor 0, imprimirlo, luego sumarle 1 en un bucle infinito.

En Ni sería lo siguiente:

+[>.+<]

Explicación

Al sumar a la celda inicial 1, nos aseguramos que el bucle [] sea infinito ya que tendrá el valor 1 y no 0, dentro del bucle tenemos >.+<, que es moverse a la derecha (siguiente celda) imprimir el número (inicialmente 0) luego sumar 1 a esa celda y regresar a la celda inicial que vale 1.

Sin embargo, al ejecutar esto, nos va a imprimir infinitamente los números y tendremos que cancelar la operación para detenerlo (Ctrl+C) y sin separación o salto de línea, lo que hace que sea ilegible, vamos a mejorarlo un poco.

#0a>+[>.+<<!>]

Ahora almacenamos el número hexadecimal 0a en la primer celda, el equivalente al salto de línea, movemos el puntero a la derecha, sumamos 1 para hacer el bucle infinito, y a partir de ahí nos ubicamos en la siguiente celda, imprimimos, sumamos 1, nos devolvemos a la celda inicial (<<, hacia la izquierda), imprimimos el caracter ASCII y nos devolvemos a la celda del bucle (>), de manera que se ejecute infinitamente.

Ahora supongamos que solo queremos escribir los 100 primeros números enteros positivos, entonces cambiamos el bucle while por el del for.

#0a>+#64{>.+<<!>}

El único cambio es el del bucle y en lugar de sumar (+) insertamos el valor hexadecimal 64, equivalente a 100, entonces, solo ejecutará el código 100 veces.

Ahora que ya entiendes como funciona Ni, ¿Puedes escribir el Hola Mundo?

Puedes ver todo sobre Ni en: https://github.com/DeybisMelendez/ni

Descargar el intérprete aquí: https://github.com/DeybisMelendez/ni/releases