글래스고 해스켈 컴파일러

Glasgow Haskell Compiler
글래스고 해스켈 컴파일러
원저작자케빈 해먼드
개발자글래스고 해스켈[1]
초기 릴리즈1992년 12월(1992-12)[2]
안정된 릴리스
9.2.3 / 2022년 5월 27일; 2개월 전 (2022년 [3]5월 27일)
저장소
기입처해스켈과 C
운영 체제Linux, OS X 10.7 Lion 이후, Windows 2000 이후, FreeBSD
플랫폼x86, x86-64, ARM
이용가능기간:영어
유형컴파일러
면허증.새로운 BSD 라이선스
웹 사이트www.haskell.org/ghc/

글래스고 해스켈 컴파일러(GHC)는 기능 프로그래밍 언어해스켈의 오픈 [4]소스 네이티브 코드 컴파일러입니다.Haskell 코드 작성 및 테스트를 위한 크로스 플랫폼 환경을 제공하며 코드 생성 및 실행 프로세스를 간소화하는 수많은 확장, 라이브러리 및 최적화를 지원합니다.GHC는 가장 일반적으로 사용되는 Haskell [5]컴파일러입니다.주요 개발자는 Simon Peyton Jones와 Simon Marlow입니다.

역사

GHC는 1989년 글래스고 대학의 케빈 해먼드가 LML(Lazy ML)로 작성한 프로토타입으로 시작되었습니다.그해 말, 시제품은 파서를 제외하고 코델리아 홀, 윌 파테인, 사이먼 페이튼 존스에 의해 하스켈에서 완전히 다시 쓰여졌다.첫 번째 베타 릴리스는 1991년 4월 1일이었고 이후 릴리스는 엄격도 분석기 및 모노딕 I/O, 가변 배열, 언박스 데이터 유형, 동시 및 병렬 프로그래밍 모델(소프트웨어 트랜잭션 메모리 및 데이터 병렬화) 및 프로파일러[2]같은 언어 확장을 추가하였다.

Peyton Jones와 Marlow는 나중에 영국 캠브리지에 있는 Microsoft Research로 이전하여 GHC 개발을 주로 담당했습니다.GHC에는 300명 이상의 다른 [1]기여자들의 코드도 포함되어 있습니다.2009년 이후, GHC에 대한 제삼자의 기여금은 Industrial Haskell [6]Group에 의해 지원되고 있습니다.

GHC 이름

초기[7] 릴리즈 이후 공식 웹사이트에서는 GHC를 Glasgow Haskell 컴파일러라고 부르고 실행 가능 버전 명령에서는 The Holory Glasgow Haskell Compilation [8]System이라고 부릅니다.이것은 [9]문서에 반영되어 있습니다.처음에는 글래머러스 글래스고 해스켈 [10]컴파일러라는 내부 이름을 가지고 있었습니다.

아키텍처

GHC 자체는 Haskell[11]작성되지만 프로그램 실행에 필수적인 Haskell용 런타임 시스템은 C와 C--작성됩니다.

렉서, 파서 및 타이프 체커를 포함하는 GHC의 프런트 엔드는 사용자에게 [2]명확한 오류 메시지를 제공하기 위해 유형 추론이 완료될 때까지 소스 언어에 대한 정보를 가능한 한 많이 보존하도록 설계되었습니다.타입 체크 후, Haskell 코드는 「Core」라고 불리는 타입의 중간 언어로 제외됩니다(시스템 F에 근거해, 다음과 같이 확장됩니다).let그리고.case표현)을 참조해 주세요.코어는 유형 시스템에서 일반화된 대수 데이터형을 지원하도록 확장되었으며, 현재는 시스템C [12]F로 알려진 시스템 F에 대한 확장에 기초하고 있습니다.

