Start  |  Gry  |  Słowniki *  
 : : Menu
Dla początkujących
Dla praktyków
Język
Wersje
Książki
Smalltalk vs. Java
Wiadomości
Linki
FAQ
Pobierz
Co nowego?
Mapa serwisu
Kontakt
Impressum
Księga gości
Po godzinach
Nakarm głodne dziecko - wejdź na stronę www.Pajacyk.pl
 

Najczęściej zadawane pytania (FAQ)
"Nie ma głupich pytań, są tylko głupie odpowiedzi."

Pytania:

Podstawy |  Język |  Środowisko


Podstawy



Czy są dostępne jakieś podręczniki języka Smalltalk w języku polskim?



Co to jest maszyna wirtualna?

Maszyna wirtualna (ang. virtual machine) jest specyficznym dla danej platformy programem binarnym, który interpretuje i wykonuje niezależny od platformy kod wynikowy języka Smalltalk, tzw. byte code. Maszyny wirtualne Smalltalk istnieją obecnie praktycznie dla wszystkich współczesnych systemów operacyjnych. Są one dostępne nawet dla urządzeń typu PDA. Istnieje także projekt SqueakNOS mający na celu stworzenie kompletnego systemu operacyjnego w języku Squeak Smalltalk.



Co to jest "image"?

W większości środowisk obiektowych obiekty istnieją tylko w pamięci RAM podczas wykonywania programu. Za każdym razem przy starcie aplikacji wszystkie obiekty są tworzone "programowo" od nowa. W Smalltalku jest inaczej. Stan aplikacji tj. wszystkie obiekty są zapisywane w pliku zwanym image. Tak więc image jest plikiem, który jest dokładną kopią aplikacji uruchomionej w pamięci. Oprócz "normalnych" obiektów image przechowuje także klasy i metody, które oczywiście w Smalltalk są jak najbardziej normalnymi obiektami.
Uruchomienie aplikacji np. środowiska IDE czy aplikacji biznesowej polega właśnie na uruchomieniu uprzednio zapisanego image.

Inaczej mówiąc image jest plikiem zawierającym kompletny kod wynikowy języka Smalltalk (byte code) i dane aplikacji. Plik ten jest niezależny od platformy. Chcąc opublikować swoją aplikację wystarczy zapisać image w stanie w jakim powinien pojawić się po uruchomieniu programu, usunąwszy ewentualnie wcześniej narzędzia programistyczne takie jak na przykład browser czy debugger (czynność ta w większości wersji Smalltalka jest zautomatyzowana).



Czy źródła klas są przechowywane w image?

Źródła (ang. sources) aplikacji nie są przechowywane w image, gdyż są potrzebne tylko podczas implementacji. Image zawiera wyłącznie wstępnie skompilowany, niezależny od platformy kod (ang. byte code), który jest następnie tłumaczony przez maszynę wirtualną na kod zrozumiały dla danego systemu i procesora. Źródła natomiast są przechowywane w oddzielnym pliku ew. bazie danych.
Istnieje jednak możliwość odtworzenia źródeł aplikacji na podstawie byte codes z image. Większość wersji Smalltalk oferuje taką możliwość.



Gdzie jest metoda "main"?

Oczywiście w Javie i w C :-). W języku Smalltalk nie istnieje żadna specjalna metoda, procedura, czy funkcja, która służy do uruchamiania programu. Jest to niepotrzebne ponieważ image jest zapisywany w stanie, w jakim następnie zostanie odtworzony. Tak więc aby opublikować swoją aplikacje wystarczy uruchomić jej główne okno i zapisać stan image (usunawszy uprzednio narzędzia programistyczne takie jak na przykład browser czy debugger).






Język



Czy istnieje standard języka Smalltalk?

Projekt standardu ANSI jest do pobrania pod adresem: ftp://www.smalltalksystems.com/sts-pub/x3j20/.



Czym jest w Smalltalku zmienna?

