저번 포스트에서는 어셈블러에 대하여 알아보았습니다. 이번 포스트에서는 프리 프로세서를설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

 

전처리기라고도 불리는 프리 프로세서는 소스 프로그램과 목적 프로그램이 모두 고급 언어인 번역기로, 프로그래밍 언어에 유용한 기능을 추가하여 언어를 확장하는 역할을 합니다.프리 프로세서는 일반적으로 코볼 언어로 작성된 프로그램을 가지고 있지만 코볼 컴파일러가 없는 경우에는 실행할 수 없습니다. 하지만 코볼 컴파일러는 없어도 C 컴파일러가 있다면 실행해볼 수 있습니다.

코볼 언어로 작성된 프로그램을 C 언어로 작성된 프로그램으로 변환하고, C 언어로 변환된 프로그램을C 컴파일러에서 컴파일 및 실행하면 됩니다. 이때 코볼 언어로 작성된 프로그램을 C 언어로 작성된프로그램으로 변환하는 프로그램을 코볼-TO-C 프리프로세서라고 합니다.

 

 

즉 코볼-TO-C 프리프로세서나 C 컴파일러​가 있다면 코볼 컴파일러가 없어도 코볼 언어로 작성된 프로그램을 컴파일하여 실행할 수 있습니다.

 


 

◎ 프리 프로세서의 헤더 파일(header file)이 포함된 파일 포함(file inclusion) 기능

- C 언어에서 사용자가 #include<stdio.h>라는 문장을 작성했다면 프리 프로세서가 컴파일하기 전에 #include<stdio.h>를 삭제하고, 그 자리를 입출력과 관련된 표준 함수 stdio.h의 내용으로 대체합니다.

 

◎ 매크로(Macro) 기능

- 프리 프로세서는 매크로로 정의된 부분에 대해 컴파일하기 전에 매크로의 내용으로 확장시킵니다.

예를 들어#definemax 45는 이 프로그램에서 max가 나타날 때마다 그것을 45로 바꿔줍니다.

 

◎ 조건부 컴파일(Conditional compile) 기능

- 조건부 컴파일은 조건에 따라 소스 프로그램의 일부분을 선택적으로 삽입하거나 삭제하는 기능을 말합니다. 예를 들면아래의 그림과 같습니다.

 

 

 


 

※ 오늘은 '프리 프로세서'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학#컴파일러#컴파일러의필요성#프리프로세서

'컴퓨터공학 > 컴파일러' 카테고리의 다른 글

[컴파일러] 어셈블러  (0) 2019.09.29
[컴파일러] 번역기의 종류  (0) 2019.09.29
[컴파일러] 컴파일러는 왜 필요할까?  (0) 2019.09.27

 

 

저번 포스트에서는 번역기의 종류에 대하여 알아보았습니다. 이번 포스트에서는 어셈블러를 설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

어셈블러는 어셈블리어로 작성된 소스 프로그램을 그에 대응하는 기계어로 번역된 목적 프로그램으로 변환해주는 번역기이고, 어셈블리어는 기계어를 사람이 좀 더 이해하기 쉽도록 기호화한 것입니다. 어셈블리 명령어(instruction)는 목적 기계에 따라 다르게 표현되는데 [아래의 그림]에서 예제를 다루어 보았습니다.

 

 


 

※ 어셈블리 명령어의 예

 

 

LOAD R1, a 코드는 변수 a에 있는 값을 레지스터 R1에 적재하라는 것이고, ADD R1, #2 코드는 레지스터 R1에 있는 값과 상수 2를 더하여 레지스터 R1에 저장하라는 것이며, 마지막으로는 STORE b, R1 코드는 레지스터 R1에 저장되어 있는 값을 변수 b에 저장하라는 것이다. 이렇게 하면 치환문 b = a + 2를 계산하는 코드입니다.

어셈블러를 구현하는 방법은 여러 가지가 있는데, 그중에서 가장 많이 사용되면서 가장 간단한 형태는 2-패스(two pass) 어셈블러입니다. 여기서 하나의 패스란 하나의 입력 파일을 단 한 번만 읽는 것으로 구성되는 단위를 말한다. 즉 2-패스 어셈블러는 2개의 패스로 구성됩니다.

첫 번째 패스에서는 메모리를 표시하는 모든 식별자를 찾아내고 그 식별자들을 기호표(symbol table)에 저장합니다. 예를 들어 [어셈블리 명령어의 예]의 코드를 읽으면 [아래의 그림, 예제 2]와 같은 항목을 포함하는 기호표가 만들어집니다. [예제 2]에서는 하나의 단어(word)가 4바이트로 구성되고 각 식별자의 주소가 0바이트부터 시작한다고 가정했습니다.

 

예제 2, [어셈블리어 명령어에 대한 식별자의 어셈블러 기호표]

 

 

두 번째 예제에서는 각 연산 코드를 기계어에서 수행될 수 있는 비트의 표현으로 나타냅니다. 예제 2의 어셈블리 명령어에 대한 가상적인 기계어는 아래의 그림과 같습니다.

 

 

예제 3 [어셈블리어 명령어에 대한 식별자의 어셈블러 기호표]에 대한 기계어

 

 

 

 

예제 3에서 첫 번째 4비트는 명령어로 0001은 LOAD, 0011은 ADD, 0010은 STORE을 나타냅니다. LOAD는 메모리에서 레지스터로 자료를 옮기고, STORE는 레지스터에서 메모리로 자료를 옮깁니다. 그다음 2비트는 레지스터를 표시하는 것으로 여기서 01은 레지스터 1을 의미합니다.

이어서 그다음 2비트는 태그를 나타내는데, 00은 다음의 8비트가 메모리 주소를 가리키는 일반적인 주소 방식(Ordinary Address Mode= 명령의 주소부가 피연산자가 저장되어 있는 기억장치의 주소를 지시) 일 때, 10은 다음의 8비트가 피연산자인 직접 번지 지정 방식(Immediate address mode= 주소의 값 자체가 피연산자)일 때 사용됩니다. *는 각각의 피연산자가 재배치(relocatable) 가능 기계어에서 재배치 비트임을 나타내는 것입니다.

 


 

※ 오늘은 '어셈블러'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #컴파일러 #컴파일러의필요성 #어셈블러 #기계어

 

 

지난 포스트에서는 컴파일러의 필요성에 대하여 알아보았습니다. 이번 포스트에서는 번역기의 종류의 큰 틀을 설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

 

번역기는 하나의 프로그래밍 언어로 작성된 프로그램을 그와 동등한 의미를 가진 다른 프로그래밍 언어로 된 프로그램으로 변환하는 프로그램입니다. 이때 입력되는 프로그램을 소스 프로그램(Source Program)이라 하고 소스 프로그램을 기술하는 언어를 소스 언어(Source Language)라고 부릅니다.

또한 출력되는 프로그램을 목적 프로그램(Object Program)이라 하고, 목적 프로그램이라 하고, 목적 프로그램을 기술하는 언어를 목적 언어(Object Language, Target Language)라 합니다.

 


 

번역기의 종류는 아래의 그림과 같이 어셈블러, 컴파일러, 프리프로세서(Preprocessor), 인터프리터(Interpretor)등이 있는데, 이 가운데 가장 대표적인 번역기는 바로 컴파일러입니다.

 

 

 

그림에서 보듯이 어셈블러는 어셈블리어로 작성된 소스 프로그램을 그에 대응하는 기계어로 번역된 목적 프로그램으로 변환해주는 번역기입니다. 그리고 컴파일러는 고급 언어인 C나 코볼로 작성된 소스 프로그램을 그에 대응하는 어셈블리어나 기계어로 번역된 목적 프로그램으로 변환해주는 번역기입니다.

이때 소스 언어가 C이면 C 컴파일러라 하고,소스 언어가 코볼이면 코볼 컴파일러라고 합니다. 마찬가지로 프리프로세서는 프로그래밍 언어에 유용한 기능을 추가하여 언어를 확장하는 역할을 하는 것으로, 소스 프로그램과 목적 프로그램이 모두 고급 언어인 번역기를 말합니다. 한편 인터프리터는 다른 번역기와 달리 문장 단위로 번역과 동시에 실행한 후 그 결과를 출력하는 번역기입니다.

 


 

※ 오늘은 '번역기의 종류'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #컴파일러 #컴파일러의필요성 #번역기의종류

'컴퓨터공학 > 컴파일러' 카테고리의 다른 글

[컴파일러] 프리 프로세서  (0) 2019.09.29
[컴파일러] 어셈블러  (0) 2019.09.29
[컴파일러] 컴파일러는 왜 필요할까?  (0) 2019.09.27

 

 

4차 산업혁명 시대를 맞아 우리는 컴퓨터를 통해 활발하게 일상의 불편함을 해결하고 있습니다. 우리가 컴퓨터를 통해 문제를 해결한다는 것은 인간과 컴퓨터가 의사소통을 한다는 것을 의미합니다. 의사가 소통을 하는 데는 언어가 필요한데 컴퓨터와 인간이 사용하는 언어는 다르기 때문에 이를 번역해주는 컴파일러가 필요합니다. 이번 포스트에서는 컴파일러의 필요성에서 대해서 간략히 설명할 것입니다.

 

 

 

 

 

많은 사람들은 왜 컴파일러를 사용해야 하는지, 컴파일러가 무슨 일을 하는지 잘 모른 채 컴파일러를 사용해 개발을 하고 있습니다.

