Comment puis-je écrire une spécification de langage de programmation?


16

J'aime vraiment la conception de langages de programmation. Parfois, je pense que mes projets linguistiques et leurs utilisateurs potentiels bénéficieraient d'un document de normes complet. J'ai examiné de nombreuses normes de langage, allant du très formel (C ++) au plutôt informel (ECMAScript), mais je n'arrive pas vraiment à comprendre comment je dois décomposer les choses et organiser un tel document, même si je pense que je suis assez bon en rédaction technique en général.

Dois-je l'écrire comme un long tutoriel, ou plus comme un papier mathématique formel? Comment le tenir à jour si je le développe en parallèle d'une implémentation de référence? Dois-je simplement abandonner et traiter la mise en œuvre et la documentation comme la norme de facto? De plus, y a-t-il vraiment un avantage significatif à avoir une norme? Est -ce que nécessite une moyenne standard de la langue est inutilement complexe?


1
Avez-vous déjà lu les langages spécifiques à un domaine de Martin Fowler? amazon.com/…
Gary Rowe

@Gary Rowe: Je ne l'ai pas fait. Cela semble être une lecture décente, mais peut-être pas exactement ce que je recherche.
Jon Purdy

L'avantage d'une norme par rapport à une implémentation de référence est que vous pouvez définir où les autres implémentations peuvent s'écarter de ce que fait votre implémentation.
Bart van Ingen Schenau

Réponses:


3

J'ai trouvé la spécification du langage Java à la fois formelle et lisible, et je pense qu'elle a une structure sensée. Certaines des spécifications du W3C pourraient également être de bons exemples.

Faire le travail formel pourrait vous aider à réduire la complexité de la langue et à voir les cas d'angle.

En-têtes brain dump: encodage source, lexing, types fondamentaux, littéraux, opérateurs, expressions, instructions simples, conditions, boucles, fonctions (définitions et appels), déclarations de type, modules, unités de compilation, portée des variables, divers types de résolution de noms (par exemple importations, méthodes), modèle de mémoire, effets secondaires, typage, simultanéité…


Votre liste de suggestions est très utile. Je pense que ce que je vais faire est de réfléchir à une liste similaire, de la trier au format tutoriel et d'écrire une brève spécification informelle avec quelques addenda formels tels qu'une grammaire EBNF. Je vais certainement revoir les spécifications que vous avez mentionnées pour des idées.
Jon Purdy

7

Lisez beaucoup et restez simple

Concevoir une nouvelle langue est difficile. Vraiment dur. Mais finalement très satisfaisant s'il devient populaire et résout vraiment un problème que les gens connaissent de manière élégante.

Comme je l'ai mentionné dans les commentaires, je vous conseille de lire les langages spécifiques au domaine de Martin Fowler pour les raisons suivantes:

  1. Il explique en détail pourquoi vous devriez concevoir un langage
  2. Il y a des détails sur la façon de le faire (analyseurs, analyseurs lexicaux, ateliers linguistiques, etc.)
  3. Il y a des instructions d'implémentation détaillées sur la façon dont votre syntaxe choisie peut être faite pour gérer des concepts comme les fermetures, les annotations, les listes littérales, la réception dynamique, etc.

Quant à la façon de rédiger votre cahier des charges, pensez à votre public. Évidemment, avant de mettre le doigt sur le clavier pour concevoir votre langue, vous aurez soigneusement réfléchi à ce qu'il est censé faire.

S'il s'agit d'un nouveau langage interprété pour remplacer JavaScript, vous souhaiterez une approche très laisser-faire afin d'atteindre les développeurs Web avec une durée d'attention limitée et un désir de résultats immédiats - ou plus rapidement si possible.

S'il doit être utilisé lors de la prochaine mission sur Titan, des spécifications extrêmement détaillées montrant des preuves formelles exactes du comportement de chaque composant seront le niveau d'entrée minimal.

Ce n'est donc pas une chose simple. Pour approcher la spécification, vous feriez probablement mieux d'acquérir beaucoup d'expérience dans la création de vos langues et de travailler avec ceux qui les utilisent réellement au jour le jour. Si vous avez des victimes consentantes ... euh ... des développeurs au travail qui peuvent prendre un certain temps pour apprendre votre langue, ils peuvent vous donner des commentaires sur ce qui est nécessaire pour les amener à l'utiliser.

En bref, restez simple et plus de gens l'utiliseront.


Merci pour cela. J'ai beaucoup d'expérience dans le développement de langages, et même de les documenter de manière assez approfondie, mais c'est l'idée d'une norme qui m'arrive constamment. Je vais peut-être devoir reprendre la lecture recommandée et expérimenter un peu.
Jon Purdy

@Jon Purdy Avez-vous des exemples de langues en ligne que vous pourriez inclure dans la question?
Gary Rowe

Je n'ai pas encore d'exemples de mon projet actuel. Le seul exemple public vraiment complet d'un langage que j'ai créé (que j'utilise réellement!) Est à vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy

@Jon Purdy Vision semble intéressant - une sorte de Velocity gonflée. En passant, vous voudrez peut-être envisager une capture d'écran YouTube montrant comment l'installer et écrire un exemple de petit site Web (par exemple pour un plombier local). Cela rendrait la courbe d'apprentissage beaucoup plus facile, car les gens peuvent la voir en action et en retirer immédiatement les avantages. Vous pouvez parler des avantages par rapport à JSP, Velocity, ASP.Net, Freemarker, etc.
Gary Rowe

C'est une bonne idée; J'ai fait beaucoup de vidéos YouTube récemment (environ trois par semaine), donc je pense que je pourrais certainement en intégrer une.
Jon Purdy

3

Wirth a conçu et implémenté de nombreux langages de programmation: parmi eux, les spécifications des langages Oberon et Oberon2 se distinguent par leur exhaustivité, leur concision et leur lisibilité.


2

Common Lisp et Haskell ont des normes de langage. Ruby et Python ont des implémentations et de la documentation. Je dirais donc qu'une norme de langue n'est pas nécessaire, mais cela pourrait être utile si vous vous attendez à ce qu'il y ait plus d'une implémentation de la langue que vous concevez. D'un autre côté, une norme est prématurée si vous vous attendez à des changements importants dans votre définition de langage.


En fait, Ruby a deux choses qui pourraient être considérées comme des «spécifications». Il y a la spécification ISO Ruby, qui est actuellement dans son état Final Draft et qui est en cours d'écriture par certaines personnes qui ont de l'expérience avec les spécifications de langage (ayant travaillé sur ANSI Common Lisp et ISO C ++). Et il y a le projet RubySpec, qui est un ensemble d'exemples exécutables de style RSpec formant à la fois une spécification lisible par l'homme et une suite de tests de conformité exécutable par machine pour cette spécification.
Jörg W Mittag

1

toute spécification doit être concise et capable de résister à l'épreuve du temps

c'est pourquoi vous voyez une abstraction comme BNF utilisée pour de nombreuses normes linguistiques ... sa lacune et sera toujours comprise longtemps après que beaucoup de nos outils actuels auront été abandonnés.

bien sûr, il y a plus que juste une grammaire. regardez ce que d'autres ont fait ... perl6, schéma, C ... ils traitent des problèmes qui importent également à l'implémentateur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.