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

JS 개발자의 Zig 첫인상

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

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]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>
  • Turborepo vs Nx: 어떤 Monorepo 도구가 귀하에게 적합합니까?
    Turborepo vs Nx: 어떤 Monorepo 도구가 귀하에게 적합합니까?
    현대 개발이 복잡해짐에 따라 단일 저장소가 점점 인기를 얻고 있습니다. 이를 통해 여러 프로젝트 또는 패키지를 단일 저장소에 저장할 수 있으므로 종속성 관리가 단순화되고 더 나은 협업이 촉진됩니다. 모노레포 관리를 위한 최고의 도구 두 가지는 Turborepo와 Nx입...
    프로그램 작성 2024-11-07에 게시됨
  • Java 배열 소개
    Java 배열 소개
    프로그래밍에는 효율적이고 효과적인 데이터 구조가 중요한 대규모 데이터 세트를 관리하고 조작하는 작업이 포함되는 경우가 많습니다. 배열은 컴퓨터 과학의 기본 데이터 구조이며 동일한 유형의 고정 크기 시퀀스 요소를 저장하는 수단을 제공합니다. 이 블로그에서는 Java 배열...
    프로그램 작성 2024-11-07에 게시됨
  • CORS 문제를 해결하는 방법
    CORS 문제를 해결하는 방법
    CORS 문제를 해결하려면 웹 서버(Apache 또는 Nginx 등), 백엔드(Django, Go 또는 Node.js 등)에 적절한 헤더를 추가해야 합니다. , 또는 프론트엔드 프레임워크(예: React 또는 Next.js)에서. 다음은 각 플랫폼에 대한 단계입니다. ...
    프로그램 작성 2024-11-07에 게시됨
  • 메모리 정렬은 C 구조의 크기에 어떤 영향을 줍니까?
    메모리 정렬은 C 구조의 크기에 어떤 영향을 줍니까?
    C 구조의 메모리 정렬C 구조로 작업할 때는 메모리 정렬을 이해하는 것이 중요합니다. 메모리 정렬은 특정 경계에서 메모리의 데이터 배치를 나타냅니다. 32비트 시스템에서 메모리는 일반적으로 4바이트 경계로 정렬됩니다.구조에 대한 메모리 정렬다음 구조체를 고려하세요.ty...
    프로그램 작성 2024-11-07에 게시됨
  • 최고의 관광 명소에서 영감을 받은 혁신적인 프로젝트 구축: 기억에 남는 여행 경험을 위한 개발자 가이드
    최고의 관광 명소에서 영감을 받은 혁신적인 프로젝트 구축: 기억에 남는 여행 경험을 위한 개발자 가이드
    개발자로서 우리는 종종 주변 세계에서 영감을 얻습니다. 놀라운 관광 명소보다 더 좋은 소스가 있을까요? 여행 앱, 몰입형 경험, 위치 기반 서비스 등 무엇을 작업하든 목적지를 돋보이게 만드는 것이 무엇인지 이해하는 것이 중요합니다. 알바니아 최고의 관광 명소에 대한 이...
    프로그램 작성 2024-11-07에 게시됨
  • std::locale을 사용하여 C++에서 쉼표로 숫자 형식을 지정하는 방법은 무엇입니까?
    std::locale을 사용하여 C++에서 쉼표로 숫자 형식을 지정하는 방법은 무엇입니까?
    C에서 쉼표를 사용하여 숫자 서식 지정 C에서 std::locale 클래스는 쉼표로 숫자 서식을 지정하는 로케일 종속 방법을 제공합니다. .std::locale with std::stringstream 숫자를 쉼표가 있는 문자열 형식으로 지정하려면 std::string...
    프로그램 작성 2024-11-07에 게시됨
  • Python의 소수 시퀀스에서 홀수 인쇄를 피하는 방법은 무엇입니까?
    Python의 소수 시퀀스에서 홀수 인쇄를 피하는 방법은 무엇입니까?
    Python에서 일련의 소수를 인쇄하는 방법많은 프로그래머가 Python에서 소수를 정확하게 인쇄하는 함수를 만드는 데 어려움을 겪습니다. 일반적인 문제 중 하나는 대신 홀수 목록을 인쇄하는 것입니다. 이 문제를 해결하려면 소수 속성에 대한 철저한 이해와 코드 변경이 ...
    프로그램 작성 2024-11-07에 게시됨
  • 파이게임에서 마우스 방향으로 총알을 쏘는 방법은 무엇입니까?
    파이게임에서 마우스 방향으로 총알을 쏘는 방법은 무엇입니까?
    파이게임에서 마우스 방향으로 총알을 쏘는 방법파이게임에서는 마우스 방향으로 발사되는 총알을 생성할 수 있습니다. 이렇게 하려면 글머리 기호를 나타내는 클래스를 만들고 마우스 위치에 따라 초기 위치와 방향을 설정해야 합니다.글머리 기호에 대한 클래스 먼저 글머리 기호에 ...
    프로그램 작성 2024-11-07에 게시됨
  • 성능 최적화를 위한 GG 코딩 팁: 코드 속도 향상
    성능 최적화를 위한 GG 코딩 팁: 코드 속도 향상
    소프트웨어 개발 세계에서 코드 성능 최적화는 사용자가 선호하는 빠르고 반응성이 뛰어난 애플리케이션을 제공하는 데 매우 중요합니다. 프런트엔드에서 작업하든 백엔드에서 작업하든 효율적인 코드를 작성하는 방법을 배우는 것은 필수적입니다. 이 기사에서는 시간 복잡성 감소, 캐...
    프로그램 작성 2024-11-07에 게시됨
  • PHP의 strtotime() 함수를 사용하여 특정 요일의 날짜를 찾는 방법은 무엇입니까?
    PHP의 strtotime() 함수를 사용하여 특정 요일의 날짜를 찾는 방법은 무엇입니까?
    지정된 요일의 날짜 결정(월요일, 화요일 등)날짜 스탬프를 확인해야 하는 경우 월요일, 화요일 또는 다른 평일과 같은 특정 요일에 strtotime() 함수를 활용할 수 있습니다. 이 함수는 이번 주에 지정된 날짜가 아직 발생하지 않은 경우 특히 유용합니다.예를 들어 ...
    프로그램 작성 2024-11-07에 게시됨
  • Socket.io 및 Redis를 사용하여 채팅 애플리케이션을 구축하고 배포합니다.
    Socket.io 및 Redis를 사용하여 채팅 애플리케이션을 구축하고 배포합니다.
    이 튜토리얼에서는 웹 소켓을 사용하여 채팅 애플리케이션을 구축합니다. 웹 소켓은 실시간 데이터 전송이 필요한 애플리케이션을 구축하려는 경우 정말 유용합니다. 이 튜토리얼이 끝나면 자체 소켓 서버를 설정하고, 실시간으로 메시지를 보내고 받고, Redis에 데이터를 저장하...
    프로그램 작성 2024-11-07에 게시됨
  • SQL 조인 내부
    SQL 조인 내부
    SQL 조인은 데이터베이스 쿼리의 기본이므로 사용자는 지정된 조건에 따라 여러 테이블의 데이터를 결합할 수 있습니다. 조인은 논리적 조인과 물리적 조인이라는 두 가지 주요 유형으로 분류됩니다. 논리적 조인은 테이블의 데이터가 결합되는 개념적 방식을 나타내는 반면, 물리...
    프로그램 작성 2024-11-07에 게시됨
  • 당신이 알아야 할 자바스크립트의 특징
    당신이 알아야 할 자바스크립트의 특징
    이 문서에서는 정의되지 않았거나 null일 수 있는 데이터에 액세스하려고 할 때 오류를 방지하는 방법을 살펴보고, 가능한 방법을 살펴보겠습니다. 필요한 경우 데이터를 효과적으로 관리하는 데 사용합니다. 선택적 체인을 통한 안전한 액세스 JavaScript...
    프로그램 작성 2024-11-07에 게시됨
  • JavaScript의 약속: 비동기 코드 이해, 처리 및 마스터
    JavaScript의 약속: 비동기 코드 이해, 처리 및 마스터
    소개 저는 Java 개발자로 일했는데 처음으로 JavaScript의 Promise를 접했던 기억이 납니다. 개념은 단순해 보이지만 Promise가 어떻게 작동하는지 완전히 이해할 수는 없었습니다. 프로젝트에서 이를 사용하기 시작하고 그들이 해결한 사례를...
    프로그램 작성 2024-11-07에 게시됨
  • 암호키를 Java Spring Boot에 통합하는 방법
    암호키를 Java Spring Boot에 통합하는 방법
    Java Spring Boot의 암호 키 소개 패스키는 기존 비밀번호에 의존하지 않고 사용자를 인증하는 현대적이고 안전한 방법을 제공합니다. 이 가이드에서는 Thymeleaf를 템플릿 엔진으로 사용하여 Java Spring Boot 애플리케이션에 패스키...
    프로그램 작성 2024-11-07에 게시됨

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

Copyright© 2022 湘ICP备2022001581号-3