Vous avez de bonnes réponses jusqu'à présent. Permettez-moi de vous donner un exemple peu pratique mais très pédagogique de la manière dont vous pourriez concevoir un langage sans la notion de pile ou de "flux de contrôle". Voici un programme qui détermine les factorielles:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)
Nous mettons ce programme dans une chaîne et nous évaluons le programme par substitution textuelle. Donc, lorsque nous évaluons f(3)
, nous faisons une recherche et remplaçons par 3 pour i, comme ceci:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = if 3 == 0 then 1 else 3 * f(3 - 1)
Génial. Nous effectuons maintenant une autre substitution textuelle: nous voyons que la condition du "si" est fausse et nous remplaçons par une autre chaîne, produisant le programme:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)
Nous faisons maintenant une autre chaîne pour remplacer toutes les sous-expressions impliquant des constantes:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)
Et vous voyez comment cela se passe; Je ne travaillerai pas plus loin. Nous pourrions continuer à faire une série de substitutions de cordes jusqu'à ce que nous ayons fini let x = 6
et nous aurions fini.
Nous utilisons traditionnellement la pile pour les variables locales et les informations de continuation; Souvenez-vous, une pile ne vous dit pas d'où vous venez, elle vous indique où vous allez ensuite avec cette valeur de retour en main.
Dans le modèle de programmation avec substitution de chaînes, il n'y a pas de "variables locales" dans la pile; les paramètres formels sont substitués à leurs valeurs lorsque la fonction est appliquée à son argument, plutôt que d'être placés dans une table de recherche sur la pile. Et il n’ya pas de solution de rechange car l’évaluation de programme consiste simplement à appliquer des règles simples pour la substitution de chaînes afin de produire un programme différent mais équivalent.
Maintenant, bien sûr, faire des substitutions de chaînes n'est probablement pas la solution. Mais les langages de programmation prenant en charge le "raisonnement équationnel" (tel que Haskell) utilisent logiquement cette technique.