I here conduct an exploration of programming language extensibility, making an argument for an often overlooked component of conventional language design. Now, this is not a technical detailing of these components, rather, I attempt to provide an overview as I myself have lacked during my time investigating programming languages. Thus, read this as an introduction to the magical world of extensibility. Through a literature review, I identify key extensibility themes - Macros, Modules, Types, and Reflection - highlighting diverse strategies for fostering extensibility. The analysis extends to cross-theme properties such as Parametricism and First-class citizen behaviour, introducing layers of complexity by highlighting the importance of customizability and flexibility in programming language constructs. By outlining these facets of existing programming languages and research, I aim to inspire future language designers to assess and consider the extensibility of their creations critically.
- 논문 ID: 2510.13236
- 제목: Extensibility in Programming Languages: An overview
- 저자: Sebastian Mateos Nicolajsen (IT University of Copenhagen)
- 분류: cs.PL (프로그래밍 언어)
- 발표 시간: 2025년 10월 15일 (arXiv 사전인쇄본)
- 논문 링크: https://arxiv.org/abs/2510.13236
본 논문은 프로그래밍 언어의 확장성에 대해 심층적으로 탐구하며, 전통적인 언어 설계에서 종종 간과되는 구성 요소에 대한 논증을 제시한다. 저자는 문헌 검토를 통해 네 가지 핵심 확장성 주제인 매크로(Macros), 모듈(Modules), 타입(Types), 반사(Reflection)를 식별하고, 확장성을 촉진하는 다양한 전략을 강조한다. 분석은 매개변수화(Parametricism)와 일급 객체 동작(First-class citizen behaviour)과 같은 주제 간 속성으로 확대되며, 프로그래밍 언어 구성에서 커스터마이제이션과 유연성의 중요성을 강조함으로써 복잡성의 계층을 도입한다.
- 핵심 문제: 프로그래밍 언어의 확장성이 언어 설계에서 종종 간과되며, 체계적인 연구와 요약이 부족함
- 정의의 모호성: 확장성 개념이 문헌에서 모호하게 정의되어 있으며, 명확한 분류 및 이해 프레임워크가 부족함
- 실무적 필요성: 기존 프로그래밍 언어는 새로운 요구사항에 직면할 때 불변적 특성으로 인해 제한됨
- 언어의 한계: 전통적 관점에서 프로그래밍 언어는 불변적 산물로 간주되지만, 이는 언어가 새로운 요구사항에 적응하는 능력을 제한함
- 개발 효율성: 확장성은 개발자 생산성을 향상시키고 언어의 한계를 해결하는 유일한 방법
- 미래 발전: Guy Steele 등의 학자들은 언어 성장을 위한 설계(즉, 확장성)가 미래 언어의 기본 요소여야 한다고 주장함
- 연구의 분산: 매크로, 반사, 함수, 모듈 등의 개념이 광범위하게 연구되었지만, 주로 재사용성, 모듈화, 추상화에 초점을 맞추고 확장성 자체에는 초점을 맞추지 않음
- 전체적 관점의 부재: 기존 작업은 주로 확장성 개선 또는 구현 세부사항에 초점을 맞추고, 확장성 자체에 대한 체계적 연구가 부족함
- 이론의 부족: 확장성은 추상화 등의 개념에 비해 명확한 정의와 이론적 기초가 부족함
- 체계적 분류: 문헌 검토를 통해 네 가지 핵심 확장성 주제(매크로, 모듈, 타입, 반사) 식별
- 주제 간 속성: 두 가지 중요한 주제 간 속성(매개변수화 및 일급 객체 동작) 발견 및 분석
- 이론적 프레임워크: 프로그래밍 언어 확장성 이해를 위한 구조화된 프레임워크 제공
- 실무적 지침: 미래 언어 설계자를 위한 언어 확장성 평가 및 고려 지침 제공
- 연구 공백 식별: 부트스트래핑(bootstrapping), 컴파일러 훅(compiler hooks), 가상 머신 등 덜 탐구된 개념 지적
본 논문은 Kitchenham 등이 정의한 절차를 따르는 체계적 문헌 검토 방법을 채택하고, 근거 이론(Grounded Theory)의 데이터 코딩 방법을 결합한다.
- 데이터 출처: 언어 공학 관련 10개 학회 및 저널
- 학회 포함: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
- 초기 규모: 7,090편의 논문
- 제외 전략: 특정 언어 패러다임에 초점을 맞춘 학회 제외
- 키워드 선별: 19편의 관련 논문에서 65개의 키워드 추출, 19개의 추가 키워드 생성
- 제목 선별: 키워드를 논문 제목과 비교하여 648편으로 선별
- 초록 선별: 키워드를 초록 및 결론과 비교하여 223편으로 추가 선별
- 품질 평가: 확장성 설명 또는 논의 여부에 따라 높은 관련성(69편)과 부분 관련성(64편)으로 분류
- 추출 방법: 모든 정성적 설명 및 확장성 논의 추출
- 종합 방법: 근거 이론의 데이터 코딩 방법을 차용하여 귀납적 방법으로 분류 체계 개발
- 반복적 개선: 새로운 정보 발견 시 분류를 지속적으로 개선 및 재평가
- 전체 규모: 초기 7,090편의 논문
- 시간 범위: 2022년 가을에 수집된 데이터
- 최종 분석: 133편의 관련 논문(높은 관련성 69편 + 부분 관련성 64편)
주요 질문:
- 논문이 확장성을 논의하는가? (직접 또는 간접)
- 논문이 확장성 개념을 논의하는가?
부차 질문:
- 논문이 특정 확장성 개념을 논의하는가?
- 논문이 특정 언어와 확장성을 논의하는가?
귀납적 방법을 사용하여 주제를 식별하고, 지속적인 비교 및 분류 정제를 통해 최종적으로 네 가지 주요 주제와 두 가지 주제 간 속성의 프레임워크를 형성한다.
동기: 매크로는 언어 사용자가 거의 임의의 구문 형식의 새로운 제어 메커니즘을 만들 수 있게 하여 확장성을 증가시킨다.
유형 분류:
- 어휘 매크로: 문자열 기반 변환, 구문 무관하지만 구문 안전성을 보장하지 않음
- 구문 매크로: 추상 구문 트리(AST)를 조작하여 구문 안전성 보장
- 의미 매크로: 타입 검사 등 의미 분석 제공
대표적 구현:
- Racket: 모듈화된 구문 시스템
- CPP: C 언어의 어휘 매크로 엔진
- LISP: 구문 매크로 시스템
- C++: 템플릿 및 개념(매크로 유사 기능)
동기: 모듈은 코드를 구조화하는 데 사용되며, 사용자가 도메인 특정 언어 또는 프레임워크를 패키지로 제공하기 위해 코드를 그룹화할 수 있게 한다.
타입 시스템:
- 존재 타입: 일급 모듈을 허용하지만 구현 세부사항을 숨김
- 의존 타입: 완전히 투명함
- 명시적 타입: 두 가지 사이의 절충안 제공
설계 고려사항:
- 계층 구조 및 의존성
- 중첩 모듈의 처리
- 순환 의존성의 해결
동기: 타입 시스템은 사용자가 언어에서 보장을 할 수 있게 하며, 다형성 및 제네릭 프로그래밍 등의 속성과 결합하여 개발자에게 프로그램 개발의 예측 가능성과 안전성을 제공한다.
다형성 분류:
- 임시 다형성(Ad hoc): 타입이 매개변수에 따라 달라짐
- 보편 다형성(Universal):
- 매개변수 다형성: 모든 타입을 매개변수로 허용
- 부분타입 다형성: 타입 대체 허용
제네릭 프로그래밍:
- 다양한 구현 방식: 가상 머신 지원(C#) vs 타입 소거(Java)
- 구조적 매칭: ML, C++, OCaml 등
동기: 반사는 사용자가 다른 프로그래밍 구성을 프로그래밍 방식으로 수정할 수 있게 하여, 원래 수정할 수 없었던 개념의 수정 가능성과 유연성을 증가시킨다.
능력 범위:
- 프로그램 자성찰 및 수정
- 클래스 복제 및 확장
- 가상 머신의 명확한 인터페이스 제공
과제:
동기: 매개변수화는 구성의 커스터마이제이션 능력을 증가시켜 더 많은 재사용 및 추상화를 실현한다.
적용 분야:
- 모듈 매개변수화: Standard ML 및 OCaml의 functor 구성 등
- 타입 매개변수화: 다형성을 통해 구현, C++의 concepts 및 Haskell의 type classes 등
동기: 일급 객체 속성은 사용자가 다른 값처럼 구성을 사용할 수 있게 하여 프로그래밍 구성의 동적 수정을 허용한다.
구현 방식:
- 일급 모듈: 데이터 구조처럼 조작 가능
- 일급 타입: 타입 생성기 등의 메커니즘
- 부트스트래핑(Bootstrapping): 언어 자체 구현, 언어의 불변성 개념 제거
- 컴파일러 훅(Compiler hooks): 사용자가 컴파일러에 훅을 주입할 수 있게 함
- 가상 머신(Virtual machines): 언어 실험을 위한 풍부한 기능 및 이식성 제공
- Daniel Zingaro: Standish의 paraphrase, orthophrase, metaphrase 개념을 언어 집합에 적용
- Sebastian Erdweg 및 Felix Rieger: 언어 확장성을 추론하기 위한 Sugar* 프레임워크 제안
- Philip Wadler: Java 메일링 리스트에서 프로그래밍 언어의 확장성을 측정하기 위한 표현성 문제 제시
- Robert Tennent: 《프로그래밍 언어 원리》, 언어의 다양한 구성 요소 설명
- Peter Sestoft: 《프로그래밍 언어 개념》, 유사한 주제 및 설계 결정 포함
- 확장성의 중요성: 확장성은 언어의 한계를 극복하고 커뮤니티 주도 개발을 촉진하는 핵심 요소
- 체계적 프레임워크: 네 가지 주제(매크로, 모듈, 타입, 반사)와 두 가지 주제 간 속성이 확장성 이해를 위한 구조화된 프레임워크 제공
- 균형 잡힌 고려: 확장성은 성능, 안전성, 예측 가능성 등 다른 품질 속성과 균형을 이루어야 함
- 성능 영향: Java 및 C#의 추상화 및 확장성으로 인해 C 언어보다 성능이 낮음
- 보안 위험: 사용자 개발 확장이 보안 취약점을 도입할 수 있음
- 복잡성 증가: 언어 팽창 및 상황 특정 솔루션으로 이어질 수 있음
- 추상화 누수: 대부분의 언어에서 추상화는 구현 세부사항을 누수함
- 확장성은 전체 언어 설계의 통합 부분이어야 함
- 언어 엔지니어는 강조된 과제를 고려해야 함
- 확장성과 다른 품질 속성 사이의 균형을 찾아야 함
- 심층 탐구: 부트스트래핑, 컴파일러 훅, 가상 머신 등의 개념은 추가 연구 필요
- 이론 발전: 더 명확한 확장성 정의 및 이론적 기초 필요
- 실무 적용: 언어 설계자를 위한 더 구체적인 확장성 설계 지침 필요
- 체계성 강함: 프로그래밍 언어 확장성에 대한 최초의 체계적 문헌 검토 및 분류
- 프레임워크 명확함: 네 가지 주제 더하기 두 가지 주제 간 속성의 명확한 분석 프레임워크 제공
- 실용적 가치 높음: 언어 설계자에게 가치 있는 참고 및 지침 제공
- 방법론 엄밀함: 표준 체계적 문헌 검토 방법 채택, 과정이 투명하고 추적 가능
- 포괄 범위 광범위: 역사에서 현대까지 다양한 언어 및 기술 포함
- 정의의 모호성: 확장성 정의의 모호성을 지적했지만, 본 논문도 더 정확한 정의를 제공하지 못함
- 실증 부족: 정량적 실증 연구 부족, 주로 정성적 분석에 의존
- 평가 기준 부재: 다양한 확장성 메커니즘의 효과를 평가하는 객관적 기준 부재
- 범위 제한: 일부 중요 학회 제외로 관련 연구 누락 가능성
- 연구자 편향: 단일 연구자의 분석으로 인한 주관적 편향 가능성
- 학술 기여: 프로그래밍 언어 연구 분야에 새로운 연구 관점 및 프레임워크 제공
- 실무적 가치: 언어 설계자 및 도구 개발자에게 중요한 참고 가치
- 영감 제공: 언어 확장성에 대한 더 심층적인 연구 자극 가능성
- 교육적 가치: 프로그래밍 언어 과정의 중요한 참고 자료로 활용 가능
- 언어 설계: 새로운 프로그래밍 언어의 설계 및 기존 언어의 개선
- 도구 개발: IDE, 컴파일러 등 개발 도구의 확장 메커니즘 설계
- 학술 연구: 프로그래밍 언어 이론 및 실무의 추가 연구
- 교육 훈련: 프로그래밍 언어 과정 및 교육 자료 개발
논문은 프로그래밍 언어 역사, 설계 원리, 구체적 구현 등 다양한 측면을 포함하는 135편의 참고문헌을 포함하며, 확장성 연구를 위한 포괄적인 문헌 기초를 제공한다. 주요 참고문헌은 다음을 포함한다:
- Standish (1975): 확장 가능한 프로그래밍 언어 설계의 초기 작업
- Steele (1998): 언어 성장의 중요한 관점
- 다양한 HOPL 논문: 언어 역사 및 설계 사상의 귀중한 자료 제공
전체 평가: 이는 프로그래밍 언어 확장성 연구에 중요한 이론적 프레임워크 및 실무 지침을 제공하는 고품질의 종합 논문이다. 일부 한계가 있지만, 체계적인 방법론과 명확한 분석 프레임워크로 인해 이 분야의 중요한 기여가 된다. 언어 설계자, 연구자, 학생 모두에게 중요한 참고 가치가 있다.