560 likes | 897 Views
컴파일러. INDEX. 01 컴파일러. 02 C 프로그램 컴파일러. 03 단일 모듈 프로그램. 04 다중 모듈 프로그램. 01 컴파일러. 컴파일러. 프로그래밍언어 번역기 (Translator) 원시 프로그램을 입력으로 받아 의미적으로 동등하면서 직접 기계에서 실행될 수 있는 형태로 번역. Source program. Target program. 컴파일러. 좋은 (Good) 프로그래 밍 언어의 요건 명확한 언어 개념 문법적인 구조 (syntax, grammar)
E N D
INDEX 01 컴파일러 02 C 프로그램 컴파일러 03 단일 모듈 프로그램 04 다중 모듈 프로그램
컴파일러 • 프로그래밍언어 번역기(Translator) • 원시 프로그램을 입력으로 받아 의미적으로 동등하면서 직접 기계에서 실행될 수 있는 형태로 번역 Source program Target program
컴파일러 • 좋은(Good) 프로그래밍 언어의 요건 • 명확한 언어 개념 • 문법적인 구조(syntax, grammar) • 의미(semantics) • 프로그래머의 생각을 자연스럽게 표현 • 호환성(이식성), 신뢰성, 모듈화, 효율성 • 언어의 확장성이 우수 • 좋은 프로그래밍 환경
컴파일러 • Ada • 구조화되고, 통계학적 형태를 가지고, 명령적이며, 객체 지향적인 고급 수준의 컴퓨터 프로그래밍 언어 • 1977년에서 1983년까지 수백 개의 프로그래밍 언어를 대신할 목적으로 CII 허니웰 벌의 진 이히비아가 주도한 팀에서 고안 • C나 C++의 몇 가지 작업이 같지만, Ada는 매우 강력한 유형 시스템의 언어
컴파일러 • Ada • Hello world
컴파일러 • C++ • C 언어에 객체지향 프로그래밍을 지원하기 위한 내용이 덧붙여진 것 • 현재 C와 C++가 명확한 구별 없이 혼재되어 사용되는 컴파일러가 대부분임
컴파일러 • JAVA • 썬 마이크로시스템즈의제임스고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이며, 썬 마이크로시스템즈에서 무료로 제공 • 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했지만 현재 웹 애플리케이션 개발에 가장 많이 사용되는 언어이며, 모바일 기기용 소프트웨어 개발에도 널리 사용중
컴파일러 • JAVA • Hello world
컴파일러 • 프로그래밍 언어 번역기 종류 • 컴파일러(Compiler) • 인터프리터(Interpreter) • 어셈블러(Assembler) • 전처리기(Preprocessor) • et cetera..
컴파일러 • 컴파일러(Compiler) 정의 • 고급 언어로 쓰여진 프로그램을 어떤 특정한 컴퓨터에서 직접 수행 가능한 형태의 프로그램으로 번역해 주는 시스템 프로그램 High-level Source Program Compiler Object Program (Assembly Language, Machine Language) • C compiler • test.c => C-complier => test.obj
컴파일러 • 크로스 컴파일러(Cross Compiler) 정의 • 원시 프로그램을 컴파일러가 수행되고 있는 기계에 대한 기계어로 번역하는 것이 아니라 다른 기종에 대한 기계어로 번역하는 컴파일러 • SPARC 컴퓨터에서 Intel 8060/80386 코드 생성 C 컴파일러 목적프로그램(SPARC) C 프로그램 C 크로스 컴파일러(intel) 목적프로그램(Intel) SPARC 컴퓨터
컴파일러 • 인터프리터(Interpreter) 정의 • 원시 프로그램을 입력으로 받아 목적 언어 또는 프로그램으로 변환하지 않고, 직접 실행해서 결과를 출력해주는 시스템 프로그램 • HTML 인터프리터, Bytecode인터프리터(Java) 입력 데이터 원시 프로그램 Interpreter 실행 결과
컴파일러 • 전처리기(Preprocessor) 정의 • 프로그래밍 언어에 유용한 기능들을 추가 • 언어 확장(Language eXtension) • 확장된 프로그램은 기본 언어에 대한 언어 번역기에 의해 번역 전처리기 번역기 확장된 원시 프로그램 원시 프로그램 목적 프로그램
컴파일러 • 전처리기(Preprocessor) • #include • #define • #if • #ifdef • #undef • #pragma • #line • #error
컴파일러 • 매크로(Macro) • 유사한 원시 코드를 매크로로 정의하고 필요할 때 마다 확장 • 프로그램의 생산성을 증가 • Ex. #define MAX 1000
컴파일러 • 컴파일러의 개략적인 구조 • 원시 프로그램 : Source Program • 목적 프로그램 : Target Program • 전단부: Front-end 하단부 : Back-end • 중간코드 : Intermediate Code (Ex.. 어셈블리어) 원시 프로그램 전단부 중간코드 후단부 목적 프로그램
컴파일러 • 전단부(Front-End) • 원시 프로그래밍 언어 종류에 의존적 • 원시 프로그램을 분석, 중간 코드 생성 • 원시 프로그램마다 전단부가 각각 존재 • 어휘 분석, 구문 분석, 의미 분석, 중간 코드 생성
컴파일러 • 후단부(Back-End) • 목적 기계(Target Machine)에 의존적 • 중간 코드를 특정 기계에 대한 목적 코드로 번역 • 목적 기계마다 각각의 후단부가 존재 • 목적 코드 생성, 코드 최적화 단계
C 프로그램 컴파일러 • 대부분의 유닉스 유틸리티와 상용 프로그램들은 C (또는 C++)로 작성되어 있음 • 일부 UNIX 시스템에는 C 컴파일러가 기본적으로 내장되어 있으며, C 언어를 알지 못하고서는 UNIX시스템을 깊이 있게 이해하기 어려움 • 최근에는 C 컴파일러를 UNIX와 별도로 판매하는 것이 일반적임 (cc) • 공개된 C 컴파일러로 gcc (GUN cc) 컴파일러가 널리 사용됨
C 프로그램 컴파일러 • C 컴파일러 사용법 • cc [-options] C-file • gcc [-options] C-file
C 프로그램 컴파일러 • 기본적인 사용법 • gcchello.c • hello.c를 컴파일하여object file인 hello.o를 생성 • 또한, 실행 가능한 파일(executable file)로서 a.out을 생성
C 프로그램 컴파일러 • 주요 옵션(-c) • gcc –c hello.c • Object code(기계어 코드)만 생성하며, 실행 파일은 만들지 않음 • 상기 예의 경우, hello.c를 컴파일하여object code인 hello.o를 생성
C 프로그램 컴파일러 • 주요 옵션(-o) • gcc –o hello hello.c • C 컴파일러는 실행 파일의 default 이름으로 a.out을 생성하며, 상기 –o 옵션을 사용하여 원하는 파일명으로 실행파일을 바꿀 수 있음 • 여러 C 파일(혹은 object file)을 묶어서 하나의 실행 파일을 생성할 수도 있음
C 프로그램 컴파일러 • 주요 옵션(-g) • gcc –g hello hello.c • 디버거라는 프로그래밍을 하는데 있어서 매우 유용한 Tool로 개인적으로 반드시 숙지해야 함
C 프로그램 컴파일러 • 주요 옵션(-s) • gcc –S hello.c • 어셈블리 언어(Assembly Language)로 컴파일 함 • 상기 예의 경우 hello.s의 어셈블리 파일이 생성됨
C 프로그램 컴파일러 • 주요 옵션(-l) • gcc –o math_hellomath_hello.c -lm • 라이브러리(대개 /usr/lib 디렉토리에 존재)를 링크하기 위하여 사용함 • -lxyz는 libxyz.a를 링크하라는 의미임 (예를 들어, -lm은 libm.a의 링크를 의미함)
단일 모듈 프로그램 • 하나의 C 프로그램 파일로 프로그래밍 된 경우 • 매우 간단한 프로그램인 경우에 단일 모듈 프로그램이 유리함
다중 모듈 프로그램 • 여러 개의 C 프로그래밍 파일들로 프로그래밍된 경우 • 복잡하여 대단위 프로그램인 경우에 다중 모듈 프로그램을 사용함 (일반적으로, 모든 프로그램은 다중 모듈로 구성된다고 할 수 있음)
다중 모듈 프로그램 • 단일 모듈 프로그램의 문제점 • 코드의 재사용(reuse)이 어렵고, 여러 사람이 참여하는 프로그래밍이 불가능함 • 예를 들어, 앞서“main.c”프로그램을 작성하는데 있어서의 문제점은 다른 프로그램에서 “operation_plus”함수와 “operation_minus”함수를 사용할 수 없다는 점임 • 즉, 다른 프로그램에서 operation_plus함수를 사용하고자 할 경우, 이 부분을 자르고 붙여서 원하는 프로그램에 삽입하여 사용하여야 하는 어려움이 있음
다중 모듈 프로그램 • 함수의 재사용 • 앞의 예에서 “operation_plus”함수를 공유하는 방법은 “main”프로그램에서 해당 함수를 따로 분리하여 별도 파일로 작성한 후, 해당 파일을 컴파일한 후 원하는 프로그램에 링크하여 사용하는 것임 • 이러한 기법은 동시에 많은 프로그램들이 이 함수를 사용할 수 있게 하며, 이러한 특성을 가진 함수를 재사용(reusable) 함수라 함.
다중 모듈 프로그램 • operation_main.c의 소스 코드
다중 모듈 프로그램 • 재사용 함수의 준비 • 재사용할 수 있는 함수를 준비하기 위해서는 • 함수의 소스 코드를 포함하는 소스 코드 파일과 • 함수의 prototype을 포함하는 헤더 파일을 함께 작성해야 하며, 헤더 파일은 접미어“.h”를 갖도록 이름 지어야 한다.
다중 모듈 프로그램 • 재사용 함수의 준비 • 그 후에 cc(gcc)의 –c 옵션을 사용하여 소스 코드 모듈을 컴파일하여“.o” 형태의 object file을 생성한다. • object file은 실행 파일이 생성될 때 다른 object file과 결합이 가능하게 해주는 symblotable 정보와 함께 machine code를 포함한다.
다중 모듈 프로그램 • operation_plus.c와 operation_minus.c소스코드
다중 모듈 프로그램 • operation_plus.h와 operation_minus.h소스코드 • 헤더 파일에 포함되는 일반적인 내용 • 함수의 prototype (상기 파일이 예제에 해당함) • 상수에 대한 정의 (#define MY_PI 3.141592) • 전역 변수에 대한 정의 (extern intcommon_pi)
다중 모듈 프로그램 • 개별 파일을 각기 컴파일하고 링크하기 • 각 소스 코드 파일을 개별적으로 번역하기 위해서는 cc(gcc)의 –c 옵션을 사용 • gcc –c operation_main.c • 각 소스 코드 파일은 “.o”를 갖는 각기 다른 object file을 생성하게 됨 • 각각의 object file을 링크하여 실행 파일을 생성함