Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 2715, trackbacks - 3944

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

I tipi predefiniti devono essere definiti

Non poche cose si imparano provando a compilare programmi vuoti :-) Vediamone alcune:

Per esempio, vi dicevo nell'altro post che:

type foo.cs > foo.cs
csc /t:library foo.cs

produce un assembly (DLL) di 3072 bytes identico a quello prodotto se foo.cs fosse fatto solo da namespace vuoti perché il concetto di namespace è al livello del linguaggio e non scende al livello IL. Quindi se i namespace non si "applicano" a nessun tipo il compilatore giustamente li ignora.

Il codice IL di questo assembly è:

.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 1:0:5000:0
}
.assembly foo
{
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, bool) = ( 01 00 00 01 00 00 ) 
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module foo.dll
.imagebase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001

Cosa notate? L'importazione dell'assembly mscorlib. E così ci ricordiamo cosa dice Gunnerson nel suo libro (p. 500):

"Le funzioni di base del sistema (attualmente quelle contenute in mscorlib.dll) sono le uniche importate automaticamente dal compilatore."

Provando invece a compilare il codice vuoto con l'opzione nostdlib (per non importare la standard library, cioè proprio la mscorlib.dll)

csc /t:library /nostdlib foo.cs

si ottiene l'errore CS0518 ("The predefined type 'System.Byte' is not defined or imported") e il motivo è molto interessante (ce lo spiega Grant in questo bellissimo post):

"there a few types the compiler just needs regardless of what you're compiling. These include (this is by no means a complete list) System.Int32, System.Object, System.String, System.Delegate, System.Enum, etc. All of these are in mscorlib.dll. Because these always have to be there, everybody (except those actually building mscorlib.dll) need to reference mscorlib.dll, so the compiler tries to save you a little redundancy by always implicitly referencing mscorlib.dll. If you don't want it, you have to turn it off with /nostdlib."

"The reason for the error message goes back to the C# language spec. Unlike native compilers that internally define what the types int, short, long, float, and double are, C# relies on a base class library to define those types. Thus very early in the compilation it has to find those 'predefined' types, either in one of the references or in source. Without them it can't generate proper code at all."

Quindi, i tipi predefiniti devono essere definiti!

Se dovessi scrivere un libro avanzato di C#, partirei proprio dai programmi vuoti, come una specie ancora migliore di "Hello World!". Qualcuno lo comprerebbe?

E a proposito: vi sembro troppo "filosofico" in questo blog? - sono apertissimo a cambiamenti e i vostri feedback (anche sullo stile) mi interessano tanto.

La canzone del giorno: Tom Waits - "Sins Of The Father"

Print | posted on mercoledì 6 ottobre 2004 22:45 | Filed Under [ Carillon .NET ]

Powered by:
Powered By Subtext Powered By ASP.NET