Википедия

Стратегия вычислений

Стратегия вычисления (англ. evaluation strategy) — правила семантики языка программирования, определяющие, когда следует вычислять аргументы функции (метода, операции, отношения), и какие значения следует передавать. Например, стратегия «вызов при упоминании и передача по ссылке» (call-by-worth/pass-by-reference) диктует, что аргументы должны быть вычислены перед выполнением тела вызываемой функции, и что ей должны быть предоставлены две возможности в отношении каждого аргумента: чтение текущего значения и его изменение посредством операции присваивания. На эту стратегию похожа [англ.] в лямбда-исчислении, но есть отличия.

На практике модель вычисления многих практически используемых языков (Java, C#) сводится к стратегии вызова при упоминании и передачи по ссылке. Некоторые более старые языки, в особенности небезопасные, такие как C++, сочетают несколько разных моделей вызова. Исторически вызов по значению и вызов по имени восходят к Алголу-60, созданному в конце 1950-х годов. Только чистые функциональные языки, такие как Clean и Haskell, систематически используют вызов по необходимости.

В русскоязычной литературе стратегия вычислений также называется «способом передачи параметров», «моделью вычислений» или «моделью вызова». Последний вариант может вызвать путаницу с соглашением о вызове (calling convention). Термин «передача параметров» для многих стратегий вычисления является некорректным.

Строгие вычисления

Строгая модель вычислений (англ. strict evaluation) означает, что аргументы всегда вычисляются полностью до применения функции к ним.

В нотации Чёрча энергичные вычисления (eager evaluation) операторов соответствуют строгим вычислениям для функций, и по этой причине строгие вычисления временами называются «энергичными». Большинство существующих языков используют строгие вычисления для функций.

Аппликативный порядок

Аппликативный порядок вычислений (англ. applicative order; также «вычисления слева направо, изнутри наружу» — leftmost innermost) означает стратегию вычислений, при которой обход снизу вверх по AST вычисляет аргументы слева направо в редуцируемых выражениях.

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

Стандартная демонстрация аппликативного порядка использует три функции:

image,
image,
image;

при вычислении значения image получается следующий набор подстановок:

image.

Вызов по значению

Вызов по значению (англ. call-by-value) является наиболее широко распространённой стратегией вычислений, она применена в самых разных языках — от Си до Scheme. При вызове по значению, выражение-аргумент вычисляется, и полученное значение [англ.] с соответствующим формальным параметром функции (обычно посредством копирования этого значения в новую область памяти). При этом, если язык разрешает функциям присваивать значения своим параметрам, то изменения будут касаться лишь этих локальных копий, но видимые в месте вызова функции значения останутся неизменными по возвращении.

При этом вызов по значению — целое семейство отличающихся моделей вызова, в которых аргументы вычисляются до передачи телу функции. Большинство языков (Common Lisp, Eiffel, Java), использующие вызов по значению, вычисляют аргументы функций слева направо, но некоторые вычисляют их справа налево, а некоторые (Scheme, OCaml, Си) не определяют порядок вычисления.

Скрытые ограничения

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

Причина использования вызов по ссылке обычно состоит в том, что язык технически не предоставляет возможности оперировать сложными данными как единым значением — он представляет их как структуру данных, хотя в исходном коде заставляет их выглядеть весьма похоже на значение. Определить точное место проведения грани между полноценным значением и маскирующейся под него структурой данных бывает весьма тяжело. В Си вектор (то есть одномерный массив, частным случаем которого является и символьная строка) представляет собой структуру данных и поэтому рассматривается как ссылка на область памяти; однако структура является значением, даже если её поля являются векторами. В Maple вектор является частным случаем таблицы, и следовательно, структурой данных; однако, список (который строится и индексируется точно таким же образом) является значением. В Tcl значения трактуются двояко: представление в виде значения используется на уровне сценария, а сам язык управляет соответствующей структурой данных по мере необходимости. Изменения, производимые над структурой данных, отражаются на значении, и наоборот.

Объяснение, что язык «передаёт параметры по значению, где значением является ссылка», встречается весьма часто (но его не следует отождествлять с вызовом по ссылке); иначе это называется вызовом по соиспользованию. Из-за этого вызов по значению в языках Java и Visual Basic ведёт себя существенно иначе, нежели вызов по значению в языках Си и Паскаль. В Си или Паскале при передаче массивной структуры данных в функцию вся структура будет скопирована (если только аргумент не является в действительности ссылкой на структуру данных), что потенциально существенно снизит быстродействие; при этом изменения состояния структуры не будут видны в вызывающем контексте. В Java и Visual Basic копируется всегда лишь ссылка на структуру, что выполняется быстро, и изменение структуры будет видно в месте вызова.

Вызов по ссылке

При вызове по ссылке (англ. call-by-reference; или передаче по ссылке — pass-by-reference) функция неявно получает ссылку на переменную, использованную в качестве аргумента, вместо копии её значения.

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

Многие языки поддерживают вызов по ссылке в той или иной форме, но лишь немногие используют его по умолчанию — например Perl. Ряд языков, например, C++, PHP, Visual Basic .NET, C# и REALbasic, по умолчанию используют вызов по значению, но предоставляют специальный синтаксис для вызова по ссылке. C++ дополнительно представляет уникальную стратегию «вызов по ссылке на константу».

Системы типов некоторых языков, использующих вызов по значению и непосредственно не поддерживающих вызов по ссылке, предоставляют возможность явно определять ссылки (объекты, ссылающиеся на другие объекты), в частности, указатели (объекты, представляющие собой адреса других объектов в памяти ЭВМ). Их использование позволяет симулировать вызов по ссылке внутри семантики вызова по значению. Такое решение применяется, например, в языках Си и ML. Оно не является самостоятельной стратегией вычисления — язык по-прежнему вызывает по значению — но иногда его называют «вызовом по адресу» (call-by-address) или «передачей по адресу» (pass-by-address). В небезопасных языках, например в Си или C++, оно может приводить к ошибкам доступа к памяти, таким как разыменование нулевого указателя, соответственно, к затруднению понимания программы и первоначального изучения языка. В ML ссылки безопасны по типам и по доступу к памяти.

Близкий эффект также обеспечивает стратегия вызова по соиспользованию, применяемая в таких языках как Java, Python, Ruby.

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

Следующий пример демонстрирует симуляцию вызова по ссылке в языке E:

 def modify( var p, &q ) { p := 27 # параметр передан по значению - только локальное значение изменяется q := 27 # параметр передан по ссылке - изменяется переменная, использованная при вызове }  ? var a := 1 # значение: 1  ? var b := 2 # значение: 2  ? modify( a, &b )  ? a # значение: 1  ? b # значение: 27

Следующий пример демонстрирует симуляцию вызова по ссылке в языке Си — переменные целого типа и указатели передаются по значению, но так как указатель содержит адрес внешней переменной, её значение изменится:

void Modify( int p, int * q, int * o )  {  // все параметры переданы по значению  p = 27; // изменяется только локальное значение  *q = 27; // изменяется внешняя переменная, на которую указывает q  *o = 27; // изменяется внешняя переменная, на которую указывает o } int main() {  int a = 1;  int b = 1;  int x = 1;  int * c = &x;  Modify( a, &b, c ); // 1-й параметр - значение переменной a  // 2-й параметр - адрес переменной b  // 3-й параметр - значение переменной c, являющееся адресом переменной x  // b и x изменяются  return(0); } 

Вызов по соиспользованию

Вызов по соиспользованию (вызов с разделением ресурсов — англ. call-by-sharing; вызов по объекту — call-by-object; вызов с разделяемым объектом — call-by-object-sharing) подразумевает, что значения в языке основаны на объектах, а не на примитивных типах, то есть «» («упакованы», англ. boxed). При вызове по соиспользованию функция получает копию ссылки на объект. Сам объект не копируется — он оказывается соиспользуемым или разделяемым. Как следствие, присваивание аргументу в теле функции не имеет эффекта в вызывающем её контексте, но присваивание компонентам этого аргумента — имеет.

Вызов по соиспользованию впервые реализован в языке Клу в 1974 году под руководством Барбары Лисков.

Эта стратегия используется в языках Python, [англ.], Java (для ссылок на объекты), Ruby, JavaScript, Scheme, Ocaml, AppleScript, и многих других. Однако, терминология в сообществах разных языков различается. Например, в сообществе Python используется термин «вызов по соиспользованию»; в сообществах Java и Visual Basic ту же семантику часто описывают как вызов по значению, где значением является ссылка на объект; в сообществе Ruby говорят, что язык «использует вызов по ссылке» — несмотря на то, что семантика вызова в этих языках идентична.

Для неизменяемых объектов нет разницы между вызовом по соиспользованию и вызовом по значению, за исключением идентичности этих объектов. Применение вызова по соиспользованию является альтернативой применения входных и выходных параметров — изменение параметра здесь не означает присваивание параметру; параметр не перезаписывается, а изменяет состояние, сохраняя свою идентичность.

Например, в языке Python списки являются изменяемыми объектами, поэтому:

def f(l): l.append(1) m = [] f(m) print m 

— напечатает «[1]», так как аргумент «l» был изменён.

Разницу между изменением и присваиванием демонстрирует следующий пример. Такой код:

def f(l): l += [1] m = [] f(m) print m 

— напечатает «[1]», так как оператор «l += [1]» ведёт себя как «l.extend([1])»; но похожий код:

def f(l): l = l + [1] m = [] f(m) print m 

— напечатает"[]", так как оператор «l = l + [1]» создаёт новую локальную переменную, вместо того, чтобы изменять аргумент.

Наглядно семантику обёрнутых (boxed) значений и вызова по соиспользованию демонстрирует поведение следующей программы:

x = [[]] * 4 x[0].append('a') x[1].append('b') x[2].append('c') print(x) >>[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']] 

Оператор «x = [[]] * 4» создаёт пустой список (назовём его «l»), а затем новый список ([англ.] «x») из четырёх элементов, каждый из которых является ссылкой на «l», то есть «x = [ l, l, l, l ]». Последующие обращения к разным элементам списка «x» изменяют объект «l». То же происходит и при печати списка «x»: поскольку он состоит из четырёх ссылок на «l», то и состав «l» распечатывается четыре раза.

Вызов по копированию — восстановлению

Вызов по копированию — восстановлению (англ. call-by-copy-restore; копируй-на-входе копируй-на-выходе — copy-in copy-out; вызов по значению в результате, call-by-value-result; вызов по значению при возврате — call-by-value-return) — особый случай вызова по ссылке, в котором предоставляемая ссылка является уникальной для вызывающего контекста. Этот вариант интересен в контексте многопроцессорных систем и удалённого вызова процедур: если параметром функции является ссылка, которая может быть доступна для другого исполняемого процесса, то её содержимое может быть скопировано в новую ссылку, которая уже будет недоступна; при возвращении из функции изменённое содержимое этой новой ссылки будет скопировано в исходную ссылку («восстановлено»).

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

Если ссылка передаётся неинициализированной, такая стратегия вычисления может называться вызов по результату (англ. call-by-result).

Частичные вычисления

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

Нестрогие вычисления

Нестрогая модель вычислений (англ. non-strict evaluation) означает, что аргументы не вычисляются до тех пор, пока их значение не используется в теле функции.

Нестрогое вычисление функций соответствует ленивому вычислению операторов в нотации Чёрча, и поэтому нестрогие вычисления часто называются «ленивыми».

В ряде языков (в том числе Си и C++) булевы выражения имеют нестрогий порядок вычисления, называемый вычислениями по короткой схеме, где вычисления прекращаются, как только результат становится однозначно предсказуем — например, значение «истина» в операции дизъюнкции, «ложь» в операции конъюнкции, и так далее. Операторы ветвления зачастую также имеют ленивую семантику вычислений, то есть возвращают результат всего оператора, как только однозначная ветвь его породит.

Нормальный порядок

Нормальным порядком вычислений (англ. normal order; также «вычислениями слева направо, снаружи внутрь», leftmost outermost) называют стратегию вычислений, при которой охватывающее выражение полностью редуцируется, применяя функции до вычисления аргументов.

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

Например, значение image для функции image, используемой в стандартной демонстрации аппликативного порядка, при вычислении нормальным порядком даст следующий набор подстановок:

image
image
image
image

Вызов по имени

В стратегии вызова по имени (англ. call-by-name аргументы не вычисляются перед вызовом функции. Вместо этого они подставляются непосредственно в тело функции (используя [англ.]), и далее вычисляются по месту требования. Если аргумент не используется в теле функции, он вообще не вычисляется; если он используется несколько раз, он повторно вычисляется при каждом вхождении (трюк Йенсена).

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

Впервые вызов по имени был применён в Алголе-60. .NET-языки могут симулировать вызов по имени, используя делегаты или Expression<T>-параметры. В последнем случае функция получает AST. В языке Eiffel реализованы агенты, представляющие собой операции, выполняемые по требованию.

Вызов по необходимости

Вызов по необходимости (англ. call-by-need) представляет собой мемоизированный вариант вызова по имени, где, если аргумент вычислен, его значение сохраняется для последующего использования. В случае «чистоты языка» (при отсутствии побочных эффектов) это производит тот же результат, что и вызов по имени; а в случаях, когда аргумент используется два и более раз, вызов по необходимости почти всегда работает быстрее.

Поскольку вычисляемые выражения могут иметь очень глубокую степень вложения, то языки, использующие вызов по необходимости обычно не поддерживают побочные эффекты (такие как изменение состояния) напрямую, и их приходится эмулировать посредством монад (как в языке Haskell) или уникальных типов (как в языке Clean). Это исключает любое непредсказуемое поведение отложенных вычислений, когда значения переменных изменяются раньше, чем используются.

Наиболее распространённой реализацией семантики вызова по необходимости являются ленивые вычисления, хотя встречаются и другие варианты — например оптимистичные вычисления.

Haskell — наиболее известный язык, использующий вызов по необходимости. R также использует своего рода вызов по необходимости. .NET-языки могут симулировать вызов по необходимости, используя тип Lazy<T>.

Вызов по макрораскрытию

Вызов по макрораскрытию (англ. call-by-macro-expansion) похож на вызов по имени, но использует текстовую подстановку вместо подстановки без захвата. При неосторожном использовании, подстановка макроопределения может привести к захвату переменной и нежелательному поведению программы. [англ.] устраняют эту проблему, проверяя и при необходимости подменяя затеняемые переменные, не являющиеся параметрами.

Недетерминированные стратегии

Полная β-редукция

В полной β-редукции любое применение функции может быть редуцировано (подставляя аргумент в тело функции с использованием [англ.] в любое время. Это может производиться даже в теле неприменённой функции.

Вызов по преднамеченности

Вызов по преднамеченности (англ. call by future), или параллельный вызов по имени (parallel call-by-name) — это параллельная стратегия вычисления: значения преднамеченных выражений (future expressions) вычисляются параллельно с течением остальной программы. В местах, где требуется значение преднамеченности, основная программа блокируется до завершения вычисления, если оно ещё не было завершено к этому моменту.

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

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

Оптимистичные вычисления

Оптимистичные вычисления (англ. Optimistic evaluation) — это другой вариант вызова по необходимости, при котором аргумент функции частично вычисляется за некоторый отведённый промежуток времени (который можно настраивать во время исполнения программы), после чего вычисления прерываются и функция применяется с использованием вызова по необходимости. Такой подход снижает временны́е задержки, присущие ленивым вычислениям, обеспечивая те же характеристики продукта.

См. также

  • [англ.]
  • Лямбда-исчисление
  • Параметр (программирование)
  • [англ.]

Примечания

  1. Essentials of Programming Languages by Daniel P. Friedman and Mitchell Wand, MIT Press 1989—2006
  2. Lambda Calculus. Cs.uiowa.edu. Дата обращения: 29 мая 2014. Архивировано из оригинала 14 декабря 2010 года.
  3. applicative order reduction definition of applicative order reduction in the Free Online Encyclopedia. Encyclopedia2.thefreedictionary.com.
  4. Harold Abelson and Gerald Jay Sussman with Julie Sussman. 1.1.5 The Substitution Model for Procedure Application // Structure and Interpretation of Computer Programs. — second edition. — Cambridge, Massachusetts, London, England: The MIT Press, 1996.
  5. Barbara Liskov, Russ Atkinson, Toby Bloom, Eliot Moss, Craig Schaffert, Craig Scheifler, Alan Snyder. CLU Reference Manual (англ.). Laboratory for Computer Science. Massachusetts Institute of Technology (1979). Дата обращения: 29 мая 2014. Архивировано из оригинала 22 сентября 2006 года.
  6. Fredrik Lundh. Call By Object (англ.). effbot.org. Дата обращения: 29 мая 2014. Архивировано из оригинала 23 ноября 2019 года.
  7. Iota Language Definition. CS 412/413 Introduction to Compilers. Cornell University (2001). Дата обращения: 29 мая 2014. Архивировано 23 сентября 2015 года.
  8. CA1021: Avoid out parameters. Дата обращения: 29 мая 2014. Архивировано 5 октября 2013 года.
  9. В отличие от Си, в Python записи «l += x» и «l = l + x» не являются эквивалентными — первое семантически является изменением, а не присваиванием. Более того, «l += x» не является синтаксическим эквивалентом «l.extend(x)» из-за правил разрешения видимости: «l += x» требует, чтобы «l» был в локальной области, тогда как «l.extend(x)» ищет также и в охватывающих.

Ссылки

  • Харольд Абельсон, Джеральд Джей Сассман, Джули Сассман — Структура и интерпретация компьютерных программ
  • Clem Baker-Finch, David King, Jon Hall, Phil Trinder. An Operational Semantics for Parallel Call-by-Need // Research report. — Faculty of Mathematics & Computing, The Open University, 1999-03-10. — Вып. 1, № 99.
  • Robert Ennals, Simon Peyton Jones. Optimistic Evaluation: a fast evaluation strategy for non-strict programs. — ACM Press, 2003. — Вып. International Conference on Functional Programming.
  • Bertram Ludäscher. CSE 130 lecture notes (англ.). CSE 130: Programming Languages: Principles & Paradigms (24 января 2001).
  • Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002. — ISBN 978-0-262-16209-8.
  • Peter Sestoft. The essence of computation : complexity, analysis, trnasformation : essays dedicated to Neil D. Jones. — Springer-Verlag, 2002. — С. 420—435 "Demonstrating Lambda Calculus Reduction". — ISBN 3-540-00326-6. Архивная копия от 21 июня 2006 на Wayback Machine

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Стратегия вычислений, Что такое Стратегия вычислений? Что означает Стратегия вычислений?

Strategiya vychisleniya angl evaluation strategy pravila semantiki yazyka programmirovaniya opredelyayushie kogda sleduet vychislyat argumenty funkcii metoda operacii otnosheniya i kakie znacheniya sleduet peredavat Naprimer strategiya vyzov pri upominanii i peredacha po ssylke call by worth pass by reference diktuet chto argumenty dolzhny byt vychisleny pered vypolneniem tela vyzyvaemoj funkcii i chto ej dolzhny byt predostavleny dve vozmozhnosti v otnoshenii kazhdogo argumenta chtenie tekushego znacheniya i ego izmenenie posredstvom operacii prisvaivaniya Na etu strategiyu pohozha angl v lyambda ischislenii no est otlichiya Na praktike model vychisleniya mnogih prakticheski ispolzuemyh yazykov Java C svoditsya k strategii vyzova pri upominanii i peredachi po ssylke Nekotorye bolee starye yazyki v osobennosti nebezopasnye takie kak C sochetayut neskolko raznyh modelej vyzova Istoricheski vyzov po znacheniyu i vyzov po imeni voshodyat k Algolu 60 sozdannomu v konce 1950 h godov Tolko chistye funkcionalnye yazyki takie kak Clean i Haskell sistematicheski ispolzuyut vyzov po neobhodimosti V russkoyazychnoj literature strategiya vychislenij takzhe nazyvaetsya sposobom peredachi parametrov modelyu vychislenij ili modelyu vyzova Poslednij variant mozhet vyzvat putanicu s soglasheniem o vyzove calling convention Termin peredacha parametrov dlya mnogih strategij vychisleniya yavlyaetsya nekorrektnym Strogie vychisleniyaZapros Strogie vychisleniya perenapravlyaetsya syuda Na etu temu nuzhno sozdat otdelnuyu statyu Strogaya model vychislenij angl strict evaluation oznachaet chto argumenty vsegda vychislyayutsya polnostyu do primeneniya funkcii k nim V notacii Chyorcha energichnye vychisleniya eager evaluation operatorov sootvetstvuyut strogim vychisleniyam dlya funkcij i po etoj prichine strogie vychisleniya vremenami nazyvayutsya energichnymi Bolshinstvo sushestvuyushih yazykov ispolzuyut strogie vychisleniya dlya funkcij Applikativnyj poryadok Applikativnyj poryadok vychislenij angl applicative order takzhe vychisleniya sleva napravo iznutri naruzhu leftmost innermost oznachaet strategiyu vychislenij pri kotoroj obhod snizu vverh po AST vychislyaet argumenty sleva napravo v reduciruemyh vyrazheniyah V otlichie ot vyzova po znacheniyu applikativnyj poryadok vychislenij maksimalno reduciruet termy v tele funkcii do eyo primeneniya Standartnaya demonstraciya applikativnogo poryadka ispolzuet tri funkcii square x x x displaystyle square x x cdot x sum of squares x y square x square y displaystyle sum of squares x y square x square y f x sum of squares x 1 x 2 displaystyle f x sum of squares x 1 x cdot 2 pri vychislenii znacheniya f 5 displaystyle f 5 poluchaetsya sleduyushij nabor podstanovok f 5 sum of squares 5 1 5 2 square 6 square 10 6 6 10 10 36 100 136 displaystyle f 5 sum of squares 5 1 5 cdot 2 square 6 square 10 6 cdot 6 10 cdot 10 36 100 136 Vyzov po znacheniyu Vyzov po znacheniyu angl call by value yavlyaetsya naibolee shiroko rasprostranyonnoj strategiej vychislenij ona primenena v samyh raznyh yazykah ot Si do Scheme Pri vyzove po znacheniyu vyrazhenie argument vychislyaetsya i poluchennoe znachenie angl s sootvetstvuyushim formalnym parametrom funkcii obychno posredstvom kopirovaniya etogo znacheniya v novuyu oblast pamyati Pri etom esli yazyk razreshaet funkciyam prisvaivat znacheniya svoim parametram to izmeneniya budut kasatsya lish etih lokalnyh kopij no vidimye v meste vyzova funkcii znacheniya ostanutsya neizmennymi po vozvrashenii Pri etom vyzov po znacheniyu celoe semejstvo otlichayushihsya modelej vyzova v kotoryh argumenty vychislyayutsya do peredachi telu funkcii Bolshinstvo yazykov Common Lisp Eiffel Java ispolzuyushie vyzov po znacheniyu vychislyayut argumenty funkcij sleva napravo no nekotorye vychislyayut ih sprava nalevo a nekotorye Scheme OCaml Si ne opredelyayut poryadok vychisleniya Skrytye ogranicheniya V nekotoryh sluchayah termin vyzov po znacheniyu yavlyaetsya ne vpolne korrektnym tak kak peredavaemoe znachenie yavlyaetsya ne znacheniem peremennoj v privychnom ponimanii a ssylkoj na znachenie realizaciya kotoroj mozhet byt razlichnoj V rezultate kod sintaksicheski vyglyadyashij kak vyzyvayushij po znacheniyu mozhet vesti sebya kak vyzyvayushij libo po ssylke libo po soispolzovaniyu i povedenie programmy budet zaviset ot tonkih detalej semantiki yazyka Prichina ispolzovaniya vyzov po ssylke obychno sostoit v tom chto yazyk tehnicheski ne predostavlyaet vozmozhnosti operirovat slozhnymi dannymi kak edinym znacheniem on predstavlyaet ih kak strukturu dannyh hotya v ishodnom kode zastavlyaet ih vyglyadet vesma pohozhe na znachenie Opredelit tochnoe mesto provedeniya grani mezhdu polnocennym znacheniem i maskiruyushejsya pod nego strukturoj dannyh byvaet vesma tyazhelo V Si vektor to est odnomernyj massiv chastnym sluchaem kotorogo yavlyaetsya i simvolnaya stroka predstavlyaet soboj strukturu dannyh i poetomu rassmatrivaetsya kak ssylka na oblast pamyati odnako struktura yavlyaetsya znacheniem dazhe esli eyo polya yavlyayutsya vektorami V Maple vektor yavlyaetsya chastnym sluchaem tablicy i sledovatelno strukturoj dannyh odnako spisok kotoryj stroitsya i indeksiruetsya tochno takim zhe obrazom yavlyaetsya znacheniem V Tcl znacheniya traktuyutsya dvoyako predstavlenie v vide znacheniya ispolzuetsya na urovne scenariya a sam yazyk upravlyaet sootvetstvuyushej strukturoj dannyh po mere neobhodimosti Izmeneniya proizvodimye nad strukturoj dannyh otrazhayutsya na znachenii i naoborot Obyasnenie chto yazyk peredayot parametry po znacheniyu gde znacheniem yavlyaetsya ssylka vstrechaetsya vesma chasto no ego ne sleduet otozhdestvlyat s vyzovom po ssylke inache eto nazyvaetsya vyzovom po soispolzovaniyu Iz za etogo vyzov po znacheniyu v yazykah Java i Visual Basic vedyot sebya sushestvenno inache nezheli vyzov po znacheniyu v yazykah Si i Paskal V Si ili Paskale pri peredache massivnoj struktury dannyh v funkciyu vsya struktura budet skopirovana esli tolko argument ne yavlyaetsya v dejstvitelnosti ssylkoj na strukturu dannyh chto potencialno sushestvenno snizit bystrodejstvie pri etom izmeneniya sostoyaniya struktury ne budut vidny v vyzyvayushem kontekste V Java i Visual Basic kopiruetsya vsegda lish ssylka na strukturu chto vypolnyaetsya bystro i izmenenie struktury budet vidno v meste vyzova Vyzov po ssylke Pri vyzove po ssylke angl call by reference ili peredache po ssylke pass by reference funkciya neyavno poluchaet ssylku na peremennuyu ispolzovannuyu v kachestve argumenta vmesto kopii eyo znacheniya Obychno eto oznachaet chto funkciya mozhet osushestvlyat modifikaciyu to est izmenyat sostoyanie peremennoj peredannoj v kachestve parametra i eto budet imet effekt v vyzyvayushem kontekste Sledovatelno vyzov po ssylke mozhet primenyatsya dlya organizacii kanala vzaimodejstviya mezhdu vyzyvaemoj i vyzyvayushej funkciyami Yazyk neposredstvenno osnovannyj na vyzove po ssylke zatrudnyaet vozmozhnost dlya programmista otsledit vse effekty ot vyzova funkcii poetomu emu mogut byt prisushi svoeobraznye bagi Mnogie yazyki podderzhivayut vyzov po ssylke v toj ili inoj forme no lish nemnogie ispolzuyut ego po umolchaniyu naprimer Perl Ryad yazykov naprimer C PHP Visual Basic NET C i REALbasic po umolchaniyu ispolzuyut vyzov po znacheniyu no predostavlyayut specialnyj sintaksis dlya vyzova po ssylke C dopolnitelno predstavlyaet unikalnuyu strategiyu vyzov po ssylke na konstantu Sistemy tipov nekotoryh yazykov ispolzuyushih vyzov po znacheniyu i neposredstvenno ne podderzhivayushih vyzov po ssylke predostavlyayut vozmozhnost yavno opredelyat ssylki obekty ssylayushiesya na drugie obekty v chastnosti ukazateli obekty predstavlyayushie soboj adresa drugih obektov v pamyati EVM Ih ispolzovanie pozvolyaet simulirovat vyzov po ssylke vnutri semantiki vyzova po znacheniyu Takoe reshenie primenyaetsya naprimer v yazykah Si i ML Ono ne yavlyaetsya samostoyatelnoj strategiej vychisleniya yazyk po prezhnemu vyzyvaet po znacheniyu no inogda ego nazyvayut vyzovom po adresu call by address ili peredachej po adresu pass by address V nebezopasnyh yazykah naprimer v Si ili C ono mozhet privodit k oshibkam dostupa k pamyati takim kak razymenovanie nulevogo ukazatelya sootvetstvenno k zatrudneniyu ponimaniya programmy i pervonachalnogo izucheniya yazyka V ML ssylki bezopasny po tipam i po dostupu k pamyati Blizkij effekt takzhe obespechivaet strategiya vyzova po soispolzovaniyu primenyaemaya v takih yazykah kak Java Python Ruby V chistyh funkcionalnyh yazykah net semanticheskoj raznicy mezhdu vyzovom po ssylke i vyzovom po znacheniyu poskolku struktury dannyh v nih yavlyayutsya neizmenyaemymi i funkciya tak ili inache ne imeet vozmozhnosti izmenit znachenie svoih argumentov poetomu ih obychno opisyvayut kak vyzyvayushie po znacheniyu nesmotrya na to chto mnogie realizacii v dejstvitelnosti ispolzuyut vyzov po ssylke dlya povysheniya effektivnosti Sleduyushij primer demonstriruet simulyaciyu vyzova po ssylke v yazyke E def modify var p amp q p 27 parametr peredan po znacheniyu tolko lokalnoe znachenie izmenyaetsya q 27 parametr peredan po ssylke izmenyaetsya peremennaya ispolzovannaya pri vyzove var a 1 znachenie 1 var b 2 znachenie 2 modify a amp b a znachenie 1 b znachenie 27 Sleduyushij primer demonstriruet simulyaciyu vyzova po ssylke v yazyke Si peremennye celogo tipa i ukazateli peredayutsya po znacheniyu no tak kak ukazatel soderzhit adres vneshnej peremennoj eyo znachenie izmenitsya void Modify int p int q int o vse parametry peredany po znacheniyu p 27 izmenyaetsya tolko lokalnoe znachenie q 27 izmenyaetsya vneshnyaya peremennaya na kotoruyu ukazyvaet q o 27 izmenyaetsya vneshnyaya peremennaya na kotoruyu ukazyvaet o int main int a 1 int b 1 int x 1 int c amp x Modify a amp b c 1 j parametr znachenie peremennoj a 2 j parametr adres peremennoj b 3 j parametr znachenie peremennoj c yavlyayusheesya adresom peremennoj x b i x izmenyayutsya return 0 Vyzov po soispolzovaniyu Vyzov po soispolzovaniyu vyzov s razdeleniem resursov angl call by sharing vyzov po obektu call by object vyzov s razdelyaemym obektom call by object sharing podrazumevaet chto znacheniya v yazyke osnovany na obektah a ne na primitivnyh tipah to est upakovany angl boxed Pri vyzove po soispolzovaniyu funkciya poluchaet kopiyu ssylki na obekt Sam obekt ne kopiruetsya on okazyvaetsya soispolzuemym ili razdelyaemym Kak sledstvie prisvaivanie argumentu v tele funkcii ne imeet effekta v vyzyvayushem eyo kontekste no prisvaivanie komponentam etogo argumenta imeet Vyzov po soispolzovaniyu vpervye realizovan v yazyke Klu v 1974 godu pod rukovodstvom Barbary Liskov Eta strategiya ispolzuetsya v yazykah Python angl Java dlya ssylok na obekty Ruby JavaScript Scheme Ocaml AppleScript i mnogih drugih Odnako terminologiya v soobshestvah raznyh yazykov razlichaetsya Naprimer v soobshestve Python ispolzuetsya termin vyzov po soispolzovaniyu v soobshestvah Java i Visual Basic tu zhe semantiku chasto opisyvayut kak vyzov po znacheniyu gde znacheniem yavlyaetsya ssylka na obekt v soobshestve Ruby govoryat chto yazyk ispolzuet vyzov po ssylke nesmotrya na to chto semantika vyzova v etih yazykah identichna Dlya neizmenyaemyh obektov net raznicy mezhdu vyzovom po soispolzovaniyu i vyzovom po znacheniyu za isklyucheniem identichnosti etih obektov Primenenie vyzova po soispolzovaniyu yavlyaetsya alternativoj primeneniya vhodnyh i vyhodnyh parametrov izmenenie parametra zdes ne oznachaet prisvaivanie parametru parametr ne perezapisyvaetsya a izmenyaet sostoyanie sohranyaya svoyu identichnost Naprimer v yazyke Python spiski yavlyayutsya izmenyaemymi obektami poetomu def f l l append 1 m f m print m napechataet 1 tak kak argument l byl izmenyon Raznicu mezhdu izmeneniem i prisvaivaniem demonstriruet sleduyushij primer Takoj kod def f l l 1 m f m print m napechataet 1 tak kak operator l 1 vedyot sebya kak l extend 1 no pohozhij kod def f l l l 1 m f m print m napechataet tak kak operator l l 1 sozdayot novuyu lokalnuyu peremennuyu vmesto togo chtoby izmenyat argument Naglyadno semantiku obyornutyh boxed znachenij i vyzova po soispolzovaniyu demonstriruet povedenie sleduyushej programmy x 4 x 0 append a x 1 append b x 2 append c print x gt gt a b c a b c a b c a b c Operator x 4 sozdayot pustoj spisok nazovyom ego l a zatem novyj spisok angl x iz chetyryoh elementov kazhdyj iz kotoryh yavlyaetsya ssylkoj na l to est x l l l l Posleduyushie obrasheniya k raznym elementam spiska x izmenyayut obekt l To zhe proishodit i pri pechati spiska x poskolku on sostoit iz chetyryoh ssylok na l to i sostav l raspechatyvaetsya chetyre raza Vyzov po kopirovaniyu vosstanovleniyu Vyzov po kopirovaniyu vosstanovleniyu angl call by copy restore kopiruj na vhode kopiruj na vyhode copy in copy out vyzov po znacheniyu v rezultate call by value result vyzov po znacheniyu pri vozvrate call by value return osobyj sluchaj vyzova po ssylke v kotorom predostavlyaemaya ssylka yavlyaetsya unikalnoj dlya vyzyvayushego konteksta Etot variant interesen v kontekste mnogoprocessornyh sistem i udalyonnogo vyzova procedur esli parametrom funkcii yavlyaetsya ssylka kotoraya mozhet byt dostupna dlya drugogo ispolnyaemogo processa to eyo soderzhimoe mozhet byt skopirovano v novuyu ssylku kotoraya uzhe budet nedostupna pri vozvrashenii iz funkcii izmenyonnoe soderzhimoe etoj novoj ssylki budet skopirovano v ishodnuyu ssylku vosstanovleno Semantika vyzova po kopirovaniyu vosstanovleniyu takzhe otlichaetsya ot vyzova po ssylke v sluchae esli dva i bolee argumenta funkcii yavlyayutsya psevdonimami drug druga to est ukazyvayut na odnu i tu zhe peremennuyu v vyzyvayushem kontekste V sluchae vyzova po ssylke izmenenie odnoj budet oznachat izmenenie drugoj Vyzov po kopirovaniyu vosstanovleniyu prepyatstvuet etomu peredavaya v funkciyu raznye kopii no rezultat v vyzyvayushem kontekste yavlyaetsya neopredelyonnym tak kak zavisit ot togo budet li obratnoe kopirovanie proizvoditsya v tom zhe napravlenii sleva napravo ili sprava nalevo chto i pered vyzovom Esli ssylka peredayotsya neinicializirovannoj takaya strategiya vychisleniya mozhet nazyvatsya vyzov po rezultatu angl call by result Chastichnye vychisleniya Osnovnaya statya Chastichnye vychisleniya Pri chastichnyh vychisleniyah vychisleniya mogut proizvoditsya v neprimenyonnoj funkcii Vychislyayutsya lyubye podvyrazheniya ne soderzhashie nesvyazannyh peremennyh reduciruyutsya primeneniya funkcij s izvestnymi argumentami Pri nalichii pobochnyh effektov polnoe chastichnoe vychislenie mozhet privodit k nezhelatelnym rezultatam poetomu sistemy podderzhivayushie chastichnye vychisleniya proizvodyat ih lish dlya chistyh vyrazhenij vyrazhenij bez pobochnyh effektov v funkciyah Nestrogie vychisleniyaNestrogaya model vychislenij angl non strict evaluation oznachaet chto argumenty ne vychislyayutsya do teh por poka ih znachenie ne ispolzuetsya v tele funkcii Nestrogoe vychislenie funkcij sootvetstvuet lenivomu vychisleniyu operatorov v notacii Chyorcha i poetomu nestrogie vychisleniya chasto nazyvayutsya lenivymi V ryade yazykov v tom chisle Si i C bulevy vyrazheniya imeyut nestrogij poryadok vychisleniya nazyvaemyj vychisleniyami po korotkoj sheme gde vychisleniya prekrashayutsya kak tolko rezultat stanovitsya odnoznachno predskazuem naprimer znachenie istina v operacii dizyunkcii lozh v operacii konyunkcii i tak dalee Operatory vetvleniya zachastuyu takzhe imeyut lenivuyu semantiku vychislenij to est vozvrashayut rezultat vsego operatora kak tolko odnoznachnaya vetv ego porodit Normalnyj poryadok Normalnym poryadkom vychislenij angl normal order takzhe vychisleniyami sleva napravo snaruzhi vnutr leftmost outermost nazyvayut strategiyu vychislenij pri kotoroj ohvatyvayushee vyrazhenie polnostyu reduciruetsya primenyaya funkcii do vychisleniya argumentov V otlichie ot normalnogo poryadka strategiya vyzova po imeni ne vychislyaet argumenty i vyrazheniya vnutri funkcij kotorye ne vyzyvayutsya Naprimer znachenie f 5 displaystyle f 5 dlya funkcii f displaystyle f ispolzuemoj v standartnoj demonstracii applikativnogo poryadka pri vychislenii normalnym poryadkom dast sleduyushij nabor podstanovok f 5 sum of squares 5 1 5 2 displaystyle f 5 sum of squares 5 1 5 cdot 2 square 5 1 square 5 2 displaystyle square 5 1 square 5 cdot 2 5 1 5 1 5 2 5 2 displaystyle 5 1 cdot 5 1 5 cdot 2 cdot 5 cdot 2 6 6 10 10 36 100 136 displaystyle 6 cdot 6 10 cdot 10 36 100 136 dd Vyzov po imeni V strategii vyzova po imeni angl call by name argumenty ne vychislyayutsya pered vyzovom funkcii Vmesto etogo oni podstavlyayutsya neposredstvenno v telo funkcii ispolzuya angl i dalee vychislyayutsya po mestu trebovaniya Esli argument ne ispolzuetsya v tele funkcii on voobshe ne vychislyaetsya esli on ispolzuetsya neskolko raz on povtorno vychislyaetsya pri kazhdom vhozhdenii tryuk Jensena Vyzov po imeni poroj okazyvaetsya predpochtitelnee vyzova po znacheniyu Esli argument ne ispolzuetsya v tele funkcii vyzov po imeni ekonomit vremya poskolku ne vychislyaet ego togda kak vyzov po znacheniyu oznachaet neizbezhnoe vychislenie Esli argument yavlyaetsya angl vygoda okazyvaetsya ogromnoj Odnako kogda argument ispolzuetsya vyzov po imeni chasto okazyvaetsya medlennee tak kak trebuet sozdavat tak nazyvaemyj angl Vpervye vyzov po imeni byl primenyon v Algole 60 NET yazyki mogut simulirovat vyzov po imeni ispolzuya delegaty ili Expression lt T gt parametry V poslednem sluchae funkciya poluchaet AST V yazyke Eiffel realizovany agenty predstavlyayushie soboj operacii vypolnyaemye po trebovaniyu Vyzov po neobhodimosti Vyzov po neobhodimosti angl call by need predstavlyaet soboj memoizirovannyj variant vyzova po imeni gde esli argument vychislen ego znachenie sohranyaetsya dlya posleduyushego ispolzovaniya V sluchae chistoty yazyka pri otsutstvii pobochnyh effektov eto proizvodit tot zhe rezultat chto i vyzov po imeni a v sluchayah kogda argument ispolzuetsya dva i bolee raz vyzov po neobhodimosti pochti vsegda rabotaet bystree Poskolku vychislyaemye vyrazheniya mogut imet ochen glubokuyu stepen vlozheniya to yazyki ispolzuyushie vyzov po neobhodimosti obychno ne podderzhivayut pobochnye effekty takie kak izmenenie sostoyaniya napryamuyu i ih prihoditsya emulirovat posredstvom monad kak v yazyke Haskell ili unikalnyh tipov kak v yazyke Clean Eto isklyuchaet lyuboe nepredskazuemoe povedenie otlozhennyh vychislenij kogda znacheniya peremennyh izmenyayutsya ranshe chem ispolzuyutsya Naibolee rasprostranyonnoj realizaciej semantiki vyzova po neobhodimosti yavlyayutsya lenivye vychisleniya hotya vstrechayutsya i drugie varianty naprimer optimistichnye vychisleniya Haskell naibolee izvestnyj yazyk ispolzuyushij vyzov po neobhodimosti R takzhe ispolzuet svoego roda vyzov po neobhodimosti NET yazyki mogut simulirovat vyzov po neobhodimosti ispolzuya tip Lazy lt T gt Vyzov po makroraskrytiyu Vyzov po makroraskrytiyu angl call by macro expansion pohozh na vyzov po imeni no ispolzuet tekstovuyu podstanovku vmesto podstanovki bez zahvata Pri neostorozhnom ispolzovanii podstanovka makroopredeleniya mozhet privesti k zahvatu peremennoj i nezhelatelnomu povedeniyu programmy angl ustranyayut etu problemu proveryaya i pri neobhodimosti podmenyaya zatenyaemye peremennye ne yavlyayushiesya parametrami Nedeterminirovannye strategiiPolnaya b redukciya V polnoj b redukcii lyuboe primenenie funkcii mozhet byt reducirovano podstavlyaya argument v telo funkcii s ispolzovaniem angl v lyuboe vremya Eto mozhet proizvoditsya dazhe v tele neprimenyonnoj funkcii Vyzov po prednamechennosti Osnovnaya statya Prednamechennosti i obeshaniya Vyzov po prednamechennosti angl call by future ili parallelnyj vyzov po imeni parallel call by name eto parallelnaya strategiya vychisleniya znacheniya prednamechennyh vyrazhenij future expressions vychislyayutsya parallelno s techeniem ostalnoj programmy V mestah gde trebuetsya znachenie prednamechennosti osnovnaya programma blokiruetsya do zaversheniya vychisleniya esli ono eshyo ne bylo zaversheno k etomu momentu Eta strategiya yavlyaetsya nedeterminirovannoj tak kak vychisleniya mogut proizvoditsya v lyuboe vremya mezhdu momentom sozdaniya prednamechennosti gde zadayotsya vyrazhenie i momentom gde eyo znachenie ispolzuetsya Ona pohozha na vyzov po neobhodimosti v tom chto znachenie vychislyaetsya lish edinozhdy i vychislenie mozhet byt otlozheno do momenta kogda eto znachenie dejstvitelno trebuetsya no mozhet nachatsya ranshe Bolee togo esli znachenie prednamechennosti uzhe ne trebuetsya naprimer vychislyalas lokalnaya peremennaya v tele funkcii i funkciya zavershilas vychislenie mozhet byt prervano Esli prednamechennosti realizovany posredstvom processov i potokov to sozdanie prednamechennosti v kode porozhdaet novyj process ili potok dostup k znacheniyu sinhroniziruet ego s glavnym potokom a zavershenie vychisleniya prednamechennosti oznachaet ubijstvo processa vychislyavshego ego znachenie Optimistichnye vychisleniya Optimistichnye vychisleniya angl Optimistic evaluation eto drugoj variant vyzova po neobhodimosti pri kotorom argument funkcii chastichno vychislyaetsya za nekotoryj otvedyonnyj promezhutok vremeni kotoryj mozhno nastraivat vo vremya ispolneniya programmy posle chego vychisleniya preryvayutsya i funkciya primenyaetsya s ispolzovaniem vyzova po neobhodimosti Takoj podhod snizhaet vremenny e zaderzhki prisushie lenivym vychisleniyam obespechivaya te zhe harakteristiki produkta Sm takzhe angl Lyambda ischislenie Parametr programmirovanie angl PrimechaniyaEssentials of Programming Languages by Daniel P Friedman and Mitchell Wand MIT Press 1989 2006 Lambda Calculus neopr Cs uiowa edu Data obrasheniya 29 maya 2014 Arhivirovano iz originala 14 dekabrya 2010 goda applicative order reduction definition of applicative order reduction in the Free Online Encyclopedia neopr Encyclopedia2 thefreedictionary com Harold Abelson and Gerald Jay Sussman with Julie Sussman 1 1 5 The Substitution Model for Procedure Application Structure and Interpretation of Computer Programs second edition Cambridge Massachusetts London England The MIT Press 1996 Barbara Liskov Russ Atkinson Toby Bloom Eliot Moss Craig Schaffert Craig Scheifler Alan Snyder CLU Reference Manual angl Laboratory for Computer Science Massachusetts Institute of Technology 1979 Data obrasheniya 29 maya 2014 Arhivirovano iz originala 22 sentyabrya 2006 goda Fredrik Lundh Call By Object angl effbot org Data obrasheniya 29 maya 2014 Arhivirovano iz originala 23 noyabrya 2019 goda Iota Language Definition neopr CS 412 413 Introduction to Compilers Cornell University 2001 Data obrasheniya 29 maya 2014 Arhivirovano 23 sentyabrya 2015 goda CA1021 Avoid out parameters neopr Data obrasheniya 29 maya 2014 Arhivirovano 5 oktyabrya 2013 goda V otlichie ot Si v Python zapisi l x i l l x ne yavlyayutsya ekvivalentnymi pervoe semanticheski yavlyaetsya izmeneniem a ne prisvaivaniem Bolee togo l x ne yavlyaetsya sintaksicheskim ekvivalentom l extend x iz za pravil razresheniya vidimosti l x trebuet chtoby l byl v lokalnoj oblasti togda kak l extend x ishet takzhe i v ohvatyvayushih SsylkiHarold Abelson Dzherald Dzhej Sassman Dzhuli Sassman Struktura i interpretaciya kompyuternyh programm Clem Baker Finch David King Jon Hall Phil Trinder An Operational Semantics for Parallel Call by Need Research report Faculty of Mathematics amp Computing The Open University 1999 03 10 Vyp 1 99 Robert Ennals Simon Peyton Jones Optimistic Evaluation a fast evaluation strategy for non strict programs ACM Press 2003 Vyp International Conference on Functional Programming Bertram Ludascher CSE 130 lecture notes angl CSE 130 Programming Languages Principles amp Paradigms 24 yanvarya 2001 Benjamin C Pierce Types and Programming Languages MIT Press 2002 ISBN 978 0 262 16209 8 Peter Sestoft The essence of computation complexity analysis trnasformation essays dedicated to Neil D Jones Springer Verlag 2002 S 420 435 Demonstrating Lambda Calculus Reduction ISBN 3 540 00326 6 Arhivnaya kopiya ot 21 iyunya 2006 na Wayback Machine

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто