2009-09-07 9 views
11

En C# (y Java) una cadena es poco más que una matriz de caracteres con una longitud almacenada y algunos métodos añadidos. Del mismo modo, los objetos (referencia vs. valor agregado) son poco más que estructuras glorificadas con herencia e interfaces añadidas.Azúcar sintáctico contra función

En un nivel, estas adiciones se sienten como características claras y mejoras en sí mismas. En otro nivel, se sienten como una mejora marginal del estado del "azúcar sintáctico".

Para tomar esta idea, considere (es posible que tenga algunos detalles mal, pero sigue siendo el punto):

transistor 
elementary logic gate 
compound gate 
    |   | 
ALU flip-flop 
    | |  | 
    | register RAM 
    | | 
    CPU 
    microcode 
    assembly 
    C 
    C++ 
    | | 
MSIL JavaScript 
C# jQuery 

Muchas veces, todo de una sola capa de abstracción se parece mucho azúcar sintáctico sino múltiples capas de separación se sienten muy separados el uno del otro.

¿Cómo sabes cuando algo ha dejado de ser azúcar sintáctico y comenzó a ser una característica bona fide?

+1

¿Se refiere al lenguaje de diseño? ¿Qué quieres decir con 'algo'? – Dario

+1

Fundamentalmente subjetivo, creo. – dmckee

Respuesta

23

Resulta ser una característica en lugar de azúcar sintáctica cuando implica una forma diferente de pensar.

Tiene razón cuando dice que los objetos son en realidad estructuras glorificadas con métodos y herencia. Eso, sin embargo, es solo el detalle de la implementación. Lo que permiten los objetos es pensar de una manera diferente. Puede relacionarse más fácilmente con entidades del mundo real cuando piensa en objetos. Lo mismo sucedió cuando, incluso más atrás en el tiempo, saltamos de usar go-to a programación de procedimientos. Debajo del capó, el procesador sigue funcionando desde OP hasta OP, pero podríamos pensar de una manera diferente, más negra.

Dicho esto, en extremo, puede decir que todo es azúcar sintáctico, pero parte de ese azúcar es una característica cuando le permite pensar de manera diferente.

+1

He pensado muchas veces en su respuesta en los últimos meses y cuanto más la aplico a situaciones, más estoy de acuerdo con ella. – Dinah

2

Tendría que decir que cuando el mismo resultado no se puede lograr simplemente escribiendo un código diferente, con el mismo tipo de "limitación de tiempo" que usando el azúcar sintáctico.

Mi ejemplo sería una expresión Lambda, escribir un foreach no requiere mucho esfuerzo, pero usar .Foreach() también es bueno; versus reescribir toda la clase HttpRequest por su cuenta. Uno es sintáctico, uno es una característica. Ambos ahorran tiempo, uno de una manera mucho más grande que la otra.

5

Todo el software es una pila gigante de abstracciones construidas sobre otras abstracciones. Una cadena puede ser nada más que una matriz de caracteres, pero hay muchas operaciones que se sienten naturales en las cadenas, pero incómodas en las matrices de caracteres. El objetivo de todas estas abstracciones es el mismo: eliminar los detalles irrelevantes para que el desarrollador pueda enfocarse en las partes importantes del problema.

Como usted señala, todos los lenguajes de programación modernos podrían eliminarse, y podríamos volver a trabajar en lenguaje ensamblador. Pero nuestra productividad se desplomaría.

Supongo que las personas llaman a algo azúcar sintáctico cuando sienten que se benefician poco de él, y una característica cuando sienten que obtienen un gran beneficio de él. Eso hace que la distinción sea muy difusa y bastante subjetiva.

12

azúcar sintáctico es una característica.

+2

En sentido amplio, sí. Pero no creo que hayas respondido en el espíritu de la pregunta de OP. – nawfal

0

"la pereza es el motor del progreso" Este proceso se detendrá cuando pueda asignar sus ideas a la máquina de inmediato.

2

"azúcar sintáctica" es una característica que no le gusta

+3

No por mi comprensión del término. El azúcar sintáctico hace que el lenguaje * sea más dulce *. –

