1

J'ai commencé à écrire un compilateur depuis qq temps déjà, et pour le moment la tokenisation est quasi parfaite, bien qu'avec une gestion des erreurs 'limitée' (mais c facilement extensible vu que c'est du C++). Mais comme je n'ai jamais écrit de compilateur avant (et je n'ai jamais fait de théorie des langages ou quoi que ce soit, vu que je suis en Terminale), je me demandais quelle était la meilleure façon de procéder pour l'analyse du code (construction de l'arborescence des namespaces, classes, structures, etc...), qui vient après la tokenisation. Après avoir réfléchi qq temps, j'en suis arrivé à deux méthodes de procéder qui toutes deux nécéssitent plus qu'une passe:
- La première méthode, celle que j'avais imaginé en premier, il y a assez longtemps, c'était de construire une arborescence du code très complète, contenant les namespaces, les classes ainsi que leurs membres (y compris les variables locales privées, publiques, protégées), puis dans une seconde passe, d'analyser le code en lui-même, et comme l'arborescence a été construite, on peut facilement détecter les appels de fonctions invalides, les types non définis, etc...
- La deuxième méthode est similaire, mais on analyse aussi le code dans la première passe, en vérifiant au maximum la validité des appels de fonctions et la validité des types, sachant que l'arborescence n'est pas totalement construite, et dans une seconde passe, qui peut être effectuée durant la compilation (ce qui n'est pas possible, puisqu'il faudra aussi optimiser), on s'occupe de la résolution de type et de surcharge.
J'aimerais savoir ce que vous pensez de ces deux méthodes, laquelle est la meilleure, et si vous en avez une encore meilleure à proposer smile
Voilà pour la première question
Ensuite, pour avoir un langage correct, il faut évidemment une bibliothèque standard, donc le compilateur devra pouvoir créer des librairies, ce n'est pas réellement un problème, même si je ne sais pas encore comment gérer tout ça (c à d comment stocker les infos de type, et tout...). Mais la librairie standard devra posséder des fonctions d'accès à la mémoire, ce qui ne serait pas possible en compilant en compilant en basic. J'ai donc pensé à créer un assembleur 68k spécial pour la compilation objet, mais en y réfléchissant bien, cela se révélait quasi-impossible, puisque la gestion des l'héritage, des surcharges, etc (sans parler du stockage des informations de types) est quasi-impossible en assembleur. A ce moment là, j'ai pensé à un pseudo assembleur, qui gererait tout ce qui était nécéssaire tel que l'appel de fonctions dans les classes ou, la sécurité des types, qui se transformerait très facilement en n'importe quel assembleur (m68k, x86), ce qui pourrait être utilisé pour la compilation basic et même pour compiler d'autres langages. Le pseudo assembleur ressemblerait quelque peu à ça:
.namespace System
.class Memory, public, fixed

.function Peek(long addr), byte, shared, public, overload
.local result, byte
mov result,[addr]
ret result
.endfunction

.function Peek(long addr), short, shared, public, overload
.local result, short
mov result,[addr]
ret result
.endfunction

.function Peek(long addr), long, shared, public, overload
.local result, long
mov result,[addr]
ret result
.endfunction

.procedure Copy(long dest, long src, long length), shared, public
.local jumptable, long
.local rc_addr, long
mov jumptable,[$C8]
mov rc_addr,[jumptable+($264*4)]
push length
push src
push dest
jsr [rc_addr]
.endprocedure

.endclass
.endnamespace
Il va sans dire que la conversion en assembleur natif serait très optimisée...
C'est peut-être un peu ambitieux comme projet (tongue), mais qu'en pensez vous ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

2

demande à Pollux, il devrait connaître ce genre de trucs smile
il s'appellera comment ? GVC ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

3

Du VB sur calculatrices?! C'est déjà lent sur PC! Alors sur calculatrices, ça craint carrément... sick

Et pour ton "pseudo-assembleur", je ne vois pas l'intérêt d'écrire les instructions 68k avec la syntaxe Intel. roll Et puis il faut que tu indiques la taille de tes opérandes quelque part. La syntaxe Intel le fait dans les opérandes, sur 68k, ça se fait normalement à la fin des codes d'instructions.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

Bon déjà, avant de penser à comment implémenter le compilo (passes & co), il faudrait déjà savoir ce que tu veux qu'il te génère.
1. Garbage collector ? Si tu fais sans, tu vas vite te retrouver limité, et ce sera difficile de faire autre chose que des petits progs de démo (memory leaks...)
2. Compilo JIT ? (laught) Non, je rigole (encore que, ça doit être relativement faisable ^^), mais attends-toi qd même à ce que le code généré soit GROS si tu stockes un binaire. Et si tu veux implémenter toutes les capacités de réflexion, ça peut aider d'avoir un bytecode à portée de main
3. Pourquoi VB ? C#, ça powa carrément plus...
4. Qu'est-ce que tu comptes générer en sortie ? Code intermédiaire "maison" (pb : trouver un backend -> très long de faire un optimiseur efficace, plus les problèmes de portage); code intermédiaire standardisé (bytecode Java, langage intermédiaire .NET) -> peut-être un peu lourd pour une TI (mais c p-ê la solution la plus simple si on veut implémenter tout le langage sans avoir une surprise qui fait que 70% du code est à réécrire); code source C (extrêmement portable, p-ê légers pbs de flexibilité par rapport à .NET et Java [pas de manipulations avancées de la pile, par exemple] et au niveau des exceptions, mais je ne saurais pas vraiment t'en dire plus).

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

Kevin Kofler :
Du VB sur calculatrices?! C'est déjà lent sur PC! Alors sur calculatrices, ça craint carrément... sick

Le pb fondamental, c la taille (ou la consommation en RAM dans le cas de JIT ou de précompilation), pas la vitesse.

(#couic# et c'est moi qui dit ça à Kevin? #eek#)
Et pour ton "pseudo-assembleur", je ne vois pas l'intérêt d'écrire les instructions 68k avec la syntaxe Intel. roll Et puis il faut que tu indiques la taille de tes opérandes quelque part. La syntaxe Intel le fait dans les opérandes, sur 68k, ça se fait normalement à la fin des codes d'instructions.

Il parle d'un code indépendant de la plate-forme, donc il utilise l'ordre qu'il veut roll Et si y avait un Kevin Kofler du x86, j'ose pas imaginer le résultat neutral

Euh et à propos de la taille des opérandes, il met des informations de type dans son langage intermédiaire...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

6

<SARCASM>C'est sûr que [$C8] est carrément indépendant de la plateforme... roll</SARCASM>
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

Et alors? La structure peut-être commune à plusieurs plateformes, sans que le code intermédiaire soit portable... Ce qui effectivement n'empêche que c pas forcément une bonne idée de décrire les ROM_CALLs à un niveau aussi bas, mais ce n'est pas le même problème.

(et t pas obligé de mettre des gros <SARCASM> à chaque fois que tu fais de l'ironie...)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

Pollux
: Et alors? La structure peut-être commune à plusieurs plateformes, sans que le code intermédiaire soit portable...

Alors autant utiliser du vrai code 68k (ou quelque chose qui y ressemble) plutôt que du x86-like...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

gol

Tu sais, avoir une structure commune, ça peut avoir des avantages au niveau simplicité roll Par exemple, ce qui fait que le code intermédiaire n'est pas portable peut parfaitement être dans le code de l'API... C'est d'ailleurs le cas ici embarrassed

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

Kevin > Nan mais si tu penses à VB6... C'est lent uniquement parce que c'est fait sur une base m*rdique. Si ça se trouve VB.NET est plus rapide que VB6 (et de mémoire, en ayant vu la tronche de l'ASM x86 généré pour les deux, c'est fort possible).
Pollux :
Bon déjà, avant de penser à comment implémenter le compilo (passes & co), il faudrait déjà savoir ce que tu veux qu'il te génère. 1. Garbage collector ? Si tu fais sans, tu vas vite te retrouver limité, et ce sera difficile de faire autre chose que des petits progs de démo (memory leaks...)
Je n'avais pas réelement pensé à implémenter ça (et puis je suis pas encore à ce stade), mais il y a des chances pour que je l'eusse fait un équivalent sans m'en rendre compte cheeky
2. Compilo JIT ? (laught) Non, je rigole (encore que, ça doit être relativement faisable ^^), mais attends-toi qd même à ce que le code généré soit GROS si tu stockes un binaire. Et si tu veux implémenter toutes les capacités de réflexion, ça peut aider d'avoir un bytecode à portée de main
Compilo JIT -> Non, certainement pas smile
Pour la réflexion, j'y ai pensé il y a quelque temps, mais je pense que c'est possible de s'en passer (A la limite pour les typeof, j'utiliserai une structure qui donnera l'id de type (tant qu'a faire, celui attribué pdt la compilation), et les types hérités, ça ne devrait pas prendre trop de place
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)
4. Qu'est-ce que tu comptes générer en sortie ? Code intermédiaire "maison" (pb : trouver un backend -> très long de faire un optimiseur efficace, plus les problèmes de portage); code intermédiaire standardisé (bytecode Java, langage intermédiaire .NET) -> peut-être un peu lourd pour une TI (mais c p-ê la solution la plus simple si on veut implémenter tout le langage sans avoir une surprise qui fait que 70% du code est à réécrire); code source C (extrêmement portable, p-ê légers pbs de flexibilité par rapport à .NET et Java [pas de manipulations avancées de la pile, par exemple] et au niveau des exceptions, mais je ne saurais pas vraiment t'en dire plus).
Ben, en sortie, du code natif prêt à être exécuté, en ce qui concerne les programmes, et pour les librairies (il en faudra, c'est certain), je ne sais pas si je transformerai le pseudo-assembleur en bytecode (ça permettrait éventuellement certaines optimisations pour le 'linking') ou si je compilerai nativement, tout en gardant les infos de type (faut pouvoir utiliser la librairie après)
Pollux
:
Kevin Kofler :
Du VB sur calculatrices?! C'est déjà lent sur PC! Alors sur calculatrices, ça craint carrément... sick

Le pb fondamental, c la taille (ou la consommation en RAM dans le cas de JIT ou de précompilation), pas la vitesse.

(#couic# et c'est moi qui dit ça à Kevin? #eek#)
Euh, la vitesse est quand même importante sur TI... Et puis bon, si tu présentes ton programme sans réellement utiliser les fonctionnalités 'objet' du language (en gros une classe avec toutes les procédures shared, c à d un module en VB), ben ça devrait quand même être relativement rapide
Et pour ton "pseudo-assembleur", je ne vois pas l'intérêt d'écrire les instructions 68k avec la syntaxe Intel. roll Et puis il faut que tu indiques la taille de tes opérandes quelque part. La syntaxe Intel le fait dans les opérandes, sur 68k, ça se fait normalement à la fin des codes d'instructions.

Il parle d'un code indépendant de la plate-forme, donc il utilise l'ordre qu'il veut roll Et si y avait un Kevin Kofler du x86, j'ose pas imaginer le résultat neutral
Euh et à propos de la taille des opérandes, il met des informations de type dans son langage intermédiaire...
oui Quand j'ai pensé à un pseudo assembleur (après avoir imaginé un asm 68k peuplé de directives barbares, et m'ettre rendu compte, que de tt façon, l'asm natif est incompatible avec la POO), je voulais faire un truc simple pour que ça ne soit pas trop dur, et en me basant sur le jeu d'instruction du motorola, et il est apparu que: a) On ne peut pas utiliser de registres dans un pseudo assembleur pour POO parce que si on le fasait ça baisserait les performances (sauvegarde de tous les registres pour l'appel d'une fonction, et en plus on est pas assuré que le SP soit valide neutral) et aussi que ça le rendrait trop spécifique, et ainsi impossible à porter (ARM trilove) b) Mettre des suffixes de taille c'était plutôt barbare, et qu'avec les déclarations de variables locales, ça devenait quasi inutile (et en plus ça fairait de la redondance, et le code deviendrait quasi-inoptimisable)

^^ Oui, "optimisable" parce que je n'ai pas l'intention de faire une conversion linéaire
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

11

GoldenCrystal
: Kevin > Nan mais si tu penses à VB6... C'est lent uniquement parce que c'est fait sur une base m*rdique. Si ça se trouve VB.NET est plus rapide que VB6 (et de mémoire, en ayant vu la tronche de l'ASM x86 généré pour les deux, c'est fort possible).

Comment tu fais pour voir l'ASM x86 généré par le JIT .NET ? confus
Pollux :
Bon déjà, avant de penser à comment implémenter le compilo (passes & co), il faudrait déjà savoir ce que tu veux qu'il te génère. 1. Garbage collector ? Si tu fais sans, tu vas vite te retrouver limité, et ce sera difficile de faire autre chose que des petits progs de démo (memory leaks...)
Je n'avais pas réelement pensé à implémenter ça (et puis je suis pas encore à ce stade), mais il y a des chances pour que je l'eusse fait un équivalent sans m'en rendre compte cheeky

Euh il faut qd même y penser sérieusement... Ca peut énormément augmenter la taille des progs, et c pas franchement trivial...
Est-ce que tu comptes faire du comptage de référence (mais alors il va y avoir plein de progs qui vont foirer : on a vite fait de faire des références mutuelles de classes, et puis en plus ça va être très inefficace niveau taille du code) ou un vrai GC (plus compliqué à implémenter, et nbrx compromis entre vitesse et fluidité)
2. Compilo JIT ? (laught) Non, je rigole (encore que, ça doit être relativement faisable ^^), mais attends-toi qd même à ce que le code généré soit GROS si tu stockes un binaire. Et si tu veux implémenter toutes les capacités de réflexion, ça peut aider d'avoir un bytecode à portée de main
Compilo JIT -> Non, certainement pas smile

Après tout, ce n'est pas forcément une si mauvaise idée... Avec un bon bytecode (mais dépendant de plateforme), ça devrait pouvoir se faire.
Pour la réflexion, j'y ai pensé il y a quelque temps, mais je pense que c'est possible de s'en passer (A la limite pour les typeof, j'utiliserai une structure qui donnera l'id de type (tant qu'a faire, celui attribué pdt la compilation), et les types hérités, ça ne devrait pas prendre trop de place

