1. 개요
abstraction level, level주어진 프로그래밍 언어가 기층적 기계어의 제약사항으로부터 얼마나 고수준(high-level)으로 추상화되었는지 단계적으로 나타내는 스펙트럼.
구분적(distinctive) 분류가 아니라 단계적(gradual) 분류에 해당하며, 기계어에 가까울수록 저수준(low-level) 언어, 추상화 수준이 높을수록 고수준(high-level) 언어라 부른다.
2. 상세
기본적으로 하드웨어, 컴퓨터 구조는 프로그래밍 언어에 제약사항(precision, allocation 등)을 가하지만, 반대로 인간인 프로그래머는 프로그래밍 언어에 다양한 기능(reusability, inference, polymorphism 등)을 요구한다. 결국 프로그래밍 언어는 이 둘 중 누구를 더 만족시키고 타협하느냐에 따라 양극단 사이의 스펙트럼을 형성하게 되고, 맨 위에는 인간(개발자), 맨 아래에는 기계어가 놓이게 된다.시스템 프로그래밍 언어 vs 응용(application) 프로그래밍 언어 구분과는 비슷하지만 다르다. Rust와 같이 고수준의 무비용(zero-cost) 추상화를 지원하는 동시에 시스템 프로그래밍 타켓이 가능할 정도의 정밀도를 지원하는 반례들이 있기 때문. 시스템/응용 구분은 사실 실무에서 목적에 따라 구분한 것일 뿐, PLT적 구분이라 보긴 애매하다.
상술한 바와 같이 추상화 수준은 단계적 분류이기 때문에, 구체적으로 어느 시점부터 고수준 언어인지 정하거나 어떤 언어가 정확히 저수준 언어인지 고수준 언어인지 논하는 것은 다소 무의미하다. 예를 들어 하드웨어에 더 가까운 작업을 하는 개발자의 경우 클래스, 템플릿, 타입 추론 등 C++가 가진 다양한 추상적 도구들로 인해 C++를 고수준 언어로 느낄 수 있으나, 반대로 응용 계층에서의 개발을 주로 하는 개발자의 경우 여전히 언어 대신 개발자가 생각하고 관리해야 하는 영역이 많아 저수준 언어로 느낄 수 있다.
3. 저수준
low level많은 경우 직접적인 수준의 메모리 관리가 가능하다. 대신 하드웨어 설계에 의존하는 경향이 커 이식성은 낮다.
4. 고수준
high level저수준 언어에 비해 느리다는 오해가 있고, 실제로도 어느 정도는 사실이나, 이는 추상화 수준에서 기인하는 근본적인 문제는 아니다. 고수준 언어가 느리다고 느껴지는 가장 큰 이유는 이들이 대부분 스크립트 언어인 경우가 많기 때문으로, 별도의 AOT, JIT 컴파일러를 사용하는 등 구현 방식을 바꾸면 실행 속도는 충분히 빨라질 수 있다.
다만 메모리 관리를 개발자에게 직접 맡기지 않는 경우가 많아 쓰레기 수집기 구현이 필요해지고, 이로 인해 런타임 spike가 발생해 성능 저하가 일어나게 되기도 한다.