타입 다이렉트 컴파일의 전통에서는 GHC에서 구현되는 최적화의 대부분이 실행되는 GHC의 심플라이어(middle end)는 코어 코드에서 일련의 소스소스 변환으로 구조화되어 있습니다.이 컴파일러 단계에서 실행되는 분석 및 변환에는 수요 분석(도 분석의 일반화), 사용자 정의 개서 규칙(폴더/빌드 퓨전을 실행하는 GHC의 표준 라이브러리에 포함된 규칙 세트 포함), 전개(기존 컴파일러에서는 "인라인"이라고 함), 플로팅(let-floating)이 포함됩니다.n 어떤 함수 인수를 박스 해제할 수 있는지 결정하는 분석, 구성된 제품 결과 분석, 과부하 함수의 전문화 및 지속적인 폴딩 및 베타 [13]감소와 같은 일련의 간단한 로컬 변환.

컴파일러의 백엔드는 중간 언어 STG(Spinless Tagless G-machine)[14]를 통해 코어 코드를 C--의 내부 표현으로 변환합니다.C--코드는 다음 세 가지 경로 중 하나를 선택할 수 있습니다.GCC를 사용한 컴파일을 위해 C코드로 인쇄되거나 네이티브 머신코드로 직접 변환되거나(기존의 「코드 생성」단계), LLVM을 사용한 컴파일을 위해 LLVM IR로 변환됩니다.이 세 가지 경우 모두 결과 네이티브 코드는 최종적으로 GHC 런타임 시스템에 링크되어 실행 가능 파일을 생성한다.

언어

GHC는 Haskell 98[15]Haskell 2010 [16]언어 표준을 준수합니다.또한 Haskell 표준에 대한 많은 옵션 확장도 지원합니다. 예를 들어 컴포지터블 메모리 트랜잭션을 허용하는 소프트웨어 트랜잭션 메모리(STM) 라이브러리입니다.

Haskell 확장 기능

해스켈에 대한 여러 가지 연장이 제안되었다.이러한 확장자는 언어 사양에서 설명되지 않은 기능을 제공하거나 기존 구성을 재정의합니다.따라서 모든 Haskell 구현에서 각 확장이 지원되는 것은 아닙니다.확장기능을 설명하고 향후 언어사양 버전에 포함될 확장기능을 선택하기 위해 계속 노력하고[17] 있습니다.

Glasgow Haskell 컴파일러에서 지원되는 확장 기능은[18] 다음과 같습니다.

  • 개봉된 유형 및 작업.이들은 힙에 대한 포인터의 방향 변경이나 평가가 지연될 가능성이 없는 기본 하드웨어의 원시 데이터 유형을 나타냅니다.이러한 타입을 사용해 코드화하면, 수치적으로 많은 코드의 처리 속도가 큰폭으로 빨라집니다.
  • 값, 패턴 바인딩 또는 데이터 유형 필드에 대해 엄격한 평가를 지정하는 기능.
  • 모듈, 패턴, 목록 통합, 연산자, 레코드 및 튜플을 사용하기 위한 보다 편리한 구문입니다.
  • 화살표와 재귀적으로 정의된 단수 값을 계산하는 데 사용되는 구문 설탕입니다.이 두 가지 개념은 모두 단일 개념을 확장합니다.표준 Haskell에서 제공되는 작업 지침.
  • 아래 설명과 같이 훨씬 더 강력한 유형 및 유형 클래스 시스템입니다.
  • 템플릿 해스켈, 컴파일 시간 메타프로그래밍 시스템.프로그래머는 추상 구문 트리의 형태로 Haskell 코드를 생성하는 식을 작성할 수 있습니다.이러한 표현식은 컴파일 시에 타입 체크 및 평가되며 생성된 코드는 프로그래머가 직접 작성한 것처럼 포함됩니다.정의를 반영할 수 있는 기능과 함께 언어 확장을 위한 강력한 도구를 제공합니다.
  • 준인용 - 표현식 및 패턴에 대한 새로운 구체적인 구문을 정의할 수 있습니다.준인수는 해스켈로 작성된 메타프로그램이 해스켈 이외의 언어로 작성된 코드를 조작할 때 유용합니다.
  • 범용 타입 클래스: 조작하는 타입의 대수 구조만으로 함수를 지정합니다.
  • 여러 CPU 코어를 사용하여 식을 병렬로 평가합니다.여기에는 명시적으로 스레드를 산란할 필요가 없습니다.작업의 분배는 프로그래머가 제공한 주석을 기반으로 암묵적으로 이루어집니다.
  • 인라인 확장 및 특정 유형의 특수 함수와 같은 최적화를 지시하는 컴파일러 플러그마.
  • 커스터마이즈 가능한 개서 규칙.프로그래머는 하나의 식을 동등하지만 보다 효율적으로 평가된 식으로 대체하는 방법을 설명하는 규칙을 제공할 수 있습니다.이들은 핵심 데이터 구조 라이브러리 내에서 사용되며 애플리케이션 수준 [19]코드 전체에서 향상된 성능을 제공합니다.
  • 도트 구문을 기록합니다.다른 많은 프로그래밍 [20]언어의 구문과 유사한 (잠재적으로 중첩된) 레코드의 필드에 액세스하기 위한 구문설탕을 제공합니다.

