2 Punkte von GN⁺ 2025-03-14 | 1 Kommentare | Auf WhatsApp teilen
  • Fünf Jahre Studium an einer französischen Informatikschule und 20 Jahre Tätigkeit als freiberuflicher Entwickler
  • Hauptsächlich an Kundenprojekten mit Ruby on Rails gearbeitet
  • Beim Einstieg in Common Lisp ein Server-Management-Protokoll geschrieben, das einen ASN.1-Parser erzeugt
    • In Common Lisp C-Code erzeugt, um einen SNMP-Server zu entwickeln
  • Danach mehrere Projekte auf Basis von Common Lisp geschrieben:
    • cl-unix-cybernetics – das Projekt mit den meisten Sternen auf GitHub
    • cl-streams und cffi-posix entwickelt
    • cl-facts – ein Triple Store, der als Graphdatenbank für Common Lisp dient
      • Schnell, mit atomaren Transaktionen und Unterstützung für verschachtelbare Transaktionen
      • Kompatibel mit unwind-protect
      • Nutzbar, wenn man nur drei Makros lernt
      • Vorgestellt auf dem European Lisp Symposium (ELS)
  • Während des Fokus auf Common-Lisp-Entwicklung gingen die Kunden verloren, aber die Überzeugung vom Potenzial von Lisp wurde noch stärker

Grenzen von virtuellen Maschinen (VMs) und Containern

  • Experten weisen auf Probleme von VMs und Containern hin:
    • VMs verschwenden unnötig CPU und Bandbreite
    • Auf cgroups unter Linux basierende Container haben Schwachstellen für Remote Code Execution (RCE) und Privilege Escalation
    • Jedes Jahr werden neue Sicherheitslücken entdeckt
  • Bevorzugt OpenBSD und vermeidet damit Probleme von DevOps-Tools wie Terraform und Ansible

Grenzen von Common Lisp und Performance-Probleme

  • In Clojure usw. treten durch den GC (Garbage Collector) Performance-Probleme auf:
    • Ein Fehlschlag beim Entwickeln eines Strategiespiels, das Tausende von Einheiten verarbeiten musste
    • Der GC der JVM bringt Performance- und Kostenprobleme mit sich

Entscheidung für den Wechsel zu C

  • Erkennen der Grenzen von Common Lisp bei Performance und Portabilität:
    • Linux, OpenBSD, GTK+ und GNOME sind alle in C geschrieben
    • Letztlich Wechsel zu C, um Performance- und Portabilitätsprobleme zu lösen

Entwicklung der neuen Sprache KC3

  • Entwicklung der Utility-Library libc3 → Sprache C3 → später in KC3 umbenannt
  • Merkmale von KC3:
    • Es gibt einen Interpreter (ic3) und einen Compiler (c3c)
    • Erzeugt Datenstrukturen aus UTF-8-Puffern und wandelt sie wieder zurück
    • Defensive Programmierung → von Anfang an minimale Bugs
    • Keine Sicherheitsprobleme
    • Datentypsystem auf Basis von enum-getaggten unions

Ergebnisse auf Basis von KC3

  • cl-facts nach C89 portiert:
    • Während der Covid-19-Zeit fertig entwickelt
    • Triple hinzufügen, löschen, rekursives Query-System, Transaktionen, Logging, Persistenz usw. implementiert
  • Parser und Generatoren für algorithmische Typen geschrieben:
    • Einschließlich Structs, verketteter Listen, Maps, Hash-Tabellen, komplexer Zahlen, Tupel, Code-Blöcke usw.
    • Starke Inspiration durch José Valim (Schöpfer von Elixir)
  • ikc3 – ein REPL, das die Auswertungsergebnisse von KC3 ausgibt
  • kc3_httpd – Entwicklung eines Webservers auf Basis eines MVC-Frameworks
    • Auch die aktuelle Blog-Seite wird über kc3_httpd bereitgestellt
  • Dokumentations-Website erstellt → nutzt den Markdown-zu-HTML-Konverter von KC3

Fazit

  • Auf Basis der mit Common Lisp gewonnenen Erfahrungen der Wechsel zu C
  • KC3 erzielt starke Ergebnisse bei Performance, Sicherheit und Portabilität
  • Weitere Makros und Beispiele zu KC3 sollen folgen

