En programación informática , los dígrafos y 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 individuales. Los trígrafos se han eliminado del lenguaje C++ y se eliminarán de C a partir de C23 , por lo que es probable que ya no se utilicen 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, y tampoco de dígrafos, que probablemente tengan muy pocos usuarios, al menos en esos lenguajes.
Existen varias razones para utilizar 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 resultar difícil, los editores de texto pueden reservar algunos caracteres para un uso especial, etc. Los trígrafos también pueden utilizarse para algunas páginas de códigos EBCDIC que carecen de caracteres como y .{
}
El conjunto de caracteres básicos del lenguaje de programación C es un subconjunto del conjunto de caracteres ASCII que incluye nueve caracteres que se encuentran fuera del conjunto de caracteres invariantes ISO 646. Esto puede suponer un problema para 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 introducir código fuente utilizando teclados que admitan cualquier versión del conjunto de caracteres ISO 646. [1]
Los trígrafos 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 deshabilitan 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 proporcionó un programa separado, el preprocesador de trígrafos ( ), para usarse solo cuando se desea el procesamiento de trígrafos (la razón 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 conjuntos de caracteres estandarizados ASCII y EBCDIC, y se implementaban normalmente 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 daba lugar a una serie de sustituciones, incluidas :=
for ←
(asignación) y >=
for ≥
(mayor o igual que).
El lenguaje de programación Pascal admite los dígrafos (.
, .)
, (*
y *)
para [
, ]
, {
y }
respectivamente. A diferencia de todos los demás casos mencionados aquí, (*
y *)
se usaron y aún se usan ampliamente. 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 se puede cerrar con }
y viceversa.
El lenguaje de programación J es un descendiente de APL pero utiliza el conjunto de caracteres ASCII en lugar de los símbolos 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 declinar los símbolos ASCII, interpretando eficazmente los 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 para estos en J.
El preprocesador C (usado 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]
Un programador puede querer colocar dos signos de interrogación juntos pero que el compilador no los trate como la introducción de un trígrafo. La gramática de C no permite dos ?
tokens consecutivos, por lo que los únicos lugares en un archivo de C donde se pueden usar dos signos de interrogación seguidos son en constantes de múltiples caracteres, literales de cadena y comentarios. Esto es particularmente un problema para el sistema operativo Mac OS clásico , donde la constante '????'
se puede usar 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í una secuencia de trígrafos, pero cuando va seguido de un carácter como -
se interpretará como ?
+ ??-
, como en el ejemplo siguiente que tiene 16 ?
s antes del /
.
El ??/
trígrafo se puede utilizar para introducir un salto de línea con escape para la unión de líneas; esto debe tenerse en cuenta para un manejo correcto y eficiente de los trígrafos dentro del preprocesador. También puede causar sorpresas, especialmente en los comentarios. Por ejemplo:
// ¿Se ejecutará la siguiente línea????????????????/ a ++ ;
que es una única línea de comentario lógico (usada en C++ y C99 ), y
/??/ * Un comentario *??/ /
que es un comentario de bloque formado correctamente. El concepto se puede utilizar para verificar trígrafos como en el siguiente ejemplo de C99, donde solo se ejecutará una instrucción de retorno.
int trigraphsavailable () // devuelve 0 o 1; estándar de lenguaje C99 o posterior { // ¿Están disponibles los trígrafos?/ devuelve 0 ; devuelve 1 ; }
En 1994, una enmienda normativa a la norma C, C95 , [8] [9] incluida 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 entre comillas o una constante de caracteres, no se reemplazará.
C++ (hasta C++14 , ver más abajo) se comporta como C, incluidas las incorporaciones de C99, pero con tokens adicionales enumerados en la tabla. [10]
Como nota, %:%:
se trata como un solo token, en lugar de dos apariciones de %:
.
En la secuencia, <::
si el carácter subsiguiente no es :
ni >
, <
se trata como un token de preprocesamiento por 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 es
%:%:
y, por supuesto, varios tokens primarios contienen dos caracteres. No obstante, aquellos tokens alternativos que no son palabras clave léxicas se conocen coloquialmente como "dígrafos".
Se propuso la desuso de los trígrafos en C++0x , que se publicó como C++11 . [12] IBM se opuso a esto , hablando en su nombre y en el 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 los trígrafos (no solo su desuso) en C++17 . [14] Esto pasó una votación del comité y los trígrafos (pero no los tokens adicionales) se eliminaron de C++17 a pesar de la oposición de IBM. [15] El código existente que usa trígrafos se puede respaldar traduciendo desde los archivos fuente (analizando trígrafos) al conjunto de caracteres fuente básico que no incluye trígrafos. [14]
Las calculadoras Hewlett-Packard que admiten el lenguaje y el método de entrada RPL admiten 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 usar la aplicación CHARS . [19] [20] [17] [18] El primer carácter de todos los códigos TIO es un \
, seguido de otros dos caracteres ASCII que se asemejan vagamente al glifo que se va a sustituir. [19] [20] [17] [18] [21] Todos los demás caracteres se pueden ingresar utilizando la sintaxis especial del código TIO, donde nnn es un número decimal\nnn
de tres dígitos (con ceros a la izquierda si es necesario) del punto de código correspondiente (representando así formalmente un tetrágrafo ). [19] [17] [18]
El editor de texto Vim admite dígrafos para la entrada real de caracteres de texto, siguiendo el RFC 1345. La entrada de dígrafos está vinculada a Ctrl+ Kde manera predeterminada. [22] La lista de todos los dígrafos posibles en Vim se puede visualizar escribiendo :dig.
GNU Screen tiene un comando dígrafo, asociado a ++ por defecto . [23]CtrlA CtrlV
Lotus 1-2-3 para DOS utiliza + como tecla de composición para permitir una entrada más sencilla de muchos caracteres especiales del Lotus International Character Set (LICS) [24] y del Lotus Multi-Byte Character Set (LMBCS).AltF1