زبان برنامه‌نویسی ای

**ای** (**E**) یک زبان برنامه‌نویسی شی‌گرا رایانش توزیع‌شده ایمن است که توسط مارکس میلر، دن برونستین، داگلاس کراکفرد، چیپ مورنینگ‌استار و نیز عده ای دیگر در انجکن الکتریک در سال ۱۹۹۷ ایجاد شد. E عمدتاً از زبان همزمان ژول و از Original-E، مجموعه‌ای از برنامه‌های افزودنی به جاوا برای برنامه‌نویسی توزیع‌شده ایمن گرفته شده‌است. E محاسبات مبتنی بر پیام را با نحو شبیه به جاوا ترکیب می‌کند. یک مدل همزمانی مبتنی بر برنامه‌نویسی رویدادمحور و وعده‌ها تضمین می‌کند که بن‌بست هرگز نمی‌تواند رخ دهد.

## فلسفه
زبان E با در نظر گرفتن محاسبات ایمن طراحی شده‌است. این امر عمدتاً با پایبندی دقیق به مدل محاسبات شی گرا انجام می‌شود، که در شکل اصلی خود دارای ویژگی‌هایی است که از محاسبات ایمن پشتیبانی می‌کند. زبان E و کتابخانه استاندارد آن از یک فلسفه طراحی مبتنی بر قابلیت استفاده می‌کنند تا به برنامه‌نویسان کمک کنند تا نرم‌افزاری امن بسازند و اجزای نرم‌افزار را قادر می‌سازند تا باهم همکاری کنند، حتی اگر به‌طور کامل از یکدیگر پشتیبانی نمی‌کنند.

در E، ارجاعات شی به عنوان قابلیت عمل می‌کنند، از این رو قابلیت‌ها هیچ هزینه سربار محاسباتی یا مفهومی اضافه نمی‌کنند. نحو زبان به گونه ای طراحی شده‌است که افراد بتوانند به راحتی نقایص امنیتی را بررسی کنند. به عنوان مثال، دامنه واژگانی مقدار کدی را که باید برای تأثیرات آن بر روی یک متغیر معین بررسی شود، محدود می‌کند. به عنوان مثال دیگر، زبان از **عملگر ==** برای مقایسه و **عملگر :=** برای انتساب استفاده می‌کند. برای جلوگیری از احتمال سردرگمی، هیچ **=** عملگر وجود ندارد.

## مدل محاسباتی
در E، تمام مقادیر، شی هستند و محاسبات با ارسال پیام به اشیا انجام می‌شود. هر شی متعلق به یک *vat* (مشابه یک فرایند) است. هر vat دارای یک رشته اجرا، یک قاب پشته و یک صف رویداد است. برنامه‌نویسی توزیع شده فقط ارسال پیام به اشیاء راه دور (اشیاء موجود در مخازن دیگر) است. تمام ارتباطات با قسمتهای از راه دور توسط زمان اجرا E رمزگذاری می‌شود. پیام‌های رسیده در صف رویداد vat قرار می‌گیرند. حلقه رویداد vat پیام‌های دریافتی را یک به یک، و بنا به ترتیب دریافت آنها، پردازش می‌کند.

درE دو راه برای ارسال پیام وجود دارد: *تماس فوری* و *ارسال نهایی*. تماس فوری درست مانند فراخوانی تابع یا روش معمولی در یک زبان غیر همزمان است: فرستنده منتظر می‌ماند تا گیرنده تمام شود و مقداری را برگرداند. ارسال نهایی پیام را می‌فرستد در حالی که یک مکان نگهدار برای نتیجه به نام وعده تولید می‌کند. فرستنده بلافاصله با وعده ادامه می‌دهد. بعداً وقتی گیرنده تمام می‌شود و نتیجه می‌دهد، قول به نتیجه می‌رسد. از آنجایی که فقط ارسال‌های نهایی هنگام برقراری ارتباط با اشیاء راه دور مجاز است، بن‌بست نمی‌تواند اتفاق بیفتد. در سیستم‌های توزیع شده، مکانیسم وعده تاخیرهای ناشی از تأخیر شبکه را نیز به حداقل می‌رساند.

## نحو و مثال‌هایی از آن
زبان E از نظر نحو، بیشتر شبیه به زبان جاوا می‌باشد، اگرچه شباهت‌هایی به پایتون و پاسکال نیز دارد. متغیرها از نظر نوع، پویا هستند و از نظر لغوی، دارایدامنه می‌باشند. برخلاف جاوا یا پایتون، E کاملاً از عبارات تشکیل شده‌است. در اینجا یک برنامه بسیار ساده E وجود دارد:


