Streem(ストリーム)は、Rubyの開発者であるまつもとゆきひろが設計・実装した、ストリーム処理と並行処理を指向するプログラミング言語である。Unixシェルに類似したパイプラインによるデータ処理モデルを基礎とし、Ruby、Erlang、その他の関数型プログラミング言語の影響を受けている。

概要 Streemは、一般的な用途を対象とする汎用プログラミング言語ではなく、ストリームを中心としたデータ処理や並行処理を扱うことを目的として設計された。まつもとは、StreemをRubyの後継となる言語としてではなく、Rubyとは異なる設計判断を試すための特定目的言語として位置付けている。東京Ruby会議11で行われた講演では、Streemについて「汎用言語を目指さない」ことや、Rubyとは異なる設計を行うことなどが説明された。

Streemのプログラムでは、データの流れをパイプラインとして記述する。例えば、標準入力から標準出力へデータを渡す処理は、

stdin | stdout

と記述できる。これはUnixシェルにおけるパイプに類似しているが、Streemではこのデータフロー自体を言語の主要な抽象として扱う。処理系はプログラム実行後にイベントループを開始し、構築されたデータフローに従って処理を行う。

開発の経緯 Streemは、まつもとが日経Linuxで連載した「作りながら学ぶプログラミング言語」の題材として考案された。まつもとの記録によれば、2015年1月号で言語仕様を決定し、2015年2月号で実装について解説する予定で原稿を執筆した。その後、原稿で解説した部分を実装し、約300行の処理系をGitHub上で公開した。

GitHubで公開されたStreemは、公開直後にHacker NewsやRedditなどで取り上げられ、IssueやPull Requestが寄せられた。また、まつもと自身が実装を公開する前に、別の開発者によるGo実装が作られたこともまつもとの日記に記録されている。

日経Linuxでは、2015年2月号に「Streem言語の自作」、同年3月号に「Streem言語のコア実装」、同年12月号に「Streemのオブジェクト指向」などの記事が掲載された。

設計思想 Streemの設計では、ストリームを中心としたデータフローと並行処理が重視されている。まつもとはStreemを、シェルのパイプラインに類似したモデルを持つ並行スクリプト言語として説明している。

まつもとがStreemの開発を始めた背景には、マルチコア化が進む中で、Unixシェルのパイプラインが複数の処理を並行して実行できるモデルとして有用であるという考えがあった。一方、従来のシェルではプロセス生成や、パイプを通じてデータを受け渡す際の変換などにコストが生じるため、これらをより高水準の言語モデルとして扱うことが検討された。

また、StreemはRubyとは異なる設計を試すことを目的としており、関数型プログラミングの考え方やイミュータブルなデータなどを取り入れている。東京Ruby会議11の講演では、Streemが「20年の経験の反映」として設計され、関数型プログラミング的な考え方を取り入れていることが説明された。

言語仕様 ストリームとパイプライン Streemでは、ストリームをデータ処理の基本的な単位として扱う。パイプ演算子によってストリームの出力を別の処理へ接続することができる。

例えば、100個の数値を生成し、それぞれを変換して標準出力へ渡す処理を次のように記述できる。

seq(100) | map{x-> if (x % 15 == 0) "FizzBuzz" else if (x % 3 == 0) "Fizz" else if (x % 5 == 0) "Buzz" else x } | stdout

この例では、がストリームを生成し、に渡された関数が各要素を処理した後、結果がへ送られる。

関数 パイプライン内には関数オブジェクトを接続できる。関数オブジェクトがストリームに接続されると、ストリームの各要素に対して関数が呼び出される。この仕組みにより、などを用いたデータ変換をパイプラインとして表現できる。

イベントループ Streemでは、ソースコードの実行によってデータフローが構築され、その後イベントループによって実際のデータ処理が行われる。この設計により、プログラム上のデータフローと実行時の処理を分離している。

実装 Streemの処理系はC言語で実装されており、字句解析および構文解析にはFlexとBisonが使用されている。公式リポジトリでは、処理系のビルドにBison、Flex、GCCまたはClangが必要とされている。

2015年にはCodeZineでStreemのソースコードを読む連載記事が公開され、文法と構造を規定するおよびが取り上げられた。

Streemの処理系については、イベントループ、マルチスレッド、オブジェクト、抽象構文木、ローカル変数、例外処理などが解説されている。これらの設計と実装は、2016年に刊行された『まつもとゆきひろ 言語のしくみ』でも扱われている。

開発と普及 2016年5月28日に開催された東京Ruby会議11では、まつもとによるStreemについての招待講演が行われた。講演ではStreemの設計思想、言語仕様、実装などが扱われた。

2018年には、リクルートマーケティングパートナーズで「Matzゼミ」が開催され、Streemの開発経緯や設計思想が紹介されたほか、参加者がStreemの実装を変更するワークショップが行われた。

書籍 Streemの設計と実装については、まつもとゆきひろ著『まつもとゆきひろ 言語のしくみ』で詳しく解説されている。同書は2016年12月に日経BP社から刊行され、Streemを実際にデザイン・実装する過程を扱っている。

同書ではStreemについて、抽象的コンカレントプログラミング、イベントループ、マルチスレッド、オブジェクト、AST、例外処理、ソケットプログラミング、基本データ構造、NaN Boxing、ガーベージコレクション、ロックフリーアルゴリズムなどの観点から設計・実装が解説されている。

現状 Streemの公式リポジトリはGitHub上で公開されており、MITライセンスで提供されている。リポジトリには処理系のソースコードのほか、ドキュメントやサンプルプログラムなどが収録されている。

脚注

関連項目 まつもとゆきひろ Ruby Erlang 関数型プログラミング データフロー 並行計算 Unixシェル パイプ (コンピュータ)

外部リンク Streem - GitHub Streem - 東京Ruby会議11講演資料