Malbolge ( / m æ l b oʊ l dʒ / ) es un dominio público lenguaje de programación esotérico inventado por Ben Olmstead en 1998, lleva el nombre del octavo círculo del infierno de Dante 's Inferno , la Malebolge . Fue diseñado específicamente para ser casi imposible de usar, a través de una 'operación loca' contraria a la intuición, aritmética en base tres y código auto-alterable. [1] Se basa en la dificultad de los lenguajes esotéricos más antiguos y desafiantes (como Brainfuck y Befunge), pero lleva este aspecto al extremo, jugando con las intrincadas historias de la informática y el cifrado . A pesar de este diseño, es posible escribir programas útiles de Malbolge.
Paradigma | Esotérico, imperativo, escalar, a nivel de valor |
---|---|
Diseñada por | Ben Olmstead |
Apareció por primera vez | 1998 |
Disciplina de mecanografía | Sin tipo |
Extensiones de nombre de archivo | .mal, .mb |
Influenciado por | |
Brainfuck , INTERCAL (Tri-INTERCAL), Befunge | |
Influenciado | |
Dis, Malbolge desencadenado |
Programación en Malbolge
Malbolge era muy difícil de entender cuando llegó. Fueron necesarios dos años para que apareciera el primer programa Malbolge. El propio autor nunca ha escrito un programa Malbolge. [1] El primer programa no fue escrito por un ser humano; fue generado por un algoritmo de búsqueda de haces diseñado por Andrew Cooke e implementado en Lisp . [2]
Más tarde, Lou Scheffer publicó un criptoanálisis de Malbolge y proporcionó un programa para copiar su entrada a su salida. [3] También guardó el intérprete original y la especificación después de que el sitio original dejó de funcionar, y ofreció una estrategia general para escribir programas en Malbolge, así como algunas ideas sobre su Turing-completo. [4]
Olmstead creía que Malbolge era un autómata delimitado lineal . Existe una discusión sobre si se pueden implementar bucles sensibles en Malbolge; pasaron muchos años antes de que se introdujera el primero sin terminación. Un programa correcto de 99 Botellas de Cerveza , que trata con bucles y condiciones no triviales, no se anunció durante siete años; el primero correcto fue el de Hisashi Iizawa en 2005. [5] Hisashi Iizawa et al. También propuso una guía para la programación en Malbolge con el propósito de ofuscar la protección del software. [6]
En 2020, el usuario de GitHub kspalaiologos hizo un intérprete Lisp en funcionamiento . [7]
Programas de ejemplo
¡Hola Mundo!
Este programa Malbolge muestra " Hola, mundo ". [8]
(= <`# 9] ~ 6ZY327Uv4-QsqpMn & + Ij" 'E% e {Ab ~ w = _:] Kw% o44Uqp0 / Q? XNvL: `H% c # DD2 ^ WV> gY; dts76qKJImZkj
programa de gatos
Este programa lee una cadena de un usuario e imprime esa cadena, similar a Unix cat .
(= BA # 9 "= <;: 3y7x54-21q / p -, + *)"! H% B0 /.~ P <<:( 8 y66 # "! ~} | {ZyxwvugJk
Diseño
Malbolge es un lenguaje de máquina para una máquina virtual ternaria , el intérprete de Malbolge .
El intérprete estándar y la especificación oficial no coinciden perfectamente. [9] Una diferencia es que el compilador detiene la ejecución con datos fuera del rango 33-126. Aunque inicialmente esto se consideró un error en el compilador, Ben Olmstead declaró que era intencionado y que de hecho había "un error en la especificación". [1]
Registros
Malbolge tiene tres registros , una , c , y d . Cuando se inicia un programa, el valor de los tres registros es cero.
a significa "acumulador", establecido en el valor escrito por todas las operaciones de escritura en la memoria y utilizado para E / S estándar . c , el puntero de código, es especial: apunta a la instrucción actual . [10] d es el puntero de datos. Se incrementa automáticamente después de cada instrucción, pero la ubicación a la que apunta se usa para los comandos de manipulación de datos.
Notación de puntero
d puede contener una dirección de memoria; [d] es registro indirecto ; el valor almacenado en esa dirección. [c] es similar.
Memoria
La máquina virtual tiene 59,049 (3 10 ) ubicaciones de memoria que pueden contener cada una un número ternario de diez tritos . Cada ubicación de memoria tiene una dirección de 0 a 59048 y puede contener un valor de 0 a 59048. Incrementar más allá de este límite vuelve a cero.
El idioma usa el mismo espacio de memoria para datos e instrucciones . Esto fue influenciado por cómo funcionaba el hardware como la arquitectura x86. [1]
Antes de que se inicie un programa Malbolge, la primera parte de la memoria se llena con el programa. Se ignoran todos los espacios en blanco del programa y, para hacer la programación más difícil, todo lo demás en el programa debe comenzar con una de las instrucciones siguientes.
El resto de la memoria se llena usando la operación loca (ver más abajo) en las dos direcciones anteriores ( [m] = crz [m - 2], [m - 1] ). La memoria llena de esta manera se repetirá cada doce direcciones (los dígitos ternarios individuales se repetirán cada tres o cuatro direcciones, por lo que se garantiza que un grupo de dígitos ternarios se repita cada doce).
En 2007, Ørjan Johansen creó Malbolge Unshackled, una versión de Malbolge que no tiene el límite de memoria arbitrario. La esperanza era crear un lenguaje Turing-Complete manteniendo al mismo tiempo el espíritu de Malbolge. No se cambian otras reglas y todos los programas de Malbolge que no alcanzan el límite de memoria son completamente funcionales. [11]
Instrucciones
Malbolge tiene ocho instrucciones . Malbolge calcula qué instrucción ejecutar tomando el valor [c] , agregando el valor de c y tomando el resto cuando se divide por 94. El resultado final le dice al intérprete qué hacer:
Valor de ([c] + c)% 94 | Instrucción representada | Explicación |
---|---|---|
4 | jmp [d] | Copia el valor de [d] a c . Tenga en cuenta que c aún se incrementará después de la ejecución de esta instrucción, por lo que la siguiente instrucción a ejecutar será la que está en [d] + 1 (módulo 59049) . |
5 | fuera un | Imprime el valor de a , como un carácter ASCII , en la pantalla. |
23 | en un | Introduce un carácter, como código ASCII, en un . Las nuevas líneas o los avances de línea son ambos de código 10 . Una condición de fin de archivo es el código 59048 . |
39 | rotr [d] mov a, [d] | Gira el valor en [d] en un dígito ternario (000211111 2 se convierte en 2 000211111). Almacena el resultado tanto en [d] como en a . |
40 | mov d, [d] | Copia el valor en [d] a d . |
62 | crz [d], a mov a, [d] | ¿ Realiza la operación loca (ver más abajo) con el valor en [d] y el valor de a . Almacena el resultado tanto en [d] como en a . |
68 | nop | No hace nada. |
81 | final | Finaliza el programa Malbolge. |
Cualquier otro valor | hace lo mismo que 68 : nada. Estos otros valores no se permiten en un programa mientras se está cargando, pero se permiten posteriormente. |
Después de que se ejecuta cada instrucción, la instrucción culpable se encripta (ver más abajo) para que no haga lo mismo la próxima vez, a menos que haya ocurrido un salto. Inmediatamente después de un salto, Malbolge cifrará la instrucción inocente justo antes de la que saltó. Luego, los valores tanto de c como de d se incrementan en uno y se ejecuta la siguiente instrucción.
Operación loca
Para cada dígito ternario de ambas entradas, utilice la siguiente tabla para obtener un dígito ternario del resultado. Por ejemplo, crz 0001112220, 0120120120 da 1001022211.
crz | Entrada 2 | |||
---|---|---|---|---|
0 | 1 | 2 | ||
Entrada 1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 2 | |
2 | 2 | 2 | 1 |
Cifrado
Después de que se ejecuta una instrucción, el valor en [c] (sin nada agregado) será reemplazado por el mismo mod 94. Luego, el resultado se codifica con uno de los siguientes dos métodos equivalentes .
- Método 1
- Encuentre el resultado a continuación. Guarde el código ASCII del carácter debajo de él en [c] .
00000000001111111111222222222233333333334444444444555555555566666666667777777788888888889999 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 -------------------------------------------------- -------------------------------------------- 9m <.TVac`uY * MK'X ~ xDl} REokN: #? G "i @ 5z] & gqtyfr $ (we4 {WP) H-Zn, [% \ 3dL + Q;> U! PJS72FhOA1CB6v ^ = I_0 / 8 | jsb
- Método 2
- Encuentre el resultado a continuación. Almacene la versión encriptada en [c] .
Resultado | Cifrado | Resultado | Cifrado | Resultado | Cifrado | Resultado | Cifrado | Resultado | Cifrado |
---|---|---|---|---|---|---|---|---|---|
0 | 57 | 19 | 108 | 38 | 113 | 57 | 91 | 76 | 79 |
1 | 109 | 20 | 125 | 39 | 116 | 58 | 37 | 77 | sesenta y cinco |
2 | 60 | 21 | 82 | 40 | 121 | 59 | 92 | 78 | 49 |
3 | 46 | 22 | 69 | 41 | 102 | 60 | 51 | 79 | 67 |
4 | 84 | 23 | 111 | 42 | 114 | 61 | 100 | 80 | 66 |
5 | 86 | 24 | 107 | 43 | 36 | 62 | 76 | 81 | 54 |
6 | 97 | 25 | 78 | 44 | 40 | 63 | 43 | 82 | 118 |
7 | 99 | 26 | 58 | 45 | 119 | 64 | 81 | 83 | 94 |
8 | 96 | 27 | 35 | 46 | 101 | sesenta y cinco | 59 | 84 | 61 |
9 | 117 | 28 | 63 | 47 | 52 | 66 | 62 | 85 | 73 |
10 | 89 | 29 | 71 | 48 | 123 | 67 | 85 | 86 | 95 |
11 | 42 | 30 | 34 | 49 | 87 | 68 | 33 | 87 | 48 |
12 | 77 | 31 | 105 | 50 | 80 | 69 | 112 | 88 | 47 |
13 | 75 | 32 | 64 | 51 | 41 | 70 | 74 | 89 | 56 |
14 | 39 | 33 | 53 | 52 | 72 | 71 | 83 | 90 | 124 |
15 | 88 | 34 | 122 | 53 | 45 | 72 | 55 | 91 | 106 |
dieciséis | 126 | 35 | 93 | 54 | 90 | 73 | 50 | 92 | 115 |
17 | 120 | 36 | 38 | 55 | 110 | 74 | 70 | 93 | 98 |
18 | 68 | 37 | 103 | 56 | 44 | 75 | 104 |
El criptoanálisis de Malbolge de Lou Scheffer menciona seis ciclos diferentes en la permutación . Se enumeran aquí:
- 33 ⇒ 53 ⇒ 45 ⇒ 119 ⇒ 78 ⇒ 49 ⇒ 87 ⇒ 48 ⇒ 123 ⇒ 71 ⇒ 83 ⇒ 94 ⇒ 57 ⇒ 91 ⇒ 106 ⇒ 77 ⇒ 65 ⇒ 59 ⇒ 92 ⇒ 115 ⇒ 82 ⇒ 118 ⇒ 107 ⇒ 75 ⇒ 104 ⇒ 89 ⇒ 56 ⇒ 44 ⇒ 40 ⇒ 121 ⇒ 35 ⇒ 93 ⇒ 98 ⇒ 84 ⇒ 61 ⇒ 100 ⇒ 97 ⇒ 46 ⇒ 101 ⇒ 99 ⇒ 86 ⇒ 95 ⇒ 109 ⇒ 88 ⇒ 47 ⇒ 52 ⇒ 72 ⇒ 55 ⇒ 110 ⇒ 126 ⇒ 64 ⇒ 81 ⇒ 54 ⇒ 90 ⇒ 124 ⇒ 34 ⇒ 122 ⇒ 63 ⇒ 43 ⇒ 36 ⇒ 38 ⇒ 113 ⇒ 108 ⇒ 39 ⇒ 116 ⇒ 69 ⇒ 112 ⇒ 68 ⇒ 33 ...
- 37 ⇒ 103 ⇒ 117 ⇒ 111 ⇒ 120 ⇒ 58 ⇒ 37 ...
- 41 ⇒ 102 ⇒ 96 ⇒ 60 ⇒ 51 ⇒ 41 ...
- 42 ⇒ 114 ⇒ 125 ⇒ 105 ⇒ 42 ...
- 50 ⇒ 80 ⇒ 66 ⇒ 62 ⇒ 76 ⇒ 79 ⇒ 67 ⇒ 85 ⇒ 73 ⇒ 50 ...
- 70 ⇒ 74 ⇒ 70 ...
Estos ciclos se pueden usar para crear bucles que hacen cosas diferentes cada vez y que eventualmente se vuelven repetitivos. Lou Scheffer usó esta idea para crear un programa Malbolge (incluido en su criptoanálisis vinculado a continuación) que repite todo lo que ingresa el usuario.
Variantes
Malbolge no es Turing completo , debido a sus límites de memoria. Sin embargo, de lo contrario, tiene ejecución secuencial, repetición y ejecución condicional. Se han realizado varios intentos para crear versiones completas de Turing de Malbolge:
- Malbolge-T es una versión teórica de Malbolge que restablece el flujo de entrada / salida al llegar al final, lo que permite programas ilimitados. Malbolge-T sería compatible con versiones anteriores de Malbolge. [3]
- Malbolge Unshackled es, con suerte, una variación completa de Turing, que permite programas de cualquier duración. Sin embargo, debido a las variaciones de comando para permitir valores superiores a 257, los programas válidos de Malbolge no necesariamente se ejecutarán correctamente en Malbolge Unshackled. [12]
Cultura popular
En la serie de televisión Elementary , durante el episodio "The Leviathan" (temporada 1, episodio 10), una pista escrita en una orden de café se describe como escrita en Malbolge. Parece ser una pequeña modificación del ejemplo más detallado de "Hola mundo" que se muestra arriba. [1] [13]
En la telenovela General Hospital , el coronel Sanders de KFC hace una aparición especial porque alguien está tratando de matarlo para obtener la receta secreta de 11 hierbas y especias. Conoce a Malbolge y es capaz de desarmar la secuencia de destrucción. [14]
Ver también
- INTERCAL
- Código ofuscado
Referencias
- ↑ a b c d e f Temkin, Daniel (3 de noviembre de 2014). "Entrevista con Ben Olmstead" . códigos esotéricos . Consultado el 7 de enero de 2021 .
- ^ Cooke, Andrew. "malbolge: hola mundo" . Archivado desde el original el 6 de diciembre de 2019 . Consultado el 8 de enero de 2021 .
- ^ a b Scheffer, Lou (17 de abril de 2015). "Introducción a Malbolge" . Consultado el 9 de junio de 2017 .
- ^ Mykhailova, Mariya (11 de mayo de 2012). "Malbolge - Lenguaje de programación" . Progopedia . Consultado el 9 de junio de 2017 .
- ^ "Idioma Malbolge" . 99 botellas de cerveza. 2005-12-29. Archivado desde el original el 14 de mayo de 2020 . Consultado el 19 de noviembre de 2020 .
- ^ a b IIZAWA, Hisashi. "Método de programación en lenguaje ofuscado Malbolge" (PDF) (en japonés). Universidad de Nagoya . Consultado el 9 de junio de 2017 .
- ^ Palaiologos (2021-03-04), kspalaiologos / malbolge-lisp , consultado el 2021-03-23
- ^ Palaiologos (2021-03-04), kspalaiologos / hello.mb , consultado el 2021-03-23
- ^ Green, Austin (1 de diciembre de 2000). "Malbolge" . Universidad Tecnológica de Luisiana . Consultado el 9 de junio de 2017 .
- ^ Olmstead, Ben (1998). "Especificación Malbolge" . www.lscheffer.com . Consultado el 9 de junio de 2017 .
- ^ Johansen, Ørjan (25 de octubre de 2013). "Un intérprete del dialecto Malbolge Unshackled" (Haskell) . oerjan.nvg.org . Consultado el 9 de junio de 2017 .
- ^ "Malbolge desencadenado" . esolangs.org . 2017-04-14 . Consultado el 9 de junio de 2017 .
- ^ "Leviatán". Elemental . Temporada 1. Episodio 10. Manhattan . 2012-12-14. CBS .
- ^ Hospital General . Temporada 56. Episodio 68. 2018-07-06. ABC .
enlaces externos
- Intérprete de Malbolge (código fuente C)
- Intérprete, depurador, ensamblador y ejemplo de código Malbolge Ensamblador Malbolge (código fuente Java)
- Tratado sobre la redacción de programas Malbolge; lleva el análisis de Scheffer un poco más allá
- Un proyecto dedicado a presentar programas escritos en Malbolge