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 ) 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 , 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
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
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).
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
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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 "()".
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
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
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é?
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
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 ';' : 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 !
EDIT : Maeiky je n'avais pas vu ton message ! dsl
- Edité par jejeleterrible58 22 octobre 2015 à 18:30:11
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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 ) !
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 !
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
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
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.
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) ?
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 !
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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.
Tiens ! Hier je me suis inscrit à Hack The Code, et aujourd'hui il vient à moi... C'est cool !
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 !
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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.
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.
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
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.
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
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.
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
Un jour, un compatriote nommé Rubi m'a dit : "Mieux vaut perdre que gagner"
C'est que tu n'as pas le recul nécessaire pour pouvoir faire ton convertisseur.
Je vais écouter ton conseil, merci
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.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
Mes articles | Nazara Engine | Discord NaN | Ma chaîne Twitch (programmation)