2013-11-27 2 views
12

컴파일러의 맥락에서 "낮추다"라는 용어를 잘 정의 할 수 있습니까?구함 : 컴파일러의 맥락에서 "낮추다"라는 용어를 잘 정의하십시오.

내가 알 수있는 바로는 상위 수준 작업을 동일한 수준의 하위 수준 작업 조합으로 변환하는 것이지만 실제로는 잘 모르겠다. 몇 분 후 Google 검색. (예 : GCC 또는 LLVM의 몇 가지 사용법이 있지만 정의에 대한 참조가 없습니다.)

+0

'줄이기'라고하지 않습니까? 또는 문법 정의에서이 이름이 무엇인지, 기억이 안납니다. – slugster

+0

꽤 모호합니다. 이것이 전체 컴파일러의 기능입니다. 구체적인 예를 '강도 감소'라고 부릅니다. '* 2' =>'<< 1'. – EJP

답변

13

박사 돕 스는 단지 an article by Walter Bright 그는이 용어를 언급, (dlang 명성의) 발표 :

절감을

(그러나 지적 안드레이 Alexandrescu의했다 가늠자에 분명 하나 개의 의미 론적 기술 나)는 "낮추기"라고합니다. 내부적으로 더 복잡한 의미 구조를 간단한 문장으로 재 작성합니다. 예를 들어, while 루프와 foreach 루프는 for 루프로 다시 쓸 수 있습니다. 그런 다음 나머지 코드는 for 루프 만 처리하면됩니다. 이것은 while 루프가 D에서 어떻게 구현 되었는가에 대한 몇 가지 잠재적 인 버그를 밝혀 내기에 드러났다. 그래서 좋은 승리였다. 또한 try-finally 문과 같이 scope guard 문을 다시 쓰는 데 사용됩니다. 의미 처리에서 찾을 수있는 모든 경우가 구현에 유리합니다.

이 "낮추는"재 작성을 방지하는 특수한 규칙이 언어에있는 것으로 밝혀지면 돌아가서 언어 디자인을 다시 방문하는 것이 좋습니다.

의미 구조를 처리 할 때 공통점을 찾을 수 있으면 언제든지 구현 노력과 버그를 줄일 수 있습니다.

4

정의와 좋은 링크를 찾을 수 없지만 좋은 예를들 수 있습니다. LLVM에서 LLVM IR은 몇 가지 크기의 정수를 지원합니다. clang을 포함한 대부분의 C/C++ 컴파일러는 long long 및 64 비트 데이터 유형을 지원합니다. mips (32 비트)와 같은 많은 32 비트 프로세서에는 64 비트 추가 또는 비교와 같은 명령어가 없습니다. LLVM은 이러한 64 비트 연산을 프로세서가 수행 할 수있는 연산 (일반적으로 32 비트)으로 "낮 춥니 다". int64_t의 경우

예를 들어 비교, LLVM은 꽤 멋진 얻을 수

compare the upper 32 bits with a signed comparison 
if they are equal, compare the lower 32 bits with an unsigned comparison 

일부 감소로 낮아집니다. 예를 들어, 곱셈 명령어를 지원하지 않는 프로세서에서 간단한 곱셈은 시프트로 바뀔 수 있고 더 복잡한 것은 런타임 지원 라이브러리에 대한 호출로 바뀔 수 있습니다.