|
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?
Nie. Prawie cała literatura poświęcona temu językowi jest dostepna w języku angielskim. Więcej informacji można znaleźć na stronie " Książki".
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?
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 |
| #atosymbol | Symbol |
| -26, 3e6 | Integer |
| -3.8 | Float |
| 7/5 | Fraction |
| 2r011 | Zapis dwójkowy |
| 8r126 | Zapis ósemkowy |
| 16r4AE | Zapis szesnastkowy |
| $C | Character |
| #(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 |
|