Haskell |
문법 · 특징(모나드) · 개발 환경(GHC) · 학습 · 도서 · 사용 소프트웨어 · 사용 기업 |
<colcolor=#fff> GHC Glasgow Haskell Compiler | |
| |
<colbgcolor=#5e5086> 종류 | Haskell 컴파일러 |
최초 개발자 | Simon Marlow, Simon P Jones |
촐시 | 1992년 12월 |
안정 버전 | v9.12.1 (2024년 12월 16일) |
언어 | Haskell, C |
라이선스 | BSD 라이선스 |
링크 | # Git |
[clearfix]
1. 개요
프로그래밍 언어 Haskell의 컴파일러 구현체.2. 백엔드
기본적으로 각 플랫폼에 맞는 네이티브 코드로 컴파일되지만, JavaScript 등 다른 언어로 컴파일하는 것도 가능하다.[1] 내부적으로 하스켈 코드를 Cmm이라는 중간 언어로 번역한 후 이를 타켓으로 지정된 백엔드에서 알맞은 최종 결과물로 변환한다. 이는-f
플래그로 변경 가능하며, 지원 가능한 백엔드 구현체는 다음과 같다.-fasm
: 기본 네이티브 컴파일러. 흔히 LLVM 옵션과 비교해 NCG(Native Code Generator)라고 부르기도 한다. 아무 플래그도 없을 시 기본 동작이며 이후 별도의 IR 없이 최종 실행 파일 및 라이브러리를 생성한다.-fllvm
: LLVM 백엔드. Cmm을 LLVM IR로 변환한 후 다시 네이티브로 컴파일한다. 사용하기 위해서 빌드 환경에 최소 llvm-13 이상의 종속성이 필요하다. LLVM 특유의 느린 컴파일 속도 때문에 대부분의 경우 NCG로 충분하지만, 복잡한 수치해석 연산이나 Simd 느낌의 벡터 연산 사용이 잦다면 LLVM으로 빌드 시 런타임 속도가 개선될 수 있다. RISC-V처럼 일반적으로 NCG가 잘 지원하지 않는 타겟으로 크로스 컴파일 할 때도 어쩔 수 없이 쓰게 된다.-fvia-C
: C 코드 백엔드. GHC 7.0에서 deprecated되었다.[2]
3. GHCi
interactive GHC의 약자[3]로 터미널 환경에서 사용할 수 있는 REPL 및 기초적인 디버거 구현체이다. 일반적으로ghci
명령어로 실행할 수 있지만 Stack과 같이 사용하는 경우 stack repl
을 입력해도 GHCi를 실행한다.하스켈 코드 및 표현식 외에도 GHCi에서만 사용할 수 있는 간단한 명령어가 있으며,
:
으로 시작한다.:?
- 모든 명령어 및 도움말 표시:!
- GHCi 세션을 나가지 않고 셸 명령어를 실행한다.:load
- 개별 파일을 스크립트 형태로 로드한다. 로드할 파일을 컴파일 시(파일명, interpreted)
로 표시된다.:type
- 표현식의 추론된 타입을 표시한다. 디버깅 용도로 가장 자주 쓰이는 명령어 중 하나로, 예를 들어:type \x->x
를 입력하면:: p -> p
등으로 추론된다.:quit
- GHCi 세션을 종료한다. 물론 Ctrl + D를 눌러 EOF를 보내는 전통적인 방법도 있다.
4. GHC 확장
GHC 확장(extension)은 하스켈 컴파일러 GHC에서 제공하는 추가 기능이다. 소스 코드 상단에 선언해서 확장을 사용할 수 있다. 예를 들어
FooBar
라는 이름의 확장을 사용하려면 아래처럼 적는다.{-# LANGUAGE FooBar #-}
GHCi 인터프리터에서 확장을 사용하려면 아래와 같이 입력한다.:set -XFooBar
다음과 같은 목록 등이 있다. 확장의 종류가 너무 많아서 여기에 모두 적기는 곤란하다.OverloadedStrings
LambdaCase
GADTs
한편 언어 에디션(language edition)은 여러 GHC 확장의 묶음이다. 언어 에디션별로 지원하는 확장의 개수는 아래 표와 같다.[5]
에디션 | 확장 개수 | GHC 버전 |
Haskell98 | 10 | |
Haskell2010 | 7 | |
GHC2021 | 47 | 9.2.1부터 |
GHC2024 | 54 | 9.10.1부터 |
5. 관련 문서
[1] 다만 JavaScript backend는 현재 preview 기능으로, 일반적으로 배포되는 GHC에서는 쓸 수 없다.[2] generally not included any more having been deprecated around GHC 7.0. #[3] The “i” stands for “Interactive” #[4] QuotesPage하스켈 위키[5] Controlling editions and extensionsGHC 깃랩