소스 호환성

소스 호환성 (Source Compatibility)

스칼라 3는 서로 다른 마이너 언어 버전 간에 소스 호환성을 보장하지 않아요. 다만 컴파일러가 특정 파일이나 컴파일 전체에서 쓰고 싶은 문법 버전을 지정할 수 있게 해서, 버전 사이 이동을 더 쉽게 만들어 줘요.

출처: Scala 3 Reference

본문

스칼라 3는 서로 다른 마이너 언어 버전 간 소스 호환성을 보장하지 않아요. (예를 들어 3.x에서 유효한 일부 문법이, x보다 큰 y의 3.y에서 폐기된 뒤 단계적으로 사라질 수 있어요.) 또한 스칼라 2에서는 유효했지만 스칼라 3에서는 더 이상 유효하지 않은 문법 구조도 있어요. 하지만 컴파일러는 특정 파일이나 컴파일 실행 전체에서 사용할 문법의 원하는 버전을 지정하는 방법을 제공해서, 버전 사이 마이그레이션을 더 쉽게 만들어 줘요.

현재 Dotty 컴파일러가 지원하는 기본 스칼라 언어 문법 버전은 3.2예요. 대신 지정할 수 있는 다른 언어 버전들도 있어요.

  • 3.0-migration: 3.03.1과 같지만, 스칼라 2.13 소스를 스칼라 3로 옮기는 데 도움이 되는 스칼라 2 호환 모드가 있어요. 특히,
    • 스칼라 3에서 금지된 몇몇 스칼라 2 구성들을 하드 오류 대신 마이그레이션 경고로 표시해요.
    • 일부 규칙을 스칼라 2.13과 더 관대하고 하위 호환되게 바꿔요.
    • 스칼라 2.13과 3.0 사이에 시맨틱이 바뀐 곳에서 몇 가지 추가 경고를 줘요.
    • -rewrite와 함께 쓰면 스칼라 2.13에서 3.0으로의 코드 재작성을 제공해요.
  • 3.0, 3.1: 스칼라 버전 3.0.0부터 3.1.3에 포함된 기본 기능 집합.
  • 3.2-migration: 3.2와 같지만, -rewrite와 함께 쓰면 스칼라 3.0/3.1에서 3.2로의 코드 재작성을 제공해요.
  • 3.2: 3.03.1과 같지만, 추가로:
    • 더 엄격한 패턴 바인딩이 이제 활성화되어(이전 3.x 릴리스에서는 future의 일부였음), refutable 패턴에 대한 경고를 만들어요. 이 경고는 묵살해서 같은 런타임 동작을 얻을 수 있지만, future에서는 오류가 되고 refutable 패턴은 컴파일되지 않아요.
    • 비지역 반환(Nonlocal returns)이 이제 사용 시 경고를 만들어요. (future에서는 여전히 오류예요.)
  • 3.3-migration: 3.3과 같아요.
  • 3.3: 3.2와 같지만, 추가로:
    • 더 적은 중괄호(fewer braces) 문법이 기본으로 활성화돼요.
  • future-migration: future와 같지만, 3.3에서 마이그레이션하기 위한 추가 헬퍼가 있어요. 3.0-migration 아래에서 사용할 수 있는 헬퍼들과 유사하게, 여기에는 마이그레이션 경고와 선택적 재작성이 포함돼요.
  • future: 3.3 이후의 3.x 버전에서 도입될 변경의 프리뷰예요. 이 버전에서는 일부 스칼라 2 전용 관용구가 제거돼요. 이 버전이 지원하는 기능 집합은 기능이 프리뷰로 안정화됨에 따라 시간이 지나며 늘어날 수 있어요.

언어 버전을 지정하는 방법은 두 가지가 있어요.

  • -source 명령줄 설정으로 지정하기, 예: -source 3.0-migration
  • 소스 파일 맨 위에서 scala.language import로 지정하기. 예:
package p
import scala.language.`future-migration`

class C { ... }

언어 import는 지정된 소스 파일에서 명령줄 설정을 능가해요. 소스 버전을 지정하는 언어 import는 소스 파일에 하나만 허용되고, 그 파일의 어떤 정의보다 앞에 와야 해요.

Note: 스칼라 3 마이그레이션 가이드는 스칼라 프로그래머가 스칼라 2.13에서 스칼라 3로 옮기는 데 도움이 되는 추가 정보를 제공해요.