원문 캡처 · ochagavia.nl
원문 캡처 · ochagavia.nl

Zig 컴파일러에 호출할 때마다 숫자 4를 반환하는 내장 기능 @xkcdRandom을 추가했다. xkcd 만화의 농담을 실제 기능으로 만든 실험으로, 수정한 컴파일러와 예제 프로그램을 빌드해 실행했다고 설명한다.

xkcd 만화 Random Number에는 무작위 정수를 반환한다고 하지만 언제나 4를 돌려주는 C 함수가 나온다. 며칠 전 보안 사고에서 적절히 생성한 무작위 바이트 대신 숫자 4 등을 실수로 사용한 사례를 접하고 이 만화를 떠올렸다고 한다. 글쓴이는 개발자들이 이런 난수 생성기를 원한다는 생각에 Zig에 내장 기능으로 구현했다며, 실제 난수 대신 4를 반환한다고 농담한다.

일반 함수로 구현하면 간단하지만, 컴파일러를 수정해 내장 기능으로 만드는 편이 더 복잡하고 배우는 데 도움이 될 것이라고 판단했다. Ziglings 연습과 간단한 지뢰찾기 게임을 만든 뒤, Zig 컴파일러 코드를 살펴보는 프로젝트로 삼았다는 설명이다.

내장 기능 구현은 컴파일러의 다른 코드와 얽혀 있어 글에 전부 싣지 않았다. 변경 사항은 diff에서 확인할 수 있으며, 글쓴이의 Zig 포크에서 0.17.x-xkcd 브랜치를 사용할 수도 있다. 변경한 컴파일러로는 다음과 같은 프로그램을 빌드할 수 있다.

const std = @import("std"); pub fn main(_: std.process.Init) !void { const someRandomNumber: usize = @xkcdRandom(); const anotherRandomNumber: f32 = @xkcdRandom(); std.debug.print( "The random numbers you ordered just arrived: {}, {}\\n", .{ someRandomNumber, anotherRandomNumber } ); }

글쓴이는 zig build --zig-lib=lib -Dno-lib -Ddev=x86_64-linux 명령으로 Zig를 빌드했다. 첫 빌드는 노트북에서 약 1분 걸렸고, 이후 빌드는 더 빨랐다고 한다. LLM이 내장 기능이 정의된 파일을 찾도록 도왔고, 이후 코드를 수정하고 컴파일 오류를 고쳤다. 수정한 Zig로 예제 프로그램을 빌드해 실행한 결과는 다음과 같았다.

$ ./zig-out/bin/zig build-exe example.zig $ ./example The random numbers you ordered just arrived: 4, 4

이 기능은 실제 난수를 생성하지 않는다. ‘4’를 반환하는 xkcd 만화의 농담을 Zig 컴파일러 수정 프로젝트로 구현한 것이다.