Hello World

Hello World

어떤 언어든 배우기 시작하면 제일 먼저 '화면에 글자를 찍는' 프로그램부터 써보게 돼요. Zig도 마찬가지로, 바로 그 첫걸음인 Hello World부터 천천히 볼게요. 아래 코드를 보면 Zig 프로그램의 기본 골격이 대략 잡히는 걸 느낄 수 있을 거예요.

먼저 가장 단순한 형태의 예제를 볼게요. 출력 대상을 stdin이나 stdout 같은 스트림을 거쳐서 처리하는 방식이에요.

const std = @import("std");

pub fn main(init: std.process.Init) !void {
    try std.Io.File.stdout().writeStreamingAll(init.io, "Hello, World!\n");
}
$ zig build-exe hello.zig
$ ./hello
Hello, World!

주의해서 볼 점이 하나 있어요. std.Io.File.stdout().writeStreamingAll은 파일에 문자열을 그대로 쓰는 함수인데, 이름에서 알 수 있듯 '배우는 동안 접해볼 수 있는 좀 더 간단한 API'가 아니에요. 출력을 stderr로 보내는 게 stdout보다 더 적절한 경우가 많고, 메시지가 스트림에 성공적으로 써졌는지 여부는 대개 중요하지 않아요. 그리고 형식화된 출력(formatted printing)이 필요할 때가 자주 오죠. 이런 흔한 경우를 위해 Zig는 더 간단한 API를 제공해요.

const std = @import("std");

pub fn main() void {
    std.debug.print("Hello, {s}!\n", .{"World"});
}
$ zig build-exe hello_again.zig
$ ./hello_again
Hello, World!

이 두 번째 예제가 앞의 예제와 달라진 점을 짚어볼게요. 이 경우 함수에서 반환되는 에러가 없기 때문에, main의 반환 타입에서 !를 생략할 수 있어요. 그리고 std.debug.print는 인자로 문자열 서식과 값을 받아서, {s} 자리에 문자열("World")이 채워져 출력되는 걸 확인할 수 있어요.

본문

Hello World 섹션의 핵심을 정리해볼게요.

  • Zig 프로그램은 main이라는 함수가 진입점이에요. 실행 파일로 컴파일(zig build-exe)해서 실행하면 그 함수가 호출돼요.
  • std는 Zig 표준 라이브러리에 접근하기 위한 모듈이에요. @import("std")로 가져오죠.
  • std.debug.print는 서식 출력을 위한 함수예요. {s} 같은 서식 지정자를 이용해서 여러 타입의 값을 문자열에 끼워 넣을 수 있어요.
  • !void는 '에러를 반환할 수 있는 void'라는 의미예요. 에러가 나지 않는 함수라면 !를 생략할 수 있어요.

더 알아보기

이 섹션과 이어지는 주제들을 계속 공부해보고 싶다면 아래 링크를 따라가 보세요.

  • Values — 값과 변수에 대한 기본 이야기
  • Tuples — 익명 구조체, 튜플
  • @import — 모듈과 라이브러리를 가져오는 방법
  • Errors — 에러 처리 이해하기
  • Entry Point — main 함수가 진입점이 되는 과정
  • Source Encoding — 소스 인코딩 규칙
  • try — 에러를 전파하는 try 표현

출처: Zig Documentation