2017-01-25 4 views
2

J'apprends un peu typées Racket au moment et j'ai un dilemme quelque peu philosophique:dactylographié Racket Optimizer

Racket prétend être un cadre de développement du langage et dactylographié Racket est une de ces langues mises en œuvre sur le dessus de celui-ci. La documentation mentionne qu'en raison des types utilisés, le compilateur peut maintenant faire des optimisations plus/meilleures.

La question concrète:

Où ces optimisations se produisent?

1) Dans la compilation/élargir la partie (qui est "programmable" dans le cadre du cadre de renforcement de la langue)

-ou-

2) en aval de la ligne dans l'optimiseur (bytecode) (qui est écrit en C et non directement modifiable via le framework). Si 2) est vrai, cela signifie-t-il que l'information de type est perdue après l'étape de compilation/expansion et plus tard «reconstruite/devinée» par l'optimiseur ou la représentation intermédiaire a-t-elle été modifiée? étapes à leur sujet? La raison pour laquelle je pose cette question spécifique est parce que je veux avoir une idée de la généralité du cadre de langage Racket, c'est-à-dire aussi viable pour les langages statiquement typés sans aucune modification dans le backend par rapport au système de type. une chose frontale, alors que le code à l'exécution est toujours dynamiquement typé (mais statiquement vérifié bien sûr).

Merci.

Répondre

2

optimisations de typées Racket se produisent lors de l'expansion macro. Pour voir par vous-même, vous pouvez changer #lang typed/racket à #lang typed/racket #:no-optimize, ce qui montre que Racket typé est en contrôle total de ce que les optimisations sont appliquées.

Les optimisations consistent à utiliser des informations de type pour remplacer les diverses utilisations de certaines procédures avec their unsafe equivalents. Les procédures non sécurisées n'effectuent aucune vérification d'exécution sur les types de leurs arguments et provoquent un comportement indéfini (lisez: segfaults) si elles sont utilisées de manière incorrecte. Vous pouvez en savoir plus dans la section documentation intitulée Optimization in Typed Racket.

L'exposition des variantes dangereuses des procédures est ce qui rend possible pour les langues définies par l'utilisateur pour mettre en œuvre ces optimisations. Par exemple, si vous avez écrit votre propre langue avec un système de type qui pourrait se révéler des vecteurs ont jamais été consulté avec hors-limites des indices que vous pourriez remplace les utilisations de vector-ref avec unsafe-vector-ref.

Il y a des optimisations similaires qui se produisent au niveau du bytecode, mais ceux-ci appliquent la plupart du temps lorsque le JIT peut déduire des informations de type qui n'est pas visible au moment de l'expansion macro. Ceux-ci ne sont pas contrôlés par l'utilisateur, mais vous ne devez pas compter sur eux.

+0

Cela répond à tout ce que je voulais savoir! THX! – Lazarus535