- Experten wiesen darauf hin, dass „Code, der zur Compile-Zeit ausgeführt werden kann“, eine „dumme Idee“ sei,
doch Andrew Kelley, der Zig entwickelt hat, machte weiter und setzte sie um
- Einige Jahre später wurde dies zu einem der Killer-Features von Zig
- Was in Zig
comptime genannt wird, ist Code, der zur Compile-Zeit ausgeführt werden muss
- Da Zig-Entwickler Zig-Code während der Kompilierung ausführen können, lassen sich generischer Code schreiben und Metaprogrammierung betreiben, auch ohne Unterstützung für Generics/Templates
2 Kommentare
Schon im ersten Absatz gibt es ein Problem ... Im Bereich der Programmiersprachen wird Berechnung zur Compile-Zeit als sogenanntes Multi-Stage Programming bezeichnet und ist eine der Methoden zur Implementierung von Metaprogrammierung. Das ist keineswegs eine dumme Idee.
Bei Sprachen wie C++, die Multi-Stage Programming eher „irgendwie“ implementiert haben, entsteht das Problem, dass sich der Code in den einzelnen Stufen (in diesem Fall Compile-Zeit und Laufzeit) drastisch unterscheidet (C++ hat inzwischen zwar
constexpr, hat dort aber immer noch hier und da Defizite). Zig hingegen wurde von Anfang an mit Multi-Stage Programming im Hinterkopf entworfen, sodass man zur Compile-Zeit und zur Laufzeit fast denselben Code schreiben kann — mit dem Vorteil dieser Konsistenz, aber auch dem Nachteil, dass es zur Compile-Zeit nur wenig gibt, was sich vorhersagen lässt.Also … man kann es wohl so verstehen, dass man durch die unvermeidlichen
unittests Dinge zuerst zur Compile-Zeit laufen lässtund potenzielle Laufzeitfehler als Compile-Fehler nach vorn zieht … ungefähr so.
Soweit ich die Dokumentation und Q&A grob gesehen habe, ist es auch ziemlich attraktiv, dass es C als Drop-in ersetzen kann. Im Unterschied zu Rust ist die Syntax außerdem einfach, was ich ebenfalls gut finde. Natürlich ist es wohl nicht so sicher wie Rust … aber es fühlt sich an, als hätte man beim Einsatz von Rust etwas weniger dieses Gefühl von Overengineering. Go wird ebenfalls oft als Vergleich herangezogen, aber es wird sicher Situationen geben, in denen Zig ohne Runtime die weniger belastende Wahl ist. Vor allem wenn man noch näher an die Low-Level-Ebene geht oder nicht besonders viele Requests verarbeiten muss, könnte es gegenüber Go eher eine Option sein, zu der man greift …
Deshalb denke ich, dass es überraschend gut als Wahl funktionieren könnte, wenn es sich zwischen Rust und Go gut positioniert.