History

  • timeline, first commit to today
  • 57 entries
  • 12 min read
  • 中文

Status: current. The project's timeline from the first commit to today; it is extended when a line of work lands, not rewritten.

This page is the history of Dawn from its first commit to today, one line of work per entry. It reads forward in time, in six periods, and each entry gives the date, the release that first shipped it where there is one, and one sentence on what changed. The authoritative account of each entry is the design document or specification section it links to; dates are commit dates in UTC+8, and git log holds the commits behind them.

M0–M7: from nothing to self-hosting (2026-07-11 to 07-22)

One compiler left (2026-07-23 to 07-31)

Effects and the frontend (August)

Devices and the standard library (2026-09-01 to 09-07)

Tightening (2026-09-08 to 09-30)

October

From v0.1.0 on 2026-07-17 to v0.81.0 on 2026-10-01 there have been 83 release tags.

Decisions that were reversed

The early decisions are kept as they were written. Where one has since been overturned, this table says what replaced it and when.

ThenNowWhen
The compiler is written in Kotlin, on a budget of 6–8 thousand lines (§1, D7)The only compiler is the self-hosted one in selfhost/; the Kotlin implementation survives at the kotlin-final tag2026-07-23
The everyday toolchain (run, test, fmt, doc, LSP) stays on the Kotlin version (M7)Every tool comes from the self-hosted compiler2026-07-23
The Kotlin compiler stays frozen as the bootstrap seed, like Go's go1.4 (M7)The seed is the previous release's dawn-selfhost.jar; v0.6.0 remains the root of the replayable chain2026-07-23
The only backend is JVM bytecode; native comes from GraalVM native-image (§1, D1)A C backend is a self-hosting peer of the JVM backend, and a cuTile backend targets GPUs2026-07-30; 2026-09-02
No intermediate IR (D6)Core IR sits between checking and both backends2026-07-25
The JVM's GC is our GC (non-goals)The native backend has no GC; memory is managed by Perceus reference counting2026-07-29
The effect system has two levels, pure and io (D2)Users declare named effects and handle them; io is the only ambient effect2026-08-01; 2026-09-24
Purity and effect marking credited to Flix, "simplified to two levels" (§4)Named effects with handlers, control arms and handler state; the precedents surveyed are Koka and Effekt2026-08-01
Continuation capture conflicts with the C backend's single-stack model (non-goals)One-shot resumption (ctl, resume k, discard) works on both backends; only multi-shot stays out2026-08-31 to 09-01
The unsafe escape hatch is not open to user code (D5)unsafe_pure was opened to users, restricted to std, then deleted with its keyword2026-07-18; 2026-07-30; 2026-09-24
TList is a java.util.List at runtime, so the bridge costs one call (D8)List is std/pvec, written in Dawn; a List handed to Java crosses as an Array2026-07-27
Single-parameter traits, no conditional impls; == stays structural (D9, trait v1)Conditional impls, associated types, and == through an Eq bound2026-07-26; 2026-08-02
Map/Set are LinkedHashMap/LinkedHashSet with copy-on-write (M4)Persistent hash tries, written in Dawn since 07-272026-07-21; 2026-07-27
No dawn.toml; the directory layout is the project (M4)dawn.toml is optional and carries the project's identity and dependencies2026-07-17; 2026-07-22
A character literal is an Int (M4)'a' has type Char, an opaque type over Int2026-08-06
The tutorial is eleven chapters, checked by a Kotlin test (M3)Seventeen chapters, English original, every dawn run block run by doc-check.py2026-08-05 to 08-07
The exception barrier is java_try (M6)It is catch_fault2026-07-29
M5 is a plan; M6 awaits its production cutoverM5 went live on 2026-07-12; M6 cut over on 2026-07-15 and retired Python on 2026-07-162026-07-12; 2026-07-16

Early decisions

Early design decisions (M0–M7) keeps the reasoning behind each choice made before self-hosting, as it was written at the time.