stringtranslate.com

Digrafos y trigrafos

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

Historia

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]

Implementaciones

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 desactivarlos 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 usado sólo cuando se desea el procesamiento trigraph (la razón fundamental era maximizar la velocidad de compilación).TRIGRAPH.EXE

Ayuda de idioma

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

Pascal

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.*)[]{}(**)(*}

j

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.

C

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 en constantes de varios caracteres, cadenas literales y comentarios. Esto es particularmente un problema para el Mac OS clásico , donde la constante '????'puede usarse como tipo de archivo o creador. 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 devolución.

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, [ especifique ] 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++

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. [7]

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": [8]

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 . [9] IBM se opuso a esto , hablando en nombre de sí mismo y de otros usuarios de C++, [10] 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 . [11] 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. [12] 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. [11]

RPL

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 [13] [14] [15 ] en plataformas extranjeras y para facilitar la entrada del teclado sin utilizar la aplicación CHARS . [16] [17] [14] [15] 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. [16] [17] [14] [15] [18] 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 ). [16] [14] [15]

Soporte de aplicaciones

Empuje

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. [19] La lista de todos los dígrafos posibles en Vim se puede mostrar escribiendo :dig.

Pantalla GNU

GNU Screen tiene un comando dígrafo, vinculado a + + de forma predeterminada. [20]CtrlA CtrlV

Loto

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) [21] y del conjunto de caracteres multibyte de Lotus (LMBCS).AltF1

Ver también

Referencias

  1. ^ Justificación del estándar internacional: lenguajes de programación: C (PDF) . Revisión 5.10. págs. 20-21.
  2. ^ Jones, Derek M. "Oración 117". El nuevo estándar C: un comentario económico y cultural .
  3. ^ Hui, Roger. "Vocabulario". jsoftware.com . Archivado desde el original el 2 de abril de 2019 . Consultado el 16 de abril de 2015 .
  4. ^ "¡¿Eliminar trígrafos ??!" (PDF) .
  5. ^ Instituto Británico de Estándares (2003). La norma C: incorpora TC1 - BS ISO/IEC 9899:1999 . John Wiley e hijos . ISBN 0-470-84573-2.
  6. ^ "Justificación del estándar internacional - Lenguajes de programación - C" (PDF) . 5.10. Abril de 2003. Archivado (PDF) desde el original el 6 de junio de 2016 . Consultado el 17 de octubre de 2010 .
  7. ^ Stroustrup, Bjarne (29 de marzo de 1994). Diseño y evolución de C++ (1 ed.). Compañía editorial Addison-Wesley . ISBN 0-201-54330-3.
  8. ^ 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 .
  9. ^ "C++0X, CD 1, comentarios del organismo nacional" (PDF) . 2009-01-30. SC22/WG21 N2837 comentario Reino Unido 11. Archivado (PDF) desde el original el 1 de agosto de 2017 . Consultado el 12 de mayo de 2019 .
  10. ^ Wong, Michael; Tong, Hubert; Klarer, Robert; McIntosh, Ian; Mak, Raymond; Cambly, Christopher; LaBonté, Alain (19 de junio de 2009). "Comentario sobre la desaprobación propuesta de Trigraph" (PDF) . N2910. Archivado (PDF) desde el original el 1 de agosto de 2017 . Consultado el 12 de mayo de 2019 .
  11. ^ 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 .
  12. ^ Wong, Michael; Tong, Hubert; Bhakta, Rajan; Inglis, Derek (10 de octubre de 2014). "Comentario de IBM sobre la preparación para un futuro adverso para Trigraph en C++ 17" (PDF) . Papel IBM N4210. Archivado (PDF) desde el original el 11 de septiembre de 2018 . Consultado el 12 de mayo de 2019 .
  13. ^ Impresora infrarroja HP ​​82240B (1 ed.). Corvallis, Oregón, Estados Unidos: Hewlett-Packard . Agosto de 1989. Número de pedido de HP 82240-90014. Archivado desde el original el 14 de agosto de 2016 . Consultado el 1 de agosto de 2016 .
  14. ^ abcd HP Serie 48G - 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 6 de agosto de 2016 . Consultado el 6 de septiembre de 2015 .[1]
  15. ^ abcd Manual de referencia del usuario avanzado (AUR) de la calculadora gráfica HP 50g / 49g+ / 48gII (2 ed.). Hewlett Packard . 2009-07-14 [2005]. págs. J-1, J-2. HP F2228-90010. Archivado desde el original el 8 de julio de 2018 . Consultado el 10 de octubre de 2015 .PDF con capacidad de búsqueda
  16. ^ abc "Tabla HP RPL TIO". santojoe.org . Archivado desde el original el 23 de mayo de 2016 . Consultado el 23 de enero de 2015 .
  17. ^ 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 .
  18. ^ Finseth, Craig A. (25 de febrero de 2012). "caracteres". Archivado desde el original el 21 de diciembre de 2017 . Consultado el 21 de diciembre de 2017 .
  19. ^ "Documentación de Vim: *digraphs-default*". 2011-01-15. Archivado desde el original el 2018-12-20 . Consultado el 12 de mayo de 2019 .
  20. ^ "Digraph - Manual del usuario de la pantalla". Archivado desde el original el 31 de diciembre de 2018 . Consultado el 12 de mayo de 2019 .
  21. ^ "Apéndice F". Guía del usuario de HP 95LX (PDF) (2 ed.). Corvallis, Oregón, EE. UU.: Hewlett-Packard Company , División Corvallis. 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 .

enlaces externos