<aside> 🌟 소스 코드 → 어휘 분석(토큰 추출) → 구문 분석(구문 트리 생성) → 의미 분석(구문 트리 이상 확인) → 중간 코드를 어셈블리어로 변환 → 어셈블리어 코드를 기계어로 변환
</aside>
어휘 분석 : 내가 만든 코드의 각 항목을 토큰으로 쪼개기
int a = 1;
-> 어휘 분석
T_Keyword int
T_Identifier a
T_Assign =
T_Int 1
T_Semicolon ;
구문 분석 : while 구문 같은 구문을 해석하고, 트리로 만듬
while 뒤에는 ( 가 와야하는걸 알고있음 → while 토큰 뒤에 ( 토큰이 아니다? ⇒ syntax 오류 보고
이렇게 해석한 while문의 구조를 트리로 만듬
while(표현식/a<b)
{
반복 내용/b=b-1;
}
-> 구문 분석
while -> 조건 표현식 -> < -> a, b
-> 순환 내용 -> = -> b +> b, 1
의미 분석 : 구문 트리의 이상 확인
정수 값에 문자열을 더하거나, = 좌우에 있는 값이 하나는 int, 하나는 float? 같은 구문 트리의 이상을 확인해서 컴파일 오류 보고
중간 코드 생성 : 완성된 구문 트리를 탐색한 결과로 좀 다듬어진 형태인 중간 코드 생성
==>대상 파일 생성 / 컴파일러가 ~~.c인 소스 코드 파일을 ~~.o인 대상 파일로 변환 완료
<aside> 🔗 모든 소스 파일에는 각각의 대상 파일이 존재 → 그럼 이걸 하나의 실행 파일로 바꾸려면? : 링커
</aside>
<aside> 🍇 심벌 해석 → 실행 파일 생성 → 재배치
</aside>
심벌 = 전역 변수, 함수의 이름을 포함하는 모든 변수 이름 / 지역 변수는 다른 모듈에서 절대 안쓰므로 링커가 신경 안씀
링커가 여러 대상 파일들을 합치면서 a 파일에서 참조한 외부 변수가 다른 모듈에 단 하나 잘 존재하나? 확인하면서 하나의 실행파일로 만듬 → 링커가 여기 저기서 참조하는걸 어떻게 아는가? = 컴파일러가 써놨음
컴파일러가 만든 대상 파일에는 코드 영역 + 데이터 영역 + 심벌 테이블 존재
코드 영역 : 소스 파일에 정의된 함수에서 변환된 기계 명령어 저장