1 Kommentare

 
GN⁺ 2025-03-14
Hacker-News-Kommentare
  • Ich sehe das anders. Ich habe in jungen Jahren viel VB benutzt, dann an der Universität Java, C und C++ gelernt und hauptsächlich C verwendet. Ich wurde Kernentwickler von Xfce und habe fünf Jahre lang daran gearbeitet

    • Danach bin ich zur Backend-Entwicklung gewechselt und habe Java, Scala und Python verwendet. Diese Sprachen bringen andere Probleme mit sich, aber mir gefielen die Standardbibliotheken und die Systeme zur Abhängigkeitsverwaltung
    • 12 Jahre später bin ich zu Xfce zurückgekehrt, und C ist immer noch schwierig. Es gibt viele Probleme wie Memory Leaks, NULL-Pointer-Dereferenzierungen und Data Races
    • Mit Rust war ich produktiver als mit C
  • Ich kann dieses Gefühl vollkommen nachvollziehen. Seit einigen Jahren verspüre ich einen starken Drang, etwas in reinem C zu entwickeln

    • Meine Hauptsprache ist C++, aber es macht wirklich Spaß, alte C-Bibliotheken zu verwenden. Die Interfaces sind schlicht und grundlegend
    • Wenn ich Methoden in reinem C entwickle, kann ich mich zu 100 % auf den Algorithmus konzentrieren, was ich gut finde
    • C zwingt mich dazu, die Arbeit selbst zu machen. Es verbirgt weder Magie noch Komplexität
    • Die Leute um mich herum wollen moderne C++-Features verwenden, aber ich versuche zunehmend, C++-Features zu entfernen
  • Ich habe vor langer Zeit mit C programmieren angefangen, und manchmal möchte ich noch immer in diese Zeit zurückkehren

    • Wenn man aber tatsächlich versucht, produktionsreife Anwendungen in C zu schreiben, merkt man, warum man damit aufgehört hat
    • Es gibt zu viele Dinge, die man ohne Unterstützung des Computers selbst erledigen muss
    • Wenn ich heute eine Low-Level-Sprache wählen müsste, würde ich vermutlich Ada wählen. Sie ist C ähnlich, aber der Compiler unterstützt einen stärker
  • Nachdem ich den Blogbeitrag gelesen hatte, war ich verwirrt darüber, was der Autor eigentlich vermitteln wollte

    • Ich fragte mich, ob der Grund, warum das Programm des Autors nicht genutzt wird, wirklich an der Sprache liegt
    • Es könnte Probleme im Zusammenhang mit dem Speicherverbrauch geben
    • Der Autor hat weder erwähnte Lehren noch Nutzerstatistiken angesprochen
    • Es wurden keine neuen Funktionen hinzugefügt; es wirkte eher wie ein Rewrite als Übung
  • Es wurde ein kc3-Codebeispiel gegeben

  • C war meine erste Sprache, und ich habe damit einfache Konsolen-Apps und kleine Spiele gebaut

    • Ich möchte aber nicht dorthin zurück. Build-Tools und Abhängigkeitsverwaltung sind veraltet
    • Zig ist mein neues C. Es enthält einen C-Compiler, und C-Header können ohne Wrapper verwendet werden
    • Go nutze ich, wenn ich eine einfache Sprache brauche, Rust, wenn ich Performance und Sicherheit brauche
  • Manchmal code ich zum Spaß in C. Aber es gibt so viele wiederholende Aufgaben, dass es langweilig wird

    • Einen Compiler in C zu schreiben ist wie der Umgang mit Tagged Unions
    • Ich habe darüber nachgedacht, einen Generator zu schreiben, um die Wiederholungen zu reduzieren, aber bisher noch nicht
    • Wenn ich ein Projekt in C entwickle, ziehe ich in Betracht, für das Prototyping eine eingebettete Sprache zu verwenden
  • C war erfolgreich, weil es praktisch war

    • Es ist unsicher, aber man kann damit tun, was man will
  • Ich verstehe überhaupt nichts

    • Ich frage mich, was die Killer-App ist, welche Probleme es im Zusammenhang mit CL gibt und ob C die einzige Option ist
    • Ich frage mich, ob man sicher sein kann, dass die Ausführung von KC3-Code keine Sicherheitsprobleme verursacht
  • Dieser Beitrag liest sich wie eine warnende Geschichte ohne Happy End