Hippohmu
:Ouin, il y a qd même des bouts qui ne sont pas sous LGPL
Le fichier distribué par Bernard Parisse contient la partie de la Rom autre que le Cas, sous forme binaire, et qui n'est pas encore libre. (nécessaire pour recompiler la rom!)
En tout cas ce qui serait cool ce serait de faire un compilateur RPL système portable
Un compilateur c'est facile(c'est plutôt un tokenisateur, d'ailleurs)
Le gros morceau, c'est l'interpréteur, c'est à dire la rom Hp dans son ensembleJ'ai déjà réfléchi au problème (pour la diox), et il me semble qu'implémenter un Rpl sur une autre architecture est tout à fait faisable et même facile. C'est juste long. Bien sûr, on n'a pas besoin de reprogrammer le Mo de la rom Hp, en quelques ko on a déjà un système potable. J'avais programmé un mini-RPL sur VTI, ça marchait tout à fait bien!
LizDog :
et qui va s'amuser a porter le cas en GPL en natif ARM ?
Pollux :
Ou en C portable, ce serait encore mieux
Kevin Kofler
:Tu veux mon aide pour un HPGCC?
Pollux :
./111> Clair, ça n'a carrément pas fait pour être portable (cf adresses absolues, etc...) Mais avec un peu de chance ça doit être possible de réutiliser le squelette des routines d'intégration/résolution...
Kevin Kofler :
Et y a-t'il un moyen de faire tourner un émulateur Saturn sous PedroM pour faire tourner le CAS LGPL?
Pollux :
./112> Euh compiler le code RPL sys en code natif, ça m'a pas l'air trivial, par contre...
Kevin Kofler
: Ce n'est que le code de Bernard Parisse qui est sous LGPL (c'est quand-même fort qu'il ait réussi à convaincre HP de lui permettre ça), pas le CAS entier.
Pollux :
Oui, je sais. Mais il n'empêche qu'on n'a pas le droit de redistribuer le reste de la ROM, ça fait un peu tâche
Le compilateur , c'est facile
et l'interpréteur, c'est facile (juste appeler toutes les fonctions les unes à la suite des autres).
Le pb étant de boucher les trous formés par les fonctions Saturn / les fonctions propriétaires...
Ca n'est pas possible! Le Rpl est tokenisé, il n'est pas possible de le compiler efficacement en natif. (Cependant, le Rpl système est par certains côtés d'assez bas niveau et a de bonnes performances - moins que le C, bien sûr)
<a68k> jsr 0x12345 [DUP] jsr 0x23456 [+] jsr 0x34567 </>
<a68k> move.l (a6),-(a6) move.l (a6)+,a0 move.l (a6)+,a1 bsr do_add move.l a0,-(a6) jsr 0x34567 </>
<a68k> move.l (a6)+,a0 move.l a0,a1 bsr do_add bsr internal_version_of_34567_using_a0 </>
Hippohmu :
Je ne vais pas rentrer dans les détails, mais par exemple il n'y a *pas* de programme interpréteur. Comme l'a si bien dit Jean Michel Ferrard, "Le Rpl est un langage tokenisé qui s'auto-interprète".
Ca n'est pas possible! Le Rpl est tokenisé, il n'est pas possible de le compiler efficacement en natif. (Cependant, le Rpl système est par certains côtés d'assez bas niveau et a de bonnes performances - moins que le C, bien sûr)
Hippohmu
:et l'interpréteur, c'est facile (juste appeler toutes les fonctions les unes à la suite des autres).
Non!![]()
Ou en tout cas, si c'est facile, ce n'est sans doute pas comme tu le penses.
L'interprétation du Rpl est faite de façon subtile pour être à la fois puissante et efficace. Je ne vais pas rentrer dans les détails, mais par exemple il n'y a *pas* de programme interpréteur. Comme l'a si bien dit Jean Michel Ferrard, "Le Rpl est un langage tokenisé qui s'auto-interprète".
LizDog
:Pollux
:Ca n'est pas possible! Le Rpl est tokenisé, il n'est pas possible de le compiler efficacement en natif. (Cependant, le Rpl système est par certains côtés d'assez bas niveau et a de bonnes performances - moins que le C, bien sûr)
Si, complètement :
<a68k> move.l (a6)+,a0 move.l a0,a1 bsr do_add bsr internal_version_of_34567_using_a0 </>
Mais :
- jusqu'où faut-il réaliser un compromis performance/taille ? - pour éliminer au maximum les push/pop sur la pile, il faut analyser le graphe des appels de fonctions, voir si la profondeur est constante, regarder le nb d'arguments, etc...
Tu as l'air bien partit, mais sort GTC s'il te plait avan, merci
Pollux :
Mais :
- jusqu'où faut-il réaliser un compromis performance/taille ? - pour éliminer au maximum les push/pop sur la pile, il faut analyser le graphe des appels de fonctions, voir si la profondeur est constante, regarder le nb d'arguments, etc...
Justement, c'est ce que je dis : il n'y a *pas* d'interpréteur. (juste une boucle qui transforme les adresses en "jsr adresse") D'où la trivialité de l'interpréteur, tout le problème étant de convertir _toutes_ les fonctions, y compris les propriétaires.
Hippohmu
:Pollux :
Mais :
- jusqu'où faut-il réaliser un compromis performance/taille ? - pour éliminer au maximum les push/pop sur la pile, il faut analyser le graphe des appels de fonctions, voir si la profondeur est constante, regarder le nb d'arguments, etc...
Ton code ne va pas.
D'abord, il n'apporte rien en performance par rapport à la version tokenisée, et il fait perdre énormément en taille (alors que dans le cahier des charges originel du Rpl, on voulait un langage *compact*).
Mais surtout, ça ne peut pas être considéré comme du vrai Rpl parce que les objets ne sont pas sautables (SKIPables). (Ze principe fondamental du Rpl)
Par exemple, la séquence
"* SKIP DUP + 2 -" doit exécuter la même chose que "* + 2 -". Avec ta méthode, tu ne peux pas implémenter une instruction SKIP correcte, qui marche dans tous les contextes.
La compilation du Rpl est amha indécidable, sauf si on a recours à une solution triviale qui ne fait que "mimer" la tokenisation.
Justement, c'est ce que je dis : il n'y a *pas* d'interpréteur. (juste une boucle qui transforme les adresses en "jsr adresse") D'où la trivialité de l'interpréteur, tout le problème étant de convertir _toutes_ les fonctions, y compris les propriétaires.
Non.
car ici tu fais tomber ZE other grand principe du Rpl, qui est que dans le programme, un objet peut être inclus de façon directe (son contenu est là) ou de façon indirecte (seul une adresse pointant vers l'objet est là), et qu'à tous les niveaux du langage, cette distinction est transparente (en particulier, SKIP traite les deux cas indifféremment).
Pollux
: On peut analyser statiquement si on a besoin ou non de SKIP, et si on en a besoin (en dehors du cas des boucles, qu'on peut traiter de manière efficace) on peut laisser du RPL système normal...
Bah non, il y a plein de cas (fonctions feuilles, notamment) où on peut largement améliorer les choses.
Comment ça, SKIP traite les deux cas indifférement ?
A mon avis, SKIP => { instr=*ptr++, ptr+=inclusion_directe(instr)?*ptr:0 }, non?
Et ça se résoud statiquement aussi, comme plus haut.
Pollux
: Oui, si tu décides de mettre le if (skip) en dehors de la fonction, alors c'est équivalent à ma solution (ptr += machin). Dans le cas contraire, tu es obligé de recopier toute la fonction... (s'il y a des regs à sauvegarder, c'est impossible)
Kevin Kofler :
_Bool skip_next_instruction=FALSE;
...
void add(void) {
if (skip_next_instruction) {skip_next_instruction=FALSE;return;}
...
}
...