<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF161%3AErlang</id>
		<title>LXF161:Erlang - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF161%3AErlang"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;action=history"/>
		<updated>2026-05-13T17:49:47Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;diff=18492&amp;oldid=prev</id>
		<title>Olkol: /* Erlang: О поль­зе биб­лио­тек */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;diff=18492&amp;oldid=prev"/>
				<updated>2018-10-06T15:15:53Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Erlang: О поль­зе биб­лио­тек&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 15:15, 6 октября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вернем­ся немно­го на­зад и обсудим хранение со­стояния ме­ж­ду вы­зо­ва­ми функ­ций. Од­но из основ­ных по­ло­жений функ­цио­наль­но­го про­грам­ми­ро­вания – то, что ре­зуль­тат вы­полнения лю­бой функ­ции за­ви­сит толь­ко от ее ар­гу­мен­тов. Пе­ре­дав одни и те же ар­гу­мен­ты несколь­ко раз, мы долж­ны по­лу­чить один и тот же ре­зуль­тат. А зна­чит, функ­ция не долж­на помнить ка­кое-ли­бо со­стояние ме­ж­ду ее вы­зо­ва­ми. Что де­лать, ес­ли неко­то­рое со­стояние ме­ж­ду вы­зо­ва­ми функ­ции все же необ­хо­ди­мо хранить? От­вет оче­ви­ден: пе­ре­ло­жить от­вет­ст­вен­ность по хранению со­стояния на вы­зы­ваю­щую сто­ро­ну и пе­ре­да­вать со­стояние в функ­цию как од­ин из ар­гу­мен­тов. Ос­нов­ной строи­тель­ной единицей мно­го­за­дач­ных при­ло­жений в язы­ке Erlang яв­ля­ют­ся про­цес­сы. «Серд­це» про­цес­са Erlang – обыч­но цикл об­ра­бот­ки со­об­щений, пред­став­ляющий со­бой функ­цию – об­ра­бот­чик со­об­щений. Эта функ­ция вы­зы­ва­ет са­ма се­бя (это един­ст­вен­ный спо­соб в язы­ке Erlang соз­дать конеч­ный или бес­конеч­ный цикл) при по­мо­щи хво­сто­вой ре­кур­сии. Со­от­вет­ст­вен­но, в та­ком слу­чае цикл – об­ра­бот­чик со­об­щений бу­дет и вы­зы­ваю­щей, и вы­зы­вае­мой сто­ро­на­ми, и за пе­ре­да­чу со­стояния бу­дет от­вет­ст­вен­на функ­ция-об­ра­бот­чик. Ес­те­ст­вен­но, что при соз­дании про­цес­са и пер­вом вы­зо­ве функ­ции-об­ра­бот­чи­ка со­об­щений (про­из­ве­денного из­вне), от­вет­ст­вен­ность за пе­ре­да­чу на­чаль­но­го со­стояния ле­жит на сто­роне, соз­даю­щей про­цесс.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вернем­ся немно­го на­зад и обсудим хранение со­стояния ме­ж­ду вы­зо­ва­ми функ­ций. Од­но из основ­ных по­ло­жений функ­цио­наль­но­го про­грам­ми­ро­вания – то, что ре­зуль­тат вы­полнения лю­бой функ­ции за­ви­сит толь­ко от ее ар­гу­мен­тов. Пе­ре­дав одни и те же ар­гу­мен­ты несколь­ко раз, мы долж­ны по­лу­чить один и тот же ре­зуль­тат. А зна­чит, функ­ция не долж­на помнить ка­кое-ли­бо со­стояние ме­ж­ду ее вы­зо­ва­ми. Что де­лать, ес­ли неко­то­рое со­стояние ме­ж­ду вы­зо­ва­ми функ­ции все же необ­хо­ди­мо хранить? От­вет оче­ви­ден: пе­ре­ло­жить от­вет­ст­вен­ность по хранению со­стояния на вы­зы­ваю­щую сто­ро­ну и пе­ре­да­вать со­стояние в функ­цию как од­ин из ар­гу­мен­тов. Ос­нов­ной строи­тель­ной единицей мно­го­за­дач­ных при­ло­жений в язы­ке Erlang яв­ля­ют­ся про­цес­сы. «Серд­це» про­цес­са Erlang – обыч­но цикл об­ра­бот­ки со­об­щений, пред­став­ляющий со­бой функ­цию – об­ра­бот­чик со­об­щений. Эта функ­ция вы­зы­ва­ет са­ма се­бя (это един­ст­вен­ный спо­соб в язы­ке Erlang соз­дать конеч­ный или бес­конеч­ный цикл) при по­мо­щи хво­сто­вой ре­кур­сии. Со­от­вет­ст­вен­но, в та­ком слу­чае цикл – об­ра­бот­чик со­об­щений бу­дет и вы­зы­ваю­щей, и вы­зы­вае­мой сто­ро­на­ми, и за пе­ре­да­чу со­стояния бу­дет от­вет­ст­вен­на функ­ция-об­ра­бот­чик. Ес­те­ст­вен­но, что при соз­дании про­цес­са и пер­вом вы­зо­ве функ­ции-об­ра­бот­чи­ка со­об­щений (про­из­ве­денного из­вне), от­вет­ст­вен­ность за пе­ре­да­чу на­чаль­но­го со­стояния ле­жит на сто­роне, соз­даю­щей про­цесс.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Функ­ции, ис­поль­зую­щие со­стояние |Ширина=40%|Содержание= &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Функ­ции, ис­поль­зую­щие со­стояние |Ширина=40%|Содержание= &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;При­ме­ром функ­ций, ис­поль­зую­щих со­стояние, со­хранен­ное ме­ж­ду их вы­зо­ва­ми вы­зы­ваю­щей сто­ро­ной, яв­ля­ют­ся функ­ции для рас­че­та зна­чения хэ­ша MD5 (оп­ре­де­лен­ные в мо­ду­ле erlang). Функ­ция erlang:md5_init() инициа­ли­зи­ру­ет со­стояние, на­зы­вае­мое кон­тек­стом Context, и воз­вра­ща­ет его.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;При­ме­ром функ­ций, ис­поль­зую­щих со­стояние, со­хранен­ное ме­ж­ду их вы­зо­ва­ми вы­зы­ваю­щей сто­ро­ной, яв­ля­ют­ся функ­ции для рас­че­та зна­чения хэ­ша MD5 (оп­ре­де­лен­ные в мо­ду­ле erlang). Функ­ция erlang:md5_init() инициа­ли­зи­ру­ет со­стояние, на­зы­вае­мое кон­тек­стом Context, и воз­вра­ща­ет его.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Функ­ция erlang:md5_update(Context, Data) принима­ет в ка­че­­ст­ве ар­гу­мен­тов ста­рое со­стояние Context и оче­ред­ную пор­цию дан­ных Data, и воз­вра­ща­ет об­нов­лен­ное со­стояние. Функ­ция erlang:md5_final(Context) принима­ет со­стояние Context и воз­вра­ща­ет зна­чение хэ­ша MD5.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Функ­ция erlang:md5_update(Context, Data) принима­ет в ка­че­­ст­ве ар­гу­мен­тов ста­рое со­стояние Context и оче­ред­ную пор­цию дан­ных Data, и воз­вра­ща­ет об­нов­лен­ное со­стояние. Функ­ция erlang:md5_final(Context) принима­ет со­стояние Context и воз­вра­ща­ет зна­чение хэ­ша MD5.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Описанный под­ход к хранению со­стояния яв­ля­ет­ся стро­го функ­цио­наль­ным. Сре­да вы­полнения Erlang со­дер­жит и дру­гой под­ход к хранению со­стояния: это ис­поль­зо­вание па­мя­ти, при­дан­ной про­цес­су. С ка­ж­дым про­цес­сом свя­зан некий объ­ем па­мя­ти в ви­де из­ме­няе­мо­го сло­ва­ря; доступ к этой па­мя­ти име­ет толь­ко код, вы­пол­няе­мый про­цес­сом. Ес­ли два раз­ных про­цес­са вы­пол­ня­ют один и тот же код, ко­то­рый об­ра­ща­ет­ся к па­мя­ти, свя­зан­ной с про­цес­сом, то этот код бу­дет об­ра­щать­ся к раз­ным об­лас­тям па­мя­ти, в за­ви­си­мо­сти от то­го, ка­кой из про­цес­сов его вы­пол­ня­ет. Для ра­бо­ты с такой па­мя­тью в язы­ке Erlang оп­ре­де­лен це­лый ряд функ­ций (а точ­нее, BIF). Со­хранить неко­то­рое зна­чение Value и ас­со­ции­ро­ван­ный с ним ключ Key (при по­мо­щи ко­то­ро­го бу­дет осу­ще­ст­в­лять­ся доступ к это­му зна­чению в дальней­шем) мож­но при по­мо­щи функ­ции put(Key, Value). Ес­ли с дан­ным клю­чом уже бы­ло ас­со­ции­ро­ва­но ка­кое-ли­бо зна­чение, оно бу­дет воз­вра­щае­мым зна­чением функ­ции put/2 (ина­че воз­вра­щае­мым зна­чением бу­дет атом undefined). Для по­лу­чения зна­чения Value по клю­чу Key слу­жит функ­ция get(Key), ко­то­рая воз­вра­ща­ет ли­бо зна­чение Value, ас­со­ции­ро­ван­ное с клю­чом Key, ли­бо атом undefined. Мы мо­жем по­лу­чить все дан­ные сра­зу, в ви­де пар ключ – зна­чение: для это­го слу­жит функ­ция get/0. По­ми­мо это­го, мо­жно по­лу­чить спи­сок всех клю­чей, ас­со­ции­ро­ван­ных со зна­чением Value, при по­мо­щи функ­ции get_keys(Value). И, на­конец, что­бы уда­лить неко­то­рое зна­чение по клю­чу (и ас­со­ции­ро­ван­ный с ним ключ), ис­поль­зу­ет­ся функ­ция erase(Key); что­бы пол­но­стью очи­стить па­мять, свя­зан­ную с про­цес­сом – функ­ция erase/0.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Описанный под­ход к хранению со­стояния яв­ля­ет­ся стро­го функ­цио­наль­ным. Сре­да вы­полнения Erlang со­дер­жит и дру­гой под­ход к хранению со­стояния: это ис­поль­зо­вание па­мя­ти, при­дан­ной про­цес­су. С ка­ж­дым про­цес­сом свя­зан некий объ­ем па­мя­ти в ви­де из­ме­няе­мо­го сло­ва­ря; доступ к этой па­мя­ти име­ет толь­ко код, вы­пол­няе­мый про­цес­сом. Ес­ли два раз­ных про­цес­са вы­пол­ня­ют один и тот же код, ко­то­рый об­ра­ща­ет­ся к па­мя­ти, свя­зан­ной с про­цес­сом, то этот код бу­дет об­ра­щать­ся к раз­ным об­лас­тям па­мя­ти, в за­ви­си­мо­сти от то­го, ка­кой из про­цес­сов его вы­пол­ня­ет. Для ра­бо­ты с такой па­мя­тью в язы­ке Erlang оп­ре­де­лен це­лый ряд функ­ций (а точ­нее, BIF). Со­хранить неко­то­рое зна­чение Value и ас­со­ции­ро­ван­ный с ним ключ Key (при по­мо­щи ко­то­ро­го бу­дет осу­ще­ст­в­лять­ся доступ к это­му зна­чению в дальней­шем) мож­но при по­мо­щи функ­ции put(Key, Value). Ес­ли с дан­ным клю­чом уже бы­ло ас­со­ции­ро­ва­но ка­кое-ли­бо зна­чение, оно бу­дет воз­вра­щае­мым зна­чением функ­ции put/2 (ина­че воз­вра­щае­мым зна­чением бу­дет атом undefined). Для по­лу­чения зна­чения Value по клю­чу Key слу­жит функ­ция get(Key), ко­то­рая воз­вра­ща­ет ли­бо зна­чение Value, ас­со­ции­ро­ван­ное с клю­чом Key, ли­бо атом undefined. Мы мо­жем по­лу­чить все дан­ные сра­зу, в ви­де пар ключ – зна­чение: для это­го слу­жит функ­ция get/0. По­ми­мо это­го, мо­жно по­лу­чить спи­сок всех клю­чей, ас­со­ции­ро­ван­ных со зна­чением Value, при по­мо­щи функ­ции get_keys(Value). И, на­конец, что­бы уда­лить неко­то­рое зна­чение по клю­чу (и ас­со­ции­ро­ван­ный с ним ключ), ис­поль­зу­ет­ся функ­ция erase(Key); что­бы пол­но­стью очи­стить па­мять, свя­зан­ную с про­цес­сом – функ­ция erase/0.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;diff=18434&amp;oldid=prev</id>
		<title>Olkol: Новая страница: « Категория: Учебники    Категория: Программирование  '''Erlang Описывается следующей фор…»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;diff=18434&amp;oldid=prev"/>
				<updated>2018-10-06T01:29:58Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: « &lt;a href=&quot;/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8&quot; title=&quot;Категория:Учебники&quot;&gt;Категория: Учебники&lt;/a&gt;    &lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Программирование (страница не существует)&quot;&gt;Категория: Программирование&lt;/a&gt;  &amp;#039;&amp;#039;&amp;#039;Erlang Описывается следующей фор…»&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF161:Erlang&amp;amp;diff=18434&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	</feed>