Je ne suis pas sûr que COBOL le fasse (certainement pas à un moment donné), mais je ne peux pas imaginer que quiconque se soucie beaucoup non plus.
Fortran a depuis Fortran 90, mais vous oblige à utiliser le recursive
mot - clé pour lui dire qu'un sous-programme est récursif.
PL / I était à peu près la même - la récursivité était prise en charge, mais vous deviez lui dire explicitement quelles procédures étaient récursives.
Je doute qu'il y en ait bien plus que cela. Quand vous y arrivez, interdire la récursivité était principalement quelque chose qu'IBM a fait dans ses conceptions de langage, pour la simple raison que les mainframes IBM (360/370/3090 / ...) ne prennent pas en charge une pile matérielle. Lorsque la plupart des langues provenaient d'IBM, elles interdisaient principalement la récursivité. Maintenant qu'ils viennent tous d'autres endroits, la récursivité est toujours autorisée (même si je dois ajouter que quelques autres machines, notamment le Cray 1 d'origine, n'avaient pas non plus de support matériel pour une pile).
notably the original cray 1
Donc, vous n'avez pas besoin de récursivité pour cloner des dinosaures? Je suppose que c'est vraiment à nous les singes de se balancer dans les arbres.Wikipédia dit:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
la source
Le langage de programmation OpenCL ne prend pas en charge la récursivité. (voir la section 6.8 de la spécification OpenCL )
La motivation actuelle pour cela est a) un manque d'espace pour les piles profondes b) un désir de connaître, statiquement, les allocations totales requises afin d'optimiser les performances en présence de grands ensembles de registres et d'un alignement étendu.
Cela peut s'appliquer à d'autres langages de programmation GPU, par exemple les langages de shader.
la source
Certains compilateurs c pour les petits microcontrôleurs ne prennent pas en charge la récursivité, probablement parce qu'ils ont une taille de pile extrêmement limitée.
la source
BASIC, à l'époque des numéros de ligne, avait tendance à avoir un support de récursivité médiocre. De nombreux (tous?) BASIC de cette époque prenaient en charge les appels gosub imbriqués, mais ne prenaient pas en charge un moyen facile de transmettre des paramètres ou de renvoyer des valeurs d'une manière qui le rendait utile pour l'auto-appel.
De nombreux premiers ordinateurs ont eu des problèmes de récursivité, car ils ont utilisé des instructions d'appel qui ont écrit l'adresse de retour au début de la routine appelée (PDP8, la famille de machines IAS, probablement plus d'architectures que je ne connais pas), généralement de telle manière qu'elle était le code machine pour "Aller à l'instruction après celle qui a appelé la routine".
la source
Cela dépend de ce que vous entendez par « soutien ». Pour prendre en charge la récursivité, vous avez besoin d'une pile où ré-instancier des variables locales à chaque ré-entrée.
Même si le langage n'a pas le concept de variables locales, s'il a le concept de "sous-programme" et a un moyen de gérer une indexation entre des variables identiques (aka tableau) vous pouvez incrémenter / décrémenter un index global à chaque entrée / sortie d'une fonction et accéder à travers elle à un membre d'un ou plusieurs tableaux.
Je ne sais pas si cela peut être appelé "support". Les faits sont que j'ai écrit la fonction récursive avec le ZX-Spectrum BASIC, comme je l'ai fait dans Fortran77 comme dans COBOL ... toujours avec cette astuce.
la source
Le langage d'assemblage ne prend pas directement en charge la récursivité - vous devez "le faire vous-même", généralement en poussant les paramètres sur la pile de la machine.
la source
CALL
instruction, qui pousse automatiquement l'IP vers la pile avant de passer au sous-programme, et uneRET
instruction qui insère l'adresse de retour dans l'IP. Il n'y a aucune raison pour laquelle vous ne pouvez pasCALL
créer votre propre point d'entrée.void f() { f(); }
est récursif.