Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra) в [info]programming
@ 2005-11-02 00:06:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Для затравки
Представление данных в O'Caml (и вообзще -ML):

На самом деле - оно очень красиво. Что самое забавное - на С изобразить
это можно, но задолбаешся. Итак:

1) никакого RTTI в O'Caml нет. Нет настолько, что сделать downcasting в
объектном расширении просто невозможно технически.

2) Представление данных там стольже прямолинейно и тупо как в Pascal.

3) Что есть - есть следующее:

Все типызначения представляются в O'Caml одним словом и делятся на boxed
и unboxed. Boxed - это те, которые лежат в куче, а представляются адресом в оной.
Unboxed - представляются своим физическим значением, сдвинутым влево на 1 бит и
1 в младшем бите. Потому, собственно, int в O'Caml не 31, а 30 битов.

Unboxed values - int, char, bool, unit (да - у него есть значение - нолик),
и элементы union's (АТД) без "of ...".

Boxed - все остальное. Соотвественно как представляются

type 'a Tree = E | N of 'a tree * 'a * 'a tree

Вариант E - просто 0 (с учетом сдвига и битика - 1)
вариант N - адрес блока, в котором лежит три слова - элементы узла.
Сам тэг (1) лежат в управляющем слове по смещению -4 от адреса.

Вот. Общая идея, надеюсь, понятна. На самом деле вся "информация о типах" в run-time
сводится к этому самому младжему битику, который отличает значение от адреса. Более
- ничего. Какие-то вещи (вроде сериализации или полиморфного сравнения) на этом
сделать можно. Но вообще-то мало что можно.


(Читать комментарии) - (Добавить комментарий)


[info]qwerty
2005-11-02 12:31 (ссылка)
В принципе, наверно, можно тег вынести из значения в мапку в объемлющей структуры, а про локалы узнавать от компилятора, но это примерно тот же хер, только сбоку - полноразрядные целые, но более тяжелые присваивания (хотя как раз их быть почти не должно).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2005-11-02 12:58 (ссылка)
Так понимаешь - вот есть у тебя параметр типа 'a tree. Больше тебе
компилятор ничего сказать не может, потому как сам не знает, что
там будет (и в зависимости от - там разное).

Или еще хуже:
let l1 = [ []; [] ]
let l2 = [1]::l1
let l3 = ['a']::l1


l1: 'a list list
l2: int list list
l3: char list list

И при этом tl l2 == tl l3 == l1
то есть - l1 - часть обоих списков

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2005-11-02 13:06 (ссылка)
Да понимаю я. Типы (в минималистском смысле - непосредственное значение или указатель) локалов он знает. От вынесения тегов из полей в отдельную мапку той же лежащей в памяти структуры их количество не меняется. Мапка инициализируетя в момт создания структуры и должна правиться только при присваиваниях полям. Хер практически тот же, только целые полноразрядные, а присваивания более тяжелые, и компидятор в точках сборки мусора должен генерить мапки для локалов.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2005-11-02 13:13 (ссылка)
Типы (в минималистском смысле - непосредственное значение или указатель) локалов он знает

Фиг тебе. Вот например -
let f l = 
   match l with
    a::b -> ...

Про локал a он тут вообще ничего не знает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2005-11-02 13:18 (ссылка)
Значит, придется ему иногда и мапку локалов править. Не очень приятно, но не фатально. Не все локалы таким мерзким свойством обладают, их можно и пожать. От полноразрядной арифметики много кайфов.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2005-11-02 13:25 (ссылка)
На самом деле об это долго долбились, додолбились до того, что
типы реконструировать в динамике почти всегда можно (а в тех
случаях, когда нельзя - это значит, что объект можно сносить на
хрен). Но получается сложно и в worst case - с экспонентами.

В принципе, если бороться за 32 бита - то надо скорее что-то
вроде cyclone учудять.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2005-11-02 20:13 (ссылка)
Это я скорее в порядке упражнения. С битиком в мл. разряде явно проще.

(Ответить) (Уровень выше)


(Читать комментарии) -