AMACC는 처음부터 구축 된 32 비트 ARM 아키텍처 컴파일러입니다. 컴파일러, 링커 및 로더에 대한 학습을위한 교육적 도구로 설계된 C의 제거 버전 역할을합니다.
AMACC가 구현하는 두 가지 실행 모드가 있습니다.
AMACC는 위의 실행 모드와 자체 주최하는 데 필요한 C의 서브 세트를 컴파일하도록 설계되었음을 언급 할 가치가 있습니다. 예를 들어, 글로벌 변수, 특히 글로벌 어레이를 지원합니다.
간단한 스택 기반 초록 구문 트리 (AST)는 Cooperative stmt() 및 expr() 구문 분석 기능을 통해 생성됩니다. expr() 함수는 일부 문자 상수 최적화를 수행합니다. AST는 gen() 함수를 사용하여 스택 기반 VM 중간 표현 (IR)으로 변환됩니다. IR은 명령 줄 옵션을 통해 검사 할 수 있습니다. 마지막으로 codegen() 함수는 IR에서 ARM32 명령을 생성하며 jit() 또는 elf32() 실행 파일 생성을 통해 실행할 수 있습니다.
AMACC는 고전적인 재귀 하강과 운영자 우선 순위 구문 분석을 결합합니다. 연산자 우선 순위 파서는 운영자 우선 순위가 방법으로 바뀌는 문법 제작을 사용하여 운영자 우선 순위를 정의 할 때 표현식에 대한 재귀 하강 파서 (RDP)보다 상당히 빠른 것으로 판명됩니다.
AMACC는 다음 구문으로 작성된 C 소스 파일을 컴파일 할 수 있습니다.
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };아키텍처 지원은 Linux ABI를 사용하여 ARMV7HF를 대상으로하며 GNU/Linux로 Raspberry Pi 2/3/4에서 확인되었습니다.
AMACC의 코드 생성기는 여러 GNU/Linux 동작에 의존하며 빌드 환경에 ARM/Linux를 설치해야합니다.
A-Profile Architecture의 GNU 도구 체인을 설치하십시오
arm-linux-none-gnueabihf 선택 (하드 플로트가있는 Aarch32 대상)ARM 사용자 에뮬레이션을 위해 QEMU를 설치하십시오
sudo apt-get install qemu-user 실행 make check 하면 다음을 볼 수 있습니다.
[ C to IR translation ] Passed
[ JIT compilation + execution ] Passed
[ ELF generation ] Passed
[ nested/self compilation ] Passed
[ Compatibility with GCC/Arm ] ........................................
----------------------------------------------------------------------
Ran 52 tests in 8.842s
OK
더 많은 정보를 얻으려면 make help 위해 생성 된 메시지를 확인하십시오.
AMACC는 기계 코드를 실제로 빠르게 생성 할 수 있으며 gcc -O0 성능의 70%를 제공합니다.
테스트 환경 :
입력 소스 파일 : amacc.c
| 컴파일러 드라이버 | 이진 크기 (KIB) | 컴파일 시간 (들) |
|---|---|---|
-O0 -ldl 있는 gcc (compile+link) | 56 | 0.5683 |
-O0 -c 가있는 gcc (컴파일 만) | 56 | 0.4884 |
| AMACC | 100 | 0.0217 |
AMACC 컴파일이 중간 표현 (IR)을 점검하십시오.
AMACC는 C4의 인프라를 기반으로합니다.