2013-06-18 4 views
6

Я новый посетитель Smalltalk и узнал его в Squeak. Но я нахожу много вещей, смущающих в Smalltalk. В Squeak, MetaClass и MetaClass class друг друга друг друга взаимно. Если я хочу создать объект MetaClass, я должен отправить сообщение new в его класс, который является MetaClass class. Но он, должно быть, уже существовал как объект, чтобы принять сообщение. Поэтому я должен сначала создать объект MetaClass class, что может быть сделано только путем отправки сообщения new объекту MetaClass, который еще не создан. Так что это проблема с курицей или яйцом.Несоответствия в smalltalk

Конечно, я могу создать объекты в Squeak сейчас, потому что объекты MetaClass и MetaClass class были созданы автоматически магически, когда Squeak открыт. Но я не знаю, как это сделать. Возможно, они созданы каким-то образом, отправляя сообщения. Но тогда это противоречит духам Smalltalk: все происходит путем отправки сообщений, за исключением нескольких точек (объявление переменных, присвоений, возвратов и примитивов).

Есть ли что-то не так с вышеуказанными рассуждениями? Заранее спасибо.

ответ

11

Процесс «автоматически созданный» на самом деле называется bootstrapping. Так решаются проблемы с курицей и яйцом. Как только система загрузится, все остальное может быть выражено в терминах самой системы.Таким образом, нет никакого противоречия с философией Smalltalk, что все происходит, отправляя сообщения, потому что это только становится системой Smalltalk, когда она загружается.

12

Ваш вопрос двоякий, ответьте на них отдельно.

Как создаются взаимно зависимые классы?

Вы правы, Metaclass и Metaclass class являются особенностью параллельной иерархии классов и метаклассов Smalltalk. Как они созданы?

Это зависит от Smalltalk, который вы используете. Для GNU Smalltalk я не уверен, но для потомков исходного Smalltalk-80 (VisualWorks, VA aka VisualAge, SqueakPharo) они созданы в процессе Bootstrap, который создает исходное изображение.

Однако, по крайней мере, для Squeak, этот бутстрап произошел не менее 15 лет назад, если не больше. Metaclass и его класс может быть даже старше 30 лет.

Короче говоря, оба класса создаются вне типичной обработки изображений и связаны друг с другом вручную.

Но если объекты лет, что приводит к вопросу

Что происходит при запуске Smalltalk в?

В отличие от языков, таких как Ruby или Python, которые также объектно-ориентированы, Smalltalk не нужно создавать базовую среду объектов с такими вещами, как Object при каждом запуске. Зачем?

Когда Smalltalk сохраняет и завершает работу, он в основном берет снимок всего своего объекта и сохраняет этот живой объект в файл. Когда он запускается снова, он просто должен прочитать объекты из моментального снимка и «оживить» их.

Следовательно, для Metaclass и Metaclass class оба объекта считываются из моментального снимка и восстанавливаются, и с этого момента они полностью функциональны; их больше не нужно создавать вручную.

+1

Является ли это то, что после того, как я определю класс, например 'A', объект' A' будет создан системой Smalltalk и будет сохранен для изображения при закрытии? – spockwang

+1

Да, когда вы сохраните изображение, объект класса 'A' ​​сохранится. – Tobias

8

Metaclass class class = Metaclass - классический академический пример странной петли. Но если вы немного узнаете, вы можете найти много других в Smalltalk.

  • Объект суперкласс равен нулю, который является экземпляром UndefinedObject который представляет собой подкласс объекта (с более длинной цепью с помощью ProtoObject в Squeak Object superclass superclass class superclass = Object)
  • Методы MethodDictionary хранятся в экземпляре MethodDictionary (MethodDictionary methodDictionary class = MethodDictionary).
  • Название символа является экземпляром Symbol (работает с ByteSymbol в Squeak ByteSymbol name class = ByteSymbol).
  • Подклассы ArrayedCollection хранятся в экземпляре массива, который является подклассом ArrayedCollection (Array superclass subclasses class = Array).
  • Smalltalk - это системный словарь, который указывает на Smalltalk с помощью клавиши #Smalltalk (это менее прямолинейно в Squeak, (Smalltalk globals at: #Smalltalk) = Smalltalk).

Я позволю вам продолжить список самостоятельно.

Независимо от реализации, главный вопрос, является ли или не вы можете разработать самостоятельно описывающее систему как Smalltalk без этих странных петель, и вы можете заглянуть в не столь положительный ответ, если вы будете следовать sublinks из http://en.wikipedia.org/wiki/Kurt_G%C3%B6del#The_Incompleteness_Theorem

Связанный с проблемой бутстрапа, встречающейся с такой системой, эффективным способом является клонирование себя, чтобы изменить себя, и это особенно верно в изображении Smalltalk, когда вы хотите изменить базовые классы, которые вы используете для изменения/описания классов.
Поэтому мой предыдущий и лаконичный ответ, который был удален с применением письмо правил (https://stackoverflow.com/help/deleted-answers) больше, чем дух, на мой взгляд:

И вот как это было решено:http://en.wikipedia.org/wiki/Drawing_Hands

Последняя точка , Я бы предпочел читать, Невероятная непротиворечивость Smalltalk, но я определенно предвзятый.

+0

Является ли «_Incredible Consistency of Smalltalk_» книгой? Но я не могу найти много информации о Google. – spockwang

+1

Не волнуйтесь, качество модерации в stackoverflow ужасно. Этого можно ожидать с нынешним уровнем знаний в ИТ. Большинство правил –

+3

@spockwang это не книга, это ссылка на то, что Smalltalk намного более согласован, чем любой основной язык –