Créons-nous un langage de programmation en écrivant un compilateur?

8

Dis, je voulais créer mon propre langage de programmation. En supposant que j'ai pris toutes les décisions sur la façon dont je veux qu'il ressemble et agisse, ai-je juste besoin d'écrire un compilateur pour cela?

Par exemple, le code Java de haut niveau est-il autre chose que du texte et ce texte est au format correct pour que le compilateur l'accepte et le transforme en autre chose?

Ma question est la suivante: la création d'un langage de programmation se fait-elle via un compilateur? Le haut niveau est bien.

Haych
la source
Votre question est de rendre la définition du langage de programmation précise ?
Anton Trunov
Pas vraiment. C'est plus, est-ce que je pourrais théoriquement inventer ma seule langue simplement en créant un compilateur qui analyse du texte? Où ce texte est ma langue inventée dans ma syntaxe. Par exemple, System.out.println()Java est parce que le compilateur Java accepte cela ou y a-t-il autre chose qui fonctionne ici.
Haych
3
Qu'entendez-vous par «la création d'un langage de programmation»? Qu'entendez-vous par «terminé»? Il m'est difficile de dire exactement ce que vous demandez. Vous dites que vous avez déjà pris toutes les décisions sur la façon dont vous voulez que la langue ressemble et agisse; quoi de plus à la création d'un langage de programmation, de votre point de vue? Si vous essayez d'élaborer ce que vous essayez de réaliser, il sera probablement possible de vous donner des réponses plus utiles sur la façon dont cela peut être réalisé. En ce moment, il semble que nous devions deviner ce que vous pourriez demander.
DW

Réponses:

10

La réponse courte est non .

Vous pouvez considérer un langage de programmation comme un formalisme mathématique utilisé pour exprimer le calcul. Un compilateur / interprète est juste un morceau d'un logiciel réel qui effectue ce calcul et ne doit pas servir de spécification de langage.

Cela étant dit, en plus de la spécification lexicale et syntaxique d'une langue, vous devez également définir la spécification sémantique, c'est-à-dire ce que signifie réellement un programme (syntaxiquement correct) écrit dans votre langue. La sémantique évidente pour commencer est la sémantique opérationnelle , où la signification d'un programme est donnée en termes de fonctionnement réel du programme. Autrement dit, il (mathématiquement) définit précisément la façon dont les programmes s'exécutent. En plus de cette sémantique, vous devez créer un compilateur / interpréteur réel avec des optimisations, etc.

La spécification de la sémantique opérationnelle complète de votre langue vous donnera une documentation officielle sur la langue et vous fera comprendre votre langue dans les moindres détails. En outre, cela vous permettra de raisonner officiellement sur certains aspects de la langue. Écrire une sémantique opérationnelle est vraiment une bonne habitude.

Il existe également d'autres sémantiques utiles, telles que la sémantique axiomatique , dénotationnelle et de jeu . Cependant, ils sont plus avancés et ne font généralement pas leur chemin dans un compilateur / interprète.

bellpeace
la source
3
C'est faux. Un langage de programmation sans spécification formelle est toujours un langage de programmation.
reinierpost
3
@reinierpost Donc, votre réponse à la question "la création d'un langage de programmation se fait-elle via un compilateur" est oui? Si c'est le cas, je pense que vous devriez l'écrire comme réponse.
bellpeace
4
@reinierpost: Une maison qui n'a pas été conçue par un architecte est toujours une maison. Mais dans quelle sorte de maison préféreriez-vous vivre?
Andrej Bauer
1
La question posée est ambiguë. Un langage de programmation peut-il être créé en créant un compilateur pour lui? Absolument. Est-ce la façon de créer un langage de programmation? Non, ce n'est qu'une façon possible.
reinierpost
2
@johan Un langage de programmation est d'une trop grande importance pratique et théorique pour être laissé comme un concept qui n'est pas défini avec précision. Par exemple, comment expliqueriez-vous précisément à quelqu'un ce qu'est le C ou comment cela fonctionne précisément? En lui donnant un compilateur C? Mais il y en a tellement et ils sont différents! De plus, dans de nombreux cas, nous ne savons même pas ce que fera le compilateur C (astuces: concurrence, modèles de mémoire). À strictement parler, un compilateur / interprète `` induit '' un langage de programmation, mais penser à un langage de programmation comme une simple implémentation soulève plus de problèmes qu'il n'en résout.
bellpeace
5

