En programación informática , los dígrafos y los trígrafos son secuencias de dos y tres caracteres , respectivamente, que aparecen en el código fuente y, según la especificación de un lenguaje de programación , deben tratarse como si fueran caracteres únicos. Los trigraphs se han eliminado del lenguaje C++ y serán de C a partir de C23 , por lo que probablemente ya no se usan mucho en la práctica en C, ni en ningún otro lenguaje convencional (su uso en el lenguaje J es una excepción). En el mundo moderno de Unicode / UTF-8 (incluso solo con ASCII ) no hay necesidad de trígrafos en el diseño de lenguajes, que se consideraban una carga, ni tampoco dígrafos, que probablemente tengan muy pocos usuarios, al menos en esos idiomas.
Existen varias razones para usar dígrafos y trígrafos: es posible que los teclados no tengan teclas para cubrir 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 uso especial, etc. Los trígrafos también se pueden utilizar para algunas páginas de códigos EBCDIC que carecen de caracteres como y .{
}
El juego de caracteres básico del lenguaje de programación C es un subconjunto del juego de caracteres ASCII que incluye nueve caracteres que se encuentran fuera del juego de caracteres invariante ISO 646 . Esto puede plantear un problema al escribir código fuente cuando la codificación (y posiblemente el teclado ) que se utiliza no admite ninguno de estos nueve caracteres. El comité ANSI C inventó los trígrafos como una forma de ingresar el código fuente utilizando teclados que admitan cualquier versión del juego de caracteres ISO 646. [1]
Los trigraphs no se encuentran comúnmente fuera de los conjuntos de pruebas del compilador . [2] Algunos compiladores admiten una opción para desactivar el reconocimiento de trígrafos o desactivar los trígrafos de forma predeterminada y requieren una opción para activarlos. Algunos pueden emitir advertencias cuando encuentran trígrafos en los archivos fuente. Borland suministró un programa separado, el preprocesador trigraph ( ), para ser utilizado sólo cuando se desea el procesamiento trigraph (la razón fundamental era maximizar la velocidad de compilación).TRIGRAPH.EXE
Diferentes sistemas definen diferentes conjuntos de dígrafos y trígrafos, como se describe a continuación.
Las primeras versiones de ALGOL eran anteriores a los juegos 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 periféricos, lo que llevó a una serie de sustituciones, incluidas :=
for ←
(asignación) y >=
for ≥
(mayor o igual).
El lenguaje de programación Pascal admite(.
dígrafos , .)
y para , y respectivamente . A diferencia de todos los demás casos mencionados aquí, fueron y siguen siendo de uso generalizado. Sin embargo, muchos compiladores los tratan como un tipo diferente de bloque de comentarios en lugar de dígrafos reales, es decir, un comentario que comienza con no se puede cerrar con y viceversa.(*
*)
[
]
{
}
(*
*)
(*
}
El lenguaje de programación J es descendiente de APL pero utiliza el juego de caracteres ASCII en lugar de símbolos APL . Debido a que el rango imprimible de ASCII es más pequeño que el conjunto especializado de símbolos de APL, se utilizan caracteres .
(punto) y :
(dos puntos) para flexionar los símbolos ASCII, interpretando efectivamente unigrafos, dígrafos o, raramente, trígrafos como "símbolos" independientes. [3]
A diferencia del uso de dígrafos y trígrafos en C y C++ , no existen equivalentes de un solo carácter en J.
El preprocesador de C (utilizado para C y con ligeras diferencias en C++ ; ver más abajo) reemplaza todas las apariciones de las nueve secuencias de trígrafos en esta tabla por sus equivalentes de un solo carácter antes de cualquier otro procesamiento (hasta C23 [4] ). [5] [6]
Es posible que un programador desee colocar dos signos de interrogación juntos pero que el compilador no los trate como si presentaran un trígrafo. La gramática 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 las constantes de varios caracteres, las cadenas literales y los comentarios. Esto es particularmente un problema para el Mac OS clásico , donde la constante '????'
puede usarse como tipo de archivo o creador. [7] Para colocar de forma segura dos signos de interrogación consecutivos dentro de una cadena literal, el programador puede usar la concatenación de cadenas "...?""?..."
o una secuencia de escape "...?\?..."
.
???
No es en sí misma una secuencia de trígrafos, pero cuando va seguida de un carácter como -
este, se interpretará como ?
+ ??-
, como en el siguiente ejemplo, que tiene 16 ?
s antes de /
.
El ??/
trígrafo se puede utilizar para introducir una nueva línea con escape para empalmar líneas; esto debe tenerse en cuenta para el manejo correcto y eficiente de los trígrafos dentro del preprocesador. También puede causar sorpresas, particularmente en los comentarios. Por ejemplo:
// ¿Se ejecutará la siguiente línea????????????????/ 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 formado correctamente. El concepto se puede utilizar para comprobar trigrafos como en el siguiente ejemplo de C99, donde solo se ejecutará una declaración de retorno.
int trigraphsavailable () // devuelve 0 o 1; estándar de lenguaje C99 o posterior { // ¿están disponibles los trígrafos?/ return 0 ; devolver 1 ; }
En 1994, una enmienda normativa al estándar C, C95 , [8] [9] incluido en C99, proporcionó dígrafos como alternativas más legibles a cinco de los trígrafos.
A diferencia de los trígrafos, los dígrafos se manejan durante la tokenización , y cualquier dígrafo siempre debe representar un token completo por sí mismo o componer el token %:%:
reemplazando el token de concatenación del preprocesador ##
. Si una secuencia de dígrafos ocurre dentro de otro token, por ejemplo una cadena entrecomillada o una constante de caracteres, no será reemplazada.
C++ (hasta C++14 , ver más abajo) se comporta como C, incluidas las adiciones de C99, pero con tokens adicionales enumerados en la tabla. [10]
Como nota, %:%:
se trata como un token único, en lugar de dos apariciones de %:
.
En la secuencia, <::
si el carácter siguiente no es :
ni >
, <
se trata como un token de preprocesamiento en sí mismo y no como el primer carácter del token alternativo <:
. Esto se hace para que la sustitución no interrumpa ciertos usos de las plantillas.
El Estándar C++ hace este comentario con respecto al término "dígrafo": [11]
El término "dígrafo" (token que consta de dos caracteres) no es perfectamente descriptivo, ya que uno de los tokens de preprocesamiento alternativos lo es
%:%:
y, por supuesto, varios tokens primarios contienen dos caracteres. No obstante, esos tokens alternativos que no son palabras clave léxicas se conocen coloquialmente como "dígrafos".
Se propuso que los trigraphs quedaran obsoletos en C++0x , que se lanzó como C++11 . [12] IBM se opuso a esto , hablando en nombre de sí mismo y de otros usuarios de C++, [13] y, como resultado, los trígrafos se mantuvieron en C++11. Luego se propuso nuevamente la eliminación de trigraphs (no solo su desaprobación) en C++17 . [14] Esto fue aprobado por votación del comité y los trígrafos (pero no los tokens adicionales) se eliminan de C++17 a pesar de la oposición de IBM. [15] El código existente que utiliza trígrafos puede ser compatible traduciendo los archivos fuente (trígrafos de análisis) al conjunto de caracteres fuente básico que no incluye trígrafos. [14]
Las calculadoras Hewlett-Packard que admiten el lenguaje RPL y el método de entrada brindan soporte para una gran cantidad de trígrafos (también llamados códigos TIO ) para transcribir de manera confiable caracteres ASCII que no sean de siete bits del conjunto de caracteres extendido de las calculadoras [16] [17] [18 ] en plataformas extranjeras y para facilitar la entrada del teclado sin utilizar la aplicación CHARS . [19] [20] [17] [18] El primer carácter de todos los códigos TIO es \
, seguido de otros dos caracteres ASCII que se parecen vagamente al glifo que se va a sustituir. [19] [20] [17] [18] [21] Todos los demás caracteres se pueden ingresar usando la sintaxis especial del código TIO, siendo nnn un número decimal\nnn
de tres dígitos (con ceros a la izquierda si es necesario) del punto de código correspondiente (por lo tanto representando formalmente un tetrágrafo ). [19] [17] [18]
El editor de texto Vim admite dígrafos para la entrada real de caracteres de texto, siguiendo RFC 1345. La entrada de dígrafos está vinculada a Ctrl+ Kde forma predeterminada. [22] La lista de todos los dígrafos posibles en Vim se puede mostrar escribiendo :dig.
GNU Screen tiene un comando dígrafo, vinculado a + + de forma predeterminada. [23]CtrlA CtrlV
Lotus 1-2-3 para DOS utiliza + como tecla de redacción para permitir una entrada más sencilla de muchos caracteres especiales del conjunto de caracteres internacionales de Lotus (LICS) [24] y del conjunto de caracteres multibyte de Lotus (LMBCS).AltF1