<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BB</id>
	<title>Рефал - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BB"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BB&amp;action=history"/>
	<updated>2026-07-16T16:44:00Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BB&amp;diff=17236&amp;oldid=prev</id>
		<title>imported&gt;Lê Lợi (bot): Автодевикификация Шаблон:Языки программирования.</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BB&amp;diff=17236&amp;oldid=prev"/>
		<updated>2025-12-03T11:42:25Z</updated>

		<summary type="html">&lt;p&gt;Автодевикификация &lt;a href=&quot;/mediawiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%AF%D0%B7%D1%8B%D0%BA%D0%B8_%D0%BF%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%D1%8F&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Шаблон:Языки программирования (страница не существует)&quot;&gt;Шаблон:Языки программирования&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Парадигмы программирования}}&lt;br /&gt;
{{Карточка языка программирования&lt;br /&gt;
|name = Рефал&lt;br /&gt;
|semantics = [[функциональное программирование|функциональный]] / [[сентенциальное программирование|сентенциальный]]&lt;br /&gt;
|class= зависит от реализации&lt;br /&gt;
|year = 1966&lt;br /&gt;
|designer = [[Турчин, Валентин Фёдорович|Валентин Турчин]]&lt;br /&gt;
|typing = [[Система типов#Типизированные и бестиповые языки|бестиповый]]&lt;br /&gt;
|implementations = &lt;br /&gt;
|dialects = РЕФАЛ-2, РЕФАЛ-5, РЕФАЛ+, РЕФАЛ-0&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Рефал&amp;#039;&amp;#039;&amp;#039; (акроним от слов «рекурсивных функций алгоритмический») — один из старейших [[функциональное программирование|функциональных языков программирования]], ориентированный на [[символьные вычисления]]: обработку символьных строк (например, алгебраические выкладки); перевод с одного языка (искусственного или естественного) на другой; решение проблем, связанных с [[искусственный интеллект|искусственным интеллектом]]. Соединяет в себе математическую простоту с практической направленностью на написание больших и сложных программ.&lt;br /&gt;
&lt;br /&gt;
Отличительной чертой языка является использование [[сопоставление с образцом|сопоставления с образцом]] и [[Переписывание|переписывания термов]] как основного способа определения функций.&lt;br /&gt;
&lt;br /&gt;
== Основные принципы ==&lt;br /&gt;
Программа на Рефале может состоять из одного или нескольких модулей (файлов), каждый из которых, в свою очередь, состоит из &amp;#039;&amp;#039;функций&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Рефал-функция — упорядоченный набор предложений, состоящих из образца и шаблона. На вход функции подаётся некоторое выражение; вычисление функции состоит в сопоставлении выражения поочерёдно образцам, взятым из первого, второго и дальнейших предложений. Если очередное сопоставление проходит успешно, то на основании шаблона, взятого из того же предложения, формируется новое рефал-выражение, которое и будет результатом функции. В случае, если ни с одним из имеющихся образцов аргумент функции сопоставить не удалось (неуспех), фиксируется ошибка (аварийно завершается вся программа). Во избежание этого часто в конце функции помещают предложение, с образцом которого можно сопоставить вообще произвольное выражение. В некоторых современных реализациях Рефала (например, Рефал+) неуспех любого выражения функции вместо ошибки порождает неуспех самой функции.&lt;br /&gt;
&lt;br /&gt;
Выражения языка Рефал представляют собой последовательности термов, в качестве которых могут выступать:&lt;br /&gt;
* обыкновенные символы (буквы, цифры, некоторые спецсимволы), которые в зависимости от диалекта требуется или не требуется заключать в апострофы или кавычки;&lt;br /&gt;
* символы-метки (идентификаторы, конкретная запись которых варьируется в зависимости от диалекта языка; так, в Рефале-5 идентификатором может служить произвольная последовательность латинских букв и цифр, начинающаяся с буквы);&lt;br /&gt;
* макроцифры — цифровая запись неотрицательных целых чисел, не превышающих предельное значение;&lt;br /&gt;
* числа с плавающей точкой;&lt;br /&gt;
* рефал-переменные одного из нескольких предопределённых типов;&lt;br /&gt;
* произвольное выражение, заключённое в круглые скобки (в документации по Рефалу такой терм называется выражением в структурных скобках);&lt;br /&gt;
* произвольное выражение, заключённое в «угловые» скобки и означающее вызов функции (такой терм называется активным выражением).&lt;br /&gt;
&lt;br /&gt;
В зависимости от ситуации на выражение могут быть наложены ограничения; так, в образцах запрещено использовать выражения, содержащие угловые скобки, а в «поле зрения» рефал-машины не могут присутствовать переменные.&lt;br /&gt;
&lt;br /&gt;
Рефал-переменные используются в образцах и в зависимости от своего типа могут сопоставляться одному символу (то есть любому терму, кроме выражения в структурных скобках), одному терму (произвольному), либо произвольному выражению (то есть последовательности термов произвольной длины). Соответствующие типы переменных называются S-переменными, T-переменными и E-переменными. В диалекте Рефал-2 поддерживались ещё и V-переменные, сопоставляемые произвольному непустому выражению; в современных диалектах такие переменные не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
Семантика Рефала описывается в терминах [[виртуальная машина|виртуальной машины]], называемой «рефал-машина» или «рефал-автомат». Машина имеет «поле зрения», в котором может находиться произвольное рефал-выражение, не содержащее рефал-переменных.&lt;br /&gt;
&lt;br /&gt;
Выполнение программы состоит из шагов рефал-автомата, на каждом из которых выполняется применение функции к выражению. Для этого рефал-машина отыскивает в своём поле зрения самое левое из самых внутренних активных выражений; иначе говоря, отыскиваются парные угловые скобки, не содержащие других угловых скобок, а если таких пар имеется несколько, выбирается та из них, которая текстуально в поле зрения находится левее остальных. Первый терм выражения, заключённого в угловые скобки, должен представлять собой символ-метку, служащую именем функции; оставшаяся часть выражения используется как аргумент функции.&lt;br /&gt;
&lt;br /&gt;
Среди предложений, составляющих функцию, находится первое такое, образец которого можно сопоставить с аргументом функции; в ходе сопоставления приписываются значения переменным, содержащимся в образце. Затем шаблон, взятый из того же предложения, берётся за основу для формирования результата вычисления функции; попросту говоря, результатом объявляется выражение, полученное из шаблона заменой переменных на их значения. Шаблон может содержать только переменные, имеющиеся в образце; таким образом, все переменные, входящие в шаблон, окажутся при формировании результата заменены на соответствующие выражения, и результат уже содержать переменные не будет. С другой стороны, шаблон вполне может содержать выражения в угловых скобках.&lt;br /&gt;
&lt;br /&gt;
В завершение шага рефал-автомат заменяет в своём поле зрения только что вычисленное активное выражение (включая ограничивающие его угловые скобки) на полученный в ходе вычисления функции результат. Количество угловых скобок, находящихся в поле зрения рефал-машины, может при этом возрасти.&lt;br /&gt;
&lt;br /&gt;
Выполнение программы заканчивается, когда в поле зрения рефал-машины не окажется больше угловых скобок. Выражение, содержащееся в этот момент в поле зрения, объявляется &amp;#039;&amp;#039;результатом&amp;#039;&amp;#039; выполнения рефал-программы.&lt;br /&gt;
&lt;br /&gt;
== Пример исполнения ==&lt;br /&gt;
Функция:&lt;br /&gt;
  Palindrom {&lt;br /&gt;
      s.1 e.2 s.1 = &amp;lt;Palindrom e.2&amp;gt;;&lt;br /&gt;
      s.1 = True;&lt;br /&gt;
      /* пусто */ = True;&lt;br /&gt;
      e.1 = False;&lt;br /&gt;
  }&lt;br /&gt;
анализирует выражение и возвращает в качестве результата символ-метку &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt;, если выражение является палиндромом, и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; в противном случае. Функция имеет имя &amp;lt;code&amp;gt;Palindrom&amp;lt;/code&amp;gt;. Поясним, что &amp;lt;code&amp;gt;s.1&amp;lt;/code&amp;gt; — это переменная S-типа, &amp;lt;code&amp;gt;e.1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;e.2&amp;lt;/code&amp;gt; — переменные E-типа. Таким образом, тело функции состоит из четырёх предложений, первое из которых сработает, если аргумент функции представляет собой выражение, начинающееся и заканчивающееся одним и тем же символом; второе будет использоваться, если аргумент состоит ровно из одного символа; третье задействуется для пустого аргумента и, наконец, четвёртое подойдёт для всех остальных случаев.&lt;br /&gt;
&lt;br /&gt;
Шаблон в первом предложении содержит активное выражение, представляющее собой рекурсивный вызов функции &amp;lt;code&amp;gt;Palindrom&amp;lt;/code&amp;gt;. Это отражает тот факт, что, если первый и последний символы совпали, их можно отбросить и проверить на палиндромичность остаток выражения.&lt;br /&gt;
&lt;br /&gt;
Пусть в поле зрения рефал-автомата оказалось следующее активное выражение:&lt;br /&gt;
  &amp;lt;Palindrom &amp;#039;abcba&amp;#039;&amp;gt;&lt;br /&gt;
Тогда выполнение будет состоять из трёх шагов, после которых в поле зрения будут находиться следующие выражения:&lt;br /&gt;
  &amp;lt;Palindrom &amp;#039;bcb&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;Palindrom &amp;#039;c&amp;#039;&amp;gt;&lt;br /&gt;
  True&lt;br /&gt;
На первых двух шагах использовалось первое предложение, на последнем шаге — второе. Поскольку после третьего шага поле зрения больше не содержит угловых скобок, работа рефал-автомата на этом завершается.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
Первая версия языка была создана в [[1966 год]]у [[Турчин, Валентин Фёдорович|Валентином Турчиным]] в качестве [[метаязык]]а для описания семантики других языков. Впоследствии, в результате появления достаточно эффективных реализаций на ЭВМ, он стал находить практическое использование в качестве языка программирования{{Нет АИ|20|6|2015}}.&lt;br /&gt;
&lt;br /&gt;
В настоящее время основными диалектами языка являются РЕФАЛ-2 ([[1970-е]]), РЕФАЛ-5 ([[1985]]) и РЕФАЛ+ ([[1990]]), отличающиеся друг от друга деталями синтаксиса и набором «дополнительных средств», расширяющих первоначальный вариант.&lt;br /&gt;
&lt;br /&gt;
== Примеры программ ==&lt;br /&gt;
Следующая программа на диалекте Рефал-5 обращает и печатает подаваемую на вход строку данных:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ENTRY Go&lt;br /&gt;
{&lt;br /&gt;
     = &amp;lt;Prout &amp;lt;Reverse &amp;lt;Card&amp;gt;&amp;gt;&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Reverse&lt;br /&gt;
{&lt;br /&gt;
     e.Text = &amp;lt;DoReverse () e.Text&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DoReverse&lt;br /&gt;
{&lt;br /&gt;
     (e.Scanned) = e.Scanned;&lt;br /&gt;
     (e.Scanned) s.Next e.Tail = &amp;lt;DoReverse (s.Next e.Scanned) e.Tail&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эту же программу можно записать иначе:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ENTRY Go&lt;br /&gt;
{&lt;br /&gt;
     = &amp;lt;Prout &amp;lt;Reverse &amp;lt;Card&amp;gt;&amp;gt;&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Reverse&lt;br /&gt;
{&lt;br /&gt;
     /* Если строка не пустая, то переносим первый символ в конец */&lt;br /&gt;
     s.First e.Tail = &amp;lt;Reverse e.Tail&amp;gt; s.First;&lt;br /&gt;
&lt;br /&gt;
     /* Обработка пустой строки */&lt;br /&gt;
     /* пусто */ = /* пусто */;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующая программа на диалекте Рефал-5 получает на входе строку данных, представляющую собой десятичное представление некоторого натурального числа N, после чего вычисляет и печатает [[Числа Фибоначчи|число Фибоначчи]] с номером N:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ENTRY Go&lt;br /&gt;
{&lt;br /&gt;
     = &amp;lt;Prout &amp;lt;Symb &amp;lt;FN &amp;lt;Numb &amp;lt;Card&amp;gt;&amp;gt;&amp;gt;&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
FN&lt;br /&gt;
{&lt;br /&gt;
     /* Вызов вспомогательной функции, реализующей остаточно-рекурсивный цикл. */&lt;br /&gt;
     s.Number = &amp;lt;DoFN s.Number 0 1&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  Функция реализует остаточно-рекурсивный цикл.&lt;br /&gt;
  Инвариант цикла &amp;lt;DoFN s.Counter s.Current s.Next&amp;gt;&lt;br /&gt;
  s.Counter -- число оставшихся итераций.&lt;br /&gt;
  s.Current -- число Фибоначчи, соответствующее текущей итерации.&lt;br /&gt;
  s.Next -- значение числа Фибоначчи на следующией итерации.&lt;br /&gt;
*/&lt;br /&gt;
DoFN&lt;br /&gt;
{&lt;br /&gt;
     0 s.Current s.Next = s.Current;&lt;br /&gt;
     s.Counter s.Current s.Next =&lt;br /&gt;
          &amp;lt;DoFN &amp;lt;Sub s.Counter 1&amp;gt; s.Next &amp;lt;Add s.Current s.Next&amp;gt;&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* &amp;#039;&amp;#039;Турчин В. Ф.&amp;#039;&amp;#039; Алгоритмический язык рекурсивных функций (РЕФАЛ). — М.: [[ИПМ АН]] СССР, 1968.&lt;br /&gt;
* &amp;#039;&amp;#039;Романенко С. А., Турчин В. Ф.&amp;#039;&amp;#039; РЕФАЛ-компилятор // Труды 2-й Всесоюзной конференции по программированию. — Новосибирск: ВЦ СО АН, 1970.&lt;br /&gt;
* &amp;#039;&amp;#039;Романенко С. А.&amp;#039;&amp;#039; Реализация Рефала-2. — М.: ИПМ АН СССР, 1987.&lt;br /&gt;
* {{статья&lt;br /&gt;
| автор         = Смирнов В. К.&lt;br /&gt;
| заглавие      = Аппаратная реализация языка Рефал в ИПМ им.М.В.Келдыша&lt;br /&gt;
| ссылка        = http://library.keldysh.ru/preprint.asp?id=2003-99&lt;br /&gt;
| язык          = ru&lt;br /&gt;
| издание       = Препринты ИПМ им. М. В. Келдыша&lt;br /&gt;
| тип           = &lt;br /&gt;
| год           = 2003&lt;br /&gt;
| номер         = 99&lt;br /&gt;
| страницы      = 1—21&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор         = Гурин Р. Ф., Романенко С. А.&lt;br /&gt;
|заглавие      = Язык программирования Рефал Плюс&lt;br /&gt;
|ответственный = &lt;br /&gt;
|ссылка        = &lt;br /&gt;
|место         = Переславль &lt;br /&gt;
|издательство  = Университет города Переславля&lt;br /&gt;
|год           = 2006&lt;br /&gt;
|том           = &lt;br /&gt;
|страниц       = 13&lt;br /&gt;
|страницы      = &lt;br /&gt;
|isbn          = 5-901795-08-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.refal.net/ Сайт Рефал-сообщества]&lt;br /&gt;
* [http://www.refal.ru/ Содружество «РЕФАЛ/Суперкомпиляция»]&lt;br /&gt;
* [http://wiki.botik.ru/Refaldevel/ wiki-сайт, посвящённый развитию языка]&lt;br /&gt;
* [https://web.archive.org/web/20101009092138/http://ulm.uni.udm.ru/~soft/wiki/doku.php?id=refal-5:korsa Самостоятельное изучение Рефала-5. Взгляд студента]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Языки сентенциального программирования]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Lê Lợi (bot)</name></author>
	</entry>
</feed>