본문 바로가기

CS

[CS]컴파일러와 인터프리터 차이(바이너리코드와 바이트코드)

기계어와 어셈블리 언어


  • 처음엔 프로그램은 기계어 명령어가 나열되는 방식으로 작성되었다.(1101101 등)
  • 어셈블리 언어는 기계어보다는 조금 발전된, add 등의 명령어가 있는 언어이다.
  • 하지만 여전히 복잡한 기능을 위한 명령어는 존재하지 않는다.

저수준 언어와 고수준 언어


  • C, java, python 등
  • 어셈블리언어로 복잡한 기능을 구현하기 위해서는 반복작업이 많고 코드양이 많아져 생산성이 떨어지고 버그 발생가능성이 높아진다.
  • 따라서 다양한 명령어를 통해 간단히 코드를 작성할 수 있는 고수준 언어가 나오게 된다.
  • 서로 다른 컴퓨터는 다른 기계어 형식을 가지고 있는데 고수준 언어를 사용하면 같은 코드로 다른 환경에서 작동 가능하다.(컴파일러가 변환)

컴파일러와 인터프리터 차이


  • 컴파일러 : 한 언어에서 다른 언어로 번역하는 프로그램
  • 인터프리터가 번역해야하는 프로그래밍 언어를 스크립팅 언어라 부름(자바스크립트, 파이썬 등)
공통점
  • 고수준 언어로 작성된 코드를 기계어로 변환해준다.
차이점
  • 컴파일러는 전체 소스코드를 보고 기계어로 변환하며, 인터프리터는 한 줄씩 분석하며 실행한다.
  • 컴파일러는 바로 기계어로 변환하고 인터프리터는 중간형태로 변환한 다음 실행한다.
  • 컴파일러가 보통 실행속도가 빠르며 인터프리터는 각 행을 실행하는 도중 에러가 발생하면 멈춰 디버깅이 편리

[참고] 바이너리코드와 바이트코드


  • 바이너리 코드는 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드
  • C언어를 컴파일하면 소스파일이 목적파일로 변환됨(이때 바이너리 코드로 변환되지만 기계어가 아니기 때문에 실행 불가능함)
  • 기계어는 CPU제조사에서 CPU를 만들 때 해당 CPU에서 사용하는 명령어 집합 개념
    (따라서 컴퓨터환경에 따라 기계어는 조금씩 달라 환경에 따라 매번 컴파일 해줘야 함)
  • 즉 기계어는 바이너리코드이지만 모든 바이너리코드가 기계어인 것은 아니다.
  • 바이트 코드는 특정 하드웨어가 아닌 가상 머신(소프트웨어)이 이해할 수 0과 1로 구성된 언어
    (소스코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일한 것)
  • 바이트 코드는 다시 실시간 번역기 또는 저스트 인 타임(just-in-time, JIT) 컴파일러에 의해 바이너리 코드로 변환됨
  • Java는 컴파일하면 바이트 코드로 변환됨, JVM(가상머신) 내부에 있는 JIT 컴파일러가 이 바이트코드를 한 줄씩 해석하면서 실행 가능한 바이너리 코드를 생성해 CPU로 넘겨 실행한다.

'CS' 카테고리의 다른 글

[CS]MVC패턴이란?  (0) 2021.03.16
[CS]아키텍처란?  (0) 2021.03.15
[DB] NoSQL이란?  (0) 2021.03.14
[네트워크]주소창에 주소를 입력하면 어떻게 될까?  (0) 2021.03.12
[OS]프로세스와 스레드의 차이  (0) 2021.03.04