Articulo de referencia

INTERCAL

Don Woods , uno de los autores de INTERCAL, en 2010 Jim Lyon, el otro autor de INTERCAL, en 2005 El lenguaje de compilación sin acrónimo pronunciable ( INTERCAL ) es un lenguaje...

Don Woods , uno de los autores de INTERCAL, en 2010
Jim Lyon, el otro autor de INTERCAL, en 2005

El lenguaje de compilación sin acrónimo pronunciable ( INTERCAL ) es un lenguaje de programación esotérico 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 de la época, [ 1 ] así como la proliferación de construcciones y notaciones de lenguaje propuestas en la década de 1960.

Hay tres implementaciones mantenidas de dialectos INTERCAL: C-INTERCAL (creado en 1990), mantenido por Eric S. Raymond [ 2 ] y Alex Smith, [ 3 ] , CLC-INTERCAL, mantenido por Claudio Calvelli. [ 4 ] e INTERCAL64, desarrollado por Jason Whittington y ahora administrado por PLEASE ABSTAIN .

Historia

Según el manual original de los autores, [ 5 ]

El nombre completo del compilador es "Compiler Language With No Pronounceable Acronym" (Lenguaje de compilación sin acrónimo pronunciable), que, por razones obvias, se abrevia como "INTERCAL".

La implementación original de Princeton utilizaba tarjetas perforadas y el conjunto de caracteres EBCDIC . Para permitir que INTERCAL se ejecutara en computadoras que utilizaban ASCII , se tuvieron que realizar sustituciones para dos caracteres: $se sustituyó por ¢como operador de mezcla , "que representa el costo creciente del software en relación con el hardware", y ?se sustituyó por como operador de OR exclusivo unario para "expresar correctamente la reacción de la persona promedio al encontrarse por primera vez con el OR exclusivo". [ 5 ] En versiones recientes de C-INTERCAL, los operadores más antiguos son compatibles como alternativas; los programas INTERCAL ahora pueden codificarse en ASCII , Latin-1 o UTF-8 . [ 6 ]

Detalles

INTERCAL fue concebido para ser completamente diferente de todos los demás lenguajes de programación. En palabras del manual original:

Cualquier parecido entre el lenguaje de programación aquí descrito y otros lenguajes de programación, vivos o muertos, es pura coincidencia.

Las operaciones comunes en otros lenguajes tienen una sintaxis críptica y redundante en INTERCAL. Del Manual de Referencia de INTERCAL: [ 5 ]

Es un hecho bien conocido y demostrado con frecuencia que una persona cuyo trabajo es incomprensible goza de gran prestigio. Por ejemplo, si alguien afirmara que la forma más sencilla de almacenar el valor 65536 en una variable INTERCAL de 32 bits es:

HACER : 1 <- # 0 ¢# 256

Cualquier programador sensato diría que eso es absurdo. Dado que este es, en efecto, el método más sencillo, el programador quedaría en ridículo frente a su jefe, quien, como suele suceder, aparecería en cualquier momento. El efecto sería igualmente devastador para el programador que tuviera razón.

INTERCAL tiene muchas otras características diseñadas para hacerlo aún más desagradable estéticamente para el programador: utiliza instrucciones como "READ OUT", "IGNORE", "FORGET" y modificadores como "PLEASE". Esta última palabra clave proporciona dos razones para que el compilador rechace el programa: si "PLEASE" no aparece con la suficiente frecuencia, el programa se considera insuficientemente cortés, y el mensaje de error lo indica; si aparece con demasiada frecuencia, 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. [ 7 ]

A pesar de la sintaxis intencionadamente obtusa y prolija del lenguaje, INTERCAL es, no obstante, Turing-completo : con suficiente memoria, INTERCAL puede resolver cualquier problema que una máquina de Turing universal pueda resolver. Sin embargo, la mayoría de las implementaciones de INTERCAL lo hacen muy lentamente. En 1992, se probó en una Sun SPARCstation 1 una prueba de rendimiento del algoritmo de la criba de Eratóstenes , que calcula todos los números primos menores que 65536. En C , tardó menos de medio segundo; el mismo programa en INTERCAL tardó más de diecisiete horas. [ 8 ]

