Оптимизация вызовов на C

$ git log 88ee8^..88ee8 --name-only --pretty="format:"
30
задан dsimcha 18 August 2010 в 16:24
поделиться

4 ответа

Такие утверждения, как «C не выполняет удаление хвостового вызова», не имеют смысла. Как вы правильно заметили, подобные вещи полностью зависят от реализации. И да, любая достойная реализация может легко превратить хвостовую рекурсию в [эквивалент] цикла. Конечно, компиляторы C обычно не дают никаких гарантий относительно того, какие оптимизации будут и какие не будут происходить в каждом конкретном фрагменте кода. Вы должны его скомпилировать и убедиться в этом сами.

28
ответ дан 27 November 2019 в 21:02
поделиться

Я думаю, что оптимизация хвостовых вызовов должна быть гарантирована только там, где много рекурсии ожидается или требуется; то есть на языках, которые поощряют или навязывают стиль функционального программирования. (Для таких языков вы можете обнаружить, что циклы for или while либо категорически не приветствуются, либо воспринимаются как неэлегантные, либо, вероятно, даже полностью отсутствуют в языке, поэтому вы должны прибегнуть к рекурсия по всем этим причинам и, вероятно, по другим причинам.)

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

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


PS: Обратите внимание на небольшую ошибку в моем аргументе для оптимизации хвостового вызова . Ближе к концу я упоминаю о переполнении стека. Но кто сказал, что для вызовов функций всегда требуется стек? На некоторых платформах вызовы функций могут быть реализованы совершенно по-другому, и переполнение стека никогда не будет проблемой. Это было бы еще одним аргументом против предписания оптимизации хвостового вызова в стандарте. (Но не поймите меня неправильно, я вижу достоинства такой оптимизации даже без стека!)

5
ответ дан 27 November 2019 в 21:02
поделиться

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

3
ответ дан 27 November 2019 в 21:02
поделиться

Стандарт языка определяет поведение языка, а не то, как должны быть реализованы компиляторы. Оптимизация не обязательна, потому что она не всегда нужна. Компиляторы предоставляют параметры, чтобы пользователь мог включить оптимизацию, если она того пожелает, а также может отключить ее.Оптимизация компилятора может повлиять на возможность отладки кода (становится сложнее сопоставить C с сборкой построчно), поэтому имеет смысл выполнять оптимизацию только по запросу пользователя.

1
ответ дан 27 November 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: