컴퓨터, 풀어그림

하스켈은 뭐에 쓰나요?

감자봤어? 2023. 4. 10. 08:49

하스켈(Haskell)이 무엇 때문에 만들어졌는지 아무도 언급하지 않는 것이 놀랍군요.

다른 사람들이 언급한 것 외에도 하스켈은 프로그래밍 언어 연구─많은 테크니컬 회사들이 수백만 달러를 투자하고 있는 그 연구─에 독보적으로 유용합니다.

하스켈은 지연 계산 및 순수 함수만 작성할 수 있도록 의도적으로 제한된 실험적 언어에서 출발했습니다. 처음에는 다소 거칠게 설계되었어요. 텍스트 입력을 텍스트 출력으로 바꾸는 함수에 불과했지요. 몇몇 흥미로운 프로그램(예컨대 컴파일러)을 작성할 수 있었지만 다른 일(예컨대 웹 서버)을 하도록 프로그램을 작성하기엔 어려웠습니다. 지연 계산을 수행하기 위한 명백한 방법을 구현하느라 성능도 좋지 않았지요.

시간이 지나면서 하스켈은 달라졌습니다. 컴파일러가 수행할 일련의 명령어를 출력으로 내는 중간 단계를 다루기 어려웠으므로, 하스켈은 기본적으로 약간의 명령형 프로그램을 생성하기 위한 순수 함수형 언어에 머물러 있었습니다.

결국 하스켈의 지연 계산은 그래프 변환(graph rewriting, 방법은 제게 묻지 마세요) 기법을 이용하여 다시 구현되었으며, 이로 인해 성능이 좋아졌습니다. 게다가 모나드 효과(monadic effects)를 공고하게 장착함으로써 순수 함수형 언어의 입지를 유지하면서도 유용한 프로그램을 작성할 수 있었습니다. 모나드(monad)를 이용하면 실제 계산 효과를 내기 위해 다른 언어(주로 C)의 라이브러리를 호출할 수 있는데, 이 전과정은 하스켈에서 값으로 취급하는 모나드로 포장되었기 때문에 언어의 다른 영역을 오염시키지 않고 계산 효과 부분을 격리시킬 수 있었습니다.

효과 표현을 타입 체계로 수용하는 이 접근법은 프로그래밍 언어 연구의 상당한 진전이며, 그 결과 러스트(Rust)와 같은 언어를 기업에서 개발하도록 하는 촉발제가 되었습니다. 러스트에서는 변수 값을 변경하는 것을 타입으로 나타내도록 한정하였기 때문에 데이터 경쟁(data racing, 병렬 프로그램에서 데이터를 변경하려고 할 때, 오류가 발생하는 원인) 자체가 불가능합니다.

같은 맥락에서, 하스켈은 모나드형 옵션 타입과 모나드형 결과 타입을 널리 알렸으며, 이는 이후 개발되는 새로운 정적 타입 언어의 특징으로 자리잡게 되었습니다. 이는 부분적으로는 하스켈의 타입 체계가 고계 다형성(high-order polymorphism)─즉 타입 생성자가 값으로 표현되는 형태─을 지원하기 때문인데, 이로 인해서 다른 언어에서는 고정될 수밖에 없는 추상화 범주를 설계하고 실험해 볼 수 있게 되었습니다.

다른 분들이 답을 주신 것과 같이 기업형 응용 프로그램도 하스켈로 작성된 것이 있습니다. 그러나 이는 단순히 연구형 언어로서 발전함에 따른 “부수적인 결과”에 불과합니다. 하스켈은 언어 연구 분야에서 크나큰 성공을 거두었으며 매우 영향력이 높습니다.

 

(번역 글입니다. 원문은 https://qr.ae/prQLmL)