1.1 컴파일러의 필요성 : 간랸한 역사
. 기계어 : C7 06 0000 0002
. 어셈블리어 : mov x, 2
. 어셈블러 : 어셈블리어의 기호코드와 메모리 주소를 기계어의 해당 숫자코드로 번역
. 고급언어 : x = 2 디바이스 독립적
. 촘스키 문법 분류체계(Chomsky hierarchy) : 타입 0, 타입 1, 타입2, 타입 3 문법이라고 하는 4개 수준의 문법으로 구성
. 타입 2 또는 문맥 자유 문법(context-free grammar)는 프로그래밍 언어에 사용하기 가장 유용하다는 것이 입증됨
. 파싱 문제(parsing problem) : 오늘날 컴파일러 이론의 핵심적인 부분
. 촘스키 타입 3 문법과 상응되는 유한 오토마타(finite automata)와 정규표현식(regular expression)은 문맥 자유 문법과 밀접하게 연결됨
. 파서 생성기(parser generator) : 가장 널리 알려진 것으로 스티븝 존슨이 제작한 Yacc(yet another compiler-compiler)
. 스캐너 생성기(scanner generator) : 가장 널리알려진 것으로 Unix 시스템용으로 마이크 레스크가 개발한 Lex
1.2 컴파일러 관련 프로그램
. 해석기(interpreter) : 번역이 완료된 후 실행되는 목적코드를 생성하는 대신 원시 프로그램을 바로 실행한다. ex) BASIC, LISP
. 어셈블러(assembler) : 특정 컴퓨터의 어셈블리어용 번역기, 어셈블리어는 컴퓨터의 기계어를 기호로 표시한 형태라 번역하기 쉽다
. 링커(linker) : 따로 컴파일되거나 어셈블되어 서로 다른 목적 파일에 저장되어 있는 코드들을 바로 실행할 수 있는 하나의 파일로 모은다. 표준 라이브러리 함수코드 연결 등
. 전처리기(preprocessor) : 실제 번역이 시작되기 전에 컴파일러가 호출하는 독립 프로그램. 주석(comment) 지우기, 매크로 치환(macro substitution) 등
1.3 번역 절차
. 컴파일러는 내부적으로 다른 논리적 기능을 수생하는 여러 실행 단계들로 구성됨
. 세 가지 보조 부품? : 리터럴 테이블(literal table), 심볼 테이블(symbol table), 오류 취급기(error handler)
. 컴파일러의 실행 단계
. 스캐너(scanner) :
. 문자의 연속으로 되어있는 원시 프로그램을 실제로 읽는다.
. 문자의 나열에서 영어에서 단어와 같은 토큰(token)이라고 하는 의미있는 단위를 골라내는 어휘 분석(lexical analysis) 실시
. 예를 들어 a[index] = 4 + 2 는 공백 제외 문자 12개지만 토큰은 8개
a |
식별자 |
[ |
왼쪽 대괄호 |
index |
식별자 |
[ |
오른쪽 대괄호 |
= |
지정 |
4 |
수 |
+ |
덧셈 기호 |
2 |
수 |
. 리터럴은 3.141592와 같은 상수와 "Hello, world!"와 같은 인용 문자열을 의미함
. 파서(parser) :
. 스캐너로부터 토근을 받아서 프로그램의 구조를 결정하는 구문 분석(syntax analysis) 수행
'개발' 카테고리의 다른 글
plot graph color (0) | 2019.10.04 |
---|---|
0713 kernel (1) | 2019.07.13 |
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치 (0) | 2018.10.13 |
AWS dynamodb (0) | 2018.09.04 |
aws 네트워크 (0) | 2018.08.05 |