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.
System.out.println()
Java est parce que le compilateur Java accepte cela ou y a-t-il autre chose qui fonctionne ici.Réponses:
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.
la source
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.
Non. La création d'un langage de programmation se fait en proposant deux ensembles de règles:
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.
la source
Il y a 3 options.
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.
la source
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
la source