INTERCAL

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

El lenguaje compilador sin acrónimo pronunciable (INTERCAL) es un lenguaje de programación esotérico que fue creado como parodia por Don Woods y James M. Lyon [ru], dos estudiantes de la Universidad de Princeton, en 1972. Satiriza aspectos de los distintos lenguajes de programación de la época, como así como la proliferación de construcciones y notaciones lingüísticas propuestas en la década de 1960.

Hay dos implementaciones mantenidas de los dialectos INTERCAL: C-INTERCAL (creada en 1990), mantenida por Eric S. Raymond y Alex Smith, y CLC-INTERCAL, mantenida por Claudio Calvelli.

Historia

Según el manual original de los autores,

El nombre completo del compilador es "Compiler Language With No Pronounceable Acronym", que es, por razones obvias, abreviado "INTERCAL".

La implementación original de Princeton usaba tarjetas perforadas y el juego de caracteres EBCDIC. Para permitir que INTERCAL se ejecute en computadoras que usan ASCII, se tuvieron que realizar sustituciones de dos caracteres: $ sustituido por ¢ como el operador mingle, & #34;representan[ing] el costo creciente del software en relación con el hardware", y ? fue sustituido por como operador unario exclusivo-u de &# 34;expresar correctamente la reacción de la persona promedio al encontrarse por primera vez con exclusivo-o". En versiones recientes de C-INTERCAL se soportan como alternativas los operadores más antiguos; Los programas INTERCAL ahora pueden codificarse en ASCII, Latin-1 o UTF-8.

Números de versión

C-INTERCAL intercambia los números de versión principal y secundaria, en comparación con la tradición. El archivo HISTORIAL muestra versiones que comienzan en la versión 0.3 y, a partir de mayo de 2020, han progresado a 0.31, pero contienen 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, que dice:

* El término "versión" ha sido reemplazado por "perversión" para corrección

* El número de perversión consiste en un número de punto flotante con signos independientes para la parte entero y fraccional. Negativo fracciones indican pre-escapes (así que 1.-94 significa "94 pre-escapes to ir antes de 1.00". O puedes añadir los números juntos y conseguir 0,06, que es totalmente una coincidencia ya que 0.06 no está siendo desarrollados)

* La parte fraccionada de un número de perversión puede ser entero o flotante punto, con un significado similar para las partes. El actual pre-escape es 1.-94.-2 que significa "2 pre-escapes para ir antes del pre-escape 1.-94".

Detalles

INTERCAL fue diseñado para ser completamente diferente de todos los demás lenguajes de programación. Las operaciones comunes en otros lenguajes tienen sintaxis críptica y redundante en INTERCAL. Del Manual de Referencia de INTERCAL:

Es un hecho bien conocido y detestado que una persona cuyo trabajo es incomprensible se mantiene en alta estima. Por ejemplo, si se dijera que la forma más simple de almacenar un valor de 65536 en una variable INTERCAL de 32 bits es:

Sí. :1 . #0¢256

cualquier programador razonable diría que eso era absurdo. Dado que este es el método más simple, el programador se haría parecer tonto delante de su jefe, que por supuesto resultaría aparecer, ya que los jefes no lo harán. El efecto no sería menos devastador para el programador que hubiera sido correcto.

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" 34; 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 la frecuencia suficiente, el programa se considera insuficientemente cortés y el mensaje de error dice esto; si aparece con demasiada frecuencia, el programa podría ser rechazado por excesivamente cortés. Aunque esta función existía en el compilador INTERCAL original, no estaba documentada.

A pesar de la sintaxis intencionadamente obtusa y prolija del lenguaje, INTERCAL es Turing-completo: con suficiente memoria, INTERCAL puede resolver cualquier problema que una máquina Universal de Turing pueda resolver. Sin embargo, la mayoría de las implementaciones de INTERCAL hacen esto muy lentamente. En 1992, se probó un punto de referencia Sieve of Eratosthenes, que calcula todos los números primos menores que 65536, en una Sun SPARCstation 1. En C, tomó menos de medio segundo; el mismo programa en INTERCAL tomó más de diecisiete horas.

Documentación

El diagrama "circuito" del Manual de Referencia INTERCAL, supuestamente para explicar el funcionamiento del operador "selecto"

El Manual de Referencia de INTERCAL contiene muchas instrucciones paradójicas, sin sentido o humorísticas:

