-- Leo's gemini proxy
-- Connecting to gmi.noulin.net:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
date: 2023-12-22 10:54:26
categories: programming
firstPublishDate: 2023-12-22 10:54:26
I tested the D language and zig language recently to check the state of the tooling.
gdc (the gcc D compiler) is in apt, I install it with:
apt-get install gdc
I wrote a D program (example source code from dlang.org):
vi e.d void main() { import std.exception, std.stdio, std.process; auto result = ["whoami"].execute; enforce(result.status == 0); result.output.write; }
Then compile the source code with gdc, `-g` is for the debug symbols:
gdc -g e.d -o e
Debug the `e` D program with gdb:
gdb -tui e b main r
After the `r`(run) command, gdb stopped in a D class calling `main`. `s`(step) ran the main function and I couldn't step in the code above (e.d). Support for debugging in gdb is not 100%.
Code coverage is enabled like this:
gdc -fprofile-arcs -ftest-coverage -g e.d -o e ./e gcov -b e.d
It works fine.
D is a large language with many features
The garbage collector is enabled by default and optionally disabled
Borrow checker is optional
There is a system for running tests
Most of the SEI CERT C rules are fixed but it is optional
The learning curve is not steep, one can be productive in a short time.
Zig is a C-like language with less footguns than C.
I install zig by downloading a tar file from zig website:
Extract with:
tar -xf zig-linux-x86_64-0.12.0-dev.1835+697b8f7d2.tar.xz
Add zig directory to $PATH:
export PATH=$PATH:~/zig-linux-x86_64-0.12.0-dev.1835+697b8f7d2
Create a compile zig program (from examples on zig homepage):
vi z.zig const std = @import("std"); pub fn main() !void { const stdout = std.io.getStdOut().writer(); var i: usize = 1; while (i <= 16) : (i += 1) { if (i % 15 == 0) { try stdout.writeAll("ZiggZagg\n"); } else if (i % 3 == 0) { try stdout.writeAll("Zigg\n"); } else if (i % 5 == 0) { try stdout.writeAll("Zagg\n"); } else { try stdout.print("{d}\n", .{i}); } } } zig build-exe z.zig
gdb can't read the debug symbols from zig programs, so zig programs can't be debugged in gdb.
lldb supports zig, so I install it with apt:
apt-get install lldb After this operation, 708 MB of additional disk space will be used.
708MB for a debugger, it is a lot.
Debug zig programs with lldb:
# lldb z Traceback (most recent call last): File "<string>", line 1, in <module> ModuleNotFoundError: No module named 'lldb.embedded_interpreter' (lldb) target create "z" Current executable set to '/home/me/zig/z' (x86_64). (lldb) b main Breakpoint 1: where = z`z.main + 12 at z.zig:4:36, address = 0x000000000021d35c (lldb) r Process 23773 launched: '/home/me/zig/z' (x86_64) Process 23773 stopped * thread #1, name = 'z', stop reason = breakpoint 1.1 frame #0: 0x000000000021d35c z`z.main at z.zig:4:36 1 const std = @import("std"); 2 3 pub fn main() !void { -> 4 const stdout = std.io.getStdOut().writer(); 5 var i: usize = 1; 6 while (i <= 16) : (i += 1) { 7 if (i % 15 == 0) { (lldb)
I have been looking for a code coverage tool and I only found hacks. There is no simple way to know if the tests cover enough code or not.
Zig code is readable
Small language, fast to learn
Manual memory management
There is a system for running tests
Not all SEI CERT C rules are fixed, for example use after free type of errors are possible.
Hashtag: #programming #dlang #zig
-- Response ended
-- Page fetched on Wed May 22 03:14:38 2024