Le compilateur Staline optimise brutalement, mais comment?


14

L'énoncé de recherche de JM Siskind déclare:

Staline est un compilateur d'optimisation pour Scheme qui effectue une analyse statique du programme entier et utilise les résultats de cette analyse pour générer du code extrêmement efficace. Staline utilise une large collection de techniques d'analyse statique. Il effectue une nouvelle forme d'analyse de flux polyvariante qui utilise une analyse de flux monovariée itérée pour effectuer une séparation dirigée par le flux: clonage de copies spécialisées de procédures et attribution par cible des cibles à ces clones par site d'appel. Il utilise les résultats de l'analyse de flux pour effectuer une analyse de la durée de vie, une analyse d'échappement, une analyse des points vers et une analyse des alias obligatoires. Ces analyses prennent en charge une nouvelle forme de conversion de fermeture légère qui élimine la plupart des créneaux de fermeture, en utilisant des techniques telles que la mondialisation et la localisation variables, comprime le backchain statique et élimine généralement la plupart des fermetures des programmes. Il utilise également les analyses ci-dessus pour prendre en charge la gestion du stockage basée sur les régions orientée flux, où le ramasse-miettes au moment de l'exécution est remplacé par l'allocation statique et la désallocation sur une base par valeur abstraite et par point de programme. Il effectue également une conversion CPS légère orientée flux, en utilisant des extensions des techniques mises au point avec Screamer, pour prendre en charge des continuations de première classe extrêmement efficaces. Enfin, il prend en charge l'incrustation orientée flux et la sélection de représentation de bas niveau pour choisir l'implémentation (ou la non-implémentation) des balises, la vérification des balises et la répartition des balises par valeur abstraite et par point de programme. Cela élimine la plupart des balises d'exécution, la vérification des balises, le balisage, le dépouillement des balises, la répartition des balises, la mise en boîte et le déballage des programmes. où le ramasse-miettes au moment de l'exécution est remplacé par l'allocation statique et la désallocation sur une base par valeur abstraite et par point de programme. Il effectue également une conversion CPS légère orientée flux, en utilisant des extensions des techniques mises au point avec Screamer, pour prendre en charge des continuations de première classe extrêmement efficaces. Enfin, il prend en charge l'incrustation orientée flux et la sélection de représentation de bas niveau pour choisir l'implémentation (ou la non-implémentation) des balises, la vérification des balises et la répartition des balises par valeur abstraite et par point de programme. Cela élimine la plupart des balises d'exécution, la vérification des balises, le balisage, le dépouillement des balises, la répartition des balises, la mise en boîte et le déballage des programmes. où le ramasse-miettes au moment de l'exécution est remplacé par l'allocation statique et la désallocation sur une base par valeur abstraite et par point de programme. Il effectue également une conversion CPS légère orientée flux, en utilisant des extensions des techniques mises au point avec Screamer, pour prendre en charge des continuations de première classe extrêmement efficaces. Enfin, il prend en charge l'incrustation orientée flux et la sélection de représentation de bas niveau pour choisir l'implémentation (ou la non-implémentation) des balises, la vérification des balises et la répartition des balises par valeur abstraite et par point de programme. Cela élimine la plupart des balises d'exécution, la vérification des balises, le balisage, le dépouillement des balises, la répartition des balises, la mise en boîte et le déballage des programmes. utilisant des extensions des techniques mises au point avec Screamer, pour prendre en charge des continuations de première classe extrêmement efficaces. Enfin, il prend en charge l'incrustation orientée flux et la sélection de représentation de bas niveau pour choisir l'implémentation (ou la non-implémentation) des balises, la vérification des balises et la répartition des balises par valeur abstraite et par point de programme. Cela élimine la plupart des balises d'exécution, la vérification des balises, le balisage, le dépouillement des balises, la répartition des balises, la mise en boîte et le déballage des programmes. utilisant des extensions des techniques mises au point avec Screamer, pour prendre en charge des continuations de première classe extrêmement efficaces. Enfin, il prend en charge l'incrustation orientée flux et la sélection de représentation de bas niveau pour choisir l'implémentation (ou la non-implémentation) des balises, la vérification des balises et la répartition des balises par valeur abstraite et par point de programme. Cela élimine la plupart des balises d'exécution, la vérification des balises, le balisage, le dépouillement des balises, la répartition des balises, la mise en boîte et le déballage des programmes.Ces analyses et optimisations permettent à Staline de générer un code extrêmement efficace qui surpasse tous les autres compilateurs Scheme par des facteurs compris entre deux et cent, en particulier pour le code à forte intensité numérique. Staline génère souvent du code qui surpasse le code manuscrit c et Fortran.

J'ai pu trouver l'article très intéressant suivant sur la mise en œuvre des fermetures / appels de fonction: Conversion de fermeture légère à flux dirigé . J'ai également envoyé un courriel à l'auteur pour lui poser des questions sur les articles sur les autres sujets, qui sont mentionnés comme étant écrits dans le document de conversion de clôture:

Siskind, JM 2000a. Conversion CPS légère orientée flux. En préparation.

Siskind, JM 2000b. Polyvariance orientée flux. En préparation.

Siskind, JM 2000c. Sélection de la représentation orientée flux. En préparation.

Siskind, JM 2000d. Gestion du stockage orienté flux. En préparation

Malheureusement, il n'a jamais réussi à écrire ces papiers. Ma question est la suivante: existe-t-il des documents alternatifs ou connexes couvrant ces sujets? Je suis très intéressé d'apprendre comment Staline (ou d'autres compilateurs) peut compiler un langage de haut niveau tel que Scheme qui est récupéré, typé dynamiquement, prend en charge les fonctions de première classe, et même les continuations de première classe, peuvent être compilés statiquement avec un code aussi efficace . Bien que les articles sur l'analyse de flux soient assez abondants, les articles sur l'utilisation des résultats d'une telle analyse pour effectuer les optimisations mentionnées ci-dessus ne le sont pas.

Réponses:


11

La clé est probablement le fait qu'il utilise l'analyse de programme entier et l'optimisation de programme entier. Plus vous en savez sur le comportement d'un programme, plus vous pouvez vous spécialiser, vous aligner et rendre performant.

Le compilateur MLton pour ML standard fait la même chose ( http://mlton.org/ ). Il y a une présentation (au moins) à ce sujet: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Des travaux antérieurs ont été effectués par Craig Chambers et son groupe à l'Université de Washington (par exemple: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Cela a été fait dans le contexte de Self et plus tard Cecil / Vortex.

Il y a probablement plus de travail dans la communauté Scheme / Lisp. Vous voudrez probablement envisager de googler "l'optimisation du programme entier".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.