| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Александр Петросян (PAF) 06.02.2007 22:00 / 06.02.2007 22:04
немного деталей к #1 для тех, кто непуглив.OPCODE code; ///< operation codeскажем OP_ADD = "снять два верхних элемента со стека, сложить их между собой, результат положить обратно на стек"
Origin origin; ///< not an operation, but rather debug information: [OP_VALUE; debug_info; Value*]так пишу debug info
Value* value; ///< not an operation, but rather value stored after argumented opэто параметр только что указанной операции, скажем за Operation где лежит .code=OP_VALUE следует Operation.value где лежит значение, которое нужно положить на стек
ArrayOperation* ops; ///< not an operation, but rather code array stored after argumented opэто параметр предыдущей операции, когда данных нужно много.
$c($a+$b)parser-компилятор даст такой байткод.
Operation.code OP_WITH_ROOT
Operation.code OP_VALUE
Operation.origin file#1, line#11231, col#54
Operation.value VString("c")
Operation.code OP_PREPARE_TO_EXPRESSION
Operation.code OP_WITH_READ
Operation.code OP_VALUE
Operation.origin file#1, line#11231, col#57
Operation.value VString("a")
Operation.code OP_GET_ELEMENT
Operation.code OP_WITH_READ
Operation.code OP_VALUE
Operation.origin file#1, line#11231, col#59
Operation.value VString("b")
Operation.code OP_GET_ELEMENT
Operation.code OP_ADD
Operation.code OP_CONSTRUCT_EXPRу байтмашины, которая это выполняет, нет регистров, всё тупо: живём в стеке (убираю debug info): Operation.code OP_WITH_ROOTположить в стек адрес хранилища, куда будем записывать элемент
Operation.code OP_VALUE
Operation.value VString("c")положить в стек строку "c" Operation.code OP_WITH_READположить в стек адрес хранилища, откуда будем читать элемент
Operation.code OP_VALUE
Operation.value VString("a")положить в стек строку "a" Operation.code OP_GET_ELEMENTснять со стека имя
Operation.code OP_ADDснять со стека значение
Operation.code OP_CONSTRUCT_EXPRснять со стека значение
Operation.code OP_WITH_ROOT
case OP_WITH_ROOT:
{
stack.push(*method_frame);
break;
}т.е. положить на стек адрес того места, куда мы будем записывать переменную.Operation.code OP_VALUE
Operation.origin file#1, line#11231, col#54
Operation.value VString("c")
case OP_VALUE:
{
debug_origin=i.next().origin;
Value& value=*i.next().value;
stack.push(value);
break;
}увидев OP_VALUE, байтмашина высасывает next() две Operation, выдирает из них Operation.code OP_PREPARE_TO_EXPRESSIONэта штука переключает флажок runtime оптимизации, отключая проверки, которые не нужны при обработке выражения.
Operation.code OP_WITH_READ
case OP_WITH_READ:
{
stack.push(*rcontext);
break;
}т.е. положить на стек адрес того места, откуда мы будем считывать переменную.Operation.code OP_ADD
case OP_ADD:
{
Value& b=stack.pop().value(); Value& a=stack.pop().value();
Value& value=*new VDouble(a.as_double() + b.as_double());
stack.push(value);
break;
}
Operation.code OP_CONSTRUCT_EXPR
case OP_CONSTRUCT_VALUE:
{
Value& value=stack.pop().value();
const String& name=stack.pop().string(); debug_name=&name;
Value& ncontext=stack.pop().value();
put_element(ncontext, name, value);
break;
}