زبان برنامه‌نویسی ای کیست؟ توضیح بده.
ای (E) یک زبان برنامه‌نویسی شی‌گرا رایانش توزیع‌شده ایمن است که توسط مارکس میلر، دن برونستین، داگلاس کراکفرد، چیپ مورنینگ‌استار و نیز عده ای دیگر در انجکن الکتریک در سال ۱۹۹۷ ایجاد شد. E عمدتاً از زبان همزمان ژول و از Original-E، مجموعه‌ای از برنامه‌های افزودنی به جاوا برای برنامه‌نویسی توزیع‌شده ایمن گرفته شده‌است. E محاسبات مبتنی بر پیام را با نحو شبیه به جاوا ترکیب می‌کند. یک مدل همزمانی مبتنی بر برنامه‌نویسی رویدادمحور و وعده‌ها تضمین می‌کند که بن‌بست هرگز نمی‌تواند رخ دهد.فلسفه.زبان E با در نظر گرفتن محاسبات ایمن طراحی شده‌است. این امر عمدتاً با پایبندی دقیق به مدل محاسبات شی گرا انجام می‌شود، که در شکل اصلی خود دارای ویژگی‌هایی است که از محاسبات ایمن پشتیبانی می‌کند. زبان E و کتابخانه استاندارد آن از یک فلسفه طراحی مبتنی بر قابلیت استفاده می‌کنند تا به برنامه‌نویسان کمک کنند تا نرم‌افزاری امن بسازند و اجزای نرم‌افزار را قادر می‌سازند تا باهم همکاری کنند، حتی اگر به‌طور کامل از یکدیگر پشتیبانی نمی‌کنند.در E، ارجاعات شی به عنوان قابلیت عمل می‌کنند، از این رو قابلیت‌ها هیچ هزینه سربار محاسباتی یا مفهومی اضافه نمی‌کنند. نحو زبان به گونه ای طراحی شده‌است که افراد بتوانند به راحتی نقایص امنیتی را بررسی کنند. به عنوان مثال، دامنه واژگانی مقدار کدی را که باید برای تأثیرات آن بر روی یک متغیر معین بررسی شود، محدود می‌کند. به عنوان مثال دیگر، زبان از عملگر == برای مقایسه و عملگر := برای انتساب استفاده می‌کند. برای جلوگیری از احتمال سردرگمی، هیچ = عملگر وجود ندارد.مدل محاسباتی.در E، تمام مقادیر، شی هستند و محاسبات با ارسال پیام به اشیا انجام می‌شود. هر شی متعلق به یک "vat" (مشابه یک فرایند) است. هر vat دارای یک رشته اجرا، یک قاب پشته و یک صف رویداد است. برنامه‌نویسی توزیع شده فقط ارسال پیام به اشیاء راه دور (اشیاء موجود در مخازن دیگر) است. تمام ارتباطات با قسمتهای از راه دور توسط زمان اجرا E رمزگذاری می‌شود. پیام‌های رسیده در صف رویداد vat قرار می‌گیرند. حلقه رویداد vat پیام‌های دریافتی را یک به یک، و بنا به ترتیب دریافت آنها، پردازش می‌کند.درE دو راه برای ارسال پیام وجود دارد: "تماس فوری" و "ارسال نهایی". تماس فوری درست مانند فراخوانی تابع یا روش معمولی در یک زبان غیر همزمان است: فرستنده منتظر می‌ماند تا گیرنده تمام شود و مقداری را برگرداند. ارسال نهایی پیام را می‌فرستد در حالی که یک مکان نگهدار برای نتیجه به نام وعده تولید می‌کند. فرستنده بلافاصله با وعده ادامه می‌دهد. بعداً وقتی گیرنده تمام می‌شود و نتیجه می‌دهد، قول به نتیجه می‌رسد. از آنجایی که فقط ارسال‌های نهایی هنگام برقراری ارتباط با اشیاء راه دور مجاز است، بن‌بست نمی‌تواند اتفاق بیفتد. در سیستم‌های توزیع شده، مکانیسم وعده تاخیرهای ناشی از تأخیر شبکه را نیز به حداقل می‌رساند.نحو و مثال‌هایی از آن.زبان E از نظر نحو، بیشتر شبیه به زبان جاوا می‌باشد، اگرچه شباهت‌هایی به پایتون و پاسکال نیز دارد. متغیرها از نظر نوع، پویا هستند و از نظر لغوی، دارایدامنه می‌باشند. برخلاف جاوا یا پایتون، E کاملاً از عبارات تشکیل شده‌است. در اینجا یک برنامه بسیار ساده E وجود دارد: println("Hello, world!")در اینجا یک تابع بازگشتی برای محاسبه فاکتوریل یک عدد وجود دارد که در E نوشته شده‌است. توابع با استفاده از کلمه کلیدی def تعریف می‌شوند. def factorial(n :int) :int { if (n == 1) { return 1 } else if (n &gt; 0) { return n * factorial(n-1) } else { throw("invalid argument to factorial: "+n)در خط اول،int: یک "محافظ است" که آرگومان و نتیجه تابع را محدود می‌کند. نگهبان دقیقاً مشابه تعیین نوع نیست؛ بلکه محافظ‌ها اختیاری هستند و می‌توانند محدودیت‌ها را مشخص کنند. اولین int: تضمین می‌کند که بدنه تابع فقط باید یک آرگومان عدد صحیح را مدیریت کند. بدون int: دوم در بالا، تابع نمی‌تواند هیچ مقداری را برگرداند. اینکه بتوانیم از قبل ببینیم که اطلاعات از عملکرد خارج می‌شود، برای بررسی‌های امنیتی مفید است.از آنجایی که E برای پشتیبانی از همکاری ایمن در نظر گرفته شده‌است، مثال متعارف برای برنامه‌های E، ضرابخانه است، یک سیستم پول الکترونیکی ساده که فقط با چند خط کد در زبان E، پیاده‌سازی شده‌است. کدی که در ادامه آمده، ضرابخانه‌ها را تعریف می‌کند، که در آن هر ضرابخانه ویژگی‌های خاص خود را دارد. هر ضرابخانه می‌تواند کیف‌هایی بسازد که پول آن را نگه می‌دارد، و هر دارنده دو کیف پول یکسان می‌تواند به‌طور امن پول را بین کیف‌ها انتقال دهد. با بررسی سریع کد منبع، یک برنامه‌نویس E به راحتی می‌تواند تأیید کند که:فقط ضرابخانه‌ها می‌توانند مقدار پول در گردش را تغییر دهندو پول را فقط می‌توان ایجاد کرد و نمی‌توان آن را از بین برد. هم چنین هرضرابخانه فقط می‌تواند پولی را با واحد پول خود ایجاد کنند. دارنده کیف نیز می‌تواند تعادل آن را تغییر دهد. def makeMint(name) :any { def [sealer, unsealer] := makeBrandPair(name) def mint { to makePurse(var balance :(int &gt;= 0)) :any { def decr(amount :(0..balance)) :void { balance -= amount def purse { to deposit(amount :int, src) :void { unsealer.unseal(src.getDecr())(amount) balance += amount return purse return mintاشیاء در E با کلمه کلیدی def تعریف می‌شوند و در تعریف شی، کلمه کلیدی to شروع هر متد است. عبارات محافظ در این مثال نحوه تعیین یک محدودیت مقدار را نشان می‌دهد (مانند :(int &gt;= ۰) یا :(0..balance)).نمونه ضرابخانه، از یک مکانیزم داخلی به نام "سیلر استفاده می‌کند". تابع makeBrandPair دو شیء مرتبط ایجاد می‌کند، یک sealer و یک unsealer، به طوری که sealer می‌تواند یک شی را در یک جعبه مهر و موم کند و unsealer تنها شی ای است که می‌تواند محتویات جعبه را بازیابی کند. برای توضیح دقیق تر این مثال پول به وب سایت E مراجعه کنید.