Småprat | |
---|---|
Semantik | objektorienterad |
Språkklass | programmeringsspråk |
Framträdde i | Utvecklingen startade 1969, blev tillgänglig för allmänt bruk 1980 |
Författare | Alan Kaye , Adele Goldberg , Dan Ingalls, Xerox PARC |
Utvecklaren | Kaye, Alan Curtis , Adele Goldberg [1] , Daniel Henry Holmes Ingalls [d] och Diana Merry [d] |
Släpp | Smalltalk-80 version 2 |
Testversion | 1980 |
Typ system | dynamisk |
Stora implementeringar | Pharo , Squeak , VisualWorks , GNU Smalltalk |
Blivit påverkad | Simula , Skissblock , Lisp , Logotyp |
påverkas | Objective-C , AppleScript , C# , Dylan , Groovy , Io , Java , Lisaac , NewtonScript , Python , Ruby , Scala , Self , C++ |
Smalltalk ( [ˈsmɔːltɔːk] ) är ett dynamiskt maskinskrivet objektorienterat programmeringsspråk baserat på idén att skicka meddelanden , utvecklat på Xerox PARC av Alan Kay , Dan Ingalls , Ted Kagler , Adele Goldberg och andra på 1970 -talet . Det är en integrerad utvecklings- och exekveringsmiljö, vars objekt är tillgängliga för modifiering genom sig själv, och programmering där i slutändan handlar om att modifiera sitt eget beteende. Språket introducerades som Smalltalk-80.
Smalltalk är ett av många objektorienterade språk baserade på Simula -språket [2] , som i sig har haft stort inflytande på utvecklingen av sådana objektorienterade språk som: Objective-C , Actor , Java , Erlang [ 3] , Groovy , Ruby och många andra. Många av 1980- och 1990 -talens programmeringsidéer har sitt ursprung i Smalltalk-gemenskapen. Dessa inkluderar refactoring , designmönster (som tillämpas på programvara), klass-ansvar-interaktionskartor och extrem programmering i allmänhet. Grundaren av wikikonceptet , Ward Cunningham , är också en del av Smalltalk-communityt.
Huvudidéerna för Smalltalk är:
Smalltalk använder också andra moderna idéer:
En av särdragen med Smalltalk är att inte ens sådana traditionella konstruktioner som om-då-annat, för, medan, etc. inte är en del av språket. Alla implementeras med hjälp av . Till exempel fattas ett beslut genom att skicka ett meddelande till ett ifTrue:booleskt objekt och överför kontrollen till en textbit om det booleska värdet är sant.
Egentligen finns det få inbyggda syntaktiska konstruktioner i språket:
och flera syntaxkonstruktioner för att definiera bokstavliga objekt och temporära variabler.
Analogen till Smalltalks meddelandemekanism är Internet: du kan föreställa dig varje objekt som en webbserver som svarar på förfrågningar. Samtidigt kan servern helt enkelt ge ett fördefinierat svar på förfrågningar, till exempel en webbsida som ligger längs en viss väg; kan omdirigera begäran-meddelandet till ett annat objekt, den analoga är en proxyserver; kan ändra begäran enligt vissa regler, den analoga är url-omskrivningstekniken, och naturligtvis kan den bilda en helt ny sida som motsvarar de data som överförs med meddelandet. Om objektet inte har en fördefinierad metod för att svara på meddelandet anropar ramverket metoden #doesNotUnderstand: på mottagaren, precis som en webbserver returnerar en felsida om en obefintlig webbsidas sökväg ges.
En kort översikt över syntaxelementen:
Ett separat teckenpar |omger listan över variabelnamn som kommer att vara tillfälliga. :När ett meddelande överförs, placeras tecknet efter namnet på meddelandet eller dess argument, före värdet som överförs med det, och tecknen [och ]begränsa blocket av kommandon, eller snarare bokstaven i den anonyma funktionen. Men de kan till att börja med uppfattas som analoga med lockiga hängslen {på }C-liknande språk också. I början av en sådan anonym funktion, upp till ett tecken |, kan du lista de argument som den kräver. Dess resultat kommer att vara det sista uttrycket det utvärderade. En symbol .avslutar ett enskilt kommando, en symbol ; separerar meddelanden som måste sekventiellt överföras till samma objekt. Ett teckenpar :=betecknar tilldelningen till en variabel vars namn är placerat före den, ett bokstavligt objekt eller ett meddelandesvarsobjekt efter det.
Följande exempel, som visar att hitta vokaler i en sträng, illustrerar Smalltalk-stilen.
| aSträngvokaler | aString := 'Detta är en sträng' . vokaler := aString välj: [ : aTecken | ett tecken ärVokal ] .På den sista raden i exemplet skickas ett meddelande till strängobjektet select:med ett argument - ett anonymt kodblock som tar ett argument och returnerar vad isVowel-händelsehanteraren för objektet som skickas med detta argument kommer att returnera. Vid bearbetning av select-meddelandet anropas en metod select:från klassen Collection(en av förfäderna till klassen Stringtill vilken objektet som skapats av strängen literal i den andra raden i exemplet tillhör). Texten för denna metod visas nedan:
välj: blockera | nykollektion | newCollection := själv art ny . själv gör: [ : varje | ( aBlockvärde : varje ) ifTrue: [ newCollection add: each ]] . ^ ny samlingDen tar den anonyma funktionen aBlock som indata, skapar en ny samling som liknar sig själv och kallar dess element uppräkning (detta är metoden do:), och exekverar blocket som skickas till den aBlockför varje element; när blocket exekveras (i exemplet - aCharacter isVowel), skapar det ett booleskt värde, till vilket meddelandet sedan skickas ifTrue:. Om detta värde är trueläggs bokstaven till den returnerade strängen. I slutet returneras den skapade samlingen som ett svar på meddelandet, vilket indikeras av retur som svarssymbol ^. Eftersom den är select:definierad i en abstrakt klass Collectionkan vi också använda den så här:
| rektanglar aPoint | rektanglar := OrderedCollection med: ( Rektangel vänster: 0 höger: 10 topp: 100 botten: 200 ) med: ( Rektangel vänster: 10 höger: 10 topp: 110 botten: 210 ) . aPoint := Punkt x: 20 y: 20 . kollisioner := rektanglar välj: [ : aRect | aRect containsPoint: aPoint ] .Smalltalk skapades av en grupp forskare, ledd av Alan Kay , vid Xerox PARC Research Center . Den första implementeringen, känd som Smalltalk-71, skapades inom några månader som ett resultat av en debatt om att ett programmeringsspråk baserat på Simula-idén om meddelandesändning skulle implementeras i en "kodsida". Den senare versionen som faktiskt används för forskningsarbete är nu känd som Smalltalk-72. Dess syntax och exekveringsmodell skilde sig mycket från modern Smalltalk, så mycket att det måste betraktas som ett annat språk.
Efter betydande revisioner som fixade flera aspekter av exekveringssemantiken för effektivitet, skapades en version känd som Smalltalk-76. Den här versionen lägger till arv, en syntax närmare Smalltalk-80 och en utvecklingsmiljö som innehåller de flesta verktyg som är bekanta med dagens Smalltalk-utvecklare.
Metaklasser lades till i Smalltalk-80, vilket gjorde frasen "allt är ett objekt" sant genom att associera egenskaper och beteenden med individuella klasser (till exempel stödja olika sätt att instansiera). Smalltalk-80 var den första versionen som var tillgänglig utanför PARC – först som Smalltalk-80 Version 1, distribuerad till ett litet antal företag och universitet för "peer review". Senare, 1983, släpptes en offentlig implementering känd som Smalltalk-80 Version 2 som en bild (en plattformsoberoende fil som innehåller objekt) och en virtuell maskinspecifikation.
Det finns för närvarande två implementeringar av Smalltalk som är direkta ättlingar till Smalltalk-80, Squeak och VisualWorks . [4] Smalltalk-80 version 2-bilden körs på Hobbes, en ST-80 virtuell maskin implementerad på VisualWorks.
Det här exemplet visar två sidor av Smalltalk.
Först, skicka ett meddelande: i Smalltalk utförs alla åtgärder genom att skicka meddelanden till objekt. I det här fallet är meddelandet show: 'Hello, world!', och det skickas till objektet Transcript. För att bearbeta det här meddelandet kommer Transcript-metoden att kallas show:, som bör undersöka dess argument (strängen 'Hello, world!') och mappa det argumentet till transkriptet (observera att du måste ha ett Transcript- fönster öppet för att se resultatet).
För det andra visar detta exempel den grundläggande syntaxen för att skicka ett meddelande i Smalltalk: <meddelandemottagare> <mellanslag> <meddelande>. Till skillnad från C++ finns det inga punkter efter mottagaren och inga parenteser runt argument.
Detta är en enkel klassdefinition med en namn- och kategoridefinition. Vanligtvis tillhandahåller utvecklingsmiljön en stubb med det mesta av texten för detta exempel.
Metoddefinition publicera Transcript show: "Hej, värld!"Detta är definitionen av en metod som heter publish. Metodens kropp är densamma som i det enkla exemplet.
Metodanrop MessagePublisher ny publiceringI det här exemplet skapas en instans av klassen MessagePublisher( MessagePublisher new) och sedan skickas ett meddelande till den publish. Observera att ett språknyckelord inte används för att skapa ett objekt (som i C++, Java, C#), utan ett normalt meddelande skickas newtill MessagePublisher. Meddelanden för att skapa objekt åsidosätts ibland. Till exempel kan en abstrakt klass svara genom newatt returnera en instans av en av dess konkreta underklasser.
Ordböcker och uppslagsverk | |
---|---|
I bibliografiska kataloger |
Programmeringsspråk | |
---|---|
|
Objektorienterade språk | |
---|---|
Sammanställt | |
Skript |
|
Båda föreställningarna |