Smalltalk

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Smalltalk je interpretovaný, dynamicky a striktně typovaný, čistě objektový programovací jazyk, který v sedmdesátých letech 20. století vyvinuli ve firmě Xerox PARC Alan Kay, Dan Ingalls, Ted Kaehler a Adele Goldberg. Inspiraci čerpali převážně z projektů Sketchpad a Simula.

Přestože se nejedná o nejrozšířenější jazyk pro psaní podnikových aplikací či výuku, je dodnes hojně používán. Právě komunita kolem Smalltalku vyvinula extrémní programování, systém testování programu SUnit (jeho známější verze JUnit se hojně využívá v Javě), refaktoring a návrhové vzory.

Původní implementace jazyka měla velmi vysoké pořizovací náklady, což bránilo většímu rozšíření mezi amatéry. V současné době se stávají populární jeho svobodné implementace, např. Squeak.

Historie[editovat | editovat zdroj]

Smalltalk vyvinula skupina výzkumníků kolem Alana Kaye ve výzkumném centru Xerox Palo Alto Research Center. Alan Kay navrhl systém, který Dan Ingalls implementoval. První implementace, později pojmenovaná Smalltalk-71, vznikla během několika rán jako sázka, že programovací jazyk založený na myšlence posílání zpráv z jazyka Simula může „mít stránku kódu“. Pozdější verze používaná pro výzkum se jmenovala Smalltalk-72, její syntaxe a běh byl však stále velmi odlišné od současné verze.

Smalltalk-80 byla první verze, která opustila PARC, nejprve jako Smalltalk-80 Version 1, ji dostali na přezkoumání a otestování některé vybrané společnosti (Hewlett-Packard, Apple Computer, Tektronix a Digital Equipment Corporation) a univerzity (Berkeley). Smalltalk-80 Version 2 už byla vydaná jako tzv. image soubor a specifikace virtuálního stroje.

V současné době jsou velmi populární komerční VisualAge Smalltalk od IBM, svobodný software Squeak, který má velmi aktivní komunitu vývojářů, včetně mnohých vývojářů původního Smalltalku, a konečně překladač GNU Smalltalk od GNU, distribuovaný pod licencí GPL, jehož vývoj však poslední dobou stagnoval.

Objektově orientované programování[editovat | editovat zdroj]

Všechny datové typy jsou Objekt (tak tomu není např. u jazyků Java nebo C++, které navíc rozlišují primitivní typy), dokonce i blok kódu je objekt. Programátor může měnit chování jakékoli třídy objektů. Může dokonce zaměnit i hodnoty true a false, pokud to považuje za vhodné.

Objekt ve Smalltalku umí přesně tři věci:

  • Udržet stav (reference na další objekty)
  • Obdržet zprávu od jiného objektu nebo od sebe
  • V rámci zpracování přijaté zprávy může zaslat zprávu sobě nebo jinému objektu

Stav objektu je ostatním objektům skryt. Ostatní objekty se však na stav mohou dotazovat zasíláním zpráv.

Syntaxe[editovat | editovat zdroj]

Syntaxe jazyka je velmi snadná. Smalltalk má jen těchto pět vyhrazených klíčových slov: true, false, nil, self a super. Jediné vestavěné jazykové konstrukce jsou: zasílání zpráv, přiřazení proměnné, návrat hodnoty z metody a syntaxe literálů pro některé objekty. Vše ostatní, včetně řídicích struktur pro zpracování podmínek a cyklů, je jimi tvořeno.

Literály[editovat | editovat zdroj]

Následující příklady uvádějí nejpoužívanější objekty, které se ve Smalltalku mohou zapsat jako literál.

Čísla[editovat | editovat zdroj]

42
-42
123.45
1.2345e2
2r10010010
16rA000

Poslední dva příklady jsou čísla ve dvojkové a šestnáctkové číselné soustavě, kde r značí základ soustavy (podle anglického slova radix). Samozřejmě jsou možné i jiné soustavy, například 36rSMALLTALK je platný zápis čísla s hodnotou 80738163270632 (desítkově).

Znaky[editovat | editovat zdroj]

Zápisu znaků předchází znak dolaru, například:

$A

Řetězce[editovat | editovat zdroj]

Řetězce jsou uzavřeny mezi apostrofy. Pro vložení apostrofu se tento zdvojuje.

'hello world'
'Scarlet O''Hara'

Dva řetězce jsou si rovny, pokud mají shodné všechny znaky, přestože mají různou adresu v paměti počítače.

Symboly[editovat | editovat zdroj]

Symboly jsou posloupnost znaků, podobně jako řetězce, ale Smalltalk zaručuje, že neexistují dva shodné symboly, které jsou zároveň rozdílné objekty. Pro tuto vlastnost se symboly velmi jednoduše porovnávají, a jsou tedy často používané jako názvy zpráv (viz níže).

Před zápisem symbolu se uvádí znak #

#foo

Pole[editovat | editovat zdroj]

Například pole čtyř typů integer:

#(1 2 3 4)

Bloky programu[editovat | editovat zdroj]

[ nějaké příkazy ]

Deklarace názvů proměnných[editovat | editovat zdroj]

Proměnné se deklarují na začátku bloku, obalené znaky svislé čáry: |

| index slabika |

Tento příklad deklaruje dvě proměnné pojmenované index a slabika. Typy proměnných se nedeklarují, vše je prostě objekt.

Přiřazení proměnné[editovat | editovat zdroj]

Podobně jako v Pascalu, proměnné se přiřazují syntaxí :=

slabika := 'la'

Zprávy[editovat | editovat zdroj]

