9
votes

Incohérences en smalltalk

Je suis un nouveau venu à SmallTalk, et je l'ai appris à grincer. Mais je trouve beaucoup de choses déroutant en smalltalk. Dans SCREAK, METACLASS ET La classe de métaclass est la classe de l'autre mutuellement mutuellement. Si je veux créer l'objet métaclass i doit envoyer un message nouveau à sa classe qui est classe métaclass . Mais cela devait déjà exister comme un objet en premier lieu d'accepter le message. Donc je dois créer l'objet la classe métaclass d'abord, ce qui ne peut être effectué qu'en envoyant un message nouveau à l'objet métaclass qui n'a pas été créé encore. Donc, c'est un problème de poulet ou d'œuf.

Bien sûr, je peux créer les objets de grincement maintenant, car la classe METACLASS et Les objets ont déjà été créés par magie par magie lorsque vous êtes ouvert. Mais je ne sais pas comment. Peut-être qu'ils sont créés plutôt plutôt en envoyant des messages. Mais ensuite, il contredit les esprits de SmallTalk: tout se passe en envoyant des messages sauf quelques points (déclaration variable, affectations, retours et primitives).

Y a-t-il quelque chose qui ne va pas avec le raisonnement ci-dessus? Merci d'avance.


0 commentaires

3 Réponses :


13
votes

Votre question est double, répondons-leur séparément.

Comment les classes dépendantes mutuelles sont-elles créées?

Vous avez raison, métaclass et classe de métaclass est une singularité dans la hiérarchie parallèle des classes de SmallTalk et des métaclasses. Comment sont-ils créés?

Cela dépend du smalltalk que vous utilisez. Pour GNU SmallTalk, je ne suis pas sûr, mais pour les descendants de l'original SmallTalk-80 (Visualworks, Vaaka Visualage, Squeakpharo), sont créés dans un processus de bootstrap qui crée une image initiale.

Cependant, au moins pour grincement, cette bootstrap s'est produite au moins 15 ans, sinon plus. METACLASS Et sa classe peut même être aussi âgée que 30 ans.

Histoire longue, les deux classes sont créées en dehors du traitement d'image typique et liées manuellement.

Mais si les objets sont âgés d'années, cela conduit à la question

Que se passe-t-il au démarrage de SmallTalk?

Contrairement aux langues telles que Ruby ou Python, qui sont également orientées objet, SmallTalk n'a pas besoin de créer un environnement d'objet de base avec des objets tels que objet à chaque démarrage. Pourquoi?

Lorsque SmallTalk sauve et s'arrête, cela prend essentiellement un instantané de tout son objet et enregistre l'objet en direct dans un fichier. Quand il recommence, il suffit de lire les objets de l'instantané et de "les faire revivre".

Par conséquent, pour métaclass et METACLASS Classe , les deux objets sont lus à partir de l'instantané et relancé, et à partir de ce point, ils sont entièrement fonctionnels; ils n'ont plus besoin d'être créés manuellement.


2 commentaires

Est-ce qu'après que je définis une classe, telle que a , l'objet A sera créé par SmallTalk System et sera enregistré à l'image lors de la fermeture?


Oui, lorsque vous enregistrez l'image, l'objet de la classe A survivra.



12
votes

Le processus "automatiquement créé" s'appelle en fait bootstrapping . C'est ainsi que le problème du poulet et de l'œuf est résolu. Une fois que le système est bootstraduit, tout le reste peut être exprimé en termes de système lui-même. Donc, il n'ya aucune contradiction avec la philosophie de SmallTalk que tout se passe en envoyant des messages, car il ne devient qu'un système de smalltalk une fois qu'il est bootsTrapped.


0 commentaires

9
votes

METACLASS Class Class = METACLASS est un exemple académique classique d'étrange boucle. Mais si vous vous renseignez un peu, vous pourriez trouver beaucoup d'autres dans SmallTalk.

  • Object Superclass est NIL qui est une instance d'UNDEfinedObject qui est une sous-classe d'objet (chaîne plus longue via protoObject dans Squeak Superclass Superclass Class Superclass = Objet )
  • Les méthodes de méthodaldiction sont stockées dans une instance de méthodmindiction ( ModyDictionary ModyDictionary Class = ModyDictionnaire ).
  • Le nom du symbole est une instance de symbole (fonctionne avec BYTESYMBOL dans SQUAK BYTESYMBOL Nom Class = BYTESYMBOL ).
  • Les sous-classes de TRAYEDCollection sont stockées dans une instance de tableau qui est une sous-classe d'arrayedCollection ( Sous-classes de superclasses de réseau = tableau ).
  • SmallTalk est undicon systémique qui pointe vers SmallTalk via la clé #SmallTalk (ceci est moins direct dans Squeak, (SmallTalk Globals à: #smalltalk) = SmallTalk ).

    Je vous laisse continuer la liste par vous-même.

    Quelle que soit la mise en œuvre, la question ultime est de savoir si vous pouvez ou non concevoir un système auto-décrivant comme SmallTalk sans ces étranges boucles, et vous pouvez grever une réponse non si positive si vous suivez les sulfinks de http://fr.wikipedia.org/wiki/kurt_g%C3%B6Del#The_incompéeness_theorem < / p>

    liée au problème de bootstrap rencontré avec un tel système, une manière efficace consiste à se cloner pour se changer, et ceci est particulièrement vrai dans la petite image lorsque vous souhaitez modifier des classes de base que vous utilisez pour changer / décrire les classes. de
    D'où ma réponse précédente et concise supprimée en appliquant la lettre des règles ( https://stackoverflow.com/help/DeLEted-answers ) Plus que l'esprit à mon avis:

    Et voici comment il a été résolu: http: // fr. wikipedia.org/wiki/drawing_hands

    Le dernier point, j'aurais préféré lire, consistance incroyable de SmallTalk , mais je suis définitivement biaisé.


3 commentaires

Est-ce que " une consistance incroyable de SmallTalk " Un livre? Mais je ne trouve pas beaucoup d'informations sur Google.


Ne vous inquiétez pas, la qualité de la modération sur Stackoverflow est terrible. Cela doit être attendu avec le niveau de connaissance actuel de celui-ci. Règles majoritaire


@spockwang Ce n'est pas un livre, c'est une référence au fait que Smalltalk est beaucoup plus cohérent que toute langue traditionnelle