En tant que programmation en JavaScript, j'ai remarqué que tout ce qui peut être fait avec des instructions et des blocs peut être fait avec des expressions seules. Un langage de programmation peut-il fonctionner correctement avec uniquement des expressions? Et, si oui, pourquoi utilise-t-on des déclarations?
programming-languages
javascript
language-design
MaiaVictor
la source
la source
Réponses:
Sûr. Le moyen le plus simple consiste à affecter une valeur de résultat à chaque construction qui est actuellement une instruction et à la transformer ainsi en une expression. Ce n'est cependant pas nécessairement utile ou significatif. Le seul gain potentiel est un peu de simplicité conceptuelle. Cependant, si vous procédez ensuite à la suppression d'éléments tels que les points-virgules et les boucles (nécessitant à la place le chaînage via d'autres opérateurs et fonctions), les programmes utilisant fortement des instructions deviennent laids.
Une manière plus radicale mais significative de le faire est de concevoir le langage de telle sorte que presque tout a une valeur significative et de l'utiliser de manière à ce que vous utilisiez presque toujours une expression pour cette valeur significative, pas pour d'autres effets. Les langages de programmation fonctionnels font cela (dans une certaine mesure; par exemple, Haskell a des déclarations, qui ne sont pas des expressions).
Les instructions sont utilisées parce que dans le paradigme impératif, il existe de nombreuses opérations courantes qui n'ont pas de valeur de résultat utile, et parce que la notion d' instructions séquentielles (plutôt que de calculs) correspond assez bien à ce paradigme. Si un grand pourcentage de votre programme est en mutation, plutôt que de calculer de nouvelles valeurs, cela n'a pas de sens d' exiger la production d'une valeur (quel est le résultat d'une boucle for?). En revanche, lorsque l'ensemble de votre paradigme (FP) est construit autour du calcul des valeurs, les valeurs aberrantes qui n'ont pas de valeur de résultat ne justifient pas une exception: vous leur donnez plutôt un résultat sentinelle qui ne signifie rien.
la source
void
etnull
/unit
est que ces dernières sont des valeurs et peuvent être transmises, tandis que lavoid
particularité est qu'il n'y a pas de valeur de ce type.Dépend de la façon dont vous définissez «instruction» et «expression».
Une définition très stricte distinguerait les déclarations comme «des choses qui ont des effets secondaires, et peut-être une valeur de retour» et les expressions comme «des choses qui ont des valeurs de retour, mais ne peuvent pas avoir d'effets secondaires». Avec une telle définition, aucun programme significatif ne peut être écrit sans au moins une instruction (qui devrait évaluer une expression et produire sa valeur de retour) - les expressions pures seules ne peuvent pas interagir avec le monde extérieur au programme. Une langue seule peut toujours être complètement pure (c.-à-d. Ne pas avoir de déclaration), si la partie impure est déplacée hors de la langue et dans l'écosystème de support (ce qui est exactement ce que fait Haskell, bien que la langue ait des définitions ainsi que des expressions) .
Si, cependant, vous autorisez des effets secondaires dans les expressions, alors la distinction entre les déclarations et les expressions devient arbitraire et beaucoup moins intéressante - bien sûr, vous pouvez inventer un langage de programmation qui se compose uniquement d'expressions; la plupart des dialectes lisp fonctionnent comme ça. Dans une telle situation, l'évaluation d'une expression pour ses effets secondaires est à peu près exactement la même chose que l'exécution d'une instruction, et on pourrait soutenir que dans un tel langage, les expressions et les instructions sont la même chose. La différence entre une instruction et une expression n'est donc que syntaxique.
De nombreux langages font encore cette distinction syntaxique, car elle est utile non pas pour des raisons techniques, mais pour la lisibilité. Faire quelque chose d'une expression signifie que vous êtes intéressé par sa valeur de retour, moins ses effets secondaires; en faire une déclaration indique au lecteur que vous avez l'intention de provoquer des effets secondaires et que la valeur de retour peut être intéressante ou non.
la source
ATL et Xtend sont des langages de programmation fonctionnant sans instructions. De nombreux langages fonctionnels sont également sans instruction. Donc, oui, un langage de programmation peut fonctionner correctement sans instructions. Je pense que les déclarations sont dans de nombreuses langues une relique de la programmation impérative. Ils sont toujours utilisés car ils sont largement connus et dans certains cas, ils rendent le code plus lisible.
la source
Oui.
Langages fonctionnels (et langages à affectation unique) tout est une expression. Les exemples sont Haskal (et SISAL). Où les instructions if et les boucles for renvoient des valeurs.
Il existe d'autres classes de langages: le plus simple qui me vient à l'esprit est le langage déclaratif (je suis sûr qu'il y en a beaucoup d'autres qui ne dépendent pas des instructions). Ces langues n'ont même pas besoin d'expressions (dans le même sens que vous le pensez normalement). Vous déclarez ce qui est vrai et vous pouvez obtenir plusieurs résultats en retour. Le plus simple ici est
prolog
.la source