E (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
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 — объектно-ориентированный язык программирования для надежных распределенных вычислений, разработанный Марком С. Миллером[en][1], Дэном Борштейном[en], Дугласом Крокфордом[2][3], Чипом Морнингстаром[en][4] и другими участниками сообщества Electric Communities в 1997.

E в основном произошел от параллельного языка Joule и от Original-E, набора расширений Java для безопасного распределенного программирования. Язык сочетает вычисления на основе сообщений с синтаксисом, подобным Java. Модель параллелизма, основанная на циклах событий и обещаниях[en], гарантирует, что взаимоблокировка[en] никогда не возникнет.

Философия[править | править код]

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

Вычислительная модель[править | править код]

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

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

Синтаксис и примеры[править | править код]

Синтаксис E больше всего похож на Java, хотя он также имеет некоторое сходство с Python и Pascal. Переменные динамически типизируются и имеют лексическую область действия[en]. Однако, в отличие от 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].

См. также[править | править код]

Примечания[править | править код]

  1. Handy, Alex The future of software security (амер. англ.). SD Times (14 ноября 2016). Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
  2. Питер Сейбел. Кодеры за работой. Размышления о ремесле программиста. — апр. 2011. — С. 97. — 544 с. — ISBN 9785932861882.
  3. Peter Seibel. Coders at Work: Reflections on the Craft of Programming. — Apress, 2009-12-21. — 619 с. — ISBN 978-1-4302-1949-1. Архивировано 16 января 2024 года.
  4. E's History. www.erights.org. Дата обращения: 16 января 2024. Архивировано 18 января 2024 года.
  5. From Objects to Capabilities. erights.org. Дата обращения: 16 января 2024. Архивировано 24 июля 2014 года.

Ссылки[править | править код]