2010-03-30 3 views
1

Je suis en train de lire sur la spécialisation du programme - en particulier Java et je ne pense pas que je comprends tout à fait pour être honnête. Jusqu'à présent, ce que je comprends, c'est que c'est une méthode pour optimiser l'efficacité des programmes en limitant les paramètres ou les intrants. Comment cela est-il réellement fait? Est-ce que quelqu'un peut peut-être m'expliquer comment cela aide, et peut-être un exemple de ce qu'il fait réellement et comment cela se fait?Spécialisation Java Program - Qu'est-ce que c'est? Je ne comprends pas

Merci

Je lis:

Program Specialization - java

+1

Pouvez-vous fournir plus de détails/un lien pour ce que vous entendez par "spécialisation de programme"? –

+1

Pourquoi ne publiez-vous pas de lien vers ce que vous êtes en train de lire? Cela pourrait être une de ces choses que beaucoup de gens comprennent intuitivement, mais ne savent pas par leur nom. –

+0

désolé, j'ai mis à jour mon post maintenant – KP65

Répondre

0

spécialisation du programme est le processus d'un programme spécialisé quand vous savez à l'avance quels sont les arguments que vous allez avoir. Un exemple est si vous avez un test et vous savez qu'avec vos arguments, vous n'allez jamais entrer dans le bloc, vous pouvez éliminer le test.

Vous créez une version spécialisée du programme pour un certain type d'entrée. Fondamentalement, il aide à se débarrasser d'inutiles avec votre entrée. Cependant, avec les architectures modernes et les compilateurs (au moins en C), vous ne gagnerez pas beaucoup en termes de performance. Des mêmes auteurs, je recommanderais le travail de Tempo.

EDIT

Du papier Toplas:

spécialisation du programme est un programme technique de transformation qui permet d'optimiser un fragment de programme avec relativement à l'information sur un contexte dans lequel il est utilisé, en générant une implémentation dédiée à ce contexte d'utilisation . Une approche à la spécialisation de programme automatique est évaluation partielle, qui effectue agressif propagation constant inter-procédurale des valeurs de tous les types de données, et effectue le pliage constant et simplifications contrôle de flux basé sur cette information [Jones et al. 1993]. L'évaluation partielle adapte ainsi un programme aux informations (statiques) connues sur son contexte d'exécution, comme fourni par l'utilisateur (le programmeur). Seules les parties du programme contrôlées par données inconnues (dynamiques) sont reconstruites. L'évaluation partielle a fait l'objet de recherches approfondies sur les langages fonctionnels [Bondorf 1990; Consel 1993], langages logiques [Lloyd et Shepherdson 1991], et impératif langues [Andersen 1994; Baier et al. 1994; Consel et al. 1996].

+0

Je ne pense pas que vous avez raison - l'exemple que j'ai lu n'a pas supprimé le code "inutile", il a fourni un chemin plus rapide pour une entrée donnée. –

+0

La spécialisation du flux de contrôle est celle-là, ou lorsque vous avez une boucle qui ne va pas se répéter une seule fois, vous supprimez la boucle et n'exécutez le bloc qu'une seule fois. l'autre exemple typique est la spécialisation du pow (n), fonctions en square() ou cube(). – LB40

0

Intéressant.

Ce n'est pas un terme très commun, au moins je ne l'ai pas rencontré auparavant.

Je n'ai pas le temps de lire l'ensemble du document, mais il semble se référer à la possibilité d'optimiser un programme en fonction du contexte dans lequel il sera exécuté. Un exemple dans le document montre une opération de «puissance» abstraite optimisée en ajoutant une opération de «cube» codée en dur. Ces optimisations peuvent être faites automatiquement, ou peuvent nécessiter des "astuces" de programmeur.

Il est probablement intéressant de souligner que la spécialisation n'est pas spécifique à Java, bien que le document auquel vous liez décrit «JSpec», un spécialiste du code Java.

0

Il semble que Partial Evaluation soit appliqué à Java. Cette idée est si vous avez une fonction générale F (A, B) ayant deux paramètres A et B, et (supposons juste) chaque fois qu'elle est appelée, A est toujours la même chose. Ensuite vous pourriez transformer F (A, B) en une nouvelle fonction FA (B) qui ne prend qu'un paramètre, B. Cette fonction devrait être plus rapide car elle n'a pas à traiter l'information dans A - elle la "connaît" déjà. Il peut aussi être plus petit, pour la même raison.

Ceci est étroitement lié à la génération de code.

Lors de la génération de code, vous écrivez un générateur de code G pour prendre l'entrée A et écrire la petite fonction spécialisée rapide FA. G(A) -> FA. En spécialisation, vous avez besoin de trois choses, le programme général F, le spécialiste S, et l'entrée A: S(F,A) -> FA.

Je pense que c'est un cas de diviser pour mieux régner. Dans la génération de code, il suffit d'écrire G (A), ce qui est simple car il ne doit prendre en compte que As, alors que le programme généré considère tous les Bs. En évaluation partielle, vous devez obtenir un S quelque part, et vous devez écrire F (A, B) ce qui est plus difficile car il faut considérer le produit croisé de tous les As et Bs possibles. Dans l'expérience personnelle, un programme F (A, B) a dû être écrit pour faire le pont entre les modifications en temps réel d'une ancienne base de données hiérarchique et une nouvelle version relationnelle. A était la méta-description de la façon de mapper l'ancienne base de données sur la nouvelle, sous la forme d'une autre base de données. B était les changements apportés à la base de données originale, et F (A, B) a calculé les changements correspondants à la base de données plus récente. Comme A a changé à basse fréquence (hebdomadaire), F (A, B) n'a pas dû être écrit. Au lieu de cela, un générateur G (A) a été écrit (en C) pour générer FA (B) (en C). Le temps gagné était approximativement un ordre de grandeur du temps de développement, et deux ordres de grandeur du temps d'exécution.

Questions connexes