-
Elixir 1.19 버전은 타입 시스템 강화와 컴파일 성능 개선을 통해, 더 많은 버그를 빠르게 탐지할 수 있게 됨
- 타입 추론이 익명 함수와 프로토콜까지 확장되어, 사용자의 타입 주석 없이도 더욱 폭넓은 자동 검증이 가능해짐
- 대형 프로젝트에서 최대 4배까지 향상된 컴파일 속도를 제공하며, 병렬 컴파일과 코드 로딩 최적화가 포함됨
-
Erlang/OTP 28 지원, OpenChain 인증 도입 등 생태계와 공급망 투명성도 강화됨
- 그 외에도 옵션 파싱 개선, ExUnit 디버그성 향상, shell 기반 문서 접근성 개선 등 여러 기능이 포함됨
Elixir 1.19 주요 개선 사항
타입 시스템 개선
모든 구성요소의 타입 추론
- Type inference(타입 추론)은 표현식의 타입을 컴파일 시점에 자동 판정하는 기능임
- 기존에는 패턴, 가드, 반환값 위주로 타입 추론을 지원하려 했으나, 이번 릴리즈에서 모든 구성요소(가드를 제외)의 타입 추론을 도입함
- 모듈 내 및 Elixir 표준 라이브러리 함수 호출 등도 참고하여 타입을 추론하므로, 예전에는 dynamic() -> boolean()으로 추론되던 함수도 integer() -> boolean()처럼 더 명확하게 추론 가능해짐
- 타입 추론은 컴파일 속도, 표현력, 점진적 컴파일, 에러 명확성 등 여러 트레이드오프를 수반하므로, 추후에는 가드 타입 추론 및 종속성 타입 정보도 포함할 예정임
- 함수에 타입 시그니처가 명시되면, 타입 추론이 아닌 명시 타입 검사로 동작하여, 사용자 주석에 맞는 타입만 허용함
프로토콜 디스패치 및 구현 시 타입 검사
- Elixir는 이제 프로토콜 호출 및 구현 시 타입 검사를 적용함
- 예를 들어, String.Chars 프로토콜을 구현하지 않은 타입을 문자열 보간에 전달하면 경고 메시지를 출력함
- for comprehension에서 Enumerable 프로토콜을 만족하지 않는 타입을 제너레이터로 전달 시에도 경고가 발생함
- 이러한 타입 검사로 컴파일 타임에 더 많은 버그를 방지할 수 있음
익명 함수의 타입 추론과 검사
- Elixir 1.19는 익명 함수에 대한 타입 추론 및 타입 검사를 지원함
- 예로, %{} 타입을 기대하는 익명 함수에 "hello"와 같이 잘못된 타입을 전달하는 경우 컴파일 타임 경고로 바로 감지할 수 있음
- 함수 캡처(&String.to_integer/1 등)에도 타입 추론이 적용되어 자동화된 타입 검증 범위가 확대됨
참고 및 파트너
- 해당 타입 시스템은 CNRS와 Remote의 파트너십으로 개발되었음
-
Fresha, *Starfish* *, Dashbit 등이 후원함
대형 프로젝트에서의 빠른 컴파일 속도
코드 로딩 병목 개선
- 기존에는 모듈 정의 즉시 로딩하였으나, 이번 릴리즈에서는 지연 로딩(lazy loading) 전략으로 변경함
- 이로 인해 코드 서버 부담이 줄고 병렬 컴파일 성능이 향상되어, 대형 프로젝트 컴파일 속도가 2배 이상 증가함
- 두 가지 주요 주의사항
- 컴파일 중 별도의 프로세스를 생성하여 동일 프로젝트 내 모듈에 접근 시 로딩이 누락될 수 있으니, 이를 우회하는 방법으로 Kernel.ParallelCompiler.pmap/2 혹은 Code.ensure_compiled!/1 등을 사용함
-
@on_load 콜백 내에서 동일 프로젝트 내 모듈 호출 시 에러 발생 가능성 있음, 필요 시 @compile {:autoload, true} 옵션을 활용함
- 두 경우 모두 과거에는 비결정적 컴파일 에러가 발생할 수 있었으나, 이번 개선으로 결정적(재현성 있는) 컴파일 환경을 보장함
의존성 병렬 컴파일
- 환경 변수 MIX_OS_DEPS_COMPILE_PARTITION_COUNT를 활용하여, 의존성(dependency) 병렬 컴파일을 지원함
- 여러 OS 프로세스를 동시에 활용해 의존성을 병렬로 컴파일하므로, 프로젝트 규모 및 CPU 코어 수에 따라 컴파일 성능이 최대 4배까지 개선됨
- 실험적으로 전체 코어의 절반 정도 값을 설정하는 것이 리소스 활용에 효과적임
- 병렬화로 인해 메모리 사용량이 증가할 수 있으므로 CI나 빌드 서버 적용 시 주의 필요함
Erlang/OTP 28 지원
- Elixir 1.19는 Erlang/OTP 28.1+ 버전을 공식 지원함
- Erlang/OTP 28에서의 정규표현식 표현 변경에 따라, struct의 기본값으로 정규표현식 사용은 불가능해짐
- struct 초기화 시에는 여전히 정규표현식을 사용 가능함
OpenChain 인증 도입
- 이번 릴리즈는 OpenChain 규격 준수를 시작하는 첫 버전임
- 각 릴리즈에는 CycloneDX 1.6/SPDX 2.3 포맷의 SBoM(Source Bill of Materials) 이 포함됨
- 이는 릴리즈 구성요소 및 라이선스의 공급망 투명성을 높이고, 더 엄격한 관리에 기여함
- 해당 작업은 Jonatan Männchen이 진행하였으며, Erlang Ecosystem Foundation이 후원함
기타 개선 사항
- 옵션 파싱, ExUnit의 디버그 및 성능, shell 기반 문서 접근성 등 다양한 도구 및 라이브러리 개선 사항이 추가됨
- 보다 상세한 릴리즈 노트는 CHANGELOG를 참고함