문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 컴파일러 (문단 편집) == 상세 == 컴파일러를 엄밀히 말하자면, 어떤 [[프로그래밍 언어]]로 쓰여진 소스 파일을 다른 프로그래밍 언어로 바꾸어주는 번역기인 셈이다. 어떤 언어 A를 B로 바꾸면 그게 컴파일러다. [[Scheme]]을 [[C언어]]로 번역한다든지, 심지어 기계어를 [[C언어]]로 [[리버스 엔지니어링|번역하더라도]](!) 컴파일러라고 칭할 수 있다. 하지만 대개의 경우 고수준 언어를 [[기계어]]로 번역하는 프로그램을 일컫는다. 이 두 개념을 구분하고자 할 경우 전자를 트랜스컴파일러(transcompiler)나 소스간 컴파일러(source-to-source compiler), 후자를 디컴파일러(decompiler)라고 많이 부른다. [[어셈블리어]]를 기계어로 번역하는 프로그램 역시 어셈블리어의 특수성 때문에 따로 [[어셈블러]]라 한다. 초기엔 프로그램을 작성하기 위해서는 컴퓨터 위에서 바로 돌아가는 [[기계어]]를 통하여 [[프로그래밍]]을 했다. 그러나 이런 과정은 생산성, 기기 간 호환성,[* 예를 들어서 [[ARM(CPU)|ARM]] 아키텍처 대상으로 작성된 프로그램은 [[x86]] 아키텍처에서 안돌아가는 식으로.] [[디버깅]] 등 모든 면에서 효율적이지 않다. 따라서 [[컴퓨터과학]]이 발전하면서 많은 부분을 추상화된 고수준 언어로 작성하고 이를 [[번역기]]를 통해 기계어로 번역하기 시작했는데, 이 번역기가 바로 컴파일러이다. 현재 많은 [[프로그램]]은 컴파일러를 통하여 전체를 기계어로 번역하여 실행하므로 프로그램 개발에 필수적인 툴 중에 하나다. 한 언어의 컴파일러를 자신의 언어로 재작성하는 것을 [[부트스트래핑]]이라고 한다. 재밌는 것은 컴파일러도 결국 하나의 언어로 짜여진 프로그램이라는 점. 따라서 바이너리 포맷의 파일을 쓸 수 있고 트리 자료구조를 생성할 수 있는 언어는 [[부트스트래핑]](bootstrapping)이 가능하다.[* 트리 자료구조를 사용하지 않는다면 [[어셈블러]]에 해당하며, 고수준 언어를 컴파일할 수는 없다.] 범용 목적 프로그래밍 언어는 당연히 이 조건을 만족하므로 부트스트래핑이 가능하다.[* 그렇지 않은 일부 특수 목적 언어는 영원히 다른 언어의 도움을 받아야 한다.] [[GCC]]라는 C 컴파일러는 컴파일에 [[C++]]을 사용한다. 컴파일러의 최초 버전만 다른 언어용의 컴파일러 또는 어셈블러의 도움을 받아 만들고 나면[* 또는 다른 아키텍처상에서 구동하는 크로스컴파일러로] 컴파일러가 자기 자신의 언어로 짜여질 수 있다. 일례로, GHC라는 [[Haskell]] 컴파일러는 최초에 Lazy ML이라는 다른 언어로 작성되었다가, 자기 자신의 언어인 [[Haskell]]로 재작성되었다. 이런 식으로 거슬러 올라가다 보면, 최초의 어셈블러는 기계어로 만들어졌고 최초의 고급 언어는 어셈블러로 만들어졌음을 알 수 있다. 원칙적으로 컴파일러는 프로그램을 기계어로 바꾸기만 할 뿐 이를 바로 실행이 가능하게 하지는 않는다. 여러 소스 파일에서 나온 결과물을 합치고 라이브러리도 포함시키는 등 별도의 작업을 거쳐야 실행이 가능해지는데 이를 수행하는 프로그램이 [[링커]]이다. 하지만 보통은 그냥 뭉뚱그려 컴파일러라 부르는 경우가 많다. 또한 요즘은 그냥 프로그램 하나만 돌리면 [[컴파일]]과 링킹을 한 번에 끝낼 수 있게 되어 있다. 물론 내부적으로는 컴파일러와 [[링커]]가 따로 있어서 이를 이용하는 경우가 많다. 00년대 초반, 그 이전에는 싱글/듀얼코어 프로세서가 대세라 컴파일 시간에도 상당히 많은 시간을 잡아먹었는데 이를 해결하기 위해 헤더 파일 포함을 이용해 목적 파일을 큰 파일 하나로 모으는 트릭을 사용하기도 했으나, 최근 사용되는 개발자 PC의 경우 쿼드코어는 저사양이고 보통 6~16 혹은 그 이상의 코어를 가진 프로세서를 사용하는데다, [[그리드 컴퓨팅|분산 빌드]]를 사용하기 때문에 이런 짓은 코드가 짧은 편이 아닌 이상 코드 관리가 힘들어지는 바보짓이 된다. 하나의 매우 매우 긴 소스 파일을 읽는 것보다 파일/기능별로 정리된 코드를 보는 것이 생산성에도 훨씬 좋다. [[Visual Studio]]를 비롯해 최근에 나오는 대부분의 컴파일러(IDE)는 멀티 프로세서 컴파일을 지원하기 때문에 코어수가 늘어날수록 병렬로 컴파일 후 링킹하는 것이 훨씬 빠르다. [[OpenCV]] 등 대형 오픈 소스 프로젝트를 멀티코어 빌드해보면 CPU를 풀로드로 갈굴 수 있다. 컴파일을 하는 대신, 소스를 한꺼번에 번역하지 않고 명령 하나하나를 실행할 때마다 해석하여 계산하는 방법도 있는데 이 해석기를 [[인터프리터]]라 해서 따로 분류한다. 컴파일러가 번역기라면 인터프리터는 통역기인 셈. 인터프리터 언어에 비해 컴파일 언어의 단점은 수정이 용이하지 않다는 점이다. 수정 사항이 발생하면 다시 컴파일을 해야 되는데, 작은 프로그램일 경우에는 문제가 되지 않지만 컴파일이 몇 시간씩 걸리는 덩치 큰 프로그램에서는 문제가 된다. 특히 수정 사항이 빈번하게 발생할 경우에는 큰 문제가 된다. 이 때문에 수정 사항이 빈번하게 발생할 것 같은 부분은 [[인터프리터]]를 쓰는 방법으로 따로 빼 두는 기법을 많이 사용한다. 다만 멀티스레딩 프로그래밍이 굉장히 어려운 편(인터프리터는 속도는 느리지만 수정이 간단하다는 장점이 있다). 범용 프로그램 언어가 아닌 인터프리터 언어를 '''스크립트''' 언어라고 한다. 보통 Web/매크로/게임 등 특정 분야에 특화/로컬화된 인터프리터 언어들을 이렇게 부른다. 스크립트의 경우는 [[Lua]] 등 표준화된 스크립트 언어를 사용하는 경우도 있지만 범용 기계어 컴파일러보다 기능범위/명령어 수가 적기 때문에 회사/단체에서 내부 스크립트를 제작해서 쓰기도 한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기