Wszystkie zmienne w Smalltalku są wskaźnikami czyli adresami w pamięci pod którymi umieszczone są wskazywane obiekty. Dlatego też właśnie typ danej zmiennej może zostać określony dopiero po umieszczeniu konkretnego obiektu pod adresem jaki ona wskazuje (w trakcie wykonywania programu). Inaczej mówią Smalltalk stosuje dynamiczną typizację. Programista w trakcie implementacji programu zauważa tę cechę jako brak konieczności deklaracji typu zmiennej i możliwość przypisania do zmiennej obiektu dowolnego typu.

Przykład:
x := 26.zmienna x wskazuje obszar pamięci pod którym znajduje się instancja klasy Integer ).
x := 'Hello'.x wskazuję obszar pamięci pod którym znajduje się instancja klasy String.

Smalltalk posiada pięć różnych typów zmiennych:

  • Zmienne instancyjne
  • Zmienne klasowe
  • Zmienne tymczasowe
  • Zmienne globalne
  • Zmienne "Pool"


Co to są zmienne instancyjne?

Są to prywatne zmienne instancji danej klasy, niedostępne z zewnątrz (dla innych obiektów). Dostęp do tych zmiennych ma tylko obiekt je zawierający. Nazwy zmiennych instancyjnych rozpoczynają się z małej litery.



Co to są zmienne klasowe?

Są to prywatne zmienne klasy, widoczne w hierarchii danej klasy i jej obiektach. Nazwy zmiennych klasowych rozpoczynają się z dużej litery.



Co to są zmienne tymczasowe?

Są to zmienne widoczne wyłącznie wewnątrz metody i aktualnego kontekstu w którym są zdefiniowane. Istnieją tak długo, jak długo istnieje dany kontekst. Po tym czasie obiekty przez nie wskazywane są automatycznie usuwane przez Garbage Collection (oczywiście od warunkiem, że nie są one wskazywane przez inne zmienne).



Co to są zmienne globalne?

Są to zmienne widoczne w całym systemie (dostępne więc dla wszystkich klas). Nazwy zmiennych globalnych rozpoczynają się z dużej litery.



Jak wyglądają nazwy zmiennych w Smalltalku?

Nazwy zmiennych w Smalltalku są ciągiem liter i cyfr, ale rozpoczynają się zawsze literą. Smalltalk rozróżnia duże i małe litery, a więc thevariable i theVariable to dwie różne zmienne.



Jaką wartość zawierają nowe zmienne?

Wszystkie nowe zmienne wskazują początkowo obiekt nil. W celu przypisania im wartości używana jest metoda ":="



Co to są zmienne specjalne?

Są to trzy specjalne zmienne do których nie można przypisać żadnej wartości: self, super i thisContext. Wartości zwracane przez te zmienne są zależne od kontekstu ich wykonania.

Zmienna self wskazuje na obiekt, który wykonuje aktualną metodę. W najprostszym wypadku zmienna self pozwala z wnętrza jednej metody danego obiektu wywołać inną metodę należącą do tego samego obiektu. Na przykład metoda bounds instancji klasy Rectangle może użyć metody computeBounds z tego samego obiektu za pomocą wyrażenia self computeBounds.

Zmienna super różni się od self tym, że poszukiwanie implementacji metody, która ma być wywołana rozpoczyna się w nadklasie klasy, której instancją jest dany obiekt. Jeżeli nadklasa nie implementuje danej metody wywołana zostanie metoda z obiektu, który wywołal super. Na przykład wywołanie super bounds wewnątrz metody instancji klasy Rectangle spowoduje, że zostanie wywołana metoda bounds zdefiniowana w klasie Geometric. Natomiast wywołanie super rounded spowoduje wywołanie metody rounded zdefiniowanej w klasie Rectangle, ponieważ klasa Geometric nie implementuje tej metody.
Drugą różnicą w stosunku do self jest to, że zmienna super nie może zostać przypisana do żadnej innej zmiennej.

Przykład:

| value |

value := self. "Poprawne."
value := super. "Tak nie można!"


Co to są zmienne niezadeklarowane

Jeżeli jakaś zmienna zostanie usunięta z systemu ale istnieją do niej ciągle referencje, to jej nazwa jest automatycznie wstawiana do katalogu ze zmiennymi niezadeklarowanymi (Undeclared). Katalog ten jest zarządzany automatycznie przez system.



Co to jest literał?

