En informática , el azúcar sintáctico es la sintaxis dentro de un lenguaje de programación que está diseñado para facilitar la lectura o la expresión. Hace que el lenguaje sea más "dulce" para el uso humano: las cosas se pueden expresar de forma más clara, más concisa o en un estilo alternativo que algunos prefieran.
Por ejemplo, muchos lenguajes de programación proporcionan una sintaxis especial para referenciar y actualizar elementos de matriz . De manera abstracta, una referencia de matriz es un procedimiento de dos argumentos: una matriz y un vector de subíndice, que podría expresarse como get_array(Array, vector(i,j))
. En cambio, muchos lenguajes proporcionan sintaxis como Array[i,j]
. De manera similar, la actualización de un elemento de matriz es un procedimiento que consta de tres argumentos, por ejemplo set_array(Array, vector(i,j), value)
, pero muchos lenguajes proporcionan una sintaxis como Array[i,j] = value
.
Un constructo en un lenguaje es azúcar sintáctico si se puede eliminar del lenguaje sin ningún efecto sobre lo que puede hacer el lenguaje: la funcionalidad y el poder expresivo seguirán siendo los mismos.
Los procesadores de lenguaje, incluidos los compiladores y los analizadores estáticos , a menudo expanden las construcciones azucaradas en construcciones más fundamentales antes del procesamiento, un proceso que a veces se denomina "desazucaración".
Orígenes
El término azúcar sintáctico fue acuñado por Peter J. Landin en 1964 para describir la sintaxis superficial de un lenguaje de programación simple similar a ALGOL que se definió semánticamente en términos de las expresiones aplicativas del cálculo lambda , [1] [2] centrado en la sustitución léxica λ con "dónde".
Los lenguajes de programación posteriores, como CLU , ML y Scheme , ampliaron el término para referirse a la sintaxis dentro de un lenguaje que podría definirse en términos de un núcleo de lenguaje de construcciones esenciales; las características convenientes de nivel superior podrían "desazucararse" y descomponerse en ese subconjunto. [3] Esta es, de hecho, la práctica matemática habitual de construir a partir de primitivas.
Sobre la base de la distinción de Landin entre las construcciones esenciales del lenguaje y el azúcar sintáctico, en 1991, Matthias Felleisen propuso una codificación del "poder expresivo" para alinearse con las "creencias generalizadas" en la literatura. Definió "más expresivo" en el sentido de que sin las construcciones del lenguaje en cuestión, un programa tendría que reorganizarse por completo. [4]
Ejemplos notables
- En COBOL , muchas de las palabras clave intermedias son azúcar sintáctico que opcionalmente se pueden omitir. Por ejemplo, la oración
MOVE A B.
y la oraciónMOVE A TO B.
realizan exactamente la misma función, pero la segunda aclara la acción a realizar. - Operadores de asignación aumentada o de asignación compuesta: por ejemplo,
a += b
es equivalente aa = a + b
en C y lenguajes similares, asumiendo quea
no tiene efectos secundarios como sia
es una variable regular. [5] [6] Algunos lenguajes, como Python [7], pueden permitir la sobrecarga de operadores de asignación aumentada, por lo que pueden comportarse de manera diferente a los estándar. - En Perl ,
unless (condition) {...}
es azúcar sintáctico paraif (not condition) {...}
. Además, cualquier declaración puede ir seguida de una condición, por lo questatement if condition
es equivalente aif (condition) {statement}
, pero la primera tiene un formato más natural en una sola línea. - En el lenguaje C , la
a[i]
notación es azúcar sintáctica para*(a + i)
. [8] Del mismo modo, laa->x
notación es azúcar sintáctica para acceder a los miembros utilizando el operador de desreferencia(*a).x
. - La
using
declaración en C # asegura que ciertos objetos se eliminen correctamente. El compilador expande la declaración en un bloque de prueba finalmente. [9] - El lenguaje C # permite que las variables se declaren como
var x = expr
, lo que permite al compilador inferir el tipo dex
de la expresiónexpr
, en lugar de requerir una declaración de tipo explícita. Del mismo modo, C ++ permiteauto x = expr
desde C ++ 11. - Python listas por comprensión (como
[x*x for x in range(10)]
una lista de cuadrados) y decoradores (como@staticmethod
). - En Haskell , una cadena, indicada entre comillas, es semánticamente equivalente a una lista de caracteres.
- En la colección tidyverse de paquetes R , la tubería , indicada por
%>%
, declara que los datos (o la salida de la función) que preceden a la tubería servirán como primer argumento para la función que sigue a la tubería. [10] Entonces,x %>% f(y)
es equivalente af(x,y)
. - En SQL ,
JOIN
es equivalente aINNER JOIN
, este último aclara que la declaración de combinación es específicamente una operación de combinación interna en lugar de una operación de combinación externa. - La llamada al método en lenguajes OOP en forma de
myObject.myMethod(parameter1, parameter2, parameter3)
es azúcar sintáctico para llamar a una función global como . La referencia al objeto se pasa como un argumento oculto, generalmente accesible desde dentro del método como .myMethod(myObject, parameter1, parameter2, parameter3)
this
- Los parámetros llamados por referencia son un azúcar de sintaxis para pasar técnicamente un puntero al parámetro, pero manipulándolo sintácticamente como la propia variable, para evitar la desreferencia constante del puntero en el código dentro de la función.
- En Java , una
import
declaración permite al compilador encontrar clases que no se especifican de otra manera con nombres completos. Por ejemplo,import javax.swing.*;
permite al programador hacer referencia a un objeto Swing , comojavax.swing.JButton
usar el nombre más cortoJButton
.
Crítica
Algunos programadores sienten que estas características de usabilidad de la sintaxis no son importantes o son completamente frívolas. En particular, las formas sintácticas especiales hacen que un lenguaje sea menos uniforme y su especificación más compleja, y pueden causar problemas a medida que los programas se vuelven grandes y complejos. Esta vista está particularmente extendida en la comunidad Lisp , ya que Lisp tiene una sintaxis muy simple y regular, y la sintaxis superficial se puede modificar fácilmente. [11] Por ejemplo, Alan Perlis una vez bromeó en " Epigramas sobre programación ", en una referencia a los lenguajes delimitados por corchetes , que "el azúcar sintáctico causa cáncer de punto y coma ". [12]
Términos derivados
Sal sintáctica
La metáfora se ha ampliado acuñando el término sal sintáctica , que indica una característica diseñada para dificultar la escritura de código incorrecto. [13] Específicamente, la sal sintáctica es un aro que los programadores deben atravesar solo para demostrar que saben lo que está sucediendo, en lugar de expresar una acción del programa. Por ejemplo, en Java y Pascal, asignar un valor flotante a una variable declarada como un int sin una sintaxis adicional que indique explícitamente esa intención resultará en un error de compilación, mientras que C y C ++ truncarán automáticamente cualquier flotante asignado a un int. Sin embargo, esto no es sintaxis, sino semántica.
En C # , al ocultar un miembro de clase heredado, se emite una advertencia del compilador a menos que se use la new
palabra clave para especificar que el ocultamiento es intencional. [14] Para evitar errores potenciales debido a la similitud de la instrucción switch sintaxis con el de C o C ++, C # requiere una break
para cada no vacía case
etiqueta de un switch
(a menos que goto
, return
o throw
se utiliza) a pesar de que no permite implícita caída -a través . [15] (Uso goto
y especificando la etiqueta posterior produce una C / C ++ - como caída-a través .)
La sal sintáctica puede frustrar su propósito al hacer que el código sea ilegible y, por lo tanto, empeorar su calidad; en casos extremos, la parte esencial del código puede ser más corta que la sobrecarga introducida para satisfacer los requisitos del lenguaje.
Una alternativa a la sal sintáctica es generar advertencias del compilador cuando existe una alta probabilidad de que el código sea el resultado de un error, una práctica común en los compiladores modernos de C / C ++.
Sacarina sintáctica
Otras extensiones son la sacarina sintáctica y el jarabe sintáctico , es decir, una sintaxis gratuita que no facilita la programación. [16] [17] [18] [19]
Tipos azucarados
Los tipos de datos con soporte sintáctico básico se denominan "tipos azucarados". [20] [21] [22] Los ejemplos comunes incluyen cadenas delimitadas por comillas, llaves para objetos y tipos de registros y corchetes para matrices.
Notas
- ^ Landin, Peter J. (1964). "La evaluación mecánica de expresiones" (PDF) . The Computer Journal . Revista informática . 6 (4): 308–320. doi : 10.1093 / comjnl / 6.4.308 . Consultado el 21 de julio de 2014 .
- ^ Abelson y Sussman 1996 , capítulo 1, nota al pie 11 .
- ^ Barbara Liskov, "Una historia de CLU", Laboratorio del MIT para el informe técnico de ciencias de la computación 561 (1993)
- ^ Felleisen, Matthias (diciembre de 1991). "Sobre el poder expresivo de los lenguajes de programación" . Ciencia de la Programación de Computadores . Springer-Verlag. 17 (1-3): 35-75. doi : 10.1016 / 0167-6423 (91) 90036-W . Consultado el 19 de julio de 2014 .
- ^ "Asignación de compuesto C" . msdn.microsoft.com . Microsoft . Consultado el 20 de junio de 2016 .
Sin embargo, la expresión de asignación compuesta no es equivalente a la versión expandida porque la expresión de asignación compuesta evalúa expression1 solo una vez, mientras que la versión expandida evalúa expression1 dos veces: en la operación de suma y en la operación de asignación.
- ^ Garavaglia, Emilio (26 de julio de 2015). "¿Por qué los atajos como x + = y se consideran una buena práctica?" . stackexchange.com . Consultado el 20 de junio de 2016 .
la optimización se puede [realizar] si 'encontrar x' no tiene efectos secundarios
- ^ {cite web | url = https://docs.python.org/3/reference/datamodel.html#object.__iadd__ | title = Python Data model | date = 21 de diciembre de 2020 | webiste = docs.python.org}
- ^ Eric S. Raymond (11 de octubre de 1996). El diccionario del nuevo hacker - 3.ª edición . Prensa del MIT. pag. 432. ISBN 978-0-262-68092-9. Consultado el 5 de agosto de 2012 .
- ^ "usando la instrucción (referencia de C #)" . Consultado el 16 de septiembre de 2014 .
- ^ "magrittr: Viñeta" . Consultado el 24 de diciembre de 2018 .
- ^ Abelson y Sussman 1996 , capítulo 1, nota al pie 11 .
- ^ Perlis 1982 , Epigrama # 3.
- ^ "El archivo de jerga - sal sintáctica" . 2003-06-12. Archivado desde el original el 12 de junio de 2003 . Consultado el 19 de marzo de 2018 .
- ^ "nuevo Modificador (Referencia de C #)" . microsoft.com . Microsoft . Consultado el 3 de agosto de 2015 .
- ^ "interruptor (Referencia de C #)" . microsoft.com . Microsoft . Consultado el 3 de agosto de 2015 .
- ^ "azúcar sintáctico" . catb.org . Consultado el 3 de agosto de 2015 .
- ^ Boiten, Eerke A .; Möller, Bernhard (26 de junio de 2002). Matemáticas de la construcción de programas . ISBN 9783540438571. Consultado el 3 de agosto de 2015 .
- ^ Dean, Thomas (2004). Hablar con computadoras: exploraciones en la ciencia y tecnología de la computación . Prensa de la Universidad de Cambridge. pag. 115 . ISBN 9780521542043.
- ^ Harrison, William; Sheard, Tim (8 al 10 de julio de 2002). "Control fino de la demanda en Haskell" (PDF) . Matemáticas de la construcción de programas: 6ª Conferencia Internacional, MPC 2002, Castillo Dagstuhl, Alemania, 8 al 10 de julio de 2002. Actas . Congreso Internacional de Matemáticas de Construcción de Programas. Castillo de Dagstuhl, Alemania: Springer Berlin Heidelberg. pag. 93. doi : 10.1007 / 3-540-45442-X_6 . S2CID 10059915 . Archivado desde el original (PDF) el 31 de marzo de 2017.
- ^ Chugh, Ravi (2013). Tipos de refinamiento anidados para JavaScript (PhD). UC San Diego.
- ^ "Documentación LLVM en lenguaje C" . clang.llvm.org . Consultado el 30 de junio de 2020 .
- ^ "La vida secreta de los tipos en Swift" . medium.com/@slavapestov . Consultado el 30 de junio de 2020 .
Referencias
- Abelson, Harold ; Sussman, Gerald Jay ; Sussman, Julie (1996) [1984]. Estructura e interpretación de programas informáticos . Cambridge, MA: MIT Press . ISBN 0-262-51087-1.
- Landin, Peter J. (febrero-marzo de 1965). "Una correspondencia entre ALGOL 60 y notación lambda de la Iglesia: Partes I y II". Comunicaciones de la ACM . 8 (2.3): 89-101, 158-165. doi : 10.1145 / 363744.363749 . S2CID 6505810 .
- Landin, Peter J. (marzo de 1965). "Programación sin imperativos: un ejemplo". Investigación en Programación de Sistemas UNIVAC .
- Landin, Peter J. (julio de 1965). "Deshacerse de las etiquetas". Investigación en Programación de Sistemas UNIVAC .
- Landin, Peter J. (agosto de 1965). "Una generalización de saltos y etiquetas". Investigación en Programación de Sistemas UNIVAC ., reimpreso en " Computación simbólica y de orden superior ". 11 . 1998: 125-143. CiteSeerX 10.1.1.85.2610 . Cite journal requiere
|journal=
( ayuda ) - Perlis, AJ (septiembre de 1982). "Epigramas sobre programación" . Avisos ACM SIGPLAN . Nueva York, NY, EE.UU .: Association for Computing Machinery. 17 (9): 7–13. doi : 10.1145 / 947955.1083808 . S2CID 20512767 . Archivado desde el original el 17 de enero de 1999.CS1 maint: ref duplica el valor predeterminado ( enlace )
- Este artículo se basa en material extraído del Diccionario gratuito de informática en línea antes del 1 de noviembre de 2008 e incorporado bajo los términos de "renovación de licencias" de la GFDL , versión 1.3 o posterior.