시스템 확장자 입력

표현형 정적 유형 시스템은 Haskell의 주요 정의 기능 중 하나입니다.따라서 언어를 확장하기 위한 작업의 대부분은 유형 및 유형 클래스로 향하고 있습니다.

Glasgow Haskell 컴파일러는 이론적인 시스템C [12]F에 기반한 확장형 시스템을 지원합니다.유형 시스템의 주요 확장 기능은 다음과 같습니다.

  • 임의 순위 및 추정 다형성.기본적으로, 다형 함수 또는 데이터형 생성자는 그 인수 중 하나가 다형이어야 할 수 있습니다.
  • 일반화 대수 데이터 유형.폴리모픽 데이터 타입의 각 컨스트럭터는 정보를 결과 타입으로 부호화할 수 있다.이 유형의 패턴 일치 함수는 컨스트럭터별 정보를 사용하여 데이터에 대해 보다 구체적인 작업을 수행할 수 있습니다.
  • 실존형이러한 기능을 사용하여 일부 데이터를 해당 데이터에 대한 작업과 함께 "번들"할 수 있으며, 이를 통해 특정 유형의 기본 데이터를 노출하지 않고도 작업을 사용할 수 있습니다.이러한 값은 객체 지향 프로그래밍 언어에서 볼 수 있는 객체와 매우 유사합니다.
  • 실제 값을 포함하지 않는 데이터 유형입니다.이는 유형 수준의 메타프로그래밍에서 데이터를 표현하는 데 유용할 수 있습니다.
  • 유형 패밀리: 유형에서 유형으로 사용자 정의 함수.파라메트릭 다형성은 모든 타입 인스턴스화에 동일한 구조를 제공하는 반면 타입 패밀리는 인스턴스화에 따라 다를 수 있는 구현과 함께 애드혹 다형성을 제공합니다.사용 사례에는 콘텐츠 인식 최적화 컨테이너 및 유형 레벨 메타프로그래밍이 포함됩니다.
  • 다이내믹 스코프를 가진 암묵적인 함수 파라미터.이들은 유형 클래스 제약 조건과 거의 동일한 방식으로 유형으로 표현됩니다.
  • 선형 유형(GHC 9.0)

유형 클래스와 관련된 확장은 다음과 같습니다.

  • 유형 클래스는 여러 유형에서 매개 변수를 지정할 수 있습니다.따라서 유형 클래스는 유형 집합뿐만 아니라 유형에 대한 n-ary 관계를 설명할 수 있습니다.
  • 함수 의존성 - 그 관계의 일부가 유형에 대한 수학적 함수가 되도록 제한합니다.즉, 제약조건은 다른 파라미터 세트가 고정되면 일부 유형 클래스 파라미터가 완전히 결정되도록 지정합니다.이것은 애매모호할 수 있는 상황에서 유형추론의 과정을 안내한다.
  • 유형 클래스 인스턴스의 허용 가능한 모양에 대한 상당히 완화된 규칙입니다.이것들을 완전하게 유효하게 하면, 타입 클래스 시스템은 컴파일시에 논리 프로그래밍을 위한 튜링 완전 언어가 됩니다.
  • 위에서 설명한 대로 유형 패밀리를 유형 클래스와 연결할 수도 있습니다.
  • 특정 유형 클래스 인스턴스의 자동 생성은 여러 가지 방법으로 확장됩니다.일반 프로그래밍 및 공통 재귀 패턴에 대한 새로운 유형 클래스가 지원됩니다.또한 새로운 유형이 기존 유형과 동형이라고 선언된 경우 기본 유형에 대해 선언된 모든 유형 클래스 인스턴스는 "for free" 새로운 유형으로 들어올릴 수 있습니다.

