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

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

== 절차 ==
일반적인 부트스트랩 절차는 세 단계 혹은 네 단계로 이루어진다.<ref name=":0">{{웹 인용|url=https://gcc.gnu.org/install/build.html|제목=Installing GCC: Building - GNU Project|확인날짜=2022-06-03}}</ref><ref>{{웹 인용|url=https://github.com/rust-lang/rust|제목=rust/src/bootstrap at master · rust-lang/rust|언어=en|확인날짜=2022-06-03}}</ref><ref>{{웹 인용|url=https://llvm.org/docs/AdvancedBuilds.html#stage-non-determinism|제목=Advanced Build Configurations — LLVM 15.0.0git documentation|확인날짜=2022-06-03}}</ref>

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

완전한 컴파일러는 두 개 스테이지의 결과물을 비교하기 위해 두 번 만들어진다. 만약 두 결과물이 다르면 부트스트랩 컴파일러 또는 완전한 컴파일러가 버그를 갖고있다는 뜻이다.<ref name=":0" />

== 장점 ==
컴파일러를 부트스트래핑 하는 것은 다음과 같은 장점들을 가진다:<ref>Compilers and Compiler Generators: An Introduction With C++. Patrick D. Terry 1997. International Thomson Computer Press. {{ISBN|1-85032-298-8}}</ref>
<ref name="terry">
"Compiler Construction and Bootstrapping"
by P.D.Terry 2000.
[http://www.oopweb.com/Compilers/Documents/Compilers/Volume/cha03s.htm HTML] {{웨이백|url=http://www.oopweb.com/Compilers/Documents/Compilers/Volume/cha03s.htm |date=20091123154911 }}.
[http://webster.cs.ucr.edu/AsmTools/RollYourOwn/CompilerBook/CHAP03.PDF PDF] {{웨이백|url=http://webster.cs.ucr.edu/AsmTools/RollYourOwn/CompilerBook/CHAP03.PDF |date=20101214135219 }}.
[http://cm.bell-labs.com/who/ken/trust.html HTML] {{웹아카이브|url=https://archive.today/20120525231611/http://cm.bell-labs.com/who/ken/trust.html |날짜=2012년 5월 25일 }}.
</ref>

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

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

* [[인터프리터]] 또는 Y 언어를 사용하여 X언어를 위한 [[컴파일러]]를 작성한다. [[니클라우스 워스]](Niklaus Wirth)는 그가 첫 번째 [[파스칼 (프로그래밍 언어)|파스칼]] 컴파일러를 [[포트란]]으로 작성했다고 밝혔다.
* X 언어를 위한 또다른 인터프리터 또는 컴파일러가 Y 언어로 작성되었다; 이는 [[스킴 (프로그래밍 언어)|스킴]] 이 종종 부트스트랩 되는 방법이다.
* X 언어를 위한 컴파일러의 초창기 버전들은 컴파일러가 존재하는 X 언어의 일부만을 사용해서 작성되었다. 이는 [[JAVA (프로그래밍 언어)|JAVA]], [[하스켈 (프로그래밍 언어)|하스켈]], 초기 [[프리 파스칼]]을 포함하는 언어들의 컴파일러가 종종 부트스트랩되는 방법이다.
* X 언어로 컴파일러를 만든 뒤, 직접 (주로 최적화가 부족한 방법으로) 컴파일한다. 그 다음 그 컴파일러를 다시 그 컴파일러의 코드에 적용하여 최적화된 컴파일러를 얻는다.
컴파일러를 배포하기 위한 방법으로 컴파일러의 가벼운(portable) 바이트코드 버전을 제공할 수 있다. 바이트코드 컴파일러가 (완전한) 컴파일러를 컴파일링하는 ''부트스트랩'' 프로세스를 수행할 수 있다. [[:en:Tombstone_diagram|T-diagram]]은 이러한 컴파일러 부트스트랩 기술을 설명하는 표기법이다. 때로는 어떤 시스템에서 돌아가는 복잡한 컴파일러를 얻는 가장 편리한 방법은 더 복잡한 어셈블러와 컴파일러를 사용하는 것이다.<ref>{{웹 인용|url=http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html|제목=Bootstrapping a simple compiler from nothing|날짜=2010-03-03|확인날짜=2022-06-03|archive-date=2010-03-03|archive-url=https://web.archive.org/web/20100303235322/http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html|url-status=}}</ref>

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

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

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

{{columns-list|colwidth=30em|
* [[에이다 (프로그래밍 언어)|Ada]]
* [[BASIC]]
* [[Burroughs B5000|Burroughs]] ALGOL
* [[C (프로그래밍 언어)|C]]
* [[C++]] (컴파일러 : [[Visual C ++]], [[clang]] 등)
* [[C 샤프(프로그래밍 언어)|C#]] 및 [[Visual Basic .NET]]( [[Microsoft Roslyn]]을 통해)
* [[CoffeeScript]]
* [[Common Lisp]]
* [[Crystal (프로그래밍 언어)|Crystal]]
* [[Embarcadero Delphi|Delphi]]
* [[Eiffel (프로그래밍 언어|Eiffel]]
* [[F 샤프 (프로그래밍 언어)|F#]]
* [[FASM]]
* [[팩터 (프로그래밍 언어)|팩터]]
* [[팬시 (프로그래밍 언어)|팬시]]
* [[프리 파스칼]]
* [[고 (프로그래밍 언어)|고]]
* [[하스켈 (프로그래밍 언어)|하스켈]]
* [[자바 (프로그래밍 언어)|자바]]
* [[머큐리 (프로그래밍 언어)|머큐리]]
* [[Modula-2]]
* [[님로드 (프로그래밍 언어)|님로드]]
* [[오베론 프로그래밍 언어|오베론]]
* [[OCaml]]
* [[파스칼 프로그래밍 언어|파스칼]]
* [[펄 6]] (컴파일러: [[Rakudo Perl]]과 [[Niecza Perl 6]] 모두 자기 호스팅)
* [[PL/I]]
* [[파이썬]]
* [[러스트 (프로그래밍 언어)|러스트]]
* [[스킴 (프로그래밍 언어)|스킴]]
* [[스칼라 (프로그래밍 언어)|스칼라]]
* [[스몰토크]]
* [[SML (프로그래밍 언어)|SML]]
* [[TypeScript]]
* [[발라 (프로그래밍 언어)|발라]]
* [[XPL]]
}}

== 참조 ==
<references/>

[[분류:컴파일러]]
[[분류:컴파일러 이론]]