Ein Blog

Posts mit Tag "language-design"

Go 1.18 kommt mit Generics. Interessant ist auch der built-in Fuzzing-Support.

A Language Design Analysis of HolyC (das ist die Sprache von TempleOS)

On finding the average of two unsigned integers without overflow.

Enthält auch eine (ehemalig) patentierte Variante.

Gut gefällt mir auch der untere Part:

Bonus chatter: C++20 adds a std::midpoint function that calculates the average of two values (rounding toward a). Bonus viewing: std::midpoint? How hard could it be? (Vortrag geht eine Stunde)

Zig kann Hot-Code-Reloading. Bei VS kam das für C++ erst in VS 2022. .NET kann es auch seit Version 6.

Chris Lattner on garbage collection vs. Automatic Reference Counting.

Chris Lattner ist der Designer von Swift und ursprünglicher Hauptauthor von LLVM.

Ein schöner Talk von Matt Godbolt: What Has My Compiler Done for Me Lately? Unbolting the Compiler’s Lid.

Für die, die ihn nicht kennen: Das ist der, der den Compiler Explorer gebaut hat: https://gcc.godbolt.org

Damit kann man sich anschauen, was für Assembler-Code verschiedene Compiler aus Code erzeugen. Mittlerweile auch für andere Sprachen als C und C++.

Der Talk ist sehr schön und zeigt, was für Optimierungen der Compiler mittlerweile alle fährt. Ein Beispiel ist die Integer-Mulitplikation mit 2, also z. B. x * 2. Spoiler: Es ist nicht x << 1. Aber auch ein paar größere Beispiele sind durchaus beeindruckend.

Takeaway sollte sein: Optimiert nicht selbst, lasst das den Compiler machen. Ich würde noch ergänzen: Wählt geeignete Datenstrukturen.

Es gibt eine Studie aus 2010, die die Lesbarkeit von camelCase und snake_case untersucht. Sie kommt zu dem Schluss, dass snake_case um ca. 20% einfacher zu lesen ist. (Danke, Hans)

Ein interessanter Artikel über eine Anpassung bei einigen Concurrency-Modellen: Notes on structured concurrency, or: Go statement considered harmful

Erinnert ein bisschen an das Konzept von Erlang. Bei Java gibt’s gerade ein Proposal dazu: JEP 428. Ist auch bereits bekannt aus Kotlin.

Falls Ihr einmal einen RFC für PHP schreiben wollt: The Mysterious PHP RFC Process and How You Can Change the Web (2013)

Kleiner Hack: Coroutines in C

Ein toller Post darüber, dass das Error-Model einer der wichtigsten Teile in einer Programmiersprache ist: The Error Model (2016)

Geht auch ein bisschen auf Midori (ein experimentelles OS von MS Research) ein, das mit einer Erweiterung von C# entwickelt wurde.

Eli Bendersky über Type Inference

Lesetipp: Why Checked Exceptions Failed Dazu gibt es noch einen Artikel mit Anders Hejlsberg (C#-Erfinder, wo es keine checked exceptions gibt): The Trouble with Checked Exceptions

Six programming paradigms that will change how you think about coding:

  • Concurrent by default
  • Dependent types
  • Concatenative languages
  • Declarative programming
  • Symbolic programming
  • Knowledge-based programming

Interessante Sprache von MS research: Koka.

Die Sprache handhabt Seiteneffekte mit einer Art Type-State.

atopile ist eine Sprache, mit der man Schaltkreise beschreiben kann. Komponenten kann man in Module aufteilen, erweitern etc. Die haben sogar CI-Support und einen Package-Manager. Bei Bauteilen kann man auch nur die benötigten Specs angeben und es werden passende Bauteile aus dem Katalog ausgesucht.

Hier ist eine Demo. Getting Started ist hier.

Das ist wirklich cool.

Parsing and all that:

Hello again! I’m picking up my series on Automata, with this post that goes into what I had always meant to get to: parsers. We’ll check out the old-school linear time parsing algorithms, which only need to go over the input once, without backtracking or caching. We’ll check out LL and LR, parse tables, recursive descent and recursive ascent. Welcome to the world of deterministic parsing…

Ich hab ja mal einen Prototypen eines SQL-Parsers auf Typebene entwickelt, um rohes SQL statisch zu typisieren. Hier eine Einführung, wie man auf Typebene in TypeScript programmieren kann.

Die Web-Version von Crafting Interpreters.

Andrew Kelley bei CppCast über Zig. Hier ist er auch noch bei einem anderen Podcast.

Beim Parsen von Operatorpräzedenzen gibt’s ja verschiedene Ansätze. Der erste und “einfache” Ansatz ist, die Präzedenzen in der Grammatik abzubilden. Die Implementierung mit einem rekursiven Abstieg ist dann trivial. Problematisch ist allerdings, dass der Syntaxbaum dann für einfache Sachen ziemlich tief wird. Für z. B. ein einfaches a = 5 hätte man auf der rechten Seite dann einen kompletten Unterbaum mit Nodes für jeden möglichen Operator, die dann aber quasi leer sind. Das ist sehr ineffizient. Der nächste Schritt wäre ein Parser mit Dokus auf Operatorpräzedenz. Dort weist man jedem Operator eine Präzedenz in Form einer Zahl zu und löst es später ein einen vergleichsweise flachen Baum auf. Den Operatorpräzedenzparser kann man in den normalen rekursiven Abstieg integrieren und dann für binäre AUsdrücke verwenden. TypeScript macht das z. B. auch so.

Hier ist ein anderer Ansatz, Präzedenzen zu parsen: Better operator precedence

Diese Woche habe ich das Konzept von “German Strings” kennengelernt. Das sind immutable Strings, die mit einer erweiterten Variante der Short-String-Optimization gehalten werden. Sie enthalten noch in den 16 Bytes den Präfix vom String. Damit kann man viele String-Operationen machen, ohne den Pointer auf die Daten zu dereferenzieren. Und ist besser für Lokalität bzw. Caching.

Der Name kommt wohl daher, dass in einem Paper von einem deutschen Stand und einer der ersten Implementoren zu faul war, den tatsächlichen Autor zu nennen.

Hier hat sie jemand in Rust implementiert, um einen Punkt zu beweisen. Dort wird auch der Autor vom Paper genannt: Umbra.

Ein Proposal für C (N3317): Essential Effects for C

PEP 750 – Template Strings (t-strings) have been accepted. Damit hat Python jetzt auch sowas wie tagged template functions aus JS.

Noch ein weiterer Post über Strings in Programmiersprachen: The best – but not good – way to limit string length.

WebAssembly Troubles part 1: WebAssembly Is Not a Stack Machine. Der ganze Blog enthält noch mehr Posts in die Richtung.

YAML-Bashing hatte ich ja schon öfters hier. Eine gute Übersicht mit den Quirks: The yaml document from hell

V8 verwendet ja Pointer Tagging, um optimiert mit Zahlen zu arbeiten. Wer sowas selbst mal einsetzen will: Pointer Tagging in C++: The Art of Packing Bits Into a Pointer

Ein REPL, um mit einer (Programmier-)Sprache Musik zu machen: Strudel.