El lenguaje del compilador sin acrónimo pronunciable ( INTERCAL ) es un lenguaje de programación esotérico que fue creado como una parodia por Don Woods y James M. Lyon, dos estudiantes de la Universidad de Princeton , en 1972. Satiriza aspectos de los diversos lenguajes de programación en ese momento, [1] así como la proliferación de construcciones lingüísticas y notaciones propuestas en la década de 1960.
Hay dos implementaciones mantenidas de dialectos INTERCAL: C-INTERCAL (creado en 1990), mantenido por Eric S. Raymond [2] y Alex Smith, [3] y CLC-INTERCAL, mantenido por Claudio Calvelli. [4] En marzo de 2021 [actualizar], ambas implementaciones estaban disponibles en el archivo de software de Debian . [5]
Historia
Según el manual original de los autores, [6]
El nombre completo del compilador es "Lenguaje del compilador sin acrónimo pronunciable", que, por razones obvias, se abrevia "INTERCAL".
La implementación original de Princeton utilizó tarjetas perforadas y el juego de caracteres EBCDIC . Para permitir que INTERCAL se ejecute en computadoras que utilizan ASCII , se tuvieron que hacer sustituciones de dos caracteres: se $
sustituyó ¢
como operador de mezcla , "representando el costo creciente del software en relación con el hardware", y ?
se sustituyó ⊻
como el unario exclusivo -or operador para "expresar correctamente la reacción de la persona promedio en el primer encuentro exclusivo-o". [6] En versiones recientes de C-INTERCAL, los operadores más antiguos se admiten como alternativas; Los programas INTERCAL ahora se pueden codificar en ASCII , Latin-1 o UTF-8 . [7]
Números de versión
C-INTERCAL intercambia los números de versión mayor y menor, en comparación con la tradición. El archivo HISTORY [8] muestra lanzamientos a partir de la versión 0.3 y hasta mayo de 2020[actualizar] habiendo progresado a 0,31, pero conteniendo 1,26 entre 0,26 y 0,27.
El esquema de numeración de versiones de CLC-INTERCAL era tradicional hasta la versión 0.06, cuando cambió al esquema documentado en el archivo README [9] , que dice:
* El término "versión" ha sido reemplazado por "perversión" para que sea correcto
* El número de perversión consiste en un número de punto flotante con signos independientes para la parte entera y fraccionaria. Las fracciones negativas indican pre-escapes (por lo que 1.-94 significa "94 pre-escapes antes de 1.00". O simplemente puede sumar los números y obtener 0.06, lo cual es completamente una coincidencia ya que 0.06 no se está desarrollando)
* La parte fraccionaria de un número de perversión puede ser un entero o un punto flotante, con un significado similar para las partes. El pre-escape actual es 1.-94.-2 que significa "2 pre-pre-escapes antes del pre-escape 1.-94".
Detalles
INTERCAL estaba destinado a ser completamente diferente de todos los demás lenguajes informáticos. Las operaciones comunes en otros lenguajes tienen una sintaxis críptica y redundante en INTERCAL. Del Manual de referencia de INTERCAL: [6]
Es un hecho bien conocido y a menudo demostrado que se tiene en alta estima a una persona cuyo trabajo es incomprensible. Por ejemplo, si se dijera que la forma más sencilla de almacenar un valor de 65536 en una variable INTERCAL de 32 bits es:
HACER : 1 <- # 0 ¢ # 256cualquier programador sensato diría que eso es absurdo. Dado que este es de hecho el método más simple, el programador se vería tonto frente a su jefe, quien, por supuesto, aparecería, como suelen hacer los jefes. El efecto no sería menos devastador para el programador si hubiera tenido razón.
INTERCAL tiene muchas otras características diseñadas para hacerlo aún más desagradable estéticamente para el programador: utiliza declaraciones como "LEER", "IGNORAR", "OLVIDAR" y modificadores como "POR FAVOR". Esta última palabra clave proporciona dos razones para el rechazo del programa por parte del compilador: si "POR FAVOR" no aparece con suficiente frecuencia, el programa se considera insuficientemente educado y el mensaje de error dice esto; si es demasiado frecuente, el programa podría ser rechazado por ser excesivamente cortés. Aunque esta característica existía en el compilador INTERCAL original, no estaba documentada. [10]
A pesar de la sintaxis intencionalmente obtusa y verbosa del lenguaje, INTERCAL es sin embargo Turing-completo : con suficiente memoria, INTERCAL puede resolver cualquier problema que una máquina Universal Turing pueda resolver. Sin embargo, la mayoría de las implementaciones de INTERCAL hacen esto muy lentamente. Una criba de Eratóstenes índice de referencia, el cálculo de todos los números primos menos de 65.536, fue probado en un Sun SPARCstation 1 en 1992. En C, se llevó a menos de la mitad de un segundo; el mismo programa en INTERCAL tomó más de diecisiete horas. [11]
Documentación
El Manual de referencia de INTERCAL contiene muchas instrucciones paradójicas, sin sentido o divertidas:
¡Precaución! Bajo ninguna circunstancia confunda la malla con el operador de intercalación, excepto en circunstancias confusas.
El manual también contiene una " amígdala ", como se explica en esta nota al pie: "4) Dado que todos los demás manuales de referencia tienen apéndices, se decidió que el manual INTERCAL debería contener algún otro tipo de órgano removible". [6]
El manual INTERCAL da nombres inusuales a todos los caracteres ASCII no alfanuméricos : las comillas simples y dobles son "chispas" y "orejas de conejo" respectivamente. (La excepción es el ampersand : como dice el archivo de jerga , "¿qué podría ser más tonto?") El operador de asignación, representado como un signo igual ("media malla" de INTERCAL) en muchos otros lenguajes de programación, está en INTERCAL como una flecha hacia la izquierda , <-
compuesto por un "ángulo" y un "gusano", obviamente leído como "obtiene".
Sintaxis
La entrada (usando la WRITE IN
instrucción) y la salida (usando la READ OUT
instrucción) no usan los formatos habituales; en INTERCAL-72, WRITE IN ingresa un número escrito como dígitos en inglés (como SEIS CINCO CINCO TRES CINCO), y READ OUT lo emite en números romanos "masacrados" . [6] Las versiones más recientes tienen sus propios sistemas de E / S. [4] [10]
Los comentarios se pueden lograr utilizando los identificadores de declaración invertidos que involucren NOT o N'T; estos hacen que las líneas se abstengan inicialmente de modo que no tengan ningún efecto. [6] (Una línea puede estar ABSTAINED incluso si no tiene una sintaxis válida; los errores de sintaxis ocurren en tiempo de ejecución, y solo entonces cuando la línea no está ABSTAINED.) [6]
Estructuras de datos
INTERCAL-72 (la versión original de INTERCAL) tenía solo cuatro tipos de datos : el entero de 16 bits (representado con un , llamado "punto"), el entero de 32 bits ( , un "punto doble"), la matriz de 16 -bits enteros ( , una "cola"), y la matriz de enteros de 32 bits ( , un "híbrido"). Hay 65535 variables disponibles de cada tipo, numeradas de a para enteros de 16 bits, por ejemplo. Sin embargo, cada una de estas variables tiene su propia pila en la que puede ser empujada y desplegada (STASHed and RETRIEVEd, en terminología INTERCAL), aumentando la posible complejidad de las estructuras de datos. [6] Las versiones más modernas de INTERCAL han mantenido en general las mismas estructuras de datos, con las modificaciones apropiadas; TriINTERCAL, que modifica la base con la que se representan los números, puede usar un tipo de 10 trit en lugar de un tipo de 16 bits, [10] y CLC-INTERCAL implementa muchas de sus propias estructuras de datos, como "clases y conferencias", haciendo que los tipos de datos básicos almacenen más información en lugar de agregar nuevos tipos. [4] Las matrices se dimensionan asignándoles como si fueran una variable escalar . También se pueden utilizar constantes, y se representan mediante una ("malla") seguida de la propia constante, escrita como un número decimal ; solo se admiten constantes enteras de 0 a 65535. [6].
:
,
;
.1
.65535
#
Operadores
Solo hay cinco operadores en INTERCAL-72. Las implementaciones varían en qué caracteres representan qué operación, y muchas aceptan más de un carácter, por lo que se da más de una posibilidad para muchos de los operadores.
Operador | INTERCAL-72 caracteres | Caracteres C-INTERCAL | Caracteres CLC-INTERCAL |
---|---|---|---|
INTERCAMBIO / MEZCLA | c retroceso / | ¢ , $ , c Retroceso/ | ¢ |
SELECCIONE | ~ | ~ | ~ |
Y | & | & | & |
O | V | V | V |
XOR | V retroceso - | V retroceso - , ? ,∀ | V de retroceso - ,¥ |
A diferencia de la mayoría de los otros lenguajes, AND, OR y XOR son operadores unarios , que trabajan en partes consecutivas de su argumento; el bit más significativo del resultado es el operador aplicado a los bits menos significativos y más significativos de la entrada, el segundo bit más significativo del resultado es el operador aplicado a los bits más y segundos más significativos, el tercero- El bit más significativo del resultado es el operador aplicado al segundo y tercer bit más, y así sucesivamente. El operador se coloca entre el signo de puntuación que especifica un nombre de variable o constante y el número que especifica qué variable es, o simplemente dentro de las marcas de agrupación (es decir, un carácter más tarde de lo que sería en lenguajes de programación como C ). SELECT e INTERLEAVE (que también se conoce como MINGLE) son operadores binarios infijos; SELECT toma los bits de su primer operando que corresponden a los bits "1" de su segundo operando y elimina los bits que corresponden a los bits "0", desplazándose hacia el bit menos significativo y rellenando con ceros (por lo tanto, 51 (1 1 0 0 1 1 en binario) SELECT 21 (10101 en binario) es 5 ( 101 en binario)); MINGLE alterna bits de su primer y segundo operandos (de tal manera que el bit menos significativo de su segundo operando sea el bit menos significativo del resultado). No hay precedencia de operadores; Las marcas de agrupación deben usarse para eliminar la ambigüedad de la precedencia donde de otro modo sería ambigua (las marcas de agrupación disponibles son '
("chispa"), que coincide con otra chispa, y "
("orejas de conejo"), que coincide con otras orejas de conejo; el programador es responsable por usarlos de tal manera que hagan que la expresión sea inequívoca). [6]
Estructuras de Control
Todas las declaraciones INTERCAL comienzan con un "identificador de declaración"; en INTERCAL-72, esto puede ser DO
, PLEASE
o PLEASE DO
, todos los cuales significan lo mismo para el programa (pero usar uno de estos demasiado hace que el programa sea rechazado, una característica indocumentada en INTERCAL-72 que se mencionó en el C- INTERCAL manual), [10] o una forma invertida (con NOT
o N'T
adjunto al identificador). [6] Backtracking INTERCAL, una variante moderna, también permite el uso de variantes MAYBE
(posiblemente combinado con PLEASE o DO) como identificador de declaración, lo que introduce un punto de elección. [12] Antes del identificador, se puede dar un número de línea opcional (un número entero entre paréntesis); después del identificador, se puede dar un porcentaje de probabilidad de que la línea se ejecute en el formato %50
, que por defecto es 100%. [6]
En INTERCAL-72, las principales estructuras de control son SIGUIENTE, REANUDAR y OLVIDAR. se bifurca a la línea especificada, recordando la siguiente línea que se ejecutaría si no fuera por NEXT en una pila de llamadas (se pueden usar otros identificadores además de DO en cualquier declaración, DO se da como ejemplo); elimina las entradas de expresión de la parte superior de la pila de llamadas (esto es útil para evitar el error que de otro modo ocurre cuando hay más de 80 entradas) y elimina las entradas de expresión de la pila de llamadas y salta a la última línea recordada. [6]DO (line) NEXT
DO FORGET expression
DO RESUME expression
C-INTERCAL también proporciona la instrucción COME FROM , escrita ; CLC-INTERCAL y las versiones más recientes de C-INTERCAL también proporcionan un COME FROM ( y NEXT FROM, que es como COME FROM pero también guarda una dirección de retorno en la NEXT STACK. [4]DO COME FROM (line)
DO COME FROM expression)
Las formas alternativas de afectar el flujo del programa, originalmente disponibles en INTERCAL-72, son usar las instrucciones IGNORE y RECUERDA en las variables (que hacen que las escrituras en la variable se ignoren silenciosamente y tengan efecto nuevamente, de modo que las instrucciones se pueden deshabilitar al hacer que no tener ningún efecto), y las instrucciones ABSTAIN y REINSTATE en las líneas o en los tipos de declaración, lo que hace que las líneas no tengan efecto o que vuelvan a tener efecto, respectivamente. [6]
Hola Mundo
El tradicional "¡Hola, mundo!" El programa demuestra lo diferente que es INTERCAL de los lenguajes de programación estándar. En C , podría leerse de la siguiente manera:
#include int main ( void ) { printf ( "¡Hola, mundo! \ n " ); return 0 ; }
El programa equivalente en C-INTERCAL es más largo y más difícil de leer:
HACER , 1 <- # 13 POR FAVOR HACER , 1 SUB # 1 <- # 238 DO , 1 SUB # 2 <- # 108 DO , 1 SUB # 3 <- # 112 DO , 1 SUB # 4 <- # 0 DO , 1 SUB # 5 <- # 64 DO , 1 SUB # 6 <- # 194 DO , 1 SUB # 7 <- # 48 POR FAVOR HACER , 1 SUB # 8 <- # 22 DO , 1 SUB # 9 <- # 248 DO , 1 SUB # 10 <- # 168 DO , 1 SUB # 11 <- # 24 DO , 1 SUB # 12 <- # 16 DO , 1 SUB # 13 <- # 162 FAVOR LEER OUT , 1 FAVOR DAR UP
Dialectos
El INTERCAL original de Woods – Lyon tenía capacidades de entrada / salida muy limitadas : la única entrada aceptable eran números con los dígitos escritos, y la única salida era una versión extendida de números romanos .
La reimplementación de C-INTERCAL, que está disponible en Internet, ha hecho que el lenguaje sea más popular entre los devotos de los lenguajes de programación esotéricos. [13] El dialecto C-INTERCAL tiene algunas diferencias con el INTERCAL original e introdujo algunas características nuevas, como una instrucción COME FROM y un medio para hacer E / S de texto basado en el modelo de texto de Turing. [10]
Los autores de C-INTERCAL también crearon la variante TriINTERCAL, basada en el sistema de numeración Ternario y generalizando el conjunto de operadores de INTERCAL. [10]
Una variante más reciente es Threaded Intercal, que amplía la funcionalidad de COME FROM para admitir subprocesos múltiples . [14]
CLC-INTERCAL tiene una biblioteca llamada INTERNET para la funcionalidad de red, incluido ser un servidor INTERCAL, y también incluye características como Quantum Intercal, que permite cálculos de valores múltiples de una manera supuestamente lista para las primeras computadoras cuánticas .
A principios de 2017, apareció en GitHub una implementación de .NET dirigida a .NET Framework . Esta implementación admite la creación de bibliotecas binarias independientes y la interoperabilidad con otros lenguajes de programación. [15]
Impacto y discusión
En el artículo "A Box, Darkly: Ofuscation, Weird Languages, and Code Aesthetics", [13] INTERCAL se describe bajo el título "Abandonen toda cordura, ustedes que entran aquí: INTERCAL". El compilador y la estrategia de comentarios se encuentran entre las características "extrañas" descritas:
El compilador, apropiadamente llamado "ick", continúa la parodia. Todo lo que el compilador no pueda entender, que en un lenguaje normal resultaría en un error de compilación, simplemente se salta. Esta característica de "perdón" hace que la búsqueda de errores sea muy difícil; también introduce un sistema único para agregar comentarios al programa. El programador simplemente inserta texto no compilable en cualquier lugar del programa, teniendo cuidado de no incrustar accidentalmente un poco de código válido en medio de su comentario.
En "Tecnomasoquismo", [16] Lev Bratishenko caracteriza al compilador de INTERCAL como una dominatriz:
Si PLEASE no se encuentra con suficiente frecuencia, el programa será rechazado; es decir, ignorado sin explicación por el compilador. Demasiado a menudo y todavía sería rechazado, esta vez por lloriquear. Combinado con otras palabras que rara vez se usan en lenguajes de programación pero que aparecen como declaraciones en INTERCAL, el código se lee como si alguien suplicara.
Cultura popular
El sistema de disfrute Nitrome, una consola de videojuegos ficticia creada por el desarrollador británico de juegos independientes Nitrome , tiene juegos que están programados en INTERCAL.
Referencias
- ^ "La AZ de los lenguajes de programación: INTERCAL" . Techworld. 2008-07-04 . Consultado el 10 de marzo de 2012 .
- ^ "La página de recursos de INTERCAL" . Catb.org . Consultado el 10 de marzo de 2012 .
- ^ "Biografía de Alex Smith" . wolframscience.com .
- ^ a b c d e "Clc-Intercal" . Clc-Intercal. 2010-04-01. Archivado desde el original el 24 de diciembre de 2012 . Consultado el 10 de marzo de 2012 .
- ^ "Debian - Resultados de búsqueda de paquetes - intercal" . packages.debian.org . Consultado el 30 de marzo de 2021 .
- ^ a b c d e f g h i j k l m n o "Manual de referencia de INTERCAL" . Archivado desde el original el 16 de julio de 2011 . Consultado el 10 de marzo de 2012 .
- ^ "Sintaxis de Princeton y Atari - Manual de instrucciones renovado de C-INTERCAL 0.27" . Archivado desde el original el 24 de diciembre de 2012 . Consultado el 12 de noviembre de 2012 .
- ^ "Archivo HISTORIAL para C-INTERCAL" . Archivado desde el original el 5 de mayo de 2020 . Consultado el 5 de mayo de 2020 .
- ^ "Archivo README para CLC-INTERCAL" . Archivado desde el original el 5 de mayo de 2020 . Consultado el 5 de mayo de 2020 .
- ^ a b c d e f g "Manual de referencia suplementario C-INTERCAL" . Archivado desde el original el 23 de febrero de 2008.
- ^ Stross, Charles (septiembre de 1992). "Intercal - el idioma del infierno" . Computer Shopper (Reino Unido) .
- ^ "Retroceso en Intercal" . Cse.unsw.edu.au. 2006-04-11 . Consultado el 10 de marzo de 2012 .
- ^ a b Mateas, Michael; Nick Montfort. "Una caja, oscuramente: ofuscación, lenguajes extraños y estética del código" (PDF) . Actas de la 6ª Conferencia de Arte y Cultura Digital, Universidad de Tecnología de la Información de Copenhague, 1-3 de diciembre de 2005 . págs. 144-153.
- ^ "Intercal roscado" . Cse.unsw.edu.au. 2004-06-09 . Consultado el 10 de marzo de 2012 .
- ^ "Hogar oficial de Simple Component Intercal para .NET" .
- ^ Bratishenko, Lev (invierno de 2009). "Tecnomasoquismo" . Armario (36) . Consultado el 27 de mayo de 2014 .
enlaces externos
- Web oficial de C-INTERCAL
- Recursos de INTERCAL en la Web , incluidas varias implementaciones
- Entrevista Computerworld con Don Woods en INTERCAL
- Ponencia sobre abstracción y modularidad en INTERCAL