zig/README.md

159 lines
5.8 KiB
Markdown
Raw Normal View History

2017-02-09 09:51:23 -08:00
![ZIG](http://ziglang.org/zig-logo.svg)
2015-08-05 17:44:05 -07:00
2017-01-31 10:26:53 -08:00
A system programming language which prioritizes optimality, safety, and
readability.
2016-02-09 18:26:15 -08:00
2017-01-31 10:26:53 -08:00
Zig is a small language, yet powerful enough to solve any computing problem.
2015-12-06 20:55:28 -08:00
2017-01-31 10:26:53 -08:00
Zig intends to replace C. Therefore, porting a C project to Zig should be a
pleasant experience. For every use case C can solve, the same use case must
be handled in Zig in an equally or more satisfying way.
2015-12-06 20:55:28 -08:00
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-05 17:44:05 -07:00
2016-05-13 11:38:14 -07:00
[ziglang.org](http://ziglang.org)
2016-01-26 00:39:45 -08:00
## Existing Features
* Compatible with C libraries with no wrapper necessary. Directly include
C .h files and get access to the functions and symbols therein.
2016-01-26 00:39:45 -08:00
* 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.
2017-01-31 10:26:53 -08:00
* Compile-time code execution. Compile-time reflection.
* Partial compile-time function evaluation with eliminates the need for
a preprocessor or macros.
2016-01-26 00:39:45 -08:00
* Tagged union enum type. No more accidentally reading the wrong union field.
2016-05-13 10:59:43 -07:00
* Generics so that one can write efficient data structures that work for any
data type.
2016-01-26 00:39:45 -08:00
* 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.
2016-04-09 17:39:12 -07:00
* Debug mode optimizes for fast compilation time and crashing when undefined
behavior *would* happen.
2016-01-26 00:39:45 -08:00
* Release mode produces heavily optimized code. What other projects call
"Link Time Optimization" Zig does automatically.
2016-02-04 23:13:37 -08:00
* Mark functions as tests and automatically run them with `zig test`.
2017-01-31 10:26:53 -08:00
* Currently supported architectures: `x86_64`, `i386`
* Currently supported operating systems: linux, macosx
2016-02-15 14:51:10 -08:00
* Friendly toward package maintainers. Reproducible build, bootstrapping
process carefully documented. Issues filed by package maintainers are
considered especially important.
* Easy cross-compiling.
2016-01-26 00:39:45 -08:00
## Planned Features
2015-11-01 21:21:33 -08:00
2015-12-06 20:55:28 -08:00
* In addition to creating executables, creating a C library is a primary use
case. You can export an auto-generated .h file.
* Eliminate the need for configure, make, cmake, etc.
2016-02-04 23:13:37 -08:00
* Automatically provide test coverage.
2015-12-06 20:55:28 -08:00
* Ability to declare dependencies as Git URLS with commit locking (can
2016-04-09 17:39:12 -07:00
provide a tag or sha256).
2015-12-06 20:55:28 -08:00
* Include documentation generator.
2016-01-26 00:39:45 -08:00
* Compiler exposes itself as a library.
* Support for all popular architectures and operating systems.
2015-11-27 23:40:54 -08:00
2016-11-23 23:44:03 -08:00
## Community
* IRC: `#zig` on Freenode.
* Reddit: [/r/zig](https://www.reddit.com/r/zig)
* Email list: [ziglang@googlegroups.com](https://groups.google.com/forum/#!forum/ziglang)
2015-12-06 20:55:28 -08:00
## Building
### Dependencies
#### Build Dependencies
These compile tools must be available on your system and are used to build
the Zig compiler itself:
* gcc >= 5.0.0 or clang >= 3.6.0
2016-02-12 13:07:12 -08:00
* cmake >= 2.8.5
#### Library Dependencies
These libraries must be installed on your system, with the development files
available. The Zig compiler dynamically links against them.
* LLVM, Clang, and LLD libraries == 4.x
2015-12-10 14:34:38 -08:00
### Debug / Development Build
If you have gcc or clang installed, you can find out what `ZIG_LIBC_LIB_DIR`,
`ZIG_LIBC_STATIC_LIB_DIR`, and `ZIG_LIBC_INCLUDE_DIR` should be set to
(example below).
2016-05-14 18:54:37 -07:00
For MacOS, `ZIG_LIBC_LIB_DIR` and `ZIG_LIBC_STATIC_LIB_DIR` are unused.
2015-12-06 20:55:28 -08:00
```
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$(pwd) -DZIG_LIBC_LIB_DIR=$(dirname $(cc -print-file-name=crt1.o)) -DZIG_LIBC_INCLUDE_DIR=$(echo -n | cc -E -x c - -v 2>&1 | grep -B1 "End of search list." | head -n1 | cut -c 2- | sed "s/ .*//") -DZIG_LIBC_STATIC_LIB_DIR=$(dirname $(cc -print-file-name=crtbegin.o))
2015-12-06 20:55:28 -08:00
make
2015-12-10 14:34:38 -08:00
make install
2015-12-06 20:55:28 -08:00
./run_tests
```
2015-12-10 14:34:38 -08:00
### Release / Install Build
2016-02-02 14:04:14 -08:00
Once installed, `ZIG_LIBC_LIB_DIR` and `ZIG_LIBC_INCLUDE_DIR` can be overridden
by the `--libc-lib-dir` and `--libc-include-dir` parameters to the zig binary.
2015-12-15 12:06:42 -08:00
2015-12-10 14:34:38 -08:00
```
mkdir build
cd build
2016-02-07 23:50:51 -08:00
cmake .. -DCMAKE_BUILD_TYPE=Release -DZIG_LIBC_LIB_DIR=/some/path -DZIG_LIBC_INCLUDE_DIR=/some/path -DZIG_LIBC_STATIC_INCLUDE_DIR=/some/path
2015-12-10 14:34:38 -08:00
make
sudo make install
```
2016-04-23 09:57:38 -07:00
### Test Coverage
To see test coverage in Zig, configure with `-DZIG_TEST_COVERAGE=ON` as an
additional parameter to the Debug build.
You must have `lcov` installed and available.
Then `make coverage`.
With GCC you will get a nice HTML view of the coverage data. With clang,
the last step will fail, but you can execute
`llvm-cov gcov $(find CMakeFiles/ -name "*.gcda")` and then inspect the
produced .gcov files.
### Troubleshooting
If you get one of these:
2016-01-15 16:15:42 -08:00
```
undefined reference to `_ZNK4llvm17SubtargetFeatures9getStringB5cxx11Ev'
undefined reference to `llvm::SubtargetFeatures::getString() const'
```
2016-01-15 16:18:03 -08:00
This is because of
[C++'s Dual ABI](https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html).
Most likely LLVM was compiled with one compiler while Zig was compiled with a
different one, for example GCC vs clang.
2016-01-15 16:18:03 -08: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.
2017-04-13 02:27:39 -07:00
### Related Projects
* [zig-mode](https://github.com/AndreaOrru/zig-mode) - Emacs integration
* [zig.vim](https://github.com/andrewrk/zig.vim) - Vim configuration files