1
Fork 0
mirror of https://github.com/thegeneralist01/fphistoryru synced 2026-01-09 22:00:23 +01:00
This commit is contained in:
klapaucius 2025-05-31 23:21:17 +05:00
parent f8ff093d8d
commit 5a993a9fd5
2 changed files with 189 additions and 2 deletions

189
hopes.md
View file

@ -14,6 +14,10 @@
- [Standard ML 83.6](#standard-ml-836)
- [Карделли против Карделли](#карделли-против-карделли)
- [Standard ML 83.11](#standard-ml-8311)
- [Любой принц в Янтаре](#любой-принц-в-янтаре)
- [Столетняя война (40%)](#столетняя-война-40)
- [Standard ML 84.7](#standard-ml-847)
- [Façadisme](#façadisme)
- [Литература](#литература)
@ -523,6 +527,176 @@ let val y = 2 in map (fun x. x + y) [1; 2; 3] end
Третий черновик стандарта вырывается за пределы тесного кружка авторов SML и вращается в несколько более широких кругах подписчиков самиздат-журнала "Полиморфизм". Он опубликован в декабрьском выпуске. Как и обещал Милнер, вместе со статьями описывающими стримы Карделли для ввода-вывода и модули МакКвина. В том же выпуске и руководство пользователя очередной версии компилятора Карделли от 15 ноября 83-го [Card83e]. Теперь предполагается, что период накопления опыта имплементации и использования продлится "год или вроде того". И Карделли не особенно торопится. Конечно, двойные равенства он заменил на одинарные, а `$` на `_`, но менее тривиальные нововведения, вроде декларации каррированных функций несколькими уравнениями Карделли не имплементировал ни в этой "третьей позиции", ни в следующей "четвертой позиции" [Card84b], вышедшей аж пятого апреля 84-го года.
Не известно, насколько полно имплементировал SML экспериментальный компилятор Мэттьюза на основе компилятора Poly, первая версия которого была готова и передана на испытания Полсону в конце 83-го года [Matt89].
### Любой принц в Янтаре
Итак, после того, как Карделли выпустил четыре ежемесячных версии компилятора SML, пятую версию он выпустил уже почти через полгода. И шестую не выпустил никогда. Как вспоминает МакКвин [MacQ14], в 84-ом году усилия Карделли по работе над SML были "разбавлены" работой над "другими проектами" чтоб в 85-ом году "полностью иссякнуть" из-за "других интересов". Что это были за проекты и интересы?
Карделли работал над надежным алгоритмом проверки типов для языка Альбано (Antonio Albano) и Орсини (Renzo Orsini) Galileo [Card85], который планировали имплементировать на основе компилятора VAX ML. Galileo - язык с рекордами и множественным наследованием. И пока Карделли работал над ним, у него появились идеи о том, как его структурные рекорды и варианты из VAX ML можно улучшить [Card84c].
Как мы помним, от структурности типов данных в VAX ML были одни неудобства. Даже если функция обращается только к полям `a` и `b` ее тип не может отражать только этот факт. Функция типа `(|a:int; b:bool|) -> int` не сможет принимать рекорд с полями, которые эта функция не использует. И нет смысла аннотировать значение, созданное конструктором варианта `[|a=3|]` как `[|a:int|]` - его не разобрать в `case`-выражении, которое разбирает и другие конструкторы. Придется объявлять синонимы для структурных типов и использовать их дальше как алгебраические типы из HOPE, только без удобств вроде вывода типов.
И первый шаг к исправлению всех этих проблем Карделли сделал решив, что функция, конечно, должна принимать рекорды с полями, которые она не использует, тип рекорда `(a:a, b:b, c:c)` должен быть подтипом `(a:a, b:b)`, тип любого рекорда - подтип `type any = ()`. И тип варианта `[a:a]` должен быть подтипом варианта `[a:a, b:b]`. Вариант `type nothing = []` - подтип любого типа варианта.
Можно, например, описать тип только для структуры списка
```
type anyList = rec list. [nil: unit, cons: (rest: list)]
```
и функцию, которая обходит его
```
val rec length(l: anyList): int =
if l is nil then 0 else 1 + length(rest l)
```
а потом применять её к списку с "полезной нагрузкой" вроде целых чисел с типом
```
type intList = rec list. [nil: unit, cons: (first: int, rest: list)]
```
Аннотировать типы все равно пока что придется вручную, но может быть имплементатор Edinburgh ML Митчелл что-нибудь придумает [Mitc84].
Обратите внимание на то, что для описания своих идей [Card84c] сначала в отчетах Bell Labs 84-го года, а позднее и в статьях, Карделли использует псевдокод, больше похожий на VAX ML и позаимствовавший у SML некоторые детали, но не уравнения с ПМ как в HOPE или SASL. И естественным образом появляется подозрение, что Карделли переделал свой компилятор ML в компилятор языка уравнений не потому, что его переубедили и научили любить уравнения.
Эти подозрения находят новые подтверждения в новом языке Карделли Amber [Card86], который он разработал и имплементировал в том же 84-ом году для экспериментов со своими рекордами после того, как для них не нашлось места в SML. Amber и его имплементация [Card86b] описаны в отчетах Bell Labs в сентябре 84-го и июне 85-го, которые позднее, в 86-ом году опубликованы как статьи.
```
type IntList =
rec(List) [nil : Unit, cons : {first : Int, rest : List}];
value map =
rec(map: (Int -> Int) -> IntList -> IntList)
fun (f: Int -> Int, list: IntList)
case list of
[cons = c] [cons = {first = f(c.first),
rest = map(f,c.rest)}]
otherwise [nil = unity];
value y = 2;
map(fun(x : Int) x + y,
[cons = {first = 1, rest =
[cons = {first = 2, rest =
[cons = {first = 3, rest =
[nil = unity]}]}]}])
```
Во времена его появления, Amber считался ML-образным, но мы его таковым не считаем. Мы считаем его редким примером языка, который произошел от прото-языка Эдинбургской программы, но утратил один из ключевых признаков - параметрический полиморфизм.
Карделли не против параметрического полиморфизма в принципе, но пока не знает как совмещать его с полиморфизмом через подтипирование. Карделли не считает, что они несовместимы, предполагает, что наработки автора языка Ponder Фейрберна могут помочь решить эту проблему.
К имплементации Amber решение не поспело, но решение Карделли нашел. Тут нам уже надо переходить от рассказа о работах более известного другими работами Карделли как раз к тем другим работам которыми он и известен. И это уже другая история.
Amber - функциональный язык, Карделли пишет об отношениях подтипирования между функциональными типами и об уникальности семейства Galileo/Amber как функциональных языков с полиморфизмом через подтипирование.
Карделли написал компилятор Amber в байткод интерпретатора на основе FAM на Amber [Card86b]. Интерпретатор работал на Macintosh, персональном компьютере с процессором как на рабочих станциях, но с существенно меньшей памятью. Из-за этого ограничения имплементация Amber и была интерпретатором, а не компилятором в нативный код, а сборщик мусора был компактифицирующим, а не копирующим как в VAX ML.
Разработчики Standard ML смогли убедить Карделли начать переделывать свой компилятор в компилятор SML, но продолжал работать над имплементацией языка, отчищенного от интересных для Карделли фич он не долго.
Столетняя война (40%)
---------------------
> Человеческие существа деградируют до состояния животных, когда спорят о конкретном синтаксисе.
> Робин Милнер, Проект стандартного ML (второй черновик) [Miln83b]
> Мы знаем, чем это закончилось.
> Лоуренс Полсон, Воспоминания: от Edinburgh ML до Standard ML [Paul22b]
После убедительной победы стандартных эмелистов над одним из важнейших и, по-видимому, самым успешным на тот момент имплементатором ML их ждали новые победы. С, как выяснилось позднее, еще более важными последствиями.
### Standard ML 84.7
Следующая встреча разрабатывающего SML не-комитета состоялась в Эдинбурге 6-8 июня 84-го года. В ней приняли участие эдинбуржцы Бурсталл, Милнер, Митчелл, Саннелла, Скотт. Бывший эдинбуржец, теперь представляющий Bell Labs МакКвин. Полсон представлял Кембридж, INRIA - Кузино, а Корнелл - Джеймс Хук (James Hook) - новый автор SML второй категории. Не-комитет также рассмотрел комментарии от Майкрофта и Кента Карлссона (Kent Karlsson), который суммировал взгляды неупомянутых эмелистов Гетеборга.
"К сожалению", пишут [MacQ85] МакКвин и Милнер, в очередной встрече комитета не смогли принять участие Карделли, Юэ и Гордон. Но они были представлены своими коллегами.
На встрече обсуждаются планы о написании учебника, возможно на основе руководства к компилятору Карделли, но ориентирующийся как на образец на вышедший в том же году учебник по Scheme - Структура и интерпретация компьютерных программ.
Планируют разобраться с описанием формальной семантики. Может Моссес использует свои наработки.
Согласились, что SML - общественное достояние и кто угодно имеет право его имплементировать.
Решают, что нужна быстрая имплементация, чтоб "убедить мир в жизнеспособности SML". Очень важно, чтоб SML не приобрел репутацию непрактичного, игрушечного языка, пишут МакКвин и Милнер. Конечно, очень некстати, что автор самой быстрой имплементации SML и, скорее всего, самой быстрой имплементации ФЯ на тот момент отвлекся на какие-то свои проекты и утратил интерес к имплементации SML.
Нужно разрабатывать и портируемую систему, что-то вроде Smalltalk 80. Системный образ, который смогут загружать несколько имплементаций одной виртуальных машины на разных платформах. Этим как раз занимаются Митчелл и другие, которые в 83-км году в Эдинбурге переписали форк нативного компилятора Карделли в интерпретатор байт-кода FAM.
Не-комитетчики считают, что первое время хорошая производительность будет несовместима с портируемостью, так что для осуществления этих планов потребуются по крайней мере две имплементации.
Значительная часть обсуждения посвящена модулям, вернее объяснению МакКвином модулей другим эмелистам. Мы рассмотрим модули позднее, пока отметим только, что запланированная независимость дизайна ядра языка от дизайна модулей уже не состоялась.
Для синтаксиса модулей нужны точки, так что лучше сократить их использование в синтаксисе ядра языка.
Милнер предложил заменить точки их отсутствием и требованием к паттернам быть "атомарными". Не думаем, что тут требуется объяснение, потому что это предложение отвергли. Между `..` и `=>` выбрали `=>`, как в HOPE.
Синтаксис списков тоже сделали как в HOPE, с разделителем `,`, а не `;` как в LCF/ML.
Эти изменения - очередной шаг к современному виду SML, но не все шаги были к современному виду, были и шаги в другом направлении.
Поскольку синонимы типов снова стали одной из обычных конструкций для объявления типа (как были в LCF/ML, а точнее как в HOPE потому, что параметризованные), было решено использовать ключевое слово `data` для того, чтоб отличать от них декларации алгебраических типов. Но, скорее всего, не так как вы подумали, а так:
```haskell
type bool = data true | false
```
Соберем все эти изменения в наш традиционный пример:
```sml
infixr 30 ::
type rec 'a list = data nil | op :: of 'a * 'a list
val rec map _ nil = nil
| map f (x::l) = f x :: map f l
let val y = 2 in map (fun x => x + y) [1, 2, 3] end
```
Да, Хаскеле-образных "рекордов" Милнера в SML больше нет. Но фича нужна имплементаторам, которые хотят писать компилятор SML на SML. Поскольку Карделли уже потерял интерес к SML, в ML можно вернуть рекорды без кавычек, типы-произведения с метками в "гармонии" с произведениями без меток. Займется их разработкой МакКвин. Решили, что сначала пара видов рекордов будут расширениями, не частью ядра языка, но интеграция в ядро лучшей из экспериментальных систем рекордов весьма вероятна.
Не смотря на то, что ядро языка должно разрабатываться отдельно от модулей, МакКвин продолжает генерировать идеи о том, что можно заменить при наличии модулей. Может и генеративные АлгТД как в HOPE не нужны и можно обойтись структурными суммами как у Карделли, а новые, отличающиеся типы будут производиться из них модульными механизмами. Было бы забавно, если бы сразу после того, как Карделли потерял интерес к SML, его бы превратили в VAX ML с параметризованными модулями, но идею посчитали слишком экспериментальной для SML.
То, что абстрактные типы данных не нужны в языке с модулями решили уже давно, но ядро языка все еще собираются стандартизировать отдельно от модулей и что делать с ними после добавления модулей пока не ясно. Может быть АТД будет просто альтернативным синтаксисом для модуля, а не отдельной конструкцией в SML с модулями.
В SML добавлены числа с плавающей точкой, а с ними добавляются и новые перегруженные операции. Арифметика теперь тоже перегружена.
Но это не все, возвращаются перегруженные операции для печати значений, от которых уже отказывались. Добавляются две специальные функции, называемые теперь "type-driven": `makestring` и `print`. `print` - тоже специальная функция потому, что написать полиморфную "type-driven" функцию нельзя, не будет контекста с информацией о типе для `makestring` и требование такого контекста нельзя поместить в сигнатуру. Примерно в это же время Карделли работает над решением этой проблемы, но не для SML, а для своих полиморфных рекордов.
Милнер подготовил новую редакцию описания ядра языка [Miln84] в следующем месяце, в июле 84-го. В октябре - еще одну редакцию [Miln84c], отличающуюся уточнениями и исправлениями в примерах кода. Например уточняется, что синонимы типов не могут быть рекурсивными, а в примеры с туплами добавлены скобки, которые теперь нужны для того, чтоб отличать их от списков.
Но SML 84.7 (или 84.10) - это не тот SML, который стал в 84-ом году известен в более широких кругах, чем подписчики самиздат-журнала "Полиморфизм".
В августе 1984 состоялась очередная конференция по Лиспу и функциональному программированию LFP. Мы не знаем, о каком SML был доклад, но в сборнике докладов конференции опубликовали [Miln84b] ноябрьский черновик прошлогоднего SML 83.11 c Хаскеле-образными "рекордами" и без нового Алгол-68-образного способа объявления АлгТД, что, скорее всего сказалось на его распространенности в дальнейшем. Понятно, что с момента отправки статьи до ее публикации проходит заметное время.
Но как описание языка помещается в лимит страниц для доклада? Просто: на каждой странице сборника по паре страниц описания, развернутых на 90 градусов. Выглядит не очень хорошо.
Впрочем, для нашей истории важнее не те изменения, которые были сделаны в SML 84.7, а те, которые делать оказались.
Конечно, не у всех несостоявшихся изменений были серьезные последствия. Например, некоторые не-комитетчики хотели оба вида комментариев: и скобки и однострочные, но это предложение отклонили. Полсон предлагал определения для операторов вида `infix precedence op = id`, где `id` уже определенная функция. Примерно как намного позднее сделали в PureScript. Этому предложению тоже не хватило поддержки. Обсудили или-паттерны, выяснили, что они никому особо не интересны, но возможен небольшой эксперимент в будущем. Кстати, на этом совещании договорились использовать термин "pattern" вместо "varstruct".
О предложениях из Гетеборга мы знаем только, что они не любили `as`-паттерны по какой-то причине, но `as`-паттерны из SML не убрали.
Несостоявшимися изменениями с серьезными последствиями были предложения Ги Кузино, представителя INRIA.
Кузино и примкнувший к нему представитель Корнелла и Роберта Констебля (Robert L. Constable) против исключения из языка `where`-выражения и хотели его вернуть в SML. И вообще в INRIA и в Корнелле хотели бы SML синтаксис больше похожий на ISWIM и LCF/ML, например `let f x =` вместо `let val f x =`. Некоторые участники обсуждения очень сильно ненавидели `val`, вспоминает Полсон, и до сих пор настаивают на том, что синтаксис SML уродливый.
Выражение-`where` из SML убрали потому, что если объявить ассоциативность, приоритет и т.д. оператора в нем, то это объявление будет после использования, что плохо для парсера. Также, конструкцию посчитали сложной для программиста. Трудно понять область видимости. И МакКвин с Милнером пишут, что `where` "с сожалением" решили не возвращать в язык.
`val` добавили для того, чтоб было легче отличать объявление функции от матчинга конструктора и убирать не собирались.
Но Кузино предлагает не только возвращение в прошлое, он желает и новых для ML фич, выступает за нелинейные паттерны как в SASL и Прологе, хочет писать
```sml
val MP(x ==> y, x) = y
```
В не-комитете SML посчитали, что это плохо для оптимизации ПМ. Можно, конечно, и поэкспериментировать, тем более, что Кузино имплементировал такой ПМ, правда, как и ожидалось, не оптимально.
Помимо официального отчета МакКвина и Милнера о встрече [MacQ85] есть еще и воспоминания Полсона [Paul22b]. Полсон пишет, что не помнит точно, какую из встреч не-комитета он вспоминает, ту, что была в апреле 83-го или ту, что была в июне 84, но по описанию больше похоже на ту, что была в 84-ом. Вспоминает он это почти сорок лет спустя. Но смутность воспоминаний Полсона компенсируется его желанием обсуждать то, чего отчет МакКвина избегает.
Из документов, которые нашли и оцифровали историки SML видно, что кто-то побеждает. И понятно кого. Но кто этот победоносный автор, сделавший стандартный ML стандартным NPL? Полсон в своих воспоминаниях называет его имя. Это Дэвид МакКвин.
И пришло время МакКвину побеждать INRIA. Кузино представил предложения Юэ и все они были отклонены комитетом. У Юэ и МакКвина явно были разные виденья ML, заключает Полсон.
Полсон неоднократно приводит цитаты неких неназванных знакомых. И одна из них рассказывает о том, что на заседаниях не-комитета "было сложно услышать что-то за грохотом сталкивающихся Эго". И Ги Кузино, представлявший INRIA-эмелистов, вспоминает Полсон, просто не имел подходящего Эго для таких столкновений, был "тихим" и "мягким".
Жерар Юэ же, по мнению работавшего с ним над компилятором ML Полсона, подходил для таких столкновений гораздо лучше. Юэ бы "отчаянно настаивал на своих требованиях", утверждает Полсон, но Юэ не было на заседании не-комитета и МакКвин добился своего. И Полсон согласен с МакКвином по всем пунктам. Полсону не нравились ни нелинейные паттерны, ни выражение `where`, ни синтаксис LCF/ML. Этот синтаксис Полсон считает смесью идей из ISWIM и странностей, произошедших от неумения имплементаторов ML 70-х парсить, о котором ему рассказал Гордон.
Но Полсон не считает конкретный синтаксис таким уж важным. Трагедия раскола в том, пишет Полсон, что разногласий по важным принципиальным вопросам не было. И ради предотвращения раскола можно было бы и уступить по ряду не особенно важных вопросов.
"Французы не получили ничего из того, чего хотели" - цитирует Полсон еще одного своего неназванного знакомого. Мы знаем, чем все это закончилось, подытоживает Полсон. И мы действительно знаем, торжество французского ML над британским ML сегодня не вызывает никакого сомнения. В 22-ом году Полсон считает, что МакКвин выиграл битву, но проиграл войну. Но в 84-ом году такой исход должен был выглядеть не очень вероятным. Полсон называет это совещание "судьбоносным", именно на нем произошел "злополучный раскол", который "создал то, что позднее было названо Caml". Но для того, чтоб Standard ML стал, по словам Полсона, "трагически упущенной возможностью" не достаточно создать Caml. Caml создала небольшая оппозиция к более многочисленному движению, развивающему несколько имплементаций. Чтоб Caml стал для него угрозой, что-то в этом движении должно было пойти не так. И у разгромившего французов на судьбоносном заседании МакКвина есть идеи на этот счет. Но это уже другая история.
### Façadisme
Констебль и прочие разработчики Nuprl в Корнелле, неудовлетворенные направлением развития SML, просто продолжили использовать и поддерживать форк Cambridge ML 4.3 [Nuprl94], имплементирующий LCF/ML в практически первозданном виде. Так этот язык пережил многие более новые функциональные языки и дожил до наших дней.
Но в INRIA участники проекта Formel не хотели использовать LCF/ML, они хотели использовать такие фичи HOPE как паттерн-матчинг и алгебраические типы данных. Но чтоб у всего этого была LCF/ML эстетика.
Когда Полсон пишет, что в результате "раскола" получился Caml, читатель скорее всего подумает про OCaml и будет обескуражен тем, что OCaml не так и похож на LCF/ML, не имеет выражения `where` и нелинейного паттерн-матчинга. Но OCaml - не первый и даже не второй язык, который получился в результате этого самого "раскола".
Первый получился после того, как летом 84-го Ги Кузино добавил ПМ и АлгТД в Cambridge ML [HOL88].
Эти изменения не привели к изменению названия, язык продолжили называть ML, указывая версии Cambridge ML с новыми фичами 5 (скорее всего) и 6 (это уже точно).
Не убирая из языка обычную, каррированную ML-лямбду `\p1 p2. exp`, Кузино добавил некаррированную, поддерживающую несколько ветвей HOPE-лямбду `fun C1 p1. exp1 | C2 p2. exp2`, оставив при этом точку разделителем между паттерном и телом функции. Добавил и `case`-выражение
```
case x of
(C1 p1) . exp1
    | (C2 p2) . exp2
```
Уравнения с несколькими ветвями Кузино добавлять не стал, так что получившийся ML остался чистым языком выражений и выглядел скорее как придуманный Бурсталлом в конце 60-х ISWIM с паттерн-матчингом, а не как разработанные им в последующие пятнадцать лет языки уравнений.
Объявления алгебраических типов данных продолжили использовать те же ключевые слова, что и объявления синонимов типов, `|` достаточно, чтоб их отличить:
```
lettype T = C1 of T1 | C2 of T2
```
Весь остальной синтаксис остался неизменным, ничего похожего на множество мелких отличий как у VAX ML Карделли и уж тем более переделывания синтаксиса почти с нуля как в SML. Язык получился примерным надмножеством LCF/ML, все инновации его только расширяли:
```sml
rectype * list = nil | $. of * # * list;;
letrec map f = fun nil . nil
| (x.xs) . f x . map f xs;;
map (\x. x + y) [1; 2; 3] where y = 2;;
```
Использование этой модификации Cambridge ML не было ограничено INRIA или прочим анти-SML-сопротивлением, на этом языке стали писать и другие пользователи Cambridge ML, например Гордон, который, судя по посланию, зачитанному на встрече в ЛРА, положительно относился к HOPE.
И использование Cambridge ML продолжилось, тем более, что замена его на компилятор Карделли не состоялась, а все прочее требовало еще больше работы для доведения до состояния, пригодного для использования.
Но в INRIA замену для него стали готовить уже в том же 84-ом году. У французских эмелистов было много идей и сами они объясняют раскол не привязанностью к синтаксису LCF/ML, а сомнениями в том, что им удастся добавить в SML нужные им новые фичи.
Привязанность к синтаксису LCF/ML явно сыграла свою роль, вид обновленного Cambridge ML это убедительно демонстрирует. Но современный вид OCaml, в свою очередь, демонстрирует уже то, что привязанность к синтаксису LCF/ML со временем ослабела, а новых фич, за добавление которых в SML пришлось бы бороться с сомнительными перспективами - было довольно много.
ПРОДОЛЖЕНИЕ СЛЕДУЕТ
Литература
@ -539,6 +713,10 @@ let val y = 2 in map (fun x. x + y) [1; 2; 3] end
[Card83e]: Luca Cardelli, ML under Unix Pose 3, 11/15/83 http://lucacardelli.name/Papers/MLUnix%20Pose%203.pdf
[Card84]: Luca Cardelli. 1984. Compiling a functional language. In Proceedings of the 1984 ACM Symposium on LISP and functional programming (LFP '84). Association for Computing Machinery, New York, NY, USA, 208217. doi:10.1145/800055.802037
[Card84b]: Luca Cardelli, ML under Unix Pose 4, 4/5/84 http://lucacardelli.name/Papers/MLUnix%20Pose%204.pdf
[Card84c]: Luca Cardelli, A semantics of multiple inheritance. in Semantics of Data Types, International Symposium, Sophia-Antipolis, France, June 1984, Proceedings. Lecture Notes in Computer Science, Vol. 173, Springer-Verlag, 1984, ISBN 3-540-13346-1. pp 51-67.
[Card85]: Antonio Albano, Luca Cardelli, and Renzo Orsini. Galileo: a strongly typed, interactive, conceptual language. ACM Transactions on Database Systems (TODS), 10(2):230-260, 1985.
[Card86]: Luca Cardelli. Amber. In Guy Cousineau, Pierre-Louis Curien, and Bernard Robinet, editors, Combinators and Functional Programming Languages, Lecture Notes in Computer Science, Vol. 242, pp 21-70. Springer-Verlag, 1986.
[Card86b]: Luca Cardelli. The amber machine. In Guy Cousineau, Pierre-Louis Curien, and Bernard Robinet, editors, Combinators and Functional Programming Languages, Lecture Notes in Computer Science, Vol. 242, pp 21-70. Springer-Verlag, 1986.
[Clar81]: Keith L. Clark and Steve Gregory. 1981. A relational language for parallel programming. In Proceedings of the 1981 conference on Functional programming languages and computer architecture (FPCA '81). Association for Computing Machinery, New York, NY, USA, 171178. doi:10.1145/800223.806776
[Darl76]: Darlington, J., & Burstall, R. M. (1976). A system which automatically improves programs. Acta Informatica, 6(1). doi:10.1007/bf00263742  
[Darl81]: John Darlington and Mike Reeve. 1981. ALICE a multi-processor reduction machine for the parallel evaluation CF applicative languages. In Proceedings of the 1981 conference on Functional programming languages and computer architecture (FPCA '81). Association for Computing Machinery, New York, NY, USA, 6576. doi:10.1145/800223.806764
@ -554,8 +732,10 @@ July 1981. Dijkstra working note EWD798. https://www.cs.utexas.edu/~EWD/transcri
[Hoar72]: Hoare, Charles Antony Richard. "Chapter II: Notes on data structuring." In Structured programming, pp. 83-174. 1972.
[Hoar75]: Hoare, C.A.R. Recursive data structures. International Journal of Computer and Information Sciences 4, 105132 (1975). doi:10.1007/BF00976239
[Hoar22]: Krzysztof R. Apt and Tony Hoare (Eds.). 2022. Edsger Wybe Dijkstra: His Life,Work, and Legacy (1st. ed.). ACM Books, Vol. 45. Association for Computing Machinery, New York, NY, USA. doi:10.1145/3544585
[HOL88]: HOL88 https://github.com/theoremprover-museum/HOL88
[Huda07]: Paul Hudak, John Hughes, Simon Peyton Jones, and Philip Wadler. 2007. A history of Haskell: being lazy with class. In Proceedings of the third ACM SIGPLAN conference on History of programming languages (HOPL III). Association for Computing Machinery, New York, NY, USA, 1211255. DOI:10.1145/1238844.1238856
[McJo24]: Paul McJones, John Allen (1937-2022) and Anatomy of LISP https://mcjones.org/dustydecks/archives/2024/04/11/1249/
[MacQ85]: David MacQueen and Robin Milner. 1985. Record of the Standard ML Meeting, Edinburgh, 68 June 1984. Polymorphism: The ML/LCF/Hope Newsletter II, 1 (Jan.), 16. http://lucacardelli.name/Papers/Polymorphism%20Vol%20II,%20No%201.pdf
[MacQ14]: Luca Cardelli and the Early Evolution of ML, by David MacQueen. A paper presented at the Luca Cardelli Fest at Microsoft Research Cambridge on Sept. 8, 2014.
[MacQ15]: MacQueen, David B. The History of Standard ML: Ideas, Principles, Culture https://www.youtube.com/watch?v=NVEgyJCTee4
[MacQ20]: MacQueen, David B., Robert Harper and John H. Reppy. “The history of Standard ML.” Proceedings of the ACM on Programming Languages 4 (2020): 1 - 100.DOI:10.1145/3386336
@ -566,10 +746,15 @@ July 1981. Dijkstra working note EWD798. https://www.cs.utexas.edu/~EWD/transcri
[Miln82]: Milner, Robin. “How ML evolved.” (1982).
[Miln83]: Robin Milner. 1983. A Proposal for Standard ML (TENTATIVE). April 1983. 25 pages. https://smlfamily.github.io/history/SML-proposal-4-83.pdf
[Miln83b]: Robin Milner. 1983. A Proposal for Standard ML (second draft). June 1983. 50 pages. http://sml-family.org/history/SML-proposal-6-83.pdf
[Miln83c]: A Proposal for Standard ML, by Robin Milner, November 1983. The third draft of Milner's proposal for core Standard ML.
https://smlfamily.github.io/history/SML-proposal-11-83.pdf
[Miln83c]: A Proposal for Standard ML, by Robin Milner, November 1983. The third draft of Milner's proposal for core Standard ML. https://smlfamily.github.io/history/SML-proposal-11-83.pdf
[Miln84]: Robin Milner, The Standard ML Core Language, July 1984. https://smlfamily.github.io/history/SML-proposal-7-84.pdf
[Miln84b]: Robin Milner. 1984. A proposal for standard ML. In Proceedings of the 1984 ACM Symposium on LISP and functional programming (LFP '84). Association for Computing Machinery, New York, NY, USA, 184197. doi:10.1145/800055.802035
[Miln84c]: Robin Milner, The Standard ML Core Language, October, 1984. The second draft of the "Core Language" design. https://smlfamily.github.io/history/SML-proposal-10-84.pdf
[Mitc84]: John C. Mitchell. 1984. Coercion and type inference. In Proceedings of the 11th ACM SIGACT-SIGPLAN symposium on Principles of programming languages (POPL '84). Association for Computing Machinery, New York, NY, USA, 175185. https://doi.org/10.1145/800017.800529
[Mosses]: Peter Mosses, Affiliations https://pdmosses.github.io/affiliations/
[Muss81]: D. Kapur, D. R. Musser, and A. A. Stepanov. 1981. Operators and algebraic structures. In Proceedings of the 1981 conference on Functional programming languages and computer architecture (FPCA '81). Association for Computing Machinery, New York, NY, USA, 5964. doi:10.1145/800223.806763
[Nuprl94]: Nuprl 3.2 (26-MAY-94) https://github.com/owo-lang/nuprl-3 https://web.archive.org/web/20220630143027/http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/reasonng/atp/systems/nuprl/0.html
[Paul22b]: Lawrence Paulson. Memories: Edinburgh ML to Standard ML https://lawrencecpaulson.github.io/2022/10/05/Standard_ML.html
[PERQ1]: PERQ History, 1.3. EARLY DAYS http://www.chilton-computing.org.uk/acd/sus/perq_history/part_1/c3.htm
[RAL83]: DISTRIBUTED INTERACTIVE COMPUTING NOTE 893, RUTHERFORD APPLETON LABORATORY, 3 October 1983 http://www.dataweb.clrc.ac.uk/acd/pdfs/dic/dic841.pdf
[RAL84]: The Software Technology Initiative Final Report 1981-1984

View file

@ -14,6 +14,8 @@
---------------------------
[Обновление 2025-05-31](hopes.md#любой-принц-в-янтаре)
[Обновление 2025-04-30](hopes.md#карделли-против-карделли)
[Обновление 2025-03-31](hopes.md#standard-ml-836)