Programm verschicken — die `.exe`-Datei
Verfügbar in der Kiste IDE — implementiert in Phase 9.5 (F7-Build-Action, 2026-05-17) und Phase 9.5.1 (
frage()im LLVM-Pfad, 2026-05-17).
Bisher hast du deine Kiste-Programme in der IDE laufen lassen — F5 drücken, Output im Panel anschauen, fertig. Aber irgendwann willst du ein Programm verschicken: einer Freundin auf den Stick kopieren, in einen Download-Ordner stellen, ein kleines Tool für die Buchhaltung an einen Kollegen weitergeben.
Dafür brauchst du eine .exe-Datei — eine eigenständige Datei die ohne installierte Kiste läuft. Die Kiste IDE baut die mit einem Tastendruck.
Ohne IDE — direkt im Terminal: du brauchst die IDE nicht, um zu bauen. Das geht auch auf der Kommandozeile:
kiste build mein_programm.ki -o mein_programm.exe # baut die .exe kiste build mein_programm.ki -o mein_programm.exe -release # optimiert (kleiner/schneller)Genau dasselbe macht die IDE-Aktion unter der Haube.
33.1 Die Build-Aktion (F7)
Drei Wege das Gleiche zu tun:
- Taste
F7— schnellster Weg. - Blauer Knopf im linken Seitenstreifen (unter dem grünen Run-Knopf) — wenn du lieber klickst.
- Befehlspalette
Ctrl+Shift+P→ „Build (.exe in dist/)" — für die, die suchen statt sich merken.
Alle drei machen das Gleiche: deine aktuell geöffnete .ki-Datei wird zu einer .exe kompiliert und in einen dist/-Ordner neben deiner Quelldatei gelegt.
Beispiel: du arbeitest an C:\Projekte\rechner.ki. Nach F7 hast du C:\Projekte\dist\rechner.exe — fertig zum Verschicken.
Voraussetzung: die Datei muss gespeichert sein (Ctrl+S). Eine dirty Datei (mit dem ●-Marker in der Tab-Leiste) lehnt F7 ab — die Statusleiste sagt dir warum.
33.2 „Im Ordner anzeigen"
Nach erfolgreichem Build erscheint ein kleines Dialog-Fenster mit dem vollständigen Pfad zur .exe. Zwei Knöpfe:
- Im Ordner anzeigen — öffnet den Windows-Explorer mit der Datei pre-selektiert. Praktisch zum schnellen Verschicken via Rechtsklick → „Senden an …".
- Schließen — Dialog weg, weiterarbeiten.
Der Dialog schließt sich nicht automatisch — du entscheidest wann. Esc-Taste oder Klick außerhalb des Dialogs tun's auch.
33.3 Fenster offen halten mit frage()
Hier ist eine Stolperfalle die du sofort sehen wirst: doppelklick auf eine frische .exe, ein Konsolen-Fenster blitzt auf — und ist sofort wieder weg.
Das ist normal. Windows öffnet die Konsole, dein Programm druckt seinen sag-Output, Programm endet, Konsole schließt. Bei jedem Konsolen-Programm so (Python, Go, Rust, alle).
Damit der User das Ergebnis lesen kann, bittest du am Ende um einen Tastendruck — mit frage():
sag "Hallo Sascha!"
sag "fib(30) ="
sag fib(30)
nimm x = frage("Drücke Enter zum Beenden: ")
Was passiert:
- Programm druckt alles.
frage("Drücke Enter zum Beenden: ")druckt den Prompt und wartet auf eine Eingabe.- User drückt Enter (oder tippt was, ist egal —
xwird einfach nicht benutzt). - Programm endet, Fenster schließt.
frage() ohne Prompt geht auch: frage() wartet einfach auf Enter ohne was zu drucken. Aber ein Prompt macht's für den Endnutzer klarer.
33.4 dist/ in .gitignore
Wenn du dein Projekt in Git verwaltest, gehört dist/ in die .gitignore — die gebauten .exe-Dateien sind Build-Artefakte, kein Source-Code:
# .gitignore
dist/
Das ist die gleiche Konvention wie bei Rust (target/) oder Java (build/). Wenn du Git neu bist: Git ist ein Versions-Verwaltungs-Tool — wir behandeln das später, du musst es heute nicht können.
33.5 F5 vs. F7 — wann was?
| Aktion | Wann | Was |
|---|---|---|
| F5 — Run | Testen während der Entwicklung — schnelles iteratives Probieren. | Baut die .exe in einen temporären Ordner und führt sie sofort aus. Output ins IDE-Panel. |
| F7 — Build | Verschicken — .exe für andere User produzieren. |
Baut die .exe in <projekt>/dist/<name>.exe. Führt sie NICHT aus. |
Faustregel: solange du tippst und testest, F5. Wenn du das Programm an jemanden weitergeben willst, F7.
33.6 Wenn der Build fehlschlägt
Wenn dein Programm Sprach-Features nutzt die im LLVM-Native-Pfad noch nicht verfügbar sind (z.B. das geld-Modul oder Higher-Order-Funktionen aus liste), siehst du:
=== Native Build (kiste build) ===
fehler.ki:5:12 noch nicht im Phase-9.1-Subset: ...
=== Build fehlgeschlagen (87ms) ===
Status-Bar zeigt ✗ Build fehlgeschlagen. Kein Modal. Die Diagnose im Output-Panel sagt dir was nicht geht und meist auch wie du es umschreibst.
Wichtig: der Tree-Walker-Pfad (kiste run im Terminal) versteht die volle Sprache — wenn dein Programm out-of-subset ist und du keinen Workaround brauchst, läuft es dort weiterhin. Aber eine .exe ist heute auf das Native-Subset begrenzt. Die Lücke schrumpft mit jeder Phase.
33.7 Schnell bleiben — was im Build heute Zeit kostet
Reines Rechnen ist in der .exe pfeilschnell (Millionen Operationen pro
Millisekunde). Und seit 2026-06-12 sind auch die häufigsten Daten-Zugriffe
nativ: liste[i] (lesen UND schreiben — l[i] = x samt l[i] += x),
bytes.byte_bei(...), länge(liste/bytes) und wiederhole-Schleifen
kosten nur noch Nanosekunden (vorher je ein Brücken-Aufruf à ~3 µs — die
Taktgeber-Analyse fiel damit von 4,1 s auf 1,1 s). nimm im
Schleifenkörper ist ebenfalls gratis (Bug 006, gefixt).
Was heute noch über die interne Brücke geht und in heißen Schleifen Mikrosekunden kostet:
-
Modul-Globals — einmal in eine lokale Variable ziehen, wenn eine Funktion sie in einer heißen Schleife braucht:
nimm daten = mein_globalvor der Schleife, dann nur noch mitdatenarbeiten. -
wert.als_ganz/als_kommaaufliste<beliebig>-Elementen — bei Zahlen-Listen lohnt eine typreine Liste, dann entfällt das Auspacken ganz. Der Weg dahin (seit 2026-06-12):liste.gefüllt(n, startwert)baut eine große typreine Liste in einem Schlag —liste.gefüllt(1024, 0.0f)ist ein nativer komma-Puffer, auf deml[i]-Lesen UND -Schreiben Nanosekunden kosten. (Achtung: Listen, die perliste.hänge_anWACHSEN, werden intern zuliste<beliebig>— feste Puffergröße +gefülltist der schnelle Weg.) -
karte[k]-Zugriffe und Text-Operationen — pro Zugriff ein Brücken-Aufruf; in heißen Schleifen sparsam einsetzen.
Ein vollständiges Beispiel, das diese Rezepte anwendet (und misst!), ist
beispiele/taktgeber/taktgeber.ki — dort läuft seit 2026-06-12 sogar eine
eigene Radix-2-FFT komplett in Kiste (Spectral-Flux-Schlagerkennung):
typisierte liste.gefüllt-Puffer, native l[i]-Reads und -Stores, ein
192-Sekunden-Lied in ~3,4 s bei voller Abtastrate. Daten-intensive
Algorithmen sind im Build damit nicht mehr nur möglich, sondern schnell.