Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Rammeverket i.net Tore Berg Hansen 31.1.2011 Lærestoffet er utviklet for faget LN384D Appliksasjonsutvikling på.net-plattformen 1. Rammeverket i.net Resymé: I denne leksjonen fortsetter med vår tur gjennom.net. Vi skal se nærmere på rammeverket som kan sies å være kjernen i.net. Vi ser spesielt på kjøretidssystemet ogdet felles typesystemet. Dette gjør det mulig å bygge alle typer applikasjoner for Windows og Internett. Innhold 1.1. INNLEDNING... 1 1.2. ORD OG UTTRYKK... 3 1.3. COMMON LANGUAGE RUNTIME (CLR)... 3 1.3.1. Microsoft Intermediate Language... 5 1.3.2. Metadata... 5 1.3.3. Assembler og disassembler... 5 1.4. COMMON TYPE SYSTEM... 6 1.5. ASSEMBLIES OG MODULER... 9 1.6. OPPSUMMERING... 9 LITTERATURLISTE... 10 1.1. Innledning I forrige leksjon påpekte vi at.net kanskje er det største teknologiske sprang Microsoft noensinne har presentert for utviklere i en engang. Med.NET har utviklere fått et felles rammeverk for utvikling av mange forskjellige typer applikasjoner. Rammeverket er primært rettet inn mot fremtidsvisjonen om allestedsnærværende databehandling, hvilket innebærer distribuerte applikasjoner som kjører på forskjellige intelligente enheter. Denne visjonen ble bl.a. lansert av Mark Weiser i en artikkel i Scientific American i 1991 (Weiser 1991)..NET omfatter mye..net er en plattform som har de verktøy og teknologier som trengs for å bygge distribuerte applikasjoner. Sentralt står rammeverket. Figur 1 viste vi også i den første leksjonen.
Rammeverket i.net side 2 av 10 XML Web Services Web Forms Windows Forms ASP.NET Data and XML Classes (ADO.NET,...) Base Framework Classes Common Language Runtime Operativsystemet Figur 1 Rammeverket ligger på toppen av operativsystemet. Nærmest er Common Language Runtime, kjøretidssystemet som alle applikasjoner kjører under. Utvikleren har til sin disposisjon et objektorientert klassebibliotek med mer enn 6000 klasser. Biblioteket er grovt delt i to deler. Den ene delen er den som kalles Base Framework Classes. Den andre har mer spesialiserte klasser for bl.a. for håndering av XML og databaser. Figuren må ses på som et oversiktsbilde fordi.net kommer i nye versjoner med jevne mellomrom. Men hovedstrukturen har bestått selv om det detaljerte innhold endres og utvides. For eksempel så introduseres nye klasser i klassebiblioteket og nye verktøy lanseres i takt med utviklingen av teknologier. Klassebiblioteket har klasser for følgende: Innput/utputt Strenghåndtering Sikkerhetshåndtering Nettverkskommunikasjon Trådhåndtering og parallellprosessering Teksthåndtering Design av brukergrensenitt. Med versjon 4.0 kan man bruke rammeverket til å utvikle konsollapplikasjoner, enkle brukergrensesnitt (Windows Forms), rike brukergrensesnitt (Windows Presentation Foundation), Active Server Pages.NET (ASP.NET) til å lage Websider, Webtjenester og tjenesteorienterte applikasjoner (Windows Communication Foundation). Vi kan si at.net gjør det mulig å lage forskjellige typer brukergrensesnitt og forskjellige former for distribuert funksjonalitet. I denne leksjonen skal vi spesielt se på CLR og hva det inneholder. Klassebibliotekene kommer vi tilbake til i senere leksjoner.
Rammeverket i.net side 3 av 10 1.2. Ord og uttrykk Den tabellen som følger her er har sin opprinnelse i den første leksjonen. Vi starter alle leksjoner med en slik tabell så slipper du å gå tilbake til tidligere leksjoner. Tabellen er utvidet med nye ord og uttrykk som introduseres i denne leksjonen. Forkortelse ADO ADO.NET ASP ASP.NET Assembly CLR IL JIT JVM Manifest MFC MSIL PE SOAP UDDI WSDL XML Tabell 1 Forklaring ActiveX Data Objects. Neste generasjon ADO for aksessering av relasjonsdatabaser. Active Server Pages. Neste generation ASP for bygging av Webapplikasjoner. Utplasseringsenheten i.net. Inneholder kode og metadata og et manifest som beskriver innholdet. Common Language Runtime. Fundamentet for alle applikasjoner i.net. Intermediate language. Se også MSIL. Det mellomliggende språk som alle høynivåspråk som kan kan kjøre under.net kompileres til. Vi bruker denne kortversjonen de fleste steder i denne leksjonen. Just In Time kompilering Java Virtual Machine. Kjøremiljøet for Javaprogrammer. Metadata som beskriver hvilke moduler og ressusrfiler som er del av en bestemt assembly. Microsoft Foundation Class. Et tidligere klassebibliotek for utvikling av Windowsapplikajsoner. Microsoft Intermediate Language. Portable executable. Binært filformat for Windows. Simple Object Access Protocol. Universal Description, Discovery, and Integration. Web Services Description Language. Extensible Markup Language. 1.3. Common Language Runtime (CLR) CLR er altså kjøretidssystemet som alle.net-applikasjoner kjører under. Dette kreerer objekter, allokerer minne, sørger for søppelhådtering, sikkerhet og samspill mellom tjenester. Kode som er skrevet for CLR kalles på engelsk Managed Code.
Rammeverket i.net side 4 av 10 CLR har mange likhetstrekk med Java sin virtuelle maskin, Java Virtual Machine (JVM). Både CLR og JVM eksekverer en mellomliggende kode. Javakompilatorer lager bytekode, mens.net kompilatorer lager IL-kode. Men det er en viktig forskjell. JVM er en tolker (engelsk interpreter), hvilket vil si at den kjører er javaprogram linje for linje. JVM ligger altså oppå den underliggende maskinvareplattformen. Sett fra et Javaprogram er JVM den samme uansett hvilken maskinvare eller operativsysrem som ligger under. Det er det som ligger i slagordet om skriv en gang, kjør over alt (write once, run anywhere). CLR benytter seg av Just in Time Compilation (JIT). Det innebærer at et program som kjører under CLR kompileres to ganger. Første gangen blir koden som er skrevet i et.net kompatibelt språk kompilert til IL-kode. Deretter når programmet skal kjøres overtar JIT og sørger for at ILkoden blir kompilert til maskinkode for den aktuelle plattformen som programmet kjører på. Neste gang koden kjøres trenger den, i prinsippet, ikke kompilers igjen. At det ikke alltid vil være slik, skal vi komme tilbake til. JIT-kompilatoren finnes nemlig i to versjoner. En annen ting er at JVM nå i stor grad også benytter JIT-kompilering for å øke ytelsen på Javaprogrammer. Prosessen og elementene i.net fra kildekode til kjørende program er vist i Figur 2. Base Class Library Kildekode (C#, VB.NET, C++, Python, ) Kompilator Metadata Engine IL og Metadata Exe eller DLL Class Loader Verifier JIT Kompilator Managed Native Code Kjør Figur 2 Fra kildekode til kjørbart program I det etterfølgende skal vi se nærmere på disse elementene.
Rammeverket i.net side 5 av 10 1.3.1. Microsoft Intermediate Language Kompilatorer for.net omformer kildekode til et mellomliggende språk. I Microsoftterminologi betegnet som Microsoft Intermediate language (MSIL, ofte bare IL). Språket kan sammenlignes med assembler, men er ikke for en bestemt maskinvareplattform, altså CPU-uavhengig. Kildekode for.net kan være skrevet i mange programmeringsspråk. Kravet er at det må finnes en kompilator som følger MSIL standarden. Microsoft har primært satset på tre programmeringsspråk.det er Visual Basic.NET, en utvidelse av C++ som kalles Managed C++ og C# som er spesielt laget for.net og det språket som Microsoft mener skal brukes til nye.net-applikasjoner. Etter hvert er det laget.net-kompilatorer av tredjepart. Eksempel er Python.NET og Cobol.NET. IL-koden har instruksoner for å innlesning, lagring, initialisering og kall av metoder til objekter. Det har også instruksjoner for aritmetiske og logiske operasjoner, kontrollflyt, direkte minneaksess, unntakshåndtering m.m. Det vil si at man kan skrive programmer direkte i MSIL, men det er ikke den mest produktive måten å gjøre det på. CLR har flere JIT-kompilatorer som oversetter til kildekode for aktuelle maskinvareplattformer. Java på sin side har en JVM for hver maskinvareplattform. 1.3.2. Metadata I tilegg til IL-kode lager kompilatoren metadata. Dette er data som beskriver klasser, felter i klasser, metoder i klasser og andre programelementer. IL-kode og metadata legges sammen med et manifest i en enhet som kalles en Assambly i.net-terminologien. En Assambly inneholder dermed all informasjon om seg selv og blir en uavhengig komponent og kan inspiseres av forskjellige verktøy som lastere og kompilatorer. Mer om det om litt. En Assembly er dermed den kjørbare komponenten i.net. Samtidig er den også det som i.net-terminologi kalles en deployment unit, eller på norsk en utplasseringsenhet. Det er den kjørbare enheten som kan befinne seg på et sted i nettverk og som kan brukes i samspill med andre assemblies andre steder i et nettverk. Metadata brukes i verifiseringsprosessen forut for generering av kode for en gitt plattform. Under verifisering blir IL-kode og metadata undersøkt for å finne ut om koden er typesikker og dermed bare kan aksessere minne den har tillatelse til å aksessere. Verifisering skal også sørge for at sikkerhetsrestriksjoner på koden blir ivaretatt, Verifiseringsprosessen kan hoppes over hvis man har etablert retningslinjer for dette. 1.3.3. Assembler og disassembler Vi nevner her kort at det er to verktøy som kan brukes for å arbeide med IL, hvis man skulle få behov for det. Det er en assembler og en disassembler. Slike verktøy er kjent fra gamle dager. En assembler kan sammenlignes med en kompilator, men den er mer lavnivå og knyttet til en gitt maskinvareplattform. Det vil si at hver plattform har sin assembler som omformer symbolsk lavnivåkode til maskinkode. Den motsatte prosessen, fra maskinkode til assemblykode kalles å disassemble og verktøyet som gjør det en disassembler. I.NET heter disse verktøyene ILASM od ILDASM. Funksjonen er litt annerledes enn med tradisjonelle assemblere og disassemblere, men disse verktøyene gjør det mulig å manipulere og tolke IL-kode og metadata. ILDASM er innebygget i Visual Studio.NET.
Rammeverket i.net side 6 av 10 1.4. Common Type System Programmeringsspråk som Java, C++ og Visual Basic har innebygget en rekke datatyper som gjør det mulig å arbeide med tall, tegn og tekst uten å måtte bekymre seg for hvordan de håndteres internt på en gitt datamaskin. Moderne kompilatorer gjør det altså mulig å abstrahere bort slike interne detaljer. Så langt er det vel og bra. Problemet oppstår når man vil at programmer skrevet i forskjellige språk skal samspille. En av hensiktene med.net er å kunne utvikle distribuerte systemer med komponenter skrevet i forskjellige språk og som problemløst samspiller. Løsningen er et felles typesystem kalt Common Type System (CTS). Men før vi ser nærmere på CTS kan det være på sin plass å forklare hva vi (og muligens Microsoft) mener med datatype. I (Bruegge og Dutoit, 2000) finner vi dette: - En datatype er en abstraksjon i et programmeringsspråk. I C++ er int et eksempel. - En abstrakt datatype er en spesiell datatype hvor strukturen er skjult for resten av systemet. Det innebærer at en utvikler kan endre de indre detaljer uten at det påvirker resten av systemet. Abstrakte datatyper har datamedlemmer og operasjoner. Klassemoduler i Visual Basic 6 er et eksempel. - En instans er et medlem av en bestemt datatype. Et eksempel på en instans av en int er 345. - Klasse er en abstaksjon i et objektorientert programmeringsspråk. På samme måte som en abstrakt datatype, innkapsler og skjuler den sine interne detaljer. I tillegg kommer at klasser kan spesialiseres gjennom en mekanisme som kalles arv. Vi finner igjen alle disse datatyper i.net-språkene under fellesbetegnelsen Type. CTS er altså et typesystem som alle programmeringsspråk som skal kjøre under.net må innlemme. Men det enkelte språk behøver ikke innlemme alle typene og kan bruke sine egne navn. Det er kompilatorens oppgave å oversette disse til det som brukes i MSIL. Et eksempel på problemer med datatyper er int i C++. C++ er et standardisert språk og datatypene i språket er standardiserte. Problemet med C++ er at standarden er så vid at en int ikke behøver å ha samme representasjon på forskjellige plattformer. Grunnen til det er antagelig at C++ skal være bakoverkompatibelt med C. En av egenskapene med C er at det kan brukes til å programmere maskinnært. I det ligger at datatyper som int representeres på en slik måte at de avspeiler ordlengden på maskinvaren. På en 32 bits maskin er int 4 byte, på en 16 bits maskin gjerne 2 byte. I standarden heter det at en int skal være større eller lik short int og mindre eller lik long. Med en slik standardisering kan man altså generelt ikke vite hvilken størrelse datatypen har noe som kan gi problemer selv mellom programmer skrevet i C++, men eventuelt kompilert med forskjellige kompilatorer. Gjennom CTS er dette problemet løst i.net som allerede nevnt. Man skiller gjerne mellom tre grupper av datatyper. Den ene er det man kaller innebygde datatyper som int, double, char og float. Den andre er sammensatte datatyper. Det vil si typer som er bygd opp av andre typer. Eksempler på disse er Array. Den tredjer typen er egendefinerte datatyper som class. I CTS finner vi alle disse. En annen inndeling man gjør i CTS er at man har to hovedkategorier. Disse er: - Verdityper (Value types) - Referansetyper (Reference types)
Rammeverket i.net side 7 av 10 Verdityper er tall, tegn (char) og Boolean (bool). Disse representerer en verdi og lagres direkte i minnet, på stakken. Når de ikke lenger er i bruk, eller som det heter på engelsk out of scope, vil plassen frigjøres. De som kjenner Java vet at objekter legges på den delen i minnet som kalles det frie lager (heap på engelsk)..net administrerer en egen heap som kalles managed heap. Her legges referansetypene. Objektene nås gjennom en referanse. Referansen ligger på stakken. Opprydding gjøres også, som i Java, med en søppelhåndterer (garbage collection). I motsetning til Java har CTS flere referansetyper. Figur 3 gir et forenklet, og ikke komplett, oversiktsbilde av viktigste datatypene. Nye versjoner av.net introduserer nye datatype. I versjon 4.0 har bl.a. datatypen Complex kommet til. Object Referansetyper Verdityper Class Interface Heltall Flyttall Array Boolean String Tegn Delegate Structs Andre Oppramsning Figur 3 Legg merke til at i.net arver alle datatyper fra en klasse, Object. Det fremgår ikke av figuren at man kan ha flere referansetyper i form av pekere. En objektpeker refererer til et objekt av en klasse eller et array. Aritmetiske operasjoner er ikke tillatt på objektpekere, i motsetning til i C++. Objektpekere kan bare peke til hele objekter. En managed peker kan peke til et felt inne i et objekt. Unmanaged pekere er såkalt ikke typesikker. Det er den type pekere som er kjent fra C og C++. I.NET kan ikke disse peke til managed heap og er ikke
Rammeverket i.net side 8 av 10 kontrollert av søppelhåndtereren. Disse pekerne kan håndtere såkalt usikker kode. De er en sikkerhetsrisiko, men muliggjør gjenbruk av tidligere kode som ikke er skrevet for.net. I.NET kan en klasse ha fire typer medlemmer: Metoder, samme betydning som i Java og andre objektorienterte programmeringsspråk. Felt (field), i andre språk kalt datamedlem dvs. en eller annen CTS-type. Hendelse (event), en mekanisme for å kommunisere med andre typer. Egenskaper (properties), en verditype som har metoder for å lese og skrive en verdi. I noen tilfeller kan man ha behov for å håndtere en verditype som et objekt. Mekanismen i CTS for å gjøre dette er Boxing. Det vil si at man kan innkapsle en verdi i et objekt og legge verdien på det frie lager og referere til det. Flere språk basert på CTS skjuler denne prosessen slik at det ikke er nødvendig for utvikleren å gjøre dette eksplisitt. Tabell 1 viser mer detaljert de forskjellige verditypene Verditype Byte Char Int16, Int32 og Int64 UInt16, UInt32 og UInt64 Single og double Decimal Enum Boolean Merknad 8-bit ubenevnt 16-bit Unicode tegn Benevnte heltall Ubenevnte heltall Singlepresisjon (32 bit) og dobbelpresisjon (64 bit) flyttall 96-bit desimaltall Oppramsningstype, dvs. en måte å gruppere og gi meningsfylte navn til verdier. Kjent fra C++ og nå også innlemmet i Java. Sann eller usann Structure En samling av elementer av forskjellig type som naturlig hører sammen. Veldig lik klasser, men ligger altså på stakken, ikke på det frie lager ogt kan ikke arves fra som alle verdityper. Datatypen er kjent fra C og C++. Tabell 1 Med versjon 4.0 har man også fått BigInteger som håndterer vikårlig store tall.
Rammeverket i.net side 9 av 10 1.5. Assemblies og moduler I forrige leksjon forklarte vi hva et assembly er. Vi tar med litt mer her. En assembly er en logisk enhet. En modul (eller manged module) er derimot en fil. Den er en såkalt Portable Executable (PE). Det er en binærfil som er kompatibel med Windows operativsystemer og kan lastes inn for kjøring av Windows. En modul inneholder definisjon av typer (klasser) og metadata og MSIL koden for metodene. CLR kan ikke bruke en modul direkte. Den trenger informasjonen som ligger i et manifest. Når denne informasjonen legges til blir modulen del av en assembly. Manifestet har altså all informasjon knyttet til et assembly. Manifestet i seg selv er også en modul og det er bare en slik modul i et assembly. 1.6. Oppsummering I denne leksjonen har vi: sett at kjernen i.net er kjøretidsystemet Common Language Runtime (CLR). sett at kjøretidssystemet håndtererer sikkerhet. sett at kjøretidssystemet tar seg av søppelhåndtering sett at kjøretidssystemet bruker Just in time kompilering sett at sammspill mellom komponenter lettes gjennom et felles typesystem, Common Type System sett at et assembly er en logisk enhet mens en modul er en fil.
Rammeverket i.net side 10 av 10 Litteraturliste Bruegge, Bernd og Dutoit, Allen 2000: Object-oriented software engineering. Upper Saddle River: Prentice Hall. Weiser, M 1991. The Computer for the 21st century. Scientific American. 265(3):94-104. September 1991.