C pourtant assez important comme feature... Et les attributs?
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)

Plus complexe que VB ? hum Je pense pas, surtout si tu as fait du C++.
Pollux
:
Kevin Kofler :
Du VB sur calculatrices?! C'est déjà lent sur PC! Alors sur calculatrices, ça craint carrément... sick

Le pb fondamental, c la taille (ou la consommation en RAM dans le cas de JIT ou de précompilation), pas la vitesse.

(#couic# et c'est moi qui dit ça à Kevin? #eek#)
Euh, la vitesse est quand même importante sur TI...

Oui, mais si les routines critiques sont des routines genre graphiques en C ou en ASM, ce n'est pas trop un pb si le code est 1.5x plus lent...
Et puis bon, si tu présentes ton programme sans réellement utiliser les fonctionnalités 'objet' du language (en gros une classe avec toutes les procédures shared, c à d un module en VB), ben ça devrait quand même être relativement rapide

Oui, évidemment.
Et pour ton "pseudo-assembleur", je ne vois pas l'intérêt d'écrire les instructions 68k avec la syntaxe Intel. roll Et puis il faut que tu indiques la taille de tes opérandes quelque part. La syntaxe Intel le fait dans les opérandes, sur 68k, ça se fait normalement à la fin des codes d'instructions.

Il parle d'un code indépendant de la plate-forme, donc il utilise l'ordre qu'il veut roll Et si y avait un Kevin Kofler du x86, j'ose pas imaginer le résultat neutral
Euh et à propos de la taille des opérandes, il met des informations de type dans son langage intermédiaire...
oui Quand j'ai pensé à un pseudo assembleur (après avoir imaginé un asm 68k peuplé de directives barbares, et m'ettre rendu compte, que de tt façon, l'asm natif est incompatible avec la POO), je voulais faire un truc simple pour que ça ne soit pas trop dur, et en me basant sur le jeu d'instruction du motorola, et il est apparu que: a) On ne peut pas utiliser de registres dans un pseudo assembleur pour POO parce que si on le fasait ça baisserait les performances (sauvegarde de tous les registres pour l'appel d'une fonction, et en plus on est pas assuré que le SP soit valide neutral) et aussi que ça le rendrait trop spécifique, et ainsi impossible à porter (ARM trilove) b) Mettre des suffixes de taille c'était plutôt barbare, et qu'avec les déclarations de variables locales, ça devenait quasi inutile (et en plus ça fairait de la redondance, et le code deviendrait quasi-inoptimisable)

