2011-04-28 3 views
0

가난한 언어가 있다고 해봅시다. - 중복 어셈블리 코드를 많이 생성합니다 (예 : + b와 같이 간단하게 10 개의 라이너 어셈블리를 생성하지만 작업은 수행합니다) 및 다른 C는 최적화 된 어셈블리 코드를 생성하는 언어를 좋아합니다. (a + b와 같은 간단한 코드의 경우 2 줄). 동일한 서브셋을 사용하여이 두 언어로 컴파일러를 만듭니다. 이제 언어에 대한 컴파일러를 얻었고 부트 스트랩에 대한 준비가되었습니다. 부트 스트랩을 할 수는 있지만 전자의 컴파일러가 좋지 않다고 생각하지 않습니까? poort 코드 생성? 또는 모든 레이어에서 그 영향을받을 부분 집합을 정의하는 데 사용되는 첫 번째 언어가 아닙니다. 즉,이 컴파일러에서 생성 된 컴파일러는 무엇입니까?부트 스트랩에 사용되는 첫 번째 언어는 생성 된 최종 코드에서 항상 스탬핑/영향을 받습니까?

답변

1

갓 부팅 스트랩 된 컴파일러는 C 컴파일러를 이길 수 없습니다. 그러나 그 누구도 그런 식으로 머물러야한다고 말한 사람은 없습니다. (현대 C 컴파일러를이기는 데 어려움을 겪을 것이지만, 30 년 동안 정제 된 휴대용 어셈블리 언어의 컴파일러와 경쟁하고 있다고 가정 해 봅시다.) 귀하의 언어에 따라 부트 스트랩 된 컴파일러를 확장하는 것이 C로 작성된 것을 확장하는 것보다 훨씬 쉽습니다. 이렇게하면 C에서 구현하기가 더 어려워지는 많은 최적화 단계가 허용되어 점차적으로 컴파일러의 성능이 향상됩니다 (자체 호스트, 즉 자체 컴파일) 컴파일 한 다른 모든 프로그램의 성능.

이러한 차이점은 우리에게 또 다른 중요한 점을 안겨줍니다. 완전히 불합리하지 않는 한 컴파일러의 성능은 거의 관련이 없습니다. 생성 된 코드의 성능은 일반적으로 훨씬 더 중요하며 컴파일러의 코드 생성기에 달려 있으며 생성기를 컴파일하는 데 사용되는 컴파일러의 코드 생성기에는 의존하지 않습니다.

세 번째, LLVM과 같은 프로젝트에서 괜찮은 어셈블리 코드를 생성하는 것이 더 이상 어렵지 않게되었습니다. 괜찮은 LLVM 코드를 생성하더라도 리던던시가 포함되어 있어도 LLVM은 을 처리 할 수있는 여러 가지 최적화 단계를 통해 더 나은 실제 어셈블리 코드 을 할당하면 합리적인 기간 내에 직접 할 수있는 것보다 훨씬 효율적으로 레지스터를 할당 할 수 있습니다.

+0

자세한 내용을 알고있는 한 (내가 의도 한 말장난!) 말할 수는 없지만 직관적으로 대답은 나에게 의미가 있습니다. :) – Nishant

1

일단 컴파일러의 출력이 부트 스트랩되면 부트 스트랩 언어에 따라 어떻게 달라 집니까? 자신 만의 코드 생성을 수행한다면, 그 대답은 전혀 없어야합니다. 물론 컴파일러에는 최적의 코드가 없을 수도 있지만 직접 컴파일하여 해결할 수 있습니다.

1

내가 생각할 수있는 유일한 점은 부트 스트랩 된 컴파일러의 한 세대에서 다음 세대로 전달되는 상수 값입니다. 컴파일러가 생성하는 코드의 종류에 상관없이 "1"은 "1"과 같습니다.

상수에 대한 흥미로운 측면 : C의 이스케이프 문자. 나는 부트 스트랩을 사용하여 C 컴파일러를 작성한 나는 코드를 같이 볼 때 (I 쉽게 즐겁게 해요) 즐겁게되었습니다

// Decode escape characters. 
if (ch == '\\') { 
    ch = nextchar(); 
    switch (ch) { 
     case 'n': 
      ch = '\n'; 
      break; 
... 

어디 \ n을 '의 초기 값은 어디에서 왔는가? 어떤 사람은 어딘가에서 컴파일러에게 '\ n'이 10이라는 값을 말해야 만했습니다. ;-)

관련 문제