En programación informática , los dígrafos y trigrafos son secuencias de dos y tres caracteres , respectivamente, que aparecen en el código fuente y que, según la especificación del lenguaje de programación , deben tratarse como si fueran caracteres individuales.
Existen varias razones para usar dígrafos y trígrafos: los teclados pueden no tener teclas que cubran todo el conjunto de caracteres del idioma, la entrada de caracteres especiales puede ser difícil, los editores de texto pueden reservar algunos caracteres para usos especiales, etc. Los trígrafos también podrían usarse para algunas páginas de códigos EBCDIC que carecen de caracteres como y .{}
Historia
El conjunto básico de caracteres del lenguaje de programación C es un subconjunto del conjunto de caracteres ASCII que incluye nueve caracteres que quedan fuera del conjunto de caracteres invariantes ISO 646. Esto puede suponer un problema al escribir código fuente cuando la codificación (y posiblemente el teclado ) que se utiliza no admite uno o más de estos nueve caracteres. El comité ANSI C inventó los trígrafos como una forma de introducir código fuente utilizando teclados que admiten cualquier versión nacional del conjunto de caracteres ISO 646. [ 1 ]
Con la adopción generalizada de ASCII y Unicode / UTF-8 , el uso de trigrafos es limitado hoy en día, y el soporte para trigrafos se eliminó de C a partir de C23. [ 2 ]
Implementaciones
Los trigrafos no se encuentran comúnmente fuera de los conjuntos de pruebas de compiladores . [ 3 ] Algunos compiladores admiten una opción para desactivar el reconocimiento de trigrafos, o deshabilitarlos por defecto y requerir una opción para activarlos. Algunos pueden emitir advertencias cuando encuentran trigrafos en los archivos fuente. Borland proporcionó un programa separado, el preprocesador de trigrafos ( ), para ser utilizado solo cuando se desea el procesamiento de trigrafos (la razón era maximizar la velocidad de compilación).TRIGRAPH.EXE
Soporte de idiomas
Los distintos sistemas definen diferentes conjuntos de dígrafos y trígrafos, como se describe a continuación.
ALGOL
Las primeras versiones de ALGOL eran anteriores a los conjuntos de caracteres estandarizados ASCII y EBCDIC, y normalmente se implementaban utilizando un código de caracteres de seis bits específico del fabricante . Varias operaciones de ALGOL carecían de puntos de código en el conjunto de caracteres disponible o no eran compatibles con los periféricos, lo que dio lugar a varias sustituciones, incluidas :=para ←(asignación) y >=para ≥(mayor o igual que).
Pascal
El lenguaje de programación Pascal admite dígrafos (., .), (*y *)para [, ], {y }respectivamente. A diferencia de todos los demás casos mencionados aquí, (*y *)fueron y siguen siendo ampliamente utilizados. Sin embargo, muchos compiladores los tratan como un tipo diferente de bloque de comentarios en lugar de como dígrafos reales, es decir, un comentario que comienza con (*no puede cerrarse con }y viceversa.
J
El lenguaje de programación J es descendiente de APL , pero utiliza el conjunto de caracteres ASCII en lugar de los símbolos de APL . Debido a que el rango imprimible de ASCII es menor que el conjunto especializado de símbolos de APL, se utilizan los caracteres .(punto) y :(dos puntos) para flexionar los símbolos ASCII, interpretando efectivamente los unigrafos, dígrafos o, raramente, trígrafos como "símbolos" independientes. [ 4 ]
A diferencia del uso de dígrafos y trígrafos en C y C++ , no existen equivalentes de un solo carácter para estos en J.
do
El preprocesador de C (utilizado para C y con ligeras diferencias en C++ ; véase más abajo ) reemplaza todas las ocurrencias de las nueve secuencias de trigrafos en esta tabla con sus equivalentes de un solo carácter antes de cualquier otro procesamiento (hasta C23 [ 2 ] ). [ 5 ] [ 6 ]
Un programador puede querer colocar dos signos de interrogación juntos, pero sin que el compilador los interprete como la introducción de un trigrafo. La gramática de C no permite dos ?tokens consecutivos, por lo que los únicos lugares en un archivo C donde se pueden usar dos signos de interrogación seguidos son en constantes de varios caracteres, literales de cadena y comentarios. Esto es particularmente problemático para el Mac OS clásico , donde la constante '????'puede usarse como un tipo de archivo o creador . [ 7 ] Para colocar de forma segura dos signos de interrogación consecutivos dentro de un literal de cadena, el programador puede usar la concatenación de cadenas "...?""?..."o una secuencia de escape"...?\?..." .
???no es en sí mismo una secuencia de trigrafos, pero cuando va seguido de un carácter como -se interpretará como ?+ ??-, que se convierte en ?~.
El ??/trigrafo se puede usar para introducir un salto de línea escapado para la unión de líneas; esto debe tenerse en cuenta para un manejo correcto y eficiente de los trigrafos dentro del preprocesador. También puede causar sorpresas, particularmente dentro de los comentarios. Por ejemplo:
// ¡Todo esto es solo un comentario!???/ a ++ ;que es una única línea de comentario lógico (utilizada en C++ y C99 ), y
/??/ * Un comentario *??/ /que es un comentario de bloque correctamente formado. El concepto se puede usar para comprobar si hay trigrafos, como en el siguiente ejemplo de C99, donde solo se ejecutará una instrucción return.
// devuelve falso o verdadero; estándar de lenguaje C99 o posterior bool trigraphsAvailable () { // ¿están disponibles los trigrafos?/ return falso ; return verdadero ; }