Trước giờ mình cũng muốn viết 1 về Zig lâu rồi. Nhân dịp BunJs nổi lên thì mình cũng muốn chia sẻ đến các bạn ngôn ngữ lập trình Zig và Zig toolchain (zig cc
).
Theo như tiêu đề thì mình sẽ không đề cập đến phần ngôn ngữ lập trình của Zig mà chỉ đề cập đến Toolchain thôi.
Giới thiệu sơ lược về C/C++ compiler
Như các bạn đã biết, để compile C/C++ code thì ta cần C/C++ compiler như:
đa phần hiện giờ là đang sử dụng 3 loại compiler chính là gcc (Linux), clang (Linux, Macos, BSD) và msvc (Windows).
Giới thiệu về Zig
Zig là ngôn ngữ lập trình đa mục đích, nhanh, tối ưu và cũng là toolchain được viết bởi Andrew Kelley.
Lưu ý: Zig vẫn đang trong quá trình phát triển và chưa đến version 1.0.0
(hiện giờ là version 0.10.0-dev
) nên sẽ có những bugs và breaking changes (cho những bạn lập trình ngôn ngữ Zig).
Với những bạn như mình, thích xài những thứ tối tân nhất, version mới nhất và không cần cài đặt nhiều thì Zig cũng sẽ phù hợp với bạn.
Đồng thời việc chỉ dạy sẽ dễ dàng hơn khi chỉ cần download và extract là đã có được C/C++ compiler trong máy. Cho những bạn thích theo hướng tối giản, chỉ cần code editor (Vim, NeoVim, VsCode, Kakoune, Helix, etc.) và compiler.
Download
Các bạn có thể download tại đây hoặc sử dụng zigup (tương tự như rustup).
Thêm Zig vào $PATH
(hoặc %PATH%
) và chạy thử
$ zig --help
Usage: zig [command] [options]
Commands:
build Build project from build.zig
init-exe Initialize a `zig build` application in the cwd
init-lib Initialize a `zig build` library in the cwd
ast-check Look for simple compile errors in any set of files
build-exe Create executable from source or object files
build-lib Create library from source or object files
build-obj Create object from source or object files
fmt Reformat Zig source into canonical form
run Create executable and run immediately
test Create and run a test build
translate-c Convert C code to Zig code
ar Use Zig as a drop-in archiver
cc Use Zig as a drop-in C compiler
c++ Use Zig as a drop-in C++ compiler
dlltool Use Zig as a drop-in dlltool.exe
lib Use Zig as a drop-in lib.exe
ranlib Use Zig as a drop-in ranlib
env Print lib path, std path, cache directory, and version
help Print this help and exit
libc Display native libc paths file or validate one
targets List available compilation targets
version Print version number and exit
zen Print Zen of Zig and exit
General Options:
-h, --help Print command-specific usage
như các bạn có thể thấy thì có những sub-commands như cc
, c++
, ar
, lib
, ranlib
, dlltool
(và clang
nhưng không được hiển thị trong zig --help
).
Zig sử dụng clang để compile cũng như translate C/C++ code và được ship với nhiều header files (Glibc, Musl, Mingw, etc.) để tiện hơn cho việc cross-compile.
Các bạn cũng có thể làm cross-compile với clang, nhưng setup sysroots thôi cũng sẽ khiến các bạn đau cả đầu rồi. :)
Sử dụng
C
#include <stdio.h>
int main(int argc, char** argv) {
printf("Hello %s\n", "world");
}
$ zig cc main.c -o hello-world
$ ./hello-world
Hello world
C++
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Hello world\n";
}
$ zig c++ main.cpp -o hello-world
$ ./hello-world
Hello world
Ban đầu chạy các bạn sẽ thấy lâu 1 chút vì Zig compile Libc from source, nhưng sau khi xong lần đầu thì mọi thứ sẽ được cached lại nên những lần sau sẽ nhanh hơn.
Lưu ý
Zig bật UBSAN by default, nên nếu có lỗi khi sử dụng zig cc
mà không bị trên những compiler khác, hãy thử pass flag -fno-sanitize=undefined
.
Why do i get illegal instruction
when using zig cc
to build C code
Đồng thời, vì Zig vẫn đang tròn quá trình phát triển nên sẽ có những clang flags không được hỗ trợ và những vấn đề khác về -mcpu
, -march
, -mtune
.
Cross-compile
Cross-compile khi bạn muốn compile chương trình của mình lại cho 1 hệ điều hành khác hoặc máy khác như từ Linux -> Windows hoặc từ Linux -> Macos hoặc từ Windows -> Macos hoặc từ Glibc Linux -> Musl Linux.
Hoặc chỉ đơn giản bạn muốn chương trình statically compiled thay vì linking với Libc trên Linux (việc statically compiled trên Glibc gần như là không thể, nhưng Musl thì được).
Bạn chỉ cần pass flag với triple như -target arch-os-abi
như
-
-target x86_64-windows-gnu
(sử dụng Mingw) -
-target x86_64-windows-msvc
(cần MSVC cài đặt trên máy) -target x86_64-linux-gnu
-
-target x86_64-linux-gnu.2.19
(Glibc v2.19) -
-target x86_64-linux-gnu.2.28
(Glibc v2.28) -target x86_64-linux-musl
-target x86_64-macos
-target aarch64-linux-musl
-target native-native-gnu
- etc.
để xem thêm, các bạn hãy sử dụng zig targets
.
Những projects dùng Zig (zig cc
)
Đặc biệt phải nhắc đến là Uber cũng sử dụng zig cc
và trong video cũng có nhắc đến Cloudflare cũng có sử dụng qua bazel-zig-cc.