컴파일러
어휘 분석과 구문 분석, SSA 형식의 중간 표현, 상수 폴딩과 루프 언롤링 같은 최적화, 레지스터 할당 등 컴파일러의 동작 원리를 객관식 문제로 학습합니다.
—내 정답률
0 / 12푼 문제 수
컴파일러: 핵심 정리
컴파일러는 사람이 작성한 프로그램을 CPU가 실행할 수 있는 기계어로 번역합니다. 소스 코드를 토큰으로 나누는 어휘 분석, 문법에 따라 트리를 만드는 구문 분석, 타입과 이름을 검사하는 의미 분석을 거친 뒤 프로그램을 중간 표현(IR)으로 변환합니다.
IR 위에서 상수 폴딩, 공통 부분식 제거, 인라이닝, 루프 언롤링, 벡터화 같은 최적화를 적용하고, 레지스터 할당과 명령어 스케줄링을 거쳐 CPU에 맞는 코드를 생성합니다. 이러한 최적화를 이해하면 빠른 코드를 작성하는 방법과 하드웨어 성능을 최대한 끌어내는 방법을 알 수 있습니다.
컴파일러 전체 문제 (12)
- 반복 횟수가 100회인 루프를 본체를 4번 분량 나열하는 루프 전개로 바꿔 쓰면, 횟수 판정과 분기는 몇 번이 되는가? (100은 4로 나누어떨어진다고 가정한다)
- C 언어 프로그램에서 실행 파일이 만들어지기까지의 일반적인 흐름으로 올바른 것은 무엇인가?
- 생성한 기계어의 짧은 나열을 작은 창으로 보면서, 불필요한 명령의 조합을 더 좋은 명령으로 대체하는 최적화를 무엇이라고 하는가?
- 위의 코드에서 sq를 인라인 전개한 뒤 이어서 효과를 내는 최적화와 그 결과로 올바른 것은 무엇인가?
- 소프트웨어 파이프라이닝에 대한 설명으로 올바른 것은 무엇인가?
- 컴파일러가 부동소수점 수의 덧셈 (a + b) + c를 엄격한 설정에서는 a + (b + c)로 마음대로 재배열하지 않는 이유로 올바른 것은 무엇인가?
- 컴파일러의 자동 벡터화에서 사용되는 명령의 종류로 올바른 것은 무엇인가?
- 컴파일러 최적화가 지켜야 하는 기본 조건으로 올바른 것은 무엇인가?
- 코드 생성 단계의 하나인 명령 선택(인스트럭션 셀렉션)에 대한 설명으로 올바른 것은 무엇인가?
- 크로스 컴파일러에 대한 설명으로 올바른 것은 무엇인가?
- 최적화를 적용해 컴파일한 프로그램을 디버거로 조사하면 일부 변수의 값이 "표시할 수 없음"으로 나오는 경우가 있다. 주된 이유는 무엇인가?
- 위의 함수에 상수 전파·상수 폴딩·불필요한 코드 제거를 충분히 적용했을 때, 함수가 반환하는 값과 남는 코드로 올바른 것은 무엇인가?