한국   대만   중국   일본 
컴파일러 - 위키百科, 우리 모두의 百科事典 本文으로 移動

컴파일러

위키百科, 우리 모두의 百科事典.

一般的인 多重 言語, 多衆 對象 컴파일러의 動作 모습.

컴파일러 (compiler, 醇化 用語 : 解釋機, 飜譯機)는 特定 프로그래밍 言語 로 쓰여 있는 文書를 다른 프로그래밍 言語로 옮기는 言語 飜譯 프로그램 을 말한다. 컴파일러 高級 프로그래밍 言語 를 實行 프로그램으로 만들기 爲해 低級 프로그래밍 言語 (예, 어셈블리 言語, object 코드, machine code)로 바꾸는 데 使用된다. 元來의 文書를 소스 코드 或은 原始 코드라고 부르고, 출력된 文書를 目的 코드라고 부른다. 目的 코드는 主로 다른 프로그램이나 하드웨어가 處理하기에 容易한 形態로 出力되지만 사람이 읽을 수 있는 文書 파일이나 그림 파일 等으로 옮기는 境遇도 있다. 原始 코드에서 目的 코드로 옮기는 過程을 컴파일 (compile, 醇化 用語 : 옮김, 飜譯, 文化語 : 콤파일)이라고 한다.

컴파일러는 소스 프로그램을 읽어서 卽時 結果를 出力하는 인터프리터 와는 區分된다. 그러나 現代에 들어 많은 인터프리터가 JIT 컴파일 等의 技術로 實時間 컴파일을 遂行하므로, 컴파일러와 인터프리터 사이의 技術的 區分은 사라져 가는 趨勢이다.

소스 코드를 컴파일하는 理由는 大部分 사람에게 理解하기 쉬운 形態의 高水準 言語로부터 實行可能한 機械語 프로그램을 만들기 위해서이다. 좁은 意味의 컴파일러는 主로 高水準 言語로 쓰인 소스 코드를 低水準 言語( 어셈블리어 , 機械語 等)로 飜譯하는 프로그램을 가리킨다.

歷史 [ 編輯 ]

初期 컴퓨터 프로그램들은 어셈블리어 로 作成되었다. 그러나 서로 다른 CPU 아키텍처가 登場할 때마다 每番 똑같은 프로그램을 서로 다른 어셈블리어로 作成하는 費用이 커지면서, 高級 프로그래밍 言語 의 必要性이 擡頭되었다. 그러나 初期 컴퓨터 하드웨어의 메모리 크기가 너무 작아, 컴파일러의 登場에 技術的 障礙物이 되었다.

1950年代 初부터 機械語에 獨立的인 最初의 高級 프로그래밍 言語가 나타났고, 實驗的인 컴파일러들이 登場하기 始作했다. 世界 最初의 컴파일러는 1952年 그레이스 호퍼 가 開發한 프로그래밍 言語 A-0 를 機械語로 飜譯하는 컴파일러이다. 컴파일러라는 用語 또한 이때 호퍼가 처음 使用하였다. 最適化 機能이 搭載된 最初의 "完全한" 컴파일러는 1957年 IBM 존 배커스 가 開發한 포트란 컴파일러이다.

原理 [ 編輯 ]

컴파일러에서 꼭 지켜야 할 두 가지 條件이 있다. 첫째로, 컴파일러는 옮김의 過程에서 프로그램의 뜻을 保存하여야 한다. 入力받은 프로그램의 意味를 忠實히 따라야 한다. 이런 條件이 없다면 컴파일러를 使用하는 使用者가 컴파일러를 믿고 프로그램을 作成할 수도 없고, 잘못된 옮김을 認定한다면 컴파일러를 올바르게 하기 위한 努力을 들일 必要가 없을 것이다. 두 番째로, 實用的인 面에서, 컴파일러는 入力으로 들어온 프로그램을 어떤 面에서든지 改善해야 한다. 例를 들어, 소스 코드를 機械語로 옮긴다면 機械가 理解할 수 없었던 言語를 機械가 理解할 수 있게 改善한 것이 된다. 같은 言語로 옮긴 境遇에는 性能이 改善되는 等의 長點이 있어야 한다. 그렇지 않다면 컴파일을 遂行할 理由가 없어진다.

컴파일러의 機能:

  • 高級言語를 直接 機械語 코드로 變換한다.
  • 자바 의 境遇 바이트 코드 로 變換한다. 中間段階의 코드를 生成하고 이것을 解釋해서 實行한다.

C/C++言語와 같은 高級言語는 直接 機械語 코드로 變換한다. 마이크로프로세서 는 各各 다른 機械語 코드를 가지고 있기 때문에 같은 高級言語라도 다른 機械語 코드를 生成해야 한다. 따라서 開發者는 該當 마이크로프로세서 에 맞는 컴파일러를 使用해야 한다. 그러나 자바 는 다양한 마이크로프로세서에서 實行되도록 하는 哲學을 가지고 開發되었기 때문에 바이트 코드를 가지고 解釋을 해서 實行하는 方式이다. 長點은 한番 컴파일된 바이트 코드는 다른 플랫폼에서 再컴파일없이 實行할 수 있다. 그러나 短點은 바이트 코드를 解釋해서 實行할 프로그램 構造가 必要하고, 直接 機械語 코드를 實行하는 것 보다 速度에서 늦다.

