본문 바로가기

TIL

[TIL 2024. 04. 24] 컴파일러와 인터프리터 | 정적타입과 동적타입

 

컴파일러와 인터프리터

  • 컴파일러와 인터프리터 모두 사람의 언어(프로그래밍 언어)를 0과 1로 이루어진 기계어로 변환하기 위한 것
  • 단, 컴파일이 한번에 기계어로 변환/인터프리터는 한줄씩 기계어로 변환한다는 차이 있을 뿐
  • 두 개의 장단점은 서로 크로스됨

 

컴파일러

: 일반적으로 정적 타입 언어가 사용함

 

  • 장점
    • 일단 스캔을 마치면 실행파일을 만들어 두고 계속 사용 → 실행속도가 인터프리터보다 빠름 (실행 전에 사전에 컴파일(기계어로 변환) 되어 있음)
    • 전체 코드를 검사한 후에 오류 메시지를 생성 → 프로그램 실행 전에 오류 발생 가능→상대적으로 디버깅이 어려움
    • 대부분의 플랫폼에서 실행 가능, 이식성 높음

 

  •  단점
    • 초기 스캔시간이 오래 걸림 (프로그램 실행에 필요한 모든 파일을 스캔하기 때문)
    • 컴파일 이후에 코드 변경시 수정내용을 다시 컴파일해야 하므로 개발 더 오래일수도.
    • 기계어 번역시 만들어진 “object code”들을 묶어서 다시 하나의 실행 파일로 만드는 “링킹 작업(linking)”이 필요함 → 인터프리터 방식모두 메모리 사용 많음

 


 

인터프리터

: 일반적으로 동적 타입 언어가 사용함

 

  •  장점
    • 메모리 효율이 좋음 (목적 코드x, 링킹x)
    • 코드 변경시 중간 컴파일과정 없이 바로 실행 가능
  • 단점
    • 실행 속도가 느림 (한줄씩 읽고,번역,실행)
    • 프로그램을 실행해봐야지만 오류 발견 가능

 

정적타입과 동적타입

프로그래밍 언어는 대체로 정적타입의 언어와 동적타입의 언어로 나뉜다

 

여기서 타입이란, 변수의 종류(int, float, bool 등). -> 즉, 자료형을 말한다.

 

그리고 이 변수의 타입을 언제 결정하느냐에 따라 언어는 정적타입과 동적타입이 나뉜다

 

    • 정적타입의 언어
      • 변수의 타입을 작성자가 직접 작성하는 언어.
      • 대표적인 언어로는 C, C++ 등 (자바는 정적 타입의 언어이지만, 컴파일과 인터프리터의 특징을 모두 가짐)
      • 정적타입의 언어는 컴파일 시에 변수의 데이터 타입이 결정
        • 타입오류를 사전에 방지
        • 코드의 안정성이 높. 실행 속도가 빠르다
        • 코드의 가독성이 좋기 때문에 유지 보수에 유리
        • 하지만 코드를 수정할 때 많은 선언 작업이 필요하고, 동적언어에 비해 개발시간이 더 소요될 수 있다는 단점이 존재

  • 동적타입의 언어는 코드를 실행할 때 알아서 변수 타입을 판단해주는 언어
  • 대표적인 언어로 Python, JavaScript 등
  • 동적타입의 언어는 실행 시 변수의 타입이 결정
    • 유연성이 좋고, 코드 작성과 수정이 빠르게 이루어질 수 있다
    • 하지만 실행 도중 타입오류가 발생할 수 있다는 단점이 있다

 

정리하면 정적 타입 언어는 개발 과정에서 변수의 타입을 직접 지정해줘야 하고, 동적 타입 언어는 개발자가 타입을 지정하지 않고 코드가 실행되는 과정에서 타입이 정해진다