| English | 의미 |
|---|---|
| compiler/kəmˈpaɪlə/ | 컴파일러 |
| interpreter/ɪnˈtɜːprɪtə/ | 인터프리터 |
| lexical analysis/ˈleksɪkl əˈnæləsɪs/ | 어휘 분석 |
| tokens/ˈtəʊkənz/ | 토큰 |
| syntax analysis/ˈsɪntæks əˈnæləsɪs/ | 구문 분석 |
| abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ | 추상 구문 트리 |
| syntax error/ˈsɪntæks ˈerə/ | 문법 오류 |
| semantic analysis/səˈmæntɪk əˈnæləsɪs/ | 의미 분석 |
| code generation/kəʊd ˌdʒenəˈreɪʃn/ | 코드 생성 |
| code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ | 코드 최적화 |
콤마 하나로 발견된 우주선 손실 버그
- NASA의 마이너 1은 발사 후 293초 만에 1962에서 파괴되었습니다. 이 실패는Often Guidance 소프트웨어의 단일 오류 문자로 인해 발생했다고 비판받습니다.
- 이 이야기가 자주 재인용되는 이유는 모든 프로그래머가 아는 공포이기 때문입니다: 당신이 의도하지 않은 내용을 작성한 프로그램을 컴파일러가 기꺼이 번역하는 것.
- 컴파일러는 하나의 프로세스가 아니라 5개이며, 각 단계는 서로 다른 종류의 실수를 포착합니다. 어떤 단계가 무엇을 포착하는지 알면 특정 오류의 출처를 파악할 수 있습니다.
- 이 수업은 인터프리터가 아무것도 생성하지 않고 프로그램을 실행하는 방식과 컴파일러가 거치는 5단계에 대한 것입니다.
인터프리터가 프로그램을 실행하는 방법
- 인터프리터는 소스 코드를 동시에 번역하고 실행하여 문장 단위로 처리합니다.
- 각 문장에 대해 줄을 읽고 분석하며, 타입을 확인한 후 즉시 동작을 실행하고 다음으로 이동합니다.
- 실행 가능한 파일을 생성하지 않습니다: 번역본은 메모리 내에 존재할 뿐이며 버려집니다. 이것이 커리큘럼의 정확한 지점입니다. 즉, 번역된 버전 없이도 프로그램을 실행할 수 있다는 점입니다.
- 문제 있는 줄에 도달하면 즉시 오류를 보고通常停止,这是开发期间的快速 피드백입니다. 모든 실행 시 재번역되므로 느리며, 소스와 인터프리터가 모두 있어야 합니다.

한 번 번역하고 유지하거나, 번역하여 실행하고 잊어버림
인터프리터(interpreter):
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
줄 단위로 작동하며 도달하는 즉시 오류를 보고합니다; 실행 파일로 저장되지 않으며 일반적으로 느립니다.
인터프리터는 번역된 버전을 생성하지 않고도 프로그램을 실행할 수 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
번역은 메모리에만 존재하며 문장 단위로 이루어져 버려집니다. 이것이 인터프리터가 프로그램 실행 시마다 필요함을 의미합니다.
1단계:.lexical analysis(어휘 분석)
- **어휘 분석(lexical analysis)**은 소스의 개별 문자들을 **토큰(tokens)**으로 묶습니다: 키워드, 식별자, 연산자 및 리터럴.
- 공백과 주석은 버려집니다. 컴파일러에게 의미 없기 때문이며, 식별자는 심볼 테이블에 등록됩니다.
- 따라서
total ← count * 2은 식별자, 대입, 식별자, 연산자, 리터럴이라는 톤 순서로 변합니다. 레렉서(lexer)는 이것이 유효한지 알지도关心하지 않습니다.
어휘 분석(lexer)은 다음을 변환합니다:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
lexer가 문자를 토큰으로 묶고 공백/주석을 제거하며, parsing이 트리를 구축합니다.
어휘 분석은 소스 문자를 ____으로 묶고 공백 및 주석을 제거합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
키워드, 식별자, 연산자 및 리터럴입니다. lexer는 이 서열이 유효한 프로그램인지 판단하지 않습니다.
2단계: 구문 분석(syntax analysis)
- 구문 분석(syntax analysis), 또는 파싱(parsing), 톤 순서가 언어의 **문법(grammar)**에 부합하는지 확인하고 구조를 나타내는 **추상 구문 트리(abstract syntax tree)**를 구성합니다.
- brakets가 누락되거나,
ENDIF이 누락되거나, 키워드가 틀린 곳에 있으면 여기서 포착됩니다: 이것이 구문 오류.syntax error이며, 컴파일러가 프로그램을 실행하지 않아도 오류를 보고할 수 있는 이유입니다.