컴파일러의 實行 段階 [ 編輯 ]

많은 數의 컴파일러는 다음과 같은 順序를 거쳐 소스 코드를 飜譯한다. 컴파일러나 프로그래밍 言語의 特性에 따라 一部 段階는 省略되거나 더 細部的인 段階로 나뉠 수도 있다.

  • 構文 分析 : 소스 코드 파일을 읽어 個別 文法要素(演算子, 括弧, 識別子 等) 單位로 자른후, 이 文法要素들을 解釋하여 抽象 構文 트리 를 生成한다. 이 過程에서 文法에 맞지 않는 소스 코드는 使用者에게 알려준다.
  • 最適化: 抽象 構文 트리를 分析하여 最適化를 遂行한다. 到達할 수 없는 코드를 識別하거나, 常數 表現式을 미리 計算해 두거나, 루프 풀기 等의 大部分의 最適化가 이 段階에서 遂行된다.
  • 코드 生成: 最適化된 構文 트리로부터 目的 코드를 生成한다. 目標 言語가 機械語日 境遇, 레지스터 割當, 年産 順序 바꾸기 等 하드웨어에 맞는 最適化가 이 段階에서 遂行된다. 大部分의 하드웨어 最適化 알고리즘은 NP 複雜度를 갖지만, 휴리스틱 을 통해 많은 最適化가 遂行된다.
  • 링킹: 目的 코드가 機械語日 境遇, 여러 라이브러리 目的 코드를 묶어 하나의 實行 파일을 生成하게 된다. 이 過程은 링커 에 依해 遂行되며, 어떤 사람들은 링커를 컴파일러의 一部로 看做하지 않기도 한다.

分類 [ 編輯 ]

컴파일러는 입출력되는 言語의 種類, 內部構造, 目的코드의 動作에 따라 여러 가지로 分類할 수 있다.

目的코드가 實行되는 方法 [ 編輯 ]

컴파일러가 實行되는 컴퓨터나 運營體制가 컴파일러의 目的코드가 實行될 컴퓨터나 運營體制와 같은 境遇 네이티브 컴파일러(native compiler 또는 hosted compiler)라고 한다.

네이티브 컴파일러 예:

反面에 크로스 컴파일러(cross compiler)는 다른 컴퓨터나 運營體制에서 實行되도록 製作된다. 임베디드 시스템 等 소프트웨어 開發에 充分한 環境을 갖추지 못한 環境에서 動作할 프로그램을 만들기 위해 使用된다.

크로스 컴파일러 예 :

  • 리눅스(x86)에서 ARM用 임베디드 시스템用 프로그램이나 커널을 開發하기 위해 ARM用 gcc을 使用하면 ARM 코드의 實行파일이 生成된다.
  • 마이크로소프트 윈도우에서 8051, AVR, PIC等의 시스템 프로그램을 開發하기 위해 該當 컴파일러를 使用하면 該當 CPU의 코드가 生成된다.

자바 [ 編輯 ]

또한 假想 머신 에서 動作할 프로그램을 만드는 컴파일러度 있다. 이 境遇 一般的으로 出力물이 假想 머신을 위해 製作된 바이트코드 形態의 機械語가 되므로 바이트코드 컴파일러라고 부른다.

一旦 構造와 多段 救助 [ 編輯 ]

소스를 한 番 읽고 飜譯하여 바로 出力물을 내놓는 컴파일러度 있지만 여러 가지 目的을 위해 中間 結果를 만들어 그 結果를 다시 最終 結果로 出力하는 컴파일러度 있다. 中間 結果를 만드는 데는 여러 가지 理由가 있다.

  • 다양한 言語 支援 : 다양한 入力 言語를 同一한 中間 表現으로 表現하거나 同一한 中間 表現을 여러 가지 出力 言語로 表現하면 다양한 入力 言語와 出力 言語를 支援하는 컴파일러를 作成할 수 있다.
  • 速度 및 最適化 : 高水準 言語일수록 最適化된 性能보다는 사람에게 理解하기 쉬운 形態를 念頭에 두고 設計된다. 때문에 中間形態를 거치는 것이 보다 低水準에서 效率的으로 프로그램을 最適化한 다음 最終的으로 出力물을 내놓는 데 유리할 수 있다.
  • 저스트 인 타임 컴파일 ( JIT 컴파일 ) : 스몰토크 , 자바 , 마이크로소프트 共通 中間 言語 (CIL) 等의 컴파일러는 假想 머신의 바이트코드를 出力한다. 그러나 假想 머신은 플랫폼의 機械語에 비해 速度가 느릴 수밖에 없으므로 이들 假想 머신에는 저스트 인 타임 컴파일러가 搭載되어 實行 直前에 現在 플랫폼의 機械語로 다시 한 番 컴파일되어 速度를 向上시킨다.

參考 資料 [ 編輯 ]

  • Cooper, Keith D. & Linda Torczon, Engineering a compiler, Morgan Kaufmann, 2004, pp 1-8.

外部 링크 [ 編輯 ]