Введение

E — объектно-ориентированный язык программирования для безопасных распределённых вычислений, разработанный Марком С. Миллером, Дэном Борнштейном, Дугласом Крокфордом, Чипом Морнингстаром и другими в компании Electric Communities в 1997 году. E в основном произошёл от языка Joule и от Original E — набора расширений для Java, предназначенных для безопасного распределённого программирования. E сочетает в себе вычисления, основанные на обмене сообщениями, с синтаксисом, напоминающим Java. Модель параллелизма, основанная на циклах событий и промисах, гарантирует отсутствие взаимоблокировок.

Философия

Язык E разработан для компьютерной безопасности и безопасных вычислений. Это достигается главным образом благодаря строгому следованию объектно-ориентированной модели вычислений, которая в своей чистой форме обладает свойствами, способствующими безопасным вычислениям. Язык E и его стандартная библиотека последовательно используют философию проектирования, основанную на возможностях (capabilities), чтобы помочь программистам создавать безопасное программное обеспечение и обеспечить взаимодействие программных компонентов, даже если они не полностью доверяют друг другу. В E объектные ссылки выступают в качестве возможностей, поэтому использование возможностей не влечет за собой дополнительных вычислительных или концептуальных издержек. Синтаксис языка разработан таким образом, чтобы его было легко проверять на предмет уязвимостей в системе безопасности. Например, лексическая область видимости ограничивает объем кода, который необходимо анализировать для оценки его влияния на данную переменную. В качестве другого примера, язык использует оператор == для сравнения и оператор := для присваивания; чтобы исключить возможность путаницы, оператор = не используется.

Вычислительная модель

В E все значения являются объектами, и вычисления выполняются путем отправки сообщений объектам. Каждый объект принадлежит вату (аналогично процессу). Каждый ват имеет одну нить выполнения, фрейм стека и очередь событий. Распределенное программирование – это просто отправка сообщений удаленным объектам (объектам в других ватах). Вся связь с удаленными сторонами зашифрована средой выполнения E. Приходящие сообщения помещаются в очередь событий вата; цикл обработки событий вата обрабатывает входящие сообщения по порядку поступления. В E существует два способа отправки сообщений: непосредственный вызов и асинхронная отправка. Непосредственный вызов аналогичен типичному вызову функции или метода в непараллельном языке: отправитель ждет, пока получатель завершит работу и вернет значение. Асинхронная отправка отправляет сообщение, создавая заполнитель для результата, называемый обещанием. Отправитель сразу же продолжает работу с обещанием. Позже, когда получатель завершит работу и предоставит результат, обещание будет разрешено в этот результат. Поскольку при взаимодействии с удаленными объектами разрешены только асинхронные отправки, взаимные блокировки невозможны. В распределенных системах механизм обещаний также минимизирует задержки, вызванные сетевой задержкой.