Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Smalltalk
Перезагрузить страницу Замыкание в Смолтоке должно происходить на переменную
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию Замыкание в Смолтоке должно происходить на переменную - 02.11.2009, 21:47

Замыкание в Смолтоке должно происходить на переменную или на объект, на который эта переменная указывает в данный момент?

Например:
Код:
| a b c |
a := 1.
b := [a].
a := a+1.
c := b value.
Чему должно быть равно c?
Ответить с цитированием
  (#2 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 03.11.2009, 06:09

Цитата:
Замыкание в Смолтоке должно происходить на переменную или на объект, на который эта переменная указывает в данный момент?

Например:
Код:
| a b c |
a := 1.
b := [a].
a := a+1.
c := b value.
Чему должно быть равно c?
Замыкания (названы так потому, что "замыкают" внутри себя кусок кода языка) в смоллтоке не "происходят", они вычисляются. Т.е. глагол "value" можешь успешно переводить как "вычислить".
И как же они вычисляются? Исполняется кусок кода, находящийся внутри замыкания.
A что у нас там замыкается? У нас там "замыкано" чтение значения переменной a.
Значит, в с тупо присвоится содержимое переменной a, т.е. 2.

Во всех задачках подобного типа можно как в математике, "раскрыть скобки" и подставить вместо вычисления замыкания тот участок кода, который включает в себя замыкание, и всё становится ясно, т.е.
с := b value эквивалентно c := a.
Ответить с цитированием
  (#3 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 04.11.2009, 16:31

Понял, спасибо.

Чтобы тему отдельную не создавать, я тут ещё кой-чего спрошу про Смолток.

А есть ли у смолтоковской программы возможность дописывать свой код "на лету" в реалтайме? Ну, то есть, сгенерил программно текстовую строку с куском исходного кода и тут же запустил её на выполнение?
Ответить с цитированием
  (#4 (permalink)) Старый
Вася Чайко Вася Чайко вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.02.2007
По умолчанию 05.11.2009, 20:54

Compiler evaluate: '2+2'.
Ответить с цитированием
  (#5 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 06.11.2009, 01:13

Цитата:
А есть ли у смолтоковской программы возможность дописывать свой код "на лету" в реалтайме?
Ну, то есть, сгенерил программно текстовую строку с куском исходного кода и тут же запустил её на выполнение?
Ты вместо "реалтайма", наверное, хотел сказать "рантайм" (runtime)?
Не поверишь, в смоллтоке всегда рантайм И ещё. В Smalltalk программный код вторичен. А что первично? Сознание , сознание того, что Smalltalk очень монолитная система, в нём всё пронизано идеей того, что внутри нет ничего, кроме объектов и посылки сообщений между ними.

Но если многие ОО системы заставляют программиста "вызывать методы", где вы углубитесь в процедуры и функции, то в Smalltalk придётся углубиться в посылки сообщений.
Сообщение подразумевает получателя, и состоит из селектора и аргументов. Селектор -- это объект, экземпляр класса Symbol. Пусть не смущает слово "символ", эти объекты могут состоять, как и строки, из многих букв. Только вот отдельные буквы в Smalltalk -- это экземпляры класса Character.
Ну а зачем, может кто-то спросить, какой-то там Symbol, а не просто строки? Symbol это подкласс от String, и в нём есть реализация кое-какого дополнительного интересного поведения. Во первых, невозможно создать символ, в котором есть буквы, противоречащие правилам именования объектов в Smalltalk, например, в символе не может быть пробелов. В общем, Символом он назван потому, что это символическое наименование чего-нить. Например, метода. И ещё, символы от строк отличаются тем, что не может быть в системе двух символов с одинаковой последовательностью букв в нём. Все экземпляры символов в системе -- уникальны, существуют в ед. экземпляре. Это достигается конструктором объектов этого класса -- если надо состряпать символ из указанной строки, сперва ищется такой символ в общесистемном массиве символов, и если такой там есть, то возвращается ссылка на существующий, иначе, создаётся новый и добавляется в системный масив.
Уникальность символов позволяет их быстро сравнивать -- в самом деле, есть базовый метод == , который сравнивает identity объектов (типа сравнения указателей в С или паскале), а не метод = , который сравнивает байтовое содержимое каждого объекта, что гораздо дольше.
И вот, селектор сообщения однозначно определяет, какой метод будет исполнен при получении объектом данного символа. Короче, имя метода и есть этот символ. А теперь представьте -- в коде в каждом методе множество посылок сообщений. И если в каждом методе селекторы не были бы уникальны, то система была бы забита копиями одних и тех же символов, например #at:put:, #value, #+, #-, #= и так далее. В общем, использование символов в качестве селекторов оправдано и Ъ.
К сообщениям и их обработчикам -- методам, мы ещё вернёмся, а теперь ещё небольшой экскурс в Smalltalk.

Объект -- понятие абстрактное. Компьютер -- кусок железа, в нём нет объектов, объекты придумали программисты . Чтобы создать программисту мир, в котором всё объекты, необходимо, чтобы такой слой абстракции был чем-то реализован. Этим абстрагированием программиста и программ занимается виртуальная машина среды Smalltalk-- VM.
VM при старте запускает т.н. "образ" -- отображённую в файл копию памяти виртуальной машины от предыдущего сеанса работы.
И вот, при старте этот файл образа опять отображается в виртуальную память. Что там внутри?
Снова мантра для просветления: в Smalltalk нет ничего кроме объектов и посылки сообщений между ними.
Внутри образа бульон, коктейль из объектов во внутреннем представлении VM.
И начинается магия оживления: виртуальная машина создаёт первый процесс (это объект, который занимается исполнением кода, т.е. последовательной отсылкой сообщений), в котором отсылается самое первое сообщение -- обычно это что-то вроде метода менеджера сеанса #onSessionStart.
И вот эта посылка "оживляет" образ, создаются ещё какие-то процессы, в них шлются сообщения другим объектом, хлопают окошки гуя, и система радостно начинает вся шевелиться. Это -- результат посылки тысяч сообщений объектам, в которых они создаются и умирают. Потом всё вроде успокаивается, но это не так -- тикают таймеры, объекты событий имеют своих подписчиков, которым будут доставлены сообщения о какой-то активности -- например событий от операционной системы -- сообщений о движении мыши над окнами, нажатии клавиш и проч.

Теперь ближе к твоей теме.
Когда пишется программа в среде смоллток, программист занимается тем, что создаёт новые классы, и наделяет их новыми методами.
Обычно он это делает в графической среде мышОй. Правой кнопкой по классу, там в контекстном меню команда "New...", вылазит диалог, в котором просят ввести имя нового класса, Ок. Создан новый класс с указанным именем. Красота. Открываем вкладку Class Definition и там... что-то вроде
Код:
Object subclass: #MyFirstClass
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    classInstanceVariableNames: ''
Как видишь, среда смоллтока показывает тебе описание класса как посылку сообщения суперклассу. Т.е. если скопировать это в буфер обмена, и вставить в воркспейс, удалить этот класс, и исполнить вот это описание в воркспейсе, класс будет создан снова.
Закрепим мантру "В смоллтоке всё объекты..." вот этим живым примером: класс тоже объект. Чтобы создать новый класс, или модифицировать существующий, надо отослать соотв. сообщение суперклассу. Попробуй в Паскале или в С++ в вот так, в "реалтайме", сконструируй новый класс :-)
Далее. Класс имеет методы в своей коллекции методов. Коллекция методов -- это словарь (подкласс Dictionary), в котором ключами являются названия методов (селекторы, экземпляры класса Symbol), а значениями -- экземпляры CompiledMethod. Т.е. выполнив в смоллтоке например такое: Object methodDictionary inspect получишь инспектор, открытый на "живую" коллекцию методов.
Закрепим мантру номер 1 ещё раз: методы это тоже объекты :-D
А как создаются методы? Методы создаются компилятором Smalltalk. Это класс, который в поте лица трудится на благо программиста :-)
Отправив соотв. сообщение Compiler'у, можно создать экземпляр CompiledMethod'а, который добавится в словарь методов соотв. класса. Потом этот метод будет являться ответственным за обработку сообщений, посылаемых объекту.
Поскольку селектор сообщения == имени метода, и селектор присутствует в качестве ключа в словаре методов, а словари славятся тем, что в них предприняты особые меры для быстрого поиска по ключу, то виртуальная машина, когда шлёт сообщения объектам, БЫСТРО находит по селектору метод, и исполняет его, подсунув аргументы сообщения методу. Тот радостный их кушает, и выдаёт на-гора результат. Такая вот внутренняя кухня.

Но можно выполнить код "одноразово", послав компилятору сообщение #evaluate: со строчкой кода. И если всё хорошо, будет создан экземпляр CompiledExpression, ему будет послано соотв. сообщение (#value, и возвращён результат "заказчику", например воркспейсу, а отработанный экземпляр CompiledExpression'a будет в конце концов убран сборщиком мусора.

Вот такая движуха происходит, вечный рантайм. Компилятор это объект, который код превращает в методы, методы тоже объекты и исполняются они путём посылки им сообщения #value:withArguments:.
"В смоллтоке нет ничего, кроме объектов и посылки им сообщений". На этом и закончим.

Надеюсь, это немного прояснило для тебя видение Smalltalk изнутри.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 06.11.2009, 04:35

Ай, меня чуть не завалило этой кучей букв! Еле разгрёб...
Но всё равно спасибо

Так значит, компилятор - это объект? Здорово. И компиляция исходного текста в исполняемый код - это всего лишь посылка сообщения "компилировать" объекту "компилятор"? И методы любого объекта могут быть изменены на любые другие откомпилированные куски кода? Классно! Тогда можно средствами самого Смолтока изменить код метода "компилировать" объекта "компилятор", чтобы из Смолтока получить, например, Паскаль? Да?
Ответить с цитированием
  (#7 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 06.11.2009, 10:09

Цитата:
Тогда можно средствами самого Смолтока изменить код метода "компилировать" объекта "компилятор", чтобы из Смолтока получить, например, Паскаль? Да?
-- О, вы хирург, гланды вырезать можете?
-- Да.
-- И себе тоже сможете, да?

Паскаль подходит виртуальной машине Smalltalk также как сова подходит зайцу для спаривания :-D
Ответить с цитированием
  (#8 (permalink)) Старый
Eugene Beschastnov Eugene Beschastnov вне форума
Member
 
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2004
По умолчанию 06.11.2009, 10:20

Цитата:
Тогда можно средствами самого Смолтока изменить код метода "компилировать" объекта "компилятор", чтобы из Смолтока получить, например, Паскаль? Да?
Можно. Но испортить компилятор - это один из самых надёжных способов безвозвратно испортить образ :-)
Ответить с цитированием
  (#9 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 06.11.2009, 10:44

Ну а серьёзно, что является тем ядром языка, которое не может быть изменено средствами самого языка?
(Я не имею в виду VM, т.к. она не является частью языка.)
Ответить с цитированием
  (#10 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 06.11.2009, 10:53

Цитата:
Можно. Но испортить компилятор - это один из самых надёжных способов безвозвратно испортить образ :-)
Вы считаете, что таким способом можно только испортить образ, но никак не улучшить? Вы пессимист.
Вон у Смолтока сколько языков-последователей, каждый из них в чём-то лучше своего родителя.
А если я хочу "обработать напильником" Смолток до получения более удобного языка для некоторой специфической области применения (т.е., сделать синтаксис языка ближе к решаемой задаче)?
Ответить с цитированием
  (#11 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 06.11.2009, 11:42

Цитата:
А если я хочу "обработать напильником" Смолток до получения более удобного языка для некоторой специфической области применения (т.е., сделать синтаксис языка ближе к решаемой задаче)?
Это верный путь в никуда.
Делать ближе к решаемой задаче нужно не синтаксис, а лексикон, т.е. учишь разговаривать твои объекты терминами предметной области.
Т.е. добавляешь новые методы.
А синтаксис чем минимальнее, тем лучше. В Smalltalk и так синтаксиса минимум, вроде как всего 5 (!) синтаксических конструкций.
Если охота лезть в синтаксические дебри другой задачи, пишите парсер. На обычном, кошерном смоллтоке.
Ответить с цитированием
  (#12 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 06.11.2009, 12:02

Цитата:
Ну а серьёзно, что является тем ядром языка, которое не может быть изменено средствами самого языка?
Есть типичные проблемы курицы или яйца.
Например: классы это объекты, которые имеют коллекции методов (словари), у словарей тоже свой класс.
Вопрос: как изначально создали классы словарей и добавили к ним нужное поведение (методы), в чём хранились методы первоначальных, простейших объектов? ;-)
Или: класс ProcessorSheduler. Кто крутил смоллток процессы, когда планировщика процессов не было?
В общем, про Smalltalk бутстраппинг, или "пишем Smalltalk с нуля", можно создать увлекательнейшее чтиво.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Eugene Beschastnov Eugene Beschastnov вне форума
Member
 
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2004
По умолчанию 06.11.2009, 12:13

Цитата:
Вы считаете, что таким способом можно только испортить образ, но никак не улучшить? Вы пессимист.
Вон у Смолтока сколько языков-последователей, каждый из них в чём-то лучше своего родителя.
А если я хочу "обработать напильником" Смолток до получения более удобного языка для некоторой специфической области применения (т.е., сделать синтаксис языка ближе к решаемой задаче)?
Похоже, вы не совсем правильно (совсем неправильно?) меня поняли :-). Пункт первый: если начать хачить компилятор, то его очень легко сломать. Пункт второй: единожды сломав компилятор, уже ничего нельзя будет сделать, даже отменить ошибку :-). Потому что для того, чтобы записать исправления, нужно их скомпилировать, а компилятор сломан. А если случайно записать образ (image-файл) в таком состоянии, то всё, исправить ничего нельзя - можно выкидывать этот образ и начинать с нуля.

А "получение более удобного языка для некоторой специфической области" в 99.9% случаев делается совсем другими средствами - созданием нужных классов с нужными методами либо добавлением нужных методов в уже существующие (в том числе базовые) классы.
Ответить с цитированием
  (#14 (permalink)) Старый
Eugene Beschastnov Eugene Beschastnov вне форума
Member
 
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2004
По умолчанию 06.11.2009, 12:19

Цитата:
Ну а серьёзно, что является тем ядром языка, которое не может быть изменено средствами самого языка?
(Я не имею в виду VM, т.к. она не является частью языка.)
Изменяя компилятор, можно как угодно менять язык (т.е. его синтаксис). А вот формат байт-кода таким образом изменить не получится.
Ответить с цитированием
  (#15 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 06.11.2009, 13:31

Цитата:
А "получение более удобного языка для некоторой специфической области" в 99.9% случаев делается совсем другими средствами - созданием нужных классов с нужными методами либо добавлением нужных методов в уже существующие (в том числе базовые) классы.
Никакие новые классы и методы не дадут использовать удобную стандартную запись математических выражений в языке, т.е., с приоритетом операций и аргументами в скобках, напр: 2*x+3*sin(y)-ln(10). Задачи с математическими формулами покрывают явно больше 0.1% решаемых проблем, так что насчёт 99.9% Вы, сказать помягче, лукавите.

И про байт-код: где бы о нём почитать? Хочу понять, из каких инструкций он состоит.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
так должно быть или нет???? Пархоменко Вадим Процессоры 3 01.09.2011 13:49
файлы или что должно находиться в папке aleks.tarasow Любые вопросы от новичков 3 04.08.2011 16:23
Здесь должно быть название темы! natalya00000 Любые вопросы от новичков 2 06.06.2011 16:39
Считается, что никакое число не должно начинаться с нуля dastM Lisp 6 24.02.2011 11:06
Реализация замыкание контекста на с++ denis120 С/С++ 15 17.01.2011 02:14
Объекто-ориентированный анализ с примерами на Смолтоке Вася Чайко Smalltalk 1 14.08.2008 15:05
Приер XML + XSL. Должно выводиться одно, выводистя другое oneword XML & WML 10 15.08.2007 16:16
Помогите найти ошибку(и) - говорят, что должно работать... wampu Prolog 7 02.08.2007 09:32
Есть число float a=0.01 как его умножить на 0,33% должно получиться 0,000033 freeway C++ Builder 8 23.05.2007 11:39
В edit1 набираю 123 нажимаю на кноку должно появится в label 321 как реализовать ROLF Delphi 5 19.10.2006 01:03
При выборе радио- кнопки должно выходить текст Mad_tea C++ Builder 7 06.07.2005 16:34



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов