티스토리 뷰

IT

GCC 컴파일 시작하기

siren911 2016. 9. 3. 00:32

우리나라에선 대부분의 컴퓨터 사용자이 윈도우즈를 사용하고 있습니다. 물론 C언어를 공부하는 분들도 윈도우즈를 사용하며 대부분 비주얼 스튜디오를 이용하고 있을 것입니다. 오늘은 윈도우즈가 아닌 리눅스에서 사용하는 컴파일러인 GCC 컴파일에 관하여 알아보겠습니다.




 

GCC는 정확하게 무엇인가? GCC가 GNU Compiler Collection의 약자라는 대답은 너무나 당연한 대답입니다. GCC는 공식적으로 GNU Compiler Suite라고 알려져 있고, GNU CC와 GNU C Compiler라고도 알려져 있습니다. GCC 컴파일은 일반적인 백엔드 컴파일 엔진에 대한 컴파일러 프론트엔드의 묶음입니다. 컴파일러 목록에는 C, C++, Objective C, 포트란, 자바가 포함되어 있습니다. 또 GCC 컴파일은 파스칼과 모듈라3, 에이다 9x에 대한 프론트엔드도 가지고 있습니다. C컴파일러는 traditional C와 ANSI C를 포함한 여러 가지 C 변종을 이야기합니다. C++ 컴파일러는 순수한 C++ 컴파일러입니다. 이것은 C++코드를 비야네 스타라우스트럽이 처음 C++ 를 만들기 위해 사용했던 컴파일러와 초기의 C++ 컴파일러가 그랬던 것처럼 C++코드를 중간 C 표현으로 바꾸지 않는다는 것을 의미합니다. 대신에 GCC의 C++ 컴파일러 g++는 C++ 소스코드에서 바로 실행 코드를 만들어 냅니다.




 

GCC 컴파일은 최적화, 크로스 플랫폼 컴파일러입니다. GCC 컴파일은 사용하는 언어나 타겟 CPU와 특정 CPU 계열에 관한 옵션이나 관련딘 프로세서의 계열에 속한 특정 CPU 모델에 관한 옵션에 상관없이 일반적인 최적화를 지원합니다. 게다가 GCC가 포팅된 하드웨어 플랫폼은 매우 많습니다. GCC 컴파일은 플랫폼과 타겟 서브모델을 지원하기 때문에, 특정 CPU 계열의 모든 CPU나 그 계열의 특정 모델에서만 동작하는 실행 코드를 생성할 수 있습니다.

 

GCC가 포팅된 여러 종류의 CPU와 아키텍처를 생각해보면, GCC 컴파일은 크로스 컴파일러로 설정해서 한 플랫폼에서 전혀 다른 플랫폼에서 실행시킬 코드를 컴파일하는데 GCC 컴파일을 사용하는 것이 전혀 놀라운 일이 아닙니다. 사실 한 시스템에서 여러 가지 플랫폼을 위한 여러 개의 GCC 설정을 갖게 할 수 있고, 게다가  한 시스템에서 같은 CPU 계열을 위한 여러 개의 GCC버전을 실행시킬 수 있습니다.

 

GCC 컴파일을 처음 접하는 사람은 GCC 웹사이트나 다른 웹사이트에 있는 EGCS(the Experimenta(또는 Enhanced) GNU Compiler Suite)를 이야기 하면 혼란스러워할지도 모르겠습니다. EGCS는 GCC보다 더욱 활발하게 개발되고 더 효율적인 컴파일러를 만들기 위한 것이었는데, GCC 코드를 기반으로 만들어졌고 EGCCS에서 개선된 점들을 GNU 프로젝트에서 관리하는 GCC 코드에 다시 반영했기 때문에 거의 똑같은 컴파일러였습니다. 그럼에도 두 코드는 분리되어 관리되었습니다. 1999년 4월에 GCC의 관리자와 EGCS의 운영 위원회가 공식적으로 합쳐졌습니다. 동시에 GCC의 이름이 GNU Compiler Collection으로 바뀌고 따로 관리되던 코드가 공식적으로 합쳐져서, EGCS에서 했던 많은 버그 수정과 개선점들을 GCC에 반영하였습니다.

 

GCC는 아니 GCC에 대한 아이디어는 사실 GNU 프로젝트보다 먼저 시작되었습니다. 1983년 후반, 자유 소프트웨어 재단의 장이자 GNU 프로젝트의 창설자인 리차드 M. 스톨만이 GNU 프로젝트를 시작하기 바로 전, 스톨만은 C를 포함한 여러 개의 언어를 컴파일할 수 있고 여러 타겟 CPU를 지원하도록 설계된 Free University Compiler Kit(VUCK라고도 합니다)라는 이름의 컴파일러에 대해 들었습니다. 스톨만은 GNU 시스템을 부팅할 수 있게 해야 하며 컴파일러가 자신이 처음 시작해야 할 일이라는 것을 깨달았습니다. 그래서 스톨만은 VUCK의 저자에게 GNU가 VUCK을 사용할 수 있는지 물어보는 편지를 썼습니다. 결과적으로 VUCK의 개발자는 대학은 자유롭지만 컴파일러는 그렇지 않다고 대답을 하면서 비협조적이었습니다. 스톨만은 GNU 프로젝트를 위한 처 번째 프로그램은 여러 언어를 지원하는 크로스 플랫폼 컴파일러이어야 한다는 결론을 내렸습니다. 컴파일러 전체를 혼자서 만드는 것을 피하려고(진정한 해커의 방식입니다) 스톨만은 결국 Lawrence Livemore Labs에서 개발된 멀티플랫폼  컴파일러인 Pastel의 소스 코드를 얻게 되었습니다. 그는 Pastel에 C 프론트엔드를 추가하고 그것을 Motorola 68000 플랫폼에 포팅하기 시작했는데, 곧 중요한 기술적인 난관에 부딪혔습니다. 컴파일러의 설계가 스톨만이 당시에 쓰던 68000 기반의 유닉스 시스템에서 지원하던 것보다 많은 수 메가의 스택 공간을 필요로 했습니다. 이런 상황 때문에 그는 새로운 컴파일러를 맨 처음부터 작성하게 되었습니다. 이 새로운 컴파일러가 결국 GCC가 되었습니다. 이 컴파일러에는 처음에 영감을 제공했던 Pastel의 소스 코드는 전혀 포함되어 있지 않지만, 스톨만은 Pastel에 자신이 만들었던 C 프론트엔드를 개조해서 사용했습니다. 스톨만이 GNU 프로젝트에 대한 설명에서 "맨 먼저, GNU Emacs를 만들었다" 라고 썼듯이, 1980년대에는 이 초기 GCC의 개발이 더디게 진행되었습니다.

 

GCC 컴파일 개발은 1990년대에 2개, 아마도 3개로 나뉘었습니다. 주된 GCC 분기가 GNU 프로젝트에서 계속 관리되는 동안, 주로 Cygnus Solutions와 관련이 있던 몇몇 다른 개발자들은 EGCS라고 알려진 GCC 버전을 배포하기 시작했습니다. EGCS는 GCC를 거의 따라 했지만, 독립적이었고 GCC보다 더욱 활발하게 관리되었습니다. 결국에 두 컴파일러는 하나의 컴파일러로 합쳐졌고 EGCS 운영 위원회가 GCC의 공식 관리자가 되었습니다. Pentium Compiler Group(PCG) 프로젝트가 그들만의 GCC 버전인 PGCC를 만들었는데, PGCC는 인텔의 펜티엄급 CPU에 있는 기능들을 최대한 지원하기 위해서 만든 펜티엄에 특화된 버전이었습니다. EGCS가 따로 관리되는 동안, PGCC는 EGCS 배포를 거의 따라 갔습니다. PCG 프로젝트의 마지막 배포는 2000년 12월 27일에 있었던 2.95.2.1이었고 EGCS와 GCC가 다시 합쳐지면서 PGCC 개발은 거의 멈춘 것 같습니다.

 

GCC 컴파일을 시작하기 위해 GCC 컴파일의 개념과 역사에 대해 알아 보았는데요. 여러분도 한번 리눅스 상에서 GCC를 이용해서 C 프로그래밍을 공부해 보는건 어떨까요?




 

'IT' 카테고리의 다른 글

윈도우즈 프로그래밍 역사  (0) 2016.09.04
타이젠 os 알아보기  (0) 2016.09.04
안드로이드 앱 만들기 특징과 구조  (0) 2016.09.02
C언어 프로그램 만들기  (0) 2016.09.01
델파이 언어  (0) 2016.08.30
댓글