Pollux :
Ce n'est pas une très bonne idée de faire un convertisseur Basic -> C :
* le code C va être énorme
Vrai, pour l'instant le type variant cause un overhead de 5000 bytes a peu près. Bon c'est pas optimisé, mais ça augure mal, je suis d'accord.
Pollux
* apparemment, tu ne vas pas faire d'approximation genre "toutes les variables sont des entiers 16 (ou 32) bits", donc ça va limiter énormément ce que tu peux gagner
Effectivement, les Variant numériques sont des float, dont la manipulation est assez lente, mais tout de même beaucoup plus rapide qu'en basic interprété. Cependant, on peut déclarer une variable comme étant d'un type C particulier. Ex :
New titi As long
Pollux
(à moins de faire une analyse statique de type assez coton) donc "While x<y:x+1->x:EndWhile" sera transformé en "while (CompareVariant(x,y)<0) x=AddVariant(x,CreateInteger(1));", ce qui fait que tu perds vraiment tout le bénéfice du C : si c'est juste pour que ton code C ressemble à des "jsr CompareVariant", "jsr AddVariant" et "jsr CreateInteger", alors ce sera probablement aussi efficace en tps et plus efficace en vitesse de passer par un tableau qui va contenir 42 (index de CompareVariant), 61 et 17, parce que ça prendra 3 octets au lieu de 12 (voire 18 si tu fais des offsets absolus) [et encore, je ne compte pas le code de passage des arguments] pour un gain en vitesse vraiment négligeable; à vrai dire tu vas même avoir encore d'autres bonnes surprises si tu passes en bytecode, notamment le fait que tu n'as pas à stocker les adresses de retour sur la pile mais dans un registre, etc...
En effet compareVariant(x,y) existe et c'est peu performant. Là dessus c'est exacte qu'un programme Power Basic ne peut pas se comparer à un programme C ou Moka. Cependant, le gain de vitesse viendra de la compilation au lieu de l'interprétation. En appelant directement la fonction compareVariant, je crois qu'il y a un gain considérable par rapport à parser cela :
x < y
Comme je suis pas callé en assembleur (j'ai fais un peu d'assembleur MVS, c'est loin du motorola 68K), j'ai pas très bien suivi tes explications au sujet du tableau pour les comparaisons.
Pollux
* ce qui sera important, ce ne sera pas tellement le code C généré, mais plutôt la manière dont tu vas allouer tes variables (eh oui, tu vas passer ton tps dans des fonctions d'allocation et de libération), et la qualité de ta bibliothèque de fonctions...
Allocation strictement statique de mémoire (les tableaux peuvent être redimensionnés, cependant), pas très puissant, adieux les
totoFunc([[12, 44][543,7]])
mais c'est rapide.
Pollux
Moi je crois que le fait de générer du code C, ça va juste faire des progs énormes, et ça va t'encourager à ajouter des limitations arbitraires (par exemple, matrices statiques : c le genre de truc tout con mais qui va casser plein de progs qui utilisent seq, ajouter des limites hardcodées, augmenter la consommation en RAM, augmenter le risque d'erreur si on oublie de transformer un "->" en StoMat... bref on ne pourra pas profiter de l'énorme bibliothèque de progs existante)
Je ne crois pas que le Power Basic ait une quelconque utilité pour un programmeur C ou Java. Le 'public' visé est les programmeurs basic qui veulent compiler des programmes plus rapides.
Pollux
Bon, tu vas me dire qu'on peut rajouter des déclarations de type explicites et que le code va alors être plus efficace; à la limite, ce que tu peux faire, c'est faire un bloc Native..NativeEnd qui dit que dans ce bloc, toutes les fonctions appelées seront compilées en C... (et dans le bytecode, il y aura juste un tag pour dire d'appeler ce code). Mieux : ça te permettra de faire un compilo on-calc qui, s'il n'y a pas de compilo C, fait comme si les Native..NativeEnd étaient absents
Comme dit dans un post précédent, un bloc Native...EndNative est déjà implémenté. Pour l'instant, je ne prévois pas porter le convertisseur on calc, mais je serais plus que contant si quelqu'un voullait le faire.
Merci pour vos commentaires, je vais poster un alpha d'ici ce soir (heure du Québec), comme ça vous pourrez avoir une meilleure idée de ce qui a été fait. Je sais que plusieurs d'entre vous sont d'excellent programmeurs et que la plupart d'entre vous connaissent mieux l'ASM ou TIGCC que moi. Ce projet est open source, donc si quelqu'un veut y participer, il est le bienvenue.