Zasílání zpráv je základní stavební kamen Smalltalku. Následující příklad zašle číslu „42“ zprávu „factorial“ pro výpočet faktoriálu.

42 factorial

V tomto případě je objekt „42“ tzv. příjemce zprávy a název „factorial“ je tzv. selektor zprávy. Příjemce odpoví na zaslání zprávy navrácením hodnoty. Ta může být například uložena do proměnné:

docelaVelkeCislo := 42 factorial

Zpráva „factorial“ je příklad tzv. unární zprávy neboť je zahrnut jen jeden objekt – příjemce. Pokud mají mít zprávy jako argumenty další objekty, provádí se to takto:

2 raisedTo: 4

Zpráva může mít i více argumentů:

'hello world' indexOf: $l startingAt: 6

Výrazy[editovat | editovat zdroj]

Výraz může zahrnovat více zaslání zpráv. V tom případě se zpracovávají v následujícím pořadí: unární zprávy, binární zprávy, ostatní zprávy.

3 factorial + 4 factorial between: 10 and: 100

se zpracuje takto:

((3 factorial) + (4 factorial)) between: 10 and: 100

Výsledná hodnota příkladu je true.

Protože Smalltalk nezachovává prioritu operátorů, výraz:

3 + 4 * 5

se implicitně zpracuje jako:

(3 + 4) * 5

Následující příklad vytvoří novou instanci okna a uloží ji do proměnné window, které pak zašle dvě zprávy.

| window |
window := Window new.
window label: 'Hello'.
window open.

Pokud takto více výrazů pracuje se stejným příjemcem, je možné použít tzv. kaskádu, která se odděluje znakem středník, čímž již není potřeba proměnné z posledního příkladu:

Window new
  label: 'Hello';
  open

Blok kódu[editovat | editovat zdroj]

Blok se uzavírá do hranatých závorek.

[ :parametry | výrazy ]

Kde parametry je seznam názvů proměnných, které kód přijímá. Například kód pro přičtení hodnoty čísla 1 vypadá následovně:

[:x | x + 1]

Jedná se o jakousi funkci s parametrem. Říká se jí také lambda funkce, anonymní funkce či (nepřesně) closure. Podobný typ funkce je běžný ve funkcionálním programování v jazycích jako Lisp, Scheme či Python.

Tento kód je možné spustit zasláním zprávy s parametrem.

Zavedením těchto bloků ve Smalltalku je možné zapsat i složitější programy velmi přehledně. Například kód, který vybere ze seznamu jen kladná čísla, by se v ostatních jazycích psal pomocí cyklů. Ve Smalltalku je mnohem přehlednější:

novySeznamKladnychCisel := seznamCisel select: [:jednaHodnota | jednaHodnota isPositive]

Řídicí struktury[editovat | editovat zdroj]

Řídicí struktury nejsou součástí syntaxe jazyka, namísto toho jsou implementovány jako zprávy zasílané objektům. Například podmínka je implementována jako zaslání zprávy ifTrue: objektu Boolean, kde argumentem je blok kódu, který se spustí, pokud se jedná o objekt true.

result := a > b
    ifTrue: [ 'promenna a ma vetsi hodnotu' ]
    ifFalse: [ 'promenna a ma mensi hodnotu' ]

Programátoři často používají bloky kódu k vytváření nových řídicích struktur, například:

| mujText souhlasky |
mujText := 'This is a string'.
samohlasky := mujText select: [:pismenko | pismenko isVowel].

Na poslední řádce příkladu přijímá textový objekt mujText zaslanou zprávu select: s parametrem, kterým je v tomto případě blok kódu. Textový objekt v reakci na zprávu select: prochází všechny znaky v textu a spouští blok předaný jako parametr. Výsledkem spuštění bloku [:pismenko | pismenko isVowel] je buď true (v případě, že se jedná o samohlásku) nebo false v opačném případě. Pokud byl výsledek true, je zkoumaný znak vložen do kolekce, která se nakonec uloží do proměnné samohlasky.

Protože je metoda select: definována ve třídě Collection, může se použít i takto

| obdelniky bod |
obdelniky := OrderedCollection 
    with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)
    with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).
bod := Point x: 20 y: 20.
kolize := obdelniky select: [:obdelnik | obdelnik containsPoint: bod].

Třídy[editovat | editovat zdroj]

Takto vypadá definice třídy:

Object subclass: #MessagePublisher
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Smalltalk Examples'

Metody[editovat | editovat zdroj]

Když se objektu zašle zpráva, vyvolá se metoda. Následují kód definuje metodu napsat a tím také definuje, co se stane, když se objektu zašle zpráva napsat.

napsat
    Transcript show: 'Hello, World!'

Všimněte si, že objekt vyhledá metodu podle zprávy za běhu programu (zatímco mnoho jazyků toto vyhodnocuje v době překladu).

Instance třídy[editovat | editovat zdroj]

Následující kód

PisatelZpravy new

vytváří (vrací) novou instanci třídy PisatelZpravy. Většinou se takový objekt uloží do proměnné:

pisatel := PisatelZpravy new

Toto není nutné vždy, je také možné zaslat zprávu objektu, který nebyl uložen do proměnné. Takovému objektu se říká „anonymní objekt“:

PisatelZpravy new napsat

Příklad Hello World[editovat | editovat zdroj]

Klasický příklad Hello World je možné zapsat takto:

Transcript show: 'Hello, world!'.

Objektu Transcript se posílá zpráva show: s parametrem 'Hello, world!'. Vyvolání metody show: vypíše na konzoli řetězec, který se předal jako parametr.

Pozor: okno Transcript se musí nejdřív otevřít, než je mu možné tuto zprávu poslat.

Externí odkazy[editovat | editovat zdroj]