¡Precaución! Bajo ninguna circunstancia confundir la malla con el operador interleave, excepto en circunstancias confusas!

El manual también contiene una "amigdala", 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 de INTERCAL debería contener algún otro tipo de órgano extraíble."

El manual de 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 (la "media malla" de INTERCAL;) en muchos otros lenguajes de programación, es en INTERCAL una flecha izquierda, <-, formada por un "ángulo" y un "gusano", obviamente leído como "obtiene".

Sintaxis

La entrada (usando la instrucción WRITE IN) y la salida (usando la instrucción READ OUT) no usan los formatos usuales; 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 genera en "masacrado" Números romanos. Las versiones más recientes tienen sus propios sistemas de E/S.

Los comentarios se pueden lograr usando los identificadores de declaraciones invertidas que involucran NOT o N & # 39; T; estos hacen que las líneas se ABSTENGAN inicialmente para que no tengan efecto. (Se puede abstener de una línea 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á ABSTENIDA).

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 "dos puntos"), la matriz de enteros de 16 bits (,, una "cola"), y la matriz de enteros de 32 bits (;, un "híbrido"). Hay 65535 variables disponibles de cada tipo, numeradas de .1 a .65535 para enteros de 16 bits, por ejemplo. Sin embargo, cada una de estas variables tiene su propia pila en la que se pueden empujar y sacar (ESCONDIR y RECUPERAR, en la terminología de INTERCAL), lo que aumenta la posible complejidad de las estructuras de datos. Las versiones más modernas de INTERCAL han mantenido en general las mismas estructuras de datos, con las modificaciones correspondientes; TriINTERCAL, que modifica la raíz con la que se representan los números, puede usar un tipo de 10 trit en lugar de un tipo de 16 bits, y CLC-INTERCAL implementa muchas de sus propias estructuras de datos, como "clases y conferencias", al hacer que los tipos de datos básicos almacenen más información en lugar de agregar nuevos tipos. Los arreglos se dimensionan asignándoles como si fueran una variable escalar. También se pueden usar constantes, y están representadas por un # ("mesh") seguido de la constante misma, escrita como un número decimal; solo se admiten constantes enteras de 0 a 65535.

Operadores

Solo hay cinco operadores en INTERCAL-72. Las implementaciones varían en cuanto a qué caracteres representan qué 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.

Operadores INTERCAL
Operador caracteres INTERCAL-72 C-INTERCAL personajes CLC-INTERCAL personajes
INTERLEAVE / MINGLE c backspace /¢, $, c backspace /¢
SELECT~~~
Y&&&
OVVV
XOR V backspace -V backspace -, ?, V backspace -, ¥