Literał jest fragmentem kodu zamienianym przez maszynę wirtualną od razu w obiekt. Przykładem są słowa kluczowe, ale również:

"Przykłady literałów w Smalltalku"
'To jest literał' String
#atosymbolSymbol
-26, 3e6Integer
-3.8Float
7/5Fraction
2r011Zapis dwójkowy
8r126Zapis ósemkowy
16r4AEZapis szesnastkowy
$CCharacter
#(1 2 3)Array (tablica) zawierająca liczby całkowite (Integer)
#( #(5 6 7) #(9 13 15))tablica zawierająca tablice



Jak można wstawić komentarz w Smalltalku?

Komentarz w języku Smalltalk umieszczony jest między znakami cudzysłowia. Wszystko co znajduje się między tymi znakami nie jest kompilowane do image, lecz wyłącznie przechowywane w kodzie źródłowym.

"To jest przykładowy komentarz w Smalltalku"



Co to są bloki kodu?

Blok kodu jest instancją klasy BlockClosure i może zawierać wiele instrukcji Smalltalkowych, które zostaną wykonane po wysłaniu do bloku wiadomości value lub jednej z jej odmian:

value: anObject
value: anObject value: anObject
value: anObject value: anObject value: anObject
valueWithArguments: anArray


W jaki sposób tworzy się blok kodu?

Blok kodu tworzy się za pomocą nawiasów klamrowych "[]".



Jaki wynik zwraca blok kodu?

Rezultatem wykonania bloku kodu jest obiekt zwracany przez ostatnie wyrażenie wykonane w tym bloku. Pusty blok w większości implementacji Smalltalka zwraca jako wynik swojego wykonania nil. Zwracanie nil przez pusty blok kodu nie jest jednak przewidziane przez projekt standardu ANSI. Więcej na ten temat znajduje się w dziale "Dla praktyków".

[] value. "W większości implementacji Smalltalka zwraca nil"

[2] value. "Zwraca 2"

[|x y z|
   x := 2.
   y := 4.
   z := x + y.
   x + z] value. "Zwraca 8 (rezultat wykonania x + z)"

[:arg1 :arg2 | arg1 + arg2] value: 22 value: 6. "Zwraca 28"

[:a :b :c :d :e | a * b - c + d - e] valueWithArguments: #(7 4 9 2 1). "Zwraca 20"


Do czego przydają się bloki kodu?

Bloki kodu są najczęściej wykorzystywane jako argumenty metod:

(a > b)
   ifTrue: [doSomething].

[counter > 10] whileFalse:[
   doSomething. counter := counter + 1].
"Tutaj także jako odbiorca wiadomości"

aCollection do: [:eachElement |
   eachElement doSomething]
.

aCollection select: [:eachElement |
   eachElement = anObject]
.

1 to: 10 do: [:index |
   (anArray at: index) doSomething]
.


Co to są wiadomości?

Wiadomości są to instrukcje rozumiane przez obiekty, zaimplementowane w tych obiektach w postaci metod. Na przykład wiadomość sin jest rozumiana przez instancje klasy Number i oznacza żądanie obliczenia sinusa z wartości będącej odbiorcą tej wiadomości.

Wiadomość składa się z nazwy metody i argumentów i jest wysyłana do odbiorcy wiadomości. W wyrażeniu 9 raisedTo: 2 odbiorcą wiadomości jest liczba 9, nazwą metody jest raisedTo:, a argumentem jest liczba 2.

Każda wiadomość zwraca jako rezultat swojego wykonania jakiś obiekt do obiektu wysyłającego daną wiadomość. W powyższym przykładzie metoda raisedTo: zwraca instancję klasy SmallInteger, czyli liczbę 81. Domyślnie każda metoda zwraca odbiorcę wiadomości (self). Stosując operator "^" można zwrócić dowolny inny obiekt:

^6 "Zwraca liczbę 6"

^7 + 2 "Zwraca liczbę 9"

Istnieją trzy rodzaje wiadomości: unarna (ang. unary), binarna (ang. binary) i wiadomość wieloargumentowa, składająca się z jednego lub kilku słów kluczowych (ang. keyword).



Co to są wiadomości unarne?

