CS
[CS]컴파일러와 인터프리터 차이(바이너리코드와 바이트코드)
그레고리력
2021. 3. 14. 22:00
기계어와 어셈블리 언어
- 처음엔 프로그램은 기계어 명령어가 나열되는 방식으로 작성되었다.(1101101 등)
- 어셈블리 언어는 기계어보다는 조금 발전된, add 등의 명령어가 있는 언어이다.
- 하지만 여전히 복잡한 기능을 위한 명령어는 존재하지 않는다.
저수준 언어와 고수준 언어
- C, java, python 등
- 어셈블리언어로 복잡한 기능을 구현하기 위해서는 반복작업이 많고 코드양이 많아져 생산성이 떨어지고 버그 발생가능성이 높아진다.
- 따라서 다양한 명령어를 통해 간단히 코드를 작성할 수 있는 고수준 언어가 나오게 된다.
- 서로 다른 컴퓨터는 다른 기계어 형식을 가지고 있는데 고수준 언어를 사용하면 같은 코드로 다른 환경에서 작동 가능하다.(컴파일러가 변환)
컴파일러와 인터프리터 차이
- 컴파일러 : 한 언어에서 다른 언어로 번역하는 프로그램
- 인터프리터가 번역해야하는 프로그래밍 언어를 스크립팅 언어라 부름(자바스크립트, 파이썬 등)
공통점
- 고수준 언어로 작성된 코드를 기계어로 변환해준다.
차이점
- 컴파일러는 전체 소스코드를 보고 기계어로 변환하며, 인터프리터는 한 줄씩 분석하며 실행한다.
- 컴파일러는 바로 기계어로 변환하고 인터프리터는 중간형태로 변환한 다음 실행한다.
- 컴파일러가 보통 실행속도가 빠르며 인터프리터는 각 행을 실행하는 도중 에러가 발생하면 멈춰 디버깅이 편리
[참고]
바이너리코드와 바이트코드
- 바이너리 코드는 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드
- C언어를 컴파일하면 소스파일이 목적파일로 변환됨(이때 바이너리 코드로 변환되지만 기계어가 아니기 때문에 실행 불가능함)
- 기계어는 CPU제조사에서 CPU를 만들 때 해당 CPU에서 사용하는 명령어 집합 개념
(따라서 컴퓨터환경에 따라 기계어는 조금씩 달라 환경에 따라 매번 컴파일 해줘야 함)
- 즉 기계어는 바이너리코드이지만 모든 바이너리코드가 기계어인 것은 아니다.
- 바이트 코드는 특정 하드웨어가 아닌 가상 머신(소프트웨어)이 이해할 수 0과 1로 구성된 언어
(소스코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일한 것)
- 바이트 코드는 다시 실시간 번역기 또는 저스트 인 타임(just-in-time, JIT) 컴파일러에 의해 바이너리 코드로 변환됨
- Java는 컴파일하면 바이트 코드로 변환됨, JVM(가상머신) 내부에 있는 JIT 컴파일러가 이 바이트코드를 한 줄씩 해석하면서 실행 가능한 바이너리 코드를 생성해 CPU로 넘겨 실행한다.