Småsnak | |
---|---|
Semantik | objektorienteret |
Sprog klasse | programmeringssprog |
Dukkede op i | Udvikling startede i 1969, blev tilgængelig til almindelig brug i 1980 |
Forfatter | Alan Kaye , Adele Goldberg , Dan Ingalls, Xerox PARC |
Udvikler | Kaye, Alan Curtis , Adele Goldberg [1] , Daniel Henry Holmes Ingalls [d] og Diana Merry [d] |
Frigøre | Smalltalk-80 version 2 |
Test version | 1980 |
Type system | dynamisk |
Større implementeringer | Pharo , Squeak , VisualWorks , GNU Smalltalk |
Blev påvirket | Simula , Skitseblok , Lisp , Logo |
påvirket | Objective-C , AppleScript , C# , Dylan , Groovy , Io , Java , Lisaac , NewtonScript , Python , Ruby , Scala , Self , C++ |
Smalltalk ( [ˈsmɔːltɔːk] ) er et dynamisk skrevet objektorienteret programmeringssprog baseret på ideen om at sende beskeder , udviklet på Xerox PARC af Alan Kay , Dan Ingalls , Ted Kagler , Adele Goldberg og andre i 1970'erne . Det er et integreret udviklings- og eksekveringsmiljø, hvis objekter er tilgængelige for modifikation gennem sig selv, og programmering, hvor i sidste ende kommer ned på at ændre sin egen adfærd. Sproget blev introduceret som Smalltalk-80.
Smalltalk er et af mange objektorienterede sprog baseret på Simula -sproget [2] , som selv har haft stor indflydelse på udviklingen af sådanne objektorienterede sprog som: Objective-C , Actor , Java , Erlang [ 3] , Groovy , Ruby og mange andre. Mange af 1980'ernes og 1990'ernes programmeringsideer opstod i Smalltalk-samfundet. Disse omfatter refactoring , designmønstre (som anvendt på software), klasse-ansvar-interaktionskort og ekstrem programmering generelt. Grundlæggeren af wiki -konceptet, Ward Cunningham , er også en del af Smalltalk-fællesskabet.
Hovedideerne i Smalltalk er:
Smalltalk bruger også andre moderne ideer:
En af de særlige kendetegn ved Smalltalk er, at selv sådanne traditionelle konstruktioner som hvis-så-andet, for, mens osv. ikke er en del af sproget. Alle af dem er implementeret ved hjælp af . For eksempel træffes en beslutning ved at sende en besked til et ifTrue:boolsk objekt og overfører kontrol til et stykke tekst, hvis den boolske værdi er sand.
Faktisk er der få indbyggede syntaktiske konstruktioner i sproget:
og adskillige syntakskonstruktioner til at definere bogstavelige objekter og midlertidige variabler.
Analogen til Smalltalk-meddelelsesmekanismen er internettet: du kan forestille dig hvert objekt som en webserver, der reagerer på anmodninger. Samtidig kan serveren blot udsende et foruddefineret svar på anmodninger, for eksempel en webside placeret langs en bestemt sti; kan omdirigere anmodningsmeddelelsen til et andet objekt, den analoge er en proxyserver; kan ændre anmodningen efter visse regler, den analoge er url-omskrivningsteknikken, og den kan selvfølgelig danne en helt ny side svarende til de data, der sendes med beskeden. Hvis objektet ikke har en foruddefineret metode til at svare på beskeden, kalder frameworket #doesNotUnderstand: metoden på modtageren, ligesom en webserver returnerer en fejlside, hvis der gives en ikke-eksisterende websidesti.
En kort oversigt over syntakselementerne:
Et separat tegnpar |omgiver listen over variabelnavne, der vil være midlertidige. :Når du sender en meddelelse, placeres tegnet efter navnet på meddelelsen eller dens argument, før den værdi, der sendes med den, og tegnene [og ]begrænser blokken af kommandoer, eller rettere, det bogstavelige af den anonyme funktion. Men de kan for det første opfattes som analoge med krøllede seler også {på }C-lignende sprog. I begyndelsen af en sådan anonym funktion, op til et tegn |, kan du liste de argumenter, den kræver. Resultatet vil være det sidste udtryk, det evaluerede. Et symbol .afslutter en enkelt kommando, et symbol ; adskiller meddelelser, der skal sendes sekventielt til det samme objekt. Et tegnpar :=angiver tildelingen til en variabel, hvis navn er placeret foran den, et bogstaveligt objekt eller et meddelelsessvarobjekt placeret efter det.
Det følgende eksempel, der viser at finde vokaler i en streng, illustrerer Smalltalk-stilen.
| aString vokaler | aString := 'Dette er en streng' . vokaler := aString vælg: [ : aTegn | et tegn erVokal ] .I den sidste linje i eksemplet sendes en besked til select:strengobjektet med et argument - en anonym kodeblok, der tager ét argument og returnerer det, som isVowel-hændelseshandleren for objektet, der sendes med dette argument, vil returnere. Ved behandling af select-meddelelsen kaldes en metode select:fra klassen Collection(en af forfædrene til klassen String, som objektet, der er oprettet af strengen literal i eksemplets anden linje, tilhører). Teksten til denne metode er vist nedenfor:
vælg: bloker | ny samling | newCollection := selv art ny . selv gør: [ : hver | ( aBlokværdi : hver ) ifTrue: [ newCollection add: each ]] . ^ ny samlingDen tager den anonyme funktion aBlock som input, opretter en ny samling, der ligner sig selv, og kalder dens elementer opregning (dette er metoden do:), og udfører den blok, der er sendt til den aBlockfor hvert element; når blokken udføres (i eksemplet - aCharacter isVowel), skaber den en boolesk værdi, hvortil beskeden så sendes ifTrue:. Hvis denne værdi er true, tilføjes bogstavet til den returnerede streng. I slutningen returneres den oprettede samling som et svar på beskeden, angivet med retursymbolet som svar ^. Fordi det er select:defineret i en abstrakt klasse Collection, kan vi også bruge det sådan her:
| rektangler aPoint | rektangler := Bestilt Samling med: ( Rektangel venstre: 0 højre: 10 top: 100 bund: 200 ) med: ( Rektangel venstre: 10 højre: 10 top: 110 bund: 210 ) . aPunkt := Punkt x: 20 y: 20 . kollisioner := rektangler vælg: [ : aRekt | aRect indeholderPunkt: aPunkt ] .Smalltalk blev skabt af en gruppe forskere, ledet af Alan Kay , ved Xerox PARC Research Center . Den første implementering, kendt som Smalltalk-71, blev skabt inden for få måneder som et resultat af en debat om, at et programmeringssprog baseret på Simula-ideen om afsendelse af beskeder skulle implementeres i en "side med kode". Den senere version, der faktisk bruges til forskningsarbejde, er nu kendt som Smalltalk-72. Dens syntaks og udførelsesmodel var meget forskellig fra moderne Smalltalk, så meget, at det må betragtes som et andet sprog.
Efter betydelige revisioner, der fikserede flere aspekter af udførelsessemantikken for effektivitet, blev en version kendt som Smalltalk-76 oprettet. Denne version tilføjer arv, en syntaks tættere på Smalltalk-80 og et udviklingsmiljø, der indeholder de fleste af de værktøjer, som nutidens Smalltalk-udviklere kender.
Metaklasser blev tilføjet i Smalltalk-80, hvilket gør udtrykket "alt er et objekt" sandt ved at associere egenskaber og adfærd med individuelle klasser (f.eks. understøtte forskellige måder at instansiere på). Smalltalk-80 var den første version tilgængelig uden for PARC - først som Smalltalk-80 Version 1, distribueret til et lille antal virksomheder og universiteter til "peer review". Senere, i 1983, blev en offentlig implementering kendt som Smalltalk-80 Version 2 frigivet som et billede (en platformsuafhængig fil indeholdende objekter) og en virtuel maskinspecifikation.
Der er i øjeblikket to implementeringer af Smalltalk, der er direkte efterkommere af Smalltalk-80, Squeak og VisualWorks . [4] Smalltalk-80 version 2-billedet kører på Hobbes, en ST-80 virtuel maskine implementeret på VisualWorks.
Dette eksempel viser to sider af Smalltalk.
Først, at sende en besked: i Smalltalk udføres alle handlinger ved at sende beskeder til objekter. I dette tilfælde er beskeden show: 'Hello, world!', og den sendes til objektet Transcript. For at behandle denne besked kaldes Transcript-metoden show:, som skal undersøge dens argument (strengen 'Hej, verden!') og tilknytte dette argument til transskriptionen (bemærk, at du skal have et Transcript -vindue åbent for at se resultatet).
For det andet viser dette eksempel den grundlæggende syntaks for at sende en besked i Smalltalk: <beskedmodtager> <mellemrum> <meddelelse>. I modsætning til C++ er der ingen prikker efter modtageren og ingen parenteser omkring argumenter.
Dette er en simpel klassedefinition med en navn- og kategoridefinition. Typisk giver udviklingsmiljøet en stump med det meste af teksten til dette eksempel.
Metodedefinition udgiv Transcript show: 'Hej, verden!'Dette er definitionen af en metode, der hedder publish. Metodens krop er den samme som i det simple eksempel.
Metodekald MessagePublisher ny udgivelseI dette eksempel oprettes en forekomst af klassen MessagePublisher( MessagePublisher new), hvorefter der sendes en besked til den publish. Bemærk, at et sprognøgleord ikke bruges til at oprette et objekt (som i C++, Java, C#), men en normal besked sendes newtil MessagePublisher. Meddelelser til oprettelse af objekter tilsidesættes nogle gange. For eksempel kan en abstrakt klasse reagere ved newat returnere en forekomst af en af dens konkrete underklasser.
![]() | |
---|---|
I bibliografiske kataloger |
Programmeringssprog | |
---|---|
|
Objektorienterede sprog | |
---|---|
Kompileret | |
Scriptet |
|
Begge forestillinger |