Dis, je voulais créer mon propre langage de programmation. En supposant que j'ai pris toutes les décisions sur la façon dont je veux qu'il ressemble et agisse, ai-je juste besoin d'écrire un compilateur pour cela?

Non. Prendre toutes les décisions concernant l'apparence et le comportement du langage revient à créer votre propre langage de programmation. Vous n'avez pas besoin d'un compilateur ou d'un interprète pour créer un langage de programmation. Vous n'avez pas besoin d'un compilateur ou d'un interprète pour écrire des programmes dans votre langage de programmation.

Vous n'avez besoin d'un compilateur ou d'un interprète que si vous voulez réellement exécuter les programmes que vous écrivez.

Ma question est la suivante: la création d'un langage de programmation se fait-elle via un compilateur? Le haut niveau est bien.

Non. La création d'un langage de programmation se fait en proposant deux ensembles de règles:

  1. à quoi ressemble un programme juridique (syntaxe)
  2. ce que fait un programme juridique (sémantique)

C'est ça.

Il existe des langages de programmation qui n'ont aucune implémentation. Ou qui n'a pas été implémenté depuis longtemps.

Par exemple, Konrad Zuse a créé Plankalkül au milieu des années 40, mais en raison de la guerre, il n'a jamais pu le mettre en œuvre. Il a d'abord été mis en œuvre dans le cadre d'un mémoire en 1975. Mais il a certainement existé dans les années 1950 et 1960.

LISP a été conçu à l'origine comme une alternative plus souple au λ-calcul pour étudier le calcul. Il a été mis en œuvre par Steve Russell, un étudiant de John McCarthy. McCarthy lui-même doutait même que LISP puisse être mis en œuvre du tout!

APL a été initialement conçu comme une notation pour l'enseignement des mathématiques. Il a ensuite été étendu pour servir de langage de spécification pour IBM System / 360. Les implémentations sont venues plus tard, après que le langage ait déjà été utilisé.

PLANNER était une langue très influente, qui n'était en fait mise en œuvre qu'après avoir déjà influencé d'autres langues; il a été conçu en 1969 et mis en œuvre en 1973, époque à laquelle il avait déjà influencé Smalltalk et Prolog (tous deux en 1972).

Structure et interprétation de la mécanique classique est un manuel de physique qui utilise Scheme au lieu des mathématiques pour décrire les systèmes dynamiques; le fait que Scheme ait des interprètes et des compilateurs est inessentiel pour le livre, il est utilisé comme langage pour transmettre des pensées, pas pour exécuter des programmes.

Comme vous pouvez le voir, les langages de programmation peuvent être utiles même sans implémentations. "Les programmes doivent être écrits pour être lus par les humains, et accessoirement pour être exécutés par les ordinateurs" est une citation célèbre de Structure and Interpretation of Computer Programs. Les langages de programmation sont des langages formels permettant de décrire sans ambiguïté des processus complexes. Le fait que si vous décrivez un processus suffisamment précisément pour qu'un être humain le comprenne, il se trouve également qu'il est exécutable par une machine est un effet secondaire. C'est un effet secondaire très souhaitable, utile, puissant, mais c'est un effet secondaire.

Les tout premiers "langages de programmation", λ-calcul, SKI-calcul, Turing Machines, fonctions μ-récursives, n'ont pas été créés pour l'exécution. Ils ont été créés pour comprendre les questions fondamentales de la logique et des mathématiques.

Jörg W Mittag
la source
0

La création d'un langage de programmation se fait-elle via un compilateur?

Il y a 3 options.

  • Un assembleur
  • Un interprète
  • Un compilateur

Assembleur
Le code source écrit par un humain traduit 1 à 1 en code machine consommé par le CPU.

Interprète
Un programme lit chaque ligne de code, suit les instructions et les exécute dans l'ordre.

Compilateur
Un programme analyse souvent les instructions à l'aide d'un arbre de syntaxe abstraite et l'utilise pour générer du code objet.
Le compilateur génère une forme de code objet qui peut être consommée par une machine réelle ou virtuelle.

Brouiller les lignes
Il y a beaucoup d'intermédiaires ici.
Ruby fonctionne à partir de son AST. Java exécute le code d'octets pour un processeur fictif.
SQL est interprété, mais n'est pas exécuté tel qu'il est écrit, il est traduit en plan de requête.

Javascript existe dans une zone de crépuscule étrange. Il est interprété pour la plupart, mais les parties critiques sont exécutées via un compilateur JIT générant du code octet non standardisé et il est également utilisé comme code objet pour certains compilateurs.
Php était un langage purement interprété, mais Facebook utilise son propre compilateur php.

Ma recommandation
Si vous voulez expérimenter l'écriture d'un langage de programmation.
Commencez avec un interprète.

Si vous voulez comprendre les compilateurs, étudiez les AST!.
Un langage comme Pascal est fait sur mesure pour un AST, il peut passer du code source au code machine en une seule passe et est donc relativement facile à implémenter dans un compilateur.
Si vous insistez pour étudier les compilateurs et non les interprètes, je vous recommande d'étudier les écrits de Wirth sur le sujet.

Johan
la source
Il y a plus que les trois options. Par exemple, une option est: ne rien faire. Vous pouvez créer un langage de programmation simplement en énonçant ses règles. Vous n'avez pas du tout besoin de les implémenter. Plankalkül n'a été mis en œuvre que 60 ans (?) Après sa création. LISP et APL n'étaient pas initialement destinés à être mis en œuvre, LISP a été conçu comme une version plus maniable du λ-calcul pour étudier le calcul, APL a été conçu comme une notation pour l'enseignement des mathématiques. Le livre Structure and Interpretation of Classical Mechanics utilise Scheme comme une notation pour décrire les systèmes dynamiques, pas comme un…
Jörg W Mittag
langage pour écrire des programmes réellement exécutés.
Jörg W Mittag
0

Tout ce qu'un compilateur fait est de s'assurer que l'entrée qui lui est donnée utilise le langage que le compilateur comprend et qu'il porte la même structure sémantique que le langage.

Le compilateur simule l'intelligence en utilisant un lexer et un analyseur afin d'analyser lexicalement l'entrée et d'essayer d'analyser les jetons dans un ordre qui a la signification voulue sans introduire d'ambiguïté.

Pour répondre à votre question, vous POUVEZ créer un langage de programmation en créant le compilateur, mais ce faisant, le langage de programmation est réellement créé avant la fin du compilateur.

Considérez les langages de programmation comme n'importe quel autre langage - anglais, français, allemand, etc. Le travail d'un compilateur est, étant donné une certaine entrée, assurez-vous que les mots utilisés dans cette entrée correspondent aux mots utilisés dans la langue pour laquelle il est construit, faites assurez-vous que l'ordre des mots a un sens dans la langue pour laquelle il est conçu et enfin traduisez cette entrée dans une langue que la machine peut comprendre

smac89
la source
Ce n'est pas nécessairement vrai. Il existe de nombreux exemples de langages créés avec les programmes écrits pour les traiter. FORTRAN était le nom du compilateur, pas la langue.
reinierpost
@reinierpost Mon point est qu'avant qu'un compilateur puisse reconnaître un ensemble de jetons dans son langage donné, ces jetons doivent exister d'abord ... par conséquent, le langage a vu le jour avant l'achèvement du compilateur. Une langue ne peut pas exister sans ses composants les plus élémentaires qui sont les mots / phrases dans cette langue. La sémantique peut venir plus tard. De la même manière, un compilateur ne peut même pas commencer à prétendre qu'il compile une langue s'il ne connaît pas les mots qui composent cette langue
smac89
Il n'est pas nécessaire qu'il y ait une langue «donnée». Le compilateur peut traiter l'entrée sans aucune définition spécifique de ce qui constitue une entrée valide pour lui. Essayez d'amener une foule de programmeurs C à se mettre d'accord sur ce qui est et n'est pas exactement un programme C. Bonne chance!
reinierpost