정적언어(Static Langauge)와 동적언어(Dynamic Langauge)의 차이
정적언어
- C, C++, Java, Go, Rust 등
- 컴파일타임에 코드가 기계어로 변환된다.
- 컴파일러가 코드를 실행하기 전, 코드 전체를 분석 후 오류를 찾거나 최적화를 수행한다.
- 변수타입이 고정되고, 코드의 구조도 결정되므로 대부분의 정보가 미리 확정된다.
- ✅ 정적언어는 트리쉐이킹이 가능하다.
- 컴파일 타임에 코드를 분석하여, 어떤 코드가 사용되고 있는지 파악 할 수 있다.
동적언어
- JavaScript, Python, Ruby, PHP 등
- 런타임에, 변수의 타입이나 코드의 흐름이 결정된다.
- 변수 타입 역시 실행 도중에 바뀔 수 있고, 코드의 일부를 실행중에 새로 생성해서 사용 할 수 있다. (몽키패칭)
- ✅ 동적언어도 트리쉐이킹이 가능한 경우가 있다.
- 자바스크립트와 같은 모듈 기반 언어는, 의존성 그래프를 통해 사용하지 않는 모듈을 제거하고 실제 필요한 모듈만 사용할 수 있다.
- 하지만 아래와 같은 경우는 코드의 의존성을 파악하기 어려워진다.
- 동적 임포트가 가능한 경우(commonJS)나
- 동적 속성에 접근하는 경우
- eval 함수를 사용하는 경우(런타임에 새로운 코드를 실행 할 수 있어 정적분석이 불가능해진다.)
- 프로토타입을 수정하는 경우
- 전역 객체를 수정하는경우 (ex. window)