Програзм's Journal
 
[Most Recent Entries] [Calendar View] [Friends View]

Wednesday, November 2nd, 2005

    Time Event
    12:06a
    Для затравки
    Представление данных в 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
    сводится к этому самому младжему битику, который отличает значение от адреса. Более
    - ничего. Какие-то вещи (вроде сериализации или полиморфного сравнения) на этом
    сделать можно. Но вообще-то мало что можно.

    << Previous Day 2005/11/02
    [Calendar]
    Next Day >>

About LJ.Rossia.org