```python
println("Hello, world!")
```
در اینجا یک تابع بازگشتی برای محاسبه فاکتوریل یک عدد وجود دارد که در E نوشته شده‌است. توابع با استفاده از کلمه کلیدی **def تعریف می‌شوند.**
```python
def factorial(n :int) :int {
  if (n == 1) {
   return 1
  } else if (n > 0) {
   return n * factorial(n-1)
  } else {
   throw("invalid argument to factorial: "+n)
  }
 }
```
در خط اول،**int:** یک *محافظ است* که آرگومان و نتیجه تابع را محدود می‌کند. نگهبان دقیقاً مشابه تعیین نوع نیست؛ بلکه محافظ‌ها اختیاری هستند و می‌توانند محدودیت‌ها را مشخص کنند. اولین **int:** تضمین می‌کند که بدنه تابع فقط باید یک آرگومان عدد صحیح را مدیریت کند. **بدون int:** دوم در بالا، تابع نمی‌تواند هیچ مقداری را برگرداند. اینکه بتوانیم از قبل ببینیم که اطلاعات از عملکرد خارج می‌شود، برای بررسی‌های امنیتی مفید است.

از آنجایی که E برای پشتیبانی از همکاری ایمن در نظر گرفته شده‌است، مثال متعارف برای برنامه‌های E، ضرابخانه است، یک سیستم پول الکترونیکی ساده که فقط با چند خط کد در زبان E، پیاده‌سازی شده‌است. کدی که در ادامه آمده، ضرابخانه‌ها را تعریف می‌کند، که در آن هر ضرابخانه ویژگی‌های خاص خود را دارد. هر ضرابخانه می‌تواند کیف‌هایی بسازد که پول آن را نگه می‌دارد، و هر دارنده دو کیف پول یکسان می‌تواند به‌طور امن پول را بین کیف‌ها انتقال دهد. با بررسی سریع کد منبع، یک برنامه‌نویس E به راحتی می‌تواند تأیید کند که:

فقط ضرابخانه‌ها می‌توانند مقدار پول در گردش را تغییر دهندو پول را فقط می‌توان ایجاد کرد و نمی‌توان آن را از بین برد. هم چنین هرضرابخانه فقط می‌تواند پولی را با واحد پول خود ایجاد کنند. دارنده کیف نیز می‌تواند تعادل آن را تغییر دهد.
```python
def makeMint(name) :any {
  def [sealer, unsealer] := makeBrandPair(name)
  def mint {
   to makePurse(var balance :(int >= 0)) :any {
    def decr(amount :(0..balance)) :void {
     balance -= amount
    }
    def purse {
     to getBalance() :int { return balance }
     to sprout() :any { return mint.makePurse(0) }
     to getDecr() :any { return sealer.seal(decr) }
     to deposit(amount :int, src) :void {
      unsealer.unseal(src.getDecr())(amount)
      balance += amount
     }
    }
    return purse
   }
  }
  return mint
 }
```
اشیاء در E با کلمه کلیدی **def** تعریف می‌شوند و در تعریف شی، کلمه کلیدی **to** شروع هر متد است. عبارات محافظ در این مثال نحوه تعیین یک محدودیت مقدار را نشان می‌دهد (مانند **:(int >= ۰)** یا **:(0..balance)**).

نمونه ضرابخانه، از یک مکانیزم داخلی به نام *سیلر استفاده می‌کند*. تابع **makeBrandPair** دو شیء مرتبط ایجاد می‌کند، یک sealer و یک unsealer، به طوری که sealer می‌تواند یک شی را در یک جعبه مهر و موم کند و unsealer تنها شی ای است که می‌تواند محتویات جعبه را بازیابی کند. برای توضیح دقیق تر این مثال پول به وب سایت E مراجعه کنید.

## جستارهای وابسته
* مدل قابلیت شی

## منابع

# Handy, Alex (۱۴ نوامبر ۲۰۱۶). "The future of software security". *SD Times*.
# Seibel, Peter (۲۱ دسامبر ۲۰۰۹). "Coders at Work: Reflections on the Craft of Programming". Apress. pp.&nbsp;95–96.
# "E's History". *www.erights.org*.
# Miller, Mark S. ; Tribble, E. Dean; Shapiro, Jonathan (2005). "Concurrency Among Strangers" (PDF). *Trustworthy Global Computing*. Lecture Notes in Computer Science. **3705**: 195–229. doi:10.1007/11580850_12. ISBN 978-3-540-30007-6.
# Rees, Jonathan; Miller, Mark (2001). "From Objects To Capabilities - Simple Money". *erights.org*. ERights. Retrieved 8 July 2014. Before presenting the following simple example of capability-based money, we must attempt to head off a confusion this example repeatedly causes. We are not proposing to actually do money this way! A desirable money system must also provide for..

رده:زبان‌های برنامه‌نویسی پویا
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:زبان‌های برنامه‌نویسی شیءگرا
رده:زبان‌های برنامه‌نویسی ماشین مجازی جاوا
رده:زبان‌های برنامه‌نویسی ماشینی پویا
رده:زبان‌های برنامه‌نویسی هم‌روند
رده:زبان‌های برنامه‌نویسی
رده:صفحات با ترجمه بازبینی‌نشده
رده:نرم‌افزارهای ۱۹۹۷ (میلادی)
رده:سامانه‌های قابلیتی
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۹۷ (میلادی)