최근 수정 시각 : 2025-02-24 01:00:38

GHC


Haskell
문법 · 특징(모나드) · 개발 환경(GHC) · 학습 · 도서 · 사용 소프트웨어 · 사용 기업
<colcolor=#fff> GHC
Glasgow Haskell Compiler
파일:Haskell 로고.svg파일:Haskell 로고.svg
<colbgcolor=#5e5086> 종류 Haskell 컴파일러
최초 개발자 Simon Marlow, Simon P Jones
촐시 1992년 12월
안정 버전 v9.12.1 (2024년 12월 16일)
언어 Haskell, C
라이선스 BSD 라이선스
링크 # Git
1. 개요2. 백엔드3. GHCi4. GHC 확장5. 관련 문서

[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 has more flags than the UN.
GHC 플래그가 UN 깃발 수보다 많다.
- shapr[4]

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부터

파일:CC-white.svg 이 문단의 내용 중 전체 또는 일부는 문서의 r548에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문단의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r548 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

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 깃랩