Dígrafos y trígrafos (programación)

Dos o tres personajes, tratados como uno solo

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 .{}

Historia

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]

Implementaciones

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

Soporte de idiomas

Diferentes 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 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).

Pascal

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.

Yo

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.

do

TrígrafoEquivalente
??=#
??/\
??'^
??([
??)]
??!|
??<{
??>}
??-~

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 si estuvieran introduciendo 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 ; }    
Dígrafos alternativos introducidos en el estándar C en 1994
DígrafoEquivalente
<:[
:>]
<%{
%>}
%:#

En 1994, una enmienda normativa al estándar 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++

SimbólicoEquivalente
compl~
not!
bitand&
bitor|
and&&
or||
xor^
and_eq&=
or_eq|=
xor_eq^=
not_eq!=

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]

LPR

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]

Soporte de aplicaciones

Empuje

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.

Pantalla GNU

GNU Screen tiene un comando dígrafo, asociado a ++ por defecto . [23]CtrlA CtrlV

Loto

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

Véase también

Referencias

  1. ^ Fundamento de la Norma Internacional Lenguajes de Programación C (PDF) . Revisión 5.10. Págs. 20-21.
  2. ^ Jones, Derek M. "Sentence 117". El nuevo estándar C: un comentario económico y cultural .
  3. ^ Hui, Roger. "Vocabulario". jsoftware.com . Archivado desde el original el 2019-04-02 . Consultado el 2015-04-16 .
  4. ^ "¿Eliminar trígrafos?" (PDF) .
  5. ^ Instituto Británico de Normas (2003). La norma C - Incorporando TC1 - BS ISO/IEC 9899:1999 . John Wiley & Sons . ISBN 0-470-84573-2.
  6. ^ "Fundamento de la norma internacional - Lenguajes de programación - C" (PDF) . 5.10. Abril de 2003. Archivado (PDF) desde el original el 2016-06-06 . Consultado el 2010-10-17 .
  7. ^ "Conceptos básicos de archivos". whitefiles.org . Consultado el 8 de mayo de 2024 .
  8. ^ ISO/IEC 9899:1990/Amd 1:1995 - Lenguajes de programación — C — Enmienda 1: Integridad de C. Marzo de 1995. Consultado el 30 de mayo de 2024 .
  9. ^ Clive DW Feather (12 de septiembre de 2010). "Breve descripción del Anexo Normativo 1".
  10. ^ Stroustrup, Bjarne (29 de marzo de 1994). Diseño y evolución de C++ (1.ª edición). Addison-Wesley Publishing Company . ISBN 0-201-54330-3.
  11. ^ Du Toit, Stefanus, ed. (16 de enero de 2012). "Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . N3337. Archivado (PDF) desde el original el 8 de mayo de 2019. Consultado el 8 de mayo de 2019 .
  12. ^ "C++0X, CD 1, National Body Comments" (PDF) . 2009-01-30. SC22/WG21 N2837 comment UK 11. Archivado (PDF) desde el original el 2017-08-01 . Consultado el 2019-05-12 .
  13. ^ Wong, Michael; Tong, Hubert; Klarer, Robert; McIntosh, Ian; Mak, Raymond; Cambly, Christopher; LaBonté, Alain (19 de junio de 2009). "Comentario sobre la propuesta de desuso del trigrafo" (PDF) . N2910. Archivado (PDF) desde el original el 1 de agosto de 2017 . Consultado el 12 de mayo de 2019 .
  14. ^ ab Smith, Richard (6 de mayo de 2014). "¿Eliminar trígrafos?". N3981. Archivado desde el original el 9 de julio de 2018. Consultado el 12 de mayo de 2019 .
  15. ^ Wong, Michael; Tong, Hubert; Bhakta, Rajan; Inglis, Derek (10 de octubre de 2014). "Comentario de IBM sobre la preparación para un futuro adverso a Trigraph en C++17" (PDF) . Documento de IBM N4210. Archivado (PDF) desde el original el 11 de septiembre de 2018. Consultado el 12 de mayo de 2019 .
  16. ^ Impresora infrarroja HP ​​82240B (1.ª edición). Corvallis, OR, EE. UU.: Hewlett-Packard . Agosto de 1989. Número de pedido de HP 82240-90014.
  17. ^ abcd HP 48G Series – Guía del usuario (UG) (8.ª ed.). Hewlett-Packard . Diciembre de 1994 [1993]. págs. 2–5, 27–16. HP 00048-90126, (00048-90104). Archivado desde el original el 2016-08-06 . Consultado el 2015-09-06 .[1]
  18. ^ abcd Manual de referencia avanzado del usuario (AUR) de la calculadora gráfica HP 50g/49g+/48gII (2.ª ed.). Hewlett-Packard . 2009-07-14 [2005]. pp. J-1, J-2. HP F2228-90010. Archivado desde el original el 2018-07-08 . Consultado el 2015-10-10 .PDF con capacidad de búsqueda
  19. ^ abc "Tabla HP RPL TIO". holyjoe.org . Archivado desde el original el 23 de mayo de 2016 . Consultado el 23 de enero de 2015 .
  20. ^ ab Heinz, Sr., Michael W. (2005). "HP-ASCII y trígrafos". Archivado desde el original el 2 de agosto de 2016. Consultado el 2 de agosto de 2016 .
  21. ^ Finseth, Craig A. (25 de febrero de 2012). "chars". Archivado desde el original el 21 de diciembre de 2017. Consultado el 21 de diciembre de 2017 .
  22. ^ "Documentación de Vim: *digraphs-default*". 15 de enero de 2011. Archivado desde el original el 20 de diciembre de 2018. Consultado el 12 de mayo de 2019 .
  23. ^ "Digraph - Manual del usuario de la pantalla". Archivado desde el original el 2018-12-31 . Consultado el 2019-05-12 .
  24. ^ "Apéndice F". Guía del usuario de HP 95LX (PDF) (2.ª edición). Corvallis, OR, EE. UU.: Hewlett-Packard Company , Corvallis Division. Junio ​​de 1991 [marzo de 1991]. F0001-90003. Archivado (PDF) desde el original el 28 de noviembre de 2016. Consultado el 27 de noviembre de 2016 .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Dígrafos_y_trígrafos_(programación)&oldid=1242854322"