2013-06-18 35 views
6

Jestem nowym przybyszem do Smalltalk i nauczyłem się tego w pisowni. Ale w Smalltalk wiele rzeczy jest mylących. W Squeak, MetaClass i MetaClass class wzajemnie sobie odpowiadają. Jeśli chcę utworzyć obiekt MetaClass powinienem wysłać wiadomość new do jej klasy, która jest MetaClass class. Ale musiało już istnieć jako obiekt, aby zaakceptować wiadomość. Dlatego najpierw muszę utworzyć obiekt MetaClass class, który można wykonać tylko wysyłając wiadomość new do obiektu MetaClass, która nie została jeszcze utworzona. Jest to więc problem z kurczakiem lub jajkiem.Niespójności w smalltalk

Oczywiście mogę teraz tworzyć obiekty w Squeaku, ponieważ obiekty MetaClass i MetaClass class zostały już utworzone automatycznie, gdy skrzypienie zostanie otwarte. Ale nie wiem jak. Być może są one tworzone w jakiś sposób raczej poprzez wysyłanie wiadomości. Ale to jest sprzeczne z duchami Smalltalk: wszystko dzieje się poprzez wysyłanie wiadomości z wyjątkiem kilku punktów (deklaracja zmiennych, przypisania, zwroty i prymitywy).

Czy jest coś nie w porządku z powyższym rozumowaniem? Z góry dziękuję.

Odpowiedz

11

Proces "automagicznie stworzony" faktycznie nazywa się bootstrapping. W ten sposób problem z kurczakiem i jajkiem zostaje rozwiązany. Po załadowaniu systemu, cała reszta może być wyrażona w kategoriach samego systemu.Tak więc, nie ma sprzeczności z filozofią Smalltalk, że wszystko dzieje się poprzez wysyłanie wiadomości, ponieważ staje się tylko systemem Smalltalk, gdy jest bootstrapped.

12

Twoje pytanie jest dwojakie, odpowiedzmy osobno.

W jaki sposób tworzone są wzajemne klasy zależne?

Masz rację, Metaclass i Metaclass class są osobliwościami w równoległej hierarchii klas Smalltalk i metaclasses. Jak są tworzone?

To zależy od używanego Smalltalk. Dla GNU Smalltalk nie jestem pewien, ale dla potomków oryginalnego Smalltalk-80 (VisualWorks, VA alias VisualAge, SqueakPharo) są one tworzone w procesie Bootstrap, który tworzy początkowy obraz.

Jednak, przynajmniej dla Squeak, ten bootstrap zdarzył się co najmniej 15 lat temu, jeśli nie więcej. Metaclass i jego klasa może mieć nawet 30 lat.

Krótko mówiąc, obie klasy są tworzone poza typowym przetwarzaniem obrazów i łączone ręcznie.

Ale jeśli obiekty są lat, które prowadzi do pytania

co dzieje się na starcie w Smalltalk?

W przeciwieństwie do języków takich jak Ruby lub Python, które są również zorientowane obiektowo, Smalltalk nie musi tworzyć podstawowego środowiska obiektowego z takimi obiektami jak Object przy każdym starcie. Czemu?

Kiedy Smalltalk zapisuje i zamyka, w zasadzie robi migawkę całego obiektu i zapisuje ten obiekt na żywo do pliku. Po ponownym uruchomieniu, po prostu musi odczytać obiekty z migawki i "ożywić" je.

Z tego powodu oba obiekty są odczytywane z migawki i odtwarzane, i od tej chwili są w pełni funkcjonalne; nie muszą już być ręcznie tworzone.

+1

Czy po zdefiniowaniu klasy, takiej jak "A", obiekt 'A' zostanie utworzony przez system Smalltalk i zostanie zapisany na obrazie podczas zamykania? – spockwang

+1

Tak, po zapisaniu obrazu obiekt klasy "A" przetrwa. – Tobias

8

Metaclass class class = Metaclass to klasyczny akademicki przykład dziwnej pętli. Ale jeśli zapytasz, możesz znaleźć wiele innych w Smalltalk.

  • Przedmiot nadrzędna jest zerowa, która jest przykładem UndefinedObject które jest podklasy przedmiot (dłuższym łańcuchu poprzez ProtoObject w Squeakiem Object superclass superclass class superclass = Object)
  • Metody MethodDictionary są przechowywane w instancji MethodDictionary (MethodDictionary methodDictionary class = MethodDictionary).
  • Nazwa symbolu jest instancją symbolu (działa z ByteSymbol in Squeak ByteSymbol name class = ByteSymbol).
  • Podklasy kolekcji ArrayedCollection są przechowywane w instancji Array, która jest podklasą ArrayedCollection (Array superclass subclasses class = Array).
  • Smalltalk jest SystemDictionary, który wskazuje Smalltalk za pomocą #Smalltalk klucz (To jest mniej bezpośrednie w Squeak, (Smalltalk globals at: #Smalltalk) = Smalltalk).

Pozwalam ci kontynuować listę sam.

Cokolwiek realizacja, ostatecznym pytaniem jest, czy nie można opracować własny opisując systemie jak Smalltalk bez tych dziwnych pętli i można dostrzec nie tak pozytywną odpowiedź, jeśli się sublinks o http://en.wikipedia.org/wiki/Kurt_G%C3%B6del#The_Incompleteness_Theorem

W powiązaniu z problemem ładowania początkowego napotkanym w takim systemie, skutecznym sposobem jest klonowanie się w celu zmiany siebie, co jest szczególnie widoczne w obrazie Smalltalk, gdy chcesz zmienić klasy bazowe, których używasz do zmiany/opisu klas.
Stąd mój poprzedni i zwięzłą odpowiedź, która została usunięta przez zastosowanie list reguł (https://stackoverflow.com/help/deleted-answers) więcej niż duchem moim zdaniem:

A oto jak to zostało rozwiązane:http://en.wikipedia.org/wiki/Drawing_Hands

ostatni punkt , Wolałbym przeczytać, Incredible Consistency of Smalltalk, ale jestem zdecydowanie stronniczy.

+0

Czy "Nieoczywalna spójność Smalltalk_" jest książką? Ale nie mogę znaleźć zbyt wielu informacji w Google. – spockwang

+1

Nie martw się, jakość moderacji na stackoverflow jest straszna. Tego można się spodziewać przy obecnym poziomie wiedzy w IT. Zasady większości –

+3

@spockwang to nie jest książka, jest to odniesienie do faktu, że Smalltalk jest dużo bardziej spójny niż jakikolwiek inny główny język –