인간이 컴퓨터에게 일을 시키려면 컴퓨터와 인간이 서로 이해할 수 있는 공통적인 대화 수단이 필요합니다. 이러한 대화 수단을 언어(language)라고 하는데, 언어는 의사소통을 하는 대상이 누구냐에 따라 자연 언어(natural language)와 형식 언어(formal language)로 나뉘게 됩니다. 자연 언어는 한국어, 영어, 중국, 프랑스어, 일본어 등 인간과 인간이 의사소통을 하는 언어로서 지역이나 민족에 따라 자연 발생적으로 생성된 언어입니다.

반면에 형식 언어는 인간과 기계 사이에 의사소통을 하는 언어로서 인위적으로 만들어진 언어입니다. 이 포스트에서는 컴퓨터와 의사소통과 관련된 내용을 설명할 계획이므로 자연 언어보다는 형식언어에 관심을 중점을 둘 것입니다.

 

MIT교수이자 언어학자인 노암 촘스키

 

미국 언어학자이자 MIT 공대 교수인 노암 촘스키(Noam Chomsky)는 형식 언어를 4 가지로 분류했는데 그 종류와 관계는 아래의 그림과 같습니다.

 

형식 언어 중에서 컴퓨터와의 의사소통에 사용되는 언어를 '컴퓨터 언어' 혹은 '프로그래밍 언어(Programming language)'라고 합니다. 프로그래밍 언어는 현실 세계에 존재하는 어떤 문제를 풀기 위한 일련의 과정을 기술하는데 사용하는 것으로 사용 목적, 형태와 기능, 세대 등에 따라 여러 가지로 분류할 수 있습니다. 먼저 형태와 기능에 따라 저급 언어(Low-level langauge)와 고급 언어(High-level language)로 나뉩니다.

 

 

기계어 번역

 

 

저급언어에는 기계어(Machine language)와 어셈블리어(Assembly language) 등이 있습니다. 프로그래밍 언어 중에서 초기에 사용된 언어는 0과 1로 구성된 기계어였습니다. 초기에 기계어를 주로 사용한 이유는 컴퓨터가 0과 1로 만들어진 추상 기계(Abstract machine)이기 때문이었습니다. 그러나 기계어로 프로그래밍을 하는 것은 상당히 어렵고 매우 복잡하다는 단점이 있어 이를 보완하기 위해 나온 언어가 어셈블리어입니다.

어셈블리어는 0과 1로 구성된 기계어 대신 더하기에 ADD, 빼기에는 SUBT 등 대응하는 명령 기호를 사용함으로써 프로그래밍 작업에서 기계어의 단점을 조금 보완했습니다. 하지만 여기서 문제가 발생하게 됩니다. 인간이 어셈블리어를 사용하여 문제를 서술하고 나니 컴퓨터가 이것을 이해하지 못하였습니다. 이해할 수 있는 언어가 달랐기 때문입니다.

이를 쉽게 이해하기 위해 자연 언어를 빗대어 살펴보겠습니다. 예를 들어 프랑스어를 모르는 한국인과, 한국어를 모르는 프랑스인이 서로 만나 인사를 한다고 가정을 해보겠습니다. 서로 말을 알아듣지 못하니 통역사가 필요한데, 이러한 통역사는 아래의 그림과 같이 번역기(Translator)의 역할을 수행하게 됩니다. 앞서 언급한 어셈블리어를 기계어로 번역해주는 번역기는 어셈블러(Assembler)라고 합니다.

 

 

 

 

 

그러나 어셈블리어도 저급 언어의 수준을 벗어나지는 못했으며, 그 후 저급 언어의 단점을 보완하기 위해 C,파스칼,알골,포트란,코볼 등 사람 중심의 고급 언어가 나오게 되었습니다. 한편 고급 언어도 저급 언어와 마찬가지로 기계어를 변환해주는 번역기가 필요한데 이를 '컴파일러'라고 합니다.

컴파일러가 필요한 이유는 다음과 같이 정리할 수 있습니다.

인간은 문제를 해결하기 위해 컴퓨터를 사용하며 컴퓨터와 의사소통을 하는데 '언어'가 필요합니다. 컴퓨터는 기계어를 사용하지만 인간이 기계어를 사용하여 문제를 표현하기란 무척 어렵기 때문에 인간은 사람 중심 언어인 고급 언어를 사용합니다. 그런데 인간이 사용하는 고급 언어는 컴퓨터가 이해하지 못합니다. 따라서 인간이 사용하는 고급언어를 기계어로 변환해주는 컴파일러가 필요한 것입니다.

 


 

※ 오늘은 '컴파일러는 왜 필요할까?'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

'컴퓨터공학 > 컴파일러' 카테고리의 다른 글

[컴파일러] 프리 프로세서  (0) 2019.09.29
[컴파일러] 어셈블러  (0) 2019.09.29
[컴파일러] 번역기의 종류  (0) 2019.09.29

+ Recent posts