Translation phases

MySprtlty·2023년 12월 6일
0

C

목록 보기
37/37

🏷️Translation phases

  • C표준은 프로그램 번역 과정을 매우 상세하게 정의하고 있다.

📌Phase 1

  • 물리적인 프로그램 소스가 번역 프로그램에 의해 읽혀지면서, Source Character Set의 각 멤버로 매핑된다.
  • 🖇️cf. C언어는 크로스 컴파일을 배려하는 언어로, 프로그램이 번역되는 번역 환경과 그 프로그램이 실행되는 실행 환경을 구분한다.
    • Source Character Set: 번역 환경에서 프로그램 소스를 작성하는 데 쓰이는 문자세트
    • Execution Character Set: 실행 환경에서 프로그램이 실행 중에 입출력에 사용하는 문자세트
  • 삼중자는 프로그램 소스를 읽어 들이는 과정에서 대응하는 문자로 치환된다.

📌Phase 2

  • \와 개행문자가 바로 인접하여 나오는 경우, \와 개행문자를 지우고 물리적으로 두 줄을 한 줄로 연결한다.
  • 🔍ex)
#define FOO() 	\
	do {		\
    ...			\
    } while (0)

📌Phase 3

  • 프로그램 소스가 전처리기 토큰, 공백 문자, 주석으로 인식된다.
  • 각 주석은 하나의 공백으로 치환된다.

📌Phase 4

  • 전처리기 지시자가 실행되고, 매크로 확장이 일어난다.
  • #include 지시자는 추가되는 모든 헤더나 외부 파일에 지금까지의 과정(Phase 1 ~ 3)이 진행되도록 처리한다.
  • 전처리 과정이 완료되면 인식된 전처리기 지시자는 모두 지워진다.

📌Phase 5

  • 문자 상수와 문자열 상수 안에 내용으로 들어 있는 각 Source Character Set의 문자와 Escape Sequence을 대응하는 Execution Character Set의 문자로 변환한다.

📌Phase 6

  • 인접한 문자열 토큰이 결합된다.
  • 🔍ex) "Hello""World" -> "HelloWorld"

📌Phase 7

  • 각 전처리기 토큰이 일반 토큰(Token)으로 변환된다.
  • 이제 이 일반 토큰들이 parsing 과정을 거쳐 (Abstract) Syntax Tree를 만들면서 문법과 의미에 따라 번역된다.

📌Phase 8

  • 모든 External Linkage에 대한 참조가 처리되고, 라이브러리가 결합된다.

  • 실제 Implementation에서는 위 Phase들을 구분하지 않고 복합적으로 일어날 수 있다.
  • 다만 표준이 정의한 것을 따르는 것처럼(as-if rule) 번역 결과를 생성한다면 문제 없다.
  • ISO/IEC 9899 (C99)에 정의되어 있다.

Translation phases
1. Physical source file multibyte characters are mapped, in an implementationdefined manner, to the source character set (introducing new-line characters for end-of-line indicators) if necessary. Trigraph sequences are replaced by corresponding single-character internal representations.
2. Each instance of a backslash character (\) immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice. A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character before any such splicing takes place.
3. The source file is decomposed into preprocessing tokens and sequences of white-space characters (including comments). A source file shall not end in a partial preprocessing token or in a partial comment. Each comment is replaced by one space character. New-line characters are retained. Whether each nonempty sequence of white-space characters other than new-line is retained or replaced by one space character is implementation-defined.
4. Preprocessing directives are executed, macro invocations are expanded, and _Pragma unary operator expressions are executed. If a character sequence that matches the syntax of a universal character name is produced by token concatenation, the behavior is undefined. A #include preprocessing directive causes the named header or source file to be processed from phase 1 through phase 4, recursively. All preprocessing directives are then deleted.
5. Each source character set member and escape sequence in character constants and string literals is converted to the corresponding member of the execution character set; if there is no corresponding member, it is converted to an implementationdefined member other than the null (wide) character.
6. Adjacent string literal tokens are concatenated.
7. White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.
8. All external object and function references are resolved. Library components are linked to satisfy external references to functions and objects not defined in the current translation. All such translator output is collected into a program image which contains information needed for execution in its execution environment.

0개의 댓글