DeepSoft · Lees het hele verhaal
01/10
Case study
DeepSoft · softwareontwikkeling
Raku++ bouwen
Een compiler voor een van de grootste programmeertalen die er zijn — vanaf nul geschreven, afgemeten aan de eigen specificatie van de taal, en opgeleverd in minder dan een maand.
27 dagen vanaf een lege map90% van de officiële testsuite~2 ms opstarttijdmacOS · Linux · Windows · de browser
02/10
De opdracht
waarom we onszelf dit oplegden

De zwaarste demo die we onszelf konden geven.

Niemand betaalde ons hiervoor. We wilden één project dat beter dan welke dienstenlijst ook laat zien wat onze engineers op een gewone werkdag doen. Dus kozen we een probleem waarin je je nergens kunt verstoppen.

Vanaf een lege map

Geen fork, geen geleende code. Een handgeschreven lexer, parser, evaluator, regex-engine, rekenen met willekeurige precisie en volledige Unicode-tabellen.

Niets om op te leunen

C++17 en de standaardbibliotheek. Nul third-party dependencies, dus het bouwt overal waar een compiler draait.

Van buitenaf beoordeeld

Getoetst aan de eigen uitvoerbare specificatie van de taal — niet aan onze eigen mening over wat "werkend" betekent.

03/10
Wat er kwam
één bron, vele oppervlakken

Niet één project — een constellatie.

Een compiler op zichzelf is een curiositeit. Om nuttig te zijn heeft hij een manier nodig om geïnstalleerd te worden, om uitgeprobeerd te worden, om dingen op te zoeken, en om te bewijzen dat hij klopt.

de engine

Interpreter én compiler

Eén binary draait je programma, of maakt er een zelfstandige native executable van.

de browser

Dezelfde code als WebAssembly

Geen herschrijving — dezelfde broncode, client-side draaiend zonder server erachter.

de oppervlakken

Playground, spec, tour, drills

Een live editor, een gedragsspecificatie van ~700 pagina's, achttien lessen, 150 nagekeken oefeningen — allemaal met de engine in je tabblad.

het leidingwerk

Packaging & tooling

Homebrew, Guix, Nix, release-archieven voor drie systemen, een CI-action — plus test- en benchmarkharnassen die op de compiler draaien.

04/10
Gemeten
vier onafhankelijke meetlatten

Gemeten, niet beweerd.

90%
196.395 van de 217.060 individuele tests in de officiële suite van de taal slagen.
625/ 1.462
bestanden slagen op de alles-of-niets-lat — één falende assertie diskwalificeert het hele bestand.
944
van de 1.451 voorbeelden in de officiële documentatie geven nu byte-identieke uitvoer. Het waren er 596.
833× 121
expressies over operatoren, paar voor paar gedift. Bijgehouden afwijkingen: 202 → 152 in één release.

Elke meetlat is blind voor wat de andere opmerken. Ze allemaal draaien — en telkens vertrouwen op degene die op dat moment naar een probleem wijst — is wat het werk eerlijk hield.

05/10
Echte code
wat een specificatie nooit test

Daarna draaiden we andermans programma's.

Specificaties testen features geïsoleerd. Echte software niet. Dus richtten we de compiler op code die niemand voor ons gemak had geschreven.

1.500pagina's
Een productie-sitegenerator — zelf in de taal geschreven — genereert zijn hele site byte voor byte identiek.
148 → 14
echte meningsverschillen gevonden in 3.068 lesfragmenten, en vervolgens teruggebracht en gesloten.
10.428
oplossingen uit de gemeenschap, uit jaren van een publieke programmeeruitdaging, door dezelfde vergelijk-en-diff gehaald.

Een feature kan volgens de specificatie "klaar" zijn en toch stilletjes fout, op een manier die alleen echte code blootlegt. Daarom bestaat dit front.

06/10
Opstarten
het getal dat je als eerste merkt

Twee milliseconden tot de eerste regel.

