Lobsters

Partial Order Precedence

Zig, 모호한 연산자 조합에 괄호를 요구합니다

Zig가 일부 연산자 조합의 우선순위를 정의하지 않고, 그런 조합에는 괄호를 요구하도록 바꿨습니다. 기존 규칙을 외우는 부담과 잘못 해석한 우선순위에서 생기는 버그를 줄이려는 변경입니다.

에디터 노트

부분 순서 방식은 모든 연산자 규칙을 없애는 대신 혼동하기 쉬운 조합만 괄호로 드러냅니다. 원문은 산술과 비교 연산자의 익숙한 규칙을 남겼고, 백만 줄이 넘는 Zig 코드에서 수정 대상이 353줄이었다고 설명합니다. 기존 코드를 기계적으로 전부 바꾸는 방식보다 변경 범위를 좁힌 근거가 구체적입니다. 댓글에는 우선순위를 잘못 이해해 SQL 쿼리나 회사 코드에서 문제가 생겼다는 경험이 나옵니다. 이런 사례는 문제의 가능성을 보여 주지만 발생 빈도를 증명하지는 않습니다. 괄호가 늘어날 때 읽기 부담이 커질 수 있다는 반론도 있습니다. Zig는 드문 조합에만 괄호를 요구하고 자동 변환 뒤 평가 순서를 검토하라고 안내해 그 부담을 제한하려 합니다. 파서 구현을 묻는 질문에는 다른 언어 작성자가 우선순위 DAG를 쓴다고 답했지만, Zig의 구현 방식은 이 자료에서 확인되지 않습니다.

AI 요약

Zig 메인 브랜치에 연산자 우선순위를 부분 순서로 다루는 변경이 들어갔습니다. 기존에는 모든 연산자 조합에 우선순위를 정했지만, 이제 일부 조합은 우선순위를 정하지 않습니다. 그런 식을 괄호 없이 쓰면 컴파일러가 오류를 내고 괄호로 의도를 분명히 하라고 안내합니다. x + y * z처럼 익숙한 산술 조합은 계속 괄호 없이 쓸 수 있습니다.

우선순위 규칙과 마이그레이션

산술 연산자와 비교 연산자의 일반적인 규칙은 유지합니다. 반면 %와 곱셈·나눗셈을 섞거나 %를 연달아 쓰는 조합처럼 우선순위가 모호한 경우에는 괄호가 필요합니다. Zig 코드베이스에서는 백만 줄이 넘는 코드 가운데 353줄을 고쳐야 했습니다. 기존 코드는 컴파일러 오류가 날 때마다 직접 수정하거나 zig fmt --upgrade로 자동 변환할 수 있습니다. 자동 변환은 이전 평가 순서를 보존하지만 괄호가 불필요하게 붙을 수 있어 작성자는 직접 수정하는 방법을 권합니다.

Lobsters 반응

  • @ruuda — Pony에서 처음 이 아이디어를 접했습니다. SQL 쿼리가 or와 and의 우선순위를 잘못 이해해 운영 환경에 큰 피해를 준 사례를 보고 나니 당연하게 느껴졌습니다. RCL에도 적용했는데 Zig도 채택해 반갑습니다.
    • @andrewrk — 원래 제안서에서도 Pony를 직접 언급합니다. 당시 제안자는 여러 언어 제안을 냈고 대부분은 이해하기 어려웠지만 이 제안은 좋았습니다. Pony처럼 +와 *까지 적용하는 건 자신도 엄두가 나지 않습니다.
    • @AshkanKiani — 개인 언어에서 이만큼 엄격하게 적용해 보려 합니다. 7년 동안 13번 고친 끝에 이번 설계가 가장 나아 보입니다. Zig에서 영감을 받은 comptime은 서브타이핑 기반 타입 시스템과 결합하기 까다로웠습니다.
    • @novedevo — 회사에서 &&와 || 우선순위를 잘못 이해해 오탐이 난 적이 있어 Pony처럼 엄격한 방식에 찬성합니다. 매일 괄호를 많이 써야 한다면 생각이 달라질 수도 있습니다.
    • @liberty — Lisp 사용자는 괄호를 구분하는 도구를 활용합니다. Zig나 Pony 편집기도 비슷한 기능을 제공할 수 있을지 궁금합니다.
    • @andyc — Guy Steele의 Fortress 언어 발표에서 부분 순서 아이디어를 접한 기억이 있습니다. Rhombus도 비슷한 방식을 쓰지만, Zig의 우선순위 관계는 추이적인 것 같고 수학 언어에서는 차이가 중요할 수 있습니다.
  • @seb — 몇 달 전 Hare에 같은 제안을 냈고 커뮤니티 반응도 대체로 좋았습니다. 프로그래밍 언어가 이런 변경을 진작 했어야 한다고 생각합니다.
  • @jkoppel — 좋은 아이디어입니다. 전통적인 우선순위는 파서에서 단계별 표현식을 두면 구현하기 쉽습니다. 부분 순서는 파서에서 어떻게 처리하는지 궁금합니다.
  • @AshkanKiani — 사용자 확장 문법을 지원하는 자신의 언어에서는 우선순위 DAG로 구현했습니다. 문법을 설치할 때 판정하므로 모호한 문법을 만들 수 없습니다.
  • @orib — 우선순위 단계 수를 줄이는 것과 비교해 어떤 이점이 있는지 물었습니다.
    • @squeek502 — 단계 수만 줄이면 프로그래머가 기억할 정보가 줄지 않고, 어떤 비트 연산자를 어디에 둘지 정해야 합니다. 이 방식은 C 계열 언어에서 익숙한 조합은 유지하면서 덜 흔한 조합에 괄호를 요구합니다.
    • @orib — Smalltalk처럼 모든 연산자를 같은 우선순위로 두고 왼쪽에서 오른쪽으로 계산할 수도 있다고 답했습니다.
    • @squeek502 — 규칙이 명확해도 작성자가 그 규칙을 잘못 기억하면 의도와 다르게 계산될 수 있습니다. 이 변경은 흔한 조합의 익숙함과 드문 조합의 명시성을 절충합니다.

원문: Zig Devlog / 반응: Lobsters / 번역·요약: Trawling