2015-08-05 22:23:15 +00:00
|
|
|
# zig lang
|
2015-08-06 00:44:05 +00:00
|
|
|
|
2015-11-02 05:21:33 +00: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
|
2015-12-07 04:55:28 +00:00
|
|
|
optimal, readable, safe, and concise code to solve any computing problem.
|
|
|
|
|
|
|
|
Porting a C project to Zig should be a pleasant experience - every C feature
|
|
|
|
needs a corresponding Zig feature which solves the problem equivalently or
|
|
|
|
better.
|
|
|
|
|
|
|
|
Zig is not afraid to roll the major version number of the language if it
|
|
|
|
improves simplicity, fixes poor design decisions, or adds a new feature which
|
|
|
|
compromises backward compatibility.
|
2015-08-06 00:44:05 +00:00
|
|
|
|
2016-01-26 08:39:45 +00:00
|
|
|
## Existing Features
|
|
|
|
|
|
|
|
* Compile units do not depend on libc unless explicitly linked.
|
|
|
|
* Provides standard library which competes with the C standard library and is
|
|
|
|
always compiled against statically in source form.
|
|
|
|
* Pointer types do not allow the null value. Instead you can use a maybe type
|
|
|
|
which has several syntactic constructs to ensure that the null pointer is
|
|
|
|
not missed.
|
|
|
|
* Provides an error type with several syntatic constructs which makes writing
|
|
|
|
robust code convenient and straightforward. Writing correct code is easier
|
|
|
|
than writing buggy code.
|
|
|
|
* No header files required. Top level declarations are entirely
|
|
|
|
order-independent.
|
|
|
|
* Powerful constant expression evaluator. Generally, anything that *can* be
|
|
|
|
figured out at compile time *is* figured out at compile time.
|
|
|
|
* Tagged union enum type. No more accidentally reading the wrong union field.
|
|
|
|
* Easy to parse language so that humans and machines have no trouble with the
|
|
|
|
syntax.
|
|
|
|
* The binaries produced by Zig have complete debugging information so you can,
|
|
|
|
for example, use GDB to debug your software.
|
|
|
|
* Release mode produces heavily optimized code. What other projects call
|
|
|
|
"Link Time Optimization" Zig does automatically.
|
|
|
|
* Supported architectures: `x86_64`
|
|
|
|
* Supported operating systems: Linux
|
|
|
|
|
|
|
|
## Planned Features
|
2015-11-02 05:21:33 +00:00
|
|
|
|
|
|
|
* Completely compatible with C libraries with no wrapper necessary.
|
2015-12-07 04:55:28 +00:00
|
|
|
* In addition to creating executables, creating a C library is a primary use
|
|
|
|
case. You can export an auto-generated .h file.
|
|
|
|
* Generics so that one can write efficient data structures that work for any
|
|
|
|
data type.
|
|
|
|
* Eliminate the need for configure, make, cmake, etc.
|
2016-01-25 22:22:52 +00:00
|
|
|
* Eliminate the preprocessor, but (most) everything you can accomplish with
|
|
|
|
the preprocessor, you can accomplish directly in the language.
|
2015-11-07 05:11:47 +00:00
|
|
|
* Ability to mark functions as test and automatically run them in test mode.
|
2016-01-25 22:22:52 +00:00
|
|
|
Automatically provide test coverage.
|
2015-12-07 04:55:28 +00:00
|
|
|
* Friendly toward package maintainers.
|
|
|
|
* Ability to declare dependencies as Git URLS with commit locking (can
|
|
|
|
provide a tag or sha1).
|
|
|
|
* Include documentation generator.
|
|
|
|
* Shebang line OK so language can be used for "scripting" as well.
|
2016-01-25 22:22:52 +00:00
|
|
|
* Debug mode optimizes for fast compilation time and crashing when undefined
|
|
|
|
behavior *would* happen.
|
2016-01-26 08:39:45 +00:00
|
|
|
* Compiler exposes itself as a library.
|
|
|
|
* Support for all popular architectures and operating systems.
|
|
|
|
* Easy cross-compiling.
|
2015-11-28 07:40:54 +00:00
|
|
|
|
2015-12-07 04:55:28 +00:00
|
|
|
## Building
|
|
|
|
|
2016-01-26 04:56:29 +00:00
|
|
|
### Dependencies
|
|
|
|
|
|
|
|
* LLVM 3.7
|
|
|
|
* libclang 3.7
|
|
|
|
|
2015-12-10 22:34:38 +00:00
|
|
|
### Debug / Development Build
|
|
|
|
|
2015-12-15 20:02:02 +00:00
|
|
|
If you have gcc or clang installed, you can find out what `ZIG_LIBC_DIR` should
|
2015-12-15 20:06:42 +00:00
|
|
|
be set to (example below).
|
2015-12-15 20:02:02 +00:00
|
|
|
|
2015-12-07 04:55:28 +00:00
|
|
|
```
|
|
|
|
mkdir build
|
|
|
|
cd build
|
2015-12-15 20:06:42 +00:00
|
|
|
cmake .. -DCMAKE_INSTALL_PREFIX=$(pwd) -DZIG_LIBC_DIR=$(dirname $(cc -print-file-name=crt1.o))
|
2015-12-07 04:55:28 +00:00
|
|
|
make
|
2015-12-10 22:34:38 +00:00
|
|
|
make install
|
2015-12-07 04:55:28 +00:00
|
|
|
./run_tests
|
|
|
|
```
|
2015-12-10 22:34:38 +00:00
|
|
|
|
|
|
|
### Release / Install Build
|
|
|
|
|
2015-12-15 20:06:42 +00:00
|
|
|
Once installed, `ZIG_LIBC_DIR` can be overridden by the `--libc-path` parameter
|
|
|
|
to the zig binary.
|
|
|
|
|
2015-12-10 22:34:38 +00:00
|
|
|
```
|
|
|
|
mkdir build
|
|
|
|
cd build
|
2015-12-15 19:44:42 +00:00
|
|
|
cmake .. -DCMAKE_BUILD_TYPE=Release -DZIG_LIBC_DIR=path/to/libc/dir
|
2015-12-10 22:34:38 +00:00
|
|
|
make
|
|
|
|
sudo make install
|
|
|
|
```
|
2016-01-16 00:12:26 +00:00
|
|
|
|
|
|
|
### Troubleshooting
|
|
|
|
|
|
|
|
If you get one of these:
|
|
|
|
|
2016-01-16 00:15:42 +00:00
|
|
|
```
|
|
|
|
undefined reference to `_ZNK4llvm17SubtargetFeatures9getStringB5cxx11Ev'
|
|
|
|
undefined reference to `llvm::SubtargetFeatures::getString() const'
|
|
|
|
```
|
2016-01-16 00:12:26 +00:00
|
|
|
|
2016-01-16 00:18:03 +00:00
|
|
|
This is because of
|
|
|
|
[C++'s Dual ABI](https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html).
|
2016-01-16 00:12:26 +00:00
|
|
|
Most likely LLVM was compiled with one compiler while Zig was compiled with a
|
|
|
|
different one, for example GCC vs clang.
|
|
|
|
|
2016-01-16 00:18:03 +00:00
|
|
|
To fix this, you have 2 options:
|
|
|
|
|
|
|
|
* Compile Zig with the same compiler that LLVM was compiled with.
|
|
|
|
* Add `-DZIG_LLVM_OLD_CXX_ABI=yes` to the cmake configure line.
|