본문으로 이동

고급 프로그래밍 언어

위키백과, 우리 모두의 백과사전.
(고급 언어에서 넘어옴)

고급 프로그래밍 언어 또는 하이 레벨 프로그래밍 언어(high-level programming language)는 컴퓨터의 상세 내용으로부터 강력한 추상화를 제공하는 프로그래밍 언어이다. 저급 프로그래밍 언어와는 대조적으로, 자연어 요소를 사용하거나, 사용하기 더 쉽거나, 컴퓨팅 시스템의 중요한 영역(예: 메모리 관리)을 자동화(또는 완전히 숨김)할 수 있어 저급 언어를 사용할 때보다 프로그램을 개발하는 과정이 더 단순하고 이해하기 쉽게 만든다. 제공되는 추상화의 정도가 프로그래밍 언어가 얼마나 "고급"인지를 정의한다.[1]

고급이란 기계어나 어셈블리어에 내재된 프로세서의 하드웨어 세부 사항으로부터의 추상화 수준을 의미한다. 고급 언어는 레지스터, 메모리 주소, 호출 스택을 다루는 대신 변수, 배열, 객체, 산술 연산 및 불리언 식, 함수, 루프, 스레드, 잠금(lock) 및 기타 컴퓨터 과학적 추상화를 다루며, 이는 정확성과 소프트웨어 유지보수를 용이하게 하려는 목적을 가진다. 저급 어셈블리어와 달리, 고급 언어는 기계의 기본 연산 코드로 직접 번역되는 언어 요소가 거의 없거나 전혀 없다. 문자열 처리, 객체 지향 프로그래밍 기능, 파일 입출력과 같은 기타 기능이 제공될 수도 있다. 고급 언어는 기계적 세부 사항으로부터 분리되고 독립된 소스 코드를 가능하게 한다. 즉, 어셈블리나 기계어와 같은 저급 언어와 달리, 고급 언어 코드는 프로그래머가 인지하지 못한 채 데이터 이동을 초래할 수 있다. 실행할 명령에 대한 제어권의 일부는 컴파일러에 넘겨진다.

역사

[편집]

전자 컴퓨팅 초기 수십 년 동안, 프로그램은 보통 특정 기계의 명령어 집합을 밀접하게 반영하는 기계어나 어셈블리어로 작성되었다. 고급 프로그래밍 언어는 알고리즘을 수학, 비즈니스 규칙 또는 사람이 읽을 수 있는 절차에 더 가까운 형태로 표현하는 방법으로 발전했으며, 컴파일러나 인터프리터가 프로그램을 기계가 실행 가능한 명령어로 번역했다. 1950년대와 1960년대에는 오토코드라는 용어가 컴파일러 기반 고급 언어를 지칭하는 데 자주 사용되었으며, 그 예로 초기 오토코드 시스템과 포트란 및 코볼과 같은 언어들이 있다.[2]

컴퓨터를 위해 설계된 최초의 고급 언어는 일반적으로 1940년대 콘라트 추제가 개발한 플랑칼퀼로 간주된다.[3] 여기에는 구조화된 데이터, 할당, 조건부 실행, 반복 및 서브루틴과 같은 고급 기능이 포함되었으나, 추제의 생전에는 구현되지 않았다. 추제가 전시 및 전후 독일에서 작업했기 때문에 그의 연구는 언어 발전의 주류로부터 크게 단절되었지만, 하인츠 루티샤우저의 슈퍼플랜과, 정도는 덜하지만, 알골과 관련된 초기 작업에 영향을 주었다.[4]

널리 실용적으로 채택된 최초의 고급 언어는 1950년대 IBM에서 존 배커스 주도로 개발된 포트란이다.[5] 포트란은 과학 및 수치 계산을 목표로 했으며, 프로그래머가 모든 기계 명령어를 수동으로 관리하지 않고도 대수 공식과 루프를 작성할 수 있게 했다. 포트란의 성공은 컴파일된 고급 언어가 프로그래밍 노력을 크게 줄이면서도 효율적인 프로그램을 생성할 수 있음을 입증하는 데 기여했다.[6]

같은 시기에 다른 여러 영향력 있는 언어들이 등장했다. 존 매카시가 만든 리스프는 기호 리스트 처리를 도입하고 람다 대수의 아이디어를 실용적인 프로그래밍 언어 설계의 핵심으로 만들었다.[7] 코볼은 비즈니스 데이터 처리를 위해 설계되었으며 영어와 유사한 구문, 레코드, 파일 지향적 상업 응용 프로그램과 연관되었다.[8] 알골 계열, 특히 알골 60은 블록 구조, 중첩 프로시저, 재귀, 어휘적 범위 지정(lexical scoping), 값에 의한 호출과 이름에 의한 호출의 구분, 그리고 배커스-나우르 표기법을 사용한 구문의 공식적 정의 등을 통해 이후 언어 설계에 영향을 주었다.[9]

1960년대와 1970년대 동안 고급 언어는 독특한 프로그래밍 스타일로 다변화되었다. 베이직은 시분할 시스템 및 교육 환경에서 인터랙티브 프로그래밍을 가능하게 했으며, 파스칼은 구조적 프로그래밍과 교육을 강조했다. C는 고급 제어 구조와 비교적 저급의 메모리 및 하드웨어 접근을 결합하여 운영체제와 시스템 소프트웨어 분야에서 영향력을 발휘했다. 시뮬라는 객체 지향 프로그래밍의 핵심이 된 클래스와 객체 모델을 도입했으며, 이후 스몰토크는 메시지 전달과 고도로 인터랙티브한 프로그래밍 환경을 중심으로 객체 지향 프로그래밍을 발전시켰다.[10][11]

1980년대와 1990년대에 이르러 고급 언어의 발전은 대규모 소프트웨어 공학, 그래픽 컴퓨팅, 그리고 인터넷의 성장을 반영하게 되었다. 에이다는 국방 및 임베디드 환경과 같은 대규모의 오래 지속되는 시스템을 위해 설계되었다. C++은 C 언어에 클래스와 기타 추상화 메커니즘을 추가하여 시스템 프로그래밍 능력을 유지하면서도 객체 지향 및 일반화 프로그래밍을 가능하게 했다.[12] 펄, 파이썬, 루비, PHP와 같은 스크립팅 및 래피드 애플리케이션 언어들은 프로그래머의 생산성과 텍스트, 웹 또는 애플리케이션 스크립팅을 강조했다. 자바는 자바 가상 머신을 통해 이식 가능한 바이트코드 실행을 촉진했으며, 자바스크립트는 웹 브라우저의 표준 고급 스크립트 언어가 되었다.[13][14][15]

21세기에 들어서며 새로운 고급 언어들은 더 안전한 추상화, 동시성, 대규모 코드베이스, 그리고 기존 플랫폼과의 상호 운용성에 집중해 왔다. C 샤프는 닷넷 플랫폼과 함께 발전했고, 스칼라와 F 샤프는 객체 지향과 함수형 프로그래밍을 혼합했으며, 코틀린은 간결한 구문과 null 안전 기능 기능을 추가하면서 자바와의 상호 운용성을 목표로 했다.[16] Go는 단순한 구문, 빠른 컴파일, 내장된 동시성 지원을 위해 설계되었다.[17] 러스트는 가비지 컬렉터 없이 메모리 안전성과 스레드 안전성을 강조했으며, 스위프트는 애플 플랫폼 소프트웨어 개발을 위한 현대적인 언어로 도입되었다.[18][19] 타입스크립트는 대규모 자바스크립트 애플리케이션을 위해 정적 타이핑을 추가하여 자바스크립트를 확장했다.[20]

추상화 페널티

[편집]

고급 언어는 일반적인 작업을 표준화하고, 풍부한 디버깅을 허용하며, 아키텍처 중립성을 유지하는 기능을 제공한다. 반면 저급 언어는 코더가 더 낮은 수준의 추상화에서 작업하도록 요구하므로 일반적으로 더 어렵지만, 고급 언어로는 불가능한 프로그램 최적화를 가능하게 한다. 고급 언어 대신 저급 언어를 사용함으로써 발생하는 이러한 추상화 페널티는 실재하지만, 실제로는 저급 최적화가 사용자 경험 수준에서 성능을 향상시키는 경우는 드물다.[21][22][23] 그럼에도 불구하고, 빠르고 효율적으로 실행되어야 하는 코드는 고급 언어가 코딩과 유지보수를 더 쉽게 만들지라도 저급 언어의 사용을 요구할 수 있다. 많은 경우, 고급 언어로 작성된 프로그램의 핵심 부분은 엄격한 타이밍이나 메모리 제약을 충족하기 위해 어셈블리어로 코딩된다. 고급 언어를 위한 잘 설계된 컴파일러는 어셈블리어로 직접 코딩된 것과 필적할 효율성의 코드를 생성할 수 있으며, 더 높은 수준의 추상화는 때때로 수동으로 코딩된 어셈블리어의 성능을 능가하는 최적화를 가능하게 한다.[24] 고급 언어는 특정 컴퓨터 구조와 독립적으로 설계되었기 때문에, 해당 언어로 작성된 프로그램은 호환되는 컴파일러나 인터프리터가 있는 모든 컴퓨팅 환경에서 실행될 수 있다.

프로세서 하드웨어에 본질적으로 결합된 저급 언어와 달리, 고급 언어는 개선될 수 있으며, 새로운 고급 언어들은 인기 있는 구문을 개선된 기능과 결합하려는 목표를 가지고 다른 언어들로부터 진화할 수 있다. 예를 들어, 스칼라는 자바와의 하위 호환성을 유지한다. 자바로 작성된 코드는 개발자가 스칼라로 전환하더라도 계속 사용할 수 있다. 이는 전환을 더 쉽게 만들고 코드베이스의 수명을 연장한다. 이와 대조적으로 저급 프로그램이 작성된 컴퓨터 구조를 넘어 살아남는 경우는 드물다.

상대적 의미

[편집]

고급과 저급이라는 용어는 본질적으로 상대적이며, 언어들은 서로에 대해 더 높거나 더 낮은 수준으로 비교될 수 있다. 때때로 C 언어는 관점에 따라 고급 언어 또는 저급 언어로 간주된다. 어쨌든, 대부분의 사람들은 C가 어셈블리어보다는 높은 수준이고 다른 대부분의 언어보다는 낮은 수준이라는 데 동의한다.

C는 식 평가, 매개변수를 갖는 재귀 함수, 데이터 타입 및 구조와 같이 어셈블리나 프로세서에서 직접 지원되지 않는 구문을 지원하지만, 자동 증가 및 포인터 연산과 같은 저급 기능도 제공한다. 그러나 C는 쓰레기 수집이나 내장된 문자열 타입과 같이 다른 언어에서 흔한 많은 고급 추상화를 결합하지 않는다. 브라이언 커니핸과 데니스 리치가 저술한 C 프로그래밍 언어(제2판)의 서문에서 C는 "매우 높은 수준이 아닌" 언어로 묘사된다.[25]

어셈블리어는 기계어보다는 고급이지만 여전히 프로세서 하드웨어에 매우 밀접하게 결합되어 있다. 그러나 어셈블리어는 매크로, 비교적 제한된 식, 상수, 변수, 프로시저 및 자료 구조와 같은 일부 고급 기능을 제공할 수 있다.

기계어는 많은 프로세서 내부에서 사용되는 마이크로코드나 마이크로 오퍼레이션보다는 약간 더 높은 수준의 추상화이다.[26]

실행 모드

[편집]

고급 언어의 소스 코드는 다음과 같은 다양한 방식으로 처리될 수 있다.

컴파일
컴파일러가 소스 코드를 다른 코드로 변환한다. 어떤 경우에는 컴파일러가 프로세서에 의해 해석되는 기본 기계어를 생성하지만, 오늘날의 많은 실행 모델은 중간 표현(즉, 바이트코드)을 생성한 뒤 소프트웨어에서 해석되거나 런타임에(JIT 컴파일을 통해) 기본 코드로 변환되는 방식을 포함한다.
때때로 하드웨어는 특정 언어의 런타임 요구 사항에 맞게 최적화된다. 예를 들어, Burroughs Large Systems는 알골 60을 위한 대상 기계였다.[27]
트랜스파일
코드는 컴파일러나 인터프리터를 사용할 수 있는 다른 언어(일반적으로 더 낮은 수준)의 소스 코드로 번역될 수 있다. 자바스크립트와 C는 이러한 번역가의 공통적인 대상이다. 예를 들어, EiffelStudio IDE를 사용할 때 C 및 C++ 코드는 에펠 코드로부터 생성된 것으로 볼 수 있다. 에펠에서 이 번역 과정은 트랜스컴파일링 또는 트랜스컴파일된 것으로 지칭되며, 에펠 컴파일러는 트랜스컴파일러 또는 소스 대 소스 컴파일러로 불린다.
소프트웨어 인터프리트
소프트웨어 인터프리터는 기본 기계어를 생성하지 않고 소스 코드에 인코딩된 동작을 수행한다.
하드웨어 인터프리트
흔하지는 않지만, 고급 언어 컴퓨터 아키텍처를 가진 프로세서는 프로그래밍된 컴파일 단계 없이 고급 언어를 처리할 수 있다.[28]

언어가 엄격하게 인터프리트되거나 컴파일되는 것은 아니다. 오히려 실행 모델은 컴파일러나 인터프리터를 포함하며, 동일한 언어가 다른 실행 모델과 함께 사용될 수 있다. 예를 들어, 알골 60과 포트란은 일반적으로 컴파일되지만 둘 다 인터프리트되기도 했다. 마찬가지로, 자바는 구현체가 아닌 언어 자체에 이러한 라벨을 붙이려는 시도가 가진 어려움을 보여준다. 자바는 자바 가상 머신(JVM)에서 인터프리트하거나 JIT 컴파일을 통해 실행되는 바이트코드로 컴파일된다.

같이 보기

[편집]

각주

