검수요청.png검수요청.png

"컴파일"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(새 문서: '''컴파일러(Comfiler)'''란고급언어(사람이 구분하기 쉬운 언어)로 작성된 프로그램을 컴퓨터가 이해할 수 있는 기계어로 번역하는 것을...)
 
잔글
 
(사용자 3명의 중간 판 10개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''컴파일러(Comfiler)'''[[고급언어]](사람이 구분하기 쉬운 언어)로 작성된 프로그램을 컴퓨터가 이해할 수 있는 기계어로 번역하는 것을 컴파일이라 하고 이것을 실행 시키는 [[프로그램]]을 컴파일러라고 한다. 또한 시스템에서 실행되는 객체 코드를 생성하는 컴파일러를 [[크로스 컴파일러]]라 한다.
+
'''컴파일'''(compile)이란 [[C 언어|C]], [[자바|Java]] 등 인간이 이해할 수 있는 고급 언어로 작성된 프로그램 [[소스 코드]]를 [[컴퓨터]]가 이해할 수 있는 [[기계어]] 또는 [[바이트코드]]로 번역해 주는 것을 말한다. 반면 [[스크립트 언어]]인 [[자바스크립트|JavaScript]], [[제이쿼리|jQuery]], [[PHP]], [[ASP]], [[JSP]] 등은 컴파일 과정이 필요 없이 바로 실행될 수 있다. 쉽게 말해 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정이다. 원시코드에서 목적 코드(목적 파일)로 바꾸는 것이 컴파일이로 목적 파일을 실행 파일로 바꾸는 것이 링크이다. 원시코드는 c언어나 java, 파이썬 같은 사람이 이해할 수 있는 언어를 말하고 목적 파일은 컴퓨터가 이해할 수 있는 언어를 말한다. 실행 파일도 마찬가지로 컴퓨터가 이해할 수 있는 언어로 구성되어 있다. 컴파일에 대해 알지 못한 사람들이 많이 오해하고 있는 부분이 자신이 소스 코드를 작성하고 실행 파일을 만드는 것을 컴파일이라고 생각하지만 이것은 컴파일러가 하는 역할일 뿐 컴파일이라는 개념은 원시코드에서 목적 파일로 바꾸는 것이다. 바꾸어진 목적 파일은 단순한 컴퓨터가 이해할 수 있는 목적 파일일 뿐 실행할 수는 없으면 이것을 링커라는 실행 가능할 파일로 만드는데 이 실행파일을 .exe파일이라고 부른다.
 +
<ref name="컴파일">Mark J, 〈[https://m.blog.naver.com/white_cap/221003190571 (C언어)(컴파일)컴파일 이란?]〉, 《네이버 블로그》, 2017-05-11</ref>
  
 +
[[파일:컴파일이해.png|800픽셀|섬네일|가운데|컴파일 이해]]
  
==역사==
+
== 특징 ==
컴파일러(Comfiler)라는 개념은 그레이스 호퍼(Grace Hopper)가 컴퓨터의 교육(The Education of a Computer)이라는 제목의 보고서를 발표함으로서 최초로 정의되었다. 보고서에서 호퍼는 고급 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 이진(binary)코드로 만들어 주는 기술을 소개해, 오늘날 컴파일러의 개념과 프로그래밍 코드의 해석방법을 정의했다. 호퍼는 자신이 A-0이라는 컴파일러를 직접 개발하기도 했다.
+
=== 필요성 ===
 +
[[파일:컴파일.png|500픽셀|섬네일|컴파일의 필요성]]
 +
컴퓨터는 모든 명령 CPU가 처리하고 CPU는 모든 명령을 0과 1로 이해하고 실행한다. CPU는 0과 1, 오직 2가지 경우 밖에 모른다. 'A'라는 알파벳을 입력할 때 우리는 'A'라고 해석하지만 컴퓨터는 00110010와 같은 이진코드로 해석하고 명령을 처리한다는 것이다. 즉, 우리의 언어는 컴퓨터가 이해하지 못하므로 컴퓨터가 이해할 수 있는 통역사인 컴파일이 필요하다.<ref name="컴파일"/>
  
 +
=== 종류 ===
 +
==== 분할 컴파일 ====
 +
[[파일:분할컴파일.png|500픽셀|섬네일|분할 컴파일]]
 +
분할 컴파일이란 두 가지 이상의 소스코드 파일을 한꺼번에 컴파일하는 것을 말한다. 그냥 컴파일의 경우 1개의 소스코드를 1개의 목적 파일로 만들어 1개의 실행파일로 만들지만 분할 컴파일은 여러 개의 소스 코드를 여러 개의 목적 파일로 만들어 1개의 실행파일로 만든다. 여러 가지 소스파일로 분할하여 관리하면 업그레이드하거나 에러를 잡거나 디버깅하기가 쉬워진다.<ref name="컴파일"/>
  
==컴파일러의 실행 단계==
 
'''컴파일러는 4가지의 주요한 단계를 실행한다.'''
 
  
===스캔===
+
=== 컴파일과 빌드 차이점 ===
스캐너는 소스 코드에서 한 번에 한 문자씩 읽고 어떤 문자가 어디 라인에 있는지 추적한다.
+
[[파일:컴파일과빌드.png|500픽셀|섬네일|컴파일과 빌드]]
 +
빌드는 기본적으로 실행 파일을 만드는 것을 의미한다. 사실상 하나의 소소스파일이 하나의 실행 파일로 생성되기 위해서는 컴파일과정과 링크과정을 거쳐야 한다. 링크라는 것은 말 그대로 실행파일로 만드는데 필요한 기능들을 컴파일된 파일에 연결시킨다는 의미이다. 따라서 .c파일을 컴파일한 후에 생성된 오브젝트 파일들을 이용하여 링크 작업을 해야 실행 파일인 .exe파일이 생성된다. 비주얼 C++에서는 빌드를 통해서 링크 과정을 실행한다. 만약 .c파일이 컴파일 되어있지 않은 상태에서 빌드를 실행하면 컴파일과 링크를 모두 실행하며 이미 .obj로 컴파일된 파일이 존재하면 빌드를 실행했을 때 컴파일 작업을 생략하고 링크 작업을 한후에 실행파일을 생성한다. 그러나 컴파일된 파일은 실행파일이 아니다. 다시 말하면 우리가 윈도우 환경에서 실행할 수 있는 .exe파일의 형태가 아니라는 의미이다. 비쥬얼 C++에서는 .c로 되어있는 소스코드를 컴파일하면 .obj파일로 변환한다. 마찬가지로 리눅스나 유닉스에서도 .c로 되어있는 소스코드를 컴파일하면 .o파일로 변환한다. 이와 같은 .obj파일이나 .o와 같은 파일들을 오브젝트 파일이라고 부른다.<ref>File, 〈[https://blog.naver.com/uosarang/503861 컴파일(Compile)과 빌드(Build)의 차이점]〉, 《네이버 블로그》, 2003-12-26</ref>
  
 +
== 단계 ==
 +
컴파일은 다음 4가지 단계를 거쳐 실행된다.
  
===어휘 분석===
+
;1단계 스캔
컴파일러는 소스 코드에 나타나는 문자 스퀸스를 일련의 문자 문자열로(토큰) 변환한다. 이 문자는 어휘 분석기라는 프로그램에서 특정한 규칙에 의해 연결이 된다. 어휘 분석기는 기호 표를 사용하여 생성 된 토큰에 해당하는 단어를 소스 코드에 저장한다.
+
스캐너(scanner)는 [[소스 코드]]에서 한 번에 한 문자씩 읽고 어떤 문자가 어느 라인에 있는지 추적한다.
  
 +
;2단계 어휘 분석
 +
컴파일러는 소스 코드에 나타나는 문자 시퀀스를 일련의 문자열인 토큰으로 변환한다. 이 문자는 어휘 분석기라는 프로그램에서 특정한 규칙에 의해 연결이 된다. 어휘 분석기는 기호 표를 사용하여 생성된 토큰에 해당하는 단어를 소스 코드에 저장한다.
  
===구문 분석===
+
;3단계 구문 분석
이 단계에서는 사전 분석을 통해 구문 분석을 수행한다. 사전의 처리을 통해 어휘 분석 중에 작성된 토큰이 사용법에 따라 올바른 순서인지 여부를 결정한다. 원하는 결과를 얻을 수 있는 키워드의 집합의 올바른 순서를 구문이라 한다. 컴파일러는 구문의 정호가성을 보장하기 위해 코드를 확인해야 한다.
+
이 단계에서는 사전 분석을 통해 구문 분석을 수행한다. 사전 처리를 통해 어휘 분석 중에 작성된 토큰이 사용법에 따라 올바른 순서인지 여부를 결정한다. 원하는 결과를 얻을 수 있는 키워드의 집합의 올바른 순서를 구문이라 한다. 컴파일러는 구문의 정확성을 보장하기 위해 코드를 확인해야 한다.
  
 +
;4단계 의미 분석
 +
의미 분석은 여러 가지 단계로 구성된다. 처음으로 주어진 언어의 문법에 대한 순서와 함께 토큰의 구조가 검사된다. 토큰의 구조의 의미는 파서와 분석기에 의해 해석되어 최종적으로 객체 코드라는 중간 코드를 생성한다. 오브젝트 코드는 프로그램에서 마주칠 때 대응하는 토큰에 대한 프로세서 조치를 나타내는 명령어를 포함한다. 마지막으로 전체 코드가 [[파싱]]되어 해석이 가능한지 확인한다. 일단 최적화가 수행될 수 있다면, 수정된 적절한 토큰이 오브젝트 코드에 삽입되어 최종 오브젝트 코드가 생성되어 파일 내에 저장된다.<ref>출처 : https://www.techopedia.com/definition/3912/compiler</ref>
 +
<ref>〈[https://blog.naver.com/uosarang/503861 Compiler〉, 《techoped》, 2016-12-21</ref>
 +
== 평가 ==
 +
컴파일의 장단점은 다음과 같다.
  
===의미 분석===  
+
=== 장점 ===
의미 분석은 여라가지의 단계로 구성이 된다. 처음으로 주어진 언어의 문법에 대한 순서와 함께 토큰의 구조가 검사가된다. 토큰의 구조의 의미는 파서와 분석기에 의해 해석되어 최종적으로 객체 코드라고하는 중간 코드를 생성한다 오브젝트 코드는 프로그램에서 마주칠 때 대응하는 토큰에 대한 프로세서 조치를 나타내는 명령어를 포함한다. 마지막으로, 전체 코드가 파싱되어 해석이 가능한지 확인한다. 일단 최적화가 수행 될 있다면, 수정 된 적절한 토큰이 오브젝트 코드에 삽입되어 최종 오브젝트 코드가 생성되어 파일 내에 저장한다.<ref>https://www.techopedia.com/definition/3912/compiler</ref>
+
* 한번 컴파일을 하면 그대로 사용이 가능하며 반복 작업을 처리할 경우 시간 소모를 매우 줄일 수 있다.
 +
* 컴파일 과정에서 단계별로 주기억장치로 들어가기 때문에 기억장소의 크기가 조정이 가능하다.
 +
* 전체 실행 시간을 매우 효율적으로 절약할 있다.  
 +
* 컴파일러는 일일이 매번 따로 번역할 필요가 없다.
  
 +
=== 단점 ===
 +
* 한 줄로 입력할 경우 프로그램이 때로는 몇 십, 몇 백 개의 [[기계어]]로 번역되기 때문에 프로그램 실행을 위해서는 대용량의 기억공간이 필요하다.
  
==컴파일러 원리==
+
{{각주}}
'''컴파일러의 원리는 총 3가지의 단계로 구성이 되어 있다.'''
 
  
 +
== 참고자료 ==
 +
* Mark J, 〈[https://m.blog.naver.com/white_cap/221003190571 (C언어)(컴파일)컴파일 이란?]〉, 《네이버 블로그》, 2017-05-11
 +
* File, 〈[https://blog.naver.com/uosarang/503861 컴파일(Compile)과 빌드(Build)의 차이점]〉, 《네이버 블로그》, 2003-12-26
 +
* 〈[https://blog.naver.com/uosarang/503861 Compiler〉, 《techoped》, 2016-12-21
  
===Front End===
+
== 같이 보기 ==
토큰화를 위한 어휘 분석(Lexing), 파스 트리 구성을 위한 구문 분석(Parsing), 중간 코드를 위한 의미 분석 등을 처리한다
+
* [[프로그램]]
 
+
* [[프로그래밍]]
 
+
* [[컴파일러]]
===Middle end===
+
* [[기계어]]
중간 코드에 대해 프로그램의 분석과 최적화를 처리한다.
+
* [[소스코드]]
 
 
 
 
===Back end===
 
각각의 CPU 아키텍처에 대해 코드 최적화를 수행하며 최종 코드를 생성한다.
 
 
 
 
 
==컴파일의 장점==
 
===장점===
 
* 한번 컴파일을 하면 그대로 사용이 가능하며 반복 작업을 처리할 경우 시간 소모를 매우 줄일 수 있다.
 
*컴파일 과정에서 단계별로 주기억장치로 들어가기 때문에 기억장소의 크기가 조정이 가능하다.
 
*전체 실행 시간을 매우 효율적으로 절약할 수 있다.
 
*컴파일러는 일일이 매번 따로 번역할 필요가 없다.
 
 
 
===단점===
 
* 한 줄로 입력할 경우 프로그램이 때로는 몇 십,백 개의 기계어로 번역이 되기 때문에 프로그램은 큰 기억용량을 요구한다.
 
  
==같이보기==
+
{{프로그래밍|검토 필요}}
*[[고급언어]]
 
*[[크로스 컴파일러]]
 
==각주==
 
[[분류:컴파일러]]
 

2020년 9월 9일 (수) 00:57 기준 최신판

컴파일(compile)이란 C, Java 등 인간이 이해할 수 있는 고급 언어로 작성된 프로그램 소스 코드컴퓨터가 이해할 수 있는 기계어 또는 바이트코드로 번역해 주는 것을 말한다. 반면 스크립트 언어JavaScript, jQuery, PHP, ASP, JSP 등은 컴파일 과정이 필요 없이 바로 실행될 수 있다. 쉽게 말해 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정이다. 원시코드에서 목적 코드(목적 파일)로 바꾸는 것이 컴파일이로 목적 파일을 실행 파일로 바꾸는 것이 링크이다. 원시코드는 c언어나 java, 파이썬 같은 사람이 이해할 수 있는 언어를 말하고 목적 파일은 컴퓨터가 이해할 수 있는 언어를 말한다. 실행 파일도 마찬가지로 컴퓨터가 이해할 수 있는 언어로 구성되어 있다. 컴파일에 대해 알지 못한 사람들이 많이 오해하고 있는 부분이 자신이 소스 코드를 작성하고 실행 파일을 만드는 것을 컴파일이라고 생각하지만 이것은 컴파일러가 하는 역할일 뿐 컴파일이라는 개념은 원시코드에서 목적 파일로 바꾸는 것이다. 바꾸어진 목적 파일은 단순한 컴퓨터가 이해할 수 있는 목적 파일일 뿐 실행할 수는 없으면 이것을 링커라는 실행 가능할 파일로 만드는데 이 실행파일을 .exe파일이라고 부른다. [1]

컴파일 이해

특징[편집]

필요성[편집]

컴파일의 필요성

컴퓨터는 모든 명령 CPU가 처리하고 CPU는 모든 명령을 0과 1로 이해하고 실행한다. CPU는 0과 1, 오직 2가지 경우 밖에 모른다. 'A'라는 알파벳을 입력할 때 우리는 'A'라고 해석하지만 컴퓨터는 00110010와 같은 이진코드로 해석하고 명령을 처리한다는 것이다. 즉, 우리의 언어는 컴퓨터가 이해하지 못하므로 컴퓨터가 이해할 수 있는 통역사인 컴파일이 필요하다.[1]

종류[편집]

분할 컴파일[편집]

분할 컴파일

분할 컴파일이란 두 가지 이상의 소스코드 파일을 한꺼번에 컴파일하는 것을 말한다. 그냥 컴파일의 경우 1개의 소스코드를 1개의 목적 파일로 만들어 1개의 실행파일로 만들지만 분할 컴파일은 여러 개의 소스 코드를 여러 개의 목적 파일로 만들어 1개의 실행파일로 만든다. 여러 가지 소스파일로 분할하여 관리하면 업그레이드하거나 에러를 잡거나 디버깅하기가 쉬워진다.[1]


컴파일과 빌드 차이점[편집]

컴파일과 빌드

빌드는 기본적으로 실행 파일을 만드는 것을 의미한다. 사실상 하나의 소소스파일이 하나의 실행 파일로 생성되기 위해서는 컴파일과정과 링크과정을 거쳐야 한다. 링크라는 것은 말 그대로 실행파일로 만드는데 필요한 기능들을 컴파일된 파일에 연결시킨다는 의미이다. 따라서 .c파일을 컴파일한 후에 생성된 오브젝트 파일들을 이용하여 링크 작업을 해야 실행 파일인 .exe파일이 생성된다. 비주얼 C++에서는 빌드를 통해서 링크 과정을 실행한다. 만약 .c파일이 컴파일 되어있지 않은 상태에서 빌드를 실행하면 컴파일과 링크를 모두 실행하며 이미 .obj로 컴파일된 파일이 존재하면 빌드를 실행했을 때 컴파일 작업을 생략하고 링크 작업을 한후에 실행파일을 생성한다. 그러나 컴파일된 파일은 실행파일이 아니다. 다시 말하면 우리가 윈도우 환경에서 실행할 수 있는 .exe파일의 형태가 아니라는 의미이다. 비쥬얼 C++에서는 .c로 되어있는 소스코드를 컴파일하면 .obj파일로 변환한다. 마찬가지로 리눅스나 유닉스에서도 .c로 되어있는 소스코드를 컴파일하면 .o파일로 변환한다. 이와 같은 .obj파일이나 .o와 같은 파일들을 오브젝트 파일이라고 부른다.[2]

단계[편집]

컴파일은 다음 4가지 단계를 거쳐 실행된다.

1단계 스캔

스캐너(scanner)는 소스 코드에서 한 번에 한 문자씩 읽고 어떤 문자가 어느 라인에 있는지 추적한다.

2단계 어휘 분석

컴파일러는 소스 코드에 나타나는 문자 시퀀스를 일련의 문자열인 토큰으로 변환한다. 이 문자는 어휘 분석기라는 프로그램에서 특정한 규칙에 의해 연결이 된다. 어휘 분석기는 기호 표를 사용하여 생성된 토큰에 해당하는 단어를 소스 코드에 저장한다.

3단계 구문 분석

이 단계에서는 사전 분석을 통해 구문 분석을 수행한다. 사전 처리를 통해 어휘 분석 중에 작성된 토큰이 사용법에 따라 올바른 순서인지 여부를 결정한다. 원하는 결과를 얻을 수 있는 키워드의 집합의 올바른 순서를 구문이라 한다. 컴파일러는 구문의 정확성을 보장하기 위해 코드를 확인해야 한다.

4단계 의미 분석

의미 분석은 여러 가지 단계로 구성된다. 처음으로 주어진 언어의 문법에 대한 순서와 함께 토큰의 구조가 검사된다. 토큰의 구조의 의미는 파서와 분석기에 의해 해석되어 최종적으로 객체 코드라는 중간 코드를 생성한다. 오브젝트 코드는 프로그램에서 마주칠 때 대응하는 토큰에 대한 프로세서 조치를 나타내는 명령어를 포함한다. 마지막으로 전체 코드가 파싱되어 해석이 가능한지 확인한다. 일단 최적화가 수행될 수 있다면, 수정된 적절한 토큰이 오브젝트 코드에 삽입되어 최종 오브젝트 코드가 생성되어 파일 내에 저장된다.[3] [4]

평가[편집]

컴파일의 장단점은 다음과 같다.

장점[편집]

  • 한번 컴파일을 하면 그대로 사용이 가능하며 반복 작업을 처리할 경우 시간 소모를 매우 줄일 수 있다.
  • 컴파일 과정에서 단계별로 주기억장치로 들어가기 때문에 기억장소의 크기가 조정이 가능하다.
  • 전체 실행 시간을 매우 효율적으로 절약할 수 있다.
  • 컴파일러는 일일이 매번 따로 번역할 필요가 없다.

단점[편집]

  • 한 줄로 입력할 경우 프로그램이 때로는 몇 십, 몇 백 개의 기계어로 번역되기 때문에 프로그램 실행을 위해서는 대용량의 기억공간이 필요하다.

각주[편집]

  1. 1.0 1.1 1.2 Mark J, 〈(C언어)(컴파일)컴파일 이란?〉, 《네이버 블로그》, 2017-05-11
  2. File, 〈컴파일(Compile)과 빌드(Build)의 차이점〉, 《네이버 블로그》, 2003-12-26
  3. 출처 : https://www.techopedia.com/definition/3912/compiler
  4. 〈[https://blog.naver.com/uosarang/503861 Compiler〉, 《techoped》, 2016-12-21

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 컴파일 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.