zig/README.md

106 lines
3.6 KiB
Markdown
Raw Normal View History

2015-08-05 15:23:15 -07:00
# zig lang
2015-08-05 17:44:05 -07:00
2015-11-01 21:21:33 -08:00
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.
2015-08-05 17:44:05 -07:00
## Design Principles
* Never compromise power or performance.
* Keep the language small and easy to understand. C programmers should pretty
much be able to understand Zig source code without learning anything about
Zig.
* Interoperability with C is crucial. Using C libraries should not require
"Zig bindings".
2015-11-01 21:21:33 -08:00
## 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.
2015-11-03 21:31:27 -08:00
* Do not depend on libc unless explicitly imported.
2015-11-01 21:21:33 -08:00
* 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).
* Tagged union enum type.
2015-11-01 21:21:33 -08:00
* 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.
2015-11-03 21:31:27 -08:00
* Shebang line OK so language can be used for "scripting" as well.
2015-11-06 21:11:47 -08:00
* Ability to mark functions as test and automatically run them in test mode.
* Memory zeroed by default, unless you initialize with "uninitialized".
2015-11-01 21:21:33 -08:00
## Roadmap
* Hello, world.
- Produce .o file.
* Produce executable file instead of .o file.
* Add debugging symbols.
* Debug/Release mode.
2015-11-02 02:39:36 -08:00
* C style comments.
* Unit tests.
* Simple .so library
2015-11-01 21:21:33 -08:00
* How should the Widget use case be solved? In Genesis I'm using C++ and inheritance.
2015-11-03 21:31:27 -08:00
### Primitive Numeric Types:
2015-11-03 21:31:27 -08:00
zig | C equivalent | Description
-------|--------------|-------------------------------
i8 | int8_t | signed 8-bit integer
u8 | uint8_t | unsigned 8-bit integer
i16 | int16_t | signed 16-bit integer
u16 | uint16_t | unsigned 16-bit integer
i32 | int32_t | signed 32-bit integer
u32 | uint32_t | unsigned 32-bit integer
i64 | int64_t | signed 64-bit integer
u64 | uint64_t | unsigned 64-bit integer
f32 | float | 32-bit IEE754 floating point
f64 | double | 64-bit IEE754 floating point
f128 | long double | 128-bit IEE754 floating point
isize | ssize_t | signed pointer sized integer
usize | size_t | unsigned pointer sized integer
### Grammar
```
2015-11-24 01:43:45 -08:00
Root : many(TopLevelDecl) token(EOF)
2015-11-24 01:43:45 -08:00
TopLevelDecl : FnDef | ExternBlock
2015-11-24 01:43:45 -08:00
ExternBlock : token(Extern) token(LBrace) many(FnProtoDecl) token(RBrace)
2015-11-24 01:43:45 -08:00
FnProto : token(Fn) token(Symbol) ParamDeclList option(token(Arrow) Type)
2015-11-24 01:43:45 -08:00
FnDecl : FnProto token(Semicolon)
2015-11-24 01:43:45 -08:00
FnDef : FnProto Block
2015-11-24 01:43:45 -08:00
ParamDeclList : token(LParen) list(ParamDecl, token(Comma)) token(RParen)
2015-11-24 01:43:45 -08:00
ParamDecl : token(Symbol) token(Colon) Type
2015-11-24 01:43:45 -08:00
Type : token(Symbol) | PointerType
2015-11-24 01:43:45 -08:00
PointerType : token(Star) token(Const) Type | token(Star) token(Mut) Type
2015-11-24 01:43:45 -08:00
Block : token(LBrace) many(Statement) token(RBrace)
2015-11-24 01:43:45 -08:00
Statement : ExpressionStatement | ReturnStatement
ExpressionStatement : Expression token(Semicolon)
ReturnStatement : token(Return) Expression token(Semicolon)
Expression : token(Number) | token(String) | FnCall
FnCall : token(Symbol) token(LParen) list(Expression, token(Comma)) token(RParen)
```