| |||
![]()
|
![]() ![]() |
![]()
Для затравки Представление данных в O'Caml (и вообзще -ML): На самом деле - оно очень красиво. Что самое забавное - на С изобразить это можно, но задолбаешся. Итак: 1) никакого RTTI в O'Caml нет. Нет настолько, что сделать downcasting в объектном расширении просто невозможно технически. 2) Представление данных там стольже прямолинейно и тупо как в Pascal. 3) Что есть - есть следующее: Все и 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 сводится к этому самому младжему битику, который отличает значение от адреса. Более - ничего. Какие-то вещи (вроде сериализации или полиморфного сравнения) на этом сделать можно. Но вообще-то мало что можно. Добавить комментарий: |
||||||||||||||
![]() |
![]() |