Языки и виртуальные машины: функции, которые сложно оптимизировать и почему

Я делаю обзор функций в рамках подготовки к исследовательскому проекту.

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

Первое место в моем списке функций, которые сложно оптимизировать, и моих теорий (некоторые из моих теорий не проверены и основаны на мысленных экспериментах):

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

2) Преобразование типов / варианты (также известное как типизация на основе значений, а не на основе переменных). Традиционные оптимизации просто не могут быть применены, если вы не знаете, может ли тип чего-либо измениться в базовом блоке. В сочетании с несколькими методами встраивание должно выполняться осторожно, если оно вообще выполняется, и, вероятно, только для заданного порогового значения размера вызываемого объекта. т.е. легко рассмотреть возможность встраивания простых выборок свойств (геттеров / сеттеров), но встраивание сложных методов может привести к раздуванию кода. Другая проблема заключается в том, что я не могу просто назначить вариант регистру и JIT его собственным инструкциям, потому что я должен носить с собой информацию о типе, или каждой переменной требуется 2 регистра вместо 1. На IA-32 это неудобно, даже если улучшено с помощью дополнительных регистров x64. Вероятно, это моя любимая функция динамических языков, поскольку она упрощает очень многие вещи с точки зрения программиста.

3) Первоклассные продолжения - есть несколько способов их реализации, и я сделал это в обоих наиболее распространенных подходах: один - это копирование стека, а другой - реализация среды выполнения для использования стиля передачи продолжения. , стеки кактусов, фреймы стека копирования при записи и сборка мусора. У продолжений первого класса есть проблемы с управлением ресурсами, т. Е. мы должны сохранить все на случай, если продолжение будет возобновлено, и я не знаю, поддерживают ли какие-либо языки оставление продолжения с «намерением» (т. е. «Я не вернусь сюда, поэтому вы можете выбросить эту копию мира» ). Запрограммировав модель потоковой передачи и модель продолжения, я знаю, что обе могут выполнять одно и то же, но элегантность продолжений накладывает значительную сложность на среду выполнения, а также может влиять на эффективность кеширования (локальность стека изменяется больше при использовании продолжений и совместных подпрограмм. ). Другая проблема в том, что они просто не соответствуют оборудованию. Оптимизация продолжений - это оптимизация для менее распространенного случая, и, как мы знаем, общий случай должен быть быстрым, а менее распространенный - правильным.

4) Арифметика указателей и способность маскировать указатели (сохранение в целых числах и т. Д.) Пришлось добавить это, но на самом деле я мог бы жить без этого довольно легко.

Мне кажется, что многие высокоуровневые функции, особенно динамических языков, просто не отображаются на оборудование. В реализациях микропроцессоров есть миллиарды долларов исследований, связанных с оптимизацией чипа, однако выбор языковых функций может обойтись без многих из этих функций (таких как кэширование, сглаживание вершин стека для регистрации, параллелизм команд, буферы адресов возврата, цикл буферы и предсказание переходов). Макроприложения микропрограмм не обязательно работают, как думают некоторые разработчики, и реализация многих языков в виртуальной машине приводит к отображению собственных операций в вызовы функций (т. Е. Чем более динамичен язык, тем больше мы должны искать / кэш во время выполнения, ничего нельзя предположить, поэтому наша смесь инструкций состоит из более высокого процента нелокальных ветвлений, чем традиционный статически скомпилированный код), и единственное, что мы действительно можем хорошо JIT, - это оценка выражений нединамических типов и операции над постоянными или немедленными типами. Мне кажется, что виртуальные машины с байт-кодом и ядра JIT, возможно, не всегда оправданы для определенных языков из-за этого.

Я приветствую ваши ответы.




Ответы (2)


Пара комментариев:

  • Все языки с динамической отправкой, даже на основе одного объекта, кажутся довольно сложными для эффективной реализации. Посмотрите на все усилия, которые были вложены в оптимизацию времени выполнения Self (или, в последнее время, JavaScript с SpiderMonkey).

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

person Norman Ramsey    schedule 24.03.2010

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

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

Внутренняя группа Microsoft .Net официально заявляет, что, по их мнению, в конечном итоге JITter превзойдет «нормальный» компилятор / компоновщик (например, C / C ++).

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

person Stephen Kellett    schedule 24.03.2010
comment
Выберите язык, который лучше всего подходит для работы ... - Спасибо, я согласен, но это не цель моего вопроса. В частности, речь идет об оптимизации и функциях. Что касается IronPython, я не знаю ответа на ваш вопрос, но мне интересно прочитать, есть ли у вас ссылки, которым я могу следовать. - person codenheim; 25.03.2010
comment
Мой вопрос был риторическим. IronPython был настолько хорош, что опроверг теорию о том, что динамические языки не подходят для виртуальных машин с байт-кодом. Отсюда следующий абзац о Microsoft, который поддерживает эту точку зрения. И это приводит к последнему абзацу. Беспокойство о том, подходит ли динамический язык, упускает из виду. Они есть (при условии, что виртуальная машина достаточно хороша, а некоторые из них - нет), поэтому вы можете просто выбрать лучший язык для работы. - person Stephen Kellett; 25.03.2010
comment
Этот вопрос не о том, подходит ли язык, поэтому, пожалуйста, оставьте его в теме. Я занимаюсь изучением / внедрением языков и виртуальных машин, и я говорю о конкретных оптимизациях функций, а вы говорите о выборе лучшего инструмента для работы. Я пишу инструменты для работы. Теперь для IronPython это полезный пример, но некоторые из перечисленных мною функций отсутствуют в Python. Python не имеет реальных закрытий (переменные доступны только для чтения) или первоклассных продолжений (CPS - это не одно и то же). IronPython доказывает, что Python можно хорошо реализовать в среде CLR, а не все языки. - person codenheim; 25.03.2010
comment
IronRuby - еще один динамический язык, который также работает в DLR быстрее, чем его собственная версия: antoniocangiano.com/2009/08/03/ У вас также есть JRuby, Groovy, Lua (и LuaJIT). Я не собираюсь опровергать ваши идеи - я недостаточно использую динамические языки, чтобы иметь о них достаточно твердое мнение, не говоря уже о том, чтобы написать виртуальную машину, реализующую их. Человек по имени Майк Полл поддерживает проект Lua JIT. Он очень доступен - вы можете найти в нем золотую жилу опыта и мнений о различных техниках. - person Stephen Kellett; 25.03.2010
comment
IronRuby - это еще один язык на основе CLR / DLR, который (пока) не является полной реализацией эталонной версии или всех функций, упомянутых выше (по крайней мере, насколько мне известно). Но спасибо за комментарии. - person codenheim; 26.03.2010