Un lenguaje de programación esotérico (a veces abreviado como esolang ) es un lenguaje de programación diseñado para probar los límites del diseño de lenguajes de programación informática, como prueba de concepto , como arte de software , como una interfaz de hacking para otro lenguaje (particularmente programación funcional o lenguajes de programación procedimental ), o como una broma . El uso de la palabra esotérico los distingue de los lenguajes que los desarrolladores en activo usan para escribir software. Los creadores de la mayoría de los esolangs no pretenden que se utilicen para la programación convencional, aunque algunas características esotéricas, como la sintaxis visoespacial , [1] han inspirado aplicaciones prácticas en las artes. Dichos lenguajes suelen ser populares entre los hackers y los aficionados. [ cita requerida ]
La usabilidad rara vez es un objetivo para los diseñadores de lenguajes de programación esotéricos; a menudo, su diseño conduce a todo lo contrario. Su objetivo habitual es eliminar o reemplazar las características convencionales del lenguaje, manteniendo al mismo tiempo un lenguaje que sea Turing-completo o incluso uno para el cual se desconoce la clase computacional .
El ejemplo más antiguo, y todavía el canónico, de un lenguaje de programación esotérico es INTERCAL , [2] diseñado en 1972 por Don Woods y James M. Lyon, quienes dijeron que su intención era crear un lenguaje de programación diferente a todos los que conocían. [3] [4] Parodiaba elementos de lenguajes de programación establecidos de la época, como Fortran , COBOL y el lenguaje ensamblador .
Durante muchos años, INTERCAL estuvo representado únicamente por copias en papel del manual de INTERCAL. Su resurgimiento en 1990 como implementación en C bajo Unix estimuló una ola de interés en el diseño intencional de lenguajes informáticos esotéricos.
En 1993, Wouter van Oortmerssen creó FALSE, un pequeño lenguaje de programación orientado a pila con una sintaxis diseñada para hacer que el código sea inherentemente ofuscado, confuso e ilegible. Su compilador tiene un tamaño de solo 1024 bytes. [5] Esto inspiró a Urban Müller a crear un lenguaje aún más pequeño, el ahora infame Brainfuck , que consta de solo ocho caracteres reconocidos. Junto con Befunge de Chris Pressey (como FALSE, pero con un puntero de instrucción bidimensional), Brainfuck es ahora uno de los lenguajes de programación esotéricos mejor respaldados, con ejemplos canónicos de tarpits de Turing mínimos y características de lenguaje innecesariamente ofuscadas. Brainfuck está relacionado con la familia P′′ de máquinas de Turing .
Si bien los lenguajes de programación esotérica difieren de muchas maneras, existen algunos rasgos comunes que caracterizan a muchos lenguajes, como la parodia, el minimalismo y el objetivo de hacer que la programación sea difícil. [6] Muchos lenguajes de programación esotérica, como brainfuck y similares, usan caracteres individuales como comandos, sin embargo, no es raro que los lenguajes lean línea por línea como los lenguajes de programación convencionales .
Los lenguajes de programación imperativa convencionales suelen permitir almacenar datos en variables, pero los lenguajes esotéricos pueden utilizar diferentes métodos de almacenamiento y acceso a los datos. Los lenguajes como Brainfuck y Malbolge solo permiten leer datos a través de un único puntero , que debe moverse a una ubicación de interés antes de leer los datos. Otros, como Befunge y Shakespeare , utilizan una o más pilas para almacenar datos, lo que conduce a una forma de ejecución similar a la notación polaca inversa . Finalmente, hay lenguajes que exploran formas alternativas de representación de números: la variante Brainfuck Boolfuck solo permite operaciones en bits individuales, mientras que Malbolge y la variante INTERCAL TriINTERCAL reemplazan los bits por completo con un sistema ternario de base 3. [7]
Los lenguajes esotéricos también muestran formas únicas de representar instrucciones de programas. Algunos lenguajes, como Befunge y Piet, representan programas en dos o más dimensiones, con el control del programa moviéndose en múltiples direcciones posibles a través del programa. [8] [ página necesaria ] Esto difiere de los lenguajes convencionales en los que un programa es un conjunto de instrucciones que generalmente se encuentran en secuencia. Otros lenguajes modifican las instrucciones para que aparezcan en una forma inusual, a menudo una que pueda ser leída por humanos con un significado alternativo a las instrucciones subyacentes. Shakespeare logra esto al hacer que todos los programas se parezcan a las obras de Shakespeare. Chef logra lo mismo al hacer que todos los programas sean recetas. [7] Chef es particularmente notable en el sentido de que algunos han creado programas que funcionan con éxito tanto como programa como receta, lo que demuestra la capacidad del lenguaje para producir este doble significado. [9]
Muchos lenguajes de programación esotéricos están diseñados para producir código que está profundamente ofuscado , lo que dificulta su lectura y escritura. [10] El propósito de esto puede ser proporcionar un rompecabezas o desafío interesante para los escritores de programas: Malbolge , por ejemplo, fue diseñado explícitamente para ser desafiante, por lo que tiene características como código automodificable y operaciones altamente contraintuitivas. [10] Por otro lado, algunos lenguajes esotéricos se vuelven difíciles de escribir debido a sus otras opciones de diseño. Brainfuck está comprometido con la idea de un conjunto de instrucciones minimalista, por lo que, aunque sus instrucciones son sencillas en principio, el código que surge es difícil de leer para un humano. La dificultad de INTERCAL surge como resultado de la elección de evitar las operaciones utilizadas en cualquier otro lenguaje de programación, lo que se deriva de su origen como una parodia de otros lenguajes. [10]
Uno de los objetivos de los lenguajes de programación esotéricos es parodiar o burlarse de los lenguajes y tendencias existentes en el campo de la programación. [10] Por ejemplo, el primer lenguaje esotérico INTERCAL comenzó como una parodia de los lenguajes utilizados en la década de 1960, como APL , Fortran y COBOL . Las reglas de INTERCAL parecen ser las inversas de las reglas de estos otros lenguajes. [11] Sin embargo, el tema de la parodia no siempre es otro lenguaje de programación establecido. Shakespeare puede verse como una parodia de la estructura de las obras de Shakespeare, por ejemplo. El lenguaje Ook! es una parodia de Brainfuck , donde los ocho comandos de Brainfuck son reemplazados por varios sonidos de orangután como "Ook. Ook?" [7]
Befunge permite que el puntero de instrucción se desplace en múltiples dimensiones a través del código. Por ejemplo, el siguiente programa muestra "Hola mundo" colocando los caracteres en orden inverso en la pila y luego imprimiéndolos en un bucle que circula en el sentido de las agujas del reloj a través de las instrucciones >
, :
, v
, _
, ,
y ^
.
"dlroW olleH" > : v ^ , _@
Hay muchas versiones de Befunge, la más común es Befunge-93, que recibe ese nombre porque fue lanzado en 1993. [12]
El cálculo lambda binario está diseñado desde una perspectiva de teoría de la información algorítmica para permitir el código más denso posible con los medios mínimos, presentando un intérprete propio de 29 bytes, un tamiz de números primos de 21 bytes y un intérprete Brainfuck de 112 bytes. [13]
Brainfuck está diseñado para un minimalismo extremo y da lugar a un código ofuscado, con programas que contienen sólo ocho caracteres distintos. El siguiente programa muestra "¡Hola, mundo!": [14]
++++++++++ [ > +++++++ > ++++++++++ > +++ <<< - ] > ++ . > + . +++++++ .. +++ . > ++ . << +++++++++++++++ . > . +++ . ------ . -------- . > + .
Todos los caracteres que no sean .+-<>,.[]
Chicken tiene solo tres tokens, la palabra "chicken", " " (el carácter de espacio) y el carácter de nueva línea. El compilador interpreta la cantidad de "chickens" en una línea como una instrucción de código de operación que utiliza para manipular datos en una pila. Un programa chicken simple puede contener docenas de líneas con nada más que la palabra "chicken" repetida innumerables veces. [15] Chicken fue inventado por Torbjörn Söderstedt, quien se inspiró para el lenguaje en una parodia de una disertación científica. [16] [17] [18]
Chef es un lenguaje de programación orientado a pilas creado por David Morgan-Mar , diseñado para hacer que los programas parezcan recetas de cocina . [19] Los programas constan de un título, una lista de variables y sus valores de datos, y una lista de instrucciones de manipulación de la pila. [20] Un principio de diseño jocoso establece que "las recetas de programas no solo deben generar una salida válida, sino que también deben ser fáciles de preparar y deliciosas", y Morgan-Mar señala que un programa de ejemplo "¡Hola, mundo!" con "101 huevos" y "111 tazas de aceite" produciría "mucha comida para una persona". [20] [21]
Un programa FRACTRAN es una lista ordenada de fracciones positivas junto con una entrada inicial de un entero positivo . El programa se ejecuta multiplicando el entero por la primera fracción de la lista para la que es un entero. Luego, el entero se reemplaza por y se repite la regla. Si ninguna fracción de la lista produce un entero cuando se multiplica por , el programa se detiene. FRACTRAN fue inventado por el matemático John Conway . [22]
Los programas en GolfScript, un lenguaje creado para el código golf , consisten en listas de elementos, cada uno de los cuales se coloca en la pila a medida que se lo encuentra, con la excepción de las variables que tienen bloques de código como su valor, en cuyo caso se ejecuta el código. [23]
INTERCAL , abreviatura de "Compiler Language With No Pronounceable Acronym", fue creado en 1972 como una parodia para satirizar aspectos de los diversos lenguajes de programación de ese momento. [4]
JSFuck es un estilo de programación esotérica de JavaScript , donde el código se escribe utilizando solo seis caracteres: [
, ]
, (
, )
, !
, y +
. A diferencia de Brainfuck, que requiere su propio compilador o intérprete, JSFuck es un código JavaScript válido, lo que significa que los programas JSFuck se pueden ejecutar en cualquier navegador o motor web que interprete JavaScript. [24] [25] Se ha utilizado en varios ataques de secuencias de comandos entre sitios (XSS) en sitios web como eBay debido a su capacidad para evadir los filtros de detección de secuencias de comandos entre sitios. [26]
LOLCODE está diseñado para parecerse al habla de los lolcats . El siguiente es el ejemplo de "Hola mundo":
Hola¿PUEDE TENER STDIO?VISIBLE "¡HAI MUNDO!"Gracias, adiós.
Si bien la semántica de LOLCODE no es inusual, su sintaxis ha sido descrita como un fenómeno lingüístico , que representa un ejemplo inusual de habla informal y jerga de Internet en programación. [27]
Malbolge (llamado así por el octavo círculo del infierno ) fue diseñado para ser el lenguaje de programación más difícil y esotérico. Entre otras características, el código se modifica a sí mismo por diseño y el efecto de una instrucción depende de su dirección en la memoria. [28]
Piet es un lenguaje diseñado por David Morgan-Mar , cuyos programas son mapas de bits que parecen arte abstracto . [29] La ejecución está guiada por un "puntero" que se mueve alrededor de la imagen, de una región coloreada continua a la siguiente. Los procedimientos se llevan a cabo cuando el puntero sale de una región.
Hay 20 colores para los que se especifica un comportamiento: 18 colores "coloridos", que están ordenados por un ciclo de tono de 6 pasos y un ciclo de brillo de 3 pasos; y blanco y negro, que no están ordenados. Al salir de un color "colorido" y entrar en otro, el procedimiento realizado está determinado por el número de pasos de cambio de tono y brillo. No se puede entrar en negro; cuando el puntero intenta entrar en una región negra, se cambian en su lugar las reglas de elección del siguiente bloque. Si se prueban todas las reglas posibles, el programa termina. Las regiones fuera de los bordes de la imagen también se tratan como negras. El blanco no realiza operaciones, pero permite que el puntero "pase a través". El comportamiento de los colores distintos de los 20 especificados se deja al compilador o intérprete. [29] [ fuente no primaria necesaria ]
Las variables se almacenan en la memoria como números enteros con signo en una única pila . La mayoría de los procedimientos especificados se ocupan de las operaciones en esa pila, mientras que otros se ocupan de la entrada/salida y de las reglas por las que se mueve el puntero de compilación. [30]
Piet recibió su nombre en honor al pintor holandés Piet Mondrian . [31] El nombre original previsto, Mondrian , ya había sido adoptado por un sistema de visualización de datos estadísticos de código abierto . [29]
El lenguaje de programación Shakespeare (SPL) está diseñado para que los programas parezcan obras de Shakespeare . Por ejemplo, la siguiente declaración declara un punto en el programa al que se puede llegar mediante una declaración de tipo GOTO: [ cita requerida ]
Acto I: Los insultos y halagos de Hamlet.
Unlambda es un lenguaje de programación funcional minimalista basado en el cálculo SKI , pero combinado con continuaciones de primera clase y E/S imperativas (con una entrada que generalmente requiere el uso de continuaciones). [32]
Los espacios en blanco utilizan únicamente caracteres de espacio en blanco (espacio, tabulación y retorno), ignorando todos los demás caracteres, que por lo tanto pueden usarse para comentarios. Esto es lo contrario de muchos lenguajes tradicionales, que no distinguen entre diferentes caracteres de espacio en blanco, tratando el tabulador y el espacio de la misma manera. También permite que los programas de espacios en blanco se oculten en el código fuente de programas en lenguajes como C. [ cita requerida ]
El contexto cultural de los esolangs ha sido estudiado por Geoff Cox, quien escribe que los esolangs "desvían la atención del comando y control hacia la expresión cultural y el rechazo", [33] viéndolos como similares al arte del código y la poesía del código, como mezangelle de Mez Breeze , una creencia compartida por otros en el campo. [34] Daniel Temkin describe a Brainfuck como "negarse a suavizar el límite entre la expresión humana y el código ensamblador y, por lo tanto, llevarnos a un viaje ridículo de lógica", [35] exponiendo el conflicto inherente entre el pensamiento humano y la lógica de la computadora al deconstruir su relación. Conecta la programación dentro de un esolang con la ejecución de una partitura de evento como las del movimiento Fluxus , donde la ejecución de las reglas irregulares de la lógica en código aclara el punto de vista del lenguaje. [36]
, una implementación del lenguaje de programación Chef de David Morgan-Mar. En Chef, los programas se expresan en forma de recetas: ...