Tuesday, May 19, 2009

About Haskell (A Short Introduction to Haskell) 번역 (5)

5. 강력한 지연평가
엄격하지 않은 함수형언어에는 답을 얻기 위해 필요한 만큼의 프로그램을 평가(실행)한다,는 강력한 특징이 있습니다. 이는 지연평가라고 불리웁니다. 이 특징은 Unix의 파이프에 비유될 수 있습니다. 예를 들면 Unix 명령어의

grep printf Foo.c | wc

는 Foo.c라는 파일 안의 printf라는 문자열을 포함하는 행의 수를 셉니다. "grep printf Foo.c"라는 명령어가 printf를 포함하는 모든 행을 표시해주는데 반해서, wc 명령어는 그 수를 셉니다. |는 파이프로서, 첫 명령어의 출력을 받아서 2번째의 프로그램으로 넘겨주는 역할을 합니다. 2번째 명령어는 동시에 실행되어서, 첫 명령어의 출력은 약간의 지연이 있기는 하여도, 그 직후에 사용되어 집니다. 이 방법에서는 크기가 큰 중간 파일을 만들 필요가 없습니다. wc는 grep에서 출력되는 행에 '의존하고 있다'라고 생각할 수 있습니다.

만일, 2번째 명력어가 첫 명령어의 출력의 일부만 사용한다고 하며, 첫 명령어는 (첫 명령어의 출력이) 끝까지 필요하지 않을 수 있습니다. 예를 들면,

grep printf Foo.c | head 5

는 printf가 포함되어 있는 행에서 첫 5개 행만을 표시합니다. grep의 실행을 중단해야 할지도 모르는 것을 고려한 프로그램으로 다시 작성할 필요가 없습니다.

엄격하지 않은 언어는 이와 같이 필요할 때만 평가하는 방법을 제공합니다.
명령어의 예에서 알 수 있듯이, 이는 기존의 프로그램을 짜기 위한 강력한 '지연성'을 제공합니다. 이는 명령형 프로그램을 작성하는 것보다, 프로그램의 재이용성이 높은 작은 프로그램으로 분할할 수 있다는 것을 나타냅니다. 지연평가에 의해서, 보다 모듈성이 높은 프로그램을 작성할 수 있습니다.

6. 강력한 추상화
일반적으로, 함수형언어는 추상화를 캡슐화하기 위한 강력한 새로운 기법을 가지고 있습니다. 추상화에 의해서 내부의 동작을 감추고 object를 정의하는 것이 가능해 졌습니다. 추상화는 모듈성이 높고 유지보수가 쉬운 프로그램을 구축하는데 있어서 핵심이 됩니다. 따라서, 새로운 언어에 대해서 '추상화를 위해 어떠한 메커니즘이 구현되어 있는가?'라는 것이 자주 문제가 됩니다.

함수형언어에 있어서 강력한 추상화 메커니즘으로는 고계함수가 있습니다. Haskell에서 함수는 first-class입니다. :함수는 다른 함수로 자유롭게 넘길수가 있으며, 함수의 되돌이값으로서 돌려줄 수도 있으며, 데이터 구조의 안에 수납할 수도 있습니다. 고계함수를 적절하게 사용함으로서 많은 프로그램의 구조나 모듈성을 향상시킬 수 있습니다.

7. 메모리 관리
많은 최신의 프로그램들은 힙 영역의 메모리를 자동적으로 확보해야만 합니다. C에서는 malloc을 통해서 이루어지고 있으며, 그 뒤로 그 영역을 초기화하는 코드가 이어집니다. 그 영역이 필요없게 되면 자유롭게 사용할 수 있는 메모리 풀로 되돌려주는 것은 프로그래며의 책임이며, 이것이 악명높은 dangling-pointer error의 근원이 됩니다. 더욱이 malloc은 상당히 화려한 함수로서, 프로그래머가 malloc을 통해서 커다란 덩어리를 확보하고, 그 안에서 '수동으로' 확보하는 경우도 자주 있습니다.

모든 함수형언어는 이러한 작업에서 프로그래머를 해방시킵니다. 메모리의 확보와 초기와는 암묵적인 상태에서 행해지며, 확보된 영역은 가베지 콜렉터에 의해서 자동적으로 회수됩니다. 이 기억영역의 확보와 가베지콜렉터의 기술은 현재 적절하게 성숙되어 있으며, 적은 코스트로 실행할 수 있습니다.

No comments: