2025-11-23T09:55:17.068946

Extensibility in Programming Languages: An overview

Nicolajsen
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.
academic

프로그래밍 언어의 확장성: 개요

기본 정보

  • 논문 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)과 같은 주제 간 속성으로 확대되며, 프로그래밍 언어 구성에서 커스터마이제이션과 유연성의 중요성을 강조함으로써 복잡성의 계층을 도입한다.

연구 배경 및 동기

연구 문제

  1. 핵심 문제: 프로그래밍 언어의 확장성이 언어 설계에서 종종 간과되며, 체계적인 연구와 요약이 부족함
  2. 정의의 모호성: 확장성 개념이 문헌에서 모호하게 정의되어 있으며, 명확한 분류 및 이해 프레임워크가 부족함
  3. 실무적 필요성: 기존 프로그래밍 언어는 새로운 요구사항에 직면할 때 불변적 특성으로 인해 제한됨

문제의 중요성

  1. 언어의 한계: 전통적 관점에서 프로그래밍 언어는 불변적 산물로 간주되지만, 이는 언어가 새로운 요구사항에 적응하는 능력을 제한함
  2. 개발 효율성: 확장성은 개발자 생산성을 향상시키고 언어의 한계를 해결하는 유일한 방법
  3. 미래 발전: Guy Steele 등의 학자들은 언어 성장을 위한 설계(즉, 확장성)가 미래 언어의 기본 요소여야 한다고 주장함

기존 방법의 한계

  1. 연구의 분산: 매크로, 반사, 함수, 모듈 등의 개념이 광범위하게 연구되었지만, 주로 재사용성, 모듈화, 추상화에 초점을 맞추고 확장성 자체에는 초점을 맞추지 않음
  2. 전체적 관점의 부재: 기존 작업은 주로 확장성 개선 또는 구현 세부사항에 초점을 맞추고, 확장성 자체에 대한 체계적 연구가 부족함
  3. 이론의 부족: 확장성은 추상화 등의 개념에 비해 명확한 정의와 이론적 기초가 부족함

핵심 기여

  1. 체계적 분류: 문헌 검토를 통해 네 가지 핵심 확장성 주제(매크로, 모듈, 타입, 반사) 식별
  2. 주제 간 속성: 두 가지 중요한 주제 간 속성(매개변수화 및 일급 객체 동작) 발견 및 분석
  3. 이론적 프레임워크: 프로그래밍 언어 확장성 이해를 위한 구조화된 프레임워크 제공
  4. 실무적 지침: 미래 언어 설계자를 위한 언어 확장성 평가 및 고려 지침 제공
  5. 연구 공백 식별: 부트스트래핑(bootstrapping), 컴파일러 훅(compiler hooks), 가상 머신 등 덜 탐구된 개념 지적

방법론 상세 설명

연구 방법

본 논문은 Kitchenham 등이 정의한 절차를 따르는 체계적 문헌 검토 방법을 채택하고, 근거 이론(Grounded Theory)의 데이터 코딩 방법을 결합한다.

문헌 수집 전략

초기 문헌 집합

  • 데이터 출처: 언어 공학 관련 10개 학회 및 저널
  • 학회 포함: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
  • 초기 규모: 7,090편의 논문
  • 제외 전략: 특정 언어 패러다임에 초점을 맞춘 학회 제외

선별 절차

  1. 키워드 선별: 19편의 관련 논문에서 65개의 키워드 추출, 19개의 추가 키워드 생성
  2. 제목 선별: 키워드를 논문 제목과 비교하여 648편으로 선별
  3. 초록 선별: 키워드를 초록 및 결론과 비교하여 223편으로 추가 선별
  4. 품질 평가: 확장성 설명 또는 논의 여부에 따라 높은 관련성(69편)과 부분 관련성(64편)으로 분류

데이터 추출 및 종합

  • 추출 방법: 모든 정성적 설명 및 확장성 논의 추출
  • 종합 방법: 근거 이론의 데이터 코딩 방법을 차용하여 귀납적 방법으로 분류 체계 개발
  • 반복적 개선: 새로운 정보 발견 시 분류를 지속적으로 개선 및 재평가

실험 설정

데이터셋 특성

  • 전체 규모: 초기 7,090편의 논문
  • 시간 범위: 2022년 가을에 수집된 데이터
  • 최종 분석: 133편의 관련 논문(높은 관련성 69편 + 부분 관련성 64편)

품질 평가 기준

주요 질문:

  • 논문이 확장성을 논의하는가? (직접 또는 간접)
  • 논문이 확장성 개념을 논의하는가?

부차 질문:

  • 논문이 특정 확장성 개념을 논의하는가?
  • 논문이 특정 언어와 확장성을 논의하는가?

