Beaucoup de gens ont des difficultés ou des frustrations avec les langages de programmation qu'ils utilisent tous les jours. Certains veulent que les choses soient traitées de manière plus abstraite, tandis que d'autres n'aiment pas implémenter des fonctionnalités qu'ils souhaitent être « standard ». Que vous soyez un professionnel de l'informatique ou simplement un amateur, vous souhaiterez souvent créer un nouveau langage de programmation.
Pas
Étape 1. Familiarisez-vous avec la technologie
Vous ne pouvez pas créer un langage de programmation si vous ne savez pas utiliser un ordinateur.
Étape 2. Familiarisez-vous avec la terminologie
Les rédacteurs de compilateurs utilisent souvent une terminologie inconnue. Renseignez-vous sur les compilateurs avant de continuer. Assurez-vous de savoir tout ce que vous devez savoir.
Étape 3. Décidez du problème que votre langue résout
S'adresse-t-il à un problème spécifique à un domaine ou s'agit-il d'un langage à usage général ?
Étape 4. Réfléchissez à la sémantique de votre langue et à ses concepts
- Allez-vous autoriser l'accès direct au pointeur ou non ?
- Quels sont les types de données de votre langue ?
- Est-ce un langage statique ou dynamique ?
- Quel est votre modèle de mémoire ? Allez-vous utiliser un ramasse-miettes ou une gestion manuelle de la mémoire ? (Si vous utilisez un ramasse-miettes, préparez-vous à en écrire un ou adaptez-en un existant à votre langue.)
- Comment allez-vous gérer la simultanéité? Allez-vous utiliser un modèle simple de threading/locking ou quelque chose de plus complexe comme Linda ou le modèle d'acteur ? (De nos jours, les ordinateurs ont plusieurs cœurs.)
- Y a-t-il des fonctions primitives intégrées dans le langage ou tout viendra-t-il d'une bibliothèque ?
- Quel est le ou les paradigmes de votre langue ? Fonctionnel? Orienté objet ? Prototype (comme JavaScript) ? Orienté aspect ? Orienté modèle ? Ou quelque chose d'entièrement nouveau ?
- Comment votre langage va-t-il s'interfacer avec les bibliothèques et langages existants (principalement C) ? Ce point est important si vous construisez un langage spécifique à un domaine.
- Enfin, certaines des réponses à ces questions trouveront une réponse dans la deuxième étape et vous aideront à répondre à l'étape suivante.
Étape 5. Pensez à certaines tâches spécifiques que quelqu'un voudrait pouvoir effectuer avec votre langue
Par exemple, « ils peuvent vouloir ordonner à un robot de suivre une ligne » ou « ils peuvent vouloir créer des programmes de bureau relativement portables » ou « ils peuvent vouloir créer des applications Web avec ».
Étape 6. Expérimentez avec des idées de syntaxe (le texte du langage) pour les exemples ci-dessus
Veillez à garder votre langue dans la catégorie des langues sans contexte ou quelque chose à l'intérieur. Votre générateur d'analyseur syntaxique et vous l'apprécierez plus tard
Étape 7. Écrivez une grammaire formelle pour la syntaxe
Étape 8. Décidez si le langage sera interprété ou compilé
Cela signifie que dans le monde interprété, votre utilisateur éditera généralement votre programme dans un éditeur et l'exécutera directement sur l'interpréteur; tandis que dans le monde compilé, votre utilisateur éditera votre programme, le compilera, enregistrera l'exécutable résultant quelque part et l'exécutera.
Étape 9. Écrivez le scanner et l'analyseur frontal ou trouvez un outil qui vous aide avec cela
Pensez également à la façon dont votre compilateur/interprète avertira votre utilisateur des programmes erronés et des erreurs de syntaxe
Étape 10. Utilisez les informations de l'analyseur pour écrire le code objet ou une représentation intermédiaire
Demandez à l'analyseur de créer un AST, puis créez votre code objet à partir de l'AST en utilisant trois codes d'adresse ou son grand frère SSA, puis créez une table de symboles pour définir vos fonctions, variables globales, etc.
De plus, selon votre langue, vous pouvez également vouloir créer des tables de pointeurs virtuels ou des tables d'informations pour vos classes (afin de prendre en charge la réflexion ou le RTTI)
Étape 11. Écrivez l'exécuteur ou le générateur de code qui liera tout ensemble
Étape 12. Écrivez de nombreux programmes de test pour tester la langue
Vous voulez créer des programmes qui mettent l'accent sur les charges de votre grammaire formelle afin de voir que votre compilateur accepte tout ce qui est à l'intérieur de votre définition et rejette tout ce qui est à l'extérieur
Étape 13. Considérez comment l'utilisateur déboguera ses propres programmes
Étape 14. Si votre langage utilise une bibliothèque standard, vous voudrez l'écrire
Avec un ramasse-miettes ou d'autres fonctionnalités d'exécution si vous en avez besoin.
Plus précisément, si vous écrivez un compilateur, vous aurez besoin du code que le système d'exploitation exécutera pour commencer à exécuter le code utilisateur (par exemple, allouer toutes les variables globales)
Étape 15. Publiez votre langue, ainsi que ses spécifications et quelques exemples de ce que vous pouvez y faire
N'oubliez pas de documenter comment vous pouvez intégrer les bibliothèques et langages existants et comment utiliser les fonctionnalités d'exécution et/ou la bibliothèque standard
Vidéo - En utilisant ce service, certaines informations peuvent être partagées avec YouTube
Des astuces
- Commencez par concevoir votre langage et n'écrivez aucun code, jusqu'à ce que vous soyez satisfait et que vous ayez répondu à toutes (ou à la plupart) des questions ou problèmes liés à votre conception, car il est plus facile de modifier la conception plus tôt que plus tard.
- Connaissez votre plate-forme cible (système d'exploitation et bibliothèques) pour votre compilateur/interpréteur, après tout, vous allez l'utiliser et la manipuler.
Mises en garde
- Pensez si vous avez vraiment besoin d'une nouvelle langue et de ce que votre langue a de nouveau que les autres langues n'ont pas (cela peut être une combinaison de fonctionnalités ou une seule fonctionnalité).
- Écrire des langues est difficile si vous ne savez pas ce que vous faites. Cela demande aussi beaucoup de pratique.
- Préparez-vous à passer du temps dans la conception de langage, car vous n'aurez pas la possibilité de changer de langage une fois que vous aurez écrit le compilateur et dépassé le point de conception.
- N'essayez pas de baser vos fonctionnalités sur une union de plusieurs langues, par exemple en disant que votre langue sera une union de la langue X, de la langue Y et de la langue Z. L'histoire nous a montré que les langues créées de cette manière ne connaîtront jamais le succès, ou tout le monde programmerait PL/1 au lieu de quelque chose basé sur C.