^^ Oui, "optimisable" parce que je n'ai pas l'intention de faire une conversion linéaire[/cite]
Mais après on peut imaginer que la conversion bytecode -> ASM soit suffisamment simple pour faire un JIT...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

12

Pollux:
GoldenCrystal
: Kevin > Nan mais si tu penses à VB6... C'est lent uniquement parce que c'est fait sur une base m*rdique. Si ça se trouve VB.NET est plus rapide que VB6 (et de mémoire, en ayant vu la tronche de l'ASM x86 généré pour les deux, c'est fort possible).

Comment tu fais pour voir l'ASM x86 généré par le JIT .NET ? confus
C'est possible avec Visual Studio .NET happy Il suffit d'afficher l'onglet assembleur, et tu verras... (par contre mieux vaux ne pas le laisser ouvert si tu ne t'en sert pas parce que ça fait bugger les onglets au bout de qq débogages triso)
Pollux :
Bon déjà, avant de penser à comment implémenter le compilo (passes & co), il faudrait déjà savoir ce que tu veux qu'il te génère. 1. Garbage collector ? Si tu fais sans, tu vas vite te retrouver limité, et ce sera difficile de faire autre chose que des petits progs de démo (memory leaks...)
Je n'avais pas réelement pensé à implémenter ça (et puis je suis pas encore à ce stade), mais il y a des chances pour que je l'eusse fait un équivalent sans m'en rendre compte cheeky

