So I was listening to Hanselminutes Podcast 158 where Joel Spolsky mentions that Wasabi is a first class .NET language. What does that mean?
It means it is fully supported by the .net and conversely supports all of .nets features. There are no limitations imposed on it. Anything that can be done in one "first class language" can be done equally well in another.
C#, VB.net, IronPython etc are all first class languages. XAML however is not. It is used in parts of .net, but you certainly couldn't do everything in it.
As far as I know, there is no clear definition of "first class .NET language". I think it simply refers to those languages that support most of the features offered by the CLR.
I would understand that to mean "compiles directly to .NET bytecode" (rather than code geneting to C#), and also that it would be capable of using the standard .NET libraries.
I think in that context, it meant not only that there was a wasabi to IL compiler, but also that there was Visual Studio / tool support.
It may also mean that the types etc are all .Net types, rather than being mapped to .Net equivalents objects at compile time?
I guess a first class language traditionally would have all the toys (Reflection, code generation etc) where a 2nd class might compile to IL, and not much else.
Describing a language as a first class .NET language is a subjective description. It refers to a .NET language which supports all of the .NET CLR features (in the real world I belive that this means it supports most of the features).
It has also traditionaly been used to describe a language that helps to shape the .NET CLR, meaning that I doubt Wasabi is a true first class language.
Update
Quote from an article describing how F# is a first class .NET language.
"This means that F# runs on the CLR, embraces object-oriented programming, and has features to ensure a smooth integration with the .NET Framework."
"First class .NET language" is not an official term.
Officially, a language can be Common Language Specification (CLS)-compliant and thus be able to interoperate with other CLS-compliant languages.
(Note: Of course, being CLS-compliant is a property of the software you write, and thus, of the assembly you produce. A CLI language will let you write CLS-compliant code, but will not force you to do so. You can write a non-CLS compliant assembly in C#, for example by using unsigned types in its public API.)
However, since (again) there is no official definition for "first-class .NET language", some people may not consider that they're working in a "first-class" .NET language unless they can use WPF or (tomorrow) Code Contracts, which is clearly much more demanding than the CLS-compliance requirement.
part from ILAsm no .NET language supports all features of the CLR
In my book, a first class language is a language that compiles down to IL and produces verifiable code i.e. you can disassemble the assembly back to the original code for instance using Reflector ("round-tripping").
As has been mentioned a couple of times there is no official definition, but a 1st class .NET language is essentially one that can create CLS-compliant assemblies as well as consume them.
If you're bored and want to read the ECMA CLI specifications then you'll find they distinguish between CLS Frameworks (CLS-compliant assemblies), CLS Consumers (compilers that can consume CLS Frameworks) and CLS Extenders (compilers that can create CLS Frameworks).
In CLI specification speak a 1st class .NET language is therefore a language whose compiler can act as a CLS Consumer and a CLS Extender.