¿Podría un lenguaje de programación funcionar tan bien sin declaraciones?

9

Como programación en JavaScript, he notado que todo lo que se puede hacer con sentencias y bloques se puede hacer solo con expresiones. ¿Puede un lenguaje de programación funcionar bien solo con expresiones? Y, en caso afirmativo, ¿por qué se utilizan declaraciones?

MaiaVictor
fuente
2
Sí, hay muchos lenguajes de todo-es-una-expresión, como Ruby y todos los dialectos de Lisp.
amara
@sparkleshy Ya veo, solo una suposición: ¿todos tienen un operador análogo a la coma de JavaScript (ejecuta dos declaraciones y devuelve el valor de la última)? ¿Es esta generalmente la solución para ejecutar dos declaraciones en secuencia? Estoy contando el progn de CL como un análogo, supongo, incluso si funciona para> 2 expresiones.
MaiaVictor
1
Todo-es-una-expresión no tiene que verse diferente a un lenguaje de declaración ordinario, las declaraciones simplemente ... tienen valores. Si hiciera expresiones de declaraciones de javascript, todo el código existente sería completamente válido.
amara
1
CoffeeScript es un lenguaje de todo-es-una-expresión, que compila a JavaScript.
Spoike
1
relacionado (posiblemente un duplicado): ¿Qué expresividad útil será imposible en un lenguaje donde una expresión no es una declaración? "¿Por qué tantas gramáticas hacen la distinción entre expr y stmt cuando, como se señala en las respuestas, no tiene sentido"?
mosquito

Respuestas:

14

Por supuesto. La forma más simple es asignar un valor de resultado a cada construcción que actualmente es una declaración y, por lo tanto, convertirla en una expresión. Sin embargo, eso no es necesariamente útil o significativo. La única ganancia potencial es un poco de simplicidad conceptual. Sin embargo, si luego procede a eliminar cosas como punto y coma y bucles (que requieren encadenamiento a través de otros operadores y funciones), los programas que usan en gran medida declaraciones se vuelven feos.

Una forma más radical pero significativa de hacer esto es diseñar el lenguaje de manera que casi todo tenga un valor significativo, y usarlo de una manera que casi siempre use una expresión para ese valor significativo, no para otros efectos. Los lenguajes de programación funcional hacen esto (hasta cierto punto; por ejemplo, Haskell tiene declaraciones, que no son expresiones).

Las declaraciones se usan porque en el paradigma imperativo, hay muchas operaciones comunes que no tienen un valor de resultado útil, y porque la noción de instrucciones secuenciales (en lugar de cálculos) se ajusta bastante bien a ese paradigma. Si un gran porcentaje de su programa está mutando, en lugar de calcular nuevos valores, no tiene sentido exigir la producción de un valor (¿cuál es el resultado de un ciclo for?). Por el contrario, cuando todo su paradigma (FP) se basa en el cálculo de valores, los valores atípicos que no tienen un valor de resultado no garantizan una excepción: en cambio, les da un resultado centinela que no significa nada.


fuente
-1 esto no es realmente cierto
amara
3
@sparkleshy ¿Qué parte no es verdad y cómo?
1
primer párrafo: duda de la idea de que las declaraciones tienen valores de retorno útiles (pero muchos lo hacen), propone algo feo (¿por qué?). segundo párrafo: declara que todos los lenguajes de programación funcionales usan este concepto marginal feo, que es ridículo. tercer párrafo: falso, ya tenemos que en los bloques {}, el valor se ignora y no causa ningún problema, incorrecto; ya les estás dando la falta de un valor de vacío, ¿cómo es nulo menos significativo que eso? en general: esto no es realmente cierto
amara
2
@sparkleshy: ninguna declaración tiene valores de retorno útiles, por eso son declaraciones . Pueden tener efectos secundarios útiles (como la asignación), pero eso no es lo mismo. Esto no es realmente un concepto marginal. Es bien sabido, si no del todo práctico, si se lleva al enésimo grado. Y ese valor centinela no es nulo o nulo, es una unidad que es sutilmente diferente de ambos. +1 para delnan para compensar esto.
Telastyn
44
@sparkleshy (1) Puede estar confundiendo expresiones (que pueden ser el único componente de una declaración) con una declaración (que no son expresiones y no tienen valor de resultado). (2) ¿Qué? Cualquier defensor de FP lo confirmará (y argumentará que es algo bueno). ¿O es solo la parte de "todos" a la que se opone? (3) {} bloques son de lo que estoy hablando ("noción de instrucciones secuenciales"). ¿Y dónde digo que algo causa algún problema? La diferencia entre voidy null/ unites que estos últimos son valores y se pueden pasar, mientras que voides especial porque no hay ningún valor de ese tipo.
5

Depende de cómo se defina "declaración" y "expresión".

Una definición muy estricta distinguiría entre afirmaciones como "cosas que tienen efectos secundarios, y tal vez un valor de retorno" y expresiones como "cosas que tienen valores de retorno, pero no pueden tener efectos secundarios". Con tal definición, no se puede escribir ningún programa significativo sin al menos una declaración (que tendría que evaluar una expresión y generar su valor de retorno): las expresiones puras por sí solas no pueden interactuar con el mundo fuera del programa. Un lenguaje solo puede ser completamente puro (es decir, no tener ningún enunciado), si la parte impura se saca del lenguaje y se introduce en el ecosistema de soporte (que es exactamente lo que hace Haskell, aunque el lenguaje tiene definiciones y expresiones) .

Sin embargo, si permite efectos secundarios en las expresiones, la distinción entre declaraciones y expresiones se vuelve arbitraria y mucho menos interesante; por supuesto, puede inventar un lenguaje de programación que consista solo en expresiones; la mayoría de los dialectos de Lisp funcionan de esa manera. En tal situación, evaluar una expresión por sus efectos secundarios es casi exactamente lo mismo que ejecutar una declaración, y uno podría argumentar que en dicho lenguaje, las expresiones y las declaraciones son lo mismo. La diferencia entre una declaración y una expresión, entonces, es solo sintáctica.

Muchos idiomas aún hacen esta distinción sintáctica, porque es útil no por razones técnicas, sino por legibilidad. Hacer que algo sea una expresión indica que está interesado en su valor de retorno, menos sus efectos secundarios; al hacer una declaración le dice al lector que tiene la intención de que cause efectos secundarios, y el valor de retorno puede o no ser interesante.

tdammers
fuente
+1 para comentarios sobre legibilidad ... Al final, los humanos necesitan entenderlo ...
mattnz
1

ATL y Xtend son lenguajes de programación que funcionan bien sin enunciados. Muchos lenguajes funcionales también son sin enunciados. Entonces, sí, un lenguaje de programación puede funcionar bien sin declaraciones. Creo que las declaraciones son en muchos idiomas una reliquia de la programación imperativa. Todavía se usan porque son ampliamente conocidos y, en algunos casos, hacen que el código sea más legible.

SpaceTrucker
fuente
1

Si.

Lenguajes funcionales (y lenguajes de asignación única) todo es una expresión. Ejemplos son Haskal (y SISAL). Donde ambas declaraciones if y for loops devuelven valores.

Hay otras clases de idiomas: el más fácil que me viene a la mente es el lenguaje declarativo (estoy seguro de que hay muchos otros que no dependen de las declaraciones). Estos lenguajes ni siquiera necesitan expresiones (en el mismo sentido que normalmente pensarías). Usted declara lo que es verdad y puede obtener múltiples resultados. La fácil aquí es prolog.

Martin York
fuente
Haskell tiene declaraciones, no son expresiones.
Janus Troelsen