[완료] 요즘 컴파일러가 똑똑한건가요?
글쓴이: Silvester / 작성시간: 토, 2011/11/12 - 10:23오후
스칼라라는 언어의 컴파일러입니다.
리스트를 표현하는 방식이 List(1,2,3) 이면 이건 곧 1::2::3::Nil (Null과 같음) 으로 표현가능합니다
따라서 함수에서도 패턴매칭을 통해 재귀 함수로 표현하려고 하면
line 3 : case Nil => 스레드 덤프 예외
line 4 : case x :: xs => print(x) + function(xs)
으로 표현가능합니다. 보통 컴파일러 같으면 스택 프레임에서 호출한 횟수를 세줄거라고 생각하는데요
즉 예시에서 살펴보면 function(4), function(4), function(4), function(3) 이렇게 호출될 거라고 생각하는데 실제로는 function(line : 3)만 호출이 됩니다.
요즘 컴파일러가 똑똑한걸까요 -_-;
Forums:
tail call optimization
아닌가요?
line 4 의 +는 오자인 것 같고, 뭐 { print(x); function(xs) } 라고 하면,
Scala에서 recursion 이 루틴의 가장 마지막에 일어나면, tail call optimization 을 합니다. 즉 recursion 을 loop으로 바꿉니다. 대부분의 함수형 언어에서 이걸 하고 있죠. 만약에 이걸 못하게 하려면 컴파일시 -g:notailcalls 옵션을 주면 됩니다.
만약에 { x :: function(xs) } 같은 경우라면 마지막 operation 이 :: 이기 때문에 Scala는 tail call optimization 을 못합니다. (Scala를 만든 사람에 의하면) JVM 때문에 하기가 매우 어렵다고 하네요. Scala가 이쪽에 좀 약합니다.
이와는 별개로 Scala 컴파일러는 굉장히 "똑똑" 하죠.
그런데 굉장히 복잡해서 compile time 에 일어나는 세세한 디테일을 알기가 힘들어서 3rd party툴을 만들기가 힘들다고 하더군요.
감사합니다.
이해가 잘되네요 :)
오늘도 달린다. :)
댓글 달기