9
votes

Comment créer une langue ces jours-ci?

Je dois me contenter d'écrire ce langage de programmation que je voulais écrire. Comment vous le faites ces jours-ci? Je suis sorti de la boucle depuis plus d'une décennie; Est-ce que vous le faites différemment maintenant que nous sommes revenus dans les journées pré-Internet, pré-windows? Vous savez, de retour lorsque des codeurs "réels" codés dans C, ont utilisé la ligne de commande et ont piqûre sur quelle coque était supérieure?

Juste pour clarifier, je veux dire, pas comment concevez-vous une langue (que je peux comprendre assez facilement) mais comment créez-vous le compilateur et les bibliothèques standard, etc.? Quels outils utilisez-vous ces jours-ci?


19 commentaires

Pour enregistrer, les «enfants» américains utilisent toujours la ligne de commande et s'aggraver sur quelle coque est supérieure. Ou je fais au moins. C est mort cependant. Je dois maintenant fuir la Hoarde des programmeurs de C, alors je te reverrai!


Quel genre de langage, interprété ou compilé?


interprété ou compilé? hmmm bonne question. Je suppose que cela fait une différence, je vais donc dire les deux juste pour être du bon côté.


@Kinopiko Toutes les langues interprétées réussies seront éventuellement compilées pour la vitesse. Peut aussi bien supposer que cela sera compilé, alors vous ne faites pas cela inutilement difficile. @Matthew c mort? Depuis quand?


@Matthew: NE PAS DE NE PAS DE CRANIER C programmeurs. Ou ils vont libérer leur horde de Segfault et Sigfpes sur vous.


@Kevin SO Perl, Python, Ruby et PHP sont tous des échecs? Alors ok!


@Aviraldg Oh noes, pas les Segfault!


@kinopiko: La plupart des langues interprétées sont compilées au code natif sur la mouche juste avant l'exécution plutôt que littéralement interprétée de ligne par ligne. @Kevin: juste un peu d'humour. C n'est pas (tout à fait) mort. Tout comme Cobol n'est pas.


@Matthew Lequel de Perl, Python, Ruby ou PHP est compilé au code natif sur la mouche juste avant l'exécution? Et la mouche sait-elle qu'il va être exécuté?


Perl au moins est. PHP peut être avec diverses extensions qui vont par le nom de 'optimiseur.


@Matthew - Pouvez-vous fournir une source pour Perl étant compilée? Je n'ai jamais rien entendu à ce sujet dans toute mon expérience Perl. Ce serait plutôt difficile à faire, car Perl a un si faible dactylographie. De plus, C ne sera pas mort tant qu'il y ait une langue plus rapide et plus rapide pour écrire des compilateurs / interprètes.


C est utilisé partout dans la place est des systèmes embarqués, sans parler des noyaux, des pilotes, etc ...


@Chris: Google pour "Perl Jit Perrot" et vous aurez une tonne d'entre eux.


Python de fer (compilé), Zend [PHP] (compilé), Iron Ruby [à venir] (compilé). Je ne sais pas sur Perl; Peut-être Perl 6 sur Perrot compte? Quoi qu'il en soit, mon point n'est pas que toutes les langues interprétées sont transformées en celles purement compilées. Que toutes les langues interprétées seront compilées à un moment donné à l'avenir; soit dans des implémentations alternatives, soit dans une option sur la branche principale.


Ou juste laisser le perroquet, puisqu'il est un peu trompeur (et applicable uniquement à Perl 6). Mais la version courte est qu'il y a beaucoup de preuves là-bas.


IronPython est légèrement différent du python ordinaire, irruby est encore un peu expérimental et Perl 6 est toujours une solution (pour une raison quelconque).


Il existe plusieurs questions d'extension du compilateur compilateur. Mais ils ont une douleur à rechercher ...


En fait, il y a un tag [compilateur-compilateur] tag Stackoverflow.com/questions/tagged/callpiler-Compiler , il est juste n'a pas beaucoup d'entrées ...


Dupliqué possible de Création de votre propre langue


19 Réponses :


2
votes

Je suis sûr que vous faites ce qui a toujours été fait.

Écrivez du code et montrez vos résultats au monde.

par rapport à l'Olden Times, il existe des outils pour faciliter votre travail. Pourrais-je suggérer Antlr pour analyser votre grammaire de langue?


0 commentaires

0
votes

Codeurs réels Code toujours en C. Juste que c'est un litte plus net.
Hmmm ... conception de la langue? Ou écrire un compilateur? Si vous souhaitez écrire un compilateur, vous utiliseriez Flex + Bison. (Google)


5 commentaires

