Replicated

컴파일러 개론 본문

학부/오토마타와 컴파일러

컴파일러 개론

라구넹 2025. 10. 4. 02:16

컴파일러

- 하이레벨 언어로 작성된 프로그램을 의미적으로(semantically) 동등한 대상 언어 프로그램으로 바꿔주는 소프트웨어

 

인터프리터

- Interptretation: 소스 프로그램이 의미하는 연산 수행

- 중간 코드로 전환 후 바로 실행

 

하이레벨 언어 -> 대부분의 프로그래밍 언어

미들레벨 언어 -> 어셈블리어

로우 레벨 -> 기계어

 

컴퓨터는 기계어를 쓰지만, 대부분의 사람들이 직접 쓸만한 것은 못된다

사람 중심 언어인 고급 언어를 쓰고, 고급 언어를 기계어로 변환해주는 번역기인 컴파일러, 인터프리터 필요

 

 

컴파일러의 장단점

- 전반적으로 인터프리터에 비해 효율적

- 반복문 처리에 효과적

- 번역 후 실행 파일로 저장 가능

- 한번 번역 후 실행은 여러번 반복 가능

- 작은 수정만 해도 컴파일 새로 해야 함

 

인터프리터의 장단점

- 사용자와 대화식 가능

- 실행 시간이 길다 (그래도 JIT 같은게 있긴 함)

- 매번 번역과 실행을 반복 수행

- 교육용 언어에는 유용

 

언어의 분류

사용자의 편리성에 따라

- Low-level lang (1세대) : 기계어

- Middle-level lang (2세대) : 어셈블리어

- High-level lang (3세대) : 대부분의 프로그래밍 언어

- Very high-level lang (4세대) : SQL같이.. 무엇을 할 지를 기술, 도메인 특화

- 5세대 언어? .. 문제 해결 자체를 자동화

    - 제약 조건, 논리만 기술

    - Prolog, Mercury

 

고급 언어의 장점과 분류

- 특정한 컴퓨터의 구조에 대한 지식이 없어도 프로그래머의 생각을 자연스럽게 표현할 수 있도록 만들어짐 (기계독립적)

- 저급 언어에 비해 배우기 쉽고 생산성을 높임

- 이식성 우수 .. 한 기종에서 다른 기종으로 프로그램을 쉽게 가져감

- 디버깅 용이

 

고급 언어의 분류 방법

- 특성별, 연대별

- 절차 언어와 비절차 언어

- 블록 언어와 비블록 언어

- 절차 언어는 명령어라고도 하며, 다음과 같은 특징

    - 명령의 순차적 실행

    - 기억 장소를 표시하기 위한 변수 사용

    - 값을 저장하기 위한 치환문 사용

 

언어의 분류

특성에 따라

Procedural (절차형) 언어 : 대부분 언어 

Logical (논리) 언어 : Prolog

Functional (함수) 언어 : Lisp, APL, Miranda, Haskell

Object-oriented PL : C++, Java

Visual Lang. : VEE

Markup Lang. : HTML, XML

 

* OOPL (Object-Oriented Programming Language)

- C, 파스칼과 같은 절차형 언어가 크고 복잡한 프로그램을 구축하기 어렵다는 문제점을 해결하기 위해 탄생

- 시뮬레이션 언어인 시뮬라(Simula)에서 유래

- 객체라는 작은 단위로 모든 처리를 기술하는 프로그래밍 방법

 

...

 

어떤 것을 언어라고 정의하기 위해 필요한 것은?

- Syntax (구조/문법)

- Semantics (의미)

 

번역기 종류

Preprocessor (macro, file inclusion)

Interpreter

Compiler

Assembler

Query Interpreter (SQL 질의어를 번역)

silicon compiler?

cross compiler?

 

크로스 컴파일러

- 원시 프로그램을 컴파일러가 수행되고 있는 컴퓨터의 기계어로 번역하는 것이 아니라 다른 컴퓨터의 기계어로 번역

 

실리콘 컴파일러

- 기존의 언어와 유사한 소스 언어를 가지고 있으나, 이 언어에서 사용되는 변수는 기억 장소의 위치를 나타내지 않고 스위치 회로에서의 논리적 신호(0, 1)나 논리 신호의 군(Group)을 나타냄. 또한 실리콘 컴파일러의 출력은 어떤 적당한 언어로 표현된 회로 설계도임

 

질의 인터프리터 (Query Interpreter)

- 관계 연산자나 부울 연산자를 포함하는 술어(predicate)를 하나의 데이터베이스에서 만족하는 레코드를 찾기 위한 명령어로 번역하는 것

 


컴파일러의 구조

고급언어 -> 컴파일러 -> 저급언어

컴파일러

- 어휘분석

- 구문분석

- 의미분석

- 중간코드

- 최적화

- 코드생성

 

컴파일러의 논리적 구조

- 분석(Analysus) - 합성(Synthesus) 모델 : 논리적인 구성 측면

    - 의미를 해석(분석)해서 새로운 코드를 생성(합성)

- 전단부(Front-end) - 후단부(Back-end) : 기계 독립 or 기계 종속, 구현 측면

    - 전단부는 언어에 독립적, 어떤 CPU나 OS에서도 독립적

    - 어휘 분석, 구문 분석, 의미 분석, 중간 코드 생성

    - 후반부는 기계 종속적, 특정 CPU, 운영체제에서 실행 가능한 목적 프로그램 생성

    - 코드 최적화, 코드 생성

 

인터프리터의 번역 과정

시작

- 다음 명령어 호출 (fetch)

- 명령어 디코드

- 지정된 피연산자 호출   /-> (실행 중지 연산 시 끝)

- 지정된 연산으로 분기

- 명령어 주소 하나 증가 

- 반복

 

컴파일러 번역 과정

- 프로그램 > ABC := E * 3.14 + ABC/E;

- 어휘분석 > ABC := E * 3.14 + ABC / E ; (글자 -> 토큰)

- 구문분석 > 식별자 := 산술식; (토큰 -> 문법구조, 트리)

- 의미분석 > 기억장소 <- 곱셈 + 나눗셈 (구조 -> 의미적 검증)

- 중간코드 > 최적화를 위한 코드

- 최적화 > 수행시간, 기억공간 최소화

- 목적코드 생성 > 레지스터의 수 등.. 기계 종속적 실행 파일 생성

 


 

컴파일러 vs. 인터프리터

- 반복문이나 계속 호출되는 부 프로그램처럼 많은 횟수 반복 처리 -> 컴파일러 큰 도움

- 인터프리터는 반복 처리시마다 다시 디코딩하지만, 컴파일러는 전체적으로 한 번 디코딩 시 다음부턴 실행만 하기 때문

- 그러나 컴파일러는 때로 몇 줄의 소스 프로그램이 몇 백줄의 기계어로 번역되어 큰 기억 장소를 필요로 함

- 일반적으로 컴파일러 기법이 인터프리터 기법보다 실행 속도가 10배 이상 빠름

- 인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로 번역, 실행해서 반복문일 때 실행 시간이 많이 늘어남

- 반면 한 줄 단위로 번역, 실행해서 매번 같은 기억 장소를 사용하여 기억 장소를 줄일 수 있다는 장점

 

혼합형 (바이트코드 컴파일러)

- 자바가 대표적

- 바이트코드 컴파일러는 중간 코드, 바이트 코드로 컴파일하고 바이트코드는 가상 기계에서 인터프리트되어 실행됨

 


 

컴파일러 개발 시 고려 사항

컴파일러의 논리적 구조 결정

어떻게 구현할 것인가?

- One pass : 속도가 빠름, 효율성이 좋음

- Two pass : 이식성, 기계독립적인 최적화 가능

 

컴파일러 자동화 도구

컴파일러를 자동적으로 생성해주는 도구

프로그래밍 언어와 머신이 많아질수록 더 많은 컴파일러 필요

- N개 언어를 M개 컴퓨터 실행시키려면

- N*M개 컴파일러 필요

- LEX, YACC

 

컴파일러 제작 도구

- 소프트웨어 제작 툴은 한 개 이상의 컴파일러 단계 구현에 사용 가능

- Scanner generators (LEX, 어휘 분석기 자동 생성)

- Parser generator (YACC, 구분 분석기 자동 생성)

- Syntax-directed talanslation engines (구문 지향 번역 엔진)

- Automatic code generators (중간 코드, 목적 코드 자동 생성)

- Data-flow engines (프로그램 내 데이터 흐름 분석하여 최적화에 사용)

 

왜 컴파일러를 공부하는가?

컴파일러는 굉장히 중요한 시스템 소프트웨어

물론 실제적으로 개발할 일은 거의 없음

 

그러나, 원리를 활용할 일들이 있음

- 스캐닝, 파싱, 정적 분석 등

- AI, 알고리즘,계산 이론, 하드웨어 구조 등의 지식을 통합적으로 포함

 

컴파일러의 응용

- 다른 응용 소프트웨어 개발에 많은 도움 (컴파일러 개발에 활용된 좋은 알고리즘들을 이용하여 다른 소프트웨어 개발에 도움)

- Text searching, web filtering, word processing

- command interpreter

- 자연어 번역기 개발

 

컴파일러를 응용한 도구

- Editors (syntax highlighting)

- Pretty printers

- Static checkers

- Interpreters

- Text formatters

- Silicon compilers (VHDL)

- Query Interpreters, Compilers (Databases)

- 언어 번역기

- 인공지능 시스템

 

* Text formatters

- 문서에 사용되는 문자들을 입력으로 하고 문단을 나타내는 명령어, 그림 혹은 아래 첨자, 위 첨자 등의 수학 기호를 입력으로 받아 분석하여 처리(TEX)