2011-10-11 10 views
6

Tenía la impresión de que "A D interface file contains only what an import of the module needs, rather than the whole implementation of that module." Para mí, eso se traduce en firmas, simplemente devuelve tipos, nombres y argumentos, de modo que el compilador sepa que es válido y el enlazador puede hacer el trabajo sucio más tarde.¿Qué NO está en un archivo de interfaz?

Ejecución de un archivo a través de dmd, sin embargo, las tiras casi nada:

import std.stdio; 

void SayHello(const string Name) 
{ 
    writeln("Hello, ", Name, "!"); 
} 

dmd Interface.d -o- -H 

// D import file generated from 'Interface.d' 
import std.stdio; 
void SayHello(const string Name) 
{ 
writeln("Hello, ",Name,"!"); 
} 

Apenas un modelo de optimización.

¿Qué es exactamente lo que se elimina en los archivos de interfaz?

( añadieron porque es lo más parecido que pude encontrar.)

+1

A menudo me he preguntado qué se necesita para hacer que los archivos .di tengan un formato binario con una copia serializada de la fuente con la mayor parte del trabajo ya hecho: mmap it, inserte un puntero en la tabla de símbolos correcta , hecho. – BCS

+0

@BCS '.di' archivos no son realmente parte del estándar, por lo que no hay ninguna política para ponerse en el camino de esa idea. ¡Me pregunto por qué no lo han hecho! – Maxpm

Respuesta

7

Cualquier función que va a estar en línea debe tener su fuente completa en el archivo .di. Cualquier función que vaya a usarse en CTFE no solo debe tener su fuente completa en el archivo .di, sino que la fuente completa de cada función que utiliza, directa o indirectamente, debe estar disponible para el compilador. Además, debido a cómo funcionan las plantillas, su fuente completa debe estar también en el archivo .di (que es lo mismo que las plantillas deben estar en los archivos de encabezado en C++). Por lo tanto, hay una serie de casos en los que necesita que estén en un archivo .di.

Bajo exactamente qué circunstancias el compilador elige pelar cosas o no, no sé (aparte del hecho de que las plantillas automáticamente terminan en archivos .di en su totalidad porque tienen). Podría cambiar dependiendo de la implementación actual del compilador y de las optimizaciones que haga. Pero, como mínimo, tendrá que dejarse en cuerpos de funciones pequeñas si va a hacer cualquier alineación. Sin embargo, es probable que se eliminen los grandes cuerpos de función y los cuerpos de pequeñas funciones virtuales (que no se pueden insertar de todos modos). Pero su ejemplo proporciona una función pequeña, no virtual, por lo que es probable que la haya dejado para que pueda realizar cualquier llamada. Si desea ver cómo dmd tira un montón de cosas cuando genera un archivo .di, entonces probablemente necesite tener funciones grandes y/o usar clases.

4

Apenas un modelo de optimización.

No, eso es una optimización. El compilador abandonará la implementación en el archivo de interfaz si la implementación es lo suficientemente pequeña como para poder incluirla posteriormente.

Cuestiones relacionadas