Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Часть II: 1985 - 1988 годы. Рождение Erlang



Ранние эксперименты

 

Мои первые попытки заставить звонить телефоны были запрограммированы в Smalltalk. Я сделал модель с объектами телефона и объектом обмена. Если бы я отправил сообщение на телефон, он должен был позвонить. Если телефон А снял трубку, он должен был отправить сообщение (offHook, A) на коммутатор. Если пользователь телефона A наберет какую-то цифру D, то сообщение (цифра, A, D) будет отправлено на коммутатор.

Наряду с реализацией Smalltalk, я разработал простую графическую нотацию, которую можно использовать для описания базовой телефонии. Запись, описывающая телефонию, была затем переведена вручную на Smalltalk. К настоящему времени лаборатория приобрела рабочую станцию ​ ​ SUN с Smalltalk. Но Smalltalk был очень медленным - настолько медленным, что я обычно делал перерыв на кофе, пока он собирал мусор. Чтобы ускорить процесс, в 1986 году мы заказали машину Tektronix Smalltalk, но у нее был долгий срок поставки. В ожидании его доставки я продолжал возиться со своей записью телефонии. Однажды мне довелось показать Роджеру Скагерваллу мою алгебру - его ответ был «но это программа Пролога». Я не знал, что он имел в виду, но он усердно сидел перед своей системой Пролога и быстро превратил мою систему уравнений в работает программа Пролог. Я был удивлен. Это был, хотя я не знал это в то время, первый шаг к Erlangу.

Моя графическая запись теперь может быть выражена в синтаксисе Пролога, и я написал отчет [1] об этом. Алгебра имела предикаты:

 

idle(N) means the subscriber N is idleon(N) means subscribed N in on hook...

И операторы:

+t(A, dial_tone) means add a dial tone to A

 

Окончательные правила:

process(A, f): - on(A), idle(A), +t(A, dial-tone),                    +d(A, []), -idle(A), +of(A)

Этот код читается следующим образом:

process(A, f)     To process an off hook signal from                  a subscriber A: -                thenon(A)             If subscriber A is on-hook,                 and idle(A)           If subscriber A is idle, and+t(A, dial_tone) send a dial tone to A, and+d(A, [])         set the set of dialled digits to [],                 and-idle(A)          retract the idle state,                 and+of(A)            assert that we are off hook

Замысел Erlang

Используя это обозначение, POTS можно описать с использованием пятнадцати правил. Была только одна главная проблема: запись описывала только то, как должен проходить один телефонный звонок. Как мы можем сделать это для тысяч одновременных звонков?

Прошло время, и моя машина Smalltalk была доставлена, но к тому времени, когда она прибыла, я больше не интересовался Smalltalk. Я открыл Пролог и узнал, как написать мета-интерпретатор на Прологе. Этот мета-интерпретатор было легко изменить, поэтому я скоро понял, как добавить параллельные процессы в Пролог. Тогда я мог бы запустить несколько версий моей маленькой телефонной алгебры параллельно. Стандартный способ описания Пролога сам по себе - использовать простой мета-интерпретатор:

solve((A, B)): - solve(A), solve(B).solve(A): - builtin(A), call(A).solve(A, B): - rule(A, B), solve(B).

Проблема с этим мета-интерпретатором состояла в том, что набор оставшихся целей, которые еще не решены, недоступены для манипулирования программой. Нам нужен способ явного управления набором оставшихся целей, чтобы мы могли приостановить или возобновить вычисления в любое время. Чтобы увидеть, как это работает, мы можем представить систему уравнений, подобную этой:

x -> a, b, ca -> p, {q}, rr -> g, hp -> {z}

Это обозначение означает, что символ x должен быть заменен последовательностью символов a, b и c. Далее a должно быть заменено на p, {q} и r. Символы, заключенные в фигурные скобки, считаются примитивами, которые не могут быть дополнительно сокращены. Чтобы вычислить значение символа x, мы сначала создаем стек символов. Наш редукционный механизм работает путем последовательной замены вершины стека его определением или, если он является примитивом, путем оценки примитива.

Чтобы уменьшить начальную цель x, действуем следующим образом:

x         replace x by its definitiona, b, c     replace a by its definitionp, {q}, r, b, c replace p by its definition{z}, {q}, r, b, c evaluate z{q}, r, b, c evaluate qr, b, c     replace r by its definitiong, h, b, c  ......

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

{z}, {q}, r, b, c

Если нам нужно несколько параллельных механизмов сокращения, мы организуем сохранение и сохранение состояний каждого механизма сокращения после некоторого фиксированного числа сокращений. Если мы теперь выразим наши уравнения в виде терминов Prolog:

eqn(x, [a, b, c]).eqn(a, [p, {q}, r]).eqn(r, [g, h]).eqn(p, [{z}]).

Затем мы можем описать наш механизм сокращения следующим образом:

reduce([]).reduce([{H}|T]): - call(H),!, reduce(T).reduce([Lhs|More]): - eqn(Lhs, Rhs), append(Rhs, More, More1),!, reduce(More1).

 

Имея еще несколько предложений, мы можем организовать подсчет количества шагов сокращения, которые мы сделали, и сохранить список ожидающих целей для последующей оценки. Именно так работал первый интерпретатор Erlang. Читатель может обратиться к [4] за более подробной информацией. Прошло время, и у моего маленького переводчика становилось все больше и больше функций. Во-первых, я использовал новый язык для программирования небольшой телефонной станции, поэтому естественно возникли проблемы, когда я обнаружил, что взаимодействие с ним было неуклюжим или неудобным. Во-вторых, изменения продолжились, поскольку мы придумывали более красивые способы сделать вещи. Многие языковые изменения были вызваны чисто эстетическими соображениями простоты и общности.

