부트스트랩(Bootstrap), 부트스트래핑(Bootstrapping)

위키피디아의 설명에 따르면 부트스트랩이란 Boot(s) + Strap의 합성어로서 부츠(Boots)의 뒷 부분에 달린 끈 혹은 고리(Strap)를 말한다. 이 부트스트랩은 요즘 신발에도 달려나온다.

부트스트랩

출처: http://skyvington.blogspot.com/2008/05/boot-story.html

긴 부츠의 경우에는 발을 끝까지 넣기 힘들기 때문에 발을 넣고 부트스트랩이라는 이 고리에 손가락을 넣고 당겨서 부츠를 신는다. 부트스트랩이란 단어에 얽힌 to pull oneself up by one's bootstraps라는 표현도 있다. 어떤 사람이 신발을 신은 채로 자신의 신발에 붙어있는 부트스트랩으로 자신을 들어 올린다는 뜻이다. 말도 안되는 표현이지만, 시간이 지나면서 이 표현은 불가능한 일을 의미하고 있지만 자력으로 일을 해낸다는 의미로 바뀌는데 컴퓨터 분야에서는 보통 한 번 시작하면 다른 외부의 도움없이 스스로 진행하는 행위를 통틀어 사용하고 있다.

부팅

부트스트랩이라는 단어를 사용하는 대표적인 예가 부팅(Booting)인데, 이는 부트스크랩의 진행형인 Bootstrapping을 줄여서 표현한 단어이다.

부팅은 대부분 사람들은 단순히 컴퓨터 전원을 켜는 행위 혹은 전원을 켜서 윈도우나 맥의 OS화면이 나올때까지의 절차로 알고 있다. 맞는 말이긴 한데, 좀 더 자세히 설명을 하자면 컴퓨터 전원을 켜면 BIOS(Basic Input/Output System)가 실행된다. BIOS에서 CPU, 메모리 등의 주변 하드웨어를 진단 후에 부팅매체(보통 하드디스크)의 MBR(Master Boot Record)에 저장된 부트로더(Bootloader) 혹은 부트스트랩 코드라고 불리는 프로그램을 메모리로 복사한다. 여기까지가 BIOS의 역할이며 이후 컴퓨터의 제어권은 이 부트로더가 가지게 된다. 부트로더는 디스크에 있는 OS의 코드를 메모리에 올려서 OS를 실행하게 된다. 그 이후로는 컴퓨터의 제어권은 컴퓨터가 종료될 때까지 OS가 가지게 된다.

OS가 자신을 스스로 실행할 수 없으나 일단 실행 만되면 일체의 외부 도움 없이 컴퓨터를 완전하게 제어한다는 사실에 볼때 부트스트랩이라는 단어에 가장 어울리는 상황이라 할 수 있다.

컴파일러

컴파일러 분야의 부트스트래핑은 위에서 설명한 부팅과 같지만 다른 의미로 쓰인다. 컴파일러 분야에서는 스스로를 컴파일 할 수 있는 컴파일러를 만들어 나가는 과정을 부트스트래핑이라고 말한다. (컴파일러에 대한 개략적인 설명은 여기를 참고한다.)

보통 어떤 프로그래밍 언어를 만들때 반드시 컴파일러도 만드는데, 보통 초기에는 다른 언어로 컴파일러를 만든다. Go언어를 예로 들자면 Go언어의 초기 컴파일러는 C와 약간의 어셈블리어로 컴파일러를 만들었다. 그렇게 언어의 기능을 발전시켜 나가다가 1.5버전부터는 컴파일러 자체를 Go언어로 만들었다. (당연히, 물론 약간의 어셈블리어도 추가)

컴파일러의 부트스트래핑은 여러 장점이 있기 때문에 Python, Java, C#, C++ 등 대부분의 주요 언어에서는 부트스트래핑 과정을 거쳐서 자신의 언어로 컴파일러가 만들어졌다. 주요 장점은 아래와 같다.

  • 컴파일할 언어로 작성하기 때문에 중요한 테스트가 된다.
  • 컴파일러 개발자들은 컴파일 할 언어만 알면 된다.
  • 컴파일러 개발을 컴파일될 고급 언어로 할 수 있다. 보통은 저급언어로 고급언어 컴파일러를 만드는 경우가 많기 때문이다.

다만 과도기적으로 컴파일러의 컴파일 속도와 최적화 측면에서 문제가 있을 수 있지만, 대부분 시간이 지나면 해결된다.

추가적으로 읽어볼 내용

StackOverflow의 답변을 보면 개발자 관점에서 본 부트스트랩의 정의를 적어놓았다. 꽤 재미있는 내용인데, 글쓴이는

  • C언어로 C언어 컴파일러를 어떻게 만들 수 있는가?
  • 아직 구동하지 않은 OS가 없는데 OS 초기화 프로세스를 어떻게 실행할 수 있는가?

라는 도발적인 질문을 던진다. 글쓴이는 이 경우를 순환 의존(Circular Dependency)라고 정의한다. 우리말로 하자면 닭이 먼저냐 달걀이 먼저냐랑 같은 문제다. 글쓴이는 앞의 예를 들어 부트스트래핑은 이 순환의존 고리를 깨버리는 외부 객체의 도움이라고 명확하게 정의한다.