Documentación

El "diagrama sinuoso" del Manual de Referencia de INTERCAL, supuestamente para explicar el funcionamiento del operador "select".

El manual de referencia de INTERCAL contiene muchas instrucciones paradójicas, absurdas o, en general, humorísticas:

¡Precaución! ¡Bajo ninguna circunstancia confunda la malla con el operador de entrelazado, excepto en circunstancias que puedan generar confusión!

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 extraíble." [ 5 ]

El manual de INTERCAL asigna nombres inusuales a todos los caracteres ASCII no alfanuméricos : las comillas simples y dobles se denominan "chispas" y "orejas de conejo" respectivamente. (La excepción es el signo de ampersand : como indica el archivo de jerga , "¿qué podría ser más absurdo?"). El operador de asignación, representado como un signo de igual (la "media malla" de INTERCAL) en muchos otros lenguajes de programación, es en INTERCAL una flecha izquierda, <-, compuesta por un "ángulo" y un "gusano", que obviamente se lee como "obtiene".

Sintaxis

La entrada (mediante la WRITE INinstrucción) y la salida (mediante la READ OUTinstrucción) no utilizan los formatos habituales; en INTERCAL-72, WRITE IN introduce un número escrito en dígitos en inglés (como SIX FIVE FIVE THREE FIVE), y READ OUT lo imprime en números romanos "maltratados" . [ 5 ] Las versiones más recientes tienen sus propios sistemas de E/S . [ 4 ] [ 7 ]

Los comentarios se pueden lograr utilizando los identificadores de sentencia invertida que involucran NOT o N'T; estos hacen que las líneas se abstengan inicialmente para que no tengan efecto. [ 5 ] (Una línea puede abstenerse 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 se deshace de la abstención). [ 5 ]

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 "spot"), el entero de 32 bits ( , un "twospot"), la matriz de enteros de 16 bits ( , una "tail") y la matriz de enteros de 32 bits ( , un "hybrid"). Hay 65535 variables disponibles de cada tipo, numeradas del a para enteros de 16 bits, por ejemplo. Sin embargo, cada una de estas variables tiene su propia pila en la que se puede insertar y extraer (STASHed y RETRIEVEd, en la terminología de INTERCAL), lo que aumenta la posible complejidad de las estructuras de datos. [ 5 ] 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 uno de 16 bits, [ 7 ] 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 usar constantes, y se representan mediante una ("mesh") seguida de la constante misma, escrita como un número decimal ; solo se admiten constantes enteras de 0 a 65535. [ 5 ].:,;.1.65535#

Operadores

En INTERCAL-72 solo hay cinco operadores. Las implementaciones varían en cuanto a qué caracteres representan cada operación, y muchas aceptan más de un carácter, por lo que se ofrece más de una posibilidad para muchos de los operadores.

A diferencia de la mayoría de los demás lenguajes, AND, OR y XOR son operadores unarios , que actúan sobre bits consecutivos de su argumento; el bit más significativo del resultado es el operador aplicado a los bits menos 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 el segundo más significativos, el tercer bit más significativo del resultado es el operador aplicado a los bits segundo y tercero más significativos, y así sucesivamente. El operador se coloca entre el signo de puntuación que especifica el nombre de una variable o constante y el número que especifica de qué variable se trata, o justo dentro de las comillas (es decir, un carácter más tarde de lo que estaría en lenguajes de programación como C ).

