에디션
에디션 (Editions)
에디션(Editions)은 D 언어 공식 사양에서 47번째로 다루는 주제예요. 언어가 기능을 '이제 더 이상 권장하지 않는다(obsolete)'로 만들면서도, 그 기능을 쓰고 있던 기존 코드와의 호환성은 그대로 지켜 주는 방식으로 진화할 수 있게 해 주는 장치죠. 언어가 커지면 새 기능만 추가해서는 예전 코드가 망가지기 마련인데, 에디션은 그 긴장을 풀어 주는 정책이라고 생각하면 돼요.
본문
에디션은 이미 있는 기능을 '구식(obsolete)'으로 만들어 가면서도, 그 기능을 쓰던 코드와의 호환성을 유지하는 방식으로 D를 진화시킬 수 있게 해 주는 장치예요. 에디션은 모듈 단위 기능이라서, 한 모듈 안의 서로 다른 섹션에 각각 다른 에디션을 지정할 수는 없어요.
에디션은 기본값으로 정해지거나, ModuleDeclaration에 넣어서 정해지거나, -edition 커맨드라인 스위치로 정해져요.
에디션은 과거 버전과 미래 버전 어느 쪽과도 호환되도록 설계돼 있어요. 그래서 한 에디션을 대상으로 하는 D 모듈이 다른 에디션을 대상으로 하는 D 모듈을 import할 수 있죠. 이때 주의할 점이 하나 있어요. 템플릿은 그 템플릿이 정의된 모듈이 대상으로 하는 에디션의 규칙을 따라야 하지, 인스턴스화(instantiation)된 모듈의 규칙을 따르는 게 아니에요. 호환성은 소스 코드 수준에서만 보장되며, ABI 호환성은 약속하지 않아요. 그리고 옛 코드든 새 코드든 모두 같은 버전의 컴파일러로 컴파일돼야 해요. 컴파일러 릴리스에는 기존의 모든 에디션을 지원해야 하는 단 하나의 DRuntime 버전만 함께 제공돼요.
문법 (Grammar)
에디션의 형태는 아주 단순해요. 릴리스 연도를 나타내는 10진 정수 하나가 곧 에디션이죠.
Edition:
DecimalInteger
에디션이 무엇을 할 수 있나요? (What can editions do?)
에디션을 도입하면 언어에 다음과 같은 변화를 줄 수 있어요.
-
기존 기능 삭제 — 에디션이 할 수 있는 가장 쉬운 변화예요. 미래의 코드가 더 이상 쓰지 말아야 할(deprecated) 기능을 쓰는 걸 금지할 수 있으니까요. 컴파일러를 그 기능들을 위해 계속 유지보수하는 것만 빼면, 다른 영향은 전혀 없어요.
-
새 기능 추가 — 순수하게 추가적인(additive) 성격, 즉 기존 기능과 상호작용하지 않는 새 기능을 더할 때는 에디션이 꼭 필요하진 않아요. 그리고 가능한 경우 이전 에디션으로 백포트(backport)할 수도 있어요.
-
기본값 변경 — 기본값은 동작을 부추기고 영향을 주기 때문에 중요해요. 새 에디션에서는
@system/@safe같은 기본값을 바꿀 수 있어요. -
의미(semantics) 변경 — 에디션 한 번으로 이런 변화를 줄 수도 있어요. 예를 들어 아래 코드가:
shared int i;
i += 5;
이렇게 낮춰지도록(lowered) 만들 수 있죠:
shared int i;
i.atomicOp!"+="(5);
에디션 지정하기 (Specifying the Edition)
에디션 수준(level)은 다음 세 가지 규칙으로 정해져요.
- 원하는 에디션이 릴리스된 연도에 해당하는 명시적인 4자리 숫자로 지정한 경우.
- 에디션을 지정하지 않았고, 소스 코드에
ModuleDeclaration도 없다면, 사용되는 에디션은 Baseline Edition(기준 에디션) 이에요. 이는 2023년에 해당해요. - 에디션을 지정하지 않았지만 소스 코드에
ModuleDeclaration이 있다면, 사용되는 에디션은 컴파일러가 릴리스된 연도예요.
더 알아보기 (Learn more)
- D 언어 공식 사양 — Editions
- 관련 주제: Module Declaration, Legacy Code