Euh il faut qd même y penser sérieusement... Ca peut énormément augmenter la taille des progs, et c pas franchement trivial...
Est-ce que tu comptes faire du comptage de référence (mais alors il va y avoir plein de progs qui vont foirer : on a vite fait de faire des références mutuelles de classes, et puis en plus ça va être très inefficace niveau taille du code) ou un vrai GC (plus compliqué à implémenter, et nbrx compromis entre vitesse et fluidité)
Ben je pensais à du comptage de références, mais je regarderai comment marche un vrai GC pour voir si c'est envisageable
2. Compilo JIT ? (laught) Non, je rigole (encore que, ça doit être relativement faisable ^^), mais attends-toi qd même à ce que le code généré soit GROS si tu stockes un binaire. Et si tu veux implémenter toutes les capacités de réflexion, ça peut aider d'avoir un bytecode à portée de main
Compilo JIT -> Non, certainement pas smile

Après tout, ce n'est pas forcément une si mauvaise idée... Avec un bon bytecode (mais dépendant de plateforme), ça devrait pouvoir se faire.
Hmm, le problème est la taille de toutes les métadonnées (parce que bytecode sans métadonnées ça n'a pas d'intérêt) + la taille du bytecode qui est énorme. Autant sur PC la taille est minime par rapport à un exécutable standard, autant sur TI la différence de taille se sentirait, mais en sens inverse.
Pour la réflexion, j'y ai pensé il y a quelque temps, mais je pense que c'est possible de s'en passer (A la limite pour les typeof, j'utiliserai une structure qui donnera l'id de type (tant qu'a faire, celui attribué pdt la compilation), et les types hérités, ça ne devrait pas prendre trop de place

C pourtant assez important comme feature... Et les attributs?
Les attributs, faut voir, ça c'est jouable, mais bon, ça fait qd même des métadonnées à stocker neutral
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)

Plus complexe que VB ? hum Je pense pas, surtout si tu as fait du C++.
C'est certain que je pourrais apprendre vite, vu les similitudes C#-C++, mais je ne me suis jamais penché là dessus, puisque le VB est relativement satisfaisant.
Pollux
:
Kevin Kofler :
Du VB sur calculatrices?! C'est déjà lent sur PC! Alors sur calculatrices, ça craint carrément... sick

Le pb fondamental, c la taille (ou la consommation en RAM dans le cas de JIT ou de précompilation), pas la vitesse.