파서(parsing)가 검증하는 문법
3단계: 의미 분석(semantic analysis)
- **의미 분석(semantic analysis)**는 구문적으로 유효한 프로그램이 실제로 의미가 있는지 확인합니다: 변수는 사용 전에 선언되어야 하며, 대입 양측의 타입은 호환되어야 하며, 함수는 올바른 개수의 인자로 호출되어야 합니다.
total ← "seven" * 2는 완벽한 구문이지만 완전한 무의미입니다. 오직 이 단계만이 이를 포착합니다.- 이것이 시험에서 테스트하는 차이점입니다: 구문(form)은 형태이고, 의미(meaning)는 뜻입니다.
다음 중 어떤 것이 문법 분석 대신 의미 분석에 의해 검증됩니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
괄호는 문법이므로 syntax; 공백은 lexer; 레지스터는 code generation입니다. 선언과 타입은 meaning입니다.
4단계와 5단계: 코드 생성 및 최적화(code generation and optimisation)
- **코드 생성(code generation)**은 트리를 탐색하여 타겟 기계어를 출력하며, 레지스터를 선택하고 데이터를 배치합니다.
- **코드 최적화(code optimisation)**은 기능은 바꾸지 않고 코드를 개선합니다: 중복 작업을 제거하고, 상수 표현식을 컴파일 타임에 계산하며, 파이프라인에 맞춰 명령어를 재배열합니다.
- 출력은 **독립적인 실행 가능한 파일(stand-alone executable)**로, 컴파일러가 없어도 실행됩니다.

5단계, 그리고 각 단계가 이전 단계가 잡지 못한 것을 포착함
컴파일의 단계들
컴파일이 소스 코드를 처리하는 과정을 단계별로 확인하십시오. 각 단계는 출력을 다음 단계에 전달합니다 — 문자가 토큰으로, 토큰이 트리로, 트리가 최적화된 기계 코드로 변환됩니다.
각 컴파일 단계를 그것이 수행하는 작업과 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
각 단계는 프로그램을 한 단계씩 변환합니다: 토큰, 트립, 검증, 최적화된 코드 순서로.
컴파일 단계를 순서대로 나열하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
어휘 → 문법 → 의미 → 코드 생성 → 최적화.
코드 최적화의 목표는:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
최적화는 생성된 코드를 개선합니다(상수 접합, 중복 제거, 파이프라인을 위한 재배치).
풀이 예제: 어떤 단계가 어떤 오류를 포착하는가
x ← 5 +: 톤이 문법에 맞지 않으며, 우피연산자가 없는 연산자가 있으므로 **구문 분석(syntax analysis)**입니다.x ← y + 1에서y이 절대 선언되지 않았음: 형태는 괜찮지만 뜻이 아니므로 **의미 분석(semantic analysis)**입니다.IF a > b THEN OUTPUT a에ENDIF이 없음: 다시 **구문 분석(syntax analysis)**입니다.- 실행되어 잘못된 평균을 출력하는 프로그램: 어느 단계도 포착하지 못함. 이것은 로직 오류이며, 테스트를 통해만 찾을 수 있습니다. 해당 단계를 명칭하고 이전 단계들이 이를 통과시킨 이유를 설명하시오.
각 오류 라인을 해당 컴파일 단계와 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
구문은 형식이며 의미론은 의미입니다. 논리 오류는 두 가지 모두에서 유효하지만 의도상으로는 틀린 것입니다.
풀이 예제: 두 번역기 비교
- 컴파일러와 인터프리터가 프로그램을 처리하는 방식의 차이 2가지를 서술하시오. [4]
- 컴파일러는 실행하기 전에 전체 프로그램을 번역하여 **실행 가능한 파일(executable)**을 생성하므로, 컴파일러가 없을 때도 실행됩니다; 인터프리터는 문장 단위로 번역하고 실행하며, 실행 가능한 파일을 생성하지 않음으로, 인터프리터가 매 실행 시 필요합니다.
- 컴파일러는 번역 후 모든 오류를 함께 보고합니다; 인터프리터는 해당 줄에 도달했을 때 첫 번째 오류를 보고 ثم stops.
- 각 채점은 한 쌍(pairing)입니다: 하나가 하는 것과 다른 것이 하는 것을 말하시오.
놓칠 수 있는 점
- 인터프리터는 번역된 버전(translated version)을 생성하지 않습니다. 이것이 커리큘럼에서 사용하는 구절이며,它在得分中使用该短语。
- 레렉서(lexer)는 **토큰(tokens)**을 생성하고 공백과 주석을 버립니다. 프로그램이 유효한지 체크하지 않습니다.
- **구문(syntax)**은 형태(form)이고, **의미(semantic)**는 뜻(meaning)입니다. 미선언된 변수는 구문 오류가 아닌 의미 오류입니다.
- 최적화는 **프로그램이 하는 일(what the program does)**을 바꾸어서는 안 되며, 오직 빠르거나 간결하게 하는 방법만 바꿀 수 있습니다.
이해했습니다
- **인터프리터(interpreter)**는 문장 단위로 번역하고 실행하며, 실행 가능한 파일을 생성하지 않으며, 첫 번째 오류를 해당 줄에서 보고하며, 모든 실행 시 재번역합니다
- 어휘 분석은 토큰을 생성하고 공백과 주석을 제거하며, 구문 분석은 문법을 확인하고 추상 구문 트리를 구축하여 구문 오류를 포착합니다.
- 의미 분석은 의미를 검증합니다: 선언, 타입, 인자 개수 등
- 코드 생성은 기계어를 출력하고 최적화는 동작을 변경하지 않고 코드를 개선하여 독립 실행 파일을 만듭니다.