부트스트랩 (컴파일러)

부트스트래핑(bootstrapping)은 컴퓨터 과학에서 컴파일러 (또는 어셈블러)를 컴파일 하고자 하는 프로그래밍 언어로 작성하는 과정이다. 이 기술의 적용은 셀프 호스팅 컴파일러로 이어진다.

BASIC, ALGOL, C, Pascal, PL/I, 팩터, 하스켈, Modula-2, 오베론, OCaml, Common Lisp, 스킴, 자바, 파이썬, 스칼라, 님로드, Eiffel 등 수많은 프로그래밍 언어들의 컴파일러들이 부트스트래핑 되었다.

절차 편집

일반적인 부트스트랩 절차는 세 단계 혹은 네 단계로 이루어진다.[1][2][3]

  1. Stage 0: 부트스트랩 컴파일러가 동작할 환경을 준비한다. 부트스트랩 컴파일러의 소스 언어와 생성될 출력 언어가 정의된다. 어떠한 언어를 위한 컴파일러도 존재하지 않는 베어 머신의 경우에는 소스와 출력은 바이너리 기계어로 쓰여지거나 타겟 머신이 아닌 다른 머신에서 크로스 컴파일러를 통해 만들어진다. 다른 컴파일러가 있는 경우에는 부트스트랩 컴파일러가 해당 언어로 작성되며, 부트스트랩 컴파일러는 고급 프로그래밍 언어, 어셈블리어, 오브젝트 파일 또는 기계어를 포함하여 타겟 머신에서 실행가능한 코드를 생성한다.
  2. Stage 1: 부트스트랩 컴파일러가 생성된다. 이는 소스코드를 타겟 머신에서 실행 가능한 코드로 변환하기 충분하다. 이 시점에서부터 부트스트랩 컴파일러에 의해 정의되는 언어를 사용한 모든 추가적인 개발이 이뤄지며 스테이지 2가 시작된다.
  3. Stage 2: 완전한 컴파일러가 부트스트랩 컴파일러에 의해 생성된다. 이것은 보통 필요한 만큼의 단계를 거치게 된다. 예를 들면 X 버전 언어의 컴파일러는 X+1 버전 언어의 기능을 컴파일 할 수 있다. 그러나 X+1 버전 언어의 기능을 사용할 수는 없다. 이 컴파일러가 테스트된 뒤 스스로를 컴파일할 수 있게 되면 X+1 버전 언어 컴파일러가 릴리즈되어 해당 기능을 사용할 수 있다.
  4. Stage 3: 완전한 컴파일러가 2-스테이지 컴파일러에 의해 생성된다. 추가적인 기능이 필요한 경우에는 현재 3-스테이지 컴파일러가 부트스트랩 컴파일러를 대신하여 2 스테이지에서 작업을 시작한다.

완전한 컴파일러는 두 개 스테이지의 결과물을 비교하기 위해 두 번 만들어진다. 만약 두 결과물이 다르면 부트스트랩 컴파일러 또는 완전한 컴파일러가 버그를 갖고있다는 뜻이다.[1]

장점 편집

컴파일러를 부트스트래핑 하는 것은 다음과 같은 장점들을 가진다:[4] [5]

  • 컴파일러 부트스트래핑은 컴파일될 언어에 대한 중대한 테스트이다.
  • 컴파일러 개발자들은 컴파일될 언어만 알면 된다.
  • 컴파일러 개발이 컴파일될 해당 고급 언어로 이루어질 수 있다.
  • 해당 컴파일러의 백엔드 개선이 범용 목적 프로그램 뿐만 아니라 해당 컴파일러 자신 또한 개선한다.
  • 컴파일러가 언어 자신의 목적코드를 재생산해 내어야 하므로 컴파일러 부트스트래핑은 포괄적인 일관성 검사이다.

닭이 먼저냐, 달걀이 먼저냐 문제 편집

만약 X 언어(X 언어로 작성될)를 위한 컴파일러를 얻을 필요가 있을 때 '어떻게 첫번째 컴파일러가 작성될 수 있는가'에 대한 문제가 생긴다. 이 닭이 먼저냐, 달걀이 먼저냐 문제를 해결하기 위해 현장에서 사용되는 각기 다른 방법들은 다음을 포함한다:

  • 인터프리터 또는 Y 언어를 사용하여 X언어를 위한 컴파일러를 작성한다. 니클라우스 워스(Niklaus Wirth)는 그가 첫 번째 파스칼 컴파일러를 포트란으로 작성했다고 밝혔다.
  • X 언어를 위한 또다른 인터프리터 또는 컴파일러가 Y 언어로 작성되었다; 이는 스킴 이 종종 부트스트랩 되는 방법이다.
  • X 언어를 위한 컴파일러의 초창기 버전들은 컴파일러가 존재하는 X 언어의 일부만을 사용해서 작성되었다. 이는 JAVA, 하스켈, 초기 프리 파스칼을 포함하는 언어들의 컴파일러가 종종 부트스트랩되는 방법이다.
  • X 언어로 컴파일러를 만든 뒤, 직접 (주로 최적화가 부족한 방법으로) 컴파일한다. 그 다음 그 컴파일러를 다시 그 컴파일러의 코드에 적용하여 최적화된 컴파일러를 얻는다.

컴파일러를 배포하기 위한 방법으로 컴파일러의 가벼운(portable) 바이트코드 버전을 제공할 수 있다. 바이트코드 컴파일러가 (완전한) 컴파일러를 컴파일링하는 부트스트랩 프로세스를 수행할 수 있다. T-diagram은 이러한 컴파일러 부트스트랩 기술을 설명하는 표기법이다. 때로는 어떤 시스템에서 돌아가는 복잡한 컴파일러를 얻는 가장 편리한 방법은 더 복잡한 어셈블러와 컴파일러를 사용하는 것이다.[6]

역사 편집

어셈블러는 스스로를 부트스트랩 하기 위한 첫번째 언어 도구였다.

셀프 호스팅 컴파일러를 가지고 있는 언어 목록 편집

아래 프로그래밍 언어들은 셀프호스팅 컴파일러를 가지고 있다:

참조 편집

  1. “Installing GCC: Building - GNU Project”. 2022년 6월 3일에 확인함. 
  2. “rust/src/bootstrap at master · rust-lang/rust” (영어). 2022년 6월 3일에 확인함. 
  3. “Advanced Build Configurations — LLVM 15.0.0git documentation”. 2022년 6월 3일에 확인함. 
  4. Compilers and Compiler Generators: An Introduction With C++. Patrick D. Terry 1997. International Thomson Computer Press. ISBN 1-85032-298-8
  5. "Compiler Construction and Bootstrapping" by P.D.Terry 2000. HTML Archived 2009년 11월 23일 - 웨이백 머신. PDF Archived 2010년 12월 14일 - 웨이백 머신. HTML 보관됨 2012-05-25 - archive.today.
  6. “Bootstrapping a simple compiler from nothing”. 2010년 3월 3일. 2010년 3월 3일에 원본 문서에서 보존된 문서. 2022년 6월 3일에 확인함.