[Squeak-fr] Relecture document sur la syntaxe Smalltalk

nicolas cellier ncellier at ifrance.com
Dim 19 Fév 13:10:26 UTC 2006


Le Dimanche 19 Février 2006 12:53, Bernard Pottier a écrit :
> stéphane ducasse a écrit :
> > Exact
> > Je pense (mais c'est une hypothese) qu'en sqeuak le code n'est jamais
> > execute.
> > J'ai demande dans la mailing-list.
> > Il faudrait que je regarde le compilation mais je n'ai pas le temps
> > de vraiment plonger dedans
> >
> > Stef
> >

En version 3.8, le code n'est effectivement pas exécuté car le compilateur 
transforme ces messages whileTrue: et autres en bytecode optimisé (avec des 
instructions de branchement).

Par conséquent, en Squeak, il n'est pas possible de redéfinir un certain 
nombre de messages (cf classe MessageNode et classVar MacroTransformers).

En VW, le code peut être exécuté pour plusieurs raisons:
- la première expliquée en commentaire et déjà citée par Stef: on utilise une 
variable qui contient un bloc au lieu d'utiliser explicitement une 
construction [aBlock value].
la différence est entre ces deux constructions:
  conditionBlock whileTrue: actionBlock.
  [conditionBlock value] whileTrue: [actionBlock value].
dans la deuxième, on est sûr que ce sont des blocs de code, donc on peut 
utiliser une optimisation, dans la première, on envoie le message.
- la seconde est plus subtile: si le bloc de code est trop long, 
l'optimisation du bytecode avec branchements ne peut plus être utilisée (le 
saut est limité car les instructions de branchement sont codées sur 1 ou 2 
octets). Dans ce cas, le compilateur VW abandonne l'optimisation et revient à 
l'envoi simple de message.

J'aimerai que Squeak en vienne à ce mécanisme qui permet d'instrumenter le 
code (ajouter des points d'arrêt par exemple, ou autres instructions de 
déboggage) dans les cas où la limite peut être dépassée.

Notons que l'implémentation Squeak est parfaitement licite et fonctionnera si 
elle est réellement appelée, tant que l'optimisation du compilateur reste 
présente:
whileTrue: aBlock 
 ^ [self value] whileTrue: [aBlock value]

Il suffit d'exécuter ceci pour s'en convaincre:
 (BlockClosure>>#whileTrue:) inspect.



More information about the Squeak-fr mailing list