(#couic# et c'est moi qui dit ça à Kevin? #eek#)
Euh, la vitesse est quand même importante sur TI...

Oui, mais si les routines critiques sont des routines genre graphiques en C ou en ASM, ce n'est pas trop un pb si le code est 1.5x plus lent...
Et puis bon, si tu présentes ton programme sans réellement utiliser les fonctionnalités 'objet' du language (en gros une classe avec toutes les procédures shared, c à d un module en VB), ben ça devrait quand même être relativement rapide

Oui, évidemment.
Et pour ton "pseudo-assembleur", je ne vois pas l'intérêt d'écrire les instructions 68k avec la syntaxe Intel. roll Et puis il faut que tu indiques la taille de tes opérandes quelque part. La syntaxe Intel le fait dans les opérandes, sur 68k, ça se fait normalement à la fin des codes d'instructions.

Il parle d'un code indépendant de la plate-forme, donc il utilise l'ordre qu'il veut roll Et si y avait un Kevin Kofler du x86, j'ose pas imaginer le résultat neutral
Euh et à propos de la taille des opérandes, il met des informations de type dans son langage intermédiaire...
oui Quand j'ai pensé à un pseudo assembleur (après avoir imaginé un asm 68k peuplé de directives barbares, et m'ettre rendu compte, que de tt façon, l'asm natif est incompatible avec la POO), je voulais faire un truc simple pour que ça ne soit pas trop dur, et en me basant sur le jeu d'instruction du motorola, et il est apparu que: a) On ne peut pas utiliser de registres dans un pseudo assembleur pour POO parce que si on le fasait ça baisserait les performances (sauvegarde de tous les registres pour l'appel d'une fonction, et en plus on est pas assuré que le SP soit valide neutral) et aussi que ça le rendrait trop spécifique, et ainsi impossible à porter (ARM trilove) b) Mettre des suffixes de taille c'était plutôt barbare, et qu'avec les déclarations de variables locales, ça devenait quasi inutile (et en plus ça fairait de la redondance, et le code deviendrait quasi-inoptimisable)

^^ Oui, "optimisable" parce que je n'ai pas l'intention de faire une conversion linéaire
Mais après on peut imaginer que la conversion bytecode -> ASM soit suffisamment simple pour faire un JIT...
Le problème c'est la limitation de mémoire surtout.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

13

GoldenCrystal
: Kevin > Nan mais si tu penses à VB6... C'est lent uniquement parce que c'est fait sur une base m*rdique. Si ça se trouve VB.NET est plus rapide que VB6 (et de mémoire, en ayant vu la tronche de l'ASM x86 généré pour les deux, c'est fort possible).

Le VB.NET, ce n'est plus du VB. grin
Le vrai VB, c'est VB1-VB6. Ils ont tout changé dans VB.NET, la compatibilité est presque inexistante. Alors qu'entre VB4, VB5 et VB6, le code s'échange assez facilement dans les 2 sens.
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)

Le VB est très complexe. Regarde le genre de trucs qui sont censés fonctionner en VB:
123+"456" -> 579
123&"456" -> "123456"
"456"+123 -> "456123"
"456"&123 -> "456123"
0+"456"+"123" -> 579
0+("456"+"123") -> 456123
CLng("456")+123 -> 579
CLng("456")+"123" -> 579
"123"+CLng("456") -> "123456"
...
La conversion automatique des types est très complexe. C'est une des raisons fondamentales de la lenteur du VB. Et contrairement au C, les règles de promotion ne sont pas symétriques: c'est la première opérande qui décide le type du résultat, pas celle de type le plus large.
et pour les librairies (il en faudra, c'est certain), je ne sais pas si je transformerai le pseudo-assembleur en bytecode (ça permettrait éventuellement certaines optimisations pour le 'linking') ou si je compilerai nativement, tout en gardant les infos de type (faut pouvoir utiliser la librairie après)

Linke le programme statiquement quand tu es encore en ta représentation intermédiaire, et convertis le tout en natif une fois le linking terminé.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

Pollux
: Est-ce que tu comptes faire du comptage de référence (mais alors il va y avoir plein de progs qui vont foirer : on a vite fait de faire des références mutuelles de classes, et puis en plus ça va être très inefficace niveau taille du code) ou un vrai GC (plus compliqué à implémenter, et nbrx compromis entre vitesse et fluidité)

Le vrai VB utilise un refcount.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

GoldenCrystal :
C'est possible avec Visual Studio .NET happy Il suffit d'afficher l'onglet assembleur, et tu verras... (par contre mieux vaux ne pas le laisser ouvert si tu ne t'en sert pas parce que ça fait bugger les onglets au bout de qq débogages triso)

