2012-01-01 3 views
36

커스텀 CPU 용 C 컴파일러를 만드는 가장 쉬운 방법은 무엇입니까? 물론 이미 그것에 대한 어셈블러가 있다고 가정합니까?커스텀 CPU 용 C 컴파일러를 만드는 방법은?

C 컴파일러는 어셈블리를 생성하기 때문에 여러 가지 C 관용구에 대한 표준 비트 및 어셈블리 코드 조각을 정의하고 컴파일러를 다시 작성하여 대상 하드웨어에 대한 교차 컴파일러를 얻을 수있는 방법이 있습니까?

컴파일러 자체는 C로 작성되고 Linux 또는 Windows 용 기본 실행 파일로 빌드하는 것이 바람직합니다.

참고 : 나는 컴파일러 자체를 작성하는 방법을 요구하고 있지을입니다. 나는 대학에서 그 과정을 수강했고, 일반적인 컴파일러 컴파일러에 대해 알고있다.이 상황에서 가능하다면 기존 프레임 워크를 구성하고 싶다. 나는 언어를 수정하고 싶지 않고, 단지 임의의 아키텍처를 목표로 삼고 싶다. 대답이 "그런 식으로 작동하지 않습니다"라고 밝혀지면 정보는 나 자신과 유사한 가정을 할 수있는 다른 사람에게 유용 할 것입니다.

+4

컴파일러가 어셈블러를 제작하는 데있어 * 근본적인 요구 사항이 없습니다. 이는 단지 일반적이며 편리한 방법입니다. – dmckee

+0

@dmckee -이 경우 요구 사항이라고 가정 해 봅시다. 나는이 지역 사회에서이 문제에 대한 답을 얻을 수있는 사람들이 있음을 압니다. 필자가 묻는 것에 대한 대답은 "컴파일러 작성 과정에 참여"하지 않는 것입니다. – JustJeff

+1

추 신 :이 새로운 맞춤형 CPU를 가지고 있다고 가정하면 컴파일러가없는 것입니다. * OS *는 어디서 오는거야? "네이티브 실행 파일"이란 무엇입니까? 네이티브 * * *?!? – paulsm4

답변

29

Quick overview/tutorial on writing a LLVM backend.

이 문서는 작성 백엔드에 대한 기술에 대해 설명을 지적하는 방법에 대한 GCC 메일 링리스트에 몇 년 전에 문제를 발견 LLVM은 LLVM 표현을 기계 어셈블리 코드 또는 다른 언어로 변환합니다.

[. . . ]

정적 컴파일러 (텍스트 조립을 방출 하나를) 만들려면 다음 구현해야합니다

  • 는 레지스터 세트를 설명하십시오.
  • 명령어 세트를 설명하십시오.
  • 대상 기계를 설명하십시오.
  • 아키텍처 용 어셈블리 프린터를 구현하십시오.
  • 아키텍처에 대한 명령어 선택기를 구현합니다.
+0

LLVM은 매우 복잡하고 완전히 문서화되지 않았습니다. 만지지 마라. 그것은 내 인생의 1 개월 낭비. – Ehsan

+3

나는 이전의 의견을 남긴 사람과 같은 사람입니다. 나는 1 년 반 동안 이미 LLVM에서 일하고 있습니다. 내 백엔드를 개발하고 조립할 수 있습니다. LLVM 인프라를 파악하는 데는 1 년이 걸리지 만 그만한 가치가 있다고 생각합니다. – Ehsan

+1

@ 에산 당신은 문서를 쓸 수있을 것 같습니까? :-D – wizzwizz4

8

크로스 컴파일러의 개념, 즉 하나의 아키텍처에서 실행되지만 다른 아키텍처를 대상으로하는 개념이 있습니다. GCC가 그것을 어떻게하는지 (예를 들어) 볼 수 있으며, 확장하고자하는 컴파일러 인 경우 세트에 새로운 아키텍처를 추가하십시오.

편집 : 난 그냥 새 대상을 추가하고 누군가가 this

+0

예. 새 아키텍처를 어떻게 추가합니까? 정교하게 써 주시겠습니까? – JustJeff

+1

링크를 사용하여 답변을 편집했습니다. 그것은 약간 큰 문서이지만, 나는 그것이가는 길이라고 생각합니다 ... –

+1

GCC 소스에서 어떻게 보입니까? PS : * gcc 소스를보고 * 또한 LLVM을 살펴보십시오. 내 생각에 당신은 유익한 정보를 찾을 수있을 것입니다 ... – paulsm4

3

1) 짧은 답변 :

가 방금) 자신의 조립 세트에 물 (플러그를 추가 자극 할 수 컴파일러 프레임 워크 ""아니 거기에 같은 건 없다 ", 그것은

을 이루어집니다 . "

2) 답변 : 분명히 가능합니다. 그러나 도전. 그리고 아마도 비싼 것 같습니다.

직접 해보고 싶다면 Gnu CC를 살펴 보겠습니다. 이미 다양한 CPU와 플랫폼에서 사용할 수 있습니다.

http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/

+1

