타이니 C 컴파일러

타이니 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)의 모든 기능을 구현한다고 주장하며, C99 ISO 표준의 대부분과 인라인 어셈블리를 포함한 많은 GNU C 확장 기능을 구현한다.

 기능 
TCC는 다른 최신 C 컴파일러와 구별되는 여러 기능을 가지고 있다.

 작은 파일 크기(x86 TCC 실행 파일의 경우 약 100KB)와 메모리 사용량 덕분에 구조 디스크와 같은 단일 1.44MB 플로피 디스크에서 직접 사용할 수 있다.
 TCC는 x86, x86-64 및 ARM 코드를 매우 빠르게 생성하도록 설계되었다. 벨라르에 따르면, GCC보다 약 9배 빠르게 컴파일, 어셈블 및 링크한다. 2023년 현재, "mob" 개발 브랜치는 RISC-V 및 TMS320C67xx (a DSP 칩)에 대한 지원도 포함한다.
 TCC는 코드 안정성을 향상시키기 위한 선택적 메모리 및 바운드 검사기와 같은 실용성을 향상시키기 위한 여러 컴파일러 특정 언어 기능을 가지고 있다.
 TCC는 명령줄 스위치를 사용하여 컴파일 시 프로그램을 자동으로 실행할 수 있다. 이를 통해 셔뱅 인터프리터 지시어 구문을 지원하는 유닉스 계열 시스템에서 프로그램을 셸 스크립트로 실행할 수 있다. TCC의 셔뱅 (공식 TCC 웹사이트에 명시된 바와 같이)은 #!/usr/local/bin/tcc -run이다 (TCC가 /usr/local/bin/tcc에 설치되어 있다고 가정하며, 설치 위치는 시스템에 따라 다를 수 있다).

 컴파일된 프로그램 성능 
일반적으로 TCC의 구현은 최적의 성능을 내는 결과보다는 작음에 중점을 둔다. TCC는 단일 패스로 코드를 생성하며, 다른 컴파일러에서 수행하는 대부분의 최적화를 수행하지 않는다. TCC는 각 문장을 자체적으로 컴파일하며, 각 문장 끝에서 레지스터 값은 스택에 다시 기록되고 다음 줄에서 레지스터의 값을 사용하더라도 다시 읽어야 한다(문장 사이에 불필요한 저장/로드 쌍을 생성함). TCC는 사용 가능한 레지스터 중 일부만 사용한다 (예: x86에서는 함수 호출 시 보존되어야 하므로 ebx, esi 또는 edi를 사용하지 않는다).

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배 더 오래 걸렸다.결과는 다음과 같았다. GCC C 컴파일러인 cc1을 자체적으로 실행하는 데는 GCC 3.4.2로 컴파일했을 때 518초, 마이크로소프트 C 컴파일러를 사용했을 때 545초, TCC를 사용했을 때 1145초가 걸렸다. 이러한 컴파일러를 처음 만드는 데 GCC (3.4.2)는 GCC 컴파일러를 컴파일하는 데 744초가 걸린 반면, TCC는 73초밖에 걸리지 않았다. 각 컴파일러의 최적화 수준은 -O1 또는 그와 유사했다.

 사용례 
 TCCBOOT, TCC가 리눅스 커널을 소스에서 약 10초 만에 로드하고 부팅하는 해킹이다. 즉, 디스크에서 리눅스 커널 소스 코드를 읽어 실행 가능한 명령어를 메모리에 쓰고 실행을 시작하는 "부트로더"이다. 이는 리눅스 빌드 프로세스에 변경이 필요했다.
 TCC는 GCC를 컴파일하는 데 사용되었지만, 이를 작동시키기 위해 다양한 패치가 필요했다.
 TCC는 트러스트 공격에 대한 방어책을 시연하는 데 사용되었다. 또한 GNU Guix에서 어떠한 바이너리도 사용하지 않고 배포판을 부트스트랩 가능하게 만들기 위해 사용된다.
 Cinpy는 파이썬 라이브러리로, 파이썬 모듈에서 C로 함수를 구현할 수 있게 해준다. 함수는 런타임에 TCC로 컴파일된다. 결과는 ctypes 라이브러리를 통해 파이썬에서 호출할 수 있게 된다.
 자바스크립트 리눅스 (벨라르가 만든)에 설치되어 있다.
 슈퍼 마이크로-맥스 체스 프로그램 소스의 컴파일된 버전의 참고 자료로 사용되었다.
 자바스크립트 런타임인 Bun은 TCC를 사용하여 사용자가 자바스크립트에서 C 프로그램을 컴파일하고 실행할 수 있는 API를 노출한다.

 역사 
TCC는 2001년 IOCCC에서 벨라르가 우승하기 위해 작성한 프로그램인 Obfuscated Tiny C Compiler (OTCC)에서 비롯되었다. 그 후 벨라르는 프로그램을 확장하고 난독화를 해제하여 tcc를 만들었다.

2012년 2월 4일 이전에 파브리스 벨라르는 자신이 더 이상 TCC 작업에 참여하지 않는다고 보고하기 위해 프로젝트의 공식 웹페이지를 업데이트했다.

벨라르가 프로젝트에서 떠난 이후, 다양한 사람들과 그룹들이 TCC를 기반으로 구축하거나 문제를 해결하기 위해 TCC의 패치를 배포하거나 포크를 유지해왔다. 여기에는 데이브 닷지의 비공식 tcc 패치 모음, 데비안 및 kfreebsd 다운스트림 패치, 그리고 그리쉬카의 gcc 패치가 포함된다. 그리쉬카는 또한 프로젝트를 위한 공개 Git 저장소를 설정했다. 이 저장소에는 공유 빌드, 크로스 컴파일러, SELinux 호환성 등 수많은 기여가 추가된 mob 브랜치가 포함되어 있다. 그리쉬카의 GIT 저장소는 나중에 공식 TCC 저장소가 되었다 (파브리스 벨라르의 Savannah 프로젝트 페이지에 링크됨).

 현재 상태 
2017년 12월 현재 공식 TCC 메일링 리스트와 공식 Git 저장소(파브리스 벨라르의 Savannah 프로젝트 페이지에 링크됨) 모두 많은 개발자와 관심 있는 사용자들의 활발한 토론과 개발을 보여준다. 2017년 12월, 그리쉬카는 메일링 리스트에서 TCC 버전 0.9.27이 출시되었다고 발표했다.

 같이 보기 

 GNU 컴파일러 모음
 포터블 C 컴파일러 (PCC)
 LCC (컴파일러)
 스몰-C
 스몰 디바이스 C 컴파일러 (SDCC)
 자바 카드, 더 큰 언어의 유사한 하위 집합

 각주 

 외부 링크 

 TCC의 활성 메일링 리스트
 소스 코드 저장소
 PTSource IDE-통합 개발 환경에는 TCC가 포함되어 있다.

분류:C 컴파일러
분류:C로 작성된 자유 소프트웨어
분류:어셈블리어 소프트웨어
분류:LGPL 라이선스 소프트웨어