E — объектно-ориентированный язык программирования для надежных распределенных вычислений, разработанный Марком С. Миллером[англ.][1], Дэном Борштейном[англ.], Дугласом Крокфордом[2][3], Чипом Морнингстаром[англ.][4] и другими участниками сообщества Electric Communities в 1997.
E | |
---|---|
Класс языка | мультипарадигмальный: объектно-ориентированное |
Появился в | 1997 |
Автор | Mark S. Miller |
Система типов | строгая, динамическая |
Основные реализации | E-on-Java, E-on-CL |
Испытал влияние | Joule, Original-E, Java |
Лицензия | portions in different free licenses |
Сайт | erights.org |
ОС | Cross-platform |
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
E в основном произошел от параллельного языка Joule и от Original-E, набора расширений Java для безопасного распределенного программирования. Язык сочетает вычисления на основе сообщений с синтаксисом, подобным Java. Модель параллелизма, основанная на циклах событий и обещаниях[англ.], гарантирует, что взаимоблокировка[англ.] никогда не возникнет.
Философия
правитьЯзык E разработан для компьютерной безопасности и безопасных вычислений. Это достигается, в основном, за счет строгого соблюдения объектно-ориентированной вычислительной модели, которая в чистом виде обладает свойствами, поддерживающими безопасные вычисления. Язык E и его стандартная библиотека повсеместно используют философию проектирования, основанную на возможностях, чтобы помочь программистам создавать безопасное программное обеспечение и позволить программным компонентам взаимодействовать, даже если они не полностью доверяют друг другу. В E ссылки на объекты служат возможностями, следовательно, возможности не добавляют вычислительных или концептуальных накладных расходов. Синтаксис языка разработан таким образом, чтобы людям было легко проводить аудит на наличие недостатков безопасности. Например, лексический scoping[англ.] ограничивает объем кода, который должен быть проверен на предмет его влияния на данную переменную. В качестве другого примера язык использует ==
оператор для сравнения и :=
оператор для присваивания; чтобы избежать возможной путаницы, в нем нет =
оператора.
Вычислительная модель
правитьВ E все значения являются объектами, а вычисления выполняются путем отправки сообщений объектам. Каждый объект принадлежит vat (аналогично процессу). Каждый vat имеет единственный поток выполнения, фрейм стека и очередь событий. Распределенное программирование[англ.] - это всего лишь вопрос отправки сообщений удаленным объектам (объектам в других vat). Все коммуникации с удаленными сторонами зашифрованы средой выполнения E. Поступающие сообщения помещаются в очередь событий vat; цикл событий vat обрабатывает входящие сообщения одно за другим в порядке поступления.
У E есть два способа отправки сообщений: немедленный вызов и возможная отправка. Немедленный вызов аналогичен обычному вызову функции или метода на непараллельном языке: отправитель ожидает, пока получатель завершит работу и вернет значение. Конечная отправка отправляет сообщение, создавая заполнитель для результата, называемого обещанием. Отправитель немедленно выполняет обещание. Позже, когда получатель завершает работу и выдает результат, обещание преобразуется в результат. Поскольку при общении с удаленными объектами разрешены только возможные отправки, взаимоблокировок произойти не может. В распределенных системах механизм обещаний также минимизирует задержки, вызванные задержкой в сети.
Синтаксис и примеры
правитьСинтаксис E больше всего похож на Java, хотя он также имеет некоторое сходство с Python и Pascal. Переменные динамически типизируются и имеют лексическую область действия[англ.]. Однако, в отличие от Java или Python, E полностью состоит из выражений. Вот чрезвычайно простая электронная программа:
println("Привет, мир!")
Вот рекурсивная функция для вычисления факториала числа, записанная на E. Функции определяются с помощью def
ключевого слова.
def факториал(n . else { throw("недопустимый аргумент факториала: "+n) } }
В первой строке :int
находится защита, которая ограничивает аргумент и результат функции. Защита - это не совсем то же самое, что объявление типа; защита необязательна и может указывать ограничения. Первое :int
гарантирует, что тело функции должно будет обрабатывать только целочисленный аргумент. Без второго :int
вышеизложенного функция не смогла бы возвращать значение. Возможность заранее видеть, что информация ускользает из функции, полезна для аудита безопасности.
Поскольку E предназначен для поддержки безопасного сотрудничества, каноническим примером электронных программ является монетный двор, простая система электронных денег, состоящая всего из нескольких строк E. Следующий код определяет функцию, которая производит монетные дворы, где у каждого монетного двора есть своя валюта. Каждый монетный двор может создавать кошельки для хранения своей валюты, и любой владелец двух кошельков с одной и той же валютой может безопасно переводить деньги между кошельками. Быстро изучив исходный код, электронный программист может легко убедиться, что
- только монетные дворы могут изменять количество денег в обращении
- что деньги можно только создавать, а не уничтожать
- что монетные дворы могут создавать деньги только в своей собственной валюте, и
- что только владелец кошелька может изменять его баланс.
деф makeMint(имя) :любой { деф [уплотнитель, unsealer выступает] := makeBrandPair(имя) деф мяты { к makePurse(ВАР баланс :(инт >= 0)) :любой { деф ОВЦС(сумму :(0..баланса)) :пустота { баланса -= сумму } деф кошелек { для метода getbalance() :инт { вернуть баланс } в Росток() :любой { возвращение мяты.makePurse(0) } в getDecr() :любой { возвращение уплотнитель.уплотнение(ОВЦС) } на депозит(сумму :инт, ГРЦ) :пустота { unsealer выступает.распечатать(ГРЦ.getDecr())(сумма) баланс += сумма } } возвращение кошелька } } вернуть мяты }
Объекты в E определяются с помощью def
ключевого слова, и в определении объекта с to
ключевого слова начинается каждый метод. Защитные выражения в этом примере иллюстрируют, как указать ограничение значения (например, в :(int >= 0)
или :(0..balance)
).
В примере mint используется встроенный механизм, называемый уплотнителем. Функция makeBrandPair
создает два связанных объекта, средство для герметизации и средство для вскрытия, так что средство для герметизации может запечатать объект в коробке, а средство для вскрытия является единственным объектом, который может извлечь содержимое коробки. Более подробное объяснение этого примера с деньгами можно рассмотреть на Веб-сайте E[5].
См. также
правитьПримечания
править- ↑ Handy, Alex The future of software security (амер. англ.). SD Times (14 ноября 2016). Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ Питер Сейбел. Кодеры за работой. Размышления о ремесле программиста. — апр. 2011. — С. 97. — 544 с. — ISBN 9785932861882.
- ↑ Peter Seibel. Coders at Work: Reflections on the Craft of Programming. — Apress, 2009-12-21. — 619 с. — ISBN 978-1-4302-1949-1. Архивировано 16 января 2024 года.
- ↑ E's History . www.erights.org. Дата обращения: 16 января 2024. Архивировано 18 января 2024 года.
- ↑ From Objects to Capabilities . erights.org. Дата обращения: 16 января 2024. Архивировано 24 июля 2014 года.
Ссылки
править- Quick Start for E Language Programming
- Что за штука…D? / LinuxFormat №93