Kein guter Monat in der IT. Letztes Wochenende ist Dennis Ritchie gestorben. :-(

Er war Miterfinder der Programmiersprache C und des Betriebssystems Unix, und somit vermutlich einer der absolut einflussreichsten Köpfe der Branche. Auch nach mehr als 40 Jahren haben seine Ideen immer noch einen wirklich prägenden Einfluss auf einen Bereich der kaum schnellebiger sein könnte.

Unix und seine Folgen

Unix und seine Folgen

Wer der Ansicht ist damit nichts zu tun zu haben — nicht jeder hat das Privileg mit einem wirklichen Unix arbeiten zu dürfen — mag sich folgendes verdeutlichen:

  • Linux basiert auf den Ideen von Unix.
  • Android enthält einen Linux-Kern, und somit indirekt die Ideen von Dennis Ritchie.
  • Der Kern von Apples MacOS stammt von BSD ab, also von einem echten Unix.
  • Apples iPod, iPhone und iPad enthalten meines Wissens auch einen BSD-basierten Kern.
  • Sogar Windows versucht an einigen Stellen sich an Posix-Standards zu halten, also an die Grundlage von Unix.

Unix is simple and coherent, but it takes a genius ” or at any rate a programmer ” to understand and appreciate the simplicity. (Dennis Ritchie)

Und jedes Mal wenn ich beobachte dass andere Systeme wieder irgendwelche Unix-ähnlichen Features übernommen habe denke ich dan dieses Zitat:

Those who don’t understand Unix are condemned to reinvent it, poorly. (Henry Spencer, Autor von regex)

Ach ja, Ritchie hatte offenbar auch einen ‚besonderen‘ Sinn für Humor:

We stopped when we got a clean compile on the following syntax:

for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);

At one time, we thought of selling this to the Soviets to set their computer science progress back 20 or more years.

So zu lesen im Geständnis dass die Idee mit C und Unix eigentlich nur ein Gag gewesen sein sollte — im Jahr 2001. :-D

Das erinnert mich daran warum ich die Sprache C nach Möglichkeit nur auf Mikrocontrollern benutze:

rschaten% cat array.c
#include <stdio .h>
int main(int argc, char **args) {
  char *string = "abc";
  printf("%c %c %cn", string[0], string[1], string[2]);
  printf("%c %c %cn", 0[string], 1[string], 2[string]);
  return 0;
}

rschaten% gcc -o array array.c

rschaten% ./array
a b c
a b c

rschaten%

Das habe ich aus dem Unix Haters Handbook, ich hätte nicht gedacht dass das wirklich funktioniert…

Ich bin auf ein merkwürdiges Phänomen in C gestoßen, vielleicht kann mir das jemand erklären. Extrem eingedampft sieht das Problem so aus:

int main(int argc, char* arg[]) {
    int i = 0;
    switch (i) {
        case 0:
            int j = 7;
            break;
    }
}

Der Compiler (aufgerufen mit ‚gcc test.c‘) sagt dazu „t.c:5: error: expected expression before ‚int‘„. Mit geschweiften Klammern funktioniert der case-Block dagegen prima:

case 0: {
    int j = 7;
    break;
}

Zu meinem grössten Erstaunen klappt auch folgender Block:

case 0:
    i = 3;
    int j = 7;
    break;

Es geht halt nur nicht wenn direkt nach dem case eine Variablendeklaration kommt.

Wenn man schon innerhalb eines case eine Variable deklarieren kann… warum dann nicht ganz am Anfang? Ich meine: ich habe ja Lösungen für das Problem. Mir fehlt halt nur das ‚Problembewusstsein‘. Kann mir das jemand vermitteln?