Hacker News오픈소스 · 도구

Gleam이 Erlang 소스코드 대신 추상 형태로 컴파일하도록 전환

원제 Gleam doesn't compile to Erlang source anymore

316 포인트댓글 136
Key Point

Erlang 추상 형태 컴파일로 빌드 성능이 크게 향상되고 스택 트레이스 정확도가 개선되었으며, JavaScript와 TypeScript 최적화, 에러 메시지 강화, 다른 빌드 도구 통합 개선 등이 Gleam 개발 경험 전반을 크게 나아지게 한다.

핵심 요약

  • Gleam v1.19.0 릴리스에서 Erlang 코드 생성기를 완전 재작성하여 Erlang 소스코드 대신 Erlang 추상 형태(abstract forms, 중간 표현)로 컴파일하도록 변경했다.
  • 추상 형태는 Erlang 컴파일러가 사용하는 메타데이터 주석이 달린 트리로, 이진 인코딩으로 직접 로드되어 Erlang 컴파일러의 전반부를 건너뛸 수 있다.
  • 이 변경으로 컴파일러 성능이 크게 향상되어 빌드 시간이 대폭 단축되었으며, v1.17.0 대비 v1.19.0에서 벤치마크 프로젝트 컴파일 시간이 상당히 개선됐다.
  • 런타임 위치 메타데이터가 생성된 Erlang 소스가 아닌 원본 Gleam 소스코드에 정확하게 대응되어, BEAM 충돌 보고서와 스택 트레이스의 라인 번호가 정확해졌다.
  • Elixir의 Mix 및 Erlang의 rebar3 같은 다른 빌드 도구와의 통합을 개선하기 위해 .app 리소스 파일 자동 생성, --no-dev 플래그, stdout 출력 등의 기능을 추가했다.
  • JavaScript로 컴파일할 때 패턴 매칭 최적화로 중첩 if문을 단일 조건으로 축약하고 중간 변수를 줄여 코드를 간결하게 만들었다.
  • Gleam 리스트를 JavaScript로 컴파일할 때 짧은 리스트 리터럴에 대해 배열 변환 과정을 건너뛰고 직접 구성하도록 최적화했다.
  • TypeScript 통합 시 Gleam의 커스텀 타입에 대한 검사 함수에 제네릭 오버로드를 추가하여 타입 정보 손실을 방지했다.
  • 언어 서버에서 필드 및 인자 레이블의 go-to-definition, find-references, 이름 변경을 지원하기 시작했다.
  • WebAssembly 컴파일러 빌드에 format_source 함수를 추가하여 브라우저에서 코드 포매팅이 가능해졌다.
  • git merge conflict marker, 잘못된 레코드 업데이트 문법, Gleam에 없는 절차형 연산자(+=, *=), 패턴 매칭 오류 등에 대해 구체적인 오류 메시지를 추가했다.
  • 컴파일러 결함 허용(fault tolerance)을 개선하고, 같은 패키지 내 비공개 타입·값 접근 시 추가 문맥을 제공하며, 타입 별칭 정의 오류가 종속 에러를 연쇄 유발하지 않도록 개선했다.
  • BEAM 바이트코드로 직접 컴파일하지 않는 이유는 바이트코드가 VM 버전마다 진화하고 변경되기 때문에 지속적인 유지보수가 필요하며, Erlang 컴파일러의 수십 년 축적 최적화를 재구현하는 것은 비용 대비 효율이 맞지 않기 때문이다.
  • Gleam은 커뮤니티 스폰서십으로 운영되며 기업 후원 언어에 비해 제한된 자원을 효율적으로 사용해야 하고, Elixir도 같은 방식을 채택하고 있다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