Pourquoi les techniques génératives de compilation pour le typage structurel empêchent la compilation séparée?

StackOverflow https://stackoverflow.com/questions/3498954

  •  29-09-2019
  •  | 
  •  

Question

Je lisais (ok, écrémage) Dubochet et Odersky de Compiling Types de construction sur la JVM et a été confondu par la revendication suivante:

techniques génératives créer des interfaces Java pour se tenir dans pour les types structuraux sur la machine virtuelle Java. La complexité de ces techniques réside dans le fait d'utiliser toutes les classes qui sont aussi types de structure partout dans le programme doit mettre en œuvre les interfaces droite. Lorsque cela est fait au moment de la compilation, il empêche la compilation séparée.

(italique ajouté)

Prenons l'exemple de autoclose du papier:

type Closeable = Any { def close(): Unit }

def autoclose(t: Closeable)(run: Closeable => Unit): Unit = {
   try { run(t) }
   finally { t.close }
}

Impossible de nous générer une interface pour le type de Closeable comme suit:

public interface AnonymousInterface1 {
   public void close();
}

et transformer notre définition de autoclose à

// UPDATE: using a view bound here, so implicit conversion is applied on-demand
def autoclose[T <% AnonymousInterface1](t: T)(run: T => Unit): Unit = {
   try { run(t) }
   finally { t.close }
}

Ensuite, envisager un appel site pour autoclose:

val fis = new FileInputStream(new File("f.txt"))
autoclose(fis) { ... }

Depuis fis est un FileInputStream, qui ne met pas en œuvre AnonymousInterface1, nous avons besoin de générer une enveloppe:

class FileInputStreamAnonymousInterface1Proxy(val self: FileInputStream) 
      extends AnonymousInterface1 {
   def close() = self.close();
}

object FileInputStreamAnonymousInterface1Proxy {
   implicit def fis2proxy(fis: FileInputStream): FileInputStreamAnonymousInterface1Proxy =
      new FileInputStreamAnonymousInterface1Proxy(fis)
}

Je dois manquer quelque chose , mais il est clair pour moi ce qu'il est. Pourquoi cette approche empêcherait la compilation séparée?

Était-ce utile?

La solution

J'utilise en fait l'approche implicite (en utilisant classes de types) que vous décrivez dans le Scala bibliothèque ARM . Rappelez-vous que c'est une solution à code à la main au problème.

Le plus gros problème est la résolution implicite ici. Le compilateur ne génère pas des wrappers pour vous à la volée, vous devez le faire à l'avance et assurez-vous qu'ils sont une la portée implicite. Ce moyen (pour Scala-ARM) que nous fournissons wrapper « de commun » pour toutes les ressources que nous pouvons, et revenir à des types par réflexion lorsque nous ne pouvons pas trouver l'emballage approprié. Cela donne l'avantage de permettre à l'utilisateur de spécifier leur propre emballage en utilisant des règles implicites normales.

Voir: Le ressource type trait et l'ensemble de ses emballages prédéfinis.

En outre, je blogué sur cette technique décrivant la magie de résolution implicite plus en détail: Singe rapiéçage, canard et frappe les classes de type .

Dans tous les cas, vous ne voulez probablement pas encode main un à chaque classe de type que vous utilisez des types de structure. Si vous voulez vraiment le compilateur pour créer automatiquement une interface et faire la magie pour vous, il pourrait être gênant. Chaque fois que vous définissez un type de structure, le compilateur devra créer une interface pour elle (quelque part dans l'éther peut-être?). Nous avons maintenant besoin d'ajouter des espaces de noms pour ces choses. En outre, à chaque appel le compilateur devra générer une sorte d'une classe enveloppe la mise en œuvre (encore une fois la question de l'espace de noms). Enfin, si nous avons deux méthodes différentes avec le même type de structure qui sont compilés séparément, nous avons simplement explosé le nombre d'interfaces dont nous avons besoin.

Non pas que l'obstacle ne pouvait être surmonté, mais si vous voulez avoir à taper la structure avec un accès « direct » pour des types particuliers le modèle type trait semble être votre meilleur pari aujourd'hui.

scroll top