En el diseño del lenguaje informático , el trazo es un método para marcar explícitamente secuencias de letras que tienen una propiedad especial, como ser una palabra clave , o un cierto tipo de variable o ubicación de almacenamiento, y por lo tanto habitan un espacio de nombres diferente de los nombres ordinarios ("identificadores") , para evitar enfrentamientos. El trazo no se usa en la mayoría de los lenguajes modernos; en cambio, las palabras clave son palabras reservadas y no se pueden usar como identificadores. Stropping permite usar la misma secuencia de letras como palabra clave y como identificador , y simplifica el análisis en ese caso, por ejemplo, permitiendo una variable nombrada if
sin entrar en conflicto con la palabra clave if .
Stropping se asocia principalmente con ALGOL y lenguajes relacionados en la década de 1960. Aunque encuentra algún uso moderno , se confunde fácilmente con otras técnicas similares que son superficialmente similares.
Historia
El método de estropear y el término "estropear" surgieron en el desarrollo de ALGOL en la década de 1960, donde se utilizó para representar distinciones tipográficas (negrita y subrayado) que se encuentran en el lenguaje de publicación que no se pueden representar directamente en el lenguaje de hardware - un La máquina de escribir podía tener caracteres en negrita, pero en la codificación de tarjetas perforadas no había caracteres en negrita. El término "stropping" surgió en ALGOL 60 , de " apóstrofe ", ya que algunas implementaciones de ALGOL 60 usaban apóstrofos alrededor del texto para indicar negrita, [1] como 'if'
para representar la palabra clave si . El raspado también es importante en ALGOL 68 , donde se utilizan múltiples métodos de raspado, conocidos como "regímenes de raspado"; los apóstrofos emparejados originales de ALGOL 60 no se usaban ampliamente, siendo más común un punto inicial o mayúscula, [2] como en .IF
o IF
y el término "estriado" se aplicó a todos ellos.
Sintaxis
Se han utilizado una variedad de sintaxis diferentes para el trazo:
- Algol 60 solía usar solo la convención de comillas simples alrededor de la palabra, generalmente como apóstrofos, de ahí el nombre "stropping" (por ejemplo
'BEGIN'
). - Algol 68 [3] [2] en algunas implementaciones trata las secuencias de letras precedidas por una comilla simple, ', como palabras clave (p. Ej.,
'BEGIN
) [4]
De hecho, a menudo se da el caso de que en un idioma se utilizan varias convenciones estrictas. Por ejemplo, en ALGOL 68 , la elección de la convención de trazo se puede especificar mediante una directiva de compilador (en la terminología de ALGOL, un " pragmat "), a saber, POINT, UPPER, QUOTE o RES:
- PUNTO para 6 bits (no hay suficientes caracteres para minúsculas), como en
.FOR
: se usa una convención similar en FORTRAN 77, donde las palabras clave LÓGICAS se escriben como.EQ.
etc. (ver más abajo) - SUPERIOR para 7 bits, como en
FOR
- con minúsculas utilizadas para identificadores ordinarios - CITA como en ALGOL 60, como en
'for'
- Las palabras reservadas RES, como se usan en los lenguajes modernos,
for
están reservadas y no están disponibles para identificadores ordinarios
Los diversos regímenes de reglas son una especificación léxica para caracteres con estrías, aunque en algunos casos tienen interpretaciones simples: en los regímenes de apóstrofos simples y puntos, el primer carácter funciona como un carácter de escape , mientras que en el régimen de apóstrofes emparejados los apóstrofes funcionan como delimitadores , como en los literales de cadena .
Otros ejemplos:
- Atlas Autocode tenía la opción de tres: las palabras clave podrían
underlined
usar retroceso y tachado en un teclado Flexowriter , podrían ser introducidas por a%percent %symbol
, o podrían escribirseUPPER CASE
sin carácter delimitador (modo "delimitadores en mayúsculas", en cuyo caso todas las variables tenían que estar en minúsculas).
- Algol 60 en las computadoras Elliott 803 y Elliott 503 usaba subrayado. Los Flexowriters (que producen cinta de papel perforada) tenían una tecla sin movimiento (subrayado _) para que al escribir _b_e_g_i_n se produjera un comienzo que era muy legible. La barra vertical | también era una tecla sin movimiento, por lo que escribir | = produjo una buena aproximación a ≠.
- A los programas ALGOL 68RS se les permite el uso de varias variantes de control, incluso dentro de un solo procesador de lenguaje.
- Edinburgh IMP heredó la
%percent %symbol
convención de prefijo Atlas Autocode, pero no sus otras opciones de trazado.
Ejemplos de diferentes estilos de ALGOL 68
Tenga en cuenta el líder de PR (abreviatura de pragmat ) Directiva , que es en sí mismo stropped en punto o estilo de las comillas, y el ¢
de comentario (de " 2¢
") - ver ALGOL 68: pr & co: Pragmats y Comentarios para más detalles.
Algol68 "estricto" como se publica normalmente | Quote stropping (como wikitexto ) | Para un compilador de código de caracteres de 7 bits | Para un compilador de código de caracteres de 6 bits | Algol68 usando res stropping (palabra reservada) |
---|---|---|---|---|
¢ subrayado o tipografía en negrita ¢ modo xint = int ; xint sum sq: = 0; para i , mientras suma cuadrada ≠ 70 × 70 hacer suma sq +: = i ↑ 2 sobredosis | 'pr' cita 'pr''modo' 'xint' = 'int';suma 'xint' sq: = 0;'por' yo 'mientras' suma cuadrada ≠ 70 × 70'hacer' suma sq +: = i ↑ 2'sobredosis' | .PR SUPERIOR .PRMODO XINT = INT;XINT suma cuadrada: = 0;POR MI MIENTRAS suma sq / = 70 * 70HACER suma sq +: = i ** 2sobredosis | .PR PUNTO .PR.MODO .XINT = .INT;.XINT SUM SQ: = 0;.PARA YO .Mientras SUMA CUADRADA NE 70 * 70.HACER SUM SQ .PLUSAB I .UP 2.SOBREDOSIS | .PR RES .PRmodo .xint = int;.xint sum sq: = 0;por mi tiempo suma cuadrada ≠ 70 × 70hacer suma sq +: = i ↑ 2sobredosis |
Otros idiomas
Por diversas razones Fortran 77 tiene estos valores "lógicos" y operadores: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND., .NOT.[5]
.AND., .OR.y .XOR.también se utilizan en pruebas combinadas en IF
y IFF
declaraciones en archivos por lotes que se ejecutan en procesadores de línea de comandos de JP Software como 4DOS , [6] 4OS2 y 4NT / Take Command .
Uso moderno
La mayoría de los lenguajes informáticos modernos no utilizan trazos, con dos notables excepciones:
El uso de muchos lenguajes en la Infraestructura de lenguaje común (CLI) de .NET de Microsoft requiere una forma de utilizar variables en un lenguaje diferente que pueden ser palabras clave en un lenguaje de llamada. A veces, esto se hace mediante prefijos, como en C #, o encerrando el identificador entre corchetes, en Visual Basic.NET .@
Un segundo ejemplo importante se encuentra en muchas implementaciones del lenguaje de consulta estructurado . En esos idiomas, las palabras reservadas se pueden utilizar como nombres de columnas, tablas o variables delimitándolas léxicamente. El estándar especifica encerrar palabras reservadas entre comillas dobles, pero en la práctica el mecanismo exacto varía según la implementación; MySQL , por ejemplo, permite que las palabras reservadas se usen en otros contextos encerrándolas entre comillas invertidas, y Microsoft SQL Server usa corchetes.
El trazo también se puede utilizar en el lenguaje de programación Nim . En Nim, una palabra reservada se puede utilizar como identificador encerrándola entre comillas invertidas.
Hay otros ejemplos menores. Por ejemplo, Web IDL utiliza un subrayado _
inicial para eliminar identificadores que de otra manera chocarían con palabras reservadas: el valor del identificador elimina este subrayado inicial, lo que hace que esto sea más bien que una convención de nomenclatura. [7]
Desarmado por el compilador
En una interfaz de compilador , el desencadenamiento se produjo originalmente durante una fase de reconstrucción de línea inicial , que también eliminó los espacios en blanco. A esto le siguió un análisis sintáctico sin escáner (sin tokenización); esto era estándar en la década de 1960, especialmente para ALGOL. En el uso moderno, el desencadenamiento se realiza generalmente como parte del análisis léxico . Esto es claro si uno distingue al lexer en dos fases de escáner y evaluador: el escáner categoriza la secuencia estropeada en la categoría correcta, y luego el evaluador desencadena cuando calcula el valor. Por ejemplo, en un idioma donde se usa un guión bajo inicial para trazar identificadores para evitar colisiones con palabras reservadas, el escáner _if
clasificaría la secuencia como un identificador (no como la palabra reservada if
), y luego el evaluador le daría el valor if
, dando (Identifier, if)
como valor y tipo de token.
Técnicas similares
Existen varias técnicas similares, generalmente prefijando o añadiendo sufijos a un identificador para indicar un tratamiento diferente, pero la semántica es variada. Estrictamente hablando, el stropping consiste en diferentes representaciones del mismo nombre (valor) en diferentes espacios de nombres y ocurre en la etapa de tokenización. Por ejemplo, en ALGOL 60 con apóstrofo coincidente, 'if'
se tokeniza como (Palabra clave, si), mientras que if
se tokeniza como (Identificador, si): el mismo valor en diferentes clases de tokens.
El uso de mayúsculas para palabras clave sigue siendo una convención para escribir gramáticas para lexing y análisis: tokenizar la palabra reservada if
como la clase de token IF y luego representar una cláusula if-then-else por la frase IF Expression THEN Statement ELSE Statement
donde los términos en mayúsculas son palabras clave y los términos en mayúscula son símbolos no terminales en una regla de producción ( los símbolos terminales se indican mediante términos en minúsculas, como identifier
o integer
, para un literal entero ).
Convenciones de nombres
Más libremente, uno puede usar convenciones de nomenclatura para evitar choques, comúnmente prefijando o sufijando un guión bajo, como en if_
o _then
. Un guión bajo inicial se utiliza a menudo para indicar miembros privados en la programación orientada a objetos.
Estos nombres pueden ser interpretados por el compilador y tener algún efecto, aunque esto generalmente se hace en la fase de análisis semántico, no en la fase de tokenización. Por ejemplo, en Python, un solo subrayado inicial es un indicador privado débil y afecta qué identificadores se importan en la importación del módulo, mientras que un doble subrayado inicial (y no más de un subrayado final) en un atributo de clase invoca la alteración de nombres . [8]
Palabras reservadas
Si bien los lenguajes modernos generalmente usan palabras reservadas en lugar de restringir para distinguir palabras clave de identificadores, por ejemplo, hacer if
reservado, también suelen reservar una clase sintáctica de identificadores como palabras clave, produciendo representaciones que pueden interpretarse como un régimen estricto, pero en cambio tienen la semántica de palabras reservadas.
Esto es más notable en C, donde los identificadores que comienzan con un subrayado están reservados, aunque los detalles precisos de qué identificadores están reservados en qué ámbito están involucrados, y los dobles subrayados iniciales están reservados para cualquier uso; [9] de manera similar en C ++, cualquier identificador que contenga un guión bajo doble se reserva para cualquier uso, mientras que un identificador que comience con un guión bajo se reserva en el espacio global. [nb 1] Por lo tanto, se puede agregar una nueva palabra clave foo
usando la palabra reservada __foo
. Si bien esto es superficialmente similar a estropear, la semántica es diferente. Como palabra reservada, la cadena __foo
representa el identificador __foo
en el espacio de nombres del identificador común. En trazos (prefijando palabras clave por __
), la cadena __foo
representa la palabra clave foo
en un espacio de nombres de palabras clave separado. Por lo tanto, al usar palabras reservadas, los tokens para __foo
y foo
son (identificador, __foo) y (identificador, foo) - valores diferentes en la misma categoría - mientras que en los tokens para __foo
y foo
son (palabra clave, foo) y (identificador, foo) - lo mismo valores en diferentes categorías. Estos resuelven el mismo problema de los conflictos de espacios de nombres de una manera que es la misma para un programador, pero que difiere en términos de gramática formal e implementación.
Destrozar nombre
La alteración de nombres también aborda los conflictos de nombres al cambiar el nombre de los identificadores, pero lo hace mucho más tarde en la compilación, durante el análisis semántico, no durante la tokenización. Consiste en crear nombres que incluyan información de tipo y alcance, principalmente para que los utilicen los enlazadores, tanto para evitar conflictos como para incluir la información semántica necesaria en el propio nombre. En estos casos los identificadores originales pueden ser idénticos, pero el contexto es diferente, como en las funciones foo(int x)
versus foo(char x)
, en ambos casos teniendo el mismo identificador foo
, pero diferente firma. Estos nombres se pueden alterar foo_i
y foo_c
, por ejemplo, para incluir la información del tipo.
Sigilos
Un fenómeno sintácticamente similar pero semánticamente diferente son los sigilos , que en cambio indican propiedades de variables. Estos son comunes en Perl , Ruby y varios otros lenguajes para identificar características de variables / constantes: Perl para designar el tipo de variable, Ruby para distinguir variables de constantes e indicar alcance. Tenga en cuenta que esto afecta la semántica de la variable, no la sintaxis de si es un identificador o una palabra clave.
Paralelos en el lenguaje humano
Stropping se usa en lenguajes de programación de computadoras para facilitar el trabajo del compilador (o más estrictamente, del analizador ), es decir, dentro de la capacidad de las computadoras relativamente pequeñas y lentas disponibles en los primeros días de la computación en el siglo XX. Sin embargo, también se han utilizado técnicas similares para ayudar a las personas a comprender la lectura. Algunos ejemplos son:
- Colocar palabras importantes en negrita , [10] como la primera mención de stropping al principio de esta página, porque definir el stropping es el propósito mismo de la página.
- Dar formato a las palabras nuevas en cursiva [11] cuando se introducen por primera vez en el texto. Esto se usa comúnmente en ciencia ficción y fantasía al introducir plantas, alimentos y criaturas inventadas; en el diario de viaje y la escritura histórica al describir palabras extranjeras desconocidas; y así. También usando una fuente especial, posiblemente asociada con el idioma en cuestión, por ejemplo usando una fuente Gothic [12] para palabras en alemán .
- Usar un idioma diferente, típicamente latín o griego para significar términos técnicos. Esto es similar al uso de palabras reservadas, pero generalmente se combina con texto en cursiva para facilitar la legibilidad. Por ejemplo:
- la nomenclatura binomial típica [13] o "nombres latinos" de plantas y animales ayuda al lector a ver que Erithacus rubecula es el nombre técnico especial del petirrojo europeo, de una manera que el tordo europeo de pecho rojo no lo hace.
- muchos términos legales donde una frase latina corta se refiere a un gran cuerpo de leyes y precedentes, como habeas corpus , sub judice , in loco parentis . [14]
- términos lógicos y matemáticos como QED , a priori , viceversa ...
- En japonés escrito , además de los caracteres kanji , los dos alfabetos distintos (más estrictamente, silabarios ) Hiragana [15] [16] y Katakana , [17] ambos representan el mismo conjunto de sonidos, se utilizan para distinguir el japonés deletreado fonéticamente palabras de palabras extranjeras importadas, respectivamente; Katakana también se usa para enfatizar, al igual que la cursiva en inglés.
Ver también
- Personaje de escape
Notas
- ^ Existen otras restricciones, como un identificador que comienza con un guión bajo, seguido de una letra mayúscula.
Referencias
- ^ Rey, Peter R., ed. (18 de junio de 1974). "(desconocido)" . Actas de una conferencia internacional sobre la implementación de ALGOL 68 . Departamento de Ciencias de la Computación, Universidad de Manitoba, Winnipeg: Universidad de Manitoba, Departamento de Ciencias de la Computación: 148. ISBN 9780919628113.
Los problemas más graves se plantean con el "stropping", la técnica utilizada para distinguir el texto en negrita del texto romano. Algunas implementaciones exigen apóstrofos en negrita (de ahí el nombre); otros requieren retroceder y subrayar; […]
Citar utiliza un título genérico ( ayuda ) - ^ a b van Wijngaarden, Adriaan ; Mailloux, Barry James ; Peck, John Edward Lancelot ; Koster, Cornelis Hermanus Antonius ; Sintzoff, Michel ; Lindsey, Charles Hodgson ; Meertens, Lambert Guillaume Louis Théodore ; Fisker, Richard G., eds. (1976). "Sección 9.3 Representaciones" (PDF) . Informe revisado sobre el lenguaje algorítmico ALGOL 68 . Springer-Verlag . págs. 94, 123. ISBN 978-0-387-07592-1. OCLC 1991170 . Archivado (PDF) desde el original el 19 de abril de 2019 . Consultado el 11 de mayo de 2019 .
- ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf
- ^ Lindsey, Charles Hodgson ; van der Meulen, Sietse G. (1977). Introducción informal a ALGOL 68 . Holanda Septentrional. págs. 348–349. ISBN 978-0-7204-0726-6. OCLC 230034877 .
- ^ http://www.personal.psu.edu/jhm/f90/lectures/10.html
- ^ Hermanos, Hardin; Rawson, Tom ; Conn, Rex C .; Paul, Matthias R .; Dye, Charles E .; Georgiev, Luchezar I. (27 de febrero de 2002). Ayuda en línea de 4DOS 8.00 .
- ^ Web IDL , " 3.1. Nombres ". […] Para todas estas construcciones, el identificador es el valor del token de identificador con cualquier carácter U + 005F LOW LINE ("_") inicial (subrayado) eliminado. […] Nota […] Un "_" inicial se utiliza para evitar que un identificador se vea como una palabra reservada para que, por ejemplo, se pueda definir una interfaz llamada "interfaz". El "_" inicial se elimina para eliminar el escape del identificador. […]
- ^ PEP 008 : Descriptivo: Estilos de nomenclatura
- ^ Estándar C99 , 7.1.3 Identificadores reservados
- ^ Twyman, Michael. "La idea audaz: el uso de tipos audaces en el siglo XIX". Revista de la Sociedad Histórica de la Imprenta . 22 (107-143).
- ^ Truss, Lynne (2004), Eats, Shoots & Leaves: The Zero Tolerance Approach to Punctuation , Nueva York: Gotham Books, p. 146, ISBN 978-1-59240-087-4
- ^ "Estilos de escritura a mano" . Rigsarkivet . Los Archivos Nacionales de Dinamarca . Consultado el 26 de marzo de 2017 .
- ^ "Cómo escribir nombres científicos de organismos" (PDF) , Competition Science Vision , consultado el 20 de junio de 2011 .
- ^ Una selección de máximas legales, clasificadas e ilustradas en Google Books
- ^ Doble 大 辞 林
「平」 と は 平凡 な 、 や さ し い と い う 意 で 、 当時 普通 に 使用 す 文字 文字 体系 で あ っ た こ を を 意味 す る。 漢字 は 書簡 文 重要 な なあ る の に 対 し て 、 平 仮 名 は 漢字 の 知識 に 乏 し い 人 々 な ど が 用 い る 的 的 な 性格 の も の で あ っ た。
Traducción: 平 [la parte "hira" ordinaria de "hiragana" simple en ese momento [el momento en que se le dio el nombre] era un sistema de escritura para uso diario. Mientras que kanji era el sistema oficial utilizado para escribir cartas y textos importantes, hiragana era para uso personal de personas que tenían un conocimiento limitado de kanji. - ^ "Caligrafía japonesa" . Enciclopedia Británica . Consultado el 22 de junio de 2017 .
- ^ "Hiragana, Katakana y Kanji" . Caracteres de la palabra japonesa. 2010-09-08 . Consultado el 15 de octubre de 2011 .
Otras lecturas
- Hansen, WJ; Boom, HJ (1978). "Informe sobre la representación de hardware estándar para ALGOL 68 revisado". Acta Informatica . 9 (2): 105-119. doi : 10.1007 / BF00289072 . S2CID 34231916 .
- Lindsey, Charles Hodgson (marzo de 1970), "An ISO-Code Representation for ALGOL 68" , ALGOL Bulletin , ACM (31): 37–60, AB31.3.6