C# 4 bliver dynamisk
Microsofts Java-agtige sprog C# har gennemgået en rivende udvikling, og den stopper tilsyneladende ikke foreløbig. På konferencen PDC 2008, som afholdes i denne uge i Los Angeles, gav sprogets opfinder, danske Anders Hejlsberg, en smagsprøve på nyhederne i den kommende version fire.
Anders Hejlsberg har i lang slået på tromme for at nedbryde de klassiske skel i mellem programmeringssprog. Hans pointe er, at udviklerne bliver mere produktive, hvis de har objektorienterede, deklarative og dynamiske elementer til deres rådighed. Det følger han nu op på ved at putte mere af slagsen i C# og drysse retten med syntaks-sukker.
Compileren er en service
Det er normalt god latin først at kode, så kompilere, for så at afvikle programmet, men Anders Hejlsberg vil gerne sætte compileren i sving, mens programmet kører. Konceptet er at benytte compileren som en service for programmet. Det sker ved at benytte muligheden i C# for at manipulere med de abstrakte syntakstræer, som genereres når compileren hakker koden igennem.
Det udmønter sig i et nyt objekt med navnet CSharpEvaluator, der som navnet antyder har en eval-metode, der ligesom i dynamiske fortolkede sprog kan tage en streng, som indeholder C#-kode, og kompilere og udføre den færdige kode.
Det benyttede Anders Hejlsberg under foredraget til at skive en interaktiv C#-fortolker, som det kendes fra f.eks. Python, med solide klapsalver til følge.
I modsætning til fortolkede sprogs eval-funktioner, er der er ikke noget ydelsestab i C#.
»Det kører med nøjagtigt samme hastighed. Når først det er kompileret, så er det full speed ahead,« forklarer Anders Hejlsberg til Version2.
Dynamiske typer
Den største enkeltstående nyhed er, at det nu er muligt at bruge dynamiske typer i C#. Det sker ved at indføre et nyt nøgleord, "dynamic," som medfører at properties og metoder først tjekkes på kørselstidspunktet.
Det er ikke helt nemt at forstå, men C# er stadig et statisk sprog, i den forstand at dynamiske variabler har typen "dynamic."
»Er det kætteri?« spørger Anders Hejlsberg retorisk til publikum i den tætpakkede sal. Han forklarer, at han stadig er en stor fan af statiske sprog. Men C# er ikke en ø, men må være i stand til at tale med andre dynamiske sprog. Det er især bindingen til Javascript i Silverlight, som er vigtig. Andre eksempler er dom-objekter i XML og HTML, som kan glide mere gnidningsfrit ind i C#.
Det demonstrerer Anders Hejlsberg til publikums udtalte fornøjelse ved at kopiere Javascript fra en hjemmeside ind i C#-editoren, ændre "function" til "void" og skrive "dynamic" foran metodens parametre, og så er Javascript blevet til C#. Udvikleren kan skabe sine egne dynamiske objekter ved at implementere et interface med navnet IDynamicObject.
Valgfri parametre
En anden nyhed er valgfri parametre og navngivne parametre.
Valgfri parametre betyder, at visse parametre i metodekalde kan udelades, hvis der er angivet en standard-værdi i metodens definition. De valgfri parametre skal have en standardværdi og befinde sig i parameterlistens hale. Det kan f.eks. se sådan ud:
void (string s, int buffersize: 4086);
Det gør det kønnere at kalde COM-objekter, hvor den nuværende strategi er at benytte Type.Missing for valgfrie parameter i kald til COM-objekter. Det er især automatisering af Office, som eksponerer sine API'er ved hjæp af COM, som Anders Hejlsberg og kompagni har i tankerne.
Navngivne parametre gør det nemmere at undgå fejl ved kald af metoder med lange parameterlister.
Blandt andre nyheder i C# 4 er mulighed for at angive kovarians og kontravarians i forbindelse med parametriserede typer.
Kommentarer (9)
har man Python :-)
Sidst jeg så, havde Python ikke nogen art af statisk typecheck. Ideen med dynamic typen i C# er, at man kun bruger den, når man ikke kan bruge en statisk type (dvs. sjældent), så 99% af ens program er statisk checket.
De fleste statisk typede OO sprog har iøvrigt allerede en sådan type: Den kaldes "object". Forskellen er bare, at man med object skal lave en downcast til en navngivet type for at kunne bruge en metode, mens dynamic blot tester, at den specifikke metode findes for den aktuelle værdi.
Er der så meget nyt i det...i C++ har man "valgfri parametre" (overloading), og dynamiske metoder kan nemt emuleres uden sprog understøttelse (men C++ har jo også har et dynamisk typesystem, hvis man ønsker at koble det til).
Det "Hejlsberg"-hypede multiparadigme er ikke nyt, og Bjarne Stroustrup er vel den egentlige skaber af et mutliparadime sprog, der jo er designet i 1980'erne. C# ser bare ud til at kopiere dette rigtige "design".
Få lidt it-historisk baggrund ved at læse om Bjarne, vor nok største IT guru her: http://www.research.att.com/~bs/
mvh
Carsten
Er der no'en som vil belære mig om den store forskel?
Almindeligvis er APL fortolket og ikke strongly typed, så det er i hvert fald to væsentlige forskelle. C# 4 er stadig strongly typed som udgangspunkt - det nye i den sammenhæng er blot, at der også tillades dynamiske typer, hvilket bl.a. gøres for at tillade bedre kommunikation med COM.
Når Anders Hejlsberg bruger udtrykket multiparadigme, mener han ikke bare dynamiske typer og default værdier på parametre. Men derimod en mulighed for i programmeringssproget at udtrykke sig med udgangspunkt i flere forskellige paradigmer. Specielt at programmøren kan skifte mellem og kombinere imperative, objektorienterede, funktionelle, deklarative og constraint-erklærede metoder og teknikker i et program. Med direkte understøttelse fra programmeringssproget. Altså at programmeringssproget understøtter mange programeringsparadigmer. For mig er det klart noget nyt for et multi-purpose mainstream programeringssprog.
Altså at programmeringssproget understøtter mange programeringsparadigmer. For mig er det klart noget nyt for et multi-purpose mainstream programeringssprog.
Det kommer vist helt an på definitionen af ordet "mainstream". Der er mange multiparadigme sprog, se f.eks.:
http://en.wikipedia.org/wiki/Multi-paradigm_programming_language
void (string s, int buffersize: 4086);
Måske endnu en feature. Unavngivne metoder, hvor kompileren selv kan gætte hvad man mener? :)
Mvh,
Søren
