내가 아는 한, 모든 현대적인 명령형 프로그래밍 언어는 프로 시저가 스스로 호출 할 수 있다는 의미에서 재귀를 지원합니다. 항상 그런 것은 아니지만 빠른 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(); }재귀 적입니다.