Wiadomość unarna to wiadomość, która posiada nazwę metody i jej odbiorcę, ale nie ma argumentów.

Przykłady:

1.0 sin "Zwraca sinus z liczby 1.0"
Array new. "Zwraca pustą tablicę"
Date today. "Zwraca aktualną datę"


Co to są wiadomości binarne?

Wiadomość binarna jest to wiadomość, która używa znaku specjalnego, na przykład znaku "+", jako nazwy metody i posiada dokładnie jeden argument. Niektóre wiadomości binarne składają się z kombinacji dwóch znaków specjalnych, na przykład operator porównania ">=".

Wiadomości binarne w Smalltalku:

Nazwa metody Przykład Opis
+ 1 + 2 Operator dodawania
- 12 - 3 Operator odejmowania
* 3 * 2 Operator mnożenia
/ 9 / 3 Operator dzielenia
** 2 ** 3 Potęgowanie
// 17 // -2 Dzielenie całkowite (bez reszty)
\\ 17 \\ -2 Reszta z dzielenia
< index < 100 Mniejszy niż
<= index <= 10 Mniejszy lub równy
> index > 1 Większy niż
>= index >= 10 Większy lub równy
= index = 7 Wartości są równe
~= index ~= 6 Wartości nie są równe
== x == y Ten sam obiekt (odbiorca i argument są tym samym obiektem lub wskazują na ten sam obiekt)
~~ x ~~ y Różne obiekty
& (a < 0) & (b = 1) Logiczny AND
| (a < 0) | (b = 1) Logiczny OR
, 'abc','def' Łączenie dwóch ciagów znaków
@ 2 @ 3 Zwraca instancję klasy Point (x jest odbiorcą wiadomości, a y jest jej argumentem)
-> #columns -> 3 Zwraca instancję klasy Association (klucz jest odbiorcą wiadomości, a wartość jest jej argumentem)


Co to są wiadomości wieloargumentowe?

Wiadomości wieloargumentowe są to wiadomości, które składają się z jednego lub więcej słów kluczowych, zakończonych dwukropkiem, po którym następuje argument wiadomości.

Przykłady:

Array new: 5. "Tworzy tablicę pięcioelementową"

Rectangle left: 2 top: 4 right: 10 bottom: 12. "Tworzy kwadrat"

'abcdefgh' copyFrom: 2 to: 5. "Kopiuje elementy od 2 do 5 do nowej instancji klasy String"





Środowisko programistyczne



Co to jest "Workspace"?

Workspace jest edytorem tekstowym umożliwiającym pisanie i wykonywanie skryptów w języku Smalltalk oraz testowanie nowego kodu. Dzięki temu nie trzeba za każdym razem modyfikować istniejących klas lub definiować klasy wyłącznie do testowania kodu czy uruchamiania skryptów.



Co to jest "Transcript"?

Transcript jest specjalnym rodzajem Workspace, do którego można pisać z dowolnego miejsca w systemie. Może służyć przykładowo do wyświetlania informacji o przebiegu wykonania aplikacji, ważnych informacji systemowych itp.

Przykładowy wpis do Transcript może wyglądać tak:

Transcript show: 'Witaj w systemie Smalltalk!'.

lub

Transcript show: Date today printString.

Od strony technicznej Transcript jest przechowywany w zmiennej globalnej o nazwie Transcript, która przechowuje instancję klasy TextCollector. Najbardziej użytecznymi metodami tej klasy są:

Metoda Opis
show: aString wyświetla podany ciąg znaków
nextPut: aCharacter dodaje podany znak do swojego cache, ale nie wyświetla go
nextPutAll: aString dodaje podany ciąg znaków do swojego cache, ale nie wyświetla go
flush wyświetla całą dotąd niewyświetlaną zawartość cache
clear czyści całą zawartość cache i Transcript
cr dodaje do cache znak przejścia do nastepnego wiersza
space dodaje do cache spację
tab dodaje do cache znak tabulacji
tab: aInteger dodaje do cache podaną ilość znaków tabulacji


SelfSmaltalk, (c) ObjectSpace.Net
Strona wygenerowana przy pomocy edytora aceHTML
i systemu VisualWorks Smalltalk NC 7.0