Objektorienterade programmeringsspråk Vad vill vi ha? Några olika språk 7 steps towards object-based happiness 1. Object-based modular structure Systems are modularized on the basis of their data structures. 2. Data abstraction Objects should be described as implementations of abstract data types. 3. Automatic memory management Unused objects should be deallocated by the underlying language system, without programmer intervention. 4. Classes Every non-simple type is a module, and every highlevel module is a type. 5. Inheritance A class may be defined as an extension or restriction of another. 6. Polymorphism and dynamic bindings Program entities should be permitted to refer to objects of more than one class, and operations should be permitted to have different realizations in different classes. 7. Multiple and repeated inheritance It should be possible to declare a class as heir to more than one class, and more Aletta Nylén @ than once to the same class. Garbage Collection (GC) Stor källa till fel i program: Minnesläckage logiskt och fysiskt Dangling pointer bugs Double free bugs Lösning: automatisk minneshantering. Systemet deallokerar oanvända objekt utan programmerarens inverkan. GC minskar den tid och kraft som spenderas på programmering, testning och debugging Grundalgoritm Mark and sweep Varje objekt har en bit reserverad för GC Vid behov: Gå igenom hela arbetsminnet och markera alla objekt som kan nås. Gå igenom och markera alla objekt som nås från dessa objekt Slutligen gå igenom hela minnet och avallokera objekt som inte kan nås (övriga objekts GC-bit sätts till 0). Aletta Nylén @ Aletta Nylén @ Smartare algoritm Tri-color marking Tre mängder Vit objekt som kanske kan avallokeras Svart objekt som inte har referenser till vita objekt Grå vet-ej objekt Ta objekt från grå, gör objektet svart genom att flytta objekt som det refererar till från vit till grå. Upprepa tills grå är tom. Avallokera vita objekt. Olika GC-strategier Moving GC flyttar nåbara objekt och uppdaterar referenser vid behov Non-moving GC avallokerar icke-nåbara objekt och lämnar övriga där de är Stop-the-world GC stoppar programmet under GC-cykler Incremental GC blandar GC-cykler med programkörning Concurrent GC kör samtidigt som programmet på multiprocessormaskin Aletta Nylén @ Aletta Nylén @ 1
Performance Ger körtids overhead utanför programmerarens kontroll Påverkar lokalitet (caching) positivt eller negativt GC i moderna implementationer kan vara snabbare än manuell minneshantering då runtime-systemet kan analysera det aktuella programmet och välja strategi därefter Var finns GC? Många högnivå-språk. Funktionella språk Lisp, ML, Haskell,... OO språk Java, Smalltalk,... Inbyggda- och realtidssystem.net Micro Framework Java Platform, Micro Edition Aletta Nylén @ Aletta Nylén @ Felhantering Vissa fel kan inte förebyggas med hjälp av if-satser En fil kan t ex raderas under skrivningen/ läsningen, fast man har kollat i förväg att allt är OK Möjliga åtgärder: Avbryt eller avsluta programmet Ignorera felet och fortsätt Skriv ut ett meddelande och fortsätt Ignorera anropet som ledde till felet Tolka anropet på ett meningsfullt sätt Kräver åtgärd från användaren interaktivt Producera ett felaktigt resultat Returnera en felkod... Vad är bäst? Många alternativ Ingen åtgärd bäst i alla lägen Beror på anroparens mål Låt anroparen bestämma! Throw/ raise exception Kasta / flagga ett undantag och överlåt åt anroparen att genomföra lämplig åtgärd Aletta Nylén @ Aletta Nylén @ Undantag/Exceptions Bör finnas i språk som stödjer utveckling av storskaliga, komplexa, tillförlitliga mjukvarusystem Varför? Fel uppstår inte alltid på den plats där det är mest lämpligt att hantera det Programmet blir onödigt stort och komplext om felhanteringslogik blandas med övrig programlogik Simula en objekt-orienterad utvidgning av Algol 60, ursprungligen avsett för simulering. Simulas viktigaste arv till eftervärlden är inte simuleringsprincipen, utan att språket visade värdet av att kunna strukturera objektorienterat Introducerade klasser, objekt, arv, dynamisk bindning Aletta Nylén @ Aletta Nylén @ 2
Simula: Språket Simula: Klassdefinition Värdetyper (int, real, ) och referenser till objekt Skilda operationer för värdetyper och referenser := vs :-, = vs ==, /= vs =/=, etc Enkelt arv Inkapsling ursprungligen ingen senare protected = osynlig för klienter Virtuella metoder Olika implementationer kan ha olika signatur Polymorfism Statisk bindning utom för virtuella metoder GC Parametrar Attribut (kan vara klasser) Metoder Life Aletta Nylén @ Aletta Nylén @ Simula - programexempel Class Rectangle (Width, Height); Real Width, Height;! Class with two parameters; Begin Real Area, Perimeter;! Attributes; Procedure Update;! Methods (Can be Virtual); Begin Area := Width * Height; Perimeter := 2*(Width + Height) End of Update; Vad är det för fel på Simula? Simula anses vara det första objektorienterade språket men används inte speciellt mycket. Varför? Boolean Procedure IsSquare; IsSquare := Width=Height; Aletta Nylén @ Update;! Life of rectangle started at creation; OutText("Rectangle created: "); OutFix(Width,2,6); OutFix(Height,2,6); OutImage End of Rectangle; Aletta Nylén @ Vad är det för fel på Simula? Generally: Born in a small European country Frozen in 1968 Expensive Does not have a modern IDE Too complicated Not enough publications Language features: Limited file access facilities (typed files) Missing data types (records, sets) No advanced parallelism and real time support No GUI support Long executable files for short programs OOP features: No multiple inheritance No interfaces Simulation: No automatic collection of statistics No report generator No useful specialized facilities (resources) Smalltalk Togs fram vid Xerox PARC under 1970- och 1980-talet Skapade begreppet objektorienterat Mycket av dagens terminologi (Javas rekommenderade regler för namngivning) Avsikten: att bygga ett kraftfullt informationssystem som kunde växa och förändras I takt med användarens idéer och önskemål Grunden för många framsteg för datoranvändning, t ex Gränssnittskonstruktion (fönsterhantering, ikoner för val på bildskärm, pop-up menyer) Integrated Development Environmnet (IDE) Plattformsoberoende via användandet av Virtuell Maskin (VM) Just In Time Compiling (JIT) redan 1983 Design Patterns Används fortfarande inom bla Webteknologi XP Aletta Nylén @ Aletta Nylén @ 3
Smalltalk: Språket Dynamiskt typat Dynamisk bindning Allt är objekt även klasser! Enkelt arv alla klasser ärver Attribut dolda, metoder kan exporteras Syntax Sex reserverade ord (nil, true, false, self, super, thiscontext), Femton specialtecken ([] _^;$#:.-()) Tre sätt att skicka meddelanden (unära, binära och nyckelord). Smalltalk: klassdefinition NameOfSuperclass subclass: #NameOfClass instancevariablenames: instvarname1 instvarname2 classvariablenames: ClassVarName1 ClassVarName2 pooldictionaries: category: name of category Aletta Nylén @ Aletta Nylén @ Smalltalk - programexempel Object subclass: #TransientBeing instancevariablenames: 'birthday ' classvariablenames: '' pooldictionaries: '' category: 'SmalltalkIdioms-Being!!TransientBeing methodsfor: 'accessing'! age ^Date today year - self birthday year! C++ Imperativt programmeringsspråk med stöd för dataabstraktion, objektorienterad programmering och generisk programmering. Utvecklades i början på 1980-talet av Bjarne Stroustrup vid Bell Labs. Bygger på C med idéer från Algol 68 och Simula Är ett av de mest populära programmeringsspråken och används för programmering inom allt från spel till konsumentelektronik. Aletta Nylén @ birthday ^birthday! Aletta Nylén @ Ingen GC C++: Språket Statisk bindning default, dynamiskt bindning för virtuella metoder Explicit call-by-reference Överladdade operatorer Multipelt arv Virtuellt arv Templates generiska funktioner/klasser The deadly diamond of death int i f() B int i f() A D int i f() C Aletta Nylén @ Aletta Nylén @ 4
Exempel virtuellt och multipelt arv class Fordon Fordon(Person & owner); Point GetPosition() return m_position; Person & GetOwner() return m_owner; protected: Point m_position; Person & m_owner; class Bil : public virtual Fordon Bil(int age) m_age = age; void Print() cout << Bil, årsmodell << m_model; protected: int m_model; class Bat : public virtual Fordon Bat(int length) m_length = length; void Print() cout << Båt, längd << m_length; protected: int m_length; Aletta Nylén @ Aletta Nylén @ class Amfibiebil : public Bil, public Bat Amfibiebil(int age, int length) : Bil(age), Bat(length) // för att undvika namnkonflikter måste vi // ersätta metoden Print void Print() Bil::Print(); Bat::Print(); Hette från början OAK (James Gosling, 1991). Utvecklades vid SUN Microsystems. Från början avsett för inbyggda system (tex tvättmaskiner, mobiltelefoner, TV/video, spel, mm). (Storlek och pålitlighet var viktiga) Med WWW fick projektet en annan inriktning Java blev ett programspråk för web-applikationer Aletta Nylén @ Aletta Nylén @ (Man brukar säga att) Java är... enkelt baserat på C/C++ objekt-orienterat från början dynamiskt utbyggbart robust, säkert oberoende av hårdvaruarkitektur (portabelt) web-anpassat: applets, div bibliotek.net En plattform centrerad kring en Common Language Runtime, CLR (jmf JVM), och en samlig bibliotek Kan nyttjas av ett antal språk som kan samköra genom att de kompilerar till ett intermediate language (MSIL) Aletta Nylén @ Aletta Nylén @ 5
C# (C-sharp) utvecklat av Microsoft i samband med skapandet av den nya.net-plattformen. Standariserat 2001. C# är ett (strikt) objektorienterat språk bygger på C/C++ med starka influenser av Java. Kompileras till MSIL och körs på CLR I CLR lever objekten i skyddade miljöer som kallas Application Domains. Kommunikationen mellan objekt i olika Application Domains kan ske väldigt effektivt, i synnerhet om dessa finns i samma process på samma fysiska dator. C# och Java ( C++) Kompilerar till maskinoberoende kod som körs i kontrollerad omgivning (abstr. maskin) GC tillsammans med borttagande av pekare (I C# finns begränsad användning av pekare i kod som markerats unsafe ) Inga header-filer eller problem med cirkulära beroenden Alla klasser ärver från object Enkelt arv + multipelt interface arv Inga globala funktioner, konstanter Aletta Nylén @ Aletta Nylén @ Properties: Getters och Setters C# - fler nyheter Java/C++ C# Int size; public int getsize() return size; public void setsize (int value) size = value; foo.setsize (getsize () + 1); label.getfont().setbold(true); public int Size get return size; set size = value; foo.size++; label.font.bold = true; Indexers Delegates Events Enum Collections + foreach Structs Primitiva typer som structar Operator överladdning Virtuella metoder override Interface Call-by-reference, out -parameter, params Switch även strängar, inget break Pekararitmetik i unsafe -metoder Aletta Nylén @ Aletta Nylén @ C# Kodexempel Finesser: GC Helt objekt-orienterat, ALLT är objekt - även primitiver Stöder multi-dimensjonella arrayer. Operator överladdning XML kan läggas direkt i en struct istället för i en klass, medför större effektivitet. foreach statement I C# är alla objekt COM objekt. Mindre bra: Plattformsbegränsat C# är starkt bundet till Microsoft Windows Använder C++ stil på namn break och continue kan inte ha label. Metoder är inte virtuella default (som i Java) Dålig säkerhet? Ingen template-mekanism using System; namespace HelloWorld class Hello public static void Main() Console.WriteLine("Hello World!"); Aletta Nylén @ Aletta Nylén @ 6
Eiffel C++ Java C# GC Y Y Y N Y Y Språk Simula Smalltalk Polymorfism Y Y Y Y Y Y Dynamisk N* Y Y N* Y N* bindning Arv Y Y Y Y Y Y Multipelt N N Y Y N** N** arv * Dynamisk bindning för virtuella metoder ** Interface ger begränsad form class OBJECT_LIST inherit LINKED_LIST[ECO_OBJECT] creation make Eiffel - exempel feature add_object(obj: ECO_OBJECT) is do extend(obj); end; remove_object(obj: ECO_OBJECT) is do from start until off or item = obj loop forth; end -- loop if not off then remove; end -- if end -- remove_object Aletta Nylén @ Aletta Nylén @ draw_all is local iterator: DRAW_ITERATOR; do!!iterator; iterator.set(current); iterator.do_all; end -- draw_all end -- OBJECT_LIST Aletta Nylén @ 7