OK, j'avais pas vraiment cherché non plus ^^
Euh il faut qd même y penser sérieusement... Ca peut énormément augmenter la taille des progs, et c pas franchement trivial...
Est-ce que tu comptes faire du comptage de référence (mais alors il va y avoir plein de progs qui vont foirer : on a vite fait de faire des références mutuelles de classes, et puis en plus ça va être très inefficace niveau taille du code) ou un vrai GC (plus compliqué à implémenter, et nbrx compromis entre vitesse et fluidité)
Ben je pensais à du comptage de références, mais je regarderai comment marche un vrai GC pour voir si c'est envisageable[/cite]
Le comptage de références ne suffira pas... Dès que tu auras des interactions entre classes (événements, etc...) tu auras des références mutuelles.
Après tout, ce n'est pas forcément une si mauvaise idée... Avec un bon bytecode (mais dépendant de plateforme), ça devrait pouvoir se faire.
Hmm, le problème est la taille de toutes les métadonnées (parce que bytecode sans métadonnées ça n'a pas d'intérêt) + la taille du bytecode qui est énorme. Autant sur PC la taille est minime par rapport à un exécutable standard, autant sur TI la différence de taille se sentirait, mais en sens inverse.[/cite]
Bah oui, mais ça peut être utile (voire indispensable) d'avoir ces métadonnées...
Pour la réflexion, j'y ai pensé il y a quelque temps, mais je pense que c'est possible de s'en passer (A la limite pour les typeof, j'utiliserai une structure qui donnera l'id de type (tant qu'a faire, celui attribué pdt la compilation), et les types hérités, ça ne devrait pas prendre trop de place

C pourtant assez important comme feature... Et les attributs?
Les attributs, faut voir, ça c'est jouable, mais bon, ça fait qd même des métadonnées à stocker neutral

Oui, évidemment sad Mais si on s'en sert avec modération, c plus efficace de mettre un attribut que de rajouter du code...
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)

Plus complexe que VB ? hum Je pense pas, surtout si tu as fait du C++.
C'est certain que je pourrais apprendre vite, vu les similitudes C#-C++, mais je ne me suis jamais penché là dessus, puisque le VB est relativement satisfaisant.

La syntaxe est horrible sick
Mais après on peut imaginer que la conversion bytecode -> ASM soit suffisamment simple pour faire un JIT...
Le problème c'est la limitation de mémoire surtout.

Il n'y a pas besoin de bcp de RAM pour faire ça, si la majorité des optimisations a déjà été faite sur le bytecode ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

16

Kevin Kofler
:
GoldenCrystal
: Kevin > Nan mais si tu penses à VB6... C'est lent uniquement parce que c'est fait sur une base m*rdique. Si ça se trouve VB.NET est plus rapide que VB6 (et de mémoire, en ayant vu la tronche de l'ASM x86 généré pour les deux, c'est fort possible).

Le VB.NET, ce n'est plus du VB. grin Le vrai VB, c'est VB1-VB6. Ils ont tout changé dans VB.NET, la compatibilité est presque inexistante. Alors qu'entre VB4, VB5 et VB6, le code s'échange assez facilement dans les 2 sens.

Le vrai VB, c'est une infâmie au niveau lenteur et au niveau flexibilité. Le VB.NET est le seul à peu près correct, mais j'imagine que c'est juste une sorte de C# à la sauce Visual Basic.
3. Pourquoi VB ? C#, ça powa carrément plus...
oui Mais je ne sais pas programmer en C#, et le langage est beaucoup plus complexe que le VB (quoique parfois...)

Le VB est très complexe. Regarde le genre de trucs qui sont censés fonctionner en VB:
123+"456" -> 579
123&"456" -> "123456"
"456"+123 -> "456123"
"456"&123 -> "456123"
0+"456"+"123" -> 579
0+("456"+"123") -> 456123
CLng("456")+123 -> 579
CLng("456")+"123" -> 579
"123"+CLng("456") -> "123456"
... La conversion automatique des types est très complexe. C'est une des raisons fondamentales de la lenteur du VB. Et contrairement au C, les règles de promotion ne sont pas symétriques: c'est la première opérande qui décide le type du résultat, pas celle de type le plus large.

