Я не уверен, что это делает COBOL (это точно не было когда-то), но я не могу даже вообразить, что кому-то это небезразлично.
Fortran существует с Fortran 90, но требует, чтобы вы использовали recursive
ключевое слово, чтобы сказать ему, что подпрограмма рекурсивна.
PL / I был почти таким же - рекурсия поддерживалась, но вы должны были явно указать ей, какие процедуры были рекурсивными.
Я сомневаюсь, что есть намного больше чем это все же. Когда вы дойдете до этого, запрет рекурсии был в основном тем, что IBM сделала в своих языковых разработках по той простой причине, что мэйнфреймы IBM (360/370/3090 / ...) не поддерживают аппаратный стек. Когда большинство языков пришло от IBM, они в основном запрещали рекурсию. Теперь, когда все они приходят из других мест, рекурсия всегда разрешена (хотя я должен добавить, что несколько других машин, особенно оригинальный Cray 1, также не имели аппаратной поддержки стека).
notably the original cray 1
Итак, вам не нужна рекурсия для клонирования динозавров? Я полагаю, что на самом деле мы, обезьяны, должны качаться сквозь деревья.Википедия говорит:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
источник
Язык программирования OpenCL не поддерживает рекурсию. (см. раздел 6.8 спецификации OpenCL )
В настоящее время мотивация заключается в том, чтобы: а) нехватка места для глубоких стеков; б) желание статически знать общее требуемое распределение, чтобы оптимизировать производительность при наличии больших наборов регистров и обширного встраивания.
Это вполне может относиться к другим языкам программирования GPU, например, к шейдерным языкам.
источник
Некоторые компиляторы c для небольших микроконтроллеров не поддерживают рекурсию, предположительно потому, что они имеют чрезвычайно ограниченный размер стека.
источник
BASIC, во времена номеров строк, имел тенденцию иметь плохую поддержку рекурсии. Многие (все?) ОСНОВЫ того времени поддерживали вложенные вызовы gosub, но не поддерживали простой способ передачи параметров или возвращаемых значений таким образом, чтобы сделать его полезным для самостоятельного вызова.
У многих ранних компьютеров были проблемы с рекурсией, потому что они использовали инструкции вызова, которые записывали адрес возврата в начало подпрограммы (PDP8, семейство компьютеров IAS, вероятно, больше архитектур, с которыми я не знаком), обычно таким образом, что это был машинный код для «Перейти к инструкции после той, которая вызывала подпрограмму».
источник
Это зависит от того, что вы подразумеваете под « поддержкой ». Для поддержки рекурсии вам нужен стек, в котором для каждого повторного входа необходимо создавать экземпляры локальных переменных.
Даже если в языке нет понятия локальных переменных, если в нем есть понятие «подпрограмма» и есть способ управлять индексированием между одинаковыми переменными (иначе говоря, массивом), вы можете увеличивать / уменьшать глобальный индекс при каждом входе / выходе функции и доступ через нее к члену одного или нескольких массивов.
Я не знаю, можно ли это назвать «поддержкой». Факты в том, что я написал рекурсивную функцию с помощью ZX-Spectrum BASIC, как я делал это в Fortran77, как в COBOL ... всегда с этим трюком.
источник
Язык ассемблера напрямую не поддерживает рекурсию - вы должны «сделать это сами», обычно путем помещения параметров в стек компьютера.
источник
CALL
инструкция, которая автоматически помещает IP-адрес в стек перед переходом к подпрограмме, иRET
инструкция, которая вставляет адрес возврата в IP-адрес. Нет причин, по которым ты не можешь открытьCALL
свою собственную точку входа.void f() { f(); }
является рекурсивным