Un lenguaje de programación esotérico es un lenguaje de programación diseñado para desafiar las normas del diseño del lenguaje. Es un lenguaje diseñado para hacer un punto. El punto podría ser cualquier cosa: el desafío en sí de crear algo inusual, hacer una broma elaborada, crear un lenguaje como expresión artística, probar ideas prometedoras para la programación, etc.
Esto debería dejar claro que no hay una manera fácil de categorizar u organizar adecuadamente todos los diferentes lenguajes de programación esotéricos, ya que por definición desafían las reglas. Pero podríamos usar algunos conceptos y principios de organización para tener una mejor idea de la comunidad que los rodea. Para que podamos entender para qué los usa la gente, o para usar esta información como inspiración para crear su propio lenguaje esotérico.
Descargue la guía con 68 recursos sobre la Creación de Lenguajes de Programación
Recibe la guía en tu bandeja de entrada para leerla en todos tus dispositivos cuando tengas tiempo
Algunos conceptos útiles
Turing Tarpit
Un tarpit de Turing es un lenguaje de programación Turing completo, pero prácticamente inutilizable. Un lenguaje completo de Turing puede simular cualquier máquina de Turing. En términos prácticos, puede escribir cualquier programa con él. Así que, en teoría, todos estos lenguajes son igualmente poderosos, pero los que también son un Tarpit de Turing hacen increíblemente difícil escribir cualquier tipo de programa. Una forma común de hacerlo es reducir el número de símbolos disponibles: intente escribir incluso un programa Hello World con solo 8 caracteres.
Quine
Un quine es un programa que produce como salida una copia de su código fuente. El programa no puede ser el programa vacío, incluso si el programa vacío es un programa válido en el idioma específico. Leer el código fuente desde el disco o la memoria también se considera hacer trampa. El nombre «quine» fue acuñado por Douglas Hofstadter, en su libro Gödel, Escher, Bach: An Eternal Golden Braid, en honor del filósofo Willard Van Quan Quine. Por lo tanto, el concepto de quine no es exclusivo de los lenguajes de programación esotéricos, pero sin embargo es un primer desafío típico a superar al escribir uno.
Code Golf
Un code golf es un tipo de competición en la que el objetivo es escribir el programa más corto posible que implemente un determinado algoritmo. En este contexto, shortest significa tener el código fuente más corto. No significa tener el tamaño más pequeño del código ejecutable binario. Jugar al golf de código se llama «scripting de golf». También hay todo tipo de concursos relacionados con la programación, que, dado el público, a menudo fomentan el engaño creativo. En términos generales, un desafío es un factor de motivación para muchos lenguajes de programación esotéricos.
Ofuscación
El concepto de ofuscación, es decir, ocultar el significado real de un mensaje, obviamente no es exclusivo de los lenguajes de programación esotéricos o incluso de la programación en general. Pero tiene una gran relevancia en muchos lenguajes de programación esotéricos. Especialmente si lo desea en el sentido general más amplio de engañar o confundir al destinatario. No estás ocultando el mensaje porque el mensaje en sí es importante, sino porque la forma oculta es, en sí misma, el objetivo. Una forma típica de lograr esto es minimizando el número de símbolos del lenguaje, pero también puede camuflar un lenguaje de programación en lo que parece un texto normal o una imagen.
No Determinismo
En este significado más amplio de engañar o confundir a la audiencia, el no determinismo también se puede usar para lograr el mismo objetivo. Un lenguaje no determinista es aquel para el cual, dado el estado actual de un programa, no siempre se puede predecir el siguiente estado. El concepto tiene cierto uso en lenguajes de programación normales, esencialmente debido a condiciones impredecibles en tiempo de ejecución. Pero es llevado al extremo por ciertos lenguajes de programación esotéricos, aleatorizando variables o incluso aleatorizando las instrucciones mismas.
Grupos De Lenguajes de Programación Esotéricos
Como ya hemos dicho, no podemos proporcionar una forma exhaustiva de organizar todos los lenguajes de programación esotéricos. E incluso si alguien pudiera encontrarlo, pronto alguien inventaría un nuevo lenguaje de programación esotérico solo para hacerlo inválido. Así que lo que estamos tratando de hacer es simplemente ofrecer algunos grupos, o categorías, para comprender y explorar mejor el mundo de los lenguajes de programación esotéricos.
- Idiomas con un valor objetivo, aunque este valor no es necesariamente extrínseco o típico. Un ejemplo básico es un lenguaje diseñado para ganar una competición de golf de código: su valor se puede medir, pero no tiene significado fuera de la comunidad de lenguajes de programación esotéricos. Pero los más útiles son los diseñados para lograr un objetivo inusual, como eludir las medidas de seguridad (ver JSFuck) o definir lenguajes de tipo 0 de la jerarquía de Chomsky (ver Thue).
- Idiomas inutilizables. Estos son idiomas que son muy difíciles de usar. Esto puede ser un objetivo explícito del diseñador o simplemente un accidente del diseño en sí. Un usuario puede incluso encontrar divertido usarlos durante algún tiempo. Una forma típica de lograr un lenguaje inutilizable, tanto por diseño como por accidente, es con el minimalismo (ver Brainfuck). Pero si quieres algo casi imposible de usar, necesitas algo como un lenguaje que use un sistema ternario y se altere a sí mismo a propósito, entre otras cosas (ver Malbolge).
- Idiomas para probar una idea o probar algo. Estos son idiomas que pueden no ser directamente útiles, pero son un buen campo de prueba para un nuevo concepto o para probar algo. Por ejemplo, un lenguaje en el que los programas están dispuestos en una cuadrícula bidimensional (véase Befunge) o un lenguaje funcional casi puro (véase Unlambda)
- Lenguajes artísticos. Son lenguajes diseñados con la idea de tener algún valor artístico. Se podría argumentar que son efectivamente parte del grupo de los lenguajes de prueba o los que tienen un valor objetivo. Los colocamos en una categoría diferente, porque no se parecen a la programación, pero tienden a verse interesantes, incluso si es posible que no desee usarlos. Por ejemplo, parecen arte abstracto (véase Piet) o una obra de teatro Shakesperiana (véase Shakespeare).
- Idiomas de bromas. Estos son lenguajes inventados con personas con un extraño sentido del humor. Como una persona que dice: «¿quieres escuchar un chiste? – luego se lee Guerra y Paz, antes de concluir – ¡Toda nuestra vida es una broma!». Un ejemplo es un lenguaje satírico, donde incluso el manual de referencia es una broma (ver INTERCAL)
Algunos Lenguajes Esotéricos notables
Por supuesto, esta no es una lista exhaustiva de lenguajes de programación esotéricos notables, sino más modestamente una lista de algunos notables por su éxito o peculiaridad.
Befunge
La principal característica esotérica de Befunge es que los programas están dispuestos en una cuadrícula bidimensional. También es un lenguaje basado en pila y reflexivo, por lo que permite que un programa se altere a sí mismo. El objetivo principal era diseñar un lenguaje para el que fuera lo más difícil posible crear un compilador.
La versión original, ahora llamada Befunge-93, no es Turing completa, porque pone un límite de 80×25 al tamaño de la cuadrícula. Pero una nueva versión, llamada Befunge-98, elimina este límite y debería estar completa. Befunge ha generado toda una clase de lenguajes multidimensionales, llamados Fungeoid.
Befunge tiene comandos que controlan la dirección arriba, abajo, izquierda, derecha y, por lo tanto, también puede crear un ciclo, junto con comandos más tradicionales para salida, operaciones binarias, etc.
Un programa de palabras Hola se ve así.
> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@
Brainfuck
Probablemente el más famoso de todos los lenguajes de programación esotéricos, es notable por su minimalismo extremo. Tanto en el número de comandos disponibles como en tener un compilador muy pequeño. De hecho, la segunda condición es la razón de la primera, porque el autor quería crear un lenguaje con el compilador más pequeño posible. El autor creó un compilador que usaba solo 240 bytes. A veces, más tarde, alguien más creó uno con solo 100 bytes. Una consecuencia natural de este objetivo es que el lenguaje es difícil de usar, aunque es Turing completo. En resumen, es una lona de Turing.
A veces se hace referencia con una ortografía censurada, como Brainf * ck o muchas otras variaciones.
El lenguaje consiste en ocho comandos diferentes que manipulan un puntero de datos y dos flujos de bytes para entrada y salida. También soporta bucles. Otros caracteres, además de los que representan los comandos, se consideran comentarios e ignorados por el compilador.
Este es un ejemplo de cómo funciona el lenguaje (tomado de la wiki de Esolangs).
Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while
Un programa Hello World se ve así.
++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Si desea obtener más información, puede verlo en la página de Wikipedia o en la página de Esolangs correspondiente.
INTERCAL
INTERCAL puede no haber sido el primer lenguaje de programación esotérico, pero sin duda es el primero famoso. ¿Qué edad tiene? Fue creado en 1972 y la primera implementación se realizó con tarjetas perforadas. El lenguaje fue pensado como una parodia, pero también para hacer algo completamente nuevo, un extraño al mundo de la programación. El nombre no es un acrónimo, según los autores:
El nombre completo del compilador es «Lenguaje Compilador Sin Acrónimo Pronunciable», que por razones obvias se abrevia «INTERCAL».»
El resto del Manual de Referencia INTERCAL (formato PS) también está lleno de afirmaciones sin sentido o humorísticas. Esto es tanto por el lenguaje que describen como por cómo lo hacen. Por ejemplo, esta es una sección sobre Variables
INTERCAL solo permite 2 tipos diferentes de variables, el entero de 16 bits y el entero de 32 bits. Estos
están representados por un punto ( . ) o de dos puntos (:), respectivamente, seguidos de cualquier número entre 1 y 65535,
inclusive. Estas variables pueden contener solo números no negativos; por lo tanto, tienen los rangos respectivos de
valores: 0 a 65535 y 0 a 4294967295. Nota: .123 y: 123 son dos variables distintas. Por otro lado,
.1 y .0001 son idénticos. Además, este último no puede escribirse como 1E-3 .
El lenguaje también permite el uso de un modificador PLEASE
. Sin embargo, también requiere el uso de la cantidad adecuada de esta palabra clave. No se puede usar muy poco o demasiado, es decir, es necesario mostrar la cantidad adecuada de cortesía. La parte realmente poco divertida es que era una característica indocumentada en el manual original. Un manual de broma para un manual de broma puede estar bien, pero uno que esté incompleto es inaceptable.
Este es un Hello World en una versión de INTERCAL implementada con C: C-INTERCAL.
DO ,1 <- #13PLEASE DO ,1 SUB #1 <- #238DO ,1 SUB #2 <- #108DO ,1 SUB #3 <- #112DO ,1 SUB #4 <- #0DO ,1 SUB #5 <- #64DO ,1 SUB #6 <- #194DO ,1 SUB #7 <- #48PLEASE DO ,1 SUB #8 <- #22DO ,1 SUB #9 <- #248DO ,1 SUB #10 <- #168DO ,1 SUB #11 <- #24DO ,1 SUB #12 <- #16DO ,1 SUB #13 <- #162PLEASE READ OUT ,1PLEASE GIVE UP
En resumen, INTERCAL es una broma muy elaborada. El tipo de broma que puede llevarte a admirar a su creador por su perseverancia o a dudar de su cordura, o tal vez ambas cosas.
JSFuck
El éxito de Brainfuck se vio impulsado por la creación de muchos lenguajes derivados, demasiados para mencionarlos a todos. Pero el más notable es JSFuck.
JSFuck no es un lenguaje apropiado, pero es más un estilo de programación esotérica de Javascript que requiere usar solo 6 caracteres. Los programas resultantes son programas JavaScript válidos y, de hecho, se inventaron para eludir técnicas de seguridad como la detección de malware. Sus propiedades lo hicieron también útil para la ofuscación de código.
funciona porque puede evaluar cualquier expresión en Javascript como cualquier tipo. Por lo tanto, representa y matriz vacía, pero anteponiéndolo con un
+
puede forzarlo a evaluar como el número 0. Para obtener una letra como a
puede manipular el valor false
, etc. El resultado final es un lenguaje extremadamente detallado: el equivalente a alert("Hello World!")
tiene 22948 caracteres.
Malbolge
Malbolge es un lenguaje diseñado específicamente para ser casi imposible de usar:
a través de una «operación loca» contra-intuitiva, aritmética de base tres y código auto-alterado
en palabras de su propio creador.
De hecho, incluso el autor nunca escribió un programa de trabajo con él. El primer programa fue generado por otro programa que implementó un algoritmo de búsqueda heurística. El lenguaje no es Turing completo y también se basa en un error ortográfico de Malebolge, el círculo ocho del infierno en el Infierno de Dante Alighieri. Así que realmente no tiene ninguna cualidad redentora.
No intentaré describirlo porque todo es explícitamente un ejercicio de frustración. Sin embargo, hay una notable «operación loca» que vale la pena mencionar: el cifrado. Se supone que el lenguaje funciona en una máquina virtual ternaria y tiene tres registros, uno de los cuales contiene un puntero a la instrucción actual y se llama . Después de ejecutar la instrucción, el módulo 94 del valor en
reemplaza lo que está en
, entonces el resultado se cifra de acuerdo con una tabla de cifrado. Bienvenido al infierno, de hecho.
Some brave soul ha creado un programa Hello World.
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Piet
Piet es un lenguaje en el que los programas se representan como pinturas de arte abstracto, al estilo de Piet Mondrian. Está basado en pilas y Turing completo.
Hay 18 colores ordenados de acuerdo con el tono y el brillo, además de blanco y negro. Estos dos últimos tienen un significado especial y se utilizan para controlar el flujo. La ejecución del programa se basa en dos «punteros»: un Puntero de Dirección y un Selector de Bloques de color. El DP puede apuntar hacia arriba, hacia abajo, a la izquierda y a la derecha, mientras que el CC solo puede apuntar a la izquierda y a la derecha. La combinación de estos dos punteros gobierna la ejecución del programa: básicamente qué bloque de color se ejecuta a continuación. El tamaño de un bloque de color representa un entero. Cuando el programa hace una transición entre diferentes bloques de color, su diferencia de tono y brillo determina el tipo de comando que se ejecuta. Los comandos son los habituales, como la salida de un valor, multiplicar, etc.
El programa Hello World tiene cierta belleza.
Shakespeare
Shakespeare es un lenguaje diseñado para tener: «código fuente hermoso que se asemejaba a las obras de Shakespeare». El lenguaje tiene pocos comandos y es funcionalmente similar al lenguaje ensamblador, pero no es de extrañar que sea bastante detallado.
Las variables deben declararse en una sección inicial y sus nombres deben ser caracteres shakesperianos válidos, como Romeo o Julieta. Estas variables son pilas en las que más tarde se ejecutarán operaciones como pop, push y entrada/salida. El nombre de los actos y escenas funciona como etiquetas goto y el destino de ciertas declaraciones condicionales. Los personajes, es decir, las variables, deben ser llamados en el escenario para ser manipulados y solo pueden haber dos a la vez en el escenario.
Las líneas generalmente representan constantes numéricas: algunos sustantivos y adjetivos se convierten en valores numéricos.
Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!
Palabras especiales, como «Recordar», o combinaciones de ellas, como «Decir lo que piensas», ejecutan comandos. Estos son comandos normales, como empujar valores en el carácter de pila, generar el valor de la variable actual o el carácter ASCII correspondiente.
Una instrucción condicional está representada por una pregunta de un carácter y una respuesta del otro carácter que determina a dónde ir, si la condición de la pregunta se evalúa como verdadera.
Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.
El Hello World es tan largo y productivo como una obra de Shakespeare.
The Infamous Hello World Program.Romeo, a young man with a remarkable patience.Juliet, a likewise young woman of remarkable grace.Ophelia, a remarkable woman much in dispute with Hamlet.Hamlet, the flatterer of Andersen Insulting A/S. Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo.Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind! You are as brave as the sum of your fat little stuffed misused dusty old rotten codpiece and a beautiful fair warm peaceful sunny summer's day. You are as healthy as the difference between the sum of the sweetest reddest rose and my father and yourself! Speak your mind! You are as cowardly as the sum of yourself and the difference between a big mighty proud kingdom and a horse. Speak your mind. Speak your mind! Scene II: The praising of Juliet.Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! Scene III: The praising of Ophelia.Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! Thou art as loving as the product of the bluest clearest sweetest sky and the sum of a squirrel and a white horse. Thou art as beautiful as the difference between Juliet and thyself. Speak thy mind! Act II: Behind Hamlet's back. Scene I: Romeo and Juliet's conversation.Romeo: Speak your mind. You are as worried as the sum of yourself and the difference between my small smooth hamster and my nose. Speak your mind!Juliet: Speak YOUR mind! You are as bad as Hamlet! You are as small as the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece. Speak your mind! Scene II: Juliet and Ophelia's conversation.Juliet: Thou art as good as the quotient between Romeo and the sum of a small furry animal and a leech. Speak your mind!Ophelia: Thou art as disgusting as the quotient between Romeo and twice the difference between a mistletoe and an oozing infected blister! Speak your mind!
Thue
Thue es un lenguaje de programación basado en un sistema de reescritura de cadenas, llamado sistema semi-Thue. No es determinista y sigue el paradigma de programación de restricciones. Lo que significa que las variables se definen en términos de restricción (ej. algo es verdadero o falso). Es una lona de Turing.
En el caso de Thue, los costes están representados por una lista de reglas de sustitución en el formulario:
<string>::=<replacement>
Los formatos especiales de este formulario representan la entrada, la salida o el final de la lista de reglas.
La naturaleza no determinista del lenguaje se puede mostrar indicando dos posibles reemplazos para la misma cadena. Por ejemplo:
- escribes una regla que dice que la cadena
a
se puede reemplazar porstupid
- también escribes una regla que dice que la cadena
a
se puede reemplazar poryou are
Cuando se ejecuta un programa, la cadena a
puede ser reemplazada por cualquiera de las dos opciones.
La lista de reglas va seguida de una cadena que representa el estado inicial.
Mientras que escribir un programa útil puede ser difícil, el típico Hello World es bastante fácil y comprensible, al menos para el estándar de los lenguajes de programación esotéricos.
a::=~Hello World!::=a
Unlambda
Unlambda es un lenguaje funcional (casi) puro diseñado para mostrar un lenguaje puramente funcional (y probablemente cuán poco práctico sería). Se basa en una lógica combinatoria. Es Turing completo y el primer tarpit de Turing funcional. Se basa en unas pocas funciones, un operador apply `
(el carácter backquote) y también admite entrada/salida. Técnicamente funciona solo en funciones con un solo argumento, pero las funciones de varios argumentos se pueden traducir en una secuencia de funciones.
Un programa Hello World parece casi legible.
`r```````````.H.e.l.l.o. .w.o.r.l.di
Otros lenguajes Esotéricos interesantes
Fuga es un lenguaje que utiliza archivos MIDI como código fuente. Los intervalos entre cada nota se traducen a comandos tradicionales específicos, como entrada/salida o adición.
Beatnik es un lenguaje basado en pila que consiste en una serie de palabras en inglés; los espacios en blanco y la puntuación se ignoran. Las palabras se convierten en comandos tradicionales de acuerdo con su valor en el Scrabble del juego.
El espacio en blanco es un lenguaje de broma en el que solo los caracteres de espacio en blanco, como tabulaciones y espacios, son válidos y cualquier otro carácter se ignora. Esto es, por supuesto, lo contrario del comportamiento habitual de los compiladores que ignoran los espacios en blanco. Dadas estas características, se puede utilizar en un programa políglota, es decir, un programa que es válido para más de un idioma. Siempre y cuando el otro lenguaje no sea Python, o cualquier lenguaje donde los espacios en blanco importen.
GolfScript es un lenguaje de programación concatenativo diseñado para ganar competiciones de golf de código, que también es Turing complete.
Snowflake es un lenguaje reversible auto-modificable en el que tanto el intérprete como el programa se modifican en cada ejecución.
FRACTRAN es un lenguaje en el que los programas son una lista de fracciones y un número inicial. No estoy seguro de lo que hace, pero hace algo, ya que tiene una página de Wikipedia.
Iota y Jot son dos lenguajes formales, cada uno diseñado para ser el sistema formal más simple. Por su naturaleza, también se pueden considerar lenguajes de programación de tarpit de Turing igualmente minimalistas. Ambos usan solo dos símbolos y realizan dos operaciones. Un sucesor, llamado Zot, también admite entrada / salida.
Entropy es un lenguaje de programación con un nombre muy adecuado diseñado para aceptar la idea de renunciar al control. Cualquier salida del programa se aproximará y cada vez que se acceda a los datos se modificará aleatoriamente. El lenguaje no modifica el programa original, por lo que cada vez que se ejecuta la salida será diferente, pero se conservará el estado inicial. Un curioso efecto secundario de la aleatorización de datos es Drunk Eliza, una versión web del clásico programa Eliza en la que el terapeuta parece estar borracho.
Monicelli es un lenguaje de broma basado en la película de comedia My Friends. Un programa típico parece una serie de frases italianas sin sentido. Sorprendentemente, esto tiene sentido, ya que la película utilizada como inspiración también presenta frases sin sentido. Es el círculo de la locura.
Resumen
El mundo del lenguaje de programación esotérico es tan emocionante como enloquecedor: no hay reglas, sino muchas cosas interesantes. Espero haberte dado una ventana un poco cuerda sobre lo que podías esperar.
Si quieres saber más o participar en esta comunidad te sugiero que mires Esolangs. Ese sitio web, junto con Wikipedia, es la fuente de la mayoría de los ejemplos que se muestran en este artículo. Allí también puede encontrar algo de inspiración en una lista de ideas para un lenguaje de programación esotérico.
También puede encontrar interesante el blog de Marc C. Chu-Carroll en sus muchas encarnaciones a lo largo de los años. Como el nombre de Matemáticas Buenas, Matemáticas Malas implica, está dedicado principalmente a las matemáticas. Sin embargo, también tiene muchos análisis de lenguajes de programación esotéricos en una serie llamada Programación Patológica (Lenguaje). Se puede ver, por ejemplo, uno dedicado al lenguaje de programación más pequeño.