Unleashed Pascal (2026) ist ein Fork von FreePascal und Lazarus, der moderne Sprachfeatures wie async/await, parallele Schleifen, Pattern-Matching und String-Interpolation als optionale Erweiterungen einführt, ohne die Kompatibilität zu altem Pascal-Code zu beeinträchtigen.
Installer: ↗https://github.com/unleashedpascal/installer/releases
Lizenzen: Mehrere Open-Source-Lizenzen (GPLv2, modifizierte LGPL, MPL) der jeweiligen Original-Projekte FreePascal und Lazarus.
Unleashed Pascal lässt sich unabhängig und parallel zu FPC/Lazarus installieren und nutzen. Man kann es also gefahrlos testen und kann jederzeit zu seinem gewohnten Lazarus zurückkehren.
Für alle Erweiterungen gilt Opt-in, d.h. jedes Feature wird über einen eigenen Mode-Switch aktiviert oder ist im gesammelten {$mode unleashed} enthalten. Bestehender Quellcode bleibt davon unberührt.
Inhaltlich lassen sich die Erweiterungen in mehrere Kategorien gliedern: Im Bereich Nebenläufigkeit bringt das Projekt ein async/await-Modell mit, bei dem ein Aufruf einen Hintergrund-Thread startet und await das Ergebnis einsammelt, ganz ohne Event-Loop-Konzept. Dazu kommt eine parallele for-Schleife, die die Schleifenkörper über einen Worker-Pool verteilt, sowie lock/trylock-Blöcke, die kritische Abschnitte automatisch anlegen und wieder freigeben, und threadstatic-Variablen für pro-Thread-Zustände ohne klassische threadvar-Deklaration.
Ein zweiter Schwerpunkt liegt auf kompakterer Schreibweise. Dazu zählen Inline-Variablen mit Typ-Inferenz, Statement-Ausdrücke (if/case/try liefern direkt einen Wert), ein match-Statement als moderner Ersatz für einfache case-Verzweigungen, anonyme Tupel-Typen mit Destrukturierung, String-Interpolation über $'...'-Literale, eine step-Klausel für for-Schleifen, die Mehrfach-Initialisierung mehrerer Variablen mit einem Wert sowie native 128-Bit-Integer. Kleinere Helfer wie SwapValues() und der Type()-Operator (ein Pascal-Äquivalent zu decltype) runden diesen Block ab.
Für systemnahe Programmierung bietet das Projekt einen dritten Block rund um Speicherlayout: zusammensetzbare Records mit embed, union und Bit-Feldern für die 1:1-Portierung von C-Headern, flexible Array-Member nach C99-Vorbild, statische Variablen mit Programmlaufzeit, sowie Scoped-Cleanup-Mechanismen wie defer und autofree als Ersatz für try/finally-Boilerplate. Ergänzt wird das durch einen zeroinit-Modifikator für deterministisch initialisierte Stackframes und eine deutlich aggressivere, echte Inline-Erzwingung.
Im Bereich Klassen und Generics gibt es Auto-Properties, die ohne Getter/Setter-Code ein Backing-Field synthetisieren, sowie verschachtelte generische Methoden und implizite Generics im Delphi-Stil ohne generic/specialize-Schlüsselwörter.
Wer Wert auf Kontrolle über die erzeugte Binärdatei legt, findet zusätzlich eine Option zum Entfernen von RTTI-Typnamen, CLI-Schalter zum Anpassen eingebetteter Metadaten sowie Direktiven, um Dateien zur Kompilierzeit direkt in die Binärdatei einzubetten.
Bei Strings und Literalen kommen mehrzeilige String-Literale (Backtick- und Dreifach-Anführungszeichen-Form) hinzu, außerdem diverse Komfort-Anpassungen: durchgängige Compound-Zuweisungsoperatoren, elementweise Array-Vergleiche, indexierte und "faule" Sprungmarken für Zustandsautomaten, ein erhaltener Schleifenzähler nach break, sowie is not/not in als lesbarere Negationen.
Schließlich bringt der Optimizer drei zusätzliche Stufen mit: automatisches Inlining kleiner Routinen ab -O3, eine schnellere Umsetzung kleiner FillChar/Move-Aufrufe, und eine Entvirtualisierung von Prozedurvariablen, wenn der Compiler beweisen kann, dass nur eine Zieladresse infrage kommt.