LINUX.ORG.RU

Scheme, компиляция примитивов


0

0

Рассмотрим простую функцию:
(define (f a b) (+ a b))
Казалось бы, её можно откомпилировать в код (условно):

F: MOV EAX, a
ADD EAX, b
RETURN EAX

и получить хорошую, шуструю функцию.
Но тут возникает 2 проблемы:
1. В схеме куча арифметических типов: целые, большие целые (которые не помещаются в 8 байтов), 
дроби, вещественные, мнимые, и тд.
Тип переменной можно узнать только во время выполнения, 
т.е. придётся делать кучу проверок и в зависимости от их результата вызывать тот или иной алгоритм.

2.
(set! + -)
(f 3 2) ; возвращает 1
(set! + my-tricky-function)
(f 3 2) ; возвращает ещё более странное значение

Т.е. во время компилирования я вообще не имею права предполагать, что + это сложение.
Значит ли это, что здесь вообще нет места оптимизации, и я всегда должен извлекать из памяти
значение, ассоциированное с + и делать JMP на неизвестный во время компиляции адрес? (да ещё и проверять, что это действительно функция, а не какой нибудь вектор).
Жутко тормозить ведь будет.

Первое, что приходит в голову, это какой-то сложный анализ всей программы, 
возможно выведение всех возможных типов переменных, которые могут быть переданы данной функции, и тд.
Теоретически это решает проблему, но практически это представляется сложным в реализации,
к тому же значительно увеличит время компиляции, что в моём случае весьма нежелательно.
Ещё один вариант над которым я мало думал, но он мне представляется малоперспективным:
компиляция в байт-код, и его JIT-компиляция в рантайме, с учётом рантаймовых значений.

Может быть у кого-нибудь есть мысли на эту тему?
★★★★★

Мысли на эту тему начали приходить людям в голову в 50-х годах :) Погугли словосочетание Type Inference.

Kpoxman ★★
()
Ответ на: комментарий от Kpoxman

А оно применимо к Scheme как к динамически типизируемому языку? Вроде (да и википедия согласна) это к статически типизируемым языкам применимо.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

в bigloo (да и не только в нем скорее всего) можно явно указывать тип аргументов. а с другой стороны - нужна ли тогда схема, если требуется статическая типизация? для этого есть мл-языки

anonymous
()
Ответ на: комментарий от Legioner

Основные проблемы Type Inference как раз возникают в динамических языках. В статических языках Type Inference проще. Вот этот чувак, например, http://www.diku.dk/~henglein/ посвятил несколько лет и кучу статей Type Inference в динамических языках, в частности в Scheme.

Kpoxman ★★
()

спасибо, буду разбираться

Legioner ★★★★★
() автор топика
Ответ на: комментарий от anonymous

stalin - дерьмо. он кажется даже не соответствует r4rs.
вместо этого есть larceny

bik ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.