Better Basic Casio : Un langage intermédiaire pour le peuple
Posté le 05/05/2020 11:37
Bonjour
J'ai une nouvelle idée de projet que j'aimerai mettre en route : un "traducteur" d'une syntaxe custom vers le Basic Casio de nos chères calculatrices. J'aime beaucoup programmer en Basic Casio, mais je pense que changer sa syntaxe un poil sans impact sur la performance et le résultat final serait bon pour le futur du langage
Ce que j'aimerai faire :
Des fichiers textes .bc pour l'ordinateur écrits avec une meilleure syntaxe que le Basic Casio.
Un "convertisseur" de fichiers BC (Better/Basic Casio) vers .g1m en ligne de commande pour plus de liberté côté utilisateur.
Compabilité complète ou presque.
Raccourcis utiles pour augmenter la lisibilité. (tels que +=, -=...)
Pour la syntaxe, j'ai déjà quelques idées :
Remplacer la flèche → par le signe
=.
Inclusion d'autres fichiers avec INCLUDE (voir plus bas).
Appel d'autres fichiers avec DO (voir plus bas).
Le projet n'est pas encore en cours, je note tout ici pour garder une trace !
Voici à quoi pourrait ressembler un code .bc et son output (exemple) :
//main.bc
#name PICKABOO
#pass HEHE
List 1 = {5, 6, 7}
B = 0
For A = 1 To 5 Step 2
Locate A, 1, A
B += 1
Next
#INCLUDE "example.bc"
//example.bc
Locate 1, 2, B
//PICKABOO.g1m (exemple)
{5,6,7→List1
0→B
For 1→A To 5 Step 2
Locate A,1,A
B+1→B
Next
Locate 1,2,B
Je noterai les changements ici, je vais me renseigner sur les .g1m.
Si vous avez des remarques, idées, suggestions... je suis tout ouïe
J'espère que j'aurai été clair ^^'
Citer : Posté le 06/05/2020 09:40 | #
Note bien que si tu restes au niveau lexical/regex sans parser toute une classe de modifications de syntaxe sera inaccessible. Après tant que ça suffit, tu fais comme tu veux...
Citer : Posté le 06/05/2020 10:05 | #
Oui je m'en suis rendu compte hier. J'y ai réfléchi, faudra bien passer par ça pour obtenir tout ce que je souhaite ^^'
Question : le préprocesseur agit avant toute la machinerie que tu as décrite plus tôt ou durant ?
Je suppose avant mais avec un gros doute.
Merci encore
Citer : Posté le 06/05/2020 10:13 | #
Hmm, le préprocesseur agit conceptuellement avant. En pratique, le préprocesseur contient un lexer pour faire son job. Mais oui, il agit avant.
Dans ton cas, tu n'as pas l'air d'avoir besoin de préprocesseur.
Citer : Posté le 06/05/2020 10:22 | #
Si ça agit avant alors je peux le remettre à plus tard
Merci, je vais me concentrer cette semaine à choisir les outils que j'utiliserai.
Ajouté le 07/05/2020 à 12:22 :
Je noterai le progrès que je fais au jour le jour pour éviter de laisser tomber le projet
Merci Lephé pour l'aide, cela m'est très utile
Le lexer fonctionne bien (merci PLY), la syntaxe ressemble à cela pour le moment :
for i = 1 to 5
locate 1, i, "Bonsoir Paris !"
next
Je demande votre avis sur la syntaxe, pensez-vous qu'il serait mieux d'avoir une majuscule au début des commandes ? d'autres suggestions ?
L'Odyssée de l'Espace
Citer : Posté le 07/05/2020 12:36 | #
Il faudrait des parenthèses avec chaque fonction, pour la consistance.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 07/05/2020 12:43 | #
Pas de majuscule selon moi c'est pas vraiment utile.
La syntaxe me semble plus correcte comme ça ! Une syntaxe plus C pour les conditions ? Genre :
A = 6
for i = 1 to 7
{
if i != 7
{
locate 1, i, "Bonsoir PC !"
}
else
{
locate 1, 1, "i trop grand !"
break
}
}
C'est peut-être plus clair que de devoir mettre des if, ifEnd / For, Next ou While, WhileEnd comme en Basic ?
Après je sais pas, on peut penser à une gestion de l'indentation à la python, comme ça pas besoin d'accolades et le code est quand même clair. Tout en enlevant les IfEnd etc
Une idée pour les variables, en Basic on a un nombre de variable maximum. Travailler avec des If A=5 dans un code assez long, on peut facilement perdre la signification derrière celle-ci.
Pouvoir mettre un texte à la place d'une variable, qui va être (après compilation) changée vers une lettre possible ça peut être sympa ! Je m'explique :
if variable = 6
{
}
del variable
Après compilation va donner
If A=5
Then
IfEnd
0→A
C'est peut être étrange, mais pourquoi pas ?
Après c'est mon avis ! Le principe c'est d'essayer de rendre ça le plus simple possible non ?
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 07/05/2020 12:46 | #
Des macros donc
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 07/05/2020 13:15 | #
Il faudrait des parenthèses avec chaque fonction, pour la consistance.
+1. +2. +3. C'est tout.
Je demande votre avis sur la syntaxe, pensez-vous qu'il serait mieux d'avoir une majuscule au début des commandes ? d'autres suggestions ?
À mon avis si tu veux décoller pour de vrai du Basic Casio tu dois introduire une notion de fonctions utilisateur. Et dans ce cas le nommage deviendra un problème, et je suggérerai de garder les noms originaux des fonctions Basic Casio autant que possible, casse comprise.
Pouvoir mettre un texte à la place d'une variable, qui va être (après compilation) changée vers une lettre possible ça peut être sympa !
Attention ce problème cache une allocation de registres qui est un truc très sympa à étudier mais qui devient compliqué quand il y a beaucoup de variables dans un programme. Ça devient plus facile si tu demandes explicitement au programmeur de dire où chaque variable est stockée (des « macros » comme dit Zezombye), mais c'est hyper pas pratique.
Mon avis à deux balles : commence par définir la sémantique de ton langage. La sémantique c'est toutes les fonctionnalités du langage indépendamment de la syntaxe, comme :
• Y a-t-il des fonctions utilisateurs ?
• Peut-on nommer les variables autrement que A-Z ?
• Si oui, doit-on spécifier manuellement la correspondance avec A-Z ou le compilo en trouve-t-il une tout seul ?
Plus tu vas t'éloigner du Basic et plus tu auras besoin que ce soit fait proprement. Le seul défaut que je trouve à C.Basic c'est d'avoir une sémantique pas hyper claire, ce qui fait que beaucoup de fonctionnalités s'expriment par des rajouts successifs sur la syntaxe qui finissent par être un peu difficiles à contrôler.
Citer : Posté le 07/05/2020 14:04 | #
Il faudrait des parenthèses avec chaque fonction, pour la consistance.
Je suis plutôt d'accord.
Une syntaxe plus C pour les conditions ? Genre :
A = 6
for i = 1 to 7
{
if i != 7
{
locate 1, i, "Bonsoir PC !"
}
else
{
locate 1, 1, "i trop grand !"
break
}
}
C'est peut-être plus clair que de devoir mettre des if, ifEnd / For, Next ou While, WhileEnd comme en Basic ?
Après je sais pas, on peut penser à une gestion de l'indentation à la python, comme ça pas besoin d'accolades et le code est quand même clair. Tout en enlevant les IfEnd etc
Je n'aime pas trop, les délimiteurs sont importants en Basic, je préfère les laisser tel quels.
Une idée pour les variables, en Basic on a un nombre de variable maximum. Travailler avec des If A=5 dans un code assez long, on peut facilement perdre la signification derrière celle-ci.
Pouvoir mettre un texte à la place d'une variable, qui va être (après compilation) changée vers une lettre possible ça peut être sympa ! Je m'explique :
if variable = 6
{
}
del variable
Après compilation va donner
If A=5
Then
IfEnd
0→A
J'aime bien l'idée, mais pas sous cette forme. Je préférerai définir des aliases pour les variables, et peut-être quelques temporaires qui fonctionneraient de la façon que tu décris
À voir.
À mon avis si tu veux décoller pour de vrai du Basic Casio tu dois introduire une notion de fonctions utilisateur. Et dans ce cas le nommage deviendra un problème, et je suggérerai de garder les noms originaux des fonctions Basic Casio autant que possible, casse comprise.
Ça me semble intéressant, je suppose que ce serait basé sur Prgm ? Je vais rétablir la casse.
Pouvoir mettre un texte à la place d'une variable, qui va être (après compilation) changée vers une lettre possible ça peut être sympa !
Attention ce problème cache une allocation de registres qui est un truc très sympa à étudier mais qui devient compliqué quand il y a beaucoup de variables dans un programme. Ça devient plus facile si tu demandes explicitement au programmeur de dire où chaque variable est stockée (des « macros » comme dit Zezombye), mais c'est hyper pas pratique.
C'est toujours en réflexion là-dessus.
Mon avis à deux balles : commence par définir la sémantique de ton langage. La sémantique c'est toutes les fonctionnalités du langage indépendamment de la syntaxe, comme :
• Y a-t-il des fonctions utilisateurs ?
• Peut-on nommer les variables autrement que A-Z ?
• Si oui, doit-on spécifier manuellement la correspondance avec A-Z ou le compilo en trouve-t-il une tout seul ?
Plus tu vas t'éloigner du Basic et plus tu auras besoin que ce soit fait proprement. Le seul défaut que je trouve à C.Basic c'est d'avoir une sémantique pas hyper claire, ce qui fait que beaucoup de fonctionnalités s'expriment par des rajouts successifs sur la syntaxe qui finissent par être un peu difficiles à contrôler.
Je vais réfléchir à ça.
On en discute sur la shout, pour le moment ce serait un mélange d'auto et de manuel →
compteur : A //compteur est lié à `A`
compteur : auto //variable assignée automatiquement
compteur //en implicite
nom : Str 10 //nom est lié à `Str 10`
nom : Str auto //string assignée automatiquement
nom : Str //implicite
Citer : Posté le 07/05/2020 22:12 | #
Pour ma compréhension du projet, quel est son apport quand on a BIDE pour coder en Basic sur PC (Open Source), un SDK si on veut un langage plus poussé comme le C, qu'on peut coder sur CASIO ou qu'on a C.Basic pour avoir du Basic performant avec une syntaxe un peu différente ?
Si c'est purement un défi technique je comprends !
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 08/05/2020 03:46 | #
C'est un langage de haut niveau pour le basic, qui du coup se compile en basic, et n'a donc pas de dépendance supplémentaire à installer (au contraire de cbasic).
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 08/05/2020 09:25 | #
Accessoirement, au niveau méta cela donne un précédent sur le forum à la façon propre de jouer avec des langages (peu importe ce que KikooDX choisira de faire), qui n'est pas totalement évidente mais bien "réglementée".
Citer : Posté le 08/05/2020 10:37 | #
Comme l'a dit ZZ, c'est un langage qui compilera vers du Basic Casio "pur". Le but est de faciliter le développement en Basic Casio pour les gros projets (qui deviennent très durs à gérer sur le long terme).
Edit : on peut aussi considérer cela comme un défi technique, mais je me suis lancé pour le but utilitaire.
Ajouté le 08/05/2020 à 11:19 :
Pour la syntaxe, je pense partir là-dessus niveau définition de variables :
Str nom_joueur
Var xp
Var x(X), y(Y)
Var key
Var play
Mat map
x = 11
y = 4
play = 1 #true
While(play)
key = Getkey()
If key == KEY_EXIT Then play = 0 IfEnd
WhileEnd
del play #free the assignated Var
Les parenthèses permettent de forcer une assignation. Ça me semble bien ? Il n'y aurait pas de constantes, je pense que les macros suffiront.
Pour les fonctions, je suis à moitié convaincu par les majuscules (j'ai tapé if then la première fois).
Vous pourriez remarquer le KEY_EXIT, ça me semble assez essentiel d'avoir des aliases sur le long terme. Mais ce n'est qu'un exemple.
Ici, la condition fait une ligne. Je suppose que ce serait réduit à ⇒ en pratique.
Citer : Posté le 08/05/2020 11:33 | #
Ça a l'air pas trop mal. Tu auras besoin d'une sorte d'allocation de registres pour associer automatiquement des variables aux noms que tu as définis, mais tu peux toujours faire le truc naïf et pas t'embêter.
Un petit résumé des changements sémantiques ?
Citer : Posté le 08/05/2020 11:44 | #
Qu'est-ce qui sépare la sémantique de la syntaxe ? Que comporte la sémantique ? J'ai essayé mais j'ai du mal à voir ce que je dois expliquer et à quel niveau.
Citer : Posté le 08/05/2020 14:13 | #
La sémantique, c'est les fonctionnalités du langage. La syntaxe, c'est la forme que prend le texte qui utilise ces fonctionnalités.
Par exemple, "conditions" c'est de la sémantique, "If .. Then .. IfEnd" c'est de la syntaxe.
Autre exemple, "nommer des alias de variables" c'est de la sémantique, "Var x(X)" c'est de la syntaxe.
De même, "nommer des variables assignés automatiquement à A..Z" c'est de la sémantique, "Var x" c'est de la syntaxe.
Citer : Posté le 08/05/2020 14:20 | #
Compris merci
J'essaierai de récapituler cela demain.
Citer : Posté le 17/05/2020 14:18 | #
@Kikoodx
This is a very useful project for building Basic Casio (including C.Basic) programs on the PC.
I hope that this will make progress.
@Lephenixnoir
I think the lack of clarity in the semantics of C.Basic was not a good language design from the beginning.
In the beginning, it was a fast compatible language than the genuine Basic Casio.
I think it lost that clarity as we expanded the features one after the other later on.
Now it's basically a language that's not much different from assembler.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 17/05/2020 15:27 | #
I think the lack of clarity in the semantics of C.Basic was not a good language design from the beginning.
In the beginning, it was a fast compatible language than the genuine Basic Casio.
I think it lost that clarity as we expanded the features one after the other later on.
Now it's basically a language that's not much different from assembler.
This is a fair analysis. By nature Casio Basic is not a very powerful language since it lacks functions, local storage, and actual data structures such as arrays (which makes many things such as bitmaps and VRAM access basically impossible). So it's expected that you would stray away from it.
Have you considered writing a tutorial on how to use advanced C.Basic features? I think C.Basic users mainly write Casio Basic programs, so they do not use the full power of your interpreter. Having translated the manual, I have a rough idea of the features, but it's not an easy read for someone who justs wants to make their game faster.
Citer : Posté le 17/05/2020 15:36 | #
hmm
Pourquoi pas juste faire var x=1, y=2 ?
Les parenthèses ça devrait être réservé pour les fonctions.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 17/05/2020 15:44 | #
Tu as mal compris la partie sur les parenthèses, Var ma_valeurassigne(A) assigne ma_valeur à A par exemple.