내가 아는 한, 모든 현대적인 명령형 프로그래밍 언어는 프로 시저가 스스로 호출 할 수 있다는 의미에서 재귀를 지원합니다. 항상 그런 것은 아니지만 빠른 Google 검색으로 어려운 사실을 찾을 수는 없습니다. 그래서 내 질문은 :
처음부터 재귀를 지원하지 않는 언어는 무엇이며 언제 지원이 추가 되었습니까?
내가 아는 한, 모든 현대적인 명령형 프로그래밍 언어는 프로 시저가 스스로 호출 할 수 있다는 의미에서 재귀를 지원합니다. 항상 그런 것은 아니지만 빠른 Google 검색으로 어려운 사실을 찾을 수는 없습니다. 그래서 내 질문은 :
처음부터 재귀를 지원하지 않는 언어는 무엇이며 언제 지원이 추가 되었습니까?
답변:
나는 COBOL이 확실하지는 않지만 (한 번에 확실하지는 않았지만) 아무도 돌보는 것을 상상할 수는 없습니다.
Fortran은 Fortran 90 이후부터 recursive
키워드를 사용하여 서브 루틴이 재귀적임을 알려야합니다.
PL / I는 거의 동일했습니다. 재귀가 지원되었지만 어떤 절차가 재귀 적이 었는지 명시 적으로 알려 주어야했습니다.
그래도 그보다 더 많은 것이 있는지 의심합니다. 그것에 도달하면 재귀를 금지하는 것은 IBM (360/370/3090 / ...) 메인 프레임이 하드웨어 스택을 지원하지 않기 때문에 IBM이 언어 디자인에서 주로 한 일이었습니다. 대부분의 언어가 IBM에서 왔을 때 주로 재귀를 금지했습니다. 이제 모두 다른 곳에서 왔으므로 재귀가 항상 허용됩니다 (그러나 원래 Cray 1과 같은 다른 일부 컴퓨터에는 스택에 대한 하드웨어 지원도 없었습니다).
notably the original cray 1
공룡을 복제하기 위해 재귀가 필요하지 않습니까? 나는 원숭이가 나무를 통해 스윙하는 것은 정말로 우리에게 달려 있다고 생각합니다.
위키피디아의 말 :
Fortran과 같은 초기 언어는 반환 주소의 위치뿐만 아니라 변수가 정적으로 할당 되었기 때문에 처음에는 재귀를 지원하지 않았습니다.
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
FORTRAN 77은 재귀를 허용하지 않으며, Fortran 90은 재귀 루틴을 명시 적으로 선언해야합니다.
대부분의 FORTRAN 77 컴파일러는 재귀를 허용하지만 일부 (예 : DEC)는 컴파일러 옵션을 사용해야합니다 (컴파일러 옵션 장 참조). Fortran 77 표준을 엄격하게 준수하는 GNU g77은 재귀를 전혀 허용하지 않습니다.
소형 마이크로 컨트롤러 용 일부 c 컴파일러는 스택 크기가 매우 제한되어 있기 때문에 재귀를 지원하지 않습니다.
" 지원 "의 의미에 따라 다릅니다 . 재귀를 지원하려면 모든 재진입시 로컬 변수를 다시 인스턴스화 할 스택이 필요합니다.
언어에 로컬 변수 개념이없는 경우에도 "서브 루틴"개념이 있고 동일한 변수 (일명 배열) 사이의 인덱싱을 관리 할 수있는 방법이 있으면 입력 / 종료 할 때마다 글로벌 인덱스를 증가 / 감소시킬 수 있습니다 하나 이상의 배열 멤버를 통해 함수에 액세스합니다.
이것이 "지원"이라고 할 수 있는지 모르겠습니다. 사실은 COBOL과 마찬가지로 Fortran77에서했던 것처럼 ZX-Spectrum BASIC으로 재귀 함수를 작성했습니다 ... 항상 그 트릭으로.
어셈블리 언어 는 재귀를 직접 지원하지 않습니다. 일반적으로 기계 스택에 매개 변수를 밀어 넣어 "직접 수행"해야합니다.
CALL
서브 루틴으로 건너 뛰기 전에 IP를 스택으로 자동 푸시하는 RET
명령어 와 리턴 주소를 IP로 팝 하는 명령어가 있습니다. CALL
자신의 진입 점을 지킬 이유가 없습니다 .
void f() { f(); }
재귀 적입니다.