Elixir v1.20: 이제 점진적 타입 언어

3 hours ago 2
  • 타입 추론과 점진적(gradually) 타입 검사가 모든 Elixir 프로그램에 적용되어, 타입 어노테이션 없이도 죽은 코드와 실행 시 반드시 실패할 검증된 버그를 찾아냄
  • dynamic() 타입은 “무엇이든 허용”하는 any()와 달리, 런타임에 가능한 타입 범위를 추적하고 허용 타입과 완전히 겹치지 않을 때만 위반을 보고함
  • dynamic(integer() or binary()) 값은 숫자 연산이나 문자열 함수처럼 일부 가능성이 겹치는 호출에서는 위반을 내지 않지만, Map.fetch!처럼 map만 받는 호출에는 위반을 냄
  • dynamic()은 사용 방식에 따라 좁혀지며, data.a + data.b 같은 코드에서 data를 %{..., a: number(), b: number()} 형태의 map으로 정제함
  • guard에서 합집합·교집합·부정을 추론해 is_list, is_integer, is_map_key, not is_map_key, tuple_size 같은 조건을 타입 정보로 활용함
  • case와 조건문은 앞선 절의 정보를 다음 절에 반영해, nil을 먼저 처리한 뒤 남은 값을 binary()로 좁히는 식의 타입 검사를 수행함
  • 표준 라이브러리의 tuple·map 관련 여러 함수에 타입이 추가되어, 기존 코드베이스에서 중복 절과 죽은 코드를 찾는 데 도움을 줌
  • “If T: Benchmark for Type Narrowing”에서 13개 범주 중 12개를 통과해, 일반 Elixir 코드에서 정밀한 타입 정보를 회복할 수 있음을 보임
  • v1.20은 다중 코어 환경의 애플리케이션에서 컴파일 시간을 다시 개선했으며, 합성 벤치마크에서 Elixir 빌드 도구가 BEAM 언어 중 가장 빠른 결과를 보임
  • 새 컴파일러 옵션 :module_definition은 module 정의 실행 방식을 기본값 :compiled 또는 :interpreted로 고를 수 있게 하며, mix.exs의 elixirc_options: [module_definition: :interpreted]로 활성화함
  • :module_definition 옵션은 디스크에 쓰이는 .beam 파일에는 영향을 주지 않고 defmodule 내부 실행 방식만 바꾸며, 대형 프로젝트의 컴파일 시간 개선에 도움이 될 수 있음
  • 집합론적 타입을 활용하는 새 타입 시그니처는 v1.20의 타입 시스템 성능, 재귀 타입, 매개변수화 타입, map key-value 순회 연구가 충족된 뒤 typed struct 정의와 함께 논의될 예정임
Read Entire Article