LLVM은 요즘 "그냥 물을 추가하는"프레임 워크인가? –

3

짧은 :

3), 내 첫 번째 제안 될 것이다) "단지 함수 및 매크로의 라이브러리를 구축"의 아이디어를 포함하여 더 많은 아이디어 (이 링크를보세요 대답은 그런 식으로 작동하지 않는다는 것입니다.

더 긴 대답은 새로운 CPU 유형을위한 컴파일러 작성에 다소 시간이 걸린다는 것입니다. 그러나 처음부터 컴파일러를 만들 필요는 없습니다. 대부분의 컴파일러는 여러 단계로 구성되어 있습니다.

  1. 문법적 분석 (렉서와 파서), 그리고 C 전처리에 대한 추상 구문 트리로 이어지는 : 여기에 일반적인 아키텍처 (변화의 많은 가능)이 있습니다.
  2. 주석 처리 된 추상 구문 트리로 이어지는 유형 검사.
  3. 아키텍처 독립적 인 중간 코드로 이어지는 중간 코드 생성. 일부 최적화가이 단계에서 수행됩니다.
  4. 조립 또는 기계 코드로 직접 이어지는 기계 코드 생성. 이 단계에서 더 많은 최적화가 수행됩니다.

이 설명에서 4 단계 만 기기에 따라 다릅니다. 따라서 4 단계가 명확하게 구분 된 컴파일러를 사용하고 4 단계를 직접 플러그인 할 수 있습니다. 이렇게하려면 CPU에 대한 깊은 이해와 컴파일러 내부에 대한 이해가 필요하지만 이전에 일어날 일에 대해 걱정할 필요가 없습니다.

매우 작지도 않고 매우 드물지만 거의없는 거의 모든 CPU에는 GCC에 대한 백엔드 (4 단계)가 있습니다. GCC 백엔드 작성을위한 주요 문서는 GCC internals manual이며 특히 machine descriptionstarget descriptions에 대한 장이 있습니다. GCC는 자유 소프트웨어이므로 라이센스 비용은 없습니다.

1

GCC 나 Clang과 같은 기존의 오픈 소스 컴파일러를 수정할 수 있습니다. 다른 답변을 통해 더 많은 정보를 얻을 수있는 링크가 제공됩니다. 그러나이 컴파일러는 으로 쉽게 설계되지 않았습니다. retargeted; 특정 타겟에 연결된 다른 컴파일러보다 컴파일러보다 대상을 "쉽게"지정할 수 있습니다.

비교적 대상을 쉽게 지정할 수있는 컴파일러를 원한다면 기계 아키텍처를 명시 적으로 지정할 수있는 컴파일러를 원하고 일부 도구는 나머지 컴파일러를 생성합니다 (GCC는이 작업을 약간 수행합니다. Clang/LLVM은 많이하지만 나는 틀릴 수도 있다고 생각하지 마십시오.)

Google의 "컴파일러 컴파일러"라는 문학에 많은 내용이 있습니다.

그러나 C의 구체적인 솔루션 인 경우 고객을 위해 컴파일러를 생성하는 컴파일러 공급 업체 인 ACE을 확인해야합니다. 무료는 아니지만 아주 좋은 컴파일러를 매우 빠르게 만들어 낸다고 들었습니다. 표준 스타일 바이너리 (ELF?)를 생성하여 어셈블러 단계를 건너 뛴다 고 생각합니다. (ACE와의 경험이나 관계가 없습니다.)

코드 품질에 신경 쓰지 않는다면 C AST를 사용하여 C의 구문 지향적 인 번역을 어셈블러에 작성할 수 있습니다. GCC, Clang, 아마도 ANTLR 및 DMS Software Reengineering Toolkit에서 C AST를 얻을 수 있습니다.

1

vbcc (www.compilers.de)는 C로 작성된 훌륭하고 간단한 대상 지정 C 컴파일러입니다. GCC/LLVM보다 훨씬 간단합니다.너무 간단해서 컴파일러에 대한 사전 지식이 없어도 몇 주간의 작업으로 컴파일러를 자체 CPU로 리 타겟팅 할 수있었습니다.

+0

흥미로운 옵션. 보통 사람들은 gcc/clang/llvm 계열 외부의 무료 컴파일러에 대해서 생각조차하지 않습니다. retargeting 프로세스가 수행 된 방법에 대한 OP를 좀 더 자세하게 설명 할 수 있습니까? (예를 들어, 실제 CPU 명령어 세트에 더 많거나 적은 직접 변환기를 쓰는 명확하게 정의 된 중간 "일반 기계 코드"단계가 있습니까?) – dodgethesteamroller

+0

예, VBCC 컴파일러 프론트 엔드는 일반 기계 코드 . 이 명령어를 타겟 어셈블리 명령어로 변환하기 위해 백엔드 함수 (작성해야하는 함수)를 호출합니다. 컴파일러는 상당히 강력하며 좋은 최적화를 제공합니다. 백엔드가 작동하는 데에는 거의 시간이 걸리지 않습니다. 최상의 코드를 성취하는 것이 목표라면, 조금 더 힘들어집니다. – dsula

관련 문제