Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 656 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 12:

Указания компилятору (псевдокомментарии)

< Лекция 11 || Лекция 12 || Лекция 13 >
Аннотация: Некоторые реализации компилятора поддерживают указания компилятору - псевдокомментарии, которые используются, чтобы передать дополнительные указания или подсказки компилятору, но не являются частью свойства языка Haskell и не меняют семантику программы. Эта лекция резюмирует эту существующую практику. Не требуется, чтобы реализация соблюдала любой псевдокомментарий, но псевдокомментарий должен игнорироваться, если реализация не готова его обработать. С лексической точки зрения, псевдокомментарии выглядят как комментарии, за исключением того, что заключаются в {-# #-}

11.1 Встраивание

decl \to {-# INLINE qvars #-
decl \to {-# NOINLINE qvars #-}

Перевод:

объявление \to {-# INLINE список-квалифицированных-переменных #-}
объявление \to {-# NOINLINE список-квалифицированных-переменных #-}

Псевдокомментарий INLINE указывает компилятору генерировать указанные переменные на месте их использования. Компиляторы будут чаще автоматически генерировать (встраивать) простые выражения. Это можно предотвратить с помощью псевдокомментария NOINLINE.

11.2. Специализация

decl \to {-# SPECIALIZE spec1 , ... , speck #-} (k <- 1)
spec \to vars :: type

Перевод:

объявление \to {-# SPECIALIZE спецификатор1 , ... , спецификаторk #-} (k <- 1)
спецификатор \to список-переменных :: тип

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

factorial :: Num a => a -> a
factorial 0 = 0
factorial n = n * factorial (n-1)
{-# SPECIALIZE factorial :: Int -> Int,
               factorial :: Integer -> Integer #-}

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

< Лекция 11 || Лекция 12 || Лекция 13 >
Николай Щербаков
Николай Щербаков
Россия, Москва
Олег Корсак
Олег Корсак
Латвия, Рига