1. 무척 어려운 연구를 하시는군요. 제 개인적인 지론은 "버그는 사람의 잘못된 습관에서 생긴다"인데, 그 습관까지 어느 정도 고쳐줄 수 있는 연구라니... 대단합니다.
2. 한글 관련 글 읽어 보았는데, 정말 멋진 글이네요. 읽을 수 없는 고대 문서들... 좋은 것도 많다고 듣기는 했는데... 가끔 나옵니다.(우리 역사에 어떤 수학자가 있었는데, 이러이러한 연구를 했다.) 수능에도 한 번 그 수학자의 연구를 소재로 했던 문제가 나왔던 기억이 납니다.
3. Programming Language Pragmatics, Dragon Book으로 유명한 Comiler 책. 어렵기로 유명한 책들이 생각나게 하는 글이었습니다.
이른바 함수형 언어들 중에서 가장 메이저라 할만한 언어는 lisp겠죠. 그 다음으로 ML류 언어들이 있을텐데 이 중에 OCaml은 실행 코드 결과물의 속도가 같은 알고리즘을 이용해서 C로 구현한 것과 동등한 수준이라고 알려져 있죠 ㅎㄷㄷ... C언어로 한 구현이 허접하다거나 한 것도 아닌데.. 어떻게 그게 가능한지 참 신기합니다.
보충 설명에 감사합니다.
괄호로 둘러싸서 연산자를 prefix 형태로 표기하는 문법은 LISP가 원조이며, Scheme 역시 그것의 변종 방언이죠.
OCaml은 재귀호출 코드를 내부적으로 비재귀 형태로 바꿔서 실행는 등, 최적화가 굉장히 잘 되어 있나 봅니다. (재귀호출을 비재귀로 바꾸는 원론적인 테크닉도 아마 이 광근 교수 PL 수업의 challenging 과제에서 봤던 것 같습니다.)
뭐 근데 사실 OCaml도 구현상 속도에 유리한 코딩방식이 어떤 것인지를 알아야만 그 성능을 100% 발휘할 수 있다는 점은 똑같습니다. 실제 기계의 low-level 구현과는 전혀 관계없이 완전히 수학적인 언어로 프로그램을 기술하려는 것이 함수형 언어인데, 현실에서 높은 성능을 끌어내려면 결국은 컴퓨터 내부 구조에 대해서도 잘 알아야만 한다는 점이 함수형 언어들의 딜레마가 아닌가 싶습니다.
참고로 재귀호출 코드를 비재귀로 바꾸는 테크닉은 웬만한 C나 C++ 구현에도 다 있습니다. 그리고 꼬리재귀라고 하는 테크닉이 있는데, 예를 들어서 다음 두 함수의 하는 일은 똑같지만 컴파일러에 따라서 생성되는 코드가 전혀 다를 수 있습니다.
int factorial(int n){
return n > 1 ? factorial(n-1) * n : n;
}
int factorial_tail(int n, int ret){
return n > 1 ? factorial_tail(n - 1, ret * n) : ret; // 비재귀 형태로 변환됨
}