it-swarm-fr.com

Quelles langues de programmation impératives ne soutiennent pas la récursivité?

À ma connaissance, toutes les langues de programmation d'impératif modernes soutiennent la récursion en ce sens qu'une procédure peut s'appeler lui-même. Ce n'était pas toujours le cas, mais je ne trouve aucun fait difficile avec une recherche rapide de Google. Donc, ma question est:

Quelles langues n'ont pas soutenu la récursivité dès le départ et quand cet appui a-t-il été ajouté?

21
fredoverflow

Je ne suis pas sûr que Cobol ne le fait (cela n'a certainement pas à la fois), mais je ne peux pas imaginer tout le monde qui s'occupe beaucoup non plus.

Fortran a depuis Fortran 90, mais nécessite que vous utilisiez le mot-clé recursive pour le dire qu'un sous-programme est récursif.

PL/J'étais à peu près la même chose - la récursivité a été soutenue, mais vous deviez explicitement lui dire quelles procédures ont été récursives.

Je doute qu'il y ait beaucoup plus que cela. Lorsque vous y allez, interdisant la récursion était surtout quelque chose d'IBM dans leurs conceptions de langue, pour la simple raison que les ordinateurs centraux IBM (360/370/3090/...) ne prennent pas en charge une pile dans du matériel. Lorsque la plupart des langues venaient d'IBM, ils interdisent principalement la récursion. Maintenant qu'ils viennent tous d'autres endroits, la récursion est toujours autorisée (bien que je devais ajouter que quelques autres machines, notamment la fouille d'origine 1, n'avaient pas de support matériel pour une pile non plus).

21
Jerry Coffin

Wikipedia dit:

Les premières langues comme Fortran n'ont pas initialement soutenu la récursion car les variables ont été allouées statiquement, ainsi que l'emplacement de l'adresse de retour.

http://fr.wikipedia.org/wiki/subroutine#local_variables.2c_recursion_and_re-entrance

Fortran 77 n'autorise pas la récursion, Fortran 90 le fait (les routines récursives doivent être explicitement déclarées de manière explicite).

La plupart des compilateurs de Fortran 77 autorisent la récursion, certaines (par ex. Dec) nécessitent l'utilisation d'une option de compilateur (voir Chapitre Options de compilateur). Le GNU G77, qui est conforme strictement à la norme FORTRAN 77, ne permet pas de récursion du tout.

http://www.ibiblio.org/pub/languages/fortran/ch1-12.html

16
Robert Harvey

Le langage de programmation OPENCL ne prend pas en charge la récursive. (Voir la section 6.8 du openc spécifique )

La motivation actuelle pour cela est a) un manque d'espace pour les piles profondes b) un désir de savoir, statiquement, le total des allocations requises afin d'optimiser les performances en présence de grands ensembles de registres et de vastes entrées.

Cela peut bien appliquer à d'autres langages de programmation GPU, par exemple Shader Langues.

6
grrussel

Certains compilateurs C pour les petits microcontrôleurs ne supportent pas la récursion, probablement parce qu'ils ont une taille de pile extrêmement limitée.

2
Jeanne Pindar

Basic, dans l'époque des numéros de ligne, a eu tendance à avoir un soutien de récursivité médiocre. Beaucoup de bases (tous?) De ce temps ont pris en charge les appels de gosouche imbriqués, mais n'ont pas soutenu une manière facile de passer des paramètres ou de valeurs de retour d'une manière qui l'a rendue utile à l'auto-appel.

De nombreux ordinateurs précoces avaient des problèmes de récursion, 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 des machines IAS, probablement plus d'architectures que je suis inconnue avec), généralement de manière à ce qu'elle était le code de la machine pour "sauter à l'instruction après celui qui a appelé la routine".

1
Vatine

Langue de montage ne supporte pas directement la récursion - vous devez "le faire vous-même", généralement en appuyant sur les paramètres sur la pile de la machine.

1
mikera

Cela dépend de ce que vous entendez par "support". Pour soutenir la récursive, vous avez besoin d'une pile où ré-instancier les variables locales à chaque réentrée.

Même si la langue 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 variables identiques (tableau AKA), vous pouvez incrémenter/décrémenter un index global sur chaque entrée/sortie d'une fonction et d'un accès à l'aide d'un membre d'un ou plusieurs matrices.

Je ne sais pas si cela peut être appelé "soutien". Les faits sont que j'ai écrit une fonction récursive avec le ZX-Spectrum Basic, comme je l'ai fait à Fortran77 comme dans Cobol ... toujours avec ce tour.

1