휴대성

GHC 버전은 Windows 및 대부분의 Unix(Linux, FreeBSD, OpenBSD, macOS [21])를 포함한 여러 플랫폼에서 사용할 수 있습니다.또한 GHC는 여러 다른 프로세서 [21]아키텍처로 이식되어 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "The GHC Team". Haskell.org. Retrieved 1 September 2016.
  2. ^ a b c Hudak, P.; Hughes, J.; Peyton Jones, S.; Wadler, P. (June 2007). "A History of Haskell: Being Lazy With Class" (PDF). Proc. Third ACM SIGPLAN History of Programming Languages Conference (HOPL-III). Retrieved 1 September 2016.
  3. ^ "Download — The Glasgow Haskell Compiler". Haskell.org.
  4. ^ "The Glorious Glasgow Haskell Compilation System User's Guide". Haskell.org. Retrieved 27 July 2014.
  5. ^ "2017 state of Haskell survey results". taylor.fausak.me. 15 November 2017. Retrieved 11 December 2017.
  6. ^ "Industrial Haskell Group". Haskell.org. 2014. Retrieved 1 September 2016.
  7. ^ "GHC The Glasgow Haskell Compiler". Haskell.org. Retrieved 14 January 2022.
  8. ^ "Repository: configure.ac". gitlab.haskell.org. 12 January 2022. Retrieved 14 January 2022.
  9. ^ "The Glorious Glasgow Haskell Compilation System User's Guide, Version 7.6.3". downloads.haskell.org. Retrieved 14 January 2022.
  10. ^ "ghc-0.29-src.tar.gz" (tar gzip). downloads.haskell.org. File: ghc-0.29/ghc/PATCHLEVEL. Retrieved 14 January 2022.
  11. ^ "GHC Commentary: The Compiler". Haskell.org. 23 March 2016. Archived from the original on 23 March 2016. Retrieved 26 May 2016.
  12. ^ a b Sulzmann, M.; Chakravarty, M. M. T.; Peyton Jones, S.; Donnelly, K. (January 2007). "System F with Type Equality Coercions". Proc. ACM Workshop on Types in Language Design and Implementation (TLDI).
  13. ^ Peyton Jones, S. (April 1996). "Compiling Haskell by program transformation: a report from the trenches". Proc. European Symposium on Programming (ESOP).
  14. ^ Peyton Jones, S. (April 1992). "Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine, Version 2.5". Journal of Functional Programming. 2 (2): 127–202. doi:10.1017/S0956796800000319.
  15. ^ "Haskell 98 Language and Libraries: The Revised Report". Haskell.org. Retrieved 28 January 2007.
  16. ^ "Haskell 2010 Language Report". Haskell.org. Retrieved 30 August 2012.
  17. ^ "Welcome to Haskell' (Haskell Prime)". Haskell.org. Archived from the original on 20 February 2016. Retrieved 26 May 2016.
  18. ^ "GHC Language Features". Haskell.org. Archived from the original on 29 June 2016. Retrieved 25 May 2016.
  19. ^ Coutts, D.; Leshchinskiy, R.; Stewart, D. (April 2007). "Stream Fusion: From Lists to Streams to Nothing at All". Proc. ACM SIGPLAN International Conference on Functional Programming (ICFP). Archived from the original on 23 September 2007.
  20. ^ Mitchell, Neil; Fletcher, Shayne (3 May 2020). "Record Dot Syntax". ghc-proposals. GitHub. Retrieved 30 June 2020.
  21. ^ a b 플랫폼(gitlab.haskell.org)

외부 링크