Common Lisp ist der Standard-Lisp-Dialekt aus dem Jahr 1994 (ANSI X3.226-1994) und gilt als die mächtigste Lisp-Variante. Sie vereint funktionale Programmierung mit objektorientierten Konzepten aus CLOS (Common Lisp Object System) und wird bis heute in Forschung, KI und anspruchsvoller Softwareentwicklung eingesetzt.
Erste Schritte
Beliebte Implementierung ist SBCL (Steel Bank Common Lisp), ein quelloffener und sehr performanter Compiler:
sbcl ; interaktive REPL starten
sbcl --script datei.lisp ; Skript ohne REPL ausführen
sbcl --load datei.lisp ; Datei laden
sbcl --eval "(format t "Hallo")" ; Ausdruck direkt auswerten
Paket- und Build-Verwaltung
- Quicklisp ist der Paketmanager der Common-Lisp-Welt:
(ql:quickload "paket")lädt eine Bibliothek und zieht Abhängigkeiten automatisch nach. - ASDF (Another System Definition Facility) beschreibt Projekte als Systeme — analog zu Makefiles oder Cargo.toml — und kompiliert sie in der richtigen Reihenfolge.
- Ein Projekt wird mit
(asdf:load-system "mein-system")geladen;(ql:quickload)nutzt ASDF intern.
Wichtige Sprachkonstrukte
(defun quadrat (x) (* x x)) ; Funktion definieren
(defparameter *name* "Wert") ; globale Variable
(defclass tier () (name)) ; CLOS-Klasse
(defmethod sprich ((t tier)) ...) ; Methode auf Klasse
(loop for i from 1 to 10 collect i) ; Schleife
(mapcar #'quadrat '(1 2 3)) ; Funktion auf Liste mappen
Praxis-Tipps
- Quicklisp einmalig installieren:
(load "quicklisp.lisp"), dann(quicklisp-quickstart:install). - Die REPL mit
,verlassen (SBCL), History mit den Pfeiltasten. - Emacs mit SLIME bietet eine komfortable Common-Lisp-Entwicklungsumgebung.
Verwandte Grundlagen: Scheme-Befehle, Clojure-Befehle, Racket-Befehle, Emacs-Lisp-Befehle.
Verilog ist eine Hardware-Beschreibungssprache mit C-ähnlicher Syntax, die 1983/84 von Gateway Design Automation entwickelt und später von Cadence übernommen wurde. Seit 1995 ist sie als IEEE-Standard 1364 genormt. Verilog wird wie VHDL eingesetzt, um digitale Schaltungen für FPGAs und ASICs zu beschreiben, zu simulieren und zu synthetisieren.
Grundprinzip: Module
Die zentrale Einheit ist das module — vergleichbar mit einem Chip oder einer Teilschaltung. Ports werden als Ein- oder Ausgänge deklariert, das Innenleben mit always-Blöcken oder Zuweisungen beschrieben:
module and2 (
input wire a, b,
output wire y
);
assign y = a & b;
endmodule
Wichtige Sprachmittel
- wire für verdrahtete Signale, reg für in always-Blöcken zugewiesene Werte
- always @(*) für kombinatorische und always @(posedge clk) für taktflankengesteuerte Logik
- module/endmodule, parameter für Konstanten, task/function für wiederverwendbare Bausteine
- Bit-Operatoren wie
&,|,^direkt auf Vektoren
Werkzeuge und Befehle
Icarus Verilog ist der klassische Open-Source-Simulator. Kompilierung und Simulation laufen getrennt:
iverilog -o sim and2.v and2_tb.v # kompilieren
vvp sim # simulieren
Verilator übersetzt synthesizbares Verilog und SystemVerilog in schnellen C++- oder SystemC-Code — ideal für große Simulationen:
verilator --cc --build --exe --timing -j 0 sim_main.cpp and2.v
Simulationen erzeugen VCD-Dateien (Value Change Dump), die sich mit GTKWave als Wellenform anzeigen lassen.
Verwandte Grundlagen: SystemVerilog-Befehle, VHDL-Befehle, C/C++-Befehle.
SystemVerilog ist die Erweiterung von Verilog zu einer einheitlichen Hardware-Beschreibungs- und Verifikationssprache (HDVL). Der Standard IEEE 1800 (erste Ausgabe 2005, aktuell 1800-2023) fasst Design, Testbench-Programmierung und formale Assertions in einer Sprache zusammen. SystemVerilog ist rückwärtskompatibel zu Verilog und heute der Standard in der Chip-Verifikation.
Design-Verbesserungen
Für das Synthese-Design bringt SystemVerilog dedizierte Prozess-Klassen mit, die die Absicht klarer ausdrücken als das generische always:
module counter (
input logic clk, rst_n,
output logic [7:0] count
);
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) count <= 8'h00;
else count <= count + 1;
end
endmodule
- always_ff für taktflankengesteuerte, always_comb für kombinatorische und always_latch für Latch-Logik
- logic ersetzt die Unterscheidung von
wireundregin den meisten Fällen - typedef, struct, enum und interface für strukturierte Datentypen und Port-Bündel
Verifikation: Klassen, Constraints und Assertions
Der große Zugewinn liegt in der Verifikation: Objektorientierte class-Testbenches, constrained random Stimuli, covergroups für die Funktionsabdeckung und Assertions (SVA) für temporale Eigenschaften. Die Universal Verification Methodology (UVM) von Accellera baut vollständig auf SystemVerilog auf. Über die Direct Programming Interface (DPI) lassen sich C-Funktionen direkt in die Testbench einbinden.
Werkzeuge
Open Source: Verilator unterstützt ein breites synthesizbares Subset und wird per verilator --cc --build --exe --timing in C++ übersetzt. Kommerzielle Simulatoren sind Synopsys VCS, Siemens Questa und Cadence Xcelium.
Verwandte Grundlagen: Verilog-Befehle, VHDL-Befehle, C/C++-Befehle, Python-Befehle.
VHDL (VHSIC Hardware Description Language) ist eine stark typisierte Hardware-Beschreibungssprache für digitale Schaltungen. Sie entstand in den 1980er-Jahren im US-Verteidigungsprogramm VHSIC (Very High Speed Integrated Circuit) und ist seit 1987 als IEEE-Standard 1076 genormt. Mit VHDL werden FPGAs und ASICs beschrieben, simuliert und synthetisiert.
Grundprinzip: Entity und Architecture
Jedes VHDL-Design trennt die Schnittstelle von der Implementierung: Die Entity deklariert Ein- und Ausgänge, die Architecture beschreibt das Verhalten oder die Struktur. Ein einfaches UND-Gatter sieht so aus:
library ieee;
use ieee.std_logic_1164.all;
entity and2 is
port (a, b : in std_logic;
y : out std_logic);
end entity;
architecture behav of and2 is
begin
y <= a and b;
end architecture;
Wichtige Sprachmittel
- std_logic und std_logic_vector aus dem Package
ieee.std_logic_1164— der Standard-Datentyp für Signale - process mit Sensitivitätsliste für sequentielle Logik, signal für Verbindungen, variable für lokale Werte
- if/case innerhalb von Prozessen, generate für strukturelle Wiederholung
- strikte Typisierung: Signale unterschiedlicher Typen müssen explizit konvertiert werden
Werkzeuge und Befehle
GHDL ist der verbreitete Open-Source-Simulator. Der Arbeitsablauf besteht aus Analyse, Elaboration und Ausführung:
ghdl -a and2.vhdl # analysieren (Syntax- und Typprüfung)
ghdl -e and2 # elaborieren (Top-Level aufbauen)
ghdl -r and2 --vcd=out # simulieren, Wellenformen als VCD
Für die Synthese kommen kommerzielle Werkzeuge wie AMD Vivado oder Intel Quartus zum Einsatz, im Open-Source-Bereich auch Yosys. Testbench-Signale lassen sich mit GTKWave als VCD-Datei visualisieren.
Verwandte Grundlagen: Verilog-Befehle, SystemVerilog-Befehle, C/C++-Befehle, Assembly-Befehle.
Roc ist eine rein funktionale Programmiersprache, die Richard Feldman (bekannt aus der Elm-Community) entwickelt. Sie verfolgt das Motto „fast, friendly, functional“: Roc-Code soll schnell kompilieren und schnell laufen — die Sprache übersetzt zu Maschinencode oder WebAssembly. Statt einer großen Standardbibliothek nutzt Roc so genannte Platforms, die das Programmieren für Kommandozeile, Web-Server oder Browser vorkonfigurieren.
Erste Schritte
Der Roc-Compiler heißt roc und wird über die Kommandozeile bedient. Ein einfaches Programm liegt in einer main.roc-Datei:
roc check main.roc # Typprüfung ohne Code zu erzeugen
roc build main.roc # Kompiliert zu einer ausführbaren Datei
roc run main.roc # Kompiliert und führt das Programm aus
roc dev main.roc # Entwicklungsmodus mit schneller Neukompilierung
roc test main.roc # Führt die Tests im Modul aus
roc fmt main.roc # Formatiert den Quelltext
roc repl # Interaktive REPL zum Ausprobieren
Wichtige Optionen
--output <datei>— Zielpfad der erzeugten Binärdatei festlegen--target wasm32— kompiliert zu WebAssembly statt nativem Maschinencode--linker— Linker-Auswahl (Standard: LLD als Bibliothek eingebunden)
Praxis-Tipps
- Roc ist noch in der Pre-Release-Phase — die Sprache verändert sich, die grundlegenden Befehle bleiben aber stabil.
- Die
basic-cli-Platform liefert Module für Kommandozeilen-Argumente und externe Befehle,basic-webserverfür HTTP-Anwendungen. - Da Roc rein funktional ist, gibt es keine Variablen mit Seiteneffekten im klassischen Sinn — Abhängigkeiten werden explizit als Parameter gereicht.
Verwandte Grundlagen: Haskell-Befehle, Elm-Befehle, Rust-Befehle, Odin-Befehle, D-Befehle.