Новости | 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; }