분석 프레임워크

귀납적 방법을 사용하여 주제를 식별하고, 지속적인 비교 및 분류 정제를 통해 최종적으로 네 가지 주요 주제와 두 가지 주제 간 속성의 프레임워크를 형성한다.

실험 결과

주요 발견: 네 가지 핵심 주제

1. 매크로 (Macros)

동기: 매크로는 언어 사용자가 거의 임의의 구문 형식의 새로운 제어 메커니즘을 만들 수 있게 하여 확장성을 증가시킨다.

유형 분류:

  • 어휘 매크로: 문자열 기반 변환, 구문 무관하지만 구문 안전성을 보장하지 않음
  • 구문 매크로: 추상 구문 트리(AST)를 조작하여 구문 안전성 보장
  • 의미 매크로: 타입 검사 등 의미 분석 제공

대표적 구현:

  • Racket: 모듈화된 구문 시스템
  • CPP: C 언어의 어휘 매크로 엔진
  • LISP: 구문 매크로 시스템
  • C++: 템플릿 및 개념(매크로 유사 기능)

2. 모듈 (Modules)

동기: 모듈은 코드를 구조화하는 데 사용되며, 사용자가 도메인 특정 언어 또는 프레임워크를 패키지로 제공하기 위해 코드를 그룹화할 수 있게 한다.

타입 시스템:

  • 존재 타입: 일급 모듈을 허용하지만 구현 세부사항을 숨김
  • 의존 타입: 완전히 투명함
  • 명시적 타입: 두 가지 사이의 절충안 제공

설계 고려사항:

  • 계층 구조 및 의존성
  • 중첩 모듈의 처리
  • 순환 의존성의 해결

3. 타입 (Types)

동기: 타입 시스템은 사용자가 언어에서 보장을 할 수 있게 하며, 다형성 및 제네릭 프로그래밍 등의 속성과 결합하여 개발자에게 프로그램 개발의 예측 가능성과 안전성을 제공한다.

다형성 분류:

  • 임시 다형성(Ad hoc): 타입이 매개변수에 따라 달라짐
  • 보편 다형성(Universal):
    • 매개변수 다형성: 모든 타입을 매개변수로 허용
    • 부분타입 다형성: 타입 대체 허용

제네릭 프로그래밍:

  • 다양한 구현 방식: 가상 머신 지원(C#) vs 타입 소거(Java)
  • 구조적 매칭: ML, C++, OCaml 등

4. 반사 (Reflection)

동기: 반사는 사용자가 다른 프로그래밍 구성을 프로그래밍 방식으로 수정할 수 있게 하여, 원래 수정할 수 없었던 개념의 수정 가능성과 유연성을 증가시킨다.

능력 범위:

  • 프로그램 자성찰 및 수정
  • 클래스 복제 및 확장
  • 가상 머신의 명확한 인터페이스 제공

과제:

  • 성능 비용
  • 캡슐화 위반
  • 메타 안정성 문제

주제 간 속성

1. 매개변수화 (Parametricism)

동기: 매개변수화는 구성의 커스터마이제이션 능력을 증가시켜 더 많은 재사용 및 추상화를 실현한다.

적용 분야:

  • 모듈 매개변수화: Standard ML 및 OCaml의 functor 구성 등
  • 타입 매개변수화: 다형성을 통해 구현, C++의 concepts 및 Haskell의 type classes 등

2. 일급 객체 동작 (First-class citizen behaviour)

동기: 일급 객체 속성은 사용자가 다른 값처럼 구성을 사용할 수 있게 하여 프로그래밍 구성의 동적 수정을 허용한다.

구현 방식:

  • 일급 모듈: 데이터 구조처럼 조작 가능
  • 일급 타입: 타입 생성기 등의 메커니즘

덜 탐구된 개념

  1. 부트스트래핑(Bootstrapping): 언어 자체 구현, 언어의 불변성 개념 제거
  2. 컴파일러 훅(Compiler hooks): 사용자가 컴파일러에 훅을 주입할 수 있게 함
  3. 가상 머신(Virtual machines): 언어 실험을 위한 풍부한 기능 및 이식성 제공

관련 연구

확장성 개선 연구

  • Daniel Zingaro: Standish의 paraphrase, orthophrase, metaphrase 개념을 언어 집합에 적용
  • Sebastian Erdweg 및 Felix Rieger: 언어 확장성을 추론하기 위한 Sugar* 프레임워크 제안

표현성 문제

  • Philip Wadler: Java 메일링 리스트에서 프로그래밍 언어의 확장성을 측정하기 위한 표현성 문제 제시

교육 자료

  • Robert Tennent: 《프로그래밍 언어 원리》, 언어의 다양한 구성 요소 설명
  • Peter Sestoft: 《프로그래밍 언어 개념》, 유사한 주제 및 설계 결정 포함

결론 및 논의

주요 결론

  1. 확장성의 중요성: 확장성은 언어의 한계를 극복하고 커뮤니티 주도 개발을 촉진하는 핵심 요소
  2. 체계적 프레임워크: 네 가지 주제(매크로, 모듈, 타입, 반사)와 두 가지 주제 간 속성이 확장성 이해를 위한 구조화된 프레임워크 제공
  3. 균형 잡힌 고려: 확장성은 성능, 안전성, 예측 가능성 등 다른 품질 속성과 균형을 이루어야 함

과제 및 절충

확장성의 대가

  1. 성능 영향: Java 및 C#의 추상화 및 확장성으로 인해 C 언어보다 성능이 낮음
  2. 보안 위험: 사용자 개발 확장이 보안 취약점을 도입할 수 있음
  3. 복잡성 증가: 언어 팽창 및 상황 특정 솔루션으로 이어질 수 있음
  4. 추상화 누수: 대부분의 언어에서 추상화는 구현 세부사항을 누수함

설계 권장사항

  • 확장성은 전체 언어 설계의 통합 부분이어야 함
  • 언어 엔지니어는 강조된 과제를 고려해야 함
  • 확장성과 다른 품질 속성 사이의 균형을 찾아야 함

향후 방향

  1. 심층 탐구: 부트스트래핑, 컴파일러 훅, 가상 머신 등의 개념은 추가 연구 필요
  2. 이론 발전: 더 명확한 확장성 정의 및 이론적 기초 필요
  3. 실무 적용: 언어 설계자를 위한 더 구체적인 확장성 설계 지침 필요

심층 평가

장점

  1. 체계성 강함: 프로그래밍 언어 확장성에 대한 최초의 체계적 문헌 검토 및 분류
  2. 프레임워크 명확함: 네 가지 주제 더하기 두 가지 주제 간 속성의 명확한 분석 프레임워크 제공
  3. 실용적 가치 높음: 언어 설계자에게 가치 있는 참고 및 지침 제공
  4. 방법론 엄밀함: 표준 체계적 문헌 검토 방법 채택, 과정이 투명하고 추적 가능
  5. 포괄 범위 광범위: 역사에서 현대까지 다양한 언어 및 기술 포함

부족점

  1. 정의의 모호성: 확장성 정의의 모호성을 지적했지만, 본 논문도 더 정확한 정의를 제공하지 못함
  2. 실증 부족: 정량적 실증 연구 부족, 주로 정성적 분석에 의존
  3. 평가 기준 부재: 다양한 확장성 메커니즘의 효과를 평가하는 객관적 기준 부재
  4. 범위 제한: 일부 중요 학회 제외로 관련 연구 누락 가능성
  5. 연구자 편향: 단일 연구자의 분석으로 인한 주관적 편향 가능성

영향력

  1. 학술 기여: 프로그래밍 언어 연구 분야에 새로운 연구 관점 및 프레임워크 제공
  2. 실무적 가치: 언어 설계자 및 도구 개발자에게 중요한 참고 가치
  3. 영감 제공: 언어 확장성에 대한 더 심층적인 연구 자극 가능성
  4. 교육적 가치: 프로그래밍 언어 과정의 중요한 참고 자료로 활용 가능

적용 시나리오

  1. 언어 설계: 새로운 프로그래밍 언어의 설계 및 기존 언어의 개선
  2. 도구 개발: IDE, 컴파일러 등 개발 도구의 확장 메커니즘 설계
  3. 학술 연구: 프로그래밍 언어 이론 및 실무의 추가 연구
  4. 교육 훈련: 프로그래밍 언어 과정 및 교육 자료 개발

참고문헌

논문은 프로그래밍 언어 역사, 설계 원리, 구체적 구현 등 다양한 측면을 포함하는 135편의 참고문헌을 포함하며, 확장성 연구를 위한 포괄적인 문헌 기초를 제공한다. 주요 참고문헌은 다음을 포함한다:

  • Standish (1975): 확장 가능한 프로그래밍 언어 설계의 초기 작업
  • Steele (1998): 언어 성장의 중요한 관점
  • 다양한 HOPL 논문: 언어 역사 및 설계 사상의 귀중한 자료 제공

전체 평가: 이는 프로그래밍 언어 확장성 연구에 중요한 이론적 프레임워크 및 실무 지침을 제공하는 고품질의 종합 논문이다. 일부 한계가 있지만, 체계적인 방법론과 명확한 분석 프레임워크로 인해 이 분야의 중요한 기여가 된다. 언어 설계자, 연구자, 학생 모두에게 중요한 참고 가치가 있다.