커스텀 CPU용 C 컴파일러를 작성하는 방법
커스텀 CPU용 C 컴파일러를 작성하는 가장 쉬운 방법은 무엇입니까?물론 C 컴파일러용 어셈블러가 이미 있다고 가정합니다.
C 컴파일러는 어셈블리를 생성하기 때문에 다양한 C 관용구용 표준 비트와 어셈블리 코드 조각을 정의하고 컴파일러를 재구축하여 타깃 하드웨어용 크로스 컴파일러를 얻을 수 있는 방법이 있습니까?
가급적 컴파일러 자체는 C로 작성되어 Linux 또는 Windows용 네이티브 실행 파일로 빌드됩니다.
주의:컴파일러 자체를 어떻게 쓰느냐는 것이 아닙니다.대학에서 그 과정을 수강했고, 일반 컴파일러에 대해서도 알고 있습니다.이 경우 가능하면 기존 프레임워크를 설정했으면 합니다.언어를 수정하는 것이 아니라 임의의 아키텍처를 대상으로 할 수 있는 것입니다.만약 "그렇게 되지 않는다"는 답이 나온다면, 그 정보는 나 자신과 비슷한 가정을 할 수 있는 사람들에게 유용할 것이다.
vbcc(www.compilers.de)는 C로 기술된 적절하고 단순한 리타깃 가능한 C 컴파일러입니다.GCC/LLVM보다 훨씬 심플합니다.컴파일러에 대한 사전 지식 없이 몇 주간의 작업만으로 컴파일러를 자신의 CPU에 재타깃할 수 있었던 것은 매우 간단합니다.
이 문서에서는 LLVM 표현을 머신어셈블리 코드 또는 기타 언어로 변환하는 LLVM 백엔드 기술 방법에 대해 설명합니다.
[ . . . ]
스태틱 컴파일러(텍스트어셈블리를 내보내는 컴파일러)를 작성하려면 다음을 구현해야 합니다.
- 레지스터 세트에 대해 설명합니다.
- 명령 세트를 설명합니다.
- 대상 기계에 대해 설명합니다.
- 아키텍쳐(architecture)에 어셈블리 프린터를 실장합니다.
- 아키텍처용 명령 셀렉터를 구현합니다.
간단한 대답은 그것이 그렇게 작동하지 않는다는 것이다.
더 긴 대답은 새로운 CPU 타입의 컴파일러를 작성하려면 약간의 노력이 필요하다는 것입니다.단, 컴파일러를 처음부터 작성할 필요는 없습니다.대부분의 컴파일러는 몇 가지 경로로 구성되어 있습니다.일반적인 아키텍처를 다음에 나타냅니다(다양한 종류가 있습니다).
- 구문 분석(렉서 및 파서) 및 C 전처리의 경우 추상 구문 트리로 이어집니다.
- 형식 확인을 통해 주석이 달린 추상 구문 트리가 나타납니다.
- 중간 코드 생성으로 아키텍처에 의존하지 않는 중간 코드가 생성됩니다.일부 최적화는 이 단계에서 수행됩니다.
- 기계 코드 생성, 조립 또는 기계 코드로 이어집니다.이 단계에서는 더 많은 최적화가 수행됩니다.
이 설명에서는 스텝4만이 머신에 의존합니다.따라서 4단계가 명확하게 구분된 컴파일러를 사용하여 4단계의 플러그를 꽂을 수 있습니다.이를 위해서는 CPU에 대한 깊은 이해와 컴파일러의 내부적인 이해가 필요하지만 이전에 무슨 일이 일어났는지에 대해서는 걱정할 필요가 없습니다.
매우 작지 않거나, 매우 드물거나, 매우 오래된 CPU는 거의 모두 GCC용 백엔드를 갖추고 있습니다(스텝 4).GCC 백엔드를 기술하기 위한 주요 매뉴얼은 GCC 내부 매뉴얼입니다.특히 머신 설명과 타깃 설명에 관한 장입니다.GCC는 무료 소프트웨어이므로 라이센스 비용이 들지 않습니다.
크로스 컴파일러의 개념이 있습니다. 즉, 하나의 아키텍처에서 실행되지만 다른 아키텍처를 대상으로 하는 것입니다.확장하려는 컴파일러의 경우 GCC가 이를 수행하는 방법(예를 들어)을 확인하고 새 아키텍처를 세트에 추가할 수 있습니다.
편집: 몇 년 전 GCC 메일링 리스트에서 새로운 타깃 추가 방법에 대한 질문을 발견했는데 누군가가 이를 지적했습니다.
1) 간단한 답변:
"아니요. 컴파일러 프레임워크 같은 건 없어요. 물을 넣고 저으면 됩니다."
2) 긴 답변: 확실히 가능합니다.하지만 어렵다.그리고 아마 비쌀 것이다.
직접 하고 싶다면 Gnu CC부터 알아보겠습니다.이미 다양한 CPU와 플랫폼에서 사용할 수 있습니다.
3) 이 링크에서 더 많은 아이디어('기능 및 매크로 라이브러리 구축' 아이디어 포함)를 확인하세요.이것이 저의 첫 번째 제안입니다.
http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/
GCC나 Clang 등의 기존 오픈소스 컴파일러를 변경할 수 있습니다.그 외의 답변에서는, 상세한 것에 대하여는, 링크를 참조해 주세요.그러나 이러한 컴파일러는 쉽게 대상을 변경할 수 있도록 설계되어 있지 않습니다.특정 타깃으로 연결된 다른 컴파일러보다 대상을 변경할 수 있는 "간단한" 컴파일러입니다.
그러나 비교적 대상을 변경하기 쉬운 컴파일러를 원한다면 머신 아키텍처를 명시적으로 지정할 수 있는 컴파일러가 필요합니다(GCC는 이 중 일부를 수행합니다.Clang/LLVM은 별로 하지 않지만 여기서 틀릴 수 있습니다).
문헌에는 이런 내용이 많이 있습니다. 구글 "컴파일러-컴파일러"입니다.
다만, C용의 구체적인 솔루션에 대해서는, ACE를 참조해 주세요.ACE는 고객을 위해서 온 디맨드로 컴파일러를 생성하는 벤더입니다.무료는 아니지만 아주 좋은 컴파일러를 빨리 만든다고 들었어요.표준 스타일의 바이너리(ELF?)를 생성하기 때문에 조립 단계를 생략할 수 있다고 생각합니다.(ACE와 경험이나 관계가 없습니다.)
코드 품질에 관심이 없는 경우 C AST를 사용하여 C의 구문 지향 변환을 어셈블러로 작성할 수 있습니다.CAST는 GCC, Clang, ANTLR 및 DMS Software Reengineering Toolkit에서 구할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8696229/how-to-create-a-c-compiler-for-custom-cpu
'programing' 카테고리의 다른 글
정규식을 사용하지 않고 자바에서 문자가 문자인지 숫자인지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2022.08.10 |
---|---|
메이븐을 사용하여 단일 테스트 방법 실행 (0) | 2022.08.10 |
정의되지 않은 속성 'ref'를 읽을 수 없습니다. (0) | 2022.08.10 |
계산된 Ajax가 있는 Vuex 작업이 업데이트되지 않음 (0) | 2022.08.10 |
Vuex 변환 업데이트 상태, 계산된 속성이 마크업에 업데이트를 반영하지 않음 (0) | 2022.08.10 |