Un langage de programmation pourrait-il aussi fonctionner sans instructions?

9

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?

MaiaVictor
la source
2
Oui, il existe de nombreux langages tout-est-une-expression, comme le rubis et tous les dialectes de Lisp.
amara
@sparkleshy Je vois, juste une supposition: ils ont tous un opérateur analogue à la virgule de JavaScript (il exécute deux instructions et renvoie la valeur de la dernière)? Est-ce généralement la solution pour exécuter deux instructions en séquence? Je compte le prog de CL comme un analogue, je suppose, même si cela fonctionne pour> 2 expressions.
MaiaVictor
1
Tout-est-une-expression n'a pas à être différent d'un langage d'instructions ordinaire, les instructions ont juste ... des valeurs. Si vous avez fait des expressions de déclarations javascript, tout le code existant serait complètement valide.
amara
1
CoffeeScript est un langage tout-est-une-expression, qui se compile en JavaScript.
Spoike
1
liés (éventuellement un doublon): Quelle expressivité utile sera impossible dans une langue où une expression n'est pas une déclaration? "Pourquoi tant de grammaires font-elles la distinction entre expr et stmt alors que, comme indiqué dans les réponses, cela n'a aucun sens."
moucher

Réponses:

14

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
-1 ce n'est pas vraiment vrai
amara
3
@sparkleshy Quelle partie n'est pas vraie, et comment?
1
premier paragraphe: vous doutez de l'idée que les instructions aient des valeurs de retour utiles (mais beaucoup le font), proposez une chose moche (pourquoi?). deuxième paragraphe: déclare que tous les langages de programmation fonctionnels utilisent ce concept de frange laide, ce qui est ridicule. troisième paragraphe: faux, nous avons déjà dans les blocs {}, la valeur est ignorée et cela ne pose aucun problème, incorrect; vous leur donnez déjà le manque de valeur de vide, comment null est-il moins significatif que cela? dans l'ensemble: ce n'est pas vraiment vrai
amara
2
@sparkleshy - Aucune instruction n'a de valeur de retour utile, c'est pourquoi ce sont des instructions . Ils peuvent avoir des effets secondaires utiles (comme l'affectation), mais ce n'est pas la même chose. Ce n'est pas vraiment un concept marginal. C'est bien connu, sinon entièrement pratique, s'il est pris au Nième degré. Et cette valeur sentinelle n'est pas nulle ou non avenue, c'est une unité qui est subtilement différente des deux. +1 pour delnan pour compenser cela.
Telastyn
4
@sparkleshy (1) Vous pouvez confondre des expressions (qui peuvent être le seul composant d'une instruction) avec une instruction (qui ne sont pas des expressions et n'ont pas de valeur de résultat). (2) Quoi? Tout défenseur de la PF le confirmera (et soutiendra que c'est une bonne chose). Ou est-ce seulement la partie "tous" à laquelle vous vous opposez? (3) Les blocs {} sont ce dont je parle ("notion d'instructions séquentielles"). Et où dois-je dire que quelque chose cause des problèmes? La différence entre voidet null/ unitest que ces dernières sont des valeurs et peuvent être transmises, tandis que la voidparticularité est qu'il n'y a pas de valeur de ce type.
5

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.

tdammers
la source
+1 pour les commentaires sur la lisibilité ... En fin de compte, les humains doivent le comprendre ...
mattnz
1

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.

SpaceTrucker
la source
1

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.

Martin York
la source
Haskell a des déclarations, ce ne sont pas des expressions.
Janus Troelsen