에디션

에디션 (Editions)

에디션(Editions)은 D 언어 공식 사양에서 47번째로 다루는 주제예요. 언어가 기능을 '이제 더 이상 권장하지 않는다(obsolete)'로 만들면서도, 그 기능을 쓰고 있던 기존 코드와의 호환성은 그대로 지켜 주는 방식으로 진화할 수 있게 해 주는 장치죠. 언어가 커지면 새 기능만 추가해서는 예전 코드가 망가지기 마련인데, 에디션은 그 긴장을 풀어 주는 정책이라고 생각하면 돼요.

출처: https://dlang.org/spec/editions.html

본문

에디션은 이미 있는 기능을 '구식(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)은 다음 세 가지 규칙으로 정해져요.

  1. 원하는 에디션이 릴리스된 연도에 해당하는 명시적인 4자리 숫자로 지정한 경우.
  2. 에디션을 지정하지 않았고, 소스 코드에 ModuleDeclaration도 없다면, 사용되는 에디션은 Baseline Edition(기준 에디션) 이에요. 이는 2023년에 해당해요.
  3. 에디션을 지정하지 않았지만 소스 코드에 ModuleDeclaration이 있다면, 사용되는 에디션은 컴파일러가 릴리스된 연도예요.

더 알아보기 (Learn more)