정식으로 프로그램하는 재미
이 광근
제대로 디자인된 언어로 프로그램을 작성할 때 얻을 수 있는 장점은 도대체
무엇일까? 그 대표적인 언어중 하나인
ML의 경우를 살펴보자.
작고 간단하다
- 문법이 작고 간단할 뿐만 아니라 그 의미구조 또한 간결하다.
극명한 예로, ML 참고서가 총 261쪽이고, 초보자를 위한
Ullman의 입문서가
380쪽인 반면, C++ 의 경우는 각각 600쪽이 모두 넘는다.
C? no. C++? no. Java? no.
안전하다
- 수행중인 프로그램의 완전한 안정성이 보장되어 있다. 즉, 컴파일러를
통과한 프로그램은 실행중에 파행적으로 중단되는 경우가 (core dump 나
segmentation fault등이) 발생하지 않는다.
C? no. C++? no. Java? no.
- 이것은 언어 갖추고있는 강력한 타입 시스템 때문인데,
ML에서는 특히, 타입 검사를
타입 유추를 이용해서 자동으로 하기 때문에
프로그래머가 변수의 타입을 표기할 필요가 없다.
C? no. C++? no. Java? no.
타입에 얽매이지 않는 함수도 정의할 수 있다
- 하나의 함수로, 타입은 다르지만 하는 일이 같은 함수들을 표현할
수 있기 때문에 프로그램하기가 경제적이고, 타입검사를 하는 언어가 가지는
경직성이 없다.
C? yes. C++? yes. Java? no.
편향된 프로그래밍 관성에서 벗어날 수 있다
- 함수가 특이한 대상이 아니고, 여타 다른값과 구분 없이 (higher-order
functions) 다루어 진다. 따라서, 함수형 언어에서 개발된 프로그램
기술들이 (stream, infinite data structures, process networks 등이)
자연스럽게 표현될 수 있다.
C? no. C++? no. Java? no.
-
또한, 메모리주소나 지정문 (assignment)
등으로 발생하는 메모리 반응들도 (side-effect들도) 표현가능 하다.
C? yes. C++? yes. Java? yes.
정제된 모듈 처리기능을 갖추고 있다
- 대형의 소프트웨어 개발에 꼭 필요한, 안전한 분리 컴파일 기능이
제공되어 있다.
C? no. C++? no. Java? no.
- 또한, 모듈을 일반화 시켜서 (parameterized module을) 정의할 수
있기때문에, 하나의 모듈을 필요에 따라 구체화해서 재 사용할 수 있다.
C? no. C++? yes. Java? no.
자동으로 메모리를 관리해 준다
- 효율적인 메모리 재활용 시스템이 (garbage collection이) 제공되기 때문에
프로그래머가 메모리의 부족이나 재사용등에 대한 부담에서 자유롭다.
C? no. C++? no. Java? yes.
예외상황 관리 매카니즘을 갖추고 있다
- 이것을 이용 해서, 프로그램의 실행 중에 발생할 수 있는
긴급상황들을 (예를 들면, x/y 에서 y 값이 0인 경우들을)
정황에 맞게 적절히 처리할 수 있다.
C? yes. C++? yes. Java? yes.
정형적인 의미구조를 갖추고 있다
- 프로그램을 이해하는 데 필요한 정확한 정의가 제공되어 있다. 따라서,
프로그램의 의미에 혼동의 여지가 없으므로 프로그램을 분석하고 관리하는
작업이 용이하다.
C? no. C++? no. Java? no.
프로그래밍의 미학
- 대형의 고난도 프로그램이 드러내는 복잡성을 다룰 수 있는 프로그래밍
원리와 미학이 자연스럽게 표현된다.
C? no. C++? OO bubble. Java? OO bubble.
이러한 프로그래밍 언어가 실제 사용된 예
/Standard ML
/OCaml
/nML
/Scheme
/Haskell