Een kleine native binary zonder virtuele machine die moet opstarten: ~2 ms koud, beste van 200 starts 1,8 ms. Bij één run is dat onzichtbaar. Bij de tweehonderdste run van een bewerk-en-genereer-lus — of in een shellscript dat hem herhaaldelijk aanroept — is het het verschil tussen gereedschap dat je denken onderbreekt en gereedschap dat dat niet doet.

Opstarttijd als feature

Engines die een runtime met zich meedragen besteden doorgaans een flinke fractie van een seconde voordat je eerste regel wordt uitgevoerd. Wij behandelden die kosten als een bug.

110 ms → 13 ms

We vervingen de syntax-highlighter van de site door de onze. Die is sneller én correcter: hij parseert de code in plaats van woorden te matchen, dus een methode met de naam role wordt niet langer als sleutelwoord gekleurd.

07/10
Snelheid
gecompileerd tot native binary · × sneller dan de volwassen referentie-engine

En de programma's zijn snel.

Negen benchmarkkernels, beste van zes runs, inclusief procesopstart — en het harnas weigert iets te timen totdat elke engine byte-identieke uitvoer heeft geproduceerd. Zelfs geïnterpreteerd, vóór enige compilatie, liggen we op zeven van de negen voorop.
08/10
Discipline
wat een getal betrouwbaar maakt

We publiceren het onflatteuze cijfer.

De strengste van drie

Er zijn drie verdedigbare manieren om het slagingspercentage te berekenen. Wij zetten de hardste in de kop, noemen beide kerncijfers samen, en schrijven de methode op.

Een doel dat terugwijkt

Hoe beter het wordt, hoe verder kapotte bestanden komen — dus declareren ze meer tests en groeit de noemer. Dat documenteerden we in plaats van een vriendelijkere basislijn te kiezen.

Fixes die de score verlagen

Meer dan eens legde een correctheidsfix een test bloot die per ongeluk slaagde. Houd de fix, herijk, en zeg het erbij.

149 regressietests

Elk gesloten defect wordt er één. Geen enkele release gaat uit zonder ze allemaal te doorstaan.

Snelheid is een poort

Een release kán geen performance-regressie bevatten: een vastgelegde basislijn wordt automatisch opnieuw gemeten en laat de build falen.

Schrijf de mislukkingen op

Optimalisaties die we maten en verwierpen staan naast de geslaagde beschreven — zodat niemand er nog een week aan verspilt.

09/10
Uitrollen
uitlevering als feature, niet als bijzaak

Eén binary. Vier platformen. Geen runtime.

macOS

Eén universele binary voor Apple Silicon en Intel, te installeren met één Homebrew-commando.

Linux

Statisch gelinkt, zonder runtime-afhankelijkheden — plus een Guix-kanaal en een Nix-flake voor distributies die vanaf de bron bouwen.

Windows

Een statische build die geen redistributable-pakketten ernaast nodig heeft.

De browser

Dezelfde engine als WebAssembly, client-side draaiend zonder dat er iets naar een server gaat.

Elke push wordt automatisch gebouwd en getest op alle drie de desktopsystemen. Externe bijdragers zijn eigen packaging gaan insturen — wat op zijn eigen manier bewijst dat de codebase schoon genoeg is om vreemden erin te laten werken.

10/10
Samenwerken
wat dit aantoont

Dezelfde engineers, op jouw project.

Raku++ is open source en gratis, en is nooit aan iemand gefactureerd. Het bestaat omdat het de meest complete demonstratie is die we konden bouwen van hoe we werken.

  • Greenfield systems engineering in modern C++, zonder shortcuts
  • Performancewerk gedreven door profiling, en hoe dan ook gedocumenteerd
  • Correctheid getoetst aan een externe standaard, eerlijk gepubliceerd
  • Cross-platform oplevering die gebruikers ook echt bereikt
  • WebAssembly: één kern, native én in de browser
  • Een dozijn releases in vier weken, zonder ongedekte regressie