Сталинский компилятор зверски оптимизирует, но как?

14

В заявлении Дж. М. Сискинда говорится:

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

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

Сискинд, JM 2000a. Облегченное конверсионное преобразование CPS. В подготовке.

Сискинд, JM 2000b. Поточно-направленная поливариантность. В подготовке.

Сискинд, JM 2000c. Потоково-ориентированный выбор представления. В подготовке.

Сискинд, JM 2000d. Потоковое управление хранением. В подготовке

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

Жюль
источник

Ответы:

11

Ключ, вероятно, в том, что он использует анализ всей программы и оптимизацию всей программы. Чем больше вы знаете о том, как ведет себя программа, тем больше вы можете специализироваться, встраивать и обеспечивать производительность.

Компилятор MLton для Standard ML делает то же самое ( http://mlton.org/ ). Об этом есть по крайней мере одна презентация: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Более ранняя работа была проделана Крейгом Чемберсом и его группой в Вашингтонском университете (например: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html. ). Это было сделано в контексте Самости, а затем Сесила / Вихря.

Вероятно, в сообществе Scheme / Lisp больше работы. Вы, вероятно, хотите считать поиск в Google "оптимизацией всей программы".

Дэйв Кларк
источник