반응형

1. 해석 방식에 따른 분류

크게 AOT 컴파일 언어, JIT 컴파일 언어, 그리고 인터프리터 언어로 분류할 수 있다. 이 분류는 정확히 말하면 언어의 분류가 아니라 언어 구현체의 분류로, 언어 명세가 어느 한 쪽을 완전히 배제한 형태가 아니거나 다른 특별한 이유가 있지 않는 이상 대부분의 언어는 이론상 어떤 식으로든 구현 가능하다. 더불어, 산업 현장에서 널리 쓰이는 언어는 기본적으로 컴파일되어 실행된다고 보면 된다. 아래의 구분은 언어의 대표 구현체를 따른 것이고, 결코 언어 자체의 분류가 아님에 유의해야 한다.

- AOT 컴파일 언어 : C, 파스칼, Haskell. 세간에 널리 퍼진 인식과는 다르게 어떤 언어의 구현체가 AOT 컴파일러인 것이 결코 빠른 런타임 퍼포먼스를 보장해주지는 않는다.

- JIT 컴파일 언어 : 대부분의 고생산성 주류 언어가 여기에 속한다. JAVA및 JVM 언어, JAVA Script, WebAssembly, C# 및 CLR 언어, Python, Ruby ,PHP 등의 언어들은 모두 기본 구현체가 JIT 컴파일러이다. 이 언어들은 대부분 바이트코드를 생성하는 1차 컴파일러, 그리고 1차 컴파일러가 생성한 바이트코드를 실행하는 가상머신(VM)으로 이루어져 있다. 

- 인터프리터 언어 : 소스 코드를 한 줄 한 줄 읽어 그때그때마다 번역해서 수행한다. BASIC이나 Bash같은 언어가 이런 형태이다. 소스 코드를 한 줄씩 읽어서 수행하기 때문에 대체로 AOT 컴파일 언어나 JIT 컴파일 언어에 비해 성능이 떨어지고, JIT 컴파일러보다 유연한 것도 아니며, 유일한 장점은 구현이 단순하고 구현체의 절대적인 크기가 작다는 것이다. 따라서 bash, awk과 같이 구현체가 매우 가볍고 간단할 필요성이 있는 경우, 또는 구현체를 충분히 빠르게 만들도록 노력-을 들이지 못한 수많은 마이너 언어들이 인터프리터를 통해 작동한다.

 

 

2. 메모리 관리에 따른 분류

- Managed  Language
프로그래밍 언어 차원에서 메모리 관리와 관련 코드를 직접 처리해주는 부류 : JAVA, C#, Python, JavaScript 

메모리 관리를 언어 차원에서 책임져 주기 때문에 상대적으로 생산성은 높지만, 메모리에 직접 액세스할 수 없으므로 비관리 언어에 비해 성능 면에서 손실이 있다.

1) 컴퓨터 아키텍처를 몰라도 쉽게 프로그램 작성 가능
2) 비효율성이 발생
3) 생상선이 높다
4) 작성한 코드를 실행할 때 특정 환경의 도움을 받아 실행한다.

- Unmanaged  Language
프로그래머가 언어 구현 과정에서 직접 메모리를 관리해야 하는 부류 : C, C++, Assembly 

수동 기계제어가 가능한 만큼 프로그래머의 최적화 실력에 따라 높은 퍼포먼스를 낼 수 있지만, 반대로 생각하면 그렇기 때문에 메모리 관리를 제대로 하지 않을 시 프로그램이 망가질 가능성이 커서 관리 언어에 비하면 생산성은 떨어진다.

1) 컴퓨터 아키텍처를 모르느 프로그래머는 문제의 소지가 많다.
2) 메모리 관리에 실수가 많다.
3) 생산성이 낮다.
4) 실행할 때 운영체제등이 직접 실행한다.

 

 

3. 정적타입, 동적타입에 따른 분류

- 정적 타입 언어 : 자료형(Type)이 고정돼 있는 언어. 간단히 얘기하자면 정수형으로 정의한 1은 계속 정수형 1로 남아있다. 이걸 실수형 1.0으로 바꾸려면 명시적인 형 변환(Type casting)을 해줘야 한다. 묵시적 형 변환이 이루어지는 경우도 있지만 제한적이다. C, C++, C#, JAVA 등이 여기에 해당된다.

 - 동적 타입 언어 : 타입이 실행 시간에 결정되는 언어. 실행하기 전까지는 특정 식의 타입을 알 수 없다. Python, JAVA, Ruby 등이 여기에 해당된다.

동적 타입과 정적 타입의 차이는 타입이 컴파일 타임에 결정되느냐 실행시간에 결정되느냐 이다.

 

반응형

+ Recent posts