Al contrario de la mayoría de los demás lenguajes, AND, OR y XOR son operadores unarios, que funcionan en bits consecutivos 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 a los bits segundo y tercero, 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 qué variable es, o simplemente dentro de los signos de agrupación (es decir, un carácter después de lo que sería en lenguajes de programación como C). SELECT e INTERLEAVE (que también conocido como MINGLE) son operadores binarios infijos; SELECT toma los bits de su primer operando que corresponden a "1" bits de su segundo operando y elimina los bits que corresponden a "0" bits, desplazándose hacia el bit menos significativo y rellenando con ceros (por lo que 51 (110011 en binario) SELECT 21 (10101 en binario) es 5 (101 en binario)); MINGLE alterna bits de su primer y segundo operando (de tal forma que el bit menos significativo de su segundo operando es el bit menos significativo del resultado). No hay precedencia de operadores; las marcas de agrupación deben usarse para desambiguar la precedencia donde de otro modo sería ambigua (las marcas de agrupación disponibles son ' ("chispa"), que coincide con otra chispa, y < código>" ("orejas de conejo"), que coincide con otras orejas de conejo; el programador es responsable de usarlas de tal manera que la expresión quede inequívoca).

Estructuras de control

Todas las sentencias de INTERCAL comienzan con un "identificador de sentencia"; en INTERCAL-72, esto puede ser DO, PLEASE, o PLEASE DO, todos los cuales significan lo mismo para el programa (pero usando uno de estos en exceso hace que el programa sea rechazado, una característica no documentada en INTERCAL-72 que se mencionó en el manual de C-INTERCAL), o una forma invertida (con NOT o N'T añadido al identificador). Retroceder INTERCAL, una variante moderna, también permite variantes que usan MAYBE (posiblemente combinado con PLEASE o DO) como un identificador de declaración, lo que introduce un punto de elección. 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%.

En INTERCAL-72, las principales estructuras de control son SIGUIENTE, REANUDAR y OLVIDAR. DO (line) NEXT 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 (otros identificadores que DO se puede usar en cualquier declaración, DO se da como ejemplo); DO FORGET expression elimina las entradas de expression de la parte superior de la pila de llamadas (esto es útil para evitar el error que ocurre cuando hay más de 80 entradas), y DO RESUME expression elimina las entradas de expression de la pila de llamadas y salta a la última línea recordada.

C-INTERCAL también proporciona la instrucción COME FROM, escrita DO COME FROM (line); CLC-INTERCAL y las versiones más recientes de C-INTERCAL también proporcionan VENIR DESDE (DO VENIR DE expresión) y SIGUIENTE DE, que es como VENIR DE pero también guarda un retorno dirección en la SIGUIENTE PILA.

Las formas alternativas de afectar el flujo del programa, disponibles originalmente en INTERCAL-72, son usar las instrucciones IGNORAR y RECORDAR en las variables (lo que hace que las escrituras en la variable se ignoren silenciosamente y vuelvan a tener efecto, de modo que las instrucciones se pueden deshabilitar). haciendo que no tengan efecto), y las instrucciones ABSTENER y REINSTATAR en líneas o en tipos de declaración, haciendo que las líneas no tengan efecto o vuelvan a tener efecto respectivamente.

Hola mundo

El tradicional "¡Hola, mundo!" El programa demuestra cuán diferente es INTERCAL de los lenguajes de programación estándar. En C, podría leerse de la siguiente manera:

#include Identificado.hint principal()vacío) {} printf()"¡Hola, mundo!n"); retorno 0;}

El programa equivalente en C-INTERCAL es más largo y más difícil de leer:

Sí. ,1 . #13Por favor. Sí. ,1 SUB #1 . #238Sí. ,1 SUB #2 . #108Sí. ,1 SUB #3 . #112Sí. ,1 SUB #4 . #0Sí. ,1 SUB #5 . #64Sí. ,1 SUB #6 . #194Sí. ,1 SUB #7 . #48Por favor. Sí. ,1 SUB #8 . #22Sí. ,1 SUB #9 . #248Sí. ,1 SUB #10 . #168Sí. ,1 SUB #11 . #24Sí. ,1 SUB #12 . #16Sí. ,1 SUB #13 . #162Por favor. READ Fuera. ,1Por favor. GIVE Arriba

Dialectos

El Woods–Lyon INTERCAL original estaba muy limitado en sus capacidades de entrada/salida: la única entrada aceptable eran números con los dígitos deletreados, 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 devotos de los lenguajes de programación esotéricos. 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 realizar E/S de texto basado en el modelo de texto de Turing.

Los autores de C-INTERCAL también crearon la variante TriINTERCAL, basada en el sistema numérico ternario y generalizando el conjunto de operadores de INTERCAL.

Una variante más reciente es Threaded Intercal, que amplía la funcionalidad de COME FROM para admitir subprocesos múltiples.

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.

Impacto y discusión

En el artículo "A Box, Darkly: Ofuscation, Weird Languages, and Code Aesthetics", INTERCAL se describe bajo el título "Abandonad toda cordura, los que ingresan aquí: INTERCAL". El compilador y la estrategia de comentarios se encuentran entre los "raros" características descritas:

El compilador, apropiadamente llamado "ick", continúa la parodia. Cualquier cosa que el compilador no pueda entender, que en un lenguaje normal resultaría en un error de compilación, se acaba de saltar. Esta función de "perdonación" hace que encontrar errores sea muy difícil; también introduce un sistema único para añadir comentarios del programa. El programador simplemente inserta texto no compatible 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", Lev Bratishenko caracteriza al compilador INTERCAL como una dominatriz:

Si POR FAVOR no se encontró con suficiente frecuencia, el programa sería rechazado; es decir, ignorado sin explicación por el compilador. Con demasiada frecuencia y todavía sería rechazado, esta vez para la inflexión. Combinado con otras palabras que raramente se utilizan en lenguajes de programación pero aparecen como declaraciones en INTERCAL, el código lee como alguien que solicita.

Cultura popular

El Nitrome Enjoyment System, una consola de videojuegos ficticia creada por el desarrollador de juegos independiente británico Nitrome, tiene juegos que están programados en INTERCAL.