trifus Tout ça se fait en statique, tant que tu n'as pas de types Variant.
et pour les librairies (il en faudra, c'est certain), je ne sais pas si je transformerai le pseudo-assembleur en bytecode (ça permettrait éventuellement certaines optimisations pour le 'linking') ou si je compilerai nativement, tout en gardant les infos de type (faut pouvoir utiliser la librairie après)
Linke le programme statiquement quand tu es encore en ta représentation intermédiaire, et convertis le tout en natif une fois le linking terminé.

trisotfl On le changera jamais le Kevin ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

17

Kevin Kofler
:
Pollux
: Est-ce que tu comptes faire du comptage de référence (mais alors il va y avoir plein de progs qui vont foirer : on a vite fait de faire des références mutuelles de classes, et puis en plus ça va être très inefficace niveau taille du code) ou un vrai GC (plus compliqué à implémenter, et nbrx compromis entre vitesse et fluidité)
Le vrai VB utilise un refcount.

Oui, c'est bien ce que je dis : c'est une infâmie embarrassed

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

18

Pollux
:
et pour les librairies (il en faudra, c'est certain), je ne sais pas si je transformerai le pseudo-assembleur en bytecode (ça permettrait éventuellement certaines optimisations pour le 'linking') ou si je compilerai nativement, tout en gardant les infos de type (faut pouvoir utiliser la librairie après)
Linke le programme statiquement quand tu es encore en ta représentation intermédiaire, et convertis le tout en natif une fois le linking terminé.

rotfl On le changera jamais le Kevin ^^

Pourquoi éclates-tu de rire? À mon avis, c'est de loin le plus pratique. Ça permet d'éviter d'avoir à manier une représentation intermédiaire avec types etc. en temps d'exécution.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

19

pratique != efficace : on a pas forcément envie de recopier 50x le code d'une lib...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

Ah, parce qu'il va y avoir 50 programmes en VB??? rotfl
Déjà Moka n'est pas un succès (pas étonnant vu la taille que les programmes prennent), alors un langage connu pour être lent et gros comme le VB...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

21

Pardon, j'ai pas mis mon "50" entre balises <EXAGERATED> neutral
(pas étonnant vu la taille que les programmes prennent)

Oui, justement à cause des librairies liées statiquement : tu te mords la queue embarrassed
alors un langage connu pour être lent et gros comme le VB...

VB.NET n'est pas si affreux que ça... La seule grosse différence qu'il y aurait entre un VB/C# bien implémenté et Moka, c'est la garbage collection.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

22

Au fait, y a qqch de très important que je voulais dire dans ./15 mais que j'ai oublié : un JIT, plutôt que de coûter en RAM, peut permettre de gagner plein de place... Dès qu'on manque de RAM, on peut zapper le code le moins fréquemment utilisé (par exemple, dans le cas d'un jeu, les menus) pour y mettre le nouveau code.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

23

Pollux
:
(pas étonnant vu la taille que les programmes prennent)

Oui, justement à cause des librairies liées statiquement : tu te mords la queue embarrassed

Faux. La librairie dynamique fait partie du programme, donc mettre le code dans une librairie dynamique ne diminue pas la taille du programme. Beaucoup ici n'ont pas compris ça. Et pire, ça augmente la taille à cause de l'overhead des relogements etc. (qui va être encore pire si vous voulez y mettre des informations de types etc. qui ne servent qu'en temps de linking) et des fonctions non utilisées (desquelles il va y avoir des tonnes dans une API style VB!).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

24

Et tiens, encore une remarque: le VB travaille par définition en -ftrapv (comme tout BASIC qui se respecte). Ça va donner un appel de fonction pour chaque addition! Beurk...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

25

Kevin Kofler
:
Pollux
:
(pas étonnant vu la taille que les programmes prennent)

Oui, justement à cause des librairies liées statiquement : tu te mords la queue embarrassed
Faux. La librairie dynamique fait partie du programme, donc mettre le code dans une librairie dynamique ne diminue pas la taille du programme. Beaucoup ici n'ont pas compris ça. Et pire, ça augmente la taille à cause de l'overhead des relogements etc. (qui va être encore pire si vous voulez y mettre des informations de types etc. qui ne servent qu'en temps de linking) et des fonctions non utilisées (desquelles il va y avoir des tonnes dans une API style VB!).

rester calme... rester calme...
Tu me dis que personne n'utilisera 50 progs parce qu'ils seront trop gros... Or justement, une fois qu'on a qqs progs, on peut facilement aller jusqu'à 50 embarrassed Donc on pourra très bien utiliser 50 progs, ce n'est pas un pb.

Et ce que tu n'as pas compris, c'est qu'on n'est pas obligé de garder les fonctions inutilisées, dans une lib dynamique.


./24> ça peut se supprimer, ça ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

26

Pollux :
Tu me dis que personne n'utilisera 50 progs parce qu'ils seront trop gros... Or justement, une fois qu'on a qqs progs, on peut facilement aller jusqu'à 50 embarrassed Donc on pourra très bien utiliser 50 progs, ce n'est pas un pb.

Non, parce que personne n'écrira ces 50 programmes. grin Je ne pense pas être le seul à ne pas du tout voir l'intérêt de coder en VB sur une calculatrice. Et pourtant, je connais très bien le VB...
Et ce que tu n'as pas compris, c'est qu'on n'est pas obligé de garder les fonctions inutilisées, dans une lib dynamique.

Si, parce qu'on ne sait pas quelles fonctions sont inutilisées. L'utilisateur pourrait à tout moment envoyer un programme qui les utilise.
./24> ça peut se supprimer, ça ^^

Du coup, ce n'est plus du VB, mais un langage bastardisé, et avec un des gros avantages du VB (celui d'être protégé contre les plantages) de perdu.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

27

GoldenCrystal :

Let's Build a Compiler, by Jack Crenshaw
Compiler Construction: A Practical Aproach
Compiler tutorials
Compiler Construction using Flex and Bison
Implementing A Scripting Engine 1, 2, 3, 4, 5, 6, 7, 8, 9

Pour la génération de code :
Engineering Simple, Efficient Code Generator Generator
Code Generation Techniques
Concise Specifications of Locally Optimal Code Generators

Pour l'allocation de registres :
Linear Scan Register Allocation
Register Allocation via Graph Coloring
Improvements to Graph Coloring Register Allocation
Spill Code Minimization Techniques for Graph Coloring Register Allocators
Register Allocation sans Coloring
Iterated Register Coalescing
Optimistic Register Coalescing
Fusion-Based Register Allocation
Simple Register Spilling in a Retargetable Compiler

Pour les optimisations :
Using SSA Form in a Code Optimizer
A New Algorithm for Partial Redundancy Elimination based on SSA Form
Efficiently Computing Static Single Assignment Form and the Control Dependence Graph
Single-Pass Generation of Static Single Assignment Form for Structured Languages
Practical Improvements to the Construction and Destruction of Static Single Assignment Form
Generalized Constant Propagation A Study in C
A Global Code Optimizer Utilizing Static Single Assignment Form
Optimizing for Reduced Code Space using Genetic Algorithms
etc etc...


Pour la syntaxe, entièrement d'accord avec Pollux, le C# (ou un sous-ensemble) est définitivement mieux. De plus il existe un compilateur C# écrit en C# open source, donc il y a moyen de s'en inspirer pour le front-end.

En ce qui concerne la lib standard, le plus simple (mais pas forcement le plus efficace) c'est que ton compilateur génére un .o (COFF 68K en gros), que tu pourras linker statiquement, en utilisant TIGCC, à tout ce que tu veux, écrit en C ou en ASM. Pour commencer ça me parait être une bonne idée, ça permettra de pouvoir utiliser le compilateur pendant que tu implémentes quelque chose de plus compliqué pour la version d'après.
So much code to write, so little time.

28

Kevin Kofler
:
Pollux :
Tu me dis que personne n'utilisera 50 progs parce qu'ils seront trop gros... Or justement, une fois qu'on a qqs progs, on peut facilement aller jusqu'à 50 embarrassed Donc on pourra très bien utiliser 50 progs, ce n'est pas un pb.

Non, parce que personne n'écrira ces 50 programmes. grin Je ne pense pas être le seul à ne pas du tout voir l'intérêt de coder en VB sur une calculatrice. Et pourtant, je connais très bien le VB...

On peut programmer bien plus rapidement (pas avec les vieux VB, hein, mais avec les récents). Et en plus tu ne connais que les vieux, donc tu n'es pas super bien placé pour parler...

Tiens, d'ailleurs je viens de faire un petit benchmark pour calculer la somme des n pour n allant de 0 à 1 milliard (n étant sur 32, 32 ou 64 bits, et la somme sur 32, 64 ou 64 bits)
	int+int	lng+int	lng+lng
GCC331	1.060	1.025	2.360
C#	1.060	1.650	2.375
Java	2.650	4.240	5.760	(-0.120 startup time)

C'est assez impressionnant happy Le bon score de GCC pour 64+32 s'explique par le fait qu'il fait un déroulement de la boucle 10 fois (!) et qu'il ne fait donc la comparaison que toutes les 10x. Bizarrement, il n'a pas cette idée dans les autres cas confus

Et ce que tu n'as pas compris, c'est qu'on n'est pas obligé de garder les fonctions inutilisées, dans une lib dynamique.
Si, parce qu'on ne sait pas quelles fonctions sont inutilisées. L'utilisateur pourrait à tout moment envoyer un programme qui les utilise.

Et ? Le kernel pourrait envoyer les libs/fonctions qui sont utilisées par la même occasion, ce n'est pas un pb...
./24> ça peut se supprimer, ça ^^
Du coup, ce n'est plus du VB, mais un langage bastardisé, et avec un des gros avantages du VB (celui d'être protégé contre les plantages) de perdu.

Euh, un overflow d'entiers est un plantage, pour toi? C'est un peu fort ^^ Surtout que si on passe de +2 milliards à -2 milliards, on a des chances de s'en rendre compte... (par exemple si on accède aux éléments d'un tableau)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

29

Pollux
:
Et ce que tu n'as pas compris, c'est qu'on n'est pas obligé de garder les fonctions inutilisées, dans une lib dynamique.
Si, parce qu'on ne sait pas quelles fonctions sont inutilisées. L'utilisateur pourrait à tout moment envoyer un programme qui les utilise.
Et ? Le kernel pourrait envoyer les libs/fonctions qui sont utilisées par la même occasion, ce n'est pas un pb...

Si, parce que tu ne peux plus utiliser les logiciels de liaisons de TI, ni les fonctions de linking calculatrice à calculatrice de AMS, mais tu es obligé d'utiliser un logiciel de liaison spécialisé. sick
Euh, un overflow d'entiers est un plantage, pour toi?

Non, mais ça peut facilement en causer un, ainsi que plein d'autres comportements bizarres.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

30

Kevin Kofler
:
Pollux
:
Et ce que tu n'as pas compris, c'est qu'on n'est pas obligé de garder les fonctions inutilisées, dans une lib dynamique.
Si, parce qu'on ne sait pas quelles fonctions sont inutilisées. L'utilisateur pourrait à tout moment envoyer un programme qui les utilise.
Et ? Le kernel pourrait envoyer les libs/fonctions qui sont utilisées par la même occasion, ce n'est pas un pb...

Si, parce que tu ne peux plus utiliser les logiciels de liaisons de TI, ni les fonctions de linking calculatrice à calculatrice de AMS, mais tu es obligé d'utiliser un logiciel de liaison spécialisé. sick

On peut toujours passer par le Var-link, si le kernel est bien fait... Et pour ce qui est des logiciels de liaisons côté PC, il n'y a pas de pb : il suffit que la calc affiche un msg demande de rajouter tel fichier, le logiciel envoie la grosse lib, et la calc filtre ce dont elle a besoin happy
Euh, un overflow d'entiers est un plantage, pour toi?
Non, mais ça peut facilement en causer un, ainsi que plein d'autres comportements bizarres.

On peut tjs rajouter un test supplémentaire d'overflow si on a des comportements bizarres. Mais le coût est trop élevé pour qu'on le rajoute systématiquement...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)