КонтекстDebugging переводчик в VM при изменении ут примитивы
В университетском проекте мы хотим изменить Pharo VM использовать объектную таблицу и посмотреть, что происходит.
Мы используем pharo-vm clone from github и VMMaker. Построение VM отлично работает.
Для начала мы добавили примитив, который возвращает инкрементируются Integer:
InterpreterPrimitives>>primitiveIntegerIncrement
"increments an integer"
self pushInteger: self popInteger + 1 .
и модифицированного StackInterpreter class>>initializePrimitiveTable
соответственно
MaxPrimitiveIndex := 576.
"... and so on ..."
(575 primitiveFail)
(576 primitiveIntegerIncrement))
И это работает.
Проблема
Когда мы вносим изменения в виртуальной машине, мы хотим проверить, запустить уже в SmalltalkImage поэтому мы не должны обобщать и видеть, что это не работает.
Что-то вроде:
StackInterpreter test: '1 inc'
И тогда я могу отладить, если примитивно неправильно или произошла ошибка. Конечно, нужно сделать гораздо больше, но как я могу это достичь?
То, что мы пытались
категории
VMMaker-InterpreterSimulation
классStackInterpreterSimulator
. Trying код в комментарияхDoIt ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test
ошибки:
displayForm := 'Display has not yet been installed' asDisplayText form.
байтовой строки не понимает
asDisplayText
(CogVMSimulator new openOn: Smalltalk imageName) test (InterpreterSimulator new openOn: Smalltalk imageName) test
ошибка:
PrimitiveFailed: primitive #basicNew: in Array class failed
Я также нашел этот скринкаст, но он отлаживает только ВМ снаружи с помощью ГПБ: http://vimeo.com/22485382#
Наш проект размещен здесь: http://smalltalkhub.com/#!/~kirstin/PharoObjectTable
Текущий статус
Мы начали реализацию таблицы объектов , Поиск атрибутов может проходить через таблицу объектов. Полная поддержка таблиц объектов и отсутствие прямых указателей очень сложны, поскольку указатели ожидаются везде. Поэтому мы используем указатели в таблице объектов, чтобы определить, когда поиск должен пройти через OT. Мы также нашли все примитивы создания объектов и добавили новые объекты в таблицу.
Для справки, вы можете посмотреть RoarVM, у него обычно есть таблица объектов, но есть и вариант без: https://github.com/smarr/RoarVM/tree/features/without-object- table По сравнению с CogVM у него нет JIT-компилятора, и в целом он довольно медленный. Тем не менее, он все же может дать несколько сведений о том, как подойти к вещам. – smarr