+2

Pero luego debes describir el sabor de la sintaxis al curry endulzada, en términos agradables. Del lado serio, si la función se agregó al lenguaje evolutivamente y no se recibió excepcionalmente bien, se llamará azúcar sintáctico. – ima

5

¿Cuándo el cambio proporciona valor? He codificado en ensamblador. Cambié a C y miré el resultado del compilador. Su código era 95% más que mi ensamblador artesanal y era mucho más fácil de escribir. Para mí eso proporcionó valor así que diría que no era azúcar.

C++ me ayuda a traducir mis pensamientos orientados a objetos en código. Siempre que la sobrecarga no sea demasiado alta, creo que es una característica.

Soy un tipo práctico. "Si puedo ver que es valiosa" es mi respuesta

0

sintáctica azúcar y la característica del lenguaje están describiendo básicamente la misma cosa, incluso si azúcar sintáctico se utiliza a veces de una manera peyorativa mientras que función menudo se asocia con cambios más profundos en la arquitectura del lenguaje (presentando lambdas, etc.). Pero esta distinción es muy dependiente de un punto de vista individual (y su utilidad subjetivamente sentida).

En cuanto a los aspectos de diseño del lenguaje y su ejemplo, con strings y char-arrays, diría que este no debe ser ni una función ni azúcar, sino simplemente expresar en los idiomas sintaxis básica (LOP - lenguaje de programación orientado-). Los conceptos genéricos (clases de tipos, metaprogramación, etc.) le permiten expresar muchas construcciones nuevas y útiles sin esperar que el lenguaje obtenga una nueva característica. Solo mire las capacidades de metaprogramación de Haskell o C++.

3

Parece que la sintaxis sintáctica es una sintaxis que no cambia nada sobre las capacidades del lenguaje, y el uso de una construcción diferente logra exactamente lo mismo. Una cadena (pensar en Java) no es solo azúcar sintáctico sobre una matriz de caracteres. Una matriz char es mutable (en contenido si no en longitud). No podría hacer que una matriz char sea inmutable con una función de idioma existente sin una matriz String.

Por otro lado, el operador plus que trabaja en Strings es de hecho el azúcar sintáctico para usar un StringBuilder y un apéndice de llamada.

1

En general, el término "azúcar sintáctica" se refiere a las características del lenguaje, que nunca permitió que un programador para hacer algo que no se podía hacer antes, sino que más bien nos proporcionó una buena forma de expresar algo que ya podía expresarse en el idioma, incluso si algo más torpe.

Ciertas construcciones se pueden considerar inequívocamente como azúcar sintáctico. Por ejemplo, en VB.NET, el código para probar si dos referencias no eran iguales solía requerir If Not (ref1 Is Ref2), pero las versiones más nuevas del lenguaje permiten If ref1 IsNot Ref2. No se puede expresar nada en la nueva sintaxis que no se pudo expresar en el anterior, pero la nueva sintaxis es más limpia, no presenta ambigüedades, y la única razón para no usarla sería si el código tenía que ser compatible con versiones anteriores del lenguaje

Algunas construcciones pueden ser un poco más difíciles de definir como azúcar. En particular, si un lenguaje agrega construcciones que funcionarán de manera idéntica a la construcción existente cuando se usa con otros tipos, pero no compilará con otras, tales construcciones pueden proporcionar un medio de verificación de tipo de tiempo de compilación que no existía previamente. Los genéricos de Java generalmente se pueden ver desde este punto de vista.Se puede agregar Cat a ArrayList<Cat> con la misma facilidad que a ArrayList; lo que el ArrayList<Cat> agrega es un protector para rechazar Dog s en tiempo de compilación. Como las restricciones de tiempo de compilación no permiten escribir ningún programa que no se pueda escribir sin ellas, algunas personas pueden verlas como azúcar sintáctico. Por otro lado, aunque la verificación de tipo se realiza en tiempo de compilación en lugar de en tiempo de ejecución, aún se puede ver como uno de los trabajos de un programa.

Cuestiones relacionadas