例:
- Goは、誰もがよく知っているアイデアでタスクを迅速に解決するための非常にシンプルで工業的な言語として生まれましたが、一部は他の言語(5mm)に釘付けになっています。
- 私たちの2番目の敵は人生の勝者であるRustですが、開発の困難な人生のために、彼はコミュニティのために、C ++の将来のファッショナブルな代替品になりました。 私にとって、彼の運命はまだはっきりしていません。緑の流れとその下のIOがまだきついので、私は彼をマイクロコントローラー、ドライバー、およびオペレーティングシステム用のCと並べました。
- Crystal ...はっきりと言えば、これは生産性の高いRubyクローンです。 言うまでもなく、それはすべて彼の精神に満ちています。
- Nim(彼はNimushkaまたはNimrod)とスクリプト言語との類似性が彼にとって特別な雰囲気を作り出しますが、彼の内部はかなり複雑な生物であり、私にとってこの本質はプログラミングの際に同じ感覚を持つHaxeのようなものです。
そして、ポニーは私の最愛の人と小さな嗅ぎタバコです。 外観と言語の名前で、あなたは有名に通り過ぎることができます...一般に、私は記事の裏であなたを招待します。
これはほんの始まりに過ぎません。
言語とその可能なアプリケーションを理解するための特別な雰囲気を作るために、私自身について少しお話しします。
- 私は、単純なGoユーザーとして知られるNyarumです。 私はしばしばRastに皮肉をかけ、Slack gopherコミュニティを共同執筆しました。
- 私のペットプロジェクトは、常にオンラインゲームのエミュレートに関連しています。 リバースからサーバー側の再生へ。
- そしてアニメが大好きです。
これで私の秘密をすべて知ったので、私たちの興味深い物語を美しいポニーの世界に続けていくことができます。
舌と短い教育プログラム
これは同じ陽気な稼ぎ手であり、彼はウサギのように見えます
Ponyは、主にアクターと透明な競争力のモデルに基づいて構築されたオブジェクト指向プログラミング言語です。 その追加の利点には、「オープンソース、パフォーマンス、興味深いアイデア」などの概念が含まれています。 主な重点は、マルチコアシステム、低レベルと非常に生産的な競争力を考えずに近代的な開発です。
特徴
- 型安全。 数学的な背景によって確認された。
- メモリを使用した安全な作業。 これは型の安全性の結果ですが、この項目を見逃してはなりません。 その中で、ぶら下がりポインタ、バッファオーバーフロー、または最も一般的なケースでは、nullが何であるかを知る必要はありません。
- 実行による安全な作業。 それらはすべてセマンティックレベルで定義されており、実行時の驚きはありません。
- レーシングデータにノーと言う! アトミック、ミューテックス、タイマーはありません。 コンパイル時にチェックを行う型システムは、この概念を強く保証します。 競争力のあるコードを記述し、残りを心配しないでください。
- デッドロックはありません。 ロックを伴う操作がないことの結果。
簡単な言語仕様
型システム:
- クラス、OOPの世界からの標準。 フィールド、コンストラクタ、および関数は自由に使用できます。
class Habra let _name: String new create(name': String) => _name = name' fun name(): String => _name
- アクターはクラスと同じですが、非同期関数を定義する機能があります。 これは透明な競争を指します。
actor Habro let name: String var _hunger_level: U64 = 0 new create(name': String) => name = name' be eat(amount: U64) => _hunger_level = _hunger_level - amount.min(_hunger_level)
- プリミティブもクラスと同じですが、2つの違いがあります。 フィールドを持つことはできず、プログラムのプロセスでは、定義したプリミティブに対して1つのインスタンスのみが作成されます。 多くの場合に使用されますが、より多くの場合、Foneワールドからの値をチェックし、voidに等しくない場合、None型の機能を持つ特殊なジェネリックとして使用されます。
primitive _Habras
- 特性とインターフェース(これらはサブタイプですが、クラスと同じ方法で定義されます)。 多くのPLには一度に1つしかありませんが、ポニーでは両方とも関与しています。 違いは、特性が条件付きメンバーシップチェックであり、インターフェイスが構造コンプライアンスをチェックすることです。
// Trait trait Family fun age(): U64 => 5 class Habravi is Family // Interface interface Habrovik fun name(): String class Habrovichek fun name(): String => "Model #1"
- 型のエイリアス。 ここではあまり説明しません。強力なシステムであり、独立した研究が必要です。
// Enumeration primitive Red primitive Blue primitive Green type Colour is (Red | Blue | Green) // Complex interface HasName fun name(): String interface HasAge fun age(): U32 interface HasAddress fun address(): String type Person is (HasName & HasAge & HasAddress)
- タプルは、単一の変数で定義できるタイプのシーケンスです。
var x: (String, U64) x = ("hi", 3)
- ユニオンはタプルに非常に似ており、可能な型を一般化するためにのみ使用されます。 特別な種類のジェネリック。
var x: (String | U64) x = "hello habr" // or x = 5
- 交差は、ユニオンのほぼ反対であり、複数のタイプに対して同時に同じ値を記述することができます。 以下の例は、2つの異なるタイプのキーを同時にカードに含める方法を示しています。
type Map[K: (Hashable box & Comparable[K] box), V] is HashMap[K, V, HashEq[K]]
- 上記の型式はすべて組み合わせることができます
// Tuple in Union which in Array var _array: Array[((K, V) | _MapEmpty | _MapDeleted)]
標準表現:
- 「変数、操作記号、チェック、ループ、メソッド、アクションなど」-これらは誰もがよく知っています。 私は独立した研究に出発します。
機能:
- オブジェクト-低レベルの所有権はあなたに制限されています。FFIは例外であり、コードを壊す可能性がありますが、制御されています。 グローバル変数とグローバル関数はありません。
- 参照-いくつかの基本概念に基づいて構築され、3文字のキーワードが制御に使用されます( 保証 )。
- iso-完全な分離。他の変数はこのデータにアクセスできません。 それはあなたの魂が喜んで変更し、他の俳優に転送することができます。
- val-不変データ。それぞれ、この保護下の変数は読み取り可能であり、他のアクターに転送できます。
- ref-変数データ。任意の方向に回転でき、このデータに複数の変数を含めることができますが、他のアクターへの転送はできません。
- box-場合によっては、これはvalとrefの組み合わせです。 データが読み取り専用の場合、それらの変数はvalのように動作し、他のアクターに渡すことができます。 ただし、新しいデータを書き込もうとすると、refが取得され、複数のアクター間で使用することはできません。
- trn-常に書き込むことができるが、boxなどの他の変数に与えられるデータ。 後でリミッターをvalに変更して、他のアクターに渡すことができます。
- タグ-データの識別。データの書き込みや読み取りはできませんが、保存して比較してデータのタイプを判別することは非常に可能です。 他のアクターへの転送が可能です。
String iso // An isolated string String trn // A transition string String ref // A string reference String val // A string value String box // A string box String tag // A string tag
言語アピール
ガベージコレクター
ボードには非常にクールなGCがあります。これは完全に競争力があり、Stop the Worldがありません。 実際、2つあります。1つは作成された各アクターのリンクコレクターで、1つはグローバルです。
俳優のスピード
ロックフリーアルゴリズムとGoに多大な貢献をしたDima Vyukovのような人のおかげで、俳優間のコミュニケーションを開発するときにポニーが焦点を当てた基盤が現れました。 これが、アクター間の転送速度が毎秒20kkに達し、作成が毎秒1kkに達する理由です。
透明な競争力
私はこの概念を自分で与えましたが、コードを競争力のあるものにするために、関数の名前を変更するだけでよいことに驚きました。 このメソッドは、Goのゴルーチンで提供されるGoよりもさらに現代的です。
ポケットベル
ステータスとサイトリンク
言語は遠いベータステータスにあり、言語バージョンは0.2.1です。 開発者は現在、残りの計画された機能を完了し、バグを修正し、言語を安定させています。 ほぼすべての一般的なエディター用のプラグインがあります。
あなたがこの記事を読んでくれたことに感謝し、おそらく、その言語に興味を持つようになりました。