<?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=ML</id>
	<title>ML - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=ML"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=ML&amp;action=history"/>
	<updated>2026-07-16T05:19:32Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=ML&amp;diff=8877&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=ML&amp;diff=8877&amp;oldid=prev"/>
		<updated>2025-12-03T11:41:10Z</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 = ML &lt;br /&gt;
| semantics =  [[Мультипарадигменный язык программирования|мультипарадигменный]]: [[Функциональное программирование|функциональный]], [[Императивное программирование|императивный]], [[модульное программирование|модульный]]&lt;br /&gt;
| year = 1973 &lt;br /&gt;
| designer = [[Робин Милнер]] и др. - [[Эдинбургский университет]] &lt;br /&gt;
| typing = [[Сильная и слабая типизация|сильная]], [[статическая типизация|статическая]], [[вывод типов|выводная]]&lt;br /&gt;
| dialects = [[Standard ML]], [[Caml Light]], [[OCaml]], [[F Sharp|F#]]&amp;lt;ref&amp;gt;[http://c2.com/cgi/wiki?MlLanguage Ml Language] {{Wayback|url=http://c2.com/cgi/wiki?MlLanguage |date=20151010043558 }}, c2.com&amp;lt;/ref&amp;gt;, [[LazyML]]&lt;br /&gt;
| influenced = [[Миранда (язык программирования)|Miranda]], [[Haskell]], [[Cyclone (язык программирования)|Cyclone]], [[Nemerle]], [[C++]]&lt;br /&gt;
| influenced by          = [[ISWIM]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ML&amp;#039;&amp;#039;&amp;#039; (Meta Language) — семейство [[Строгие вычисления|строгих]] [[язык функционального программирования|языков функционального программирования]] с развитой [[параметрический полиморфизм|параметрически полиморфной]] [[система типов|системой типов]] и параметризуемыми модулями. Подобная система типов была раньше предложена [[Хиндли, Роджер|Роджером Хиндли]] в [[1969 год]]у и сейчас часто называется [[Система типов Хиндли — Милнера|системой Хиндли-Милнера]]. Языки данного семейства в большинстве своём не являются [[чистота языка программирования|чистыми]] функциональными языками, так как включают и императивные инструкции (но есть исключения — например, [[Standard ML#Manticore|Manticore]]). ML преподаётся во многих западных университетах (в некоторых даже как первый язык программирования).&lt;br /&gt;
&lt;br /&gt;
== Предпосылки и история языка==&lt;br /&gt;
В [[1963 год]]у [[Джон Алан Робинсон]] реализовал метод автоматического доказательства теорем, получивший название «[[принцип резолюции]]». Идея этого метода принадлежит [[Эрбран, Жак|Эрбрану]]; она была предложена в [[1930 год]]у. Робинсон разработал эффективный с вычислительной точки зрения [[алгоритм унификации]], являющийся основой метода. &lt;br /&gt;
&lt;br /&gt;
В 1969 году [[Дана Скотт]] распространил меморандум, официально не опубликованный до  1993 года&amp;lt;ref&amp;gt;Dana S. Scott. &amp;quot;[https://www.cs.cmu.edu/~kw/scans/scott93tcs.pdf A type-theoretical alternative to ISWIM, CUCH, OWHY] {{Wayback|url=https://www.cs.cmu.edu/~kw/scans/scott93tcs.pdf |date=20201111194155 }}&amp;quot;. &amp;#039;&amp;#039;Theoretical&lt;br /&gt;
Computer Science&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;121&amp;#039;&amp;#039;&amp;#039;:411–440, 1993. Annotated version of the 1969 manuscript.&amp;lt;/ref&amp;gt;. В меморандуме была предложена дедуктивная система Logic for Computable Functions (LCF) - &amp;quot;логика для вычислимых функций&amp;quot;. [[Logic for Computable Functions|Одноименную систему]], предназначенную для автоматизации доказательства теорем, в начале 1970-х годов начали разрабатывать [[Милнер, Робин|Робин Милнер]] и его сотрудники в Стэнфорде и Эдинбурге.&lt;br /&gt;
&lt;br /&gt;
Первая версия языка ML была разработана как внутренний язык этой системы. Как стало понятно пользователям системы, язык хорошо подходил и в качестве языка программирования общего назначения. Это повлекло последующее появление большого числа его реализаций.&lt;br /&gt;
&lt;br /&gt;
== Особенности ==&lt;br /&gt;
В основе строгой и статической системы типов языка лежит [[лямбда-исчисление]], к которому добавлена [[строгая типизация]]. Строгая система типов дает возможности для оптимизации, поэтому вскоре появляется компилятор языка. В системе типов Хиндли-Милнера ограниченно полиморфная система типов, где большинство типов выражений может быть [[вывод типов|выведено автоматически]]. Это даёт возможность программисту не описывать явно типы функций, но сохранить строгий контроль типов.&lt;br /&gt;
&lt;br /&gt;
ML является интерактивным языком. Каждое введённое предложение анализируется, компилируется и исполняется, и значение, полученное в результате исполнения предложения, вместе с его типом выдаётся пользователю. В языке поддерживается обработка исключительных событий.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
Вычисление [[факториал]]а на ML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sml&amp;quot;&amp;gt;&lt;br /&gt;
fun fac(n) = if n = 0 then 1 else n * fac(n-1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хорошим примером, позволяющим оценить [[Выразительность (программирование)|выразительную силу]] ML, служит реализация {{iw|Троичное дерево поиска|троичных деревьев поиска|en|Ternary search tree}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sml&amp;quot;&amp;gt;&lt;br /&gt;
type key = Key.ord_key&lt;br /&gt;
type item = Key.ord_key list&lt;br /&gt;
datatype set = LEAF | NODE of { key: key, lt: set, eq: set, gt: set }&lt;br /&gt;
val empty = LEAF&lt;br /&gt;
exception AlreadyPresent&lt;br /&gt;
&lt;br /&gt;
fun member (_, LEAF) = false&lt;br /&gt;
  | member (h::t, NODE {key,lt,eq,gt}) =&lt;br /&gt;
      (case Key.compare (h, key) of&lt;br /&gt;
            EQUAL   =&amp;gt; member(t, eq)&lt;br /&gt;
          | LESS    =&amp;gt; member(h::t, lt)&lt;br /&gt;
          | GREATER =&amp;gt; member(h::t, gt) )&lt;br /&gt;
  | member ([], NODE {key,lt,eq,gt}) =&lt;br /&gt;
      (case Key.compare (Key.sentinel, key) of&lt;br /&gt;
            EQUAL   =&amp;gt; true&lt;br /&gt;
          | LESS    =&amp;gt; member([], lt)&lt;br /&gt;
          | GREATER =&amp;gt; member([], gt) )&lt;br /&gt;
&lt;br /&gt;
fun insert(h::t, LEAF) = NODE { key=h, eq = insert(t, LEAF), lt=LEAF, gt=LEAF }&lt;br /&gt;
  | insert([], LEAF)   = NODE { key=Key.sentinel, eq=LEAF, lt=LEAF, gt=LEAF }&lt;br /&gt;
  | insert(h::t, NODE {key,lt,eq,gt}) =&lt;br /&gt;
      (case Key.compare (h, key) of&lt;br /&gt;
            EQUAL   =&amp;gt; NODE {key=key, lt=lt, gt=gt, eq=insert(t, eq)}&lt;br /&gt;
          | LESS    =&amp;gt; NODE {key=key, lt=insert(h::t, lt), gt=gt, eq=eq}&lt;br /&gt;
          | GREATER =&amp;gt; NODE {key=key, lt=lt, gt=insert(h::t, gt), eq=eq} )&lt;br /&gt;
  | insert([], NODE {key,lt,eq,gt}) =&lt;br /&gt;
      (case Key.compare (Key.sentinel, key) of&lt;br /&gt;
            EQUAL   =&amp;gt; raise AlreadyPresent&lt;br /&gt;
          | LESS    =&amp;gt; NODE {key=key, lt=insert([], lt), gt=gt, eq=eq}&lt;br /&gt;
          | GREATER =&amp;gt; NODE {key=key, lt=lt, gt=insert([], gt), eq=eq} )&lt;br /&gt;
&lt;br /&gt;
fun add(l, n) = insert(l, n) handle AlreadyPresent =&amp;gt; n&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для задачи поиска строки в словаре {{iw|троичное дерево поиска||en|Ternary search tree}} сочетает молниеносную скорость [[префиксное дерево|префиксных]] деревьев с экономичностью [[двоичное дерево|двоичных]] в отношении памяти. Реализация на ML отличается компактностью и самодокументируемостью за счёт использования [[алгебраический тип данных|алгебраических типов]], [[сопоставление с образцом|сопоставления с образцом]], правила «&amp;#039;&amp;#039;последнее выражение в исполнимой цепочке является результатом всей функции&amp;#039;&amp;#039;» и возможности строить объекты агрегатных типов без предварительных объявлений. Также она отличается [[Типобезопасность|доказанной корректностью]] — в частности, исключением [[Утечка памяти|утечек памяти]], характерных для {{nobr|[[Си (язык программирования)|Си]] / [[C++]]}}; или риска допущения ошибок в исходном коде, приводящих к зацикливанию программы с лавинообразным поглощением памяти, характерных для [[Динамическая типизация|динамически типизируемых]] языков.&lt;br /&gt;
&lt;br /&gt;
[[Система типов Хиндли — Милнера]] обеспечивает языкам высокий потенциал к оптимизации, так что снижение трудоёмкости и повышение стабильности программ является «бесплатным» (без потери эффективности) при условии наличия [[оптимизирующий компилятор|оптимизирующего компилятора]] (таких как [[OCaml]] или [[MLton]]).&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Язык модулей ML]]&lt;br /&gt;
* [[Standard ML]]&lt;br /&gt;
* [[OCaml]]&lt;br /&gt;
* [[Haskell]]&lt;br /&gt;
*[[F Sharp|F#]]&lt;br /&gt;
* [[F*]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://progopedia.ru/language/ml Статья ML] в [[Прогопедия|Прогопедии]] — энциклопедии языков программирования{{ref|ru}}&lt;br /&gt;
* [http://hyperpolyglot.org/ml ML Dialects and Haskell: SML, OCaml, F#, Haskell] — сравнение ряда языков семейства ML&lt;br /&gt;
&lt;br /&gt;
{{перевести|en|ML (programming language)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Языки программирования семейства ML|*]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Lê Lợi (bot)</name></author>
	</entry>
</feed>