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 por lo tanto ocupar un espacio de nombres diferente al de los nombres ordinarios ("identificadores"), para evitar conflictos. El stropping no se utiliza en la mayoría de los lenguajes modernos; en cambio, las palabras clave son palabras reservadas y no se pueden usar como identificadores. El stropping permite que la misma secuencia de letras se use como palabra clave y como identificador , y simplifica el análisis en ese caso; por ejemplo, permite que una variable nombrada if
no entre en conflicto con la palabra clave if .
El stropping se asoció principalmente con ALGOL y lenguajes relacionados en la década de 1960. Aunque tiene 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) encontradas en el lenguaje de publicación que no se podían representar directamente en el lenguaje de hardware: una máquina de escribir podía tener caracteres en negrita, pero en la codificación en 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óstrofos 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 usan múltiples métodos de stropping, conocidos como "regímenes de stropping"; los apóstrofos coincidentes originales de ALGOL 60 no se usaban ampliamente, siendo más común un punto inicial o mayúsculas, [2] como en .IF
or IF
y el término "stropping" se aplicó a todos estos.
Se han utilizado distintas sintaxis para el stropping:
'BEGIN'
).'BEGIN
) [4]De hecho, a menudo se daba el caso de que se utilizasen varias convenciones de stropping en un mismo lenguaje. Por ejemplo, en ALGOL 68 , la elección de la convención de stropping 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 utiliza una convención similar en FORTRAN 77, donde las palabras clave LÓGICAS se eliminan como .EQ.
etc. (ver a continuación)FOR
– con minúsculas utilizadas para identificadores ordinarios'for'
for
están reservadas y no están disponibles para los identificadores ordinarios.Los diversos regímenes de reglas son una especificación léxica para caracteres con apóstrofo, aunque en algunos casos tienen interpretaciones simples: en los regímenes de apóstrofo simple y punto, el primer carácter funciona como un carácter de escape , mientras que en el régimen de apóstrofos coincidentes los apóstrofos funcionan como delimitadores , como en los literales de cadena .
Otros ejemplos:
underlined
usarse con la tecla de retroceso y la tecla de tachado en un teclado Flexowriter , podían introducirse con un %percent %symbol
, o podían escribirse UPPER CASE
sin ningún carácter delimitador (modo "uppercasedelimiters", en cuyo caso todas las variables debían estar en minúsculas).%percent %symbol
convención de prefijo Atlas Autocode, pero no sus otras opciones de afilado.Tenga en cuenta la directiva pr (abreviatura de pragmat ) principal , que está en estilo POINT o comillas, y el comentario for (de " ") – vea ALGOL 68: pr & co: Pragmats and Comments para más detalles.¢
2¢
Por diversas razones, Fortran 77 tiene estos valores y operadores "lógicos": .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 declaraciones IF
y en archivos por lotes que se ejecutan bajo los procesadores de línea de comandos de JP Software como 4DOS , [6] 4OS2 y 4NT / Take Command .IFF
La mayoría de los lenguajes informáticos modernos no utilizan el stropping. Sin embargo, algunos lenguajes admiten el stropping opcional para especificar identificadores que, de lo contrario, entrarían en conflicto 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. Esto a veces 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 de Structured Query Language . En esos lenguajes, las palabras reservadas se pueden usar como nombres de columnas, tablas o variables delimitándolas léxicamente. El estándar especifica que las palabras reservadas se deben encerrar 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 simples, y Microsoft SQL Server usa corchetes.
En varios idiomas, incluidos Nim , R , [7] y Scala , [8] una palabra reservada o un nombre no alfanumérico se puede usar como identificador encerrándolo entre comillas simples invertidas .
Existen otros ejemplos más menores. Por ejemplo, Web IDL utiliza un guión bajo inicial _
para anular identificadores que de otro modo colisionarían con palabras reservadas: el valor del identificador elimina este guión bajo inicial, lo que hace que se trate de un anular, en lugar de una convención de nombres. [9]
En Haskell , rodear el nombre de una función entre comillas invertidas hace que se analice como un operador infijo .
En el frontend de un compilador , el desajuste 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ó el análisis sin escáner (sin tokenización); esto era estándar en la década de 1960, en particular para ALGOL. En el uso moderno, el desajuste se realiza generalmente como parte del análisis léxico . Esto es claro si uno distingue el analizador léxico en dos fases de escáner y evaluador: el escáner clasifica la secuencia desajuste en la categoría correcta y luego el evaluador desajuste al calcular el valor. Por ejemplo, en un lenguaje donde se utiliza un guión bajo inicial para desajuste de identificadores para evitar colisiones con palabras reservadas, el escáner _if
categorizarí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 resultado el tipo y valor de token.
Existen varias técnicas similares, que generalmente anteponen o sufijan un identificador para indicar un tratamiento diferente, pero la semántica varía. 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 stropping de apóstrofo coincidente, 'if'
se tokeniza como (Palabra clave, si), mientras que if
se tokeniza como (Identificador, si) – 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 análisis léxico y sintáctico: tokenizar la palabra reservada if
como la clase de token IF y luego representar una cláusula if-then-else mediante la frase IF Expression THEN Statement ELSE Statement
donde los términos en mayúscula 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 denotan mediante términos en minúscula, como identifier
o integer
, para un literal entero ).
De manera más general, se pueden utilizar convenciones de nombres para evitar conflictos, generalmente anteponiendo 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.
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 solo guión bajo inicial 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 idiomas modernos generalmente utilizan palabras reservadas en lugar de stropping para distinguir palabras clave de identificadores (por ejemplo, haciendo if
reservado), 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 stropping, 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 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 guión bajo doble 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, uno puede agregar una nueva palabra clave foo
usando la palabra reservada __foo
. Si bien esto es superficialmente similar al stropping, la semántica es diferente. Como palabra reservada, la cadena __foo
representa el identificador __foo
en el espacio de nombres de identificador común. En el stropping (al anteponer 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) – diferentes valores en la misma categoría – mientras que en el stropping los tokens para __foo
y foo
son (palabra clave, foo) y (identificador, foo) – mismos 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 soluciona los conflictos de nombres al cambiar el nombre de los identificadores, pero esto se hace mucho más tarde en la compilación, durante el análisis semántico, no durante la tokenización. Esto 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 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)
, en ambos casos con el mismo identificador foo
, pero con una firma diferente. Estos nombres se pueden manipular a foo_i
y foo_c
, por ejemplo, para 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 las 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 el alcance. Tenga en cuenta que esto afecta a la semántica de la variable, no a la sintaxis de si es un identificador o una palabra clave.
El stropping se utiliza en los lenguajes de programación informática para facilitar el trabajo del compilador (o, más estrictamente, del analizador ), es decir, dentro de las posibilidades 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 técnicas similares para facilitar la comprensión lectora de las personas. Algunos ejemplos son:
El "apuntado", la técnica que se utiliza para distinguir el texto en negrita del texto en letra latina, plantea problemas más graves. Algunas implementaciones exigen apóstrofos alrededor de la negrita (de ahí el nombre de "apuntado"), otras requieren retroceso y subrayado; [...]
{{cite journal}}
: La cita utiliza un título genérico ( ayuda )