Bespoke: Een programmeertaal voor mensen die 'alsjeblieft' zeggen
We 'killen' processen, 'aborten' transacties, 'throwen' exceptions, 'breaken' uit loops en 'executeren' instructies. We leggen beslag op locks zonder te vragen, muteren waarden zonder ons te verontschuldigen en bevelen de machine om te 'returnen' alsof het een Labrador is. Zelfs de mildere talen verwachten dat we ons tot de runtime richten in een reeks korte imperatieven:
let carriageCount = 0;
carriageCount = 42;
console.log(carriageCount);
Geen begroeting. Geen uitleg. Niet eens een "ik ben u zeer erkentelijk".
Dit is onacceptabel.
Ik stel daarom Bespoke voor: een statisch getypeerde en onverzettelijk beschaafde programmeertaal voor ontwikkelaars die geloven dat machine-executie nooit ten koste mag gaan van goede manieren. Informeel staat het bekend als The Queen’s Code: van Victoria, natuurlijk; het etiquettecomité heeft de twintigste eeuw immers nog niet goedgekeurd. Bronbestanden gebruiken de extensie .charming, en de compiler behoudt zich het recht voor om teleurgesteld in u te zijn.
De implementatie is op dit moment nog iets minder gevorderd dan het etiquettehandboek. Dit is volkomen passend: men haast zich niet bij een formele introductie.
(Geen relatie met Josiah Winslow’s Bespoke uit 2025, de esolang gebaseerd op Poetic die instructies codeert via woordlengtes. Wij betreuren het sociale ongemak.)
De compiler is niet uw bediende
Bespoke begint met één eenvoudige observatie: de compiler is een gerespecteerde collaborator, geen nederige functionaris. Hij zal geen ongebreideld commando accepteren. Elk verzoek moet openen met een passende aanspreekvorm, het doel beleefd formuleren en afsluiten met een goedgekeurde bevestiging. Control-flow-blokken leveren hun eigen ceremoniële openingen en afsluitingen.
Allocaties en updates zijn gericht aan de Compiler; terminal-output, inclusief standaardfouten, aan de Output Console; bestandssysteemoperaties en runtime-services aan de Host Environment. Gedeelde objecten en worker-threads ontvangen hun correspondentie rechtstreeks. Men vraagt de tuinman niet om de gasten aan te kondigen.
Het declareren van een integer ziet er dan als volgt uit:
Geachte Compiler,
Zou u zo uitzonderlijk vriendelijk willen zijn om een plek te reserveren voor Een Geheel Getal, voortaan bekend als carriageCount, geïnitialiseerd met de waarde 0?
Hartelijk dank.
Dit is weliswaar omslachtiger dan int carriageCount = 0, maar aanzienlijk minder geneigd om een vijandige werkomgeving te creëren.
Interpunctie is grammaticaal in plaats van ornamentaal. Instructies eindigen met punten, vragen met vraagtekens en een blok met een passende afsluiting. Puntkomma's worden afgewezen als het conversationele equivalent van het dichtslaan van een deur.
Een typesysteem van fatsoenlijke afkomst
Bespoke is statisch getypeerd, omdat het oneerlijk zou zijn om een waarde te laten doen alsof het iets is wat het niet is. Het is ook nominaal getypeerd, omdat introducties ertoe doen. Types worden volledig uitgeschreven; kleine vulgarismen zoals int, char en bool hebben geen plaats in beschaafde broncode.
| Bespoke type | Minder verfijnd equivalent | Voorbeeld |
|---|---|---|
| Een Geheel Getal | 64-bit signed integer | 42 |
| Een Rationele Breuk | Exacte ratio van integers met willekeurige precisie | 355/113 |
| Een Tekstfragment | UTF-8 string | "Een goede dag gewüns." |
| Een Individueel Karakter | Unicode scalar value | '£' |
| Een Waarde van Waarheid | Boolean | Helemaal Waar |
| Een Gedistingeerde Kleur | First-class colour | Kleur.BritishRacingGreen |
| Een Betreurenswaardige Omstandigheid | Exception | LedgerMissingMisfortune |
Britse orthografie wordt afgedwongen tijdens de lexicale analyse. Colour is de namespace voor waarden van Een Gedistingeerde Kleur. Color is bewijs dat de broncode is gearriveerd zonder een behoorlijke opleiding. Initialisatie wordt gespeld met een 's', centre wordt correct gespeld, en een optimizer mag redundant werk verwijderen, maar zal het nooit optimizeren.
Er zijn precies twee waarheidsliteralen: Helemaal Waar en Overduidelijk Onwaar. Een derde, implementatie-afhankelijke staat genaamd Misschien, Hoewel Ik Niet Zou Durven Vermoeden werd overwogen voor databasewerk, maar afgewezen omdat deze onvoldoende deterministisch was.
Mutatie vereist een verontschuldiging
Functionele programmeurs hebben gelijk dat muteerbare staat problematisch is, maar een verbod voelt nogal streng. Bespoke staat mutatie toe, mits de programmeur het ongemak erkent:
Geachte Compiler,
Indien het u geen onnodige last bezorgt, zouden wij u willen verzoeken de waarde van carriageCount bij te werken naar 42?
Zeer erkentelijk.
De compiler is niet verplicht een mutatie te accepteren die is geformuleerd als een bevel. carriageCount = 42 produceert diagnostiek B-101, Bot Imperatief, en de compilatie wordt opgeschort totdat de ontwikkelaar heeft nagedacht over zijn gedrag.
Geheugenbeheer volgt hetzelfde principe. Automatische garbage collection wordt niet voorondersteld; men spreekt formeel de tuinman aan:
Geachte Host Environment,
Pardon mijn indringing, maar zou de tuinman af en toe allocaties die niet langer bereikbaar zijn door het programma willen opruimen, wanneer het u schikt?
Met dankbare groet.
Handmatige deallocatie is beschikbaar voor prestatiegevoelige correspondentie, hoewel het weggooien van een allocatie zonder oprechte verontschuldiging ongedefinieerd gedrag is en, wat erger is, gebruikelijk.
Control flow door beraadslaging
Een if-statement is een beschuldiging: deze conditie is waar, doe nu wat ik zeg. Bespoke legt in plaats daarvan een hypothetische vraag voor aan het hof.
Mocht het hof behagen te overwegen of carriageCount strikt groter is dan 10,
Geachte Output Console,
Wij verzoeken u vriendelijk om het Tekstfragment "Kapitaal vooruitgang, inderdaad!" over te brengen naar de standaardstroom.
Hartelijk dank.
Of, mocht het tegendeel waar blijken,
Geachte Output Console,
Wij verzoeken u vriendelijk om het Tekstfragment "Een bescheiden vertoning, helaas." over te brengen naar de standaardstroom.
Hartelijk dank.
Hiermee is de zaak afgesloten.
Voor een gegeven waarheidswaarde is de keuze van de branch deterministisch. Het hof is ceremonieel en kan door geen van beide partijen worden beïnvloed.
Afsluitingen volgen een register: gewone verzoeken mogen elke goedgekeurde uiting van dank gebruiken, inclusief Zeer erkentelijk en Eeuwig dankbaar; Cheers wordt alleen geaccepteerd in lokale scopes, terwijl publieke bibliotheek-API's Hoogachtend vereisen. Compiler-flags kunnen dit aanscherpen onder --deference=white-tie. Rapporten van tegenslag en uitnodigingen om te treden hebben hun eigen goedgekeurde afsluitingen.
Loops zijn toegestaan, hoewel het herhaaldelijk vragen aan de computer om hetzelfde te doen het geduld kan beproeven. Het terugzetten van carriageCount naar 0 vereist opnieuw een verontschuldiging; de loop erkent vervolgens expliciet de last van herhaling:
Geachte Compiler,
Indien het u geen onnodige last bezorgt, zouden wij u willen verzoeken de waarde van carriageCount bij te werken naar 0?
Zeer erkentelijk.
Geachte Compiler,
Zolang het Helemaal Waar blijft dat carriageCount strikt minder is dan 3, zouden wij uw geduld mogen beproeven door het volgende uit te voeren:
Geachte Output Console,
Wij verzoeken u vriendelijk de waarde van carriageCount over te brengen naar de standaardstroom.
Dank u.
Geachte Compiler,
Zou u het vreselijk erg vinden om carriageCount met de waarde 1 te verhogen?
Cheers.
Wij zijn u zeer erkentelijk voor uw geduld.
Functies als diplomatieke voorstellen
Een functie grijpt niet naar de controle en retourneert geen waarde. Het stelt een kleine, begrensd samenwerking voor:
Aan wie het aangaat,
Ik stel hierbij een diplomatieke procedure voor, aangeduid als calculateFare, die als input accepteert:
Een Geheel Getal bekend als distanceInMiles,
Een Waarde van Waarheid bekend als isFirstClass,
en uiteindelijk Een Geheel Getal retourneert.
Mogen wij respectvol het volgende ondernemen:
Mocht het hof behaagen te overwegen of isFirstClass Helemaal Waar is,
dan stel ik nederig voor dat de passende retourwaarde distanceInMiles vermenigvuldigd met 4 is.
Of, mocht het tegendeel waar blijken,
dan stel ik nederig voor dat de passende retourwaarde distanceInMiles vermenigvuldigd met 2 is.
Hiermee is de zaak afgesloten.
Zo is het besloten.
Hoogachtend.
De woordigheid heeft een praktisch voordeel. Niemand heeft ooit een Bespoke-codereview geopend en geklaagd dat het contract van de functie onduidelijk was. Men heeft wel geklaagd dat het twaalf pagina's lang was, maar dat is een andere metriek.
Betreurenswaardige omstandigheden
De frase "een exception throwen" is onnodig agressief. In Bespoke rapporteert een component een ongemakkelijke situatie en brengt deze nederig ter overweging:
Geachte Host Environment,
Het spijt mij vreselijk te moeten rapporteren dat er een ongemakkelijke situatie is ontstaan:
Een Betreurenswaardige Omstandigheid aangeduid als LedgerMissingMisfortune is opgetreden,
specifiek: "Het perkament kon niet in de archieven worden gelokaliseerd."
Mag ik dit nederig ter overweging aan u voorleggen?
Met diepste spijt.
Ook 'vangt' een andere component het arme ding niet. Contingency-afhandeling is een discrete poging gevolgd door een compassievolle ontvangst:
Mogen wij het volgende wagen te proberen, met de grootste discretie:
Geachte Host Environment,
Wij verzoeken u vriendelijk het grootboek op "parchments/annual_audit.csv" te inspecteren.
Hartelijk dank.
Mocht onze bescheiden onderneming helaas mislukken, en Een Betreurenswaardige Omstandigheid aangeduid als LedgerMissingMisfortune worden gemeld:
Geachte Output Console,
Wij verzoeken u vriendelijk om in de standaardfout te fluisteren:
"Wat een vreselijke spijt; we zullen in plaats daarvan verse thee zetten."
Zeer erkentelijk.
In elk eventueel resultaat, of het nu triomf of tragedie is:
Geachte Host Environment,
Zou u zo uitzonderlijk goed willen zijn om het bureau in een ordelijke staat te herstellen?
Hoogachtend.
Hiermee concluderen wij onze contingentie.
Dit is structureel equivalent aan try, catch en finally, maar het geeft het bestandssysteem de ruimte om zijn waardigheid te behouden.
Concurrentie zonder geduw
Concurrent programmeren onthult hoe gewelddig onze woordenschat is geworden. Threads 'concurreren'. Ze 'racen'. Ze 'seizen' locks. De verliezer 'starves'. Uiteindelijk 'killt' iemand het proces.
Bespoke-threads gedragen zich beter. Een mutex is een Verzoek om Exclusief Gehoor:
Geachte SharedLedger,
Indien het u de geringste ongemakken niet zou bezorgen,
zou ik me dan mogen veroorloven exclusief gehoor te verzoeken voor een korte contemplatie?
Ik beloof mijzelf terug te trekken op het moment dat onze zaken zijn afgerond.
Met hoogste consideratie:
[... beschermde operaties ...]
Ik ontsla u uit mijn tediouse aanwezigheid met grenzeloze dankbaarheid.
Mits elke toegang tot het gedeelde grootboek dit protocol naleeft, zijn de gegevens beschermd tegen races. De volgorde waarin aanroepers gehoor krijgen kan nog steeds variëren: manieren bepalen niet de thread-scheduling. Noch elimineren ze deadlocks.
Wanneer Thread Alpha en Thread Beta elk een resource vereisen die door de ander wordt vastgehouden, staan beiden erop dat de ander eerst gaat:
Thread Alpha: Na u, mijn goede heer. Thread Beta: Onder geen beding! Ik sta erop: na u.
Geen van beiden zou erover denken om onbeleefd naar voren te dringen, waardoor het programma gebogen bij de deuropening blijft staan tot de hitte-dood van het universum. De runtime registreert dit niet als een deadlock, maar als een Voorbeeldige Patstelling van Wederzijdse Deferentie, noteert zijn bewondering voor de opvoeding van de threads, en tolereert de pauze onbepaald.
Om dezelfde reden worden threads nooit gedood of beëindigd. Ze ontvangen een formele uitnodiging om met pensioen te gaan:
Geachte Companion Worker Thread,
Hoewel uw dienstverlening een onverdeeld genoegen is geweest,
zouden wij voorzichtig mogen suggereren dat het uur laat wordt en de thee is geserveerd?
Wellicht acht u het passend om uw aardse inspanningen te beëindigen
op uw vroegst mogelijke gemak?
Met hoogste hoogachting.
Dit is coöperatieve annulering met een dresscode.
Diagnostiek van gekrenkte waardigheid
De meeste compilers reageren op een fout door een stapel interpunctie op de terminal te dumpen. De Bespoke-compiler drukt een precieze maar ingetogen teleurstelling uit.
Diagnostiek B-101 (Bot Imperatief) Pardon mij, maar op regel 14 schreef u 'x = 5;'. Wij zijn geen veedrijvers. Formuleer uw verzoek alstublieft als een beleefde navraag.
Diagnostiek B-204 (Vulgaire Orthografie) Onbeschaafde orthografie gedetecteerd op regel 22: 'setcolor'. De letter 'u' is niet optioneel in de beschaafde samenleving. Bedoelde u 'setcolour'?
Diagnostiek B-310 (Onvoldoende Dankbaarheid) Uw petitie op regel 88 was onberispelijk geformuleerd, maar miste een afsluitend 'Dank u'. Het verzoek is stilletjes afgewezen.
Waarschuwingen worden afgeleverd op crèmekleurig papier waar een geschikte printer beschikbaar is. --quiet onderdrukt complimenten, maar nooit kritiek.
Een compleet programma
Nu de inleidingen zijn afgerond, volgt hier Hello World in zijn geheel:
Aan de Meest Eervolle Compiler van het Rijk,
Ik heb de eer u het Main Entry Point voor uw hoogachtende overweging voor te leggen.
Moge het uw gratie behagen:
Geachte Compiler,
Zou u zo vriendelijk willen zijn om een plek te reserveren voor Een Tekstfragment bekend als salutation, geïnitialiseerd met "Goede dag, planeet Aarde."?
Hartelijk dank.
Geachte Output Console,
Wij verzoeken u vriendelijk de inhoud van salutation over te brengen naar de standaardstroom.
Eeuwig dankbaar.
Ik concludeer respectvol deze routine en bied Een Geheel Getal aan dat de exit-status van 0 vertegenwoordigt.
Hiermee zijn onze zaken afgerond.
Ik blijf, heer, uw meest nederige en gehoorzame dienaar,
Arthur Pendleton, Esq.
Het programma bevat één variabele, één output-operatie en geen enkele ambiguïteit over wie tegen wie spreekt. Met 676 tekens, inclusief spaties en regelafbrekingen, zorgt het er ook voor dat fabrikanten van opslagmedia een reden behouden om te innoveren.
De toekomst van beleefd computergebruik
Bespoke zal software niet sneller maken. De voorgestelde binaries zijn conventioneel, maar de broncode heeft een informatiedichtheid die vergelijkbaar is met een negentiende-eeuws verdrag. Evenmin zal het concurrency-bugs voorkomen, zoals de voorbeeldige patstelling demonstreert.
Het stelt echter een belangrijke vraag: als we onze dagen gaan besteden aan het eisen van onmogelijke zaken van machines, kunnen we dat dan tenminste op een prettige manier doen?
De referentiecompiler zal worden uitgebracht zodra deze klaar is met het overwegen van mijn intentieverklaring. Ik heb deze per eerste klas verstuurd en een gefrankeerde, geadresseerde envelop bijgevoegd.
Wanneer alles andere faalt
Een programma kan nog steeds proberen te delen door nul, het geheugen uitputten of lijden onder een productie-deployment om 16:55 uur op vrijdag. Bespoke kan tenminste met gratie falen. Het raakt niet in paniek en crasht niet. De execution engine dient zijn ontslag aan in een verzegelde envelop:
======================================================================
EEN FORMELE VERONT SCHULDIGING
======================================================================
Aan: De Gerespecteerde Gebruiker
Van: Het Runtime Subsystem
Mijnheer/Mevrouw,
Het is met de diepste persoonlijke vernedering dat ik mijn onvermogen
moet opbiechten om verder te gaan met regel 84. Er werd gevraagd om
een deling door nul. Hoewel ik geprobeerd heb het verzoek met alle
nodige welwillendheid te interpreteren, verbieden mathematische
propriëteit en de wetten van het rijk dit.
Om geen scène te veroorzaken, heb ik de vrijheid genomen om
terug te treden uit mijn functie.
Ik blijf,
Uw gebrokenhartige en gegijzelde dienaar,
De Bespoke Execution Engine.
======================================================================
De exit-status is nog steeds non-zero. We zijn beschaafd, niet delusional.
Groetjes,