En el diseño de lenguajes informáticos , el stropping es un método para marcar explícitamente secuencias de letras como si tuvieran una propiedad especial, como ser una palabra clave , o un cierto tipo de variable o ubicación de almacenamiento, y así habitar en un espacio de nombres diferente al de los nombres ordinarios ("identificadores") , para evitar enfrentamientos. El ajuste no se utiliza en la mayoría de los idiomas modernos; en cambio, las palabras clave son palabras reservadas y no se pueden utilizar como identificadores. El ajuste permite utilizar la misma secuencia de letras como palabra clave y como identificador , y simplifica el análisis en ese caso; por ejemplo, permite que una variable nombrada if
sin entrar en conflicto con la palabra clave if .
Stropping se asocia principalmente con ALGOL y lenguas relacionadas 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.
El método de stropping y el término "stropping" surgieron en el desarrollo de ALGOL en la década de 1960, donde se usaba para representar distinciones tipográficas (negrita y subrayado) que se encontraban en el lenguaje de publicación y que no podían representarse directamente en el lenguaje del hardware. La máquina de escribir podía tener caracteres en negrita, pero al codificar con tarjetas perforadas, no había caracteres en negrita. El término "stropping" surgió en ALGOL 60 , de " apóstrofo ", ya que algunas implementaciones de ALGOL 60 usaban apóstrofes alrededor del texto para indicar negrita, [1] como 'if'
para representar la palabra clave if . El stropping también es importante en ALGOL 68 , donde se utilizan múltiples métodos de stropping, conocidos como "regímenes de stropping"; los apóstrofes coincidentes originales de ALGOL 60 no se usaron ampliamente, siendo más común un punto inicial o mayúsculas, [2] como en .IF
o IF
y el término "stropping" se aplicó a todos estos.
Se ha utilizado una variedad de sintaxis diferentes para el control:
'BEGIN'
.).'BEGIN
) [4]De hecho, a menudo se daba el caso de que en un mismo idioma se pudieran utilizar varias convenciones de limitación. Por ejemplo, en ALGOL 68 , la elección de la convención de ajuste se puede especificar mediante una directiva del compilador (en la terminología de ALGOL, un " pragmat "), a saber, POINT, UPPER, QUOTE o RES:
.FOR
: se usa una convención similar en FORTRAN 77, donde las palabras clave LÓGICAS se ajustan como .EQ.
etc. (ver más abajo)FOR
– con minúsculas utilizadas para identificadores normales'for'
for
están reservadas y no están disponibles para identificadores comunes.Los diversos regímenes de reglas son una especificación léxica para caracteres estropeados, aunque en algunos casos tienen interpretaciones simples: en los regímenes de apóstrofe único y punto, el primer carácter funciona como carácter de escape , mientras que en el régimen de apóstrofes coincidentes los apóstrofes funcionan como delimitadores , como en los literales de cadena .
Otros ejemplos:
underlined
usarse con retroceso y sobretacha en un teclado Flexowriter , podían introducirse mediante un %percent %symbol
, o podían escribirse UPPER CASE
sin ningún carácter delimitador (modo "delimitadores de mayúsculas", en cuyo caso todas las variables tenían que estar en minúsculas).%percent %symbol
convención de prefijo Atlas Autocode pero no sus otras opciones de ajusteTenga en cuenta la directiva pr (abreviatura de pragmat ) , que a su vez está delimitada en estilo PUNTO o comillas, y el comentario for (de " "); consulte ALGOL 68: pr & co: Pragmats and Comments para obtener más detalles.¢
2¢
Por varias razones, Fortran 77 tiene estos valores y operadores "lógicos": .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., [5].AND..NOT.
.AND.y .OR.también .XOR.se utilizan en pruebas combinadas IF
y IFF
declaraciones en archivos por lotes ejecutados bajo procesadores de línea de comandos de JP Software como 4DOS , [6] 4OS2 y 4NT/Take Command .
La mayoría de los lenguajes informáticos modernos no utilizan el ajuste. Sin embargo, algunos idiomas admiten el ajuste opcional para especificar identificadores que de otro modo colisionarían con palabras reservadas o que contienen caracteres no alfanuméricos.
Por ejemplo, el uso de muchos lenguajes en la infraestructura de lenguaje común (CLI) .NET de Microsoft requiere una forma de usar 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 incluir palabras reservadas entre comillas dobles, pero en la práctica el mecanismo exacto varía según la implementación; MySQL , por ejemplo, permite utilizar palabras reservadas en otros contextos encerrándolas entre comillas invertidas, y Microsoft SQL Server utiliza corchetes.
En varios idiomas, incluidos Nim , R , [7] y Scala , [8] se puede utilizar una palabra reservada o un nombre no alfanumérico como identificador encerrándolo entre comillas invertidas .
Hay otros ejemplos más menores. Por ejemplo, Web IDL utiliza un guión bajo inicial _
para delimitar identificadores que de otro modo colisionarían con palabras reservadas: el valor del identificador elimina este guión bajo inicial, lo que hace que esta delimitación sea más que una convención de nomenclatura. [9]
En Haskell , rodear el nombre de una función con comillas invertidas hace que se analice como un operador infijo .
En la interfaz de un compilador , la desaceleración se produjo originalmente durante una fase inicial de reconstrucción de línea , que también eliminó los espacios en blanco. A esto le siguió un análisis sin escáner (sin tokenización); esto era estándar en los años 1960, especialmente para ALGOL. En el uso moderno, la desaceleración se realiza generalmente como parte del análisis léxico . Esto queda claro si se distingue el lexer en dos fases de escáner y evaluador: el escáner clasifica la secuencia corregida en la categoría correcta y luego el evaluador la desajusta al calcular el valor. Por ejemplo, en un idioma donde se utiliza un guión bajo inicial para delimitar los identificadores para evitar colisiones con palabras reservadas, el escáner _if
clasificaría la secuencia como un identificador (no como palabra reservada if
) y luego el evaluador le daría el valor. if
, dando (Identifier, if)
como resultado el tipo y valor del token.
Existen varias técnicas similares, generalmente anteponiendo o añadiendo un sufijo 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 ajuste de apóstrofe coincidente, 'if'
se tokeniza como (Palabra clave, si), mientras que if
se tokeniza como (Identificador, si), el mismo valor en diferentes clases de token.
El uso de mayúsculas para palabras clave sigue utilizándose como convención para escribir gramáticas para lexing y análisis: tokenizando la palabra reservada if
como la clase token IF y luego representando una cláusula if-then-else mediante 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úscula, como identifier
o integer
, para un literal entero ).
En términos más generales, se pueden utilizar convenciones de nomenclatura para evitar conflictos, normalmente añadiendo un guión bajo como prefijo o sufijo, como en if_
o _then
. A menudo se utiliza un guión bajo inicial para indicar miembros privados en la programación orientada a objetos.
El compilador puede interpretar estos nombres 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 guión bajo inicial único es un indicador privado débil y afecta qué identificadores se importan en la importación del módulo, mientras que un guión bajo inicial doble (y no más de un guión bajo final) en un atributo de clase invoca la alteración de nombres . [10]
Si bien los lenguajes modernos generalmente usan palabras reservadas en lugar de atrocidades para distinguir las palabras clave de los identificadores (por ejemplo, hacer if
reservadas), también reservan con frecuencia una clase sintáctica de identificadores como palabras clave, lo que produce representaciones que pueden interpretarse como un régimen de atrocidad, pero que en cambio tienen la semántica de palabras reservadas.
Esto es más notable en C, donde los identificadores que comienzan con un guión bajo están reservados, aunque los detalles precisos de qué identificadores están reservados y en qué ámbito están involucrados, y los guiones bajos dobles iniciales están reservados para cualquier uso; [11] de manera similar en C++ cualquier identificador que contenga un doble guión bajo está reservado para cualquier uso, mientras que un identificador que comienza con un guión bajo está reservado en el espacio global. [nb 1] Por lo tanto, se puede agregar una nueva palabra clave foo
utilizando la palabra reservada __foo
. Si bien esto es superficialmente similar a frotar, la semántica es diferente. Como palabra reservada, la cadena __foo
representa el identificador __foo
en el espacio de nombres del identificador común. Al aplicar control (al anteponer las palabras clave con __
), 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 al presionar los tokens para __foo
y foo
son (palabra clave, foo) y (identificador, foo) – iguales valores en diferentes categorías. Estos resuelven el mismo problema de 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.
La manipulació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 incluyen información de alcance y tipo, principalmente para uso de enlazadores, tanto para evitar conflictos como para incluir información semántica necesaria en el nombre mismo. 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)
, teniendo en ambos casos el mismo identificador foo
, pero firma diferente. Estos nombres pueden modificarse foo_i
y foo_c
, por ejemplo, incluir la información de tipo.
Un fenómeno sintácticamente similar pero semánticamente diferente son los sigilos , que en cambio indican propiedades de variables. Estos son comunes en BASIC , Perl , Ruby y varios otros lenguajes para identificar características de variables/constantes: BASIC y Perl para designar el tipo de variable, Ruby tanto para distinguir variables de constantes como para 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.
El stropping se utiliza 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 informática en el siglo XX. Sin embargo, también se han utilizado comúnmente técnicas similares para ayudar a las personas a comprender la lectura. Algunos ejemplos son:
Problemas más serios los plantea el "stropping", la técnica utilizada para distinguir el texto en negrita del texto romano. Algunas implementaciones exigen apóstrofes alrededor de la negrita (de ahí el nombre stropping); otros requieren retroceso y subrayado; [...]
{{cite journal}}
: La cita utiliza un título genérico ( ayuda )