SELECT e INTERLEAVE (también conocido 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: 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 operando (de tal manera que el bit menos significativo de su segundo operando es el bit menos significativo del resultado).

No existe precedencia de operadores; deben utilizarse marcas de agrupación para desambiguar la precedencia cuando de otro modo sería ambigua (las marcas de agrupación disponibles son '("spark"), que coincide con otra spark, y "("rabbit ears"), que coincide con otras rabbit ears; el programador es responsable de utilizarlas de manera que la expresión sea inequívoca). [ 5 ]

Estructuras de control

Todas las sentencias INTERCAL comienzan con un "identificador de sentencia"; en INTERCAL-72, este puede ser DO, PLEASE, o PLEASE DO, todos los cuales significan lo mismo para el programa (pero usar uno de estos con demasiada frecuencia hace que el programa sea rechazado, una característica no documentada en INTERCAL-72 que se mencionó en el manual de C-INTERCAL), [ 7 ] o una forma invertida (con NOTo N'Tañadido al identificador). [ 5 ] El INTERCAL con retroceso, una variante moderna, también permite variantes que usan MAYBE(posiblemente combinado con PLEASE o DO) como identificador de sentencia, lo que introduce un punto de elección. [ 9 ] Antes del identificador, se puede dar un número de línea opcional (un 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%. [ 5 ]

En INTERCAL-72, las principales estructuras de control son NEXT, RESUME y FORGET. NEXT salta 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 instrucció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. [ 5 ]DO (line) NEXTDO FORGET expressionDO 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 COME FROM calculado ( y NEXT FROM, que es como COME FROM pero también guarda una dirección de retorno en la PILA NEXT. [ 4 ]DO COME FROM (line)DO COME FROM expression)

Las formas alternativas de afectar el flujo del programa, disponibles originalmente en INTERCAL-72, consisten en usar las instrucciones IGNORE y REMEMBER en variables (que hacen que las escrituras en la variable se ignoren silenciosamente y vuelvan a surtir efecto, de modo que las instrucciones se pueden deshabilitar haciendo que no tengan efecto), y las instrucciones ABSTAIN y REINSTATE en líneas o en tipos de sentencias, haciendo que las líneas no tengan efecto o vuelvan a tener efecto respectivamente. [ 5 ]

Hola Mundo

El siguiente es un programa "¡Hola, mundo!" en INTERCAL.

HACER , 1 <- # 13 POR FAVOR HACER , 1 SUB # 1 <- # 238 HACER , 1 SUB # 2 <- # 108 HACER , 1 SUB # 3 <- # 112 HACER , 1 SUB # 4 <- # 0 HACER , 1 SUB # 5 <- # 64 HACER , 1 SUB # 6 <- # 194 HACER , 1 SUB # 7 <- # 48 POR FAVOR HACER , 1 SUB # 8 <- # 22 HACER , 1 SUB # 9 <- # 248 HACER , 1 SUB # 10 <- # 168 HACER , 1 SUB # 11 <- # 24 HACER , 1 SUB # 12 <- # 16 HACER , 1 SUB # 13 <- # 162 POR FAVOR LEA EN VOZ ALTA , 1 POR FAVOR RINDA

Dialectos

La calculadora 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 con letras, y la única salida era una versión extendida de números romanos .

La reimplementación de C-INTERCAL, al estar disponible en Internet, ha hecho que el lenguaje sea más popular entre los aficionados a los lenguajes de programación esotéricos. [ 10 ] El dialecto C-INTERCAL tiene algunas diferencias con respecto al INTERCAL original e introdujo algunas características nuevas, como una instrucción COME FROM y un método para realizar E/S de texto basado en el modelo de texto de Turing. [ 7 ]

Los autores de C-INTERCAL también crearon la variante TriINTERCAL, basada en el sistema de numeración ternario y que generaliza el conjunto de operadores de INTERCAL. [ 7 ]

Una variante más reciente es Threaded Intercal, que extiende la funcionalidad de COME FROM para admitir multihilo . [ 11 ]

CLC-INTERCAL dispone de una biblioteca llamada INTERNET para funcionalidades de red, incluyendo la de servidor INTERCAL, e incluye características como Quantum Intercal, que permite realizar cálculos multivalor de una forma supuestamente preparada para los primeros ordenadores cuánticos .

A principios de 2017 apareció en GitHub una implementación de .NET dirigida al .NET Framework . Esta implementación permite la creación de bibliotecas binarias independientes y la interoperabilidad con otros lenguajes de programación. Esta versión se considera obsoleta y ya no recibe mantenimiento. [ 12 ]

INTERCAL64 se anunció el 1 de abril de 2026. Este dialecto extiende el lenguaje para admitir 64 bits y, además, proporciona un entorno IDE completo para Visual Studio Code . Este código se transfirió posteriormente al grupo PLEASE ABSTAIN para su administración y desarrollo futuro. [ 13 ]

Impacto y debate

En el artículo «Una caja oscura: ofuscación, lenguajes extraños y estética del código» [ 10 ] , INTERCAL se describe bajo el título «Abandonad toda cordura, vosotros que entráis aquí: INTERCAL». El compilador y la estrategia de comentarios se encuentran entre las características «extrañas» descritas:

El compilador, acertadamente llamado "ick", continúa con la parodia. Todo aquello que el compilador no puede entender, lo que en un lenguaje normal resultaría en un error de compilación, simplemente se omite. Esta característica "indulgente" dificulta enormemente la detección de errores; además, introduce un sistema único para añadir comentarios al programa. El programador simplemente inserta texto no compilable en cualquier parte del programa, con cuidado de no insertar accidentalmente código válido en medio de su comentario.

En "Tecnomasoquismo", [ 14 ] Lev Bratishenko caracteriza al compilador INTERCAL como una dominatrix:

Si PLEASE no aparecía con la suficiente frecuencia, el programa sería rechazado; es decir, ignorado sin explicación por el compilador. Si aparecía con demasiada frecuencia, seguiría siendo rechazado, esta vez por lloriqueo. Combinado con otras palabras que rara vez se usan en lenguajes de programación, pero que aparecen como instrucciones en INTERCAL, el código se lee como si alguien estuviera suplicando.

Referencias

  1. "El AZ de los lenguajes de programación: INTERCAL" . Techworld. 4 de julio de 2008. Consultado el 10 de marzo de 2012 .
  2. "La página de recursos de INTERCAL" . Catb.org . Consultado el 10 de marzo de 2012 .
  3. "Biografía de Alex Smith" . wolframscience.com .
  4. 1 2 3 4 5 "Clc-Intercal" . Clc-Intercal. 2010-04-01 . Recuperado el 2012-03-10 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  5. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 "Manual de referencia INTERCAL" . Archivado del original el 16 de julio de 2011. Recuperado el 10 de marzo de 2012 .
  6. "Princeton and Atari Syntax – C-INTERCAL 0.27 Revamped Instruction Manual" . Consultado el 12 de noviembre de 2012 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  7. 1 2 3 4 5 6 7 "Manual de referencia suplementario C-INTERCAL" . Archivado del original el 23 de febrero de 2008.
  8. ^ Stross, Charles (septiembre de 1992). "Intercal: el lenguaje del infierno" . Comprador de computadoras (Reino Unido) .
  9. "Backtracking in Intercal" . Cse.unsw.edu.au. 11 de abril de 2006. Consultado el 10 de marzo de 2012 .
  10. 1 2 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 Artes y Cultura Digital, Universidad de TI de Copenhague, 1-3 de diciembre de 2005. págs. 144-153 . 
  11. "Intercalación enhebrada" . Cse.unsw.edu.au. 9 de junio de 2004. Consultado el 10 de marzo de 2012 .
  12. "Página oficial del componente simple INTERCAL para .NET" . GitHub . 30 de septiembre de 2021.
  13. "POR FAVOR, ABSTÉNGASE - Administradores oficiales de INTERCAL64" . POR FAVOR, ABSTÉNGASE . 6 de julio de 2026.
  14. Bratishenko, Lev (Invierno 2009). "Tecnomasoquismo" . Cabinet (36) . Consultado el 27 de mayo de 2014 .
  • Sitio web oficial de C-INTERCAL
  • Recursos de INTERCAL en la web , incluyendo varias implementaciones.
  • Entrevista de Computerworld con Don Woods sobre INTERCAL
  • Artículo sobre abstracción y modularidad en INTERCAL