-
[시스템프로그래밍] 9강 프로그래밍 언어 개요, 어휘 분석기, 구문 분석기, 오류 처리프로그래밍/시스템프로그래밍 2014. 4. 27. 03:20반응형
* 프로그래밍 언어 개요
프로그래밍 언어란 컴퓨터의 프로그램을 작성하기 위하여 고안된 언어를 말한다
가장 간단한 언어는 기계어를 영문자의 기호로 치환한 어셈블리어
C, C++, PHP, JAVA등의 다양한 언어가 있다.
저수준 언어(low level language)
컴퓨터가 이해하는 언어인 2진수, 기계어를 영문자의 기호로 치환한 어셈블리어와 같은 언어를 저급 또는 저수준 언어라고 한다.
기계에 가까운 언어
처리속도가 빠르다
프로그래밍하기 복잡하고 시간이 많이 걸린다.
2. 고수준 언어(high level language)
고수준 언어 또는 고급언어는 컴퓨터 중심의 언어가 아닌 프로그래머, 즉 사람 중심의 언어
기계어로 변환해주는 컴파일러가 반드시 필요
종류로는 Fortran, COBOL, C, C++, JAVA, PHP, ASP등이 있다.
3. 고급 언어 번역 시스템
고급 언어로 작성된 프로그램을 컴퓨터에서 실행하기 위해서는 컴퓨터가 이해할 수 있는 명령어, 실행파일인 기계어로 변환하는 프로그램이 필요, 이러한 작업을 수행하는 프로그램을 고급 언어 번역 시스템이라고 한다
대표적으로는 컴파일러와 인터프리터가 있다.
컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다.
컴파일 과정 : 어휘분석-구문분석-중간 코드 생성-코드 최적화-목적 코드 생성
* 어휘 분석기
프로그램의 각 문장을 토큰으로 구분하는 것을 어휘 분석이라고 한다.
문법적 단위로 잘라서 심벌 테이블을 작성하는 것
구문 분석의 출력인 구문 트리는 소스 코드의 구조만 그대로 복사하지만 어휘 분석의 출력은 소스 코드의 구조를 그대로 복사하는 것은 물론 프로그램의 의미까지 가져온다.
토큰(token)의 분류
어휘 분석기는 각 문장의 의미를 갖는 최소 문장 단위인 토큰으로 구분
토큰이 문법적으로 어떤 기호로 분류될 것인지를 결정
토큰은 일련의 문자열에서 구분할 수 있는 단위로 컴파일러나 어셈블러 등의 처리기에서 사용되는 어휘 분석 단위
어셈블리어의 경우 쉼표를 사용하여 서로 다른 토큰을 구별
2. 토큰의 인식
프로그래밍 언어에 의해 쓰여진 원시 프로그램 내의 각 토큰은 단순한 문법적 규칙을 따르며 대개 유한상태 기계 모델을 사용하여 토큰의 인식 알고리즘을 나타낼 수 있다.
상태전이도는 문장의 작성규칙을 정의하거나, 작성된 임의의 문자열이 토큰으로서 타당한지 판단하는 등 구문과 토큰의 특성을 서술
3. 어휘 분석의 결과
어휘 분석에서는 토큰들을 분류한 후에 각 토큰들이 어느 유형에 속하는지를 분석하여 이것을 테이블에 기록
테이블은 하나로 만들 수 있고 유형별로 숫자상수, 문자열, 변두등 각각 독립된 테이블로 생성가능하다
4. 기호표(symbol table)
어휘분석 단계에서 만드는 테이블 중의 하나가 기호표
기호표는 각 기호에 대한 정보를 수록한 것이며 컴파일러의 모든 단계에서 이용
일반적으로 식별자만을 수록하고 리터럴은 별도의 리터널표에 수록
2가지를 하나의 표에 수록하기도함
기호표는 프로그램에서 나오는 모든 기호를 나타낸 것
* 구문 분석기
구문 분석(syntax analysis)란 토큰들이 만드는 문장 또는 문법적 구성을 분석하여 파싱하는 것
구문 분석은 주어진 문장이 정의된 문법구조에 따라 정당하게 하나의 문장으로 사용될 수 있는가를 확인하는 작업
컴퓨터 분야에서는 컴파일러에 의하여 원시 프로그램을 기계어프로그램으로 번역할 때 낱말 분석의 결과로 만들어진 토큰들을 문법에 따라 분석하는 파싱 작업을 수행하여 파싱 트리를 구성하는 작업을 지칭
구문 분석에서는 문장을 구성하는 각 토큰 사이의 문법적 구조를 결정하게 되는 이를 파싱이라고 한다.
파서트리, 구문 트리
프로그램이 토큰 또는 기호로 구분이 되면 컴파일러는 구문구조를 파악하고 그 의미를 해독해야한다.
파서에 의해 분석된 결과를 파스 트리라고 한다.
파싱 알고리즘은 대상의 형태에 따라서 크게 좌우됨
2. 중간코드 생성
어휘 분석에서 구문 분석 단계를 거치면 다음 단계가 중간 코드를 생성하는 단계
중간 코드 생성 단계에서는 원시 프로그램에 대한 의미를 검사하고 그에 대한 중간 코드를 구문 분석에서 만들어진 구문구조를 이용하여 생성
중간 표현을 생성하는 이유 : 여러 가지 종류의 프로그래밍 언어나 기계어에 대응하기 위해
GCC의 경우 RTL라는 중간표현 사용
3. 코드 생성
중간 표현을 어셈블리 언어로 변환하는 단계를 코드 생성이라 한다
코드를 생성하는 프로그램 모듈이 코드 제네레이터이고 코드 생성 포인트는 프로그래밍 언어와 어셈블리 언어의 차이를 얼마나 줄일 수 있는 점이다.
컴파일러에 따라 의미 분석하는 루틴은 어셈블리 언어로 만들기도 하고 바로 기계어 코드로 만들기도한다, 이 경우 컴파일러의 작업시간을 단축시킬 수는 있으나 중간 코드를 생성 할 때보다는 최적화하기 어렵다
4. 목적코드생성
중간 코드를 어셈블리어 또는 기계어로 변화하는 작업을 목적 코드 생성이라 한다.
목적 코드 생성 단계에서는 연산을 수행할 레지스터를 선택하거나 기억장치에서의 데이터의 위치를 결정하여 실제로 사용하는 기계에 대한 코드를 생성
중간 코드 생성 단계에서 만들어진 중간 코드들을 기계 명령어로 바꾸어 주는 역할을 한다
일반적으로 목적 코드는 코드 생성기에 의해 생성
코드 생성 시 중복되는 명령어들을 피하도록 한다
효율적인 레지스터의 사용은 임기변수의 사용을 줄일 수 있을 뿐만 아니라 전체적인 수행 속도를 빠르게 할 수 있다.
* 코드 최적화
코드 최적화란 코드 크기를 최소로 하는 것
코드를 최적화하기 위해서는 목적 코드를 효율적으로 만들어 효율적인 실행을 할 수 있도록 중간형태 코드를 수정
* 오류 처리
오류 처리란 컴파일러의 중요한 기능의 한 가지로 원시 프로그램의 오류를 발견하여 사용자에게 알려주는 것
어휘분석 단계에서 원시 프로그램의 토큰이 철자가 틀렸다든지 구문 분석 단계에서 있어야 할 괄호 하나가 없는 것과 같이 문법 규칙에 대한 오류가 발생할 수 있다.
오류 중에는 컴파일러가 발견할 수 있는 것과 발견하지 못하는 것이 있다
반응형'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글
[시스템프로그래밍] 10강 운영체제 개요, CPU 관리, 주기억장치 관리, 주변장치 관리, 파일관리 (0) 2014.04.27 [시스템프로그래밍] 8강 인터프리터의 기능, 인터프리터의 구조 (0) 2014.04.27 [시스템프로그래밍] 7강 로더와 링커의 기능, 로더의 형태, 바인딩, 연결 및 재배치 로더의 설계 (0) 2014.04.26 [시스템프로그래밍] 6강 매크로, 매크로의 기능, 매크로 프로세서의 설계 (0) 2014.04.26 [시스템 프로그래밍] 5강 어셈블러 개요, 이중 패스 어셈블러, 이중 패스 어셈블러의 설계, 다중 패스 어셈블러, 테이블 처리 (0) 2014.04.26