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, nebo Pharo.

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 většinu raných verzí Smalltalku, Adele Goldberg napsala většinu dokumentace a Dan Ingalls většinu raných verzí implementoval. První verzi, známou jako Smalltalk-71, vytvořil Alan Kay během několika rán jako sázku, že programovací jazyk založený na myšlence zasílání zpráv, inspirovaném jazykem Simula, lze napsat na „jediné stránce kódu“. Pozdější variantu, která už byla skutečně využívána pro výzkum, dnes známe jako Smalltalk-72, avšak její syntaxe i způsob provádění byly stále velmi odlišné od verzí používaných dnes.

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. Pří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í stejné 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 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é:

cislo:= 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" | "příkazy" ]

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[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]