Опять не спится...

N.B.
Это копия моего блога vtolkov.blogspot.com.
Заметки копируются сюда с задержкой примерно на сутки.
Я читаю комментарии в обоих журналах.

Утиная красавица
[info]vtolkov

Луга в долине Snoqualmie
[info]vtolkov




Две черные лошади на первой фотке встали так, чтобы отгонять хвостом мух от морды друг друга.


Новый дозор.
[info]vtolkov
Старший сержант Дима Пастухов был хорошим полицаем ... Дима не брезговал пятихаткой, вытрясенной у не имеющего регистрации хохла или чурека ... Но зато Дима никогда не выбивал денег с проституток и сутенеров. Принципиально. Было что-то в воспитании, мешающее этим заниматься. ...

Это начало "Нового Дозора" Лукьяненко.

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

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

Update.

... к любой стране прикипаешь. Мне и Тибет дорог, и Индия, и Фландрия. И Россия, конечно! Но с годами понимаешь, что самое главное – это твоя семья, твои друзья, твоя работа. А страны… все мы граждане человечества ...
Я рад за автора. Это очевидный прогресс.

Я загадал: если книжка не вызовет неприятного послевкусия пропаганды, я так и быть, куплю kindle-версию, чисто чтобы заплатить автору. Хотя читаю я epub версию на iPad-е, которая нигде не продается, а бумажных я уже лет пять не покупал.

Update 2.

За книжку я заплатил. Хотя, конечно, Амазон русские названия не поддерживает вообще, поиск по ним не работает и найти книжку я смог только перейдя по прямой ссылке из блога Лукьяненко. Искать же по переводному названию "New Watch" в Амазоне вообще бессмысленно... :-)

Blue-green-blue
[info]vtolkov


Цветочки-листочки
[info]vtolkov


Оказывается, Гугл позволяет показывать картинки любого размера, автоматически обрезая и масштабируя согласно параметрам в URL. Это работает для картинок загруженных в Picasa Web, в Google+, Blogger:


http://.../w100-h100-p/vl-nex09384.jpg

http://.../w100-h100/vl-nex09384.jpg

http://.../s100/vl-nex09384.jpg


Пора пахать и сеять!
[info]vtolkov

Весна!
[info]vtolkov

Три фотографа
[info]vtolkov

- Oh My Gosh!!! Oh My Gosh!!!
- Зря ехал, снимать здесь нечего...

Эти две фотки были сняты в одно время с одной точки.
Черепаха там, внизу, за ограждением.

Wenatchee Lake & Leavenworth
[info]vtolkov



Несплошные структуры
[info]vtolkov

Структуры, в принципе, не обязаны быть сплошными. Компилятор мог бы, в принципе, хранить часть данных отдельно, оптимизируя патерны доступа и locality, но в современных языках до этого обычно не доходит. Как редко доходит и до несплошного стека, впрочем, я сегодня не об этом. В предыдушие выходные я выкинул из своего домашнего проекта иерархию классов, заменив классы несплошными структурами, до сих пор не могу нарадоваться, насколько все стало проще и понятнее.

Итак было синтаксическое двоичное древо. С узлами и листьями, которые все наследовались от базового класса, содержащего пару указателей, и нескольких обязательных полей. Наследуемые классы имели несколько виртуальных методов и некоторые контекстно-зависимые данные. Классов в синтаксическом дереве было, как операций в языке, несколько десятков. Был такой огромный файл с их определениями.

class Node {
     Node *left, *right;
     Lexem lexem;
     OpCode code;
     Type type;
   public:
     Node();
     virtual ~Node();
     ...
     };

class ConstantNode : public Node { ... };
class IntNode : public ConstantNode { ... int value; ... };
class StringNode : public ConstantNode { ... double value; ... };
...

class Op1Node : public Node { ... };
class MinusOpNode : public Op1Node { ... };
...

class Op2Node : public Node { ... };
class AddNode : public Op2Node { ... };
...

В результате я выкинул все эти классы. Оставил структуру, почти без внутренних методов:

struct Node {
     Node *left, *right;
     Lexem lexem;
     OpCode code;
     Type type;
     void *ext;

     Node() : ext(0){ ... }
     ~Node(){ delete ext; }
     };

Важное отличие здесь - поле ext. Оно указывает на контекстно-зависимые данные для данной node. Фактически это продолжение структуры. То, что было непрерывно в классе теперь разорвано, и содержит дополнительный уровень indirection. Однако это дает и преимущества.

Во многих случаях никакого продолжения вообще нет, указатель просто нулевой.

Появляется возможность менять тип узла на месте. Так у меня работает компилятор, меняя тип по мере того, как удается что-то вычислить новое про данный узел. Сначала, после первого прохода компилятора, строится синтаксическое дерево, но никакой информации оно не содержит, кроме кодов операций. По мере вычислений типов заполняется поле type и иногда создаются вспомогательные структурки с дополнительными деталями и присваиваются полю ext. Дальше происходят некоторые другие вычисления и поле ext получает новое значение.

На самом деле все несколько сложнее, но идея та же. Как ни странно, оказалось, что почти никаких виртуальных методов мне не надо, таблица функций, индексируемая полем code делает все то же самое.

Какова же мораль? Мораль такова, что не все есть объект. Объект - это черный ящик. А иногда черный ящик не удобен, иногда нужна прозрачность, индексируемость. Синтаксическое дерево - вполне себе хороший объект. А узел дерева - вовсе не обязательно. База данных может быть объектом, но записям в базе данных лучше не быть объектами, а быть записями - структурами, состоящими из полей. Объект - там, где надо скрыть внутреннюю структуру, непосредственные данные - там где внутренняя структура должна быть легко доступна.


You are viewing [info]vtolkov's journal