상위 질문
타임라인
채팅
관점
타이니 C 컴파일러
위키백과, 무료 백과사전
Remove ads
타이니 C 컴파일러(Tiny C Compiler), TCC, tCc 또는 TinyCC는 파브리스 벨라르가 처음 작성한 x86 (32비트), X86-64 및 ARM 프로세서용 C 컴파일러이다. 디스크 공간이 적은 느린 컴퓨터(예: 구조 디스크)에서 작동하도록 설계되었다. 윈도우 운영체제 지원은 버전 0.9.23(2005년 6월 17일)에 추가되었다. TCC는 GNU 약소 일반 공중 사용 허가서에 따라 배포된다.
TCC는 ANSI C (C89/C90)의 모든 기능을 구현한다고 주장하며[2], C99 ISO 표준의 대부분[3]과 인라인 어셈블리를 포함한 많은 GNU C 확장 기능을 구현한다.
Remove ads
기능
TCC는 다른 최신 C 컴파일러와 구별되는 여러 기능을 가지고 있다.
- 작은 파일 크기(x86 TCC 실행 파일의 경우 약 100KB)와 메모리 사용량 덕분에 구조 디스크와 같은 단일 1.44MB 플로피 디스크에서 직접 사용할 수 있다.
- TCC는 x86, x86-64 및 ARM 코드를 매우 빠르게 생성하도록 설계되었다. 벨라르에 따르면, GCC보다 약 9배 빠르게 컴파일, 어셈블 및 링크한다.[4] 2023년 현재, "mob" 개발 브랜치는 RISC-V 및 TMS320C67xx (a DSP 칩)에 대한 지원도 포함한다.
- TCC는 코드 안정성을 향상시키기 위한 선택적 메모리 및 바운드 검사기와 같은 실용성을 향상시키기 위한 여러 컴파일러 특정 언어 기능을 가지고 있다.
- TCC는 명령줄 스위치를 사용하여 컴파일 시 프로그램을 자동으로 실행할 수 있다. 이를 통해 셔뱅 인터프리터 지시어 구문을 지원하는 유닉스 계열 시스템에서 프로그램을 셸 스크립트로 실행할 수 있다. TCC의 셔뱅 (공식 TCC 웹사이트에 명시된 바와 같이)[2]은
#!/usr/local/bin/tcc -run이다 (TCC가/usr/local/bin/tcc에 설치되어 있다고 가정하며, 설치 위치는 시스템에 따라 다를 수 있다).[5]
Remove ads
컴파일된 프로그램 성능
일반적으로 TCC의 구현은 최적의 성능을 내는 결과보다는 작음에 중점을 둔다. TCC는 단일 패스로 코드를 생성하며, 다른 컴파일러에서 수행하는 대부분의 최적화를 수행하지 않는다. TCC는 각 문장을 자체적으로 컴파일하며, 각 문장 끝에서 레지스터 값은 스택에 다시 기록되고 다음 줄에서 레지스터의 값을 사용하더라도 다시 읽어야 한다(문장 사이에 불필요한 저장/로드 쌍을 생성함). TCC는 사용 가능한 레지스터 중 일부만 사용한다 (예: x86에서는 함수 호출 시 보존되어야 하므로 ebx, esi 또는 edi를 사용하지 않는다).[6]
TCC는 몇 가지 최적화를 수행하는데, 모든 연산에 대한 상수 전파, 적절한 경우 곱셈과 나눗셈을 시프트로 최적화하고, 비교 연산자는 특별히 최적화된다 (프로세서 플래그에 대한 특수 캐시를 유지하여). 또한 단순한 레지스터 할당을 수행하여 단일 문 내에서 많은 불필요한 저장/로드 쌍을 방지한다.
다음은 두 가지 벤치마크 예시이다.
- 512MB RAM을 장착한 1.8GHz 인텔 센트리노 랩톱에서 재귀적 피보나치 수열 알고리즘을 사용한 결과, 마이크로소프트 비주얼 C++ 컴파일러 13.10.3052와 TCC 간에 눈에 띄는 결과 차이가 나타났다. 49번째 피보나치 수를 계산하는 데 MS 비주얼 C++ 프로그램은 TCC 컴파일 프로그램보다 약 18% 더 오래 걸렸다.
- 다른 C 컴파일러를 사용하여 GNU C 컴파일러 (GCC) 자체를 컴파일한 다음, 생성된 컴파일러를 사용하여 GCC를 다시 컴파일하여 비교하는 테스트를 수행했다. GCC 3.4.2와 비교했을 때, GCC를 컴파일하도록 수정된 TCC는 컴파일러를 10배 빠르게 컴파일할 수 있었지만, 생성된 .exe 파일은 57% 더 컸고 훨씬 느려서 GCC를 다시 컴파일하는 데 2.2배 더 오래 걸렸다.[7]
결과는 다음과 같았다. GCC C 컴파일러인 cc1을 자체적으로 실행하는 데는 GCC 3.4.2로 컴파일했을 때 518초, 마이크로소프트 C 컴파일러를 사용했을 때 545초, TCC를 사용했을 때 1145초가 걸렸다. 이러한 컴파일러를 처음 만드는 데 GCC (3.4.2)는 GCC 컴파일러를 컴파일하는 데 744초가 걸린 반면, TCC는 73초밖에 걸리지 않았다. 각 컴파일러의 최적화 수준은 -O1 또는 그와 유사했다.
Remove ads
사용례
- TCCBOOT,[8] TCC가 리눅스 커널을 소스에서 약 10초 만에 로드하고 부팅하는 해킹이다. 즉, 디스크에서 리눅스 커널 소스 코드를 읽어 실행 가능한 명령어를 메모리에 쓰고 실행을 시작하는 "부트로더"이다. 이는 리눅스 빌드 프로세스에 변경이 필요했다.
- TCC는 GCC를 컴파일하는 데 사용되었지만, 이를 작동시키기 위해 다양한 패치가 필요했다.[9]
- TCC는 트러스트 공격에 대한 방어책을 시연하는 데 사용되었다.[10] 또한 GNU Guix[11]에서 어떠한 바이너리도 사용하지 않고 배포판을 부트스트랩 가능하게 만들기 위해 사용된다.[12]
- Cinpy[13]는 파이썬 라이브러리로, 파이썬 모듈에서 C로 함수를 구현할 수 있게 해준다. 함수는 런타임에 TCC로 컴파일된다. 결과는 ctypes 라이브러리를 통해 파이썬에서 호출할 수 있게 된다.
- 자바스크립트 리눅스[14] (벨라르가 만든)에 설치되어 있다.
- 슈퍼 마이크로-맥스 체스 프로그램 소스의 컴파일된 버전의 참고 자료로 사용되었다.[15]
- 자바스크립트 런타임인 Bun은 TCC를 사용하여 사용자가 자바스크립트에서 C 프로그램을 컴파일하고 실행할 수 있는 API를 노출한다.[16]
역사
TCC는 2001년 IOCCC에서 벨라르가 우승하기 위해 작성한 프로그램인 Obfuscated Tiny C Compiler (OTCC)에서 비롯되었다.[1] 그 후 벨라르는 프로그램을 확장하고 난독화를 해제하여 tcc를 만들었다.[1]
2012년 2월 4일 이전에 파브리스 벨라르는 자신이 더 이상 TCC 작업에 참여하지 않는다고 보고하기 위해 프로젝트의 공식 웹페이지를 업데이트했다.[17]
벨라르가 프로젝트에서 떠난 이후, 다양한 사람들과 그룹들이 TCC를 기반으로 구축하거나 문제를 해결하기 위해 TCC의 패치를 배포하거나 포크를 유지해왔다. 여기에는 데이브 닷지의 비공식 tcc 패치 모음[18], 데비안 및 kfreebsd 다운스트림 패치[19], 그리고 그리쉬카의 gcc 패치[7]가 포함된다. 그리쉬카는 또한 프로젝트를 위한 공개 Git 저장소를 설정했다.[20] 이 저장소에는 공유 빌드, 크로스 컴파일러, SELinux 호환성 등 수많은 기여가 추가된 mob 브랜치[21]가 포함되어 있다. 그리쉬카의 GIT 저장소는 나중에 공식 TCC 저장소가 되었다 (파브리스 벨라르의 Savannah 프로젝트 페이지에 링크됨[22]).
Remove ads
현재 상태
2017년 12월 현재 공식 TCC 메일링 리스트[23]와 공식 Git 저장소(파브리스 벨라르의 Savannah 프로젝트 페이지에 링크됨[24]) 모두 많은 개발자와 관심 있는 사용자들의 활발한 토론과 개발을 보여준다. 2017년 12월, 그리쉬카는 메일링 리스트에서 TCC 버전 0.9.27이 출시되었다고 발표했다.[25]
같이 보기
- GNU 컴파일러 모음
- 포터블 C 컴파일러 (PCC)
- LCC (컴파일러)
- 스몰-C
- 스몰 디바이스 C 컴파일러 (SDCC)
- 자바 카드, 더 큰 언어의 유사한 하위 집합
각주
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads
