14

Я знаю, что:В чем разница между частичной оценкой и функцией встраивания функционального языка?

  1. Функция встраивание должен заменить вызов функции с определением функции.
  2. Частичная оценка - это оценка известных (статических) частей программы во время компиляции.

Существует различие между двумя в императивных языках, таких как C, где операторы отличаются от функций. Однако существует ли разница между этими двумя функциональными языками, такими как Haskell, где операторы также являются функциями?

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

В чем заключаются семантические различия между двумя методами оптимизации?

+5

Из небольшого числа исследований мне кажется, что функция inlining, по сути, просто заменяет определение функции (имена переменных по модулю) на ее вызов сайта, оценка не выполняется, с целью снижения накладных расходов на вызов функции и предоставления возможностей для большей оптимизации на сайте вызова. Примером частичной оценки было бы преобразование '60 * 1000' в' 60000' или поиск некоторого выражения, которое можно свести к эквивалентному, но более простому. Я не совсем уверен в этом положении, поэтому я не буду публиковать его в качестве ответа, но это моя интерпретация. – bheklilr

+0

Возможно, я спросил об этом, прежде чем дать свой ответ ниже: _why_ вы думаете, что на языке, где операторы также являются функциями, различия между вложением и частичной оценкой были бы разными? –

ответ

6

Существует разница между

  • оценкой константных выражений более заданным набором операторов и функций, известных компилятором (или даже препроцессором), которая происходит во время компиляции . Например. компилятор компилирует print(2*2) как print(4). Это не должно ограничиваться выражениями оператора, как вы, кажется, подразумеваете (например, print(sqrt(2.0))
  • частичная оценка, которая является более широкой концепцией. Компилятор понял, что print(myfunc(2)) можно было бы преобразовать в print(c), где c является результатом звонка myfunc(2). Затем он мог бы (при «времени специализации») позвонить myfunc(2), чтобы определить c. Конечно, это будет плохо ошибочно, если myfunc имеет побочные эффекты, например, вытирая собственный жесткий диск, а не пользователь программы. Поэтому компилятор должен какой-то аннотации или атрибута, чтобы знать, когда это разрешено/желательно (11, например, C++-х constexpr)

Inlining это не связано понятие. Вставка вызова функции означает замену вызова телом вызываемой функции. Этот орган не оценивается.

Существует различие между двумя в императивных языках, таких как C, где операторы отличаются от функций. Однако существует ли разница между этими двумя функциональными языками, такими как Haskell, где операторы также являются функциями?

Это отчетливость (операторы против функции) является чисто синтаксической, и не имеет отношение к разнице между встраиванием и частичной оценкой:

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

Обе концепции имеют смысл и различаются в Haskell.

  • Inlining: ghc имеет {-# INLINE f #-}, где f не может быть рекурсивными, по понятным причинам,
  • Частичной оценка: это, как правило, обобщается Supercompilation где трансформируется не только выражение базового типа, но даже функции, например, преобразование map f (map g xs) в map (f . g) xs). Он может (но не обязательно) делать встраивание. Template Haskell - это еще один способ (явно) оценить часть программы во время компиляции.

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

 Смежные вопросы

  • Нет связанных вопросов^_^