В чем отличия от встроенной и блочной компиляции SBCL? - PullRequest
3 голосов
/ 19 марта 2020

Несколько недель go, SBCL обновил 2.0.2 и включил функцию компиляции блоков. Я прочитал эту статью , чтобы понять, что это такое.

У меня вопрос, в чем разница между (declaim (inline 'some-function)) и блочной компиляцией? Блок компиляции автоматически c компилятором?

Спасибо.

1 Ответ

5 голосов
/ 19 марта 2020

Встроенная компиляция - это конкретная c методика оптимизации. Вызываемая функция напрямую интегрируется в вызывающую функцию - обычно с использованием ее исходного кода - и затем компилируется.

Это означает, что встроенная функция может быть встроена не только в одну функцию, но в несколько функций.

Преимущество: накладные расходы на вызов функции исчезают.

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

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

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

Пример из стандарта Common Lisp:

3.2.2.3 Semanti c Ограничения

Вызов в файле именованной функции, определенной в том же файле, относится к этой функции, если только эта функция не была объявлена ​​notinline. Последствия не определены, если функции переопределены индивидуально во время выполнения или многократно определены в одном и том же файле.

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

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

Так что эта часть блочной компиляции определена в стандарте, и некоторые компиляторы делают это.

Блочная компиляция для нескольких files

Если файловый компилятор может использовать block compilation для одного файла, то как насчет нескольких файлов? Несколько компиляторов могут также сообщить файловому компилятору, что несколько файлов составляют блок для компиляции. CMUCL делает это. SBCL был получен и упрощен из CMUCL и отсутствует до сих пор. Я думаю, что Lucid Common Lisp (который больше не продается активно) тоже поддерживал что-то подобное.

Может быть полезно добавить это и в SBCL.

...