뭔가 있어보이고 싶어하는 된장 프로그래머 여러분의 탁월한 선택, Objective Caml.
어딜가나 언어 공부의 시작은 Hello world가 딱이다.

(* (C) 2010 천재 호빵님 *)
let main = print_endline "Hello world!"

It's simple. Kill the Batman.

매우 단순한 코드지만 여기에는 ocaml에 대한 상당히 많은 정보가 담겨 있다.

우선 첫 줄.

(* (C) 2010 천재 호빵님 *)

뭐, 굳이 설명하지 않아도 프로그래머라면 누구나 보는 순간 안다. 주석이다. ocaml의 주석은 (* 로 시작하고 *)로 닫으며, C/C++의 한줄 주석은 없다. 주석에 잡다한 설명을 붙일 필요야 없겠지.

그 다음.

let main = print_endline "Hello world!"

print_endline이야 이름 보면 뭔지 바로 짐작 가는 녀석이니 넘어가자. let은 함수를 정의할 때 쓰는 예약어다. let ... in 이라는 예약어도 있지만 여기서 안 나오니까 넘어가자.

그런데, 저 main이 C에 있는 그 main일 것 같은가? 아니다. ocaml에는 그런 특별대우받는 함수 이름 따윈 없다. 저건 그냥 내 마음대로 붙인 이름일 뿐이고, 함수 이름은 뭘 붙여도 상관 없다. 예를 들면 이런 것도 된다.

let _ = print_endline "Hello world!"

저 '_' 는 함수형 언어에서는 대개 뭔가의 의미를 가지고 있는데, 뭔가 라는 단어가 다른 것을 가리키는 게 아니다. 뭔가(something) 그 자체다. 오늘은 이 쪽은 그냥 넘어가고. 아무튼 함수 이름은 뭐가 됐건 관계없다. main이라고 써서 일부려 헷갈려 보이게 만든 거니까 신경쓰지 말자.

let abracadabra = print_endline "Hello world!"

이래도 아무 문제 없다.

void hello() {
    printf("hello world!\n");
}

int main() {
    return 0;
}

C에선 이런 소스코드를 짜면 hello는 저 하늘 멀리로 증발해버린다. hello를 직접 불러주지 않는 이상 hello world!가 출력될 일은 없다. 그러나...

let imnotmain = print_endline "hello world!"
let main = print_endline "goodbye world!"

결과:
hello world!
goodbye world!

ocaml은 그런거 없다. 말했잖나. main은 훼이크라고.

그런데 반드시 이렇다는 건 아니다.

(* Objective Caml Hello World *)
let imnotmain x = print_endline "hello world!"
let main x = print_endline "goodbye world!"

컴파일시키면 결과는? 아무 것도 안 나온다. 어디서 차이가 난 걸까?

답은 x다. 잘 보면 함수 imnotmain과 main에 인자로 x가 붙어 있는데, ocaml은 인자가 있는 함수와 없는 함수를 다르게 취급한다. 함수형 언어의 특성상 인자가 없다면 반환값도 반드시 같을 수밖에 없기 때문이다. 굳이 비교하자면 하나는 함수고, 하나는 프로시저(함수는 입력과 출력이 기본이지만, 프로시저는 정해진 절차대로 작업을 진행한다는 의미가 강하다)다. 저기서 둘 중 하나의 x를 빼버리면 그 녀석은 제대로 출력을 한다.

그러니까, 위 삽질을 요약정리해 보면, ocaml 소스코드를 컴파일하면 그 안에 있는 인자 없는 함수만 순서대로 실행하는 코드가 나온다는 결론이 된다. 정확한지는 모르겠지만, 일단 눈에 보이는 결론은 그렇다.

여기까지 대충 Hello world 예제를 읽어봤는데(...) 원래 함수형 언어는 이런 거 하라고 만든 언어가 아니다. 나중에 시간 되면 ocaml 삽질 시리즈물이라도 나올 지 모르고... 뭐 그건 그때가서 생각하자.


크리에이티브 커먼즈 라이센스
Creative Commons License
2010/05/05 01:15 2010/05/05 01:15
Posted by 호빵

트랙백 주소
http://hoppang.net/tc/trackback/64

댓글을 달아 주세요

[로그인][오픈아이디란?]