프로그래밍 입문

프로그램 언어

토픽 프로그래밍 입문 > IT 일반 > IT 일반 초급

컴파일러

컴파일러(compiler)는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말한다. 원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다. 목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일(compile)이라고 한다.

소스 코드를 컴파일하는 이유는 대부분 사람에게 이해하기 쉬운 형태의 고수준 언어로부터 실행가능한 기계어 프로그램을 만들기 위해서이다. 좁은 의미의 컴파일러는 주로 고수준 언어로 쓰인 소스 코드를 저수준 언어(어셈블리어, 기계어 등)로 번역하는 프로그램을 가리킨다.

초기 컴퓨터 프로그램들은 어셈블리어로 작성되었다. 그러나 서로 다른 CPU 아키텍처가 등장할 때마다 매번 똑같은 프로그램을 서로 다른 어셈블리어로 작성하는 비용이 커지면서, 고급 프로그래밍 언어의 필요성이 대두되었다.

 

원리

컴파일러에서 꼭 지켜야 할 두 가지 조건이 있다.

첫째로, 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존하여야 한다. 입력받은 프로그램의 의미를 충실히 따라야 한다. 이런 조건이 없다면 컴파일러를 사용하는 사용자가 컴파일러를 믿고 프로그램을 작성할 수도 없고, 잘못된 옮김을 인정한다면 컴파일러를 올바르게 하기 위한 노력을 들일 필요가 없을 것이다.

두 번째로, 실용적인 면에서, 컴파일러는 입력으로 들어온 프로그램을 어떤 면에서든지 개선해야 한다. 예를 들어, 소스 코드를 기계어로 옮긴다면 기계가 이해할 수 없었던 언어를 기계가 이해할 수 있게 개선한 것이 된다. 같은 언어로 옮긴 경우에는 성능이 개선되는 등의 장점이 있어야 한다. 그렇지 않다면 컴파일을 수행할 이유가 없어진다.

컴파일러의 기능:

  • 고급언어를 직접 기계어 코드로 변환한다.
  • 자바의 경우 바이트 코드로 변환한다. 중간단계의 코드를 생성하고 이것을 해석해서 실행한다.

C/C++언어와 같은 고급언어는 직접 기계어 코드로 변환한다. 마이크로프로세서는 각각 다른 기계어 코드를 가지고 있기 때문에 같은 언어라도 다른 기계어 코드를 생성해야 한다. 따라서 개발자는 해당 마이크로프로세서에 맞는 컴파일러 사용해야 한다.

그러나 자바는 다양한 마이크로프로세서에서 실행되도록 하는 철학을 가지고 개발되었기 때문에 바이트 코드를 가지고 해석을 해서 실행하는 방식이다. 장점은 한번 컴파일된 바이트 코드는 다른 플랫폼에서 재컴파일없이 실행할 수 있다. 그러나 단점은 바이트 코드를 해석해서 실행할 프로그램 구조가 필요하고, 직접 기계어 코드를 실행하는 것 보다 속도에서 늦다.

컴파일러의 실행 단계

많은 수의 컴파일러는 다음과 같은 순서를 거쳐 소스 코드를 번역한다. 컴파일러나 프로그래밍 언어의 특성에 따라 일부 단계는 생략되거나 더 세부적인 단계로 나뉠 수도 있다.

  • 구문 분석: 소스 코드 파일을 읽어 개별 문법요소(연산자, 괄호, 식별자 등) 단위로 자른후, 이 문법요소들을 해석하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 맞지 않는 소스 코드는 사용자에게 알려준다.
  • 최적화: 추상 구문 트리를 분석하여 최적화를 수행한다. 도달할 수 없는 코드를 식별하거나, 상수 표현식을 미리 계산해 두거나, 루프 풀기 등의 대부분의 최적화가 이 단계에서 수행된다.
  • 코드 생성: 최적화된 구문 트리로부터 목적 코드를 생성한다. 목표 언어가 기계어일 경우, 레지스터 할당, 연산 순서 바꾸기 등 하드웨어에 맞는 최적화가 이 단계에서 수행된다.
  • 링킹: 목적 코드가 기계어일 경우, 여러 라이브러리 목적 코드를 묶어 하나의 실행 파일을 생성하게 된다. 이 과정은 링커에 의해 수행되며, 어떤 사람들은 링커를 컴파일러의 일부로 간주하지 않기도 한다.

 

 

프로그램 언어의 역사

1940년대

이 시기에 개발된 일부 중요 언어는 다음을 포함한다:

1950년대 ~ 1960년대

1950년대에는 다음의 세 가지 현대의 프로그래밍 언어가 설계되었으며, 오늘날에도 이들의 파생 언어들이 이용되고 있다:

그 밖의 주요 언어들은 다음과 같다:

  • 1951년 - 지역 어셈블리어(Regional Assembly Language)
  • 1952년 - 오토코드
  • 1954년 - IPL (리스프의 선구자)
  • 1955년 - FLOW-MATIC (코볼의 선구자)
  • 1957년 - COMTRAN (코볼의 선구자)
  • 1958년 - 알골 58
  • 1959년 - FACT (코볼의 선구자)
  • 1959년 - RPG
  • 1962년 - APL
  • 1962년 - 시뮬라
  • 1962년 - SNOBOL
  • 1963년 - CPL (C의 선구자)
  • 1964년 - BASIC
  • 1964년 - PL/I
  • 1967년 - BCPL (C의 선구자)

1968년대 ~ 1978년대

1960년대 말에서 1970년대 말의 기간 동안 다음의 다섯 가지 주요 프로그래밍 언어가 탄생하였다.

그 밖의 주요 언어로는 다음과 같다.

  • 1968년 - 로고
  • 1969년 - B (C의 선구자)
  • 1970년 - 파스칼
  • 1970년 - 포스 (Forth)
  • 1975년 - 스킴 (Scheme)
  • 1978년 - SQL (처음에는 쿼리 언어일 뿐이었으나, 훗날 프로그래밍 구조체와 더불어 확장됨)

1980년대

이 기간 동안 개발된 주요 언어들은 다음과 같다:

1990년대

이 기간 동안 개발된 주요 언어들은 다음과 같다:

현재의 경향

2000년 이후로 개발된 주요 언어들은 다음과 같다:

 

*2016 프로그램 언어 사용 순위

http://www.nomadism.co.kr/26

댓글

댓글 본문
  1. 로버트한
    감사합니다.^^