Я хотел поддерживать не только простые параллельные процессы, но и механизмы для отправки сообщений между процессами, а также механизм обработки ошибок и т. д. Мой переводчик вырос, и некоторые другие члены лаборатории заинтересовались тем, что я делал. То, что начиналось как эксперимент с «добавления параллелизма к Prolog», стало в большей степени языком само по себе, и этот язык получил название «Erlang», которое, вероятно, было придумано Бьярне Дэкером. Что означало имя Erlang? Некоторые говорили, что это означает «Язык Ericsson», в то время как другие утверждали, что он был назван в честь Агнера Крарупа Erlang (1878 - 1929). В то время как мы сознательно поощряли эту двусмысленность.

Пока я возился со своим мета-интерпретатором, Роберт Вирдинг реализовывал варианты языков параллельного логического программирования. Однажды Роберт пришел ко мне и сказал, что он смотрел на моего переводчика и подумал о внесении нескольких небольших незначительных изменений, не возражаю ли я? Теперь Роберт не способен вносить небольшие изменения во что-либо, поэтому довольно скоро у нас появилось две разные реализации Erlang, обе в Prolog. Мы бы по очереди переписывали код друг друга и повышали эффективность реализации. Разрабатывая язык, мы также разработали философию языка, способы мышления о мире и способы объяснения нашим коллегам, что мы делаем. Сегодня мы называем эту философию программированием ориентированным на параллелизм. В то время у нашей философии не было конкретного названия, но было больше просто набором правил, объясняющих, как мы делаем вещи. Один из самых ранних способов объяснить, что же такое Erlang, - представить его как некий гибридный язык между параллельными языками и функциональными языками. Мы сделали плакат, показывающий это, который был воспроизведен в [12] и показан здесь на рисунке 1.

Рисунок 1. Связь Erlang с существующими языками.

Параллельный функциональный язык программирования Erlang

Параллельные языки системного программирования, такие как Ada, Modula или Chill Функциональный язык программирования, такой как ML или Miranda

Bollmora, ACS/Dunder

К 1987 году Erlang стал новым языком программирования, который мы создали в Prolog. Хотя он был реализован в Prolog, семантика обработки ошибок и параллелизма Erlang значительно отличалась от Prolog. Теперь над реализацией работали два человека (Роберт Вирдинг и я), и она была готова к испытанию на внешних пользователях. К концу года Майк Уильямс сумел найти группу пользователей, желающих попробовать язык в решении проблем, - группу в Ericsson Business Communications AB, которая базируется в Боллморе. Группу возглавлял Керстин Одлинг, а другими членами команды были Аке Росберг, Хакан Карлссон и Хакан Ларссон. Это были первые пользователи Erlang.
Команда хотела прототипировать новую программную архитектуру под названием ACS (Audio Communication System), предназначенную для программирования услуг телефонии на Ericsson MD110 PABX (Private Automatic Branch Exchange), и искала подходящий язык для проекта. Так они узнали об Erlang. Проект под названием ACS / Dunder был начат для создания прототипа. Тот факт, что кто-то на самом деле был заинтересован в том, что мы делаем, стал большим стимулом для развития, и мы вступили в период быстрого развития, когда мы действительно могли опробовать наши языковые идеи на реальных пользователях.

Бешеная активность

Erlang начал быстро меняться. Теперь над реализацией работали два человека (Роберт и я) и большое пользовательское сообщество (три человека). Мы добавляли функции к языку, а затем опробовали их на наших пользователях. Если пользователям или разработчикам понравились изменения, они остались. Если пользователям не понравились изменения или если реализация была безобразной, изменения были удалены. Удивительно, но тот факт, что язык менялся у них под ногами почти каждый день, не особенно беспокоил наших пользователей. Мы встречались с нашими пользователями Bollmora один или два раза в неделю в течение шести месяцев. Мы учили их программированию, они учили нас телефонии, и обе стороны многому научились.

Вряд ли что-то осталось от этого периода - большинство ежедневных изменений в языке не были зарегистрированы, и нет никаких постоянных доказательств того, что это были за изменения. Но, к счастью, осталось несколько документов: на Рисунке 2 приведено полное руководство по Erlang 1.05, а в Приложении A содержатся комментарии в начале файла erlang.pro (который был основной программой для интерпретатора Prolog). Это журнал изменений, в котором отражены изменения, внесенные в язык за девять месяцев с 24 марта 1988 года по 14 декабря 1988 года. Как и ребенку, Erlangу потребовалось около девяти месяцев, чтобы развиваться. К концу 1988 года большинство идей в Erlangе стабилизировалось. Пока мы с Робертом внедряли систему, идеи, лежащие в основе механизма, который мы реализовали, часто исходили от наших пользователей или от других членов Лаборатории. Я всегда считал, что утренний перерыв на кофе - это ключевой форум, на котором были сброшены блестящие идеи, которые у вас были по дороге на работу, и где была проделана вся настоящая работа. Именно в этих ежедневных мозговых штурмах было создано много хорошей идеи.

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

Erlang vsn 1.05


Поделиться:



Последнее изменение этой страницы: 2019-10-24; Просмотров: 185; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.025 с.)
Главная | Случайная страница | Обратная связь