컴파일러와 인터프리터

이걸.. 왜 기억 못했니..?
아무튼.. 컴파일러와 인터프리터는 둘 다 고급 언어로 작성된 프로그래밍 언어를 기계어로 번역하는 역할을 합니다.
어셈블리어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어입니다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 됩니다. 초기 컴퓨터 프로그램들은 모두 어셈블리어로 작성했습니다. 따라서 새로운 아키텍쳐가 적용된 CPU가 나올 때마다 매번 같은 프로그램을 새로 나온 CPU에 맞는 어셈블리어로 다시 작성하는 번거로운 과정을 거쳐야 했습니다.
그렇기 때문에 통일된 언어 체계로 작성한 코드의 필요성이 대두되었고, 여기서 고급 언어가 나오게 됩니다. 하지만 컴퓨터는 고급 언어로 작성한 코드를 바로 인식하지 못하기 때문에 이를 번역하는 과정이 필요합니다. 이 번역하는 과정을 우리는 컴파일이라고 합니다.
고급 언어를 사용하게 되면서 이를 어셈블리어로 번역해주는 작업의 역사가 시작되었습니다. 이 번역의 방식은 2가지가 있는데, 컴파일러(Compiler) 방식과 인터프리터(interpreter) 방식입니다.

컴파일러

컴파일러는 프로그램 전체를 읽어 이를 모두 기계어로 번역합니다. 전체를 스캔하기 때문에 컴파일 초기의 읽기 시간이 오래 걸립니다. 하지만 초기 스캔을 마치면 실행 파일을 만들어 저장하고, 추후 실행시 저장된 실행 파일을 실행하기 때문에 전체 실행 시간만 따지고 보면 인터프리터 보다 빠릅니다.
컴파일러는 고급 언어로 작성된 소스를 기계어로 번역하고 이 과정에서 오브젝트 코드(Object Code)라는 파일을 만드는데 이 오브젝트 코드를 묶어서 하나의 실행 파일로 만드는 링킹(Linking)이라는 작업을 해야합니다. 인터프리터에 비해 과정이 복잡하기 때문에 보다 많은 메모리를 사용해야 합니다.
컴파일러는 오류 메시지를 생성할 때 전체 코드를 검사한 후에 오류 메시지를 생성하기 때문에 실행 전에 오류를 발견할 수 있습니다.
컴파일러를 사용하는 언어로는 C, C++, JAVA 등이 있습니다.

인터프리터

인터프리터는 프로그램 실행시 1번에 1문장씩 번역합니다. 그렇기 때문에 1번에 전체를 스캔하고 실행 파일을 만들어서 실행하는 컴파일러보다 실행 시간이 오래 걸립니다. 하지만 오브젝트 코드나 링킹 과정을 거치지 않기 때문에 메모리 효율이 좋습니다.
인터프리터는 1번에 1문장씩 번역하기 때문에, 프로그램을 실행시키고 1문장씩 번역하면서 오류가 발생하면 바로 프로그램을 중지합니다. 그래서 프로그램을 실행해봐야만 오류를 발견할 수 있습니다.
인터프리터를 사용하는 언어로는 Python, JavaScript, Ruby 등이 있습니다.

요약

  • Compiler
    • 전체 파일을 스캔하여 한꺼번에 번역한다.
    • 초기 스캔 시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
    • 기계어 번역 과정에서 더 많은 메모리를 사용한다.
    • 전체 코드를 스캔하는 과정에서 모든 오류를 한꺼번에 출력해주기 때문에 실행 전에 오류를 알 수 있다.
    • 대표적인 언어로 C, C++, JAVA 등이 있다.
  • Interpreter
    • 프로그램 실행 시 한 번에 한 문장씩 번역한다.
    • 한 번에 한 문장씩 번역 후 실행시키기 때문에 실행 시간이 느리다.
    • 컴파일러와 같은 오브젝트 코드 생성 과정이 없기 때문에 메모리 효율이 좋다.
    • 프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지시키기 때문에 실행 후에 오류를 알 수 있다.
    • 대표적인 언어로 Python, Javascript, Ruby 등이 있다.

참고