Как Smalltalk обрабатывает ошибки программы? - PullRequest
5 голосов
/ 13 июня 2011

Я новичок на Smalltalk. Я прочитал несколько статей и документов об этом, и я удивлен его полнотой понятий. И он предлагает какую-то живую отладку.

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

Как Smalltalk справляется с этим? (возможно, этот вопрос можно применить ко всем динамическим языкам REPL ...)

Ответы [ 4 ]

6 голосов
/ 13 июня 2011

Smalltalk использует объекты Exception. Я рекомендую вам прочитать главу об этом https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf

это часть книги Pharo By Example: http://pharobyexample.org/

Что касается мутации, отладки и т. Д., Обратите внимание, что Smalltalk использует много языка в языке. Например, класс MethodContext. Эти объекты представляют контексты методов, которые выполняет виртуальная машина. Таким образом, вы можете осматривать их и играть с ними как с обычными объектами. То же самое с CompiledMethod. Просто для удовольствия, проверьте «псевдо» переменную thisContext:)

Если вы хотите ответить на свои вопросы самостоятельно, загляните в класс Debugger. Итак, вы хотите знать, что происходит, когда вы перезапускаете метод в середине отладчика? затем просмотрите метод #restart в отладчике и выполните:)

3 голосов
/ 14 июня 2011

По сути, вы спрашиваете, «как может весь компьютер откатиться до известного состояния?», Потому что образ Smalltalk - это виртуальная машина в том же смысле, что и VMWare и VirtualBox.

Самое близкое, что мы имеем к способности отменить произвольные побочные эффекты (исключая очевидные невозможности, такие как откат ввода-вывода), вероятно, Worlds Алессандро Варта, как описано в его диссертации Эксперименты с языками программирования .По крайней мере, в общем смысле: конечно, можно использовать такие вещи, как шаблоны Memento и Command для реализации отменяемых операций.

1 голос
/ 14 июня 2011

Это не так!

Из мелочей, которых я знаю, никто из них не поддерживает такого рода транзакции.Все побочные эффекты, которые накапливаются во время выполнения, устанавливаются.Не поддерживается автоматический откат.В настоящее время проводятся исследования, как поддержать это, но ничего не попробовать в AFAIK.Это то, что вы должны знать, что, если вы отлаживаете и возвращаетесь в трассировку стека, объекты не находятся в состоянии, в котором они находились во время выполнения.Вы видите только объекты в их новейшем состоянии.

Хотя это не так просто поддержать в общем виде, есть некоторые возможности решить эту проблему с помощью дизайна вашей программы.Наиболее известные подходы:

  • Вы копируете / клонируете объекты, которые хотите изменить, и применяете изменения к копиям.Если что-то пойдет не так, вы просто выбросите копии.Если все в порядке, вы применяете содержимое копий к оригиналам.Вы можете решить эту проблему, используя шаблон памяти.
  • вы применяете изменения к своим объектам, но если что-то идет не так, вы повторно применяете исходный контент.Это можно реализовать с помощью действий do / undo, используя шаблон команды
1 голос
/ 14 июня 2011

Я полагаю, вы имеете в виду множество объектов в изображении, которые могут перейти в несогласованное состояние при разработке и отладке. Обычная процедура - хранить код в таких пакетах, как (Monticello для squeak / pharo). Если вы хотите сбросить вещей, вы получите чистый образ из дистрибутива и перезагрузите код из пакетов. Для развернутых приложений в дополнение к коду в пакетах у вас обычно была бы информация, необходимая для воссоздания ваших объектов данных, хранящихся в некоторой внешней форме, такой как сериализованная форма, хранящаяся в файлах, или в базе данных dql или noSql. Таким образом, процедура сброса будет состоять из свежего изображения, загрузки кода из пакетов, загрузки объектов модели данных из внешнего хранилища.

...