π
<-
Chat plein-écran
[^]

EdesLang : Nouveau langage oncalc en développement

Assembleur, Axe, C/C++, ICE...

EdesLang : Nouveau langage oncalc en développement

Message non lude Bobb » 19 Mar 2022, 21:10

Bonjour à tous,

Aujourd'hui j'ai décidé de vous présenter mon nouveau gros projet : un langage de programmation codé en C très simple nommé EdesLang que je compte adapter pour Ti-83 Premium Ce dès que je pourrais. Pour l'instant, il fonctionne pour les entrées/sorties standard de la bibliothèque stdio. D'ailleurs, si vous connaissez des algorithmes qui convertissent des double en char* et inversement, je suis preneur, parce que d'après ce que j'ai compris, je ne pourrais pas utiliser sscanf et snprintf dans la version pour calculatrice.


(Ce sujet n'est plus d'actualité, le projet a évolué, et allez plutôt voir : https://tiplanet.org/forum/viewtopic.php?f=12&t=26122&view=unread#unread)

Pour l'instant, je suis à la fin de la "calculatrice" du langage, qui permet de calculer des expressions.

Voici ce qu'elle supporte :

-> Tous types de calculs, booléens, nombres et chaînes de caractères.


Exemples :
Code: Tout sélectionner
>>> 1==3-2 and 18/9==2

True

>>> ("salut" + " ")*5

"salut salut salut salut salut "

>>> "coucou" - "ou"

"cc"

>>> "bonjour" - 1

"bonjou"

>>> "EdesLang" // 2

"Edes"

>>> 89 //6

14

>>> 89 % 6

5

>>> 6*14+5
89

>>> not True

False


-> Création de variables simples

Exemples :
Code: Tout sélectionner
>>> a=18-(45*2)

-72

>>> a

-72

>>> chaine = "coucou"

"coucou"

>>> chaine

"coucou"

>>> chaine + " les amis"

"coucou les amis"

>>> chaine += "les copains"

"coucoules copains"

>>> chaine

"coucoules copains"

>>> a *= 56

-4032

>>> a

-4032

>>> nombre = 100

100

>>> nombre -= 50

50

>>> nombre

50



-> Création de listes

Exemples :
Code: Tout sélectionner
>>> maListe = [1,2,"un","deux"]

[1, 2, "un", "deux"]

>>> maListe[1]

2

>>> maListe = ["hey","comment","ca","va","?"]

["hey", "comment", "ca", "va", "?"]

>>> maListe

["hey", "comment", "ca", "va", "?"]

>>> maListe2 = maListe

["hey", "comment", "ca", "va", "?"]



-> Utilisation de fonctions

Exemples :
Code: Tout sélectionner
>>> a=[1,2,3]

[1, 2, 3]

>>> append(a,4,5,6)

[1, 2, 3, 4, 5, 6]

>>> a

[1, 2, 3, 4, 5, 6]

>>> b=["un", "deux", "trois"]

["un", "deux", "trois"]

>>> remove(b,1)

["un", "trois"]

>>> b

["un", "trois"]

>>> insert(b,"deux",1)

["un", "deux", "trois"]

>>> b

["un", "deux", "trois"]

>>> reponse = input("Comment vous appelez-vous ? ")

Comment vous appelez-vous ? Bobb

"Bobb"

>>> reponse

"Bobb"

>>> age = input("Votre age ? ")

Votre age ? 17

"17"

>>> age=nbr(age)

17

>>> age++

18

>>> reponse = "Bobb"

"Bobb"

>>> age=18

18

>>> b=["un","deux","trois"]

["un", "deux", "trois"]

>>> print(age, reponse, b)

18 Bobb ["un", "deux", "trois"]

>>> type(b)

"Liste"

>>> type(reponse)

"Texte"

>>> type(age)

"Nombre"

>>> agestr=str(age)

"18"

>>> len(b)

3

>>> len(reponse)

4

>>> maChaine = "123456789"

"123456789"

>>> maChaine2 = sub(maChaine, 1, len(maChaine))

"23456789"



-> Référencement / déréférencement de variables

Exemples :
Code: Tout sélectionner
>>> 5 -> "variable"

5

>>> variable

5

>>> &variable

"variable"

>>> nomVariable = &variable

"variable"

>>> :nomVariable

5

>>> 45 -> nomVariable

45

>>> :nomVariable

45

>>> variable

45

Cela permet de créer / modifier des variables à partir de leur nom sous forme de chaîne de caractères.


C'est un ajout par rapport à Python, mais sinon, la syntaxe des expressions est quasiment identique.


Je vous transmets le fichier .exe d'EdesLang. Vous pouvez ainsi le tester et m'indiquer toutes les erreurs que vous voyez. Testez tout ce qui est syntaxiquement correct et qui est censé fonctionner, et rapportez-moi ce qui ne marche pas. Si vous n'êtes pas sur Windows, voici le lien permettant d'accéder au programme en ligne et à son code source.


Bon courage, et merci d'avance !
Fichiers joints
EdesLang.zip
Vous y trouverez le code source si vous voulez y jeter un coup d'oeil ou le compiler vous-même ; et un exécutable windows.
(70.68 Kio) Téléchargé 36 fois
Dernière édition par Bobb le 23 Mar 2023, 21:07, édité 1 fois.

Tous mes programmes sont disponibles ici

↳ Testez mon simulateur Android sur Ti-83 Premium CE et / ou Édition Python
Jetez un coup d'oeil à mon langage de programmation interprété Neon.

Image
Avatar de l’utilisateur
BobbProgrammeur
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 94.5%
 
Messages: 300
Inscription: 19 Avr 2020, 12:37
Localisation: Morbihan
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: CPGE MPI

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude Bobb » 19 Mar 2022, 21:20

Postez à la suite de ce topic toutes vos remarques ou les bugs que vous trouvez.

Tous mes programmes sont disponibles ici

↳ Testez mon simulateur Android sur Ti-83 Premium CE et / ou Édition Python
Jetez un coup d'oeil à mon langage de programmation interprété Neon.

Image
Avatar de l’utilisateur
BobbProgrammeur
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 94.5%
 
Messages: 300
Inscription: 19 Avr 2020, 12:37
Localisation: Morbihan
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: CPGE MPI

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude jean-baptiste boric » 19 Mar 2022, 23:51

J'ai regardé rapidement le projet, voici mes remarques:

D'ordre général:
  • L'archive ne contient pas de README ou de documentation sur le projet.
  • L'archive ne contient pas de système de build, j'ai dû improviser pour obtenir un exécutable sur Linux.
  • L'usage d'un système de gestion de versions permettrait de tracer l'historique du projet, son hébergement en ligne permettrait d'inspecter le code en ligne sans devoir télécharger et extraire une archive zip (et également d'avoir une sauvegarde en ligne évitant les déconvenues d'une panne ou erreur de manipulation).
  • Le projet ne dispose pas de tests (unitaires, intégration, anti-régression, fuzzing...) permettant de s'assurer du bon fonctionnement de l'interpréteur.
  • Le langage de programmation n'a pas de spécifications (grammaire notamment).

Sur l'architecture du code:
  • Le langage C n'autorise pas la définition multiple de symboles identiques à l'échelle d'un programme, j'ai dû déplacer les déclarations à l'intérieur de headers.h vers un fichier C et déclarer toutes ces variables en extern pour que l'exécutable puisse être linké sur mon système.
  • Sauf cas d'usage le justifiant, il vaut mieux éviter les variables globales dans un programme ; l'état de l'interpréteur pourrait être encapsulé dans une structure pour le découpler du programme et éventuellement le déplacer vers une bibliothèque.
  • Même s'il est traditionnel d'utiliser des chaînes de caractères délimitées par NULL en C, il est plus efficace d'utiliser des chaînes de caractères connaissant leur longueur, cela permet par exemple d'en faire des sous-chaînes en réutilisant une partie de la chaîne d'origine ou encore de ne pas recalculer en permanence avec strlen() la longueur d'une chaîne. Malheureusement, c'est une pratique plutôt rare en C et de plus mal supportée par la bibliothèque standard.
  • L'architecture classique d'un interpréteur lexe son programme en entrée en tokens, construit un arbre de syntaxe avec un parser et exécute cet arbre via un parcours. Le programme est bien découpé dans ces grandes étapes (fonctions cut, calcPriorities et calc), mais les algorithmes et structures de données sont peu conventionnels (l'arbre de syntaxe n'est pas un arbre mais une liste de tokens et une liste de priorités). C'est pas rédhibitoire, mais ça rend le code plus compliqué et difficile à suivre que nécessaire.

Sur des bugs (exécuté avec Valgrind):
Code: Tout sélectionner
Bienvenue dans la calculatrice d'EdesLang. Entrez une expression.
>>> print(3)
3
==4237== Conditional jump or move depends on uninitialised value(s)
==4237==    at 0x1104F7: printRes (termfonc.c:49)
==4237==    by 0x1105A5: terminal (termfonc.c:91)
==4237==    by 0x10E492: main (main.c:555)
==4237==
==4237== Conditional jump or move depends on uninitialised value(s)
==4237==    at 0x11051B: printRes (termfonc.c:53)
==4237==    by 0x1105A5: terminal (termfonc.c:91)
==4237==    by 0x10E492: main (main.c:555)
==4237==
>>> len("a
18446744073709551616
>>> nbr("
==4634== Invalid read of size 8
==4634==    at 0x1095B3: _nbr_ (builtinfonc.c:95)
==4634==    by 0x10D24B: traiterOperande (main.c:301)
==4634==    by 0x10DDFE: calc (main.c:497)
==4634==    by 0x110592: terminal (termfonc.c:88)
==4634==    by 0x10E492: main (main.c:555)
==4634==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==4634==
==4634==
==4634== Process terminating with default action of signal 11 (SIGSEGV)
==4634==  Access not within mapped region at address 0x0
==4634==    at 0x1095B3: _nbr_ (builtinfonc.c:95)
==4634==    by 0x10D24B: traiterOperande (main.c:301)
==4634==    by 0x10DDFE: calc (main.c:497)
==4634==    by 0x110592: terminal (termfonc.c:88)
==4634==    by 0x10E492: main (main.c:555)
==4634==  If you believe this happened as a result of a stack
==4634==  overflow in your program's main thread (unlikely but
==4634==  possible), you can try to increase the size of the
==4634==  main thread stack using the --main-stacksize= flag.
==4634==  The main thread stack size used in this run was 8388608.
==4634==
==4634== HEAP SUMMARY:
==4634==     in use at exit: 120 bytes in 12 blocks
==4634==   total heap usage: 7,799 allocs, 7,787 frees, 590,925 bytes allocated
==4634==
==4634== LEAK SUMMARY:
==4634==    definitely lost: 0 bytes in 0 blocks
==4634==    indirectly lost: 0 bytes in 0 blocks
==4634==      possibly lost: 0 bytes in 0 blocks
==4634==    still reachable: 120 bytes in 12 blocks
==4634==         suppressed: 0 bytes in 0 blocks
==4634== Rerun with --leak-check=full to see details of leaked memory
==4634==
==4634== For lists of detected and suppressed errors, rerun with: -s
==4634== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)


Je dirais que c'est un prototype fonctionnel, ce qui est déjà très bien, mais que le manque d'expérience et de recul mènent à des choix architecturaux et une implémentation qui vont rendre le projet difficile à maintenir et à améliorer à moyen terme (dette technique). Je recommande de lire un tutoriel sur l'écriture d'un interpréteur ou d'un compilateur pour partir sur des bases plus saines, notamment vis-à-vis de l'arbre syntaxique.

De manière plus subjective, je dirais aussi que le langage C était un bon langage système dans les années 70 mais que sa date d'expiration est largement dépassé (trop simpliste, trop de bords coupants, bibliothèque standard anémique, outillage standard inexistant) ; conseiller un remplaçant est délicat, mais je pense que Zig bien qu'encore jeune est fait sur mesure pour les programmeurs C fatigués des limitations du C.
Avatar de l’utilisateur
jean-baptiste boricPremium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 4.5%
 
Messages: 374
Inscription: 21 Déc 2015, 22:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
GitHub: boricj

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude Bobb » 20 Mar 2022, 18:54

Ok, merci pour toutes ces remarques.
Pour la plupart des remarques, réponse : normal je suis débutant.
-> Je ne sais pas comment on met en place un système de build, pourrais-tu m'expliquer ?
-> Pour le README ou la doc, je ferais quelque chose ultérieurement, en même temps que re-commenter le programme pour qu'il soit beaucoup plus clair à lire.
-> Pour les tests, même chose, peux-tu m'expliquer en quoi cela consiste ?

-> Pour les déclarations, ok je vais les mettre dans un autre fichier c ; et pour les variables globales, comment pourrais-je faire sans utiliser de variables globales ?
-> Pour les chaînes de caractères, c'est vrai, j'y ai déjà pensé, et peut-être que je vais me décider à faire comme avec mes listes ; des structures avec la longueur dedans.
-> Sinon, pour la manière dont j'ai décidé de programmer cela, j'ai bien conscience que ce n'est certainement pas la meilleur manière d'implémenter un interpréteur, mais en débutant que je suis, je me suis simplement lancé le défi de créer un petit interpréteur simple
, sans me prendre la tête à créer un interpréteur "professionnel". Ma trop petite expérience en C m'a aussi empêché de comprendre et d'utiliser yacc et lex (ou bison et flex). C'est pour ça que je suis parti sur un algorithme assez simple à comprendre pour moi, mais pas forcément optimal, je le reconnais volontiers.

La gestion des erreurs de tous types, à commencer par la syntaxe sera entièrement prise en charge plus tard, pas de problème là-dessus.

Sinon, pour le langage, tu me conseillerais de passer au C++ ?

Tous mes programmes sont disponibles ici

↳ Testez mon simulateur Android sur Ti-83 Premium CE et / ou Édition Python
Jetez un coup d'oeil à mon langage de programmation interprété Neon.

Image
Avatar de l’utilisateur
BobbProgrammeur
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 94.5%
 
Messages: 300
Inscription: 19 Avr 2020, 12:37
Localisation: Morbihan
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: CPGE MPI

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude jean-baptiste boric » 20 Mar 2022, 19:53

Bobb a écrit:-> Je ne sais pas comment on met en place un système de build, pourrais-tu m'expliquer ?

Un système de build se charge de générer des artefacts (programmes, manuel, bibliothèques...) à partir d'un ensemble de sources. La solution de base serait un Makefile (même remarque que le C, ça sent bon les années 70 mais pour un petit projet c'est suffisant), il existe plein d'autres systèmes avec chacun leurs avantages et inconvénients. Un système de build évolué offre un cycle de vie logiciel complet, de la compilation à la release en passant par les tests.
Bobb a écrit:-> Pour les tests, même chose, peux-tu m'expliquer en quoi cela consiste ?

Une suite de tests est un programme visant à vérifier le bon fonctionnement d'un programme ou bibliothèque via des tests:
  • Un test unitaire vérifie le bon fonctionnement d'une fonction seule. On l'appelle avec des valeurs d'entrée (paramètres) et on vérifie que les valeurs de sortie (retours, structures en mémoire, effets de bords...) sont corrects.
  • Un test d'intégration vérifie le bon fonctionnement d'un programme de bout en bout. Pour un interpréteur par exemple, cela revient à exécuter des scripts et vérifier que la sortie est identique à une trace d'exécution attendue.
  • Un test anti-régression vérifie qu'un comportement d'une fonction ou d'un programme sur un point particulier est correct. En général, c'est un test unitaire ou d'intégration écrit suite à un bug et il veille à ce qu'il n'est pas réintroduit par la suite (régression).
Pour le C y'a pas vraiment d'outillage standard pour faire ça. On peut également implémenter un moteur de tests soi-même, les plus basiques pouvant tenir en une vingtaine de lignes.
Bobb a écrit:-> Pour les déclarations, ok je vais les mettre dans un autre fichier c ; et pour les variables globales, comment pourrais-je faire sans utiliser de variables globales ?

En C, la solution serait de mettre toutes ces variables globales dans une structure et de passer cette structure à toutes les fonctions publiques de l'interpréteur. Les fonctions privées de l'interpréteur peuvent ne pas avoir besoin de cette structure en entier, elles peuvent se passer directement des variables temporaires par exemple si c'est pertinent.
Bobb a écrit:Sinon, pour le langage, tu me conseillerais de passer au C++ ?

Ca dépend de tes besoins (quelles fonctionnalités de langage? quelles plateformes? quelles bibliothèques? quel outillage?) et de tes envies, y'a pas de bonne réponse toute faite. Pour moi, le C est un langage daté, simpliste, bourré de pièges pour le programmeur et partiellement responsable d'un gros paquet de failles de sécurité depuis des décennies, mais beaucoup de gros projets sont menés avec (le noyau Linux notamment) et il est... utilisable... si on a une hygiène de développement absolument irréprochable.

Dans le tas des alternatives possibles (langages compilés sans garbage collection pouvant plausiblement tenir dans une calculatrice), j'ai déjà mentionné Zig, on peut citer Rust, C++, D, Ada... Je conseillerais de regarder Zig en premier car c'est vraiment pensé comme un remplaçant au langage C (voir https://ziglang.org/learn/why_zig_rust_d_cpp/ pour plus de détails sur sa philosophie), alors que C++, Rust ou D sont des langages de plus haut niveau et aussi plus complexes à maîtriser.
Avatar de l’utilisateur
jean-baptiste boricPremium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 4.5%
 
Messages: 374
Inscription: 21 Déc 2015, 22:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
GitHub: boricj

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude Bobb » 21 Mar 2022, 07:23

OK merci, je vais donc jeter un coup d'oeil vers le Zig.

jean-baptiste boric a écrit:Dans le tas des alternatives possibles (langages compilés sans garbage collection pouvant plausiblement tenir dans une calculatrice), j'ai déjà mentionné Zig, on peut citer Rust, C++, D, Ada... Je conseillerais de regarder Zig en premier car c'est vraiment pensé comme un remplaçant au langage C.


Il y a un compilateur Zig pour la CE ?

Tous mes programmes sont disponibles ici

↳ Testez mon simulateur Android sur Ti-83 Premium CE et / ou Édition Python
Jetez un coup d'oeil à mon langage de programmation interprété Neon.

Image
Avatar de l’utilisateur
BobbProgrammeur
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 94.5%
 
Messages: 300
Inscription: 19 Avr 2020, 12:37
Localisation: Morbihan
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: CPGE MPI

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude Adriweb » 21 Mar 2022, 12:07

Nope, C ou C++ uniquement (mais tout récent, c'est basé sur le dernier LLVM). (Sinon, va falloir adapter une frontend llvm :P)

D'ailleurs, il va y avoir une nouvelle release bientôt avec pas mal de nouvelles améliorations sympas (une grosse PR a été mergé hier notamment pour le support des 64bit)
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.2%
 
Messages: 14614
Images: 1218
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude jean-baptiste boric » 21 Mar 2022, 17:11

La toolchain CE ne gère nativement que C/C++, donc si l'objectif est de ne pas se prendre la tête c'est effectivement les deux principaux et seuls choix. J'ai des réserves sur le C++ comme langage de débutant car il est extrêmement vaste, que son historique et son héritage C permettent d'adopter de mauvaises habitudes sans s'en rendre compte (surtout en étant autodidacte) et que les développeurs ont plutôt tendance à en maîtriser des morceaux que de réellement le comprendre dans son ensemble.

Si on est un peu plus aventurier, le backend ez80 expérimental de LLVM permettrait en théorie d'utiliser n'importe quel langage le ciblant, mais ça va demander du travail pour faire fonctionner ça. D'un autre côté, rien n'empêche non plus de prototyper dans un langage "facile" sur ordinateur avant de le transcrire dans un autre plus corsé pour cibler une calculatrice, surtout si on écrit quelque chose d'assez compliqué comme un interpréteur.
Avatar de l’utilisateur
jean-baptiste boricPremium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 4.5%
 
Messages: 374
Inscription: 21 Déc 2015, 22:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
GitHub: boricj

Re: EdesLang : Nouveau langage oncalc en développement

Message non lude Bobb » 22 Mar 2022, 06:45

Par exemple en ce moment je suis en train de programmer en un nouveau lexer plus rapide et plus performant en python, et une fois fini, je n'aurais plus qu'à le traduire en C sans trop me prendre la tête.

Le python est pratique pour ce genre de choses puisqu'il n'est pas compliqué et qu'on ne peut pas trop faire des "grosses erreurs" comme je fais parfois en C avec la gestion de mémoire par exemple.

Tous mes programmes sont disponibles ici

↳ Testez mon simulateur Android sur Ti-83 Premium CE et / ou Édition Python
Jetez un coup d'oeil à mon langage de programmation interprété Neon.

Image
Avatar de l’utilisateur
BobbProgrammeur
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 94.5%
 
Messages: 300
Inscription: 19 Avr 2020, 12:37
Localisation: Morbihan
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: CPGE MPI


Retourner vers Langages alternatifs

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 12 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1169 utilisateurs:
>1141 invités
>23 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)