AssemblyScript には新しい競合相手がいます: WebAssembly 用に作成された Grain 言語は、自分自身を大声で宣言します。



Oscar Spencer は



、高レベルで厳密に型指定されたプログラミング言語である Grain Grain 言語の創設者の 1 人です。これは、関数型プログラミング (型推論、パターン マッチング、クロージャーなど) と命令型プログラミング (可変変数など) のいくつかの機能を組み合わせたハイブリッド言語です。



言語の作成者の 1 人である Oscar Spencer は、WebAssembly Summit 2021 で Grain を発表しました。 Spencer はその最も興味深い重要な機能について話し、Grain は WebAssembly 専用に作成および最適化されていることを強調しました。 Wasm バイトコードにのみコンパイルできます。少なくとも今日はそうです。



これが、開発者が Grain 言語の使命を定式化した方法です。



Grain は、関数型プログラミング言語と命令型プログラミング言語を最大限に活用し、それをより多くのユーザーに提供するよう努めています。多くの言語には優れたアイデアがありますが、最終的にこれらの言語は普及しませんでした。これは、それらがあまりにも奇妙であるか、学ぶのが難しすぎるためです。その結果、周囲の大きなコミュニティを結集させようとする彼らの試みは失敗に終わりました。グレインは、これらのアイデアに新しい命を吹き込み、使いやすさを維持しながら、アクセスしやすい方法でそれらを提示する必要があります。


WebAssembly Summit は、Wasm の使用と対話のあらゆる側面に特化した年次会議です。この記事で議論されているサミットは、2021 年 4 月に開催されました。



データ型



いわゆる WebAssembly コア データ型(たとえば、基本型 i32 別名 Int32) に加えて、Grain には複合データ型があります。例えば: 



  • オプションは、オプション (オプション) の存在を「一部」または「不在」として定義する特殊なタイプの列挙です。 
  • 結果- すべてが標準です: エラーが発生した場合、問題が発生した場合は OK、すべてが問題の場合は [OK] です。 
  • スタックは不変のスタックです。 


Grain は、タプル、レコード、配列、リスト、範囲、文字、文字列、セット、マップ、キューなども実装します。



最も単純な Grain プログラムは次のようになります。



import List from «list»

import Option from «option»

import { data } from «./data»

let allPairs = List.product(data, data);

let (a, b) = Option.expect (

	«Expected to find values»,

	List.find(((a ,b)) => a + b == 2020, allPairs)

);

print((«Values», a, b));

print((«Answer», a * b));

      
      





この例は Spencerのビデオレポートのタイムコードから取得されてい ます。



ジェネリックコンストラクター



たとえば、Grain では、ジェネリック コンストラクターを使用して列挙型を作成できます。



enum  Veggie {  Squash,  Cabbage,  Broccoli  }  

enum  Fruit {  Apples,  Oranges,  Bananas  }  

enum  Inventory<produce>  {  Crate(produce),  Truckload(produce)  }  

let veggieInventory  =  [Crate(Broccoli),  Truckload(Cabbage)]  

let fruitInventory  =  [Crate(Apples),  Truckload(Oranges)]

      
      





上記のコード例では、Crate および Truckload コンストラクターのパラメーターは生成変数です。



パターンマッチング



enum  Topping {  Cheese,  Pepperoni,  Peppers,  Pineapple  }  

enum  Menu {  Pizza(Topping),  Calzone(Topping)  }  

let item  =  Calzone(Peppers)  

match  (item)  {  

 Calzone(topping)  =>  {  

 if  (checkSpecials(topping))  {  

 print(«These are half off this week.»)  

 }  else  {  

 print(«No current specials.»)  

 }  

 },  

 _  =>  print(«No current specials.»)  

}

      
      





ドキュメントのセクション マッチパターンのバインディングは、我々は、例えば、に列挙名をマッチングパターン(模様)に結合できることを言います。次に、一致式の本文の対応するケースにその名前を代入すると、この列挙の値を自動的にチェックできます。



上記のコード例では、topping 変数の値が Topping 列挙型にバインドされています。これは、Menu 列挙型の要素をその値の 1 つで初期化します。



パターン マッチングは、レコード、タプル、およびリストに対しても機能します。リストの例を見てみましょう:



let list  =  [123

match  (list)  {  

 []  =>  print(«List contains no elements»),  

 [_]  =>  print(«List contains one element»),  

 [_,  _]  =>  print(«List contains two elements»),  

 [_,  _,  _]  =>  print(«List contains three elements»),  

 _  =>  print(«List containes more than 3 elements»)  

}

      
      





この言語機能の詳細については、 こちらをご覧ください。



穀物の他の可能性について簡単に



Grain に取り組む過程で、開発者は関数の完全かつ最新の実装に細心の注意を払いました。たとえば、関数を値として使用できます。 JavaScript と同様に、Grain はクロージャーを実装します。



Grain は、値を文字列に変換せずに出力する方法も知っています。さらに、Grain は WebAssembly System Interface (WASI) にアクセスできます。 WebAssembly System Interface は、Wasm コードがすべてのデバイスとオペレーティング システムで実行できるようにする必要があります。 WASI には、非同期 I/O、乱数生成、現在時刻の取得などの API が含まれています。



穀物プログラムはモジュールに分割できます。モジュールは、他の Grain モジュールからエクスポートまたはインポートできます。Grain モジュールは外部関数を接続することもできます。ただし、開発者自身が対応する外部関数が作成されていることを確認することを条件としています。



現在、外部関数インターフェース (FFI -外部関数インターフェース) のアクティブな補完、 および 64 ビット モードでの静的リンク、標準の DOM ライブラリおよびマクロが提供されています。



より深く潜りたい方へ



静的リンク



2021 年 4 月のリリースまで、すべての Grain プログラムは、動的リンカーの役割を果たす特別な js エンジンによってアセンブルされていました。ただし、このアプローチでは、プログラムは Node.js とブラウザーでしか実行できませんでした。 Grain は、WebAssembly のスタンドアロン ランタイム (Wasmer、Wasmtime、および Wasm3) を使用できるようになりました。



2018 年に、Grain の開発者は、静的リンクがプロジェクトの将来の開発に不可欠であることを明確に認識していました。しかし、彼らは、エコシステム ツールを使用してこれを実行できることを望んでいました。残念ながら、適切なツールが見つからなかったため、Oscar は静的リンク フェーズを Grain コンパイラに直接埋め込むことにしました。Binaryen ツールキットを使用して静的リンクを実装するには 、これを書くのに約 600 行のコードが必要でした。 



ただし、その後、より複雑で膨大なタスクに取り組む必要がありました。つまり、ランタイムの JavaScript コードと標準ライブラリの AssemblyScript コードを純粋な Grain で書き直すことです。



グレインと AssemblyScript



TypeScript のサブセットを Wasm にコンパイルするAssemblyScriptも、WebAssembly 用に特別に細工された言語として記述されています。また、複合型 (配列や日付など) を含む標準ライブラリもあります。 Grain と同様に、AssemblyScript は Binaryen を使用して WebAssembly にコンパイルされます。 AssemblyScript は高水準言語であり、パフォーマンスが要求されるタスクを解決する際に、開発者により多くの「低水準」機能を提供することを目的としています (TS や JS と比較して)。 



ただし、AssemblyScript には追加の注釈が必要です タイプ。TypeScript と比較して、各式の型を事前に知っておく必要があるため、AssemblyScript の型推論は制限されます。これは、変数とパラメーターの宣言が注釈付きの型または初期化子でなければならないことを意味します。



Grain は厳密に型指定された言語 ( OCaml typecheckerによって提供 ) であり、注釈をほとんどまたはまったく必要としません。これは、開発者が型推論メカニズムを実装したためです。 



どこを探す?



グレイン (CLI、コンパイラ、ランタイム、および標準ライブラリとともに) は、単一のバイナリで提供されます。このバージョンは、MacOS x64Linux x64、および Windows x64 で利用できます 他のプラットフォームでは、JS バージョンの Grain コンパイラを使用できます。 穀物の



ドキュメンテーション



レポート付きのビデオ:










Macleod のクラウド サーバー 高速で安全です。



上記のリンクを使用するか、バナーをクリックして登録すると、任意の構成のサーバーをレンタルした最初の 1 か月間で 10% の割引が受けられます。






All Articles