Si vous voulez écrire un bon compilateur, vous fermez à la main votre propre analyseur de descente récursif, car si un analyseur de bison modérément complexe vous passerez bientôt dans des problèmes (sinon d'obtenir la langue de fonctionner, puis obtenir le compilateur / interprète pour signaler les erreurs).


@chris ouais, peut-être, mais seulement pour Lisp (ASM, schéma ...) écrivant manuellement un compilateur complet complet est la dernière chose que vous voulez faire ... Juste à cause de la complexité impliquée.


Pas vraiment. Ce n'est pas terriblement compliqué, surtout parce qu'il y a des tonnes de livres et de tutoriels sur le sujet. Et toutes les principales langues de programmation sont écrites avec des analyseurs / lexers laminés à la main.


Je crois que c'est parce qu'ils ne sont pas des grammates régulières (je me souviens de lire quelque chose à propos de C ++ et C # ne pas être des grammaires régulières ??)


Vous voulez dire des grammaires "sans contexte", ce qui est partiellement vrai - Flex / Bison ne peut gérer que des grammaires sans contexte et des tentatives peuvent être apportées à leur forcer à gérer les grammaires avec le contexte, mais c'est très limitant. Mais la raison principale de la GCC a commuté le compilateur C de Flex / Bison à la main-d'une meilleure déclaration d'erreur. (Les grammaires régulières sont analysées par des expressions régulières et sont plutôt trop limitées pour la conception de la langue complète, si peut-être utile pour de nombreuses tâches.)



2
votes

Vous ne devez pas accepter des solutions WIMPY comme à l'aide des derniers outils. Vous devriez bootstrap la langue en écrivant un compilateur minimal dans Visual Basic pour des applications ou un langage similaire, puis écrivez tous les outils de compilation dans votre nouvelle langue, puis auto-compilez-le en utilisant uniquement la langue elle-même.

aussi, quel est le nom proposé de la langue?

Je pense que récemment, il n'y a pas eu de langues avec toutes les noms de lettres majuscules telles que Cobol et Fortran, alors j'espère que vous appellerez cela quelque chose comme Mikelang avec toutes les lettres majuscules.


2 commentaires

DE BASE? J'ai entendu dire que quelqu'un faisait des recherches sur la base de si les chimpes s'éloignaient dans un clavier étaient de la sorte que le code de base du niveau de production. Deviner...


Idée cool. J'avais choisi de "complicité" il y a plusieurs années, mais j'aime l'idée d'une langue allcaps! Miktran, Mobol, Mikebasic, Malévolent, Malt, Markv, Mingle, Ming, Unilang ...



0
votes

Pas une réponse facile, mais ..

Vous souhaitez essentiellement définir un ensemble de règles écrites dans le texte (jetons), puis un analyseur qui vérifie ces règles et les assemble en fragments.

http://www.mactech.com/articles/ MacTech / Vol.16 / 16.07 / UtilisationFLEXANDBISON /

Les gens peuvent passer des années à ce sujet, l'article ci-dessus parle de l'utilisation de deux outils (Flex and Bison) pouvant être utilisé pour activer le texte en code que vous pouvez alimenter à un compilateur.


0 commentaires

2
votes

Parler en tant que quelqu'un qui vient de construire un Assemblage simple comme langue et interprète, je commencerais avec le framework .NET ou similaire. Rien ne peut battre la puissante syntaxe de C # + le support de toute la communauté .NET lorsque vous essayez d'écrire la plupart des choses. À partir de là, j'ai conçu un format de bytecode simple et une syntaxe d'assemblage de bytecode et protégé pour écrire mon interpréteur + assembleur.

Comme je l'ai dit, c'était un très langage simple.


1 commentaires

Syntaxe puissante? c #? Vous plaisantez. Mais le framework .NET et la communauté sont bien cependant.



7
votes

Une considération qui est nouvelle puisque l'ère de la carte poinçonnée est l'existence de machines virtuelles déjà fournies avec des "bibliothèques standard". Ciblage de la JVM ou du CLR .NET CLR au lieu de YE OLDE «Jardin muré sur la langue» vous permet de gagner beaucoup de bootstrapping. Si vous créez une langue compilée, vous pouvez également trouver un code d'octet Java ou MSIL une cible de compilation plus facile que le code de machine (bien sûr, si vous êtes en train de créer un compilateur d'optimisation serré, vous verrez cela. comme un bogue plutôt qu'une fonctionnalité).

du côté négatif, les idiomes de la JVM ou du CLR peuvent ne pas être ce que vous voulez pour votre langue. Vous pouvez donc toujours finir par construire des «bibliothèques standard» simplement pour fournir des interfaces idiomatiques sur la plate-forme. (Un exemple est que toutes les langues et son chien semblent fournir sa propre méthode d'écriture à la console, plutôt que de laisser des utilisateurs à appeler manuellement system.out.println ou console.write.) Néanmoins, il permet un développement incrémentiel de l'idiomatique Les bibliothèques, et signifie que les bibliothèques les plus obscurses pour lesquelles vous ne serez jamais ronde pour construire des interfaces idiomatiques sont toujours accessibles même si de manière laidée.

Si vous envisagez une langue interprétée, .NET a également pris en charge l'interprétation efficace via l'exécution de la langue dynamique (DLR). (Je ne sais pas s'il y a un équivalent pour la JVM.) Cela devrait vous aider à vous libérer de vous concentrer sur la conception linguistique sans avoir à vous soucier de l'optimisation de l'interprète.


3 commentaires

VMS tels que Java et .Net sont une impasse évolutive.


Pas vrai! Étant donné que les bibliothèques des plates-formes JVM et .NET n'ont pas à vous soucier des idiosyncrasies des plaforms, ils peuvent être libres d'explorer les aspects de la conception de l'API qui seraient autrement laissés intacts.


VMS tels que Java et .Net sont une impasse évolutive.



0
votes

D'abord j'ai passé une année ou donc à penser à la façon dont la langue devrait ressembler. Dans le même temps, j'ai aidé à développer un ioke (www.ioke.org) pour apprendre les internes de langue.

J'ai choisi l'objectif-c comme une plate-forme de mise en œuvre car il est rapide (assez), une langue simple et riche. Il fournit également un cadre de test si une approche agile est une solution. Il a également une riche bibliothèque standard que je peux construire sur.

Étant donné que ma langue est simple sur le niveau syntaxtique (aucun mot-clé, seuls les littéraux, les opérateurs et les messages), je pouvais aller avec Ragel ( http://www.complang.org/ragel/ ) pour le scanner de construction. C'est rapide comme l'enfer et simple à utiliser.

Maintenant, j'ai un modèle d'objet de travail, un scanner et un opérateur simple Shuffling Plus Bibliothèque Standard Bootstrap. Je peux même exécuter des programmes simples - tant qu'ils correspondent dans un fichier :)


0 commentaires

6
votes

J'ai écrit deux compilateurs maintenant à Haskell pour de petites langues spécifiques à un domaine et que cela vous semble être une expérience incroyablement productive. Parsec Library facilite la lecture avec la syntaxe facile et les interprètes sont très simples à écrire sur une structure de données HASKELLL . Il y a une description de écrire un interpréteur LISP à Haskell que j'ai trouvé utile .

Si vous êtes intéressé par un backend haute performance, je recommande LLVM . Il possède un code d'octet concis et élégant et le meilleur backend générateur X86 / AMD64 que vous pouvez trouver. Il y a un collecteur de déchets en option et certains backends expérimentaux qui cibler les JVM et CLR .

Vous pouvez écrire un compilateur dans n'importe quelle langue produisant LLVM Bytecode. Si vous êtes assez aventureux pour apprendre HASKELL, mais que vous voulez LLVM, il existe un ensemble de HASKELL-LLVM Bindings .


0 commentaires

2
votes

Pas tant de mise en œuvre, mais une décision de conception qui impliquant les effets de mise en œuvre - si vous faites chaque énoncé de votre langue, avez un arbre d'analyse unique sans contexte, vous obtiendrez quelque chose qu'il est facile de donner à la main un analyseur, et que ce n'est pas 't nécessite de grandes quantités de travail pour fournir une mise en évidence de la syntaxe. De même, des choses simples comme à l'aide d'un symbole différent pour les espaces de noms de module et les espaces de noms d'objet (contrairement à Java qui utilise . pour les espaces de noms d'emballage et de classe) signifie que vous pouvez analyser le code sans charger chaque module qu'il fait référence.

Bibliothèques standard - Incluez l'équivalent de tout dans les bibliothèques standard de C99 autres que SETJMP. Ajouter tout ce dont vous avez besoin pour votre domaine. Travaillez un moyen facile de le faire, soit quelque chose comme Swig ou un FFI en ligne tel que Ruby's [NE PAS mémoriser le nom du module] et les CTTYPES de Python.

Construire autant de la langue dans la langue est une option, mais des projets qui commencent à abandonner ( rubinius Déplacé à l'aide de C ++ pour des parties de sa bibliothèque standard) ou est uniquement à des fins de recherche ( Mozilla Narcisse )


0 commentaires

1
votes

Je suis en fait un enfant, haha. Je n'ai jamais écrit un compilateur réel avant ou conçu une langue, mais j'ai terminé le livre de dragon rouge, alors je suppose que j'ai un peu une idée (j'espère).

Cela dépendrait d'abord sur la grammaire. Si c'est LR ou Lalr, je suppose des outils tels que Bison / Flex fonctionnerait bien. Si c'est plus ll, j'utiliserais esprit , qui est un composant de boost. Il vous permet d'écrire la grammaire de la langue en C ++ dans une syntaxe de type EBNF, donc sans embrouillage avec des générateurs de code; Le compilateur C ++ compile la grammaire pour vous. Si l'une de ces échoue échoue, j'écrivais une grammaire EBNF sur papier, puis procédez à une analyse de descente récursive forte, ce qui semble fonctionner; Si C ++ peut être analysé assez bien à l'aide de RDP (comme GCC le fait), alors je suppose avec suffisamment de tests d'unité et de patience, vous pouvez écrire des compilateurs entiers à l'aide de RDP.

Une fois que j'ai une analyse d'analyse et une sorte de représentation intermédiaire, cela dépend alors de la façon dont il fonctionne. Si c'est un certain bytecode ou un compilateur de code natif, je vais utiliser LLVM ou libjit pour le traiter. LLVM est plus adapté à la compilation générale, mais j'aime mieux l'API libjit et la documentation. Sinon, si je suis vraiment paresseux, je vais générer un code C et laisser GCC faire la compilation réelle. Une autre alternative est de cibler une machine virtuelle existante, comme le perroquet ou la JVM ou le CLR. PARROTE est le VM conçu pour Perl. Si c'est juste un interprète, je vais marcher sur l'arbre de syntaxe.

Une alternative radicale consiste à utiliser PROG, qui contient des fonctions de syntaxe qui simulent remarquablement EBNF. Je n'ai aucune expérience avec cela cependant, et si je ne me trompe pas (que je vais presque certainement être), Prolog serait assez lent si utilisé pour analyser des langages de programmation robuste avec beaucoup de constructions syntaxiques et de bizarreries (lire: C ++ et perl).

Tout cela, je ferai en C ++, si seulement parce que je suis plus utilisé pour y écrir que C. Je resterais loin de Java / Python ou quoi que ce soit de ce type pour le code de production réel (compilateurs d'écriture en C / C ++ aide à le rendre portable), mais je pouvais me voir les utiliser comme un langage de prototypage, en particulier Python, que je suis partiel vers. Bien sûr, je n'ai jamais fait de cela avant, alors je ne suis pas un à dire.


0 commentaires

3
votes

Qu'est-ce qui a été considérablement changé mais n'a pas encore été mentionné est le soutien et l'interopérabilité de l'IDE:

De nos jours, nous attendons à peu près Intellisense, l'exécution étape par étape et l'inspection de l'état "directement dans la fenêtre de l'éditeur", de nouveaux types qui indiquent au débogueur comment les traiter et les messages de diagnostic utiles. L'ancienne "compile .x -> .y" exécutable ne suffit pas à créer une langue plus. L'environnement n'est rien à se concentrer sur la première fois, mais affecte la volonté d'adopter.

En outre, les bibliothèques sont devenues beaucoup plus puissantes, à personne ne veut mettre en œuvre tout cela dans une autre langue. Essayez d'emprunter, faites-la facile d'appeler le code existant et de faciliter l'appelé par un autre code.

cibler un VM - comme suggère Itwllson - est probablement un bon moyen de commencer. Si cela provoque un problème, il peut toujours être remplacé par des compilateurs natifs.


2 commentaires

"L'ancien" compile "-> .y 'exécutable est à peu près mort" - hahahaha! Dites-moi un autre. Allez c'était génial!


Alex: Comme dans "Tout ce dont tu as besoin pour une nouvelle langue est ...", je suppose que je devrais clarifier cela.



-1
votes

Mike -

Si vous êtes intéressé par un compilateur générateur de code natif efficace pour Windows afin que vous puissiez obtenir vos roulements - sans patauger tous les widgets inutiles, les gadgets et autres non-sens qui encombrent les machines d'aujourd'hui - je recommande l'osmosian Système de développement anglais ordinaire de la commande. Il comprend une interface unique, un gestionnaire de fichiers simplifié, un éditeur de texte sympathique, un pèches hexadécimal pratique, le compilateur / lieur (bien sûr) et une application de mise en page de la page WYSIWYG pour la documentation. Entièrement écrit en anglais, c'est un téléchargement rapide (moins d'un mégaoctet), suffisamment petit pour comprendre en bref ordre (environ 25 000 lignes de code anglaise, avec seulement 4 000 dans le compilateur / liant), mais assez puissant pour se reproduire sur un dell de bas de la ligne en moins de trois secondes. Vraiment: trois secondes. Et c'est gratuit pour tous ceux qui écrivent et demandent une copie, y compris le code source et et un manuel de 100 pages de langue de langue plutôt humoristique. Voir www.osmosian.com pour plus de détails sur la façon d'obtenir une copie ou d'écrire directement avec des questions ou des commentaires: gerry.rzeppa@pobox.com


0 commentaires

1
votes

sur lambda-the-ultime Il y a un lien vers Créez votre propre langue de programmation par Marc-André Cournoyer, qui semble décrire comment tirer parti des outils modernes pour créer de petites langues.


0 commentaires

0
votes

Bien sûr, les techniques plus anciennes sont toujours courantes (par exemple à l'aide de Flex and Bison) de nombreuses implémentations linguistiques plus récentes combinent la phase de lexing et d'analyse, en utilisant un analyseur basé sur une grammaire d'expression d'analyse (PEG). Cela fonctionne pour des analyseurs d'ascendance récursive créés à l'aide de combinaisons ou à des analyseurs de packrat mémotant. De nombreux compilateurs sont construits à l'aide du cadre AntLR également.


0 commentaires

1
votes

juste pour clarifier, je veux dire, pas comment concevez-vous une langue (que je peux comprendre assez facilement)

Juste un indice: regardez d'abord certains différents langages , avant de concevoir une nouvelle langue (c'est-à-dire une stratégie d'évaluation très différente). HASKELL et Oz viendra à l'esprit. Bien que vous stiez également connu Prolog et Scheme. Il y a un an, j'ai aussi été comme "Hey, concevons une langue qui se comporte exactement comme je le veux", mais j'ai eu la chance de regarder ces autres langues (ou si vous pourriez aussi dire malheureusement , parce que maintenant je n'ai pas 't sais que je veux une langue de se comporter plus ...).


0 commentaires

1
votes

Avant de commencer à créer une langue, vous devez lire ceci:

Hanspeter Moessenboeck, l'art de Niklaus Wirth

FTP: //ftp.ssw.uni-linz .ac.at / pub / papiers / mOe00b.pdf


1 commentaires

Niklaus Wirth était terrible à la conception du compilateur. Il a violé la loi Einsteins: faites tout aussi facile que possible que possible. Ses langues étaient de tous faciles à être productives. Au fait, j'aime Modula3 qui n'a pas été conçue par lui.



0
votes

Utilisez Bison / Flex qui est la version GNU de YACC / Lex. Ce livre est extrêmement utile .

La raison d'utiliser Bison est-elle capturée des conflits dans la langue. Je l'ai utilisé et cela a fait ma vie de plusieurs années plus facile (ok donc je suis sur ma 2e année, mais les 6 premiers mois étaient il y a quelques années il y a quelques années en l'écrivant en C ++ et les analyses / conflits / résultats étaient terribles!: (.) ​​


0 commentaires

0
votes

Si vous voulez écrire un compilateur, vous devez évidemment lire le livre de dragon;)

Voici un autre bon livre que je viens de lire. Il est pratique et plus facile à comprendre que le livre Dragon:

http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field -keywords=Language+Implementalation+patterns&x=0&y=0


0 commentaires

1
votes

Il y a un grand raccourci pour mettre en œuvre une langue que je ne vois pas dans les autres réponses ici. Si vous utilisez l'un des formulaires «non traditionnés» de Lukasiewicz (c.-à-d. Polonais en avant ou vernis à l'avant), vous n'avez pas besoin d'un analyseur du tout! Avec inverse vernis, les dépendances vont à droite à gauche afin que vous exécutez simplement chaque jeton car il est numérisé. Avec le vernis avant, c'est l'inverse de cela, vous exécutez donc le programme "à l'envers", simplifiant les sous-expressions jusqu'à atteindre le jeton de départ.

Pour comprendre pourquoi cela fonctionne, vous devez enquêter sur les 3 algorithmes principaux de l'arborescence: pré-commandes, en ordre, post-commande. Ces trois traverses sont l'inverse de la tâche d'analyse qu'un lecteur de langue (i. Analyseur) doit effectuer. Seule la notation dans l'ordre "nécessite" une décente récursive de reconstruire l'arborescence d'expression. Avec les deux autres, vous pouvez vous échapper avec une pile.

Cela peut nécessiter davantage de "pensée" et moins "mise en œuvre".

BTW, si vous avez déjà trouvé une réponse (cette question est d'un an), vous pouvez le poster et l'accepter.


0 commentaires