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

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

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

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

Сообщества

Настроить S2

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



Пишет kouzdra ([info]kouzdra) в [info]programming
@ 2005-11-18 12:35:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Реализация вызова метода в O'Caml
На самом деле идея простая, но красивая.

В чем пробелма: с точки зрения статического контроля типов, объект может выступать
под любым типом, которому соотвествует его сигнатура (то есть - наличествуют
заданные методы и их типы подходят). В месте, где происходит вызов метода,
компилятор ничего не знает про тип самого объекта. Он обычно не знает, что такой тип
вообще существует.

В месте, где создается объект, компилятор как правило ничего не знает о том, что
где-то этот объект будет использоваться с конкретной сигнатурой. В отличие от
языков, где иерархия основана на наследовании все предки в месте создания объекта
известны, O'Caml базируется на отношинее subtyping'a.

Понятно, что можно в объекте держать таблицу методов с именами и динамически искать их.
Но это как-то не очень. Цикл устраивать. Потому делается так (решение подходит и к реализации
записей с subtyping'ом по включению набора полей):

Все имена методов нумеруются глобально по всей программе. Это может делать линкер, в
O'Caml это делается динамически при запуске программы. Далее в качестве VMT можно использовать
таблицу длины n_meth, где n_meth - количество имен методов. В пустующие клетки не записывается
ничего, в остальные - адреса функций.

Вызов делается просто - по номеру метода берется соотвествующий адрес и вызывается. Статическй
контроль гарантирует, что метод с данным именем/номером будет.

Идея хороша всем, кроме того, что n_meth может быть довольно большим (напирмер 1000), а заводить для каждого класса
(пусть 200 классов) табличку в 1000 слов несколько накладно - даже тут уже получится мегабайт. Это при
весьма умеренных n_meth и числе классов. Опять же - понятно, что таблики будут почти пустые.

Потому они поджимаются довольно простым методом: для сильно разреженной таблицы с n объектами обычно можно подобрать
немного большее число p, такое, что для любого момера k элемента в табличке, k mod p будет однозначно
определять k (среди присутсвующих в таблице гнезд). То есть - такое простенькое безконфоликтное хэширование.

Далее - в начало таблицы записывается подобранное p, а адреса методов располагаются в позиция по модулю
p. Вызов метода соотвественное делается просто - берется остаток от деления номера метода на p из таблицы
и вызывается то, что лежит по адресу.

Придумал это Didier Rémy в 1992 года:


Efficient Representation of Extensible Records. In Proceedings of the 1992 workshop on ML and its Applications, page 12, San Francisco, USA, June 1992


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

Re: Вопрос ребром
[info]qwerty
2005-11-21 04:52 (ссылка)
Чем на Фортране удобнее писать, чем на Ц, мне не понять. Очень многие библиотеки существуют и в сишном варианте. Если есть исходники, довольно просто написать конвертор из Фортрана в Ц. Кроме коммон-блоков, я никаких сложностей не вижу. Да он уж наверняка кем-нибудь давно написан.

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

Re: Вопрос ребром
[info]tristes_tigres
2005-11-22 01:52 (ссылка)
Чем на Фортране удобнее писать, чем на Ц, мне не понять.

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

В Fortran 90 сложение частей двух массивов пишется так :

A(6:10,1:3) = B(1:5,4:6) + 3.0*C(1:5,1:3)

А теперь перепишите на C

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

Re: Вопрос ребром
[info]qwerty
2005-11-22 09:39 (ссылка)
Иш ты, понавставляли в Фортран конструкций памяти Алгола-68. Последний раз я на нем в 1985 программировал, тогда динамически отводимых массивов и вырезок в нем не было.

На ЦПП переписать это можно (завести массивы с паспортами и вырезками), и даже выглядеть будет похоже, но машинный код получится сильно хуже. Не потому, конечно, что разработчики фортрановского стандарта как-то особенно были эффективностью озабочены, а потому, что ЦПП более универсален. Соответствующими конструкциями его вручную расширить можно, да вот только компилятор в процессе трансляции инвариантов этих конструкций знать не будет и потому будет вынужден предполагать худший случай.

Насчет Ц и Фортана выяснили. Но как жить без ассемблера и на чем писать скрипты для обработки текстов?

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


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