Smalltalk
Z Wikipedie, otevřené encyklopedie
Smalltalk je moderní, interpretovaný dynamicky typovaný, objektově orientovaný programovací jazyk, který v Xerox PARC vyvinuli Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg v sedmdesátých letech. Insipiraci č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í svobodné implementace jako Squeak.
Obsah |
[editovat] Historie
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.
[editovat] Objektově orientované programování
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ávý 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.
[editovat] Syntaxe
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ě řídících struktur pro zpracování podmínek a cyklů, je jimi tvořeno.
[editovat] Literály
Následující příklady uvádějí nejpoužívanější objekty, které se ve Smalltalku mohou zapsat jako literál.
[editovat] Čísla
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ě).
[editovat] Znaky
Zápisu znaků předchází znak dolaru, například:
$A
[editovat] Řetězce
Ř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.
[editovat] Symboly
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
[editovat] Pole
Například pole čtyř typů integer:
#(1 2 3 4)
[editovat] Bloky programu
[ nějaké příkazy ]
[editovat] Deklarace názvů proměnných
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.
[editovat] Přiřazení proměnné
Podobně jako v Pascalu, proměnné se přiřazují syntaxí :=
slabika := 'la'
[editovat] Zprávy
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řípade 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
[editovat] Výrazy
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
[editovat] Blok kódu
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 parameterm. Říká se jí také lambda kalkul či 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í psal pomocí cyklů. Ve Smalltalku je mnohem přehlednější:
novySeznamKladnychCisel := seznamCisel select: [:jednaHodnota | jednaHodnota isPositive]
[editovat] Řídící struktury
Řídící 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 řídících struktur, například:
| mujText souhlasky | mujText := 'This is a string'. souhlasky := 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é souhlasky.
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].
[editovat] Třídy
Takto vypadá definice třídy:
Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples'
[editovat] Metody
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).
[editovat] Instance třídy
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
[editovat] Příklad Hello World
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.
[editovat] Externí odkazy
- Squeak: návrat do budoucnosti – seriál na Root.cz
| Programovací jazyky | |||
|
ABAP | Ada | AWK | Assembler | C | C++ | C# | COBOL | ColdFusion | Clean | D | Eiffel | Erlang | Flex | Fortran | JADE | Java | JavaScript | Lisp | Lua | Oberon | Object Pascal | Objective-C | Pascal | Perl | PHP | Python | REALbasic | REBOL | RPG | Ruby | SQL / PL/SQL | Tcl / Tcl/Tk | Visual Basic / VBScript | VB.NET | Visual FoxPro
|

