Casio Basic Web Interpreter
Posté le 29/08/2014 15:06
Je vous présente ici mon projet "Casio Basic Web Interpreter" qui a débuté en 2014 et dont le développement se poursuis encore actuellement.
Il s'agit d'un
interpréteur pour le langage basic des calculatrices Casio.
Le truc c'est que c'est un interpréteur en mode web, le rendu (=écran de la calculatrice) se fait sur un canvas HTML5.
Donc c'est ici =>
Casio Basic Web Interpreter
ATTENTION : ce que je partage avec vous est dans une version "alpha", il manque encore beaucoup de choses...
J'ai mis pleins de programmes en exemple.
En vrac la liste des instructions supportées :
[color1] Plot
[color1] PlotOn
PlotOff
PlotChg
[color1] PxlOn
PxlOff
PxlChg
PxlTest
[color1] Line
[color1] [sketchMode2] F-Line
[color1] [sketchMode2] Horizontal
[color1] [sketchMode2] Vertical
[color1] [sketchMode2] Circle
Plot/Line-Color color1
S-L-Normal
S-L-Dot
S-L-Broken
S-L-Thick
S-L-Normal
S-L-Thin
Cls
ClrText
ClrGraph
BG-Pict
BG-None
StoPict
RclPict
AxesOn
AxesOff
LabelOn
LabelOff
Isz
Dsz
Lbl
Goto
Prog
Return
Stop
Mcl
Range
ViewWindow
Menu
Locate
Text
expr->variable
expr->variableStart~variableEnd
variable
"string"
?->variable
"string"?->variable
Ran#
RanInt#
GetKey
MOD(
Int
Intg
Frac
Deg
Rad
Grad
sin
cos
tan
Rec
Pol
Ans
+
-
*
/
=> (If)
If/Then/Else/IfEnd
<=
>=
=
<> (or !=)
<
>
And/Or/Xor/Not
(expr)
-expr
Do/LpWhile
While/WhileEnd
For/Next
Break
{1,2,3,4}->List n
List n->List m
List Ans
x->Dim List n
Dim List n
Filen
Seq(
x->List n[expr]
List n
List n[expr]
ClrList
ClrList n
Sum list
Prod list
Mean(list
Median(list
Max(list
Min(list
SortA(list
SortD(list
Fill(value,list)
Augment(list,list)
Cuml list
?List list
Percent list
RanInt#(min,max,nb)
RanList#(int)
[[1,2,3][4,5,6]...]->Mat n
Mat n
Mat Ans
{l,c}->Dim Mat n
Dim Mat i
x->Mat n[expr,expr]
Mat n[expr,expr]
Mat n->Mat m
1 color can be Black, Blue, Red, Magenta, Green, Cyan or Yellow
2 sketchMode can be SketchNormal, SketchThick, SketchBroken, SketchDot, SketchThin
Vous trouverez
les sources sur GitHub.
A bientôt.
Krevo_
Citer : Posté le 17/01/2022 17:54 | #
Il est intéressant de voir des choses se développer sur ce sujet.
Notez bien que je n'ai rien contre un fork ... ça apporte son lot de bonnes choses.
Cela me fait penser qu'il faut que je sépare le projet en deux :
- une partie "core"
- une partie "site web exemple".
- Remplacement de rhino par node.js et enlevage du make
- Remplacement de CodeMirror par Monaco (l'éditeur de VS Code)
- Ajout de la coloration syntaxique et de la police de BIDE
- Ajout des onglets
- Un peu de clean dans le index.html (split des programmes chacun dans son fichier)
Les onglets c'est intéressant... à creuser (Il semble se créer des onglets seulement au chargement des programmes exemple.. comment créer un nouvel onglet ? renommer un onglet ? fermer un onglet ?... )
Un autre éditeur que CodeMirror .. pourquoi pas ... quand j'aurais effectivement séparer entre "core" et "site web exemple" on utilisera bien l'éditeur que l'on veut (ou même pas d'éditeur du tout .. par exemple pour une intégration dans un site web)
La police de BIDE ... je suis partagé car je vois que des commentaire style :
# Tentacules
# adapted from Alexot (https://www.planet-casio.com/Fr/compte/voir_profil.php?membre=alexot)
# see https://www.planet-casio.com/Fr/programmes/programme3871-1-Tentacules-alexot-.html"
s'affichent :
# Tentacules
# adapted from Alexot (https:÷÷www.planet-casio.com÷Fr÷compte÷voir_profil.php?membre=alexot)
# see https:÷÷www.planet-casio.com÷Fr÷programmes÷programme3871-1-Tentacules-alexot-.html
Et une instruction comme (dans le programme "Lines", sous-programme "RNDCOLOR") :
Plot/Line-Color
s'affiche
Plot÷Line-Color
Bref, le bon vieux caractère "/" (code ascii 47) s'affiche visuellement comme un symbole division,
Alors qu'il existe un symbole "÷" (code iso8859-1 à 247) qui est très bien pour afficher un symbole division. J'ai d'ailleurs choisis d'ajouter un symbole "÷" sous l'éditeur sous mon site http://basic.crevola.org/ et remplacer les "/" de division (et seulement ceux là) par "÷" dans les programmes d'exemples (comme "IMC", "Calendrier", "Polygon", ..). Je pourrais pursuivre et remplacer aussi les "->" par exemple par un caractère unique de flèche ... j'ai souvent prévu 2 façons de saisir certains caractères dans un code source :
→ ou ->
≥ ou >=
÷ ou /
...
Donc, je vois personnellement pas l'intérêt de la police de caractères de BIDE dans l'éditeur de code.
Pour le clean dans index.html, ça c'est bien car c'est un peu un gros fourre-tout de mon côté. Un site qui utiliserai le "core" peut à loisir proposer sa façon de lister / chercher / charger des programmes d'exemples. J'avais besoin de démontrer par un site web et des programmes d'exemples pré-écrit l'utilisation de l'interpréteur de basic Casio.
Le plus gros du boulot pour moi est tout ce que je n'ai pas encore mis dans le core, et qui fait que tous les programmes se peuvent pas encore s'executer tels quels (à cause d'instructions non supportées).
Après je peux rien promettre en temps que je vais passer sur le projet, donc c'est bien que ce soit public et que vous puissiez en faire ce qui vous intéresse...
Citer : Posté le 17/01/2022 20:25 | #
Cela me fait penser qu'il faut que je sépare le projet en deux :
- une partie "core"
- une partie "site web exemple".
Pas nécessaire selon moi, quand j'aurai fini le refactoring la partie site web et la partie interpréteur seront séparées dans des dossiers différents (enfin ce sera pas des projets complètement différents).
1 chose à la fois à terme oui l'éditeur aura les mêmes fonctionnalités que BIDE.
Quand j'ai fait BIDE j'ai fait le choix d'afficher "/" en tant que "÷" (et également "*" en tant que "×") pour mieux gérer les copier coller depuis internet où là on utilise les caractères "/" et "*". De plus ça voudrait dire que l'éditeur doit remplacer ces caractères lors de la frappe (parce qu'appuyer sur un bouton à chaque fois qu'on veut les utiliser c'est chiant), et si je traite / comme ÷ dans le tokeniseur, ça fait un décalage entre l'affichage dans l'éditeur et l'affichage dans la calculatrice. Pour moi l'URL n'est pas un problème parce que dans les vrais programmes basic il n'y a pas d'url (ici c'est juste parce que c'est des programmes d'exemple) et pour ce "Plot/Line-Color" il faudra juste modifier l'opcode pour qu'il utilise le slash (dans BIDE j'ai fait ça pour l'opcode "ab/c").
Dans tous les cas il faudra utiliser la police de BIDE (ou en tout cas une police custom) car certains caractères basic ne peuvent pas être représentés par un caractère unicode.
→ ou ->
≥ ou >=
Je prévois d'utiliser le tokeniseur de BIDE et il gère les 2 formes de ces caractères en tant qu'équivalentes (y compris dans les strings d'ailleurs).
Yup, et si tu comptes continuer ce projet de l'aide sur cette partie serait la bienvenue
Comment est ce que l'interpréteur gère la mémoire de la calto (variables, files, listes, matrices, pictures, captures, programmes, etc), la gestion des listes/matrices (comment elles sont stockées), les strings, etc ?
J'ai déjà remarqué que les nombres ne sont pas en BCD ce qui peut faire des erreurs d'interprétation (par exemple le fameux 0.1+0.2 != 0.3), il faudra que je les remplace par mes routines de BCD que j'avais faites pour B2C.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 17/01/2022 20:30 | #
Friendly reminder que les syscalls sont pas disponibles, tu n'iras pas loin sans réimplémenter toute l'arithmétique BCD
Citer : Posté le 17/01/2022 20:33 | #
Ouaip mais là y'a pas le C qui me ralentit pour implémenter des algos
Et ça doit facilement être possible en recodant un interpréteur de floating point mais en base 10 (et pour les fonctions compliquées genre racine carrée je passe en float normal pour utiliser les fonctions javascript, c'est surtout pour les opérations de base que c'est important).
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 19/01/2022 19:57 | # | Fichier joint
Pour les problèmes d'arrondis en javascript, pas besoin de réinventer la roue.
.. donc j'ai commité une modif où j'utilise une lib 'js-floating-point' (cf https://www.npmjs.com/package/js-floating-point).
(L'appel à la fonction floatingPointFix(..) se faisant au dernier moment à l'affichage)
Pour résoudre les problèmes du genre :
0.30000000000000004
0.3 - 0.1
0.19999999999999998
1111.11 + 1111.11 + 1111.11 + 1111.11 + 1111.11
5555.549999999999
Donc ça donne (AVANT / APRES) :
Le programme basic est :
Locate 1,2,.2+.1
Locate 1,3,"0.3 - 0.1 = "
Locate 1,4,.3-.1
Locate 1,5,"1111.11(+1111.11){4}="
Locate 1,6,1111.11 + 1111.11 + 1111.11 + 1111.11 + 1111.11
Citer : Posté le 19/01/2022 20:10 | #
Je suis parfaitement d'accord avec "ne pas réinventer la route", et il existe certainement déjà une lib de calcul BCD en JS.
Mais Krevo_, la lib que tu as utilisée là c'est tellement bancal et mal informé que je n'aurais même pas osé la télécharger. Il y a des trucs relativement convaincants comme big.js si ce n'est pour la syntaxe un peu plus lourde, mais le trick représentation décimale + regex qui arrondit à 10 chiffres dans "certaines" situations, erk.
Citer : Posté le 19/01/2022 20:16 | #
C'est en effet sympa pour couvrir 99% des cases j'ai l'impression, en vrai je doute qu'il y ait un programme basic qui bugge après la mise en place de cette lib. (et si ça suffira pas on remplacera juste la lib )
Par contre comment comptes tu gérer les complexes ? Pour moi il faut transformer tous les nombres en un objet contenant "normal" et "imaginary", genre
{
"normal": 123.45,
"imaginary": 6,
}
avec normal/imaginary qui serait à 0.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 19/01/2022 20:49 | #
Je suis parfaitement d'accord avec "ne pas réinventer la route", et il existe certainement déjà une lib de calcul BCD en JS.
Mais Krevo_, la lib que tu as utilisée là c'est tellement bancal et mal informé que je n'aurais même pas osé la télécharger. Il y a des trucs relativement convaincants comme big.js si ce n'est pour la syntaxe un peu plus lourde, mais le trick représentation décimale + regex qui arrondit à 10 chiffres dans "certaines" situations, berk.
Après j'ai regardé Math.js (cf https://mathjs.org/), mais c'était pas mieux..
J'ai voulu faire
(cf le fiddle https://jsbin.com/rinesokadi/edit?html,console,output )
Mais j'ai vu que la fonction print était :
var precision = 14;
document.write(math.format(value, precision) + '
');
(après ça dépend donc de leur fonction "format")
D'ailleurs le mec qui a fait 'js-floating-point' donne un lien vers https://mathjs.org/docs/datatypes/bignumbers.html#roundoff-errors où ils disent ceci :
math.add(0.1, 0.2) // Number, 0.30000000000000004
math.divide(0.3, 0.2) // Number, 1.4999999999999998
// no round-off errors with BigNumbers :)
math.add(math.bignumber(0.1), math.bignumber(0.2)) // BigNumber, 0.3
math.divide(math.bignumber(0.3), math.bignumber(0.2)) // BigNumber, 1.5
(Je changerais de lib peut être plus tard pour Math.js ou big.js ... du coup)
Ajouté le 19/01/2022 à 20:56 :
Par contre comment comptes tu gérer les complexes ?
Je gère pas
Un de mes arguments est que je suis pas tombé sur beaucoup de programmes en ayant besoin.
ça fait partie des nombreux trucs restant à faire.... j'ai jamais dit que j'avais fini..
J'essayais il y a quelques temps de prendre un programme que je voyais ici, d'essayer de l'executer ... ça marchait pas bien sûr, alors je regardais quels instructions (ou syntaxes) je n'avais pas encore implémentés.. des fois c'est simple.... des fois c'est tout un pan à écrire... après j'ai pas beaucoup passé de temps sur ce projet ces 2 dernières années.
Citer : Posté le 19/01/2022 21:13 | #
Ce que tu as observé est correct... math.js te donne de la précision élevée/arbitraire mais c'est toujours en binaire donc le même problème ressort. Le fait que print() soit comme ça n'est pas forcément un problème, la question est sur le format interne. La différence avec big.js dont je parlait tout à l'heure c'est que le format est vraiment décimal.
Ça reste un détail à mon goût ces histoires de précision, mais puisqu'on en parlait voilà.
Citer : Posté le 19/01/2022 21:17 | #
Ça reste un détail à mon goût ces histoires de précision, mais puisqu'on en parlait voilà.
Mais oui, mais c'est très intéressant de parler de ça et d'autres choses ... ça me fait aller lire des trucs et apprendre encore.
Citer : Posté le 19/01/2022 21:24 | #
Je gère pas
Un de mes arguments est que je suis pas tombé sur beaucoup de programmes en ayant besoin.
Ouais je sais que tu gères pas mais est ce que tu avais un truc en tête
Les jeux en particulier aiment bien utiliser des complexes pour stocker des listes de coordonnées, et c'est le genre de truc qu'il faut intégrer à l'architecture le plus tôt possible (comme la décision d'utiliser du flottant / BCD) sinon plus on attend plus ce sera relou à modifier le temps venu
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 19/01/2022 21:30 | #
Ouais je sais que tu gères pas mais est ce que tu avais un truc en tête
Non, mais maintenant je suis chaud sur Maths.js (cf https://mathjs.org/docs/datatypes/complex_numbers.html )
Citer : Posté le 20/01/2022 08:19 | #
J'ai ajouté mon algo de g1m vers json (ça a été assez simple, suffisait de copier coller depuis BIDE et changer la syntaxe) et du coup le programme "tentacules" ainsi que mon puissance 4 est stocké sous forme de g1m (plus exactement g1m encodé en base64 parce que les CORS c'est chiant).
@Admins : est ce qu'il y aurait moyen de modifier les CORS pour que je puisse charger des g1m directement depuis l'interpréteur ?
Krevo : si tu veux des bugs à corriger j'en ai trouvé 2 dans mon puissance 4
- Les caractères unicode ne sont pas tous supportés
- Si je remplace tous les caractères unicode, il fait une erreur "mat is undefined"
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 20/01/2022 09:32 | #
J'ai pas facilement accès à ça (c'est à moitié dans le domaine de Ziqumu) et pour être honnête j'hésite à savoir si c'est une bonne idée. Si l'interpréteur marche bien on pourrait intégrer tes releases directement au site, ça éviterait ce problème.
Citer : Posté le 07/03/2024 15:00 | #
Ce projet est encore en phase de développement? Par ce que ça a l'air top!
Citer : Posté le 07/03/2024 15:06 | #
Bonjour,
Non. De mon côté faudra plus attendre grand chose, par manque de temps.
Citer : Posté le 07/03/2024 16:04 | #
Mais est ce que le principe est là? Genre toutes les commandes sont ici?
Citer : Posté le 07/03/2024 17:13 | #
Ya déjà de quoi s'amuser... mais je ne vais plus rajouter de commandes manquantes.
Citer : Posté le 07/03/2024 17:27 | #
Ok ok, car je voulais faire un site web (quand tous mes projets seront fini) dont tu pouvais faire des programmes BASIC avec des blocks (comme scratch). Donc, tu as utilisé(e) quel(s) language(s), principalement Javascript? Comme ça, je sais avec quoi commencé . Désolé pour toutes les questions ^^'
Citer : Posté le 07/03/2024 19:15 | #
Oui, j'ai utilisé Javascript, mais une partie est généré avec JsCC (Javascript Compiler Compiler) pour l'analyseur syntaxique qui est une grosse partie du projet.
Si tu veux faire un truc avec des blocs, tu seras éventuellement interessé par la bibliothèque Blockly de Google https://developers.google.com/blockly?hl=fr
Citer : Posté le 07/03/2024 19:32 | #
Wow! Merci beaucoup pour le lien que j'en n'avait aucune idée!
Merci de nouveau
Tuper