[편집]
  1. ↑ “HThreads - RD Glossary”. 2007년 8월 26일에 원본 문서에서 보존된 문서.
  2. ↑ London, Keith (1968). 《Introduction to Computers》. Faber and Faber.
  3. ↑ Rojas, Raúl; Hashagen, Ulf (2000). Plankalkül: The First High-Level Programming Language and its Implementation (보고서). Freie Universität Berlin. 2014년 10월 18일에 원본 문서에서 보존된 문서. 2026년 5월 25일에 확인함.
  4. ↑ Rojas, Raúl (2000). 〈Konrad Zuse's legacy: the architecture of the Z1 and Z3〉. Rojas, Raúl (편집). 《The First Computers: History and Architectures》. MIT Press. ISBN 978-0-262-18197-6.
  5. ↑ “Software & Languages: FORTRAN”. Computer History Museum. 2026년 5월 25일에 확인함.
  6. ↑ “Programming languages”. 《Encyclopædia Britannica》. 2026년 5월 25일에 확인함.
  7. ↑ McCarthy, John (1960). “Recursive functions of symbolic expressions and their computation by machine, Part I”. 《Communications of the ACM》 3 (4): 184–195. doi:10.1145/367177.367199.
  8. ↑ Sammet, Jean E. (1978). “The Early History of COBOL”. 《ACM SIGPLAN Notices》 13 (8): 121–161. doi:10.1145/960118.808378.
  9. ↑ Backus, J. W.; Bauer, F. L.; Green, J.; Katz, C.; McCarthy, J.; Naur, P.; Perlis, A. J.; Rutishauser, H.; Samelson, K.; Vauquois, B.; Wegstein, J. H.; van Wijngaarden, A.; Woodger, M. (1963). “Revised report on the algorithmic language ALGOL 60”. 《Communications of the ACM》 6 (1): 1–17. doi:10.1145/366193.366201.
  10. ↑ Dahl, Ole-Johan; Nygaard, Kristen (1978). 〈The Development of the Simula Languages〉. 《History of Programming Languages》. ACM. 439–480쪽. doi:10.1145/800025.1198392.
  11. ↑ Kay, Alan C. (1993). “The early history of Smalltalk”. 《ACM SIGPLAN Notices》 28 (3): 69–95. doi:10.1145/155360.155364.
  12. ↑ Stroustrup, Bjarne (1993). 〈A History of C++: 1979–1991〉. 《History of Programming Languages II》. Association for Computing Machinery (ACM). 699–769쪽. doi:10.1145/154766.155375.
  13. ↑ “History and License”. 《Python documentation》. 2026년 5월 25일에 확인함.
  14. ↑ “The Java Language Specification” (PDF). Oracle. 2026년 5월 25일에 확인함.
  15. ↑ “JavaScript”. 《MDN Web Docs》. Mozilla. 2026년 5월 25일에 확인함.
  16. ↑ “Kotlin 1.0 Released: Pragmatic Language for JVM and Android”. JetBrains. 2016년 2월 15일. 2026년 5월 25일에 확인함.
  17. ↑ “Frequently Asked Questions”. 《The Go Programming Language》. 2026년 5월 25일에 확인함.
  18. ↑ “Rust Programming Language”. 2026년 5월 25일에 확인함.
  19. ↑ “Swift Programming Language”. 2026년 5월 25일에 확인함.
  20. ↑ “Announcing TypeScript 1.0”. Microsoft. 2014년 4월 2일. 2026년 5월 25일에 확인함.
  21. ↑ Pankaj Surana (2006). 《Meta-Compilation of Language Abstractions》 (학위논문). Northwestern University. ISBN 978-0-542-74444-0. 2008년 3월 17일에 확인함.
  22. ↑ Kuketayev, Argyn. “The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.”. 《Application Development Trends》. 2009년 1월 11일에 원본 문서에서 보존된 문서. 2008년 3월 17일에 확인함.
  23. ↑ Chatzigeorgiou; Stephanides (2002). 〈Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages〉. Blieberger; Strohmeier (편집). 《Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002》. Springer. 367쪽.
  24. ↑ Manuel Carro; José F. Morales; Henk L. Muller; G. Puebla; M. Hermenegildo (2006). 〈High-level languages for small devices: a case study〉 (PDF). 《Proceedings of the 2006 International Conference on Compilers, Architecture and Synthesis for Embedded Systems》. ACM.
  25. ↑ Kernighan, Brian W.; Ritchie, Dennis M. (1988). 《The C Programming Language: 2nd Edition》. Prentice Hall. ISBN 9780131103627. 2022년 10월 25일에 원본 문서에서 보존된 문서. 2022년 10월 25일에 확인함.
  26. ↑ Hyde, Randall. (2010). 《The art of assembly language》 2판. San Francisco: No Starch Press. ISBN 978-1-59327-301-9. OCLC 635507601.
  27. ↑ Chu, Yaohan (1975). 〈Concepts of High-Level Language Computer Architecture〉. 《High-Level Language Computer Architecture》. Elsevier. 1–14쪽. doi:10.1016/b978-0-12-174150-1.50007-0. ISBN 978-0-12-174150-1.
  28. ↑ Texas Instruments SYMBOL high-level language computer