Veel mensen hebben problemen of frustraties met de programmeertalen die ze dagelijks gebruiken. Sommigen willen dat dingen abstracter worden afgehandeld, terwijl anderen er niet van houden om functies te implementeren die ze 'standaard' zouden willen hebben. Of u nu een IT-professional bent of gewoon een hobbyist, u zult vaak merken dat u een nieuwe programmeertaal wilt maken.
Stappen
Stap 1. Raak vertrouwd met de technologie
U kunt geen programmeertaal maken als u niet weet hoe u een computer moet gebruiken.
Stap 2. Raak vertrouwd met de terminologie
Compilerschrijvers gebruiken vaak onbekende terminologie. Lees meer over compilers voordat u doorgaat. Zorg ervoor dat u alles weet wat u moet weten.
Stap 3. Bepaal welk probleem uw taal oplost
Pakt het een domeinspecifiek probleem aan, of is het een taal voor algemene doeleinden?
Stap 4. Denk na over de semantiek van je taal en de concepten ervan
- Ga je directe aanwijzertoegang toestaan of niet?
- Wat zijn de gegevenstypen van uw taal?
- Is het een statische of dynamische taal?
- Wat is jouw geheugenmodel? Ga je een garbage collector of handmatig geheugenbeheer gebruiken? (Als u een afvalophaler gebruikt, bereid u dan voor om er een te schrijven of pas een bestaande aan aan uw taal.)
- Hoe gaan we om met gelijktijdigheid? Ga je een eenvoudig threading/locking-model gebruiken of iets complexers zoals Linda of het acteursmodel? (Aangezien computers tegenwoordig meerdere kernen hebben.)
- Zijn er primitieve functies ingebed in de taal of komt alles uit een bibliotheek?
- Wat is het paradigma of de paradigma's van uw taal? Functioneel? Objectgericht? Prototype (zoals JavaScript)? Aspectgericht? Sjabloon gericht? Of iets geheel nieuws?
- Hoe gaat uw taal samenwerken met bestaande bibliotheken en talen (voornamelijk C)? Dit punt is belangrijk als u een domeinspecifieke taal bouwt.
- Ten slotte zullen sommige antwoorden op deze vragen in de tweede stap worden beantwoord en zullen u helpen bij het beantwoorden van de volgende stap.
Stap 5. Bedenk een aantal specifieke taken die iemand met jouw taal zou willen kunnen uitvoeren
Bijvoorbeeld 'misschien willen ze een robot een lijn laten volgen' of 'misschien willen ze er relatief draagbare desktopprogramma's in maken' of 'misschien willen ze er webapplicaties mee maken'.
Stap 6. Experimenteer met syntaxisideeën (de tekst van de taal) voor de bovenstaande voorbeelden
Zorg ervoor dat u uw taal in de contextvrije taalcategorie of iets daarbinnen houdt. Uw parsergenerator en u zult het later waarderen
Stap 7. Schrijf een formele grammatica voor de syntaxis
Stap 8. Bepaal of de taal wordt geïnterpreteerd of gecompileerd
Dit betekent dat in de geïnterpreteerde wereld uw gebruiker uw programma doorgaans in een editor zal bewerken en direct op de interpreter zal uitvoeren; in de gecompileerde wereld zal uw gebruiker uw programma bewerken, compileren, het resulterende uitvoerbare bestand ergens opslaan en uitvoeren.
Stap 9. Schrijf de front-end scanner en parser of zoek een tool die je hierbij helpt
Denk ook na over hoe uw compiler/interpreter uw gebruiker zal waarschuwen voor foutieve programma's en syntaxisfouten
Stap 10. Gebruik de parserinformatie om de objectcode of een tussenweergave te schrijven
Laat de parser een AST maken, maak vervolgens uw objectcode van de AST met behulp van drie adrescodes of zijn grote broer SSA, en maak vervolgens een symbooltabel om uw functies, globale variabelen, enz. Te definiëren.
Afhankelijk van uw taal wilt u misschien ook virtuele aanwijstabellen of informatietabellen voor uw lessen maken (ter ondersteuning van reflectie of RTTI)
Stap 11. Schrijf de uitvoerder of codegenerator die alles samenbindt
Stap 12. Schrijf veel testprogramma's om de taal te testen
U wilt programma's maken die de lasten van uw formele grammatica benadrukken om ervoor te zorgen dat uw compiler alles accepteert wat binnen uw definitie valt en alles verwerpt wat daarbuiten valt
Stap 13. Bedenk hoe de gebruiker zijn eigen programma's zal debuggen
Stap 14. Als uw taal een standaardbibliotheek gebruikt, wilt u deze schrijven
Samen met een garbage collector of andere runtime-functies als je het nodig hebt.
In het bijzonder, als u een compiler schrijft, hebt u de code nodig die het besturingssysteem zal uitvoeren om de gebruikerscode uit te voeren (bijvoorbeeld door alle globale variabelen toe te wijzen)
Stap 15. Publiceer uw taal, samen met de specificatie ervoor en enkele voorbeelden van wat u erin kunt doen
Vergeet niet te documenteren hoe u kunt integreren met bestaande bibliotheken, talen en hoe u de runtime-functies en/of standaardbibliotheek kunt gebruiken
Video - Door deze service te gebruiken, kan bepaalde informatie worden gedeeld met YouTube
Tips
- Begin met het ontwerpen van uw taal en schrijf geen code totdat u tevreden bent en alle (of de meeste) vragen of problemen met betrekking tot uw ontwerp hebt beantwoord, aangezien het gemakkelijker is om het ontwerp eerder dan later te wijzigen.
- Ken uw doelplatform (besturingssysteem en bibliotheken) voor uw compiler/interpreter, u gaat het immers gebruiken en manipuleren.
Waarschuwingen
- Bedenk of je echt een nieuwe taal nodig hebt, en wat je taal heeft of wat andere talen niet hebben (het kan een combinatie van functies of een enkele functie zijn).
- Het schrijven van talen is moeilijk als je niet weet wat je doet. Het vergt ook veel oefening.
- Bereid je voor om wat tijd te besteden aan taalontwerp, aangezien je geen kans hebt om je taal te veranderen als je eenmaal de compiler hebt geschreven en voorbij het ontwerppunt bent.
- Probeer uw kenmerken niet te baseren op een unie van verschillende talen, zoals zeggen dat uw taal een unie zal zijn van taal X, taal Y en taal Z. De geschiedenis heeft ons geleerd dat talen die op zo'n manier zijn gemaakt, nooit succes zullen hebben, of iedereen zou PL/1 programmeren in plaats van iets op basis van C.