| パラダイム | マルチパラダイム:オブジェクト指向、メッセージパッシング |
|---|---|
| デザイン: | マーク・S・ミラー |
| 初登場 | 1997年 |
| タイピングの規律 | 力強く、ダイナミック |
| OS | クロスプラットフォーム |
| ライセンス | さまざまな無料ライセンスの一部 |
| Webサイト | 著作権 |
| 主な実装 | |
| E-on-Java、E-on-CL | |
| 影響を受けた | |
| ジュール、オリジナルE、Java | |
| 影響を受けた | |
| ポニー | |
E は、安全な分散コンピューティングのためのオブジェクト指向プログラミング言語で、 1997 年に Electric Communities のMark S. Miller、[1]、Dan Bornstein、 [2]、 Douglas Crockford、[2]、Chip Morningstar [3]らによって作成されました。E は主に並行言語Jouleと、安全な分散プログラミングのための Java の拡張機能セットである Original-E から派生したものです。E は、メッセージベースの計算とJava のような構文を組み合わせています。イベント ループとPromiseに基づく並行モデルにより、デッドロックが発生しないことが保証されます。[4]
哲学
E 言語は、コンピュータ セキュリティとセキュア コンピューティング用に設計されています。これは主に、純粋な形式ではセキュア コンピューティングをサポートするプロパティを持つオブジェクト指向コンピューティング モデルに厳密に準拠することによって実行されます。E 言語とその標準ライブラリは、プログラマがセキュアなソフトウェアを構築できるようにし、ソフトウェア コンポーネントが互いに完全に信頼していなくても連携できるようにするために、機能ベースの設計哲学を全体的に採用しています。E では、オブジェクト参照が機能として機能するため、機能によって計算や概念のオーバーヘッド コストが追加されることはありません。言語構文は、セキュリティ上の欠陥を監査しやすいように設計されています。たとえば、レキシカルスコープによって、特定の変数への影響を調べる必要があるコードの量が制限されます。別の例として、言語では==比較に演算子を使用し、:=代入に演算子を使用します。混乱を避けるため、演算子はありません=。
計算モデル
E では、すべての値はオブジェクトであり、計算はオブジェクトにメッセージを送信することによって実行されます。各オブジェクトはvat (プロセスに類似) に属します。各 vat には、単一の実行スレッド、スタック フレーム、およびイベント キューがあります。分散プログラミングは、リモート オブジェクト (他の vat 内のオブジェクト) にメッセージを送信するだけです。リモート パーティとのすべての通信は、 E ランタイムによって暗号化されます。到着したメッセージは vat のイベント キューに配置され、vat のイベント ループは到着順に受信メッセージを 1 つずつ処理します。
E には、即時呼び出しと最終送信という 2 つの方法でメッセージを送信できます。即時呼び出しは、非並行言語の一般的な関数またはメソッド呼び出しとまったく同じです。送信側は、受信側が終了して値を返すまで待機します。最終送信は、 promise と呼ばれる結果のプレースホルダーを作成しながらメッセージを送信します。送信側は、promise をすぐに実行します。後で、受信側が終了して結果を返すと、promise は結果に解決されます。リモート オブジェクトとの通信では最終送信のみが許可されるため、デッドロックは発生しません。分散システムでは、promise メカニズムによって、ネットワーク待ち時間による遅延も最小限に抑えられます。
構文と例
E の構文はJavaに最も似ていますが、PythonやPascalにも多少似ています。変数は動的に型付けされ、語彙スコープが設定されます。ただし、Java や Python とは異なり、 E は完全に式で構成されています。以下は、非常に単純な E プログラムです。
println ( "こんにちは、世界!" )
以下は、E で記述された、数値の階乗を計算する再帰関数です。関数は、defキーワードを使用して定義されます。
def factorial ( n : int ) : int {
if ( n == 1 ) {
return 1
} else if ( n > 0 ) {
return n * factorial ( n - 1 )
} else {
throw ( "factorial への引数が無効です: " + n )
}
}
最初の行は、関数の引数と結果を制限するガード:intです。ガードは型宣言とはまったく同じではありません。ガードはオプションで、制約を指定できます。最初のガードは、関数の本体が整数引数のみを処理すればよいことを保証します。上記の 2 番目のガードがなければ、関数は値を返すことができません。情報が関数から漏れることを事前に確認できることは、セキュリティ監査に役立ちます。
:int:int
E は安全な協力関係をサポートすることを目的としているため、E プログラムの標準的な例は、わずか数行の E で記述されたシンプルな電子マネー システムである mint です。次のコードは、各ミントが独自の通貨を持つミントを作成する関数を定義します。各ミントはその通貨を保持する財布を作成でき、同じ通貨の財布を 2 つ持っている人は、財布間で安全にお金を移動できます。ソース コードを簡単に調べるだけで、E プログラマーは、ミントだけが流通する通貨の量を変更できること、通貨は作成のみ可能で破棄できないこと、ミントは独自の通貨の通貨のみを作成できること、財布の所有者だけが残高を変更できることを簡単に確認できます。
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)またはのように:(0..balance)) を指定する方法を示しています。
ミントの例では、シーラーと呼ばれる組み込みのメカニズムを使用しています。この関数は、makeBrandPairシーラーとアンシーラーという2つの関連オブジェクトを作成します。シーラーは箱の中にオブジェクトを封印することができ、アンシーラーは箱の中身を取り出せる唯一のオブジェクトです。このお金の例の詳細な説明については、Eのウェブサイトを参照してください。[5]
参照
参考文献
- ^ Handy, Alex (2016 年 11 月 14 日). 「ソフトウェア セキュリティの将来」. SD Times .
- ^ セイベル、ピーター(2009年12月21日)。『Coders at Work: Reflections on the Craft of Programming』Apress。95~96ページ。ISBN 9781430219491。
- ^ 「Eの歴史」www.erights.org。
- ^ ミラー、マーク S.、トリブル、E. ディーン、シャピロ、ジョナサン (2005)。「見知らぬ人同士の同時実行」( PDF)。信頼できるグローバルコンピューティング。コンピュータサイエンスの講義ノート。3705 : 195–229。Bibcode : 2005LNCS.3705..195M。doi :10.1007/11580850_12。ISBN 978-3-540-30007-6. 2022年3月31日時点のオリジナル(PDF)からアーカイブ。2021年3月5日閲覧。
- ^ Rees, Jonathan; Miller, Mark (2001). 「オブジェクトから機能へ - シンプルなお金」. erights.org . ERights . 2014 年7 月 8 日閲覧。
機能ベースのお金の次の簡単な例を提示する前に、この例が繰り返し引き起こす混乱を回避しなければなりません。私たちは、実際にお金をこのように扱うことを提案しているわけではありません。望ましいお金のシステムは、次のことも提供する必要があります...
外部リンク
- 公式サイト
