Assembly
Kurz: Die maschinennächste, für Menschen noch lesbare Programmiersprache — jede Zeile entspricht (fast) direkt einem Prozessorbefehl, prozessorarchitekturabhängig (x86, ARM usw.).
Genauer: Assembly hat keine High-Level-Konzepte wie Klassen oder Schleifen-Syntax — stattdessen arbeitet man direkt mit CPU-Registern, Speicheradressen und Sprungbefehlen. Wird heute fast nur noch für sehr performancekritischen Code, Betriebssystem-/Treiberentwicklung, Reverse Engineering oder eingebettete Systeme mit extrem begrenzten Ressourcen eingesetzt.
Im Detail
Jede Assembly-Anweisung entspricht (fast) direkt einem Maschinenbefehl der jeweiligen CPU-Architektur — es gibt also kein universelles “Assembly”, sondern jeweils eigene Dialekte für x86, ARM, RISC-V usw., die nicht kompatibel zueinander sind. Ein simples Beispiel in x86-Assembly, das zwei Register addiert:
mov eax, 5
add eax, 3 ; eax enthält jetzt 8Weil Assembly so nah an der Hardware ist, erlaubt sie Optimierungen, die ein Compiler bei höheren Programmiersprachen nicht immer findet — allerdings auf Kosten von Lesbarkeit, Entwicklungsgeschwindigkeit und Portabilität (Code für eine Architektur läuft nicht auf einer anderen). In der Praxis schreibt heute kaum noch jemand ganze Programme in Assembly; stattdessen kommt sie punktuell zum Einsatz, etwa für einzelne extrem heiße Codepfade, beim Reverse Engineering von Malware, oder um zu verstehen, was ein Compiler aus höherem Code tatsächlich macht.
Register, Speicher und Sprungbefehle
Die Grundbausteine jeder Assembly-Sprache sind immer dieselben drei Dinge: Register (eine Handvoll extrem schneller Speicherplätze direkt in der CPU, bei x86-64 z. B. rax, rbx, rcx), Speicheradressen im RAM (deutlich langsamer als Register, aber viel größer) und Sprungbefehle (jmp, je, jne), die die normale sequenzielle Ausführung unterbrechen — sie sind das rohe Fundament, aus dem Compiler höhere Konstrukte wie Schleifen und if-Bedingungen erst zusammenbauen. Eine for-Schleife in Java oder Python “gibt es” auf Assembly-Ebene nicht — sie wird vom Compiler in eine Kombination aus Vergleich und bedingtem Sprung zurück zum Schleifenanfang übersetzt.
Assembler, nicht Compiler
Der Übersetzer von Assembly-Quelltext in Maschinencode heißt Assembler (nicht Compiler) — der Begriff passt besser, weil die Übersetzung fast 1:1 erfolgt, ohne die komplexen Optimierungsschritte eines echten Compilers. Bekannte Assembler sind NASM und GNU Assembler (GAS); beide unterstützen dieselbe x86-Architektur, aber mit unterschiedlicher Syntax (Intel- vs. AT&T-Syntax), was beim Lesen fremden Assembly-Codes verwirren kann, wenn man nur eine der beiden Varianten kennt.
Wo Assembly heute noch wirklich vorkommt
In modernen Anwendungen taucht Assembly fast nie mehr als kompletter Programmcode auf, aber sehr wohl in gezielten Ausschnitten: Betriebssystem-Kernel enthalten Assembly für Hardware-nahe Operationen, die sich in keiner höheren Sprache ausdrücken lassen (Interrupt-Handling, Kontextwechsel zwischen Prozessen). Compiler-Autoren und Sicherheitsforscher lesen den vom Compiler erzeugten Assembly-Output, um Performance-Probleme oder Exploits auf Instruktionsebene zu verstehen. Und in eingebetteten Systemen mit wenigen Kilobyte Speicher (z. B. einfache Mikrocontroller) ist Assembly manchmal noch die einzige praktikable Option, weil selbst ein minimaler C-Compiler zu viel Overhead mitbringt.