
Die Welt braucht mehr CONST
« | 16 Dec 2023 | »Wenn ich von RUST
und vor allem von ZIG
eines gelernt habe, dann die Notwendigkeit const
häufiger einzusetzen.
Denn moderne Sprachen meckern sofort, wenn wir Variablen deklarieren, die dann nur wie Konstanten benutzt werden.
Variablen, die nicht variieren
Wenn wir vom Compiler eine Variable verlangen, dann sollten wir das nur tun,
weil wir in dessen “Lagerraum” unterschiedliche Dinge aufbewahren wollen.
Wir erhalten den notwendigen Platz und auch “Logistik”, die den Platz
verwaltet und an unsere Bedürfnisse anpasst.
Konstanten hingegen sind wie Verkehrsschilder. Sie werden einmal produziert und aufgestellt und brauchen danach keine “Wartung” mehr.
Ein effizientes Programm weiß also genau, wo es veränderbare Informationen braucht, und wo fixe Daten ausreichen.
In der Praxis sieht das aber anders aus, und so liegt fast alles in Variablen, die dann auch noch “versehentlich” verändert werden und der Grund für Fehlverhalten sind.
ZIG sagt: Konstante Variablen sind ein Fehler
Der ZIG Code
führt zum Fehler:
error: variable of type ‘comptime_int’ must be const or comptime
Unser v
ist keine Variable und ändert sich nie. Es ist eigentlich eine
Konstante und ZIG lässt uns den Code nur durchgehen, wenn wir daraus ein
const v = 42;
machen.
Jetzt kann der Compiler den Zielcode perfekt optimieren, denn er braucht keinen
Speicher für v
reservieren und kann somit die CPU Register ausreizen.
In C würden viele Entwickler folgendes hintippen:
Aber auch hier würde ein
const int v = 42
oder noch besser ein
static const int v = 42;
zu mehr Optimierungen führen.
Doch da uns der Compiler dazu nicht zwingt, bleibt die Variable bestehen.
Wieso behaupten RUST und ZIG teils besser als C zu sein?
Tja … es ist nicht die Sprache, sondern der Programmierstil, der gut- oder schlecht-optimierten Code zur Folge hat.
Die Unterscheidung von Variablen und Konstanten sollte also auch in C Code
von hoher Priorität sein. So erhalten wir dann nämlich Ergebnisse, die keine
andere Sprache mehr übertreffen kann.
Es ist natürlich nur ein erster Schritt, auf den viele andere wohlüberlegt
folgen müssen.
Fazit: Weitere Sprachen lernen hilft!
Je mehr Sprachen man sich ansieht, um so mehr lernt man auch über die “Muttersprache” (also C).
Ich würde mir wünschen, dass wir mehrere Level der Codeverifizierung in C Compilern hätten. Die Feststellung, dass Variablen als Konstanten genutzt werden, wäre ein solches Feature.
Natürlich könnte man das über “Warnings-as-Errors” Optionen auch umsetzen, aber es ist eben nicht das gleiche, wie eine zwingend per Standard vorgeschrieben Var-Konstanten-Prüfung.
Doch im Gegensatz zu ZIG
und RUST
sollte C
sich immer die Option
vorbehalten, dass man ein solches Feature auch abschalten können muss.
Oder wie man gerne sagt:
Ein Feature, das man nicht abschalten kann, ist ein Bug.