¿Propósito de las secuencias de Trigraph en C++?
c++03 trigraphs (9)
De acuerdo con C ++ ''03 Standard 2.3 / 1:
Antes de que tenga lugar cualquier otro procesamiento, cada aparición de una de las siguientes secuencias de tres caracteres ("secuencias de trigrafos") se sustituye por el carácter único indicado en la Tabla 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | / | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
En la vida real, eso significa que el código printf( "What??!/n" );
dará como resultado la impresión de What|
porque ??!
es una secuencia de trigrafos que se reemplaza por |
personaje.
Mi pregunta es ¿cuál es el propósito del uso de trigrafos? ¿Hay alguna ventaja práctica de usar trigraphs?
UPD : ¿En las respuestas se mencionó que algunos teclados europeos no tienen todos los caracteres de puntuación, por lo que los programadores no estadounidenses deben usar trigraphs en la vida cotidiana?
UPD2 : Visual Studio 2010 tiene soporte de trigrafos desactivado de forma predeterminada.
Algunos teclados europeos no tienen (¿no?) Todos los caracteres de puntuación que tenían los teclados de EE. UU., Porque necesitaban las claves para sus caracteres alfabéticos inusuales. Entonces, por ejemplo (inventando esto), el teclado sueco tendría un A-ring donde estaba el corchete.
Para acomodar a esos usuarios, los trigrafos son una forma de ingresar la puntuación usando solo los caracteres ASCII más comunes.
De la edición especial del The C++ Programming Language
, página 829
Los caracteres especiales ASCII
[
,]
,{
,}
,|
y/
ocupan las posiciones del conjunto de caracteres designadas como alfabéticas por ISO. En la mayoría de los juegos de caracteres europeos ISO-646 nacionales, estas posiciones están ocupadas por letras que no se encuentran en el alfabeto inglés.Se proporciona un conjunto de trigrafos para permitir que los caracteres nacionales se expresen de forma portátil utilizando un juego de caracteres mínimo verdaderamente estándar. Esto puede ser útil para el intercambio de programas, pero no facilita que las personas lean programas. Naturalmente, la solución a largo plazo para este problema es que los programadores de C ++ obtengan un equipo que sea compatible tanto con su lengua materna como con C ++. Desafortunadamente, esto parece ser inviable para algunos, y la introducción de nuevos equipos puede ser un proceso frustrantemente lento.
Ellos están allí principalmente por razones históricas. Hoy en día, la mayoría de los teclados modernos para la mayoría de los idiomas permiten el acceso a todos esos personajes, pero esto solía ser un problema con los teclados europeos. Es por eso que se inventaron los trigrafos.
Si no sabe para qué sirven, no debe usarlos.
Sin embargo, es bueno tenerlos en cuenta, ya que accidentalmente y sin intención puedes usar uno en tu código.
He visto trigraphs utilizados a principios de los años 90 para ayudar a convertir programas PL / 1 de un mainframe para ejecutar / compilar / depurar en una PC.
Estaban incursionando en la edición de PL / I en la PC usando un compilador PL / I a C y querían que el código funcionara cuando se moviera de regreso al mainframe que no soportaba llaves. Sugerí que podrían usar macros como
#def BEGIN {
#def END }
o como una alternativa PL / I más amigable
#def BEGIN ??<
#def END ??>
y si realmente quisieran hacerse elegantes, podrían intentarlo
#ifdef MAINFRAME
#def BEGIN ??<
#def END ??>
#else
#def BEGIN {
#def END }
#endif
y luego el programa se vería como si estuviera escrito en Pascal. Me miraron graciosamente y no quisieron hablar conmigo el resto del día. No creo culparlos. :)
Lo que mató al esfuerzo no fueron los tri-gráficos, sino las diferencias del sistema IO entre las plataformas. Abrir archivos en la PC era tan diferente al mainframe que habría introducido demasiados kludges para mantener el mismo código ejecutándose en ambos.
Los trígrafos se han propuesto para su eliminación en C ++ 0x. Dicho esto, todavía parece haber un fuerte argumento en apoyo de ellos - ver el documento del comité C ++ N2910 que discute esto. Aparentemente, EBCDIC es una gran fortaleza donde se necesitan.
Niños hoy! :-)
Sí, equipo extranjero, como un terminal IBM 3270. ¡El 3270 tiene, si mal no recuerdo, llaves! Si quería escribir C en un mini / mainframe de IBM, tenía que usar los trigraph miserables para cada límite de bloque. Afortunadamente, solo tuve que escribir software en C para emular algunas instalaciones de miniordenadores de IBM, en realidad no escribir software C en System / 36.
Mire al lado de la tecla "P": http://www.9999hp.net/keyboard/temp/1389260-big.jpg
Hmmm. Difícil de decir. Hay un botón adicional al lado de "retorno de carro", y podría tenerlo al revés: tal vez era el par "[" / "] el que faltaba. En cualquier caso, este teclado te causaría dolor si tuvieras que escribir C.
Además, estos terminales muestran EBCDIC, conjunto de caracteres del mainframe "nativo" de IBM, no ASCII (gracias, Pavel Minaev, por el recordatorio).
Por otro lado, al igual que la guía GNU C, dice: "No necesitas este daño cerebral". El compilador gcc deja esta "característica" deshabilitada por defecto.
Principalmente porque el estándar C los introdujo en 1989, cuando hubo problemas con la presencia de los personajes a los que los trigrafos asignan en algunas máquinas. Para cuando se publicó el estándar C ++ en 1998, la necesidad de trigrafos no era buena. Son una verruga en C; son una verruga tanto en C ++. Había una necesidad para ellos, especialmente fuera del mundo de habla inglesa, razón por la cual se agregaron a C.
Son para usar en sistemas que carecen de algunos de los caracteres en el conjunto de caracteres básicos de C ++. Huelga decir que tales sistemas son extremadamente raros.
Esta pregunta (sobre los dígrafos bien relacionados) tiene la respuesta.
Todo se reduce al hecho de que el conjunto de caracteres ISO 646 no tiene todos los caracteres de la sintaxis C, por lo que hay algunos sistemas con teclados y pantallas que no pueden tratar con los caracteres (aunque imagino que estos son bastante raros hoy en día).
En general, no necesita usarlos, pero debe conocerlos para conocer exactamente el problema con el que se encontró. Trigraphs es la razón por la que el '' ?
''personaje tiene una secuencia de escape:
''/?''
Entonces, de varias formas en que puede evitar su problema de ejemplo son:
printf( "What?/?!/n" );
printf( "What?" "?!/n" );
Pero debes recordar cuándo estás escribiendo los dos ''?'' personajes que podría estar comenzando un trigraph (y ciertamente nunca es algo en lo que estoy pensando).
En la práctica, los trigrafos y los dígrafos son algo de lo que no me preocupo en el día a día. Pero debes ser consciente de ellos porque una vez cada dos años te encontrarás con un error relacionado con ellos (y pasarás el resto del día maldiciendo su existencia). Sería bueno si los compiladores pudieran configurarse para advertir (o error) cuando se trata de un trigraph o un dígrafo, así podría saber que tengo algo con lo que debería lidiar a sabiendas.
Y para completar, los dígrafos son mucho menos peligrosos ya que se procesan como tokens, por lo que un digrafo dentro de un literal de cadena no se interpretará como un dígrafo.
Para una buena educación sobre diversa diversión con puntuación en los programas de C / C ++ (incluido un error de trigraph que definitivamente me obligaría a quitarme el pelo), eche un vistazo al artículo GOTW # 86 de Herb Sutter .
Apéndice:
Parece que GCC no procesará (y advertirá sobre) los trigrafos por defecto. Algunos otros compiladores tienen opciones para desactivar el soporte de trigraph (IBM por ejemplo). Microsoft comenzó a admitir una advertencia (C4837) en VS2008 que debe estar explícitamente habilitada (usando -Wall o algo así).