언어 패러다임
프로그래밍 패러다임은 명령형 상태 변경부터 함수형, 논리형, 선언형 모델에 이르기까지 계산이 표현되는 방식을 조직하는 근본적인 스타일입니다.
Definition
프로그래밍 패러다임은 언어 내에서 계산을 조직하기 위한 일관된 개념 및 구조화 원칙의 집합으로, 프로그램의 기본 단위(문, 표현식, 객체, 관계)가 무엇이며 이들이 어떻게 구성되는지를 정의합니다.
Scope
이 분야는 프로그래밍 언어의 주요 패러다임과 이를 뒷받침하는 계산 모델을 다룹니다. 즉, 가변 상태와 메시지 전달을 기반으로 하는 명령형 및 객체 지향 프로그래밍; 표현식 평가와 고차 함수를 기반으로 하는 함수형 프로그래밍; 관계와 탐색을 기반으로 하는 논리 및 제약 프로그래밍; 그리고 프로그램이 프로그램을 조작하는 메타프로그래밍을 포함합니다. 이 영역은 패러다임이 언어 설계를 어떻게 형성하는지, 패러다임이 내포하는 장단점, 그리고 현대의 다중 패러다임 언어가 이들을 어떻게 결합하는지를 다룹니다.
Sub-topics
Core questions
- 하나의 패러다임과 다른 패러다임을 구별하는 것은 무엇이며, 이러한 구별은 명확한가 아니면 강조점의 문제인가?
- 패러다임은 프로그램의 정확성, 모듈성 및 추론에 어떻게 영향을 미치는가?
- 명령형 및 선언형 스타일을 통합할 수 있는가, 그리고 이들을 혼합함으로써 얻거나 잃는 것은 무엇인가?
- 기저의 계산 모델(폰 노이만 머신, 람다 계산법, 해상도)은 패러다임에 어떻게 영향을 미치는가?
Key theories
- 프로그램 대수로서의 함수형 프로그래밍
- 배커스는 함수형, 조합기 기반 프로그래밍이 프로그램에 추론 및 변환을 위한 등식 법칙의 대수를 제공함으로써 폰 노이만 병목 현상으로부터 언어를 해방시킨다고 주장했습니다.
- 알고리즘 = 논리 + 제어
- 코왈스키(Kowalski)는 문제의 논리적 명세와 이를 해결하는 데 사용되는 제어 전략을 분리함으로써 선언형/논리 패러다임의 기반을 마련하고, 절차적 코드와 구별되는 점을 명확히 했습니다.
- 다중 패러다임 커널 언어 프레임워크
- 반 로이(Van Roy)와 하리디(Haridi)는 패러다임을 작은 커널 언어의 점진적 확장으로 제시하며, 상태, 동시성, 지연 평가와 같은 개념을 추가하거나 제거하여 각 패러다임을 복원하는 방법을 보여줍니다.
Clinical relevance
패러다임 선택은 소프트웨어 공학에 실질적인 영향을 미칩니다. 함수형 및 선언형 스타일은 등식 추론, 테스트 용이성, 병렬화를 돕는 반면, 객체 지향 분해는 대규모 모듈성을 지원합니다. 현대 언어는 패러다임을 점차 혼합하고 있으므로, 그 장단점을 이해하는 것은 언어 선택과 관용적인 설계에 도움이 됩니다.
History
명령형 프로그래밍은 저장 프로그램 방식의 폰 노이만 아키텍처와 포트란(Fortran), 알골(Algol)과 같은 초기 언어에서 유래했습니다. 리스프(Lisp, 1958)는 람다 계산법에 뿌리를 둔 함수형 아이디어를 도입했습니다. 1970년대에는 논리 프로그래밍(프롤로그, Prolog)과 구조적 프로그래밍, 그리고 객체 지향 프로그래밍(시뮬라, Simula; 스몰토크, Smalltalk)이 부상했습니다. 1977년 배커스(Backus)의 튜링상 강연은 명령형 스타일에 대한 함수형 비판을 구체화했으며, 이후 수십 년 동안 점점 더 많은 다중 패러다임 언어가 등장했습니다.
Debates
- 주요 조직 원리로서의 명령형 대 선언형
- 오랜 논쟁은 명령형 코드의 직접성과 성능 제어와 선언형 및 함수형 스타일의 추론 및 구성 가능성 이점을 비교합니다. 대부분의 현대 언어는 둘 다 지원함으로써 이 문제를 해결합니다.
Key figures
- John Backus
- Robert Kowalski
- Peter Van Roy
- Harold Abelson
- Gerald Jay Sussman
Related topics
Seminal works
- backus1978
- kowalski1979
- vanroy2004
- abelson1996
Frequently asked questions
- 객체 지향 프로그래밍은 명령형 프로그래밍과 별개의 패러다임인가요?
- 객체 지향 프로그래밍은 일반적으로 명령형 패러다임 위에 계층화된 구조화 원칙으로 다루어집니다. 즉, 가변 상태를 캡슐화된 동작을 가진 객체로 조직하지만, 여전히 상태 변경과 순차 실행에 의존합니다.
- 패러다임은 상호 배타적인가요?
- 아닙니다. 널리 사용되는 많은 언어는 다중 패러다임이며, 함수형, 객체 지향, 명령형 기능을 결합하여 프로그래머가 각 작업에 가장 적합한 스타일을 선택할 수 있도록 합니다.