Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un nouveau langage basé sur le C

langage C

    22 octobre 2015 à 13:31:36

    Un nouveau langage

    Bonjour a tous,


    Il y a quelques jours, je me posais la question du "comment crée-t-on un langage ?", "Quel niveau faut-il pour le faire ?".

    Je pense que tout le monde s'est déjà posé la question, ou alors vous n'êtes pas curieux :) !

    Après renseignement, je me suis dit : "C'est dur !"

    En effet, créer un langage de programmation n'est pas simple (c'est même plutôt le contraire :lol:) mais rien ne dit que l'on doit le faire de zéro ...

    Une idée m'est venue, celle de créer une sorte "d'interpréteur" en C qui compilerai du code d'un langage (que l'on aura inventé). Comment, me direz-vous ? Eh bien, il "suffit" d'écrire notre programme dans ce langage (dans un fichier), de lancer le "compilateur/interpréteur" qui va transformer ce code en code source C et le compiler ! Mais comme me dirons certains, c'est plus facile à dire qu'à faire !

    Principe du logiciel

    En fait, le logiciel sera chargé de lire le code source, de l'interpréter et de le transformer en code C. Je me doute qu'il ne sera pas facile à faire, notamment à cause des fonctions chaîne qui sont plutôt difficile à appréhender en langage C (il y aura beaucoup de comparaisons) mais je pense qu'avec de l'aide, ça peut se faire.

    De cette manière, il n'y aura pas besoin de gérer les variables puisque le compilateur se charge juste de transformer/adapter le code et de le compiler. Bon d'accord, bonjour les erreurs à la compilation à cause de cette retranscription:colere2: , mais bon, c'est pour s'amuser !

    Le langage

    Toutes les idées sont les bienvenues ! Toutefois, il faut garder à l'esprit que, même sous une apparence différente, cela reste du code C. Ainsi certaines conventions >_<, etc... seront à prendre en compte (tout ce qui est relatif au C, en fait). Pour les noms, je pensais à un nom en G ... Mais rien n'est décidé ! Faites vos suggestions !

    Je vous remercie de votre attention, et j'espère que ce projet intéressera quelqu'un, mais n'oubliez pas : c'est pour s'amuser !

    Jejeleterrible58

    -
    Edité par jejeleterrible58 22 octobre 2015 à 18:46:22

    • Partager sur Facebook
    • Partager sur Twitter
    Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
      22 octobre 2015 à 14:05:40

      Je ne peux que t'encourager et c'est un exercice très formateur, ça va te permettre de comprendre des principes auquel tu ne songe peut-être pas maintenant, mais au final c'est d'une très grande complexité, comme par exemple gérer les interdépendances ou la résolution des types.

      "Compiler" vers un autre langage simplifie grandement le tout et je te dirais même que le contraire serait une mauvaise idée. Car si tu veux créer directement de l'assembleur, qui serait une tâche pénible et très laborieuse, tu n'arriveras jamais au même niveau de performances que le peux par exemple avec un compilateur C, ni le même niveau de portabilité. J'ai déjà vue un projet sur OC qui à tenté le coup et qui s'est finalement soldé par un échec.
      Les compilateur ont énormément évoluer depuis le temps et le C/C++ entre autre peut compiler vers n'importe quel plateforme. De plus avec emscripten tu peux même créer du Java. Ça évolue toujours, bientôt on va pouvoir exécuter à la volé du C (avec Cling), mais ce qui est encore plus intéressant c'est de pouvoir avoir une compilation intermédiaire en LLVM IR. Ce code est l'intermédiaire entre le C et l'assembleur, ce qui permet d'être très portable (le même fichier fonctionne partout) mais aussi encore plus performant, car il est compilé sur la machine cible, ce qui permet des optimisations spécifique à celle-ci.
      Bref, les possibilités sont infinies.

      Le C étant très bas niveau c'est une excellente idée d'en faire une surcouche pour simplifier le tout. Il ne faut pas oublier non plus que ça prend un framework derrière, pour pouvoir l'utiliser. De plus créer un langage c'est peu intéressant sans outils pour l'utiliser, il faut donc penser à créer un IDE (autocompletion, gestion des erreurs, etc). Tout ça est un travail colossal, si tu veux quelque chose de complet, il ne faut pas avoir froid au yeux.
      Bon courage pour la suite!

      -
      Edité par Maeiky 22 octobre 2015 à 14:30:16

      • Partager sur Facebook
      • Partager sur Twitter

      GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.

        22 octobre 2015 à 14:34:18

        Je trouve moi aussi le projet très intéressant. 

        Par contre, ça risque d'être très long à coder et ce sera assez complexe comme le dit Maeiky (ne serais-ce que sur les contraintes de typages par exemple). Donc je te conseille avant d'y réfléchir sur le papier pendant un bon bout de temps avant de faire la moindre ligne de code.

        Et j'ai une petite question pour toi. Est-ce que tu veux faire un truc orienté tout public ou plutôt réservé aux développeurs ?  Si tu t'orientes vers le tout public, regardes un peu les sources de AlgoBox (c'est vachement sympa pour apprendre l'algorithmie).  

        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2015 à 15:16:48

          Merci à tous pour vos réponses,

          Tout d'abord, je compte faire le plus simple possible que le C me le permet. Je sais que cela risque d'être difficile mais je vais beaucoup apprendre, ça c'est sûr ! Le seul "problème" en fait, c'est que je ne sais pas comment faire pour repérer un mot dans une ligne de code. Dois-je faire une boucle while qui tourne tant que l'on lit des caractères space et newline, et ensuite, une fois qu'on a repérer la position d'un mot, le lire jusqu'à ce que l'on rencontre de nouveau un de ces caractères, pour ensuite l'interpréter ? Telles sont les questions que je me pose. Merci encore pour vos réponses,

          Jejeleterrible58

          • Partager sur Facebook
          • Partager sur Twitter
          Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
            22 octobre 2015 à 15:41:59

            Oui, caractère par caractère, certains utilisent les expressions régulière. Sinon, il y a une petit exemple ici en C :
            https://github.com/nothings/stb/blob/master/stb_c_lexer.h

            L'idéal est de séparer les variables des opérateurs, une variable peut contenir normalement ceci : a-z, A-Z, '_', et 0-9, le reste étant un délimiteur.

            Tu peux te faire deux tableaux, la liste de variables dans ta ligne et la liste d'opérateurs, dans mon cas c'est récursif, un ligne peu contenir une ligne, s'il y a priorité d'opérations par exemple "()".
            • Partager sur Facebook
            • Partager sur Twitter

            GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.

              22 octobre 2015 à 16:51:40

              Merci pour tes conseils et le lien ( 815 lignes !). Je vais y réfléchir.

              Sinon aurais-tu des idées quant au langage ? Surtout au niveau de l'esthétique et de la syntaxe ?

              • Partager sur Facebook
              • Partager sur Twitter
              Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
              Anonyme
                22 octobre 2015 à 18:18:00

                En effet, pour créer un langage, tu dois bien réfléchir avant de commencer à coder. Le risque principal, si tu commences à coder tout de suite, est de partir dans tous les sens, pour se retrouver avec un langage mal conçu de toutes parts.

                Il faut tout d'abord que tu réfléchisses aux objectifs que tu te donnes pour ton langage. Ensuite, une fois que tu sauras ce que tu veux faire, tu pourras réfléchir au moyen de le mettre en place. Et là, tu pourras réfléchir à l’esthétique et à la syntaxe de ton langage. Ce que je veux dire par là, c'est que pour prendre un exemple simple, les deux lignes suivantes sont équivalentes :

                say 'Hello World !';
                puts 'Hello World !'

                Mais ce qui est vraiment intéressant, c'est ce qui se passe derrière. (Bon, pour cet exemple, si tu retranscris directement vers du C, ce ne sera pas vraiment intéressant).

                En tout cas, je te souhaite bon courage pour ton projet ! Tu vas certainement apprendre énormément de nouvelles choses, et c'est extrêmement positif ! N'hésites pas à nous montrer ce que tu as commencé (via GitHub par exemple), que l'on puisse y jeter un coup d’œil :)


                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2015 à 18:27:11

                  Bien je te conseil de te baser sur des langages existants, ça va t'éviter des problèmes de conceptions.

                  Ensuite ça dépend vraiment de ce que tu veux faire, quel philosophie tu vise. Par exemple il y a les langages fonctionnel, l'ECS (Entity Component System), une optique parallèle comme GLSL? Ou bien plus classique, avec un système d'héritage. Un langage interpréter? Tu vise les performances, quelque chose de générique?

                  Quel est la raison du langage? Sans doute dans un but de simplification? Ce qui à de plus complexe en C est sans doute la gestion de la mémoire. Comment sera t'elle gérer? Un Garbage collector? Par RAII? Comptage par référence? Aucune gestion, tout comme le C sans aucune sécurité?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.

                    22 octobre 2015 à 18:28:36

                    Merci EmericV pour ta réponse :)

                    J'ai déjà commencé à coder, mais seulement le système de lecture de ligne, car cela m'empêchait de dormir. J'ai réfléchit aussi à la syntaxe du langage, et notamment au point virgule ';' :colere:: vu que je lis le code ligne par ligne, je peux m'en passer, il faut juste que j'identifie si cette ligne est une instruction  ou non, pour le rajouter à la fin de la ligne dans la transcription en C.

                    En fait, le langage m'importe moins que le compilateur, toutefois je vais suivre vos conseils et ne vais coder que ce qui ne touche pas au langage, à savoir un système de lecture du code et de fichier.

                    Merci pour vos encouragements, ça me fait très plaisir !:D

                    EDIT : Maeiky je n'avais pas vu ton message ! dsl

                    -
                    Edité par jejeleterrible58 22 octobre 2015 à 18:30:11

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                      22 octobre 2015 à 18:35:04

                      Effectivement, mon but "premier" serait de simplifier le langage C, mais le réel objectif de ce programme est de m'améliorer avec les tableaux, pointeurs et chaînes de caractères, en faisant quelque chose qui m'intéresse beaucoup : créer mon propre langage !

                      Pour le nom de ce langage, j'avais pensé à un G ... Tel que Gogol ou Gollum (oui, c'est original :p) ! 

                      Je compte supprimer les ';', '()' et '{}' pour simplifier le code source, au profit de mentions tel que "IF", "WHILE", "DO" (pour les blocs d'instructions) et "END", ...Dîtes-moi ce que vous en pensez !

                      Voici le code que j'ai écrit :

                      MAIN.C
                      
                      #include "main.h"
                      
                      
                      
                      int main(int argc, char **argv){
                      	
                      	atexit(quit);
                      
                      	if(*(argv+1) == NULL){
                      		error(NO_FILE);
                      	}
                      	else{
                      		puts("-> recherche du fichier ...");
                      	}
                      
                      	path = *(argv+1);
                      	file = fopen(path, "r");
                      
                      	if(file == NULL){
                      		error(FILE_NO_EXIST);
                      	}
                      	else{
                      		puts("-> Ouverture du fichier ...");
                      	}
                      
                      
                      	read_line();
                      	strcat(doc[0], c_line);
                      	puts(doc[0]);
                      	puts(c_line);
                      
                      
                      	fclose(file);
                      	return EXIT_SUCCESS;
                      }
                      
                      
                      
                      void read_line(void){
                      
                      
                      	cmptr = 0;
                      
                      	while((c_char = fgetc(file)) != '\n'){
                      
                      		if(c_char == EOF){
                      			break;
                      		}
                      
                      		c_line[cmptr] = c_char;
                      		cmptr++;
                      	}
                      
                      }
                      
                      
                      
                      void quit(void){
                      	puts("-> Exiting ...");
                      }
                      
                      
                      
                      void error(int code){
                      
                      	switch(code){
                      
                      		case NO_FILE:
                      			puts("/X\\ Aucun fichier spécifié !");
                      			exit(EXIT_FAILURE);
                      			break;
                      
                      		case FILE_NO_EXIST:
                      			puts("/X\\ Ce fichier n'existe pas.");
                      			exit(EXIT_FAILURE);
                      			break;
                      
                      		default:
                      			puts("/X\\ Erreur inconnue !");
                      			exit(EXIT_FAILURE);
                      
                      	}
                      
                      }
                      MAIN.H
                      
                      #include <stdlib.h>
                      #include <stdio.h>
                      #include <string.h>
                      
                      
                      
                      /*Constantes : */
                      
                      #define LINE_MAX 121 //nbr de caractères maximum dans une ligne
                      #define COLUMN_MAX 201 
                      
                      #define NO_FILE 1
                      #define FILE_NO_EXIST 2
                      
                      
                      
                      /*Variables : */
                      
                      char *name;						// nom du fichier
                      char *path;						// chemin du fichier
                      FILE *file;						// pointeur vers le fichier
                      unsigned short int nbr_lines;	// nombre de lignes du fichier
                      
                      int cmptr;						// compteur (pour les boucles et autre)
                      char c_line[LINE_MAX];			// la ligne courante (current_line), la ligne lue par le programme
                      char c_char;					// le caractère lue par le programme
                      char doc[COLUMN_MAX][LINE_MAX];	// un tableau à deux dimensions qui contient toutes les lignes du fichier
                      
                      
                      /*Prototypes de fonctions : */
                      
                      
                      /*
                      Fonction qui lit une ligne du code et la récupère, puis la retourne
                      */
                      void read_line(void);
                      
                      
                      /*
                      Fonction appellée à la fin du programme
                      */
                      void quit(void);
                      
                      
                      /*
                      Fonction qui, selon le code d'erreur, affiche le message correspondant et quitte le programme
                      s'il le faut
                      */
                      void error(int code);



                      -
                      Edité par jejeleterrible58 22 octobre 2015 à 20:02:13

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                        22 octobre 2015 à 20:23:40

                        Supprimé les ";", est plutôt un bonne chose, les points virgules permettre seulement d'écrire plusieurs ligne en une seule et de condensé son code, mais c'est difficile par la suite d’y apporter des modifications pour déboguer ou simplement relire le code. Plusieurs langage le mette optionnel, une ligne = une instruction est ce qu'il y a de plus intuitif.

                        Pour les accolade, je ne suis pas d'accord (mais c'est mon avis), car pour moi, plus il y a de mots, plus ça surcharge le code inutilement et complexifie la lecture/écriture. Les accolades permette de bien identifier le scope rapidement et les IDE peuvent facilement les highlighté, ont voit ainsi où elles commence et où est finissent. Mais bon, pour un petit langage ça passe.


                        Pour les parenthèses, je ne voie juste pas comment faire sans :o
                        • Partager sur Facebook
                        • Partager sur Twitter

                        GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.

                        Anonyme
                          22 octobre 2015 à 20:36:33

                          Pour la question des points-virgules, tout est question de goût. J'utilise pas mal Perl, donc forcément, je considère que c'est plutôt un point positif de pouvoir enchaîner plusieurs instructions sur une même ligne, si c'est bien utilisé (Il est vrai que notre code peut facilement difficiel à lire/maintenir si ce point est mal géré.) Un exemple tout con de cas utile :

                          if ... { say 'True !'; $x++; $y--; }
                          #Il est inutile d'écrire plusieurs lignes

                          La syntaxe sur laquelle tu es parti a l'air de ressembler à celle de Ruby :

                          for n in 0..10
                              print n
                          end

                          Je n'en suis pas fan, mais pourquoi pas.

                          Par contre, je vais peut-être me répéter, mais la syntaxe n'est pas le plus important, loin de là ! Le plus important reste la manière dont tu vas gérer tes différentes instructions en interne.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 octobre 2015 à 22:01:44

                            Le fait de pouvoir écrire plusieurs instructions sur une seule ligne est super pratique tant que les instructions sont courtes. J'en utilise à fond au boulot.

                            Après je suis d'accord avec EmericV, le plus important est la gestion des instructions en interne. 

                            Et puis il y a d'autres choses sur lesquelles tu dois réfléchir, comment tu vas gérer tes erreurs ? Est-ce que tu vas faire une prégestion de problèmes (boucles qui va de 2 à -4 avec un incrément positif par exemple) ? 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 octobre 2015 à 10:29:00

                              Pour les erreurs je n'en sais rien du tout! Je gère juste les erreurs fichier !

                              Effectivement je vais garder les points virgules, ça peut être utile, et les accolades "si ça vous fait plaisir".

                              EmericV, pour faire sans parenthèses, il faut rajouter des mots qui les remplaces (j'avais pensé à DO...END) mais ce n'est pas très pratique.C'est pourquoi j'ai décidé de les garder.

                              Je pense que, pour gérer les instructions, il y aura plusieurs étapes :

                              -lecture d'une ligne

                              -repérage du type : instruction ou condition, fonction, boucle

                              -si pas condition fonction boucle (pas mot clé) :

                              -boucle jusqu'à repérage d'un point virgule

                              -interprétation du code lue

                              Voilà, en gros c'est ça que je compte faire !

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                                23 octobre 2015 à 11:46:45

                                A noter qu'existe des outilles comme Lex et Yacc pour ce que tu veux faire, et qui couvrent toutes les étapes nécessaires: analyse lexicale, syntaxique et sémantique du code.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                HackTheCode est une communauté de développeurs francophones http://www.hackthecode.com
                                  23 octobre 2015 à 12:52:49

                                  Tiens ! Hier je me suis inscrit à Hack The Code, et aujourd'hui il vient à moi... C'est cool ! :soleil:

                                  Sinon oui j'en ai entendu parler mais je souhaite le faire sans, parce que je désire m'améliorer sur beaucoup de points en C, et que je n'ai pas envie d'apprendre à me servir de nouveaux outils (j'ai bien assez de mal avec ceux que j'ai déjà ...). Mais merci beaucoup, je m'y pencherais quand j'aurais le temps :)!

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                                    23 octobre 2015 à 13:27:50

                                    Je pense que t'as clairement pas le niveau pour créer un langage. Même si c'est juste pour t’entraîner, tu t'en sortiras mieux avec un autre projet, et ça te fera plus progresser.

                                    D'ailleurs, je doute que pour faire ton "convertisseur", le C soit le meilleur le langage (et j'parle juste pour coder le convertisseur, pas comme langage de destination) ou le plus évident.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      23 octobre 2015 à 14:51:39

                                      Il évident qu'il ne pourra pas créer un langage de toute pièces. Il peut toutefois apprendre pas mal de choses en créant ses petites instructions comme il souhaite le faire, un simple convertisseur (si on peut appeler ça comme ça) vers du code C.

                                      Au fait, tu peux aussi regarder pour réaliser un interpréteur brainfuck par exemple. Ce pourrait être tout aussi éducatif.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 octobre 2015 à 16:30:38

                                        Et c'est ainsi que PHP naquît.

                                        -
                                        Edité par Lymke 23 octobre 2015 à 16:31:10

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Découvre tout le background de leagueoflegends sur omégatheque ! Il y a même des vidéos sur les différents skins, des liens vers les streamers et webtvs les plus connus ! :D
                                          23 octobre 2015 à 16:57:33

                                          Pour le choix du langage, j'ai choisi le C car c'est mon langage favori et celui qui me semble le plus "simple" à convertir. Convertir en Python n'est pas intéressant car c'est un langage interprété, le C++ est plus complexe que le C (système de classe et tout ça...) et le Ruby, comme pour le python. Sinon je ne "maîtrise" aucun autre langage qui me permette de réaliser ce programme.

                                          Grand__Smurf, je ne suis pas contre pour faire un projet plus simple mais... c'est la dèche ! Je n'ai aucune idée de programme plus simple, alors si tu en as, communique-les s'il te plaît !

                                          Sinon ce projet est juste pour apprendre et m'amuser, je me doute bien que je n'irais pas bien loin.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                                            23 octobre 2015 à 17:50:13

                                            jejeleterrible58 a écrit:

                                            Grand__Smurf, je ne suis pas contre pour faire un projet plus simple mais... c'est la dèche ! Je n'ai aucune idée de programme plus simple, alors si tu en as, communique-les s'il te plaît !

                                            Un mastermind, un puissance 4 avec l'ordinateur comme adversaire, un petit logiciel de chat en réseau (en console), un *petit* Zelda/Mario graphique (SDL/CSFML), etc.

                                            Ça n'a pas l'air drôle, mais crois-moi il vaut mieux enchaîner plusieurs petits projets que de se lancer dans un gros, niveau apprentissage :)

                                            Après évidemment moi je ne peux que te suggérer de passer au C++ qui est plus adapté pour ces tâches (un mot: RRID, aussi appelé RAII), mais ça tu fais ce que tu veux.

                                            -
                                            Edité par Lynix 23 octobre 2015 à 22:44:45

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Mes articles | Nazara Engine | Discord NaN | Ma chaîne Twitch (programmation)

                                              23 octobre 2015 à 18:37:01

                                              J'ai déjà essayé d'apprendre le C++, mais son système orienté objet est plus difficile, je préfère celui du Python ! Sinon merci pour les suggestions, je vais y réfléchir.

                                              P.S. : je trouve plus facile de faire mon "convertisseur" qu'un puissance 4 o_O

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
                                                23 octobre 2015 à 21:46:41

                                                jejeleterrible58 a écrit:

                                                P.S. : je trouve plus facile de faire mon "convertisseur" qu'un puissance 4 o_O

                                                C'est que tu n'as pas le recul nécessaire pour pouvoir faire ton convertisseur.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  24 octobre 2015 à 18:37:46

                                                  Rabajoie a écrit:

                                                  C'est que tu n'as pas le recul nécessaire pour pouvoir faire ton convertisseur.


                                                  Je vais écouter ton conseil, merci :)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"

                                                  Un nouveau langage basé sur le C

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown