"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JS 개발자의 Zig 첫인상

JS 개발자의 Zig 첫인상

2024-08-29에 게시됨
검색:212

Zig First Impressions from a JS Dev

저는 게임 개발 프로젝트를 위해 zig를 배우고 있습니다. 자세한 내용은 여기에서 읽어보세요. 이것은 주로 JS/TS의 최근 경험에서 비롯된 언어에 대한 나의 초기(주로 긍정적인) 인상입니다.

오류 처리

오류는 가치입니다 - 현재로서는 예외가 최선이 아니라는 것이 꽤 대중적인 의견입니다. 그들은 숨겨진 제어 흐름을 생성하며 JavaScript에서는 선언조차 할 수 없습니다. 그러면 애플리케이션이 훨씬 더 불안정해집니다.

Zig는 쉽고 재미있는 오류 처리를 위해 오류 열거형과 멋진 구문 설탕을 사용합니다. 예를 들어 :

fn failingFunction() error{MyError}!void {
    return error.MyError;
}

pub fn main() !void {
    try failingFunction();
}

위 코드에서는 MyError 오류를 선언하고(별도로 수행할 수도 있음) 이를 반환합니다.
try는 다음과 같이 "오류가 반환되면 여기에 반환하세요"를 의미합니다.

FailingFunction() catch |err| 반품 오류;
failingFunction() catch |err| return err;
저는 이 접근 방식이 훌륭한 조합이며 Go land의 끝없는 if(err != nil)에서 우리를 구해 준다고 믿습니다.

기타 하이라이트:

    오류는 명시적이며 모든 유형을 선언하고 처리해야 합니다.
  • 블록 수준이 아닌 바로 그 자리에서 처리가 이루어집니다.
  • 페이로드 캡처 덕분에 오류가 올바르게 입력되고 자동 완성되므로 스위치 표현식과 같은 것을 쉽게 사용할 수 있습니다.

!void 구문 - ! 반환 유형과 오류 유형 간의 통합을 만드는 데 사용됩니다. Zig는 ! 앞에 오류를 추가하지 않는 것을 지원합니다. 이는 함수에서 실제로 반환하는 모든 오류의 통합을 생성하도록 되어 있습니다.

실제로는 이 구문이 도움이 되지 않습니다. 적어도 내 IDE 경험으로는 이 경우 어떤 지능도 얻지 못하며 이로 인해 기능이 덜 명확해집니다.

무엇을 돌려받을지 말해주세요! 나는 이것이 main() 함수에서만 유용하다고 생각합니다.

페이로드 캡처

TS에서 숫자 | 한정되지 않은? if 또는 일부 논리를 사용하여 유형을 필요한 것으로 좁힐 수 있으며 TS는 자동으로 새 유형을 올바르게 표시합니다.

쉽지만 이 접근 방식에는 문제가 있습니다.

    함수 전체에서 유형이 변경될 수 있는 경우 따르기가 더 어렵습니다.
  • 어떤 경우에는 여전히 캐스트를 수행해야 합니다.
Zig에서는 "페이로드 캡처"를 사용하여 이 작업을 수행합니다. 결과 유형으로 새로운 불변 ​​변수를 생성할 수도 있습니다. 예를 들어:


const might_num: ?usize = 10; // `?`는 `null`일 수 있음을 의미합니다. if (maybe_num) |num| { // 숫자 사용 }
failingFunction() catch |err| return err;
무슨 일이 일어나고 있는지 매우 분명합니다! 게다가 변수는 불변이지만

정말로 변경해야 하는 경우 대신 값에 대한 포인터를 캡처할 수 있습니다.

이 메커니즘은 for, switch, catch 등을 포함하여 언어 전반에 걸쳐 사용될 수 있다는 점도 언급할 가치가 있습니다.

Comptime 헛소리

물론 저는 아직 comptime의 모든 가능성을 파악하지 못했습니다. 그러나 간단히 말해서 컴파일 중에 일반 코드를 실행할 수 있습니다. 이 시간 동안에만 사용되는 전체 함수를 생성할 수 있으며 필요한 경우 컴파일 오류를 반환할 수 있습니다.

매우 유연한 언어이기 때문에 Zig에 아주 잘 맞습니다. 유형도 값입니다. 즉, 유형에 대한 정보를 생성, 변경 및 가져올 수 있습니다(특히 comptime에서).

Zig Guide의 기본 예:


const a = 5; // 숫자 유형이 지정되지 않은 경우 기본값은 comptime_int입니다. const b: if (a failingFunction() catch |err| return err; 편집자 경험

공식 Zig 플러그인(zls 사용)과 함께 VSCode를 사용하고 있습니다. 편집기에서 볼 수 있는 인텔리센스와 오류는 아쉬운 점이 많습니다.

"검출 가능한 불법 행위" 즉, 컴파일 오류를 일으키는 불법적인 행위는 일반적으로 편집기에 표시되지 않습니다. 예를 들어:

const nums = [3]u8{ 2, 1, 3 }; _ = 숫자[4]; // 인덱스가 범위를 벗어남 오류
failingFunction() catch |err| return err;
저는 0.14(개발자) 마스터 브랜치 버전을 사용하고 있습니다. 제대로 작동하려면 댓글로 알려주세요!

릴리스 선언문 이 기사는 https://dev.to/dandeduck/zig-first-impressions-from-a-js-dev-28k4?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3