Gleam v1.19.0, Erlang 소스 대신 abstract forms로 컴파일
- Gleam v1.19.0에서 Erlang 코드 생성기를 Giacomo Cavalieri가 전면 재작성해 Erlang 소스 코드 대신 Erlang abstract forms를 출력함. abstract forms는 Erlang 컴파일러가 쓰는 중간 표현이고 external term format으로 이진 인코딩돼, 생성한 코드를 바로 로드하며 컴파일러 앞단을 건너뜀
- 함수 100개를 담은 모듈 100개를 컴파일하는 langcompilebench 기준으로 v1.17 대비 v1.19에서 빌드 시간이 크게 줄었음. 캐시 없는 전체 빌드이며 Go, Erlang, Java, Elixir, Elm, Rust, C#, TypeScript 7과 비교한 그래프도 공개됨
- 런타임이 보는 위치 메타데이터가 Gleam 원본 소스 기준으로 정확해져 BEAM 크래시 리포트와 스택트레이스의 줄 번호가 정확해졌음. 이전에는 가장 가까운 함수까지만 가리켰고, edb 같은 디버거에서 Gleam을 완전히 지원할 여지도 생겼지만 저자는 아직 작업하지 않았다고 밝힘
- BEAM 바이트코드를 직접 타깃하지 않은 이유로 바이트코드가 고정된 형식이 아니라 VM 릴리스마다 바뀐다는 점을 들었음. Erlang 유지보수진과 계속 맞춰야 하고 새 VM 릴리스에 맞춘 Gleam 버전을 내야 하는 부담이 생김
- Erlang 코드 생성기는 Gleam 코드베이스에서 가장 오래되고 안정적이던 부분이었지만 지금의 컨벤션에는 맞지 않았고, 이번 교체로 컴파일러 전체의 기준이 올라갔음
Hacker News 의견들
축하한다. Gleam 코드 쓸 때마다 진짜 재밌음. 팀 고생했다.
Giacomo 트위치 방송 꼭 봐라. Gleam이랑 Rust 기능도 알려주고 질문에도 친절하게 답해줌. 자기 자랑 안 하고 남 판단 안 하는 스트리머라 보기 편함.
그 사람 발표 자료 프레임 전환을 손으로 하나하나 그려서 만든다더라. 그 정성이면 뭘 해도 되겠음.
erlang abstract form은 erlang 컴파일러가 쓰는 AST임. erlang term으로 이뤄져 있고 stdlib 루틴으로 다루기 편함. Elixir도 여기로 컴파일하고 parse transform이 조작하는 표현이기도 함. qlc나 merl 같은 문법 설탕도 이걸 갖고 노는 거고. BEAM 언어 대부분이 abstract format으로 감. core erlang이 더 흔할 것 같은데 LFE만 씀. 릴리스마다 바뀌는 데다 안정성 보장이 없어서.
콤마 오용이 눈에 걸림. 그래도 AI 블로그보단 낫다.
어느 콤마가 잘못됐다는 거임?
세미콜론보단 콤마 쓰고 but 붙이는 게 낫겠음.
abstract form도 결국 erlang 소스의 AST니까 erlang 소스임. erl_prettypr:format 한 번 부르면 텍스트로 돌아옴. transpiler에 모욕적인 뜻은 없고 세상이 다 transpiler임. 1.0 지난 컴파일러가 텍스트 erlang 소스를 내보냈다는 게 놀라움. 타깃 생태계와 완전히 다른 언어로 컴파일러를 짜는 게 좋은 선택인지 모르겠음.
이번 변경은 예상 못 했는데, WhatsApp edb 디버거랑 연동하는 사람 나오려나 궁금함.