zig/README.md
2015-11-03 22:39:35 -07:00

2.0 KiB

zig lang

An experiment in writing a low-level programming language with the intent to replace C. Zig intends to be a small language, yet powerful enough to write readable, safe, optimal, and concise code to solve any computing problem.

Goals

  • Ability to run arbitrary code at compile time and generate code.
  • Completely compatible with C libraries with no wrapper necessary.
  • Creating a C library should be a primary use case. Should be easy to export an auto-generated .h file.
  • Generics such as containers.
  • Do not depend on libc unless explicitly imported.
  • First class error code support.
  • Include documentation generator.
  • Eliminate the need for make, cmake, etc.
  • Friendly toward package maintainers.
  • Eliminate the need for C headers (when using zig internally).
  • Ability to declare dependencies as Git URLS with commit locking (can provide a tag or sha1).
  • Rust-style enums.
  • Opinionated when it makes life easier.
    • Tab character in source code is a compile error.
    • Whitespace at the end of line is a compile error.
  • Resilient to parsing errors to make IDE integration work well.
  • Source code is UTF-8.
  • Shebang line OK so language can be used for "scripting" as well.

Roadmap

  • Hello, world.
    • Build AST
    • Code Gen
  • C style comments.
  • Unit tests.
  • Simple .so library
  • How should the Widget use case be solved? In Genesis I'm using C++ and inheritance.

Grammar

Root : FnDecl*
FnDecl : TokenFn TokenSymbol TokenLParen list(ParamDecl, TokenComma, 0) TokenRParen (TokenArrow Type)? Block
ParamDecl : TokenSymbol TokenColon Type
Type : TokenSymbol | PointerType
PointerType : TokenStar (TokenConst | TokenMut) Type
Block : TokenLBrace Statement* Expression? TokenRBrace
Statement : ExpressionStatement | ReturnStatement
ExpressionStatement : Expression TokenSemicolon
ReturnStatement : TokenReturn Expression TokenSemicolon
Expression : TokenNumber | TokenString | FnCall
FnCall : TokenSymbol TokenLParen list(Expression, TokenComma, 0) TokenRParen