Software Design for Flexibility (Hanson & Sussman 2021) 전문을 wiki/sources/ 아래 챕터별 한국어 wiki 페이지로 컴파일 - SDF-overview: 전체 개요, 챕터 관계도, 공통 테마 - SDF-ch1: 가산적 프로그래밍 철학, 퇴화성, 유연성 비용 - SDF-ch2: 컴비네이터, DSL, 래퍼, 도메인 모델 - SDF-ch3: 제네릭 프로시저, 자동 미분, 트라이 디스패치 - SDF-ch4: 패턴 매칭, 항 재작성, 단일화, 타입 추론 - SDF-ch5: eval/apply, lazy eval, amb, call/cc - SDF-ch6: 레이어드 데이텀/프로시저, 단위 산술, 의존성 추적 - SDF-ch7: 전파 모델, 부분 정보 결합, 의존성 지향 백트래킹 wiki/index.md Sources 섹션 등록, wiki/log.md 기록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
108 lines
4.6 KiB
Markdown
108 lines
4.6 KiB
Markdown
---
|
|
title: "Ch6: Layering"
|
|
tags: [source, SDF]
|
|
source: "Software Design for Flexibility, Hanson & Sussman (2021)"
|
|
chapter: 6
|
|
updated: 2026-04-30
|
|
---
|
|
|
|
# Ch6: Layering
|
|
|
|
## 핵심 아이디어
|
|
|
|
**레이어링(layering)**은 데이터와 프로시저 모두를 여러 계층으로 구성하여, 기존 프로그램을 수정하지 않고 메타데이터를 병렬로 처리하는 기법이다. 수치 데이터에 단위(units)를 첨부하거나, 결과에 출처(provenance) 정보를 추적하는 것처럼, 기본 계층의 계산에 영향을 주지 않으면서 부가 계층을 독립적으로 처리할 수 있다.
|
|
|
|
## 주요 개념
|
|
|
|
### 6.1 레이어링 사용
|
|
|
|
각 데이터 항목은 여러 계층의 정보를 담은 **레이어드 데이텀(layered datum)**이다:
|
|
|
|
```scheme
|
|
(define G
|
|
(layered-datum 6.67408e-11
|
|
unit-layer (unit 'meter 3 'kilogram -1 'second -2)
|
|
support-layer (support-set 'CODATA-2018)))
|
|
```
|
|
|
|
`F = G * m1 * m2 / r^2`를 계산할 때:
|
|
- 기본 계층: 수치 계산 수행
|
|
- 단위 계층: 단위 자동 검사 및 전파
|
|
- 지원 계층: 사용된 데이터 출처 자동 수집
|
|
|
|
```scheme
|
|
(pp (F M-earth M-Moon a-moon))
|
|
; (base-layer 1.9805035857209e20)
|
|
; (unit-layer (unit kilogram 1 meter 1 second -2))
|
|
; (support-layer (support-set Wieczorek-2006 NASA-2006 ...))
|
|
```
|
|
|
|
### 6.2 레이어링 구현
|
|
|
|
**두 핵심 컴포넌트**:
|
|
|
|
1. **레이어드 데이텀**: 계층 이름 → 값의 연관 구조. 특수 이름으로 기본 계층을 식별.
|
|
|
|
2. **레이어드 프로시저**: 각 계층을 (다소) 독립적으로 처리하는 향상된 프로시저.
|
|
|
|
**레이어 이름**: 변수로 레이어를 참조하여 사용자 인터페이스를 구현 세부사항에서 분리.
|
|
|
|
**제네릭 프로시저와의 관계**: 레이어링은 제네릭 프로시저와 밀접하게 관련되나 새로운 관점을 더한다. 각 레이어는 해당 레이어의 데이터에 대한 자체 프로시저를 가지며, 기본 계층의 코드는 다른 레이어의 존재를 전혀 모른다.
|
|
|
|
### 6.3 단위 레이어
|
|
|
|
**단위 산술**: SI 단위를 차원(dimension)으로 표현하고, 연산 시 단위를 자동으로 결합/검사.
|
|
|
|
```scheme
|
|
(unit 'meter 3 'kilogram -1 'second -2) ; m³/(kg·s²)
|
|
```
|
|
|
|
- 곱셈: 각 차원의 지수를 더함
|
|
- 나눗셈: 각 차원의 지수를 뺌
|
|
- 덧셈: 단위가 동일한지 검사 (불일치 시 오류)
|
|
|
|
기본 계층의 수치 프로시저(`F = G*m1*m2/r²`)는 단위를 전혀 알지 못하지만, 레이어드 프로시저는 단위 계층을 자동으로 처리한다.
|
|
|
|
### 6.4 의존성 추적 레이어
|
|
|
|
**출처/의존성(support) 레이어**: 각 값이 어떤 원시 소스에서 파생되었는지 추적.
|
|
|
|
- 연산의 결과 의존성 = 모든 피연산자의 의존성의 합집합
|
|
- 값의 출처를 자동으로 추적하여 설명(explanation)과 디버깅에 활용
|
|
|
|
이 레이어는 Chapter 7의 의존성 지향 백트래킹(dependency-directed backtracking)의 기반이 된다.
|
|
|
|
### 6.5 레이어링의 설계 원칙
|
|
|
|
**관심사의 분리**: 아키텍처의 "served spaces"(기본 계산)와 "servant spaces"(단위, 의존성 등 메타데이터)를 분리.
|
|
|
|
- 기본 코드: 원래의 수치 계산만 담당
|
|
- 레이어 처리 코드: 기본 코드와 무관하게 독립적으로 개발
|
|
- 새 레이어 추가: 기존 코드 변경 없음
|
|
|
|
**aspect-oriented programming과의 비교**: AOP(관점 지향 프로그래밍)는 "횡단 관심사(cross-cutting concerns)"를 분리하려는 시도. 레이어링은 더 구조적인 방법으로 동일한 목표를 달성.
|
|
|
|
**레이어링이 가능한 것들**:
|
|
- 수치 정밀도 선언
|
|
- 타입 정보 (컴파일러용)
|
|
- 단언(assertions)/사전조건/사후조건
|
|
- 대안 구현 제안 (퇴화성 지원)
|
|
- 의존성/출처 추적
|
|
- 로깅
|
|
|
|
## 핵심 인용
|
|
|
|
> "Both the data and the procedures that process it will be made up of multiple layers that enable additive annotation without introducing clutter."
|
|
|
|
> "The processing of the underlying data is not affected by the metadata, and the code for processing the underlying data does not even know about or reference the metadata. However, the metadata is processed by its own procedures, effectively in parallel with the data."
|
|
|
|
> "The decoration of a value is a generalization of the tagging used to support extensible generic operations."
|
|
|
|
## 관련 개념
|
|
|
|
- [[SDF-ch1-flexibility]] — 관심사 분리 원칙 (served/servant spaces)
|
|
- [[SDF-ch2-dsl]] — 래퍼 개념의 확장
|
|
- [[SDF-ch3-generic-procedures]] — 레이어링의 기술적 기반
|
|
- [[SDF-ch7-propagation]] — 의존성 레이어가 전파 시스템의 핵심 재료
|
|
- [[SDF-overview]]
|