차이

이 문서의 선택한 이전 버전과 현재 버전 사이의 차이를 보여줍니다.

차이 보기로 연결

컴파일 [2012/06/11 15:37]
z3moon
컴파일 [2012/06/12 17:04] (현재)
z3moon
줄 82: 줄 82:
  
 이는 CPU 에 의존적인 최적화가 아니라는 점을 알아두자. 이는 CPU 에 의존적인 최적화가 아니라는 점을 알아두자.
 +
 +중간 코드 최적화 종류에는 이런 것들이 있다.
 +  * **상수 접기** - 상수끼리의 수식이나 부분식의 값을 컴파일시 미리 계산
 +  * **상수 전달** - 변수 안에 상수값이 들어있고 이를 사용하는 곳에서 매번 같은 값이 사용된다고 확신할 때 변수 대신 상수를 대입
 +  * **죽은 코드 제거** - 사용되지 않는 구문이나 조건식에서 항상 false 여서 실행되지 않는 구문을 제거
 +  * **공통 부분식 제거** - 어떤 식의 일부분이 함수 내 다른 곳에서 사용될 경우 식의 값을 저장해두고 이를 재사용
 +  * **연산 대체(strength reduction)** - 소스 코드상의 연산을 더 빠른 다른 CPU 연산으로 대체. 예를 들어 2의 멱수로 곱/나눗셈하는 것을 shift 연산으로 대체하고, 2의 멱수로 나눈 나머지 연산은 비트의 and 연산으로 대체
 +  * **유도(induction)** - 한 변수의 값이 다른 변수의 값에 100% 연동되는 경우 이 두 변수의 연산을 합침
 +  * **루프 불변식** - 루프 안에서 그 결과가 변경되지 않는 수식이 있는 경우 루프 밖에서 한번만 계산하여 루프 안에서 그 값을 사용
 +
 +==== 네이티브 코드 생성 ====
 +중간 코드의 최적화까지 마치면 이를 기계어 코드로 번역한다.
 +
 +이 과정에서 CPU 에 의존적인 명령어를 사용한다. 이 다음 최적화도 마찬가지
 +
 +===== 컴파일러 출력물 =====
 +컴파일러의 출력물은 일반적으로 실행가능한 기계어 코드겠지만 다른 경우도 있다.
 +
 +==== 다른 언어 코드로 된 출력물 ====
 +컴파일러의 출력물이 다른 low 한 언어로 된 코드인 경우가 있다. 이 경우 대부분 C 언어를 택하는데 일단 모든 플랫폼에 컴파일러가 존재하고 충분히 low 하기 때문이다.
 +
 +이런 경우 각 플랫폼의 c 언어 컴파일러에 의존할 수 있고 테스트해볼 수 있다는 장점이 있다.
 +
 +하지만 두번째 컴파일러를 돌려야 하므로 최종 실행파일을 얻기 위해 시간이 많이 소비된다는 단점도 있다.
 +
 +[[http://cminusminus.org/|C--]] 란 언어는 컴파일러의 결과물로 사용하기 위해 low 한 컨셉으로 제작된 언어이다.
 +
 +==== 어셈블리 언어 코드로 된 출력물 ====
 +대표적인 예로는 FSF/GNU GCC 컴파일러의 경우 Gas 어셈블러용 어셈블리 언어를 출력한다.
 +
 +장점으론 출력물이 어떤 기계어 명령에 대응되는지를 파악하기 쉽고, 소스 코드 중간에 직접 어셈블리 코드를 삽입할 수 있다는 점이 있다.
 +
 +단점으로는 위와 같이 두번째 컴파일러(이 경우 어셈블러) 를 거쳐 실행파일을 만들어야 한다는 점이다.
  
  
  
 {{tag>컴파일 컴퓨터 개발}} {{tag>컴파일 컴퓨터 개발}}