世界を動かす技術を、日本語で。

レッドプログラミング言語

概要

  • Red は、REBOLに強く影響を受けた 次世代プログラミング言語
  • ヒューマンフレンドリーな構文多様なプログラミングパラダイム を提供。
  • 自己記述的 かつ 全スタック対応 の言語設計が特徴。
  • 単一実行ファイル でクロスプラットフォームに対応し、依存関係が不要。
  • システムプログラミングから高水準スクリプトまで 幅広く対応可能。

Red: 次世代フルスタックプログラミング言語の特徴

  • REBOL に強く影響を受けた設計思想を採用すること
  • 人間に優しい構文 を重視し、直感的なコード記述を実現すること
  • ホモアイコニック(自己記述的) な言語・データフォーマットを持つこと
  • 関数型・命令型・リアクティブ・シンボリック など複数のパラダイムを統合すること
  • プロトタイプベースオブジェクト をサポートすること
  • マルチタイピング による柔軟な型システムを実現すること
  • 強力なパターンマッチング 機能を組み込むこと
  • マクロシステム を備えること
  • 50種類以上の組み込みデータ型 を提供すること
  • 静的コンパイル・JITコンパイル(将来実装予定) によるネイティブコード生成を可能にすること
  • 正しいクロスコンパイル を実現し、異なるプラットフォーム間でのバイナリ生成を容易にすること
  • 1MB未満の実行ファイル 生成、外部依存なしで動作すること
  • アクターや並列コレクション(将来実装予定) による並行・並列処理の強力なサポート
  • Red/System DSL による低レベルシステムプログラミング機能を持つこと
  • PEGパーサDSL を組み込み、複雑なパターン解析を容易にすること
  • 高速かつコンパクトなガーベジコレクタ を搭載すること
  • クロスプラットフォームのGUIシステム、UIレイアウトDSL・描画DSLを内蔵すること
  • JVMブリッジ によるJavaとの連携をサポートすること
  • 高水準スクリプティングREPL 環境を提供すること
  • GUI/CLIコンソール を含み、ユーザーインターフェースを選択可能とすること
  • Visual Studio Codeプラグイン による開発支援機能を備えること
  • 高い組み込み性低メモリフットプリント を実現すること
  • 単一ファイル(約1MB) にツールチェーン・標準ライブラリ・REPLを全て内蔵すること(現在は一時的に2ファイル構成)
  • インストールやセットアップ不要 で即利用可能とすること
  • 「楽しい」開発体験 を保証すること

フルスタック言語としてのRedの意義

  • 「フルスタック開発者」 の概念を 言語レベル で実現すること
  • システムプログラミング から 高水準スクリプティング まで、単一構文で幅広いタスクに対応可能とすること
  • どのプラットフォームからでもどのプラットフォーム向けにも バイナリ生成を可能にすること
  • OS付属のもの以外に依存しない 単一実行ファイルでの配布を実現すること
  • システムの柔軟な再定義や拡張 を可能にし、 リテラティブなコード高性能 を両立すること
  • 「言語構築セット」 としての側面を持ち、用途ごとに適切な抽象度で開発できること

利用例・適用範囲

  • デバイスドライバシステムレベルのプログラム 開発に対応すること
  • プラットフォームネイティブなGUIアプリケーション の構築を支援すること
  • 共有ライブラリ高水準スクリプト の開発を単一言語で実現すること
  • 共通構文 で多様な抽象度のコードを書くことができること

歴史・発表

  • 2011年3月 のReBorCon 2011カンファレンスで初公開されたこと
  • 2013年7月 のRecodeカンファレンス(モントリオール)で最新プレゼンテーションが行われたこと
  • YouTube での発表動画が存在すること
  • Recode 2013プレゼン資料(PDF) や過去のカンファレンス資料(SFD 2011, ReBor 2011)が参照可能なこと

まとめ

  • Red は、 全スタック対応自己記述的高性能単一ファイル配布 という特徴を持つ、 革新的な次世代プログラミング言語 であること
  • 幅広いプログラミング領域 で活用できる柔軟性と拡張性を追求すること
  • 今後の開発ロードマップコミュニティ活動 にも注目すること

Hackerたちの意見

これはREBOLの後継で、Amigaのカーネルを設計したカール・サッセンラートがデザインしたものだよ。何度か見たことがあるけど、すごく面白い。だけど、1行も書いたことはないんだ。

「1988年、サッセンラートはシリコンバレーを離れ、サンフランシスコの北2時間にあるウキアバレーの山に移住しました。そこから、Pantaray、American Multimedia、VideoStreamなどのマルチメディア技術会社を設立しました。また、AmigaのためにLogoプログラミング言語を実装し、CDTVのソフトウェアOS開発を管理しました。CDTVは初期のCD-ROMテレビセットトップボックスの一つです。そして、インターネットテレビセットトップボックスの一つであるVisicorp EdのOSも作成しました。」なんて伝説的な人なんだ!

一度、シンプルなウェブスクレイパーと画像ダウンローダーを作るために使ったことがあって、それにはすごく良く働いたよ。その言語にぴったりだった。(それはREBOLで、REDじゃなくて、かなり昔の話。)正直、今はPythonでやっちゃうけど、面白さはないけどね。

20年くらい前に、仕事でマネージャーのためにいくつかの作業を自動化する小さなアプリをREBOLで作ったことがあるんだ。結構いい感じだけど、これで何か大きなものを書く気にはなれないかな。

どうやって見つけたかは覚えてないけど、REBOLは25年くらい前に学んだ最初のプログラミング言語の一つだったんだ。個人プロジェクトのほとんどは今でもそれで書いてるよ。Redに変換することはまだ試してないけど。

変な暗号通貨関連のことをやり始めた時点で、もうダメだと思ったよ。いつか1.0のリリースにたどり着いてほしいな。

同じく。ICOの話をし始めてからは、ブロックチェーン関連のダイアレクトに集中しすぎて、定期的にフォローするのをやめちゃった。レッドシステム言語、通常のスクリプト言語、クロスプラットフォームのGUI、ネイティブ実行ファイルを持つアイデアは本当にクールだったけどね。2015年頃に興味を持ってたのを覚えてるから、今どうなってるのか気になる。プロジェクトがすごく野心的なのは分かってるけど、ほとんどの人が実用的だと考える段階にどれくらい近づいてるのかな。

面白いね、これで少しはなぜこうなるのか説明できる。https://i.imgur.com/a/phd4lVr

これは俺が絶対に学べなかったプログラミング言語だわ。何も理解できなくて、裏で何が起こってるのか全くイメージできない。

これはリスプだけど、括弧の代わりに角括弧を使ってる感じだね(それに、標準ライブラリにGUIライブラリみたいなランダムなものがたくさんある?)

大学の時にREBOLについての論文を書いたことがあるよ。すごく面白いけど、文法は確かに変わってる。関数呼び出しの文法はForthっぽいけど、トークンの順番が逆になってる感じ。だからリスプみたいだけど、括弧が必須じゃない。例えば、send friend@rebol.com read http://www.cnn.comっていう例だと、readは1つの引数を取ることを知ってて、sendは2つの引数を取ることを知ってるから、結局は(send friend@rebol.com (read http://www.cnn.com))みたいにグループ化される(これは有効な文法だと思うけど、そのASTノードは「括弧」と呼ばれる)。不思議なことに、この言語にはちょっと場違いなインフィックス演算子もあるんだ。'parser'[1]がどう動いてるのか全く分からないよ。[1] 'parsing'はすごく遅く行われるから、そう呼ぶのが変な感じがする。配列を評価可能な式の表現として扱って評価する方法を知っているもの。

これが俺が絶対に学べなかった唯一のプログラミング言語だ。Urbitのことを聞いて、これを見てみて: https://developers.urbit.org/overview/nock

ああ、これは1977-79年にIntermetricsがDoDの高次言語作業部会のSteelman要件を満たすために設計したRed Languageのことじゃないんだね…(結局Green Languageが勝ってAdaとして知られるようになった)。誰かがDoDのRed言語の仕様をオンラインに載せたのかと思ったんだけど、実際にあったね: https://iment.com/maida/computer/redref/

プログラミング言語のサイトを見るとき、特に「新しい」言語の場合は、適切にサイズが整ったコードサンプルにすぐにアクセスできる方法が欲しいんだ。理想的にはドキュメント付きで、言語の重要な特徴や慣用的な構文、使用パターンを示しているやつね… これをうまくやってるサイト(思いつくままに): https://odin-lang.org/ すぐにコードサンプルが見える「フルデモを見る」 「もっと例を見る」 https://ziglang.org/ すぐにコードサンプルが見えて、少しスクロールすると「もっとコードサンプル」 ここでred-lang.orgを見てみると… 意味のあるコードの連続した塊をほとんど見つけられない…?「はじめに」 いいえ 「ドキュメント」 いいえ 「公式ドキュメント」 githubへのリンク https://github.com/red/docs/blob/master/en/SUMMARY.adoc 「ホーム」は単に時系列で並べられたブログで、最新のエントリーが偶然にもマルチモニターサポートを見せる50行の「スクリプト」にリンクしてる(あんまり役に立つサンプルじゃないみたい)?

https://www.red-by-example.org/ を見ることができるけど、CarlがRebolのために書いたような完全なマニュアルを書いてくれた人はいないし、言語はRebolの部分的な実装で、最終的にはRedでブートストラップしなきゃいけないハイブリッドなRebol/Red構文なんだ。要するに、その周りに足場があって、もしプロジェクトのファンでも開発者でもないなら、全然価値がないってことだね。

昔は、言語が1.0に達したらちゃんとしたドキュメントとかが出るって約束してたんだよね。でもそれから7年経った今、言語は0.6.6のままだし、ドキュメントの状態も7年前(いや、10年前)と全く変わってない。言語に関わってるのはせいぜい2人で、しかもどっちも時間がないし、ドキュメントのアプローチもめちゃくちゃなんだよね(長いGoogleドキュメントやPastebinの説明を投稿するけど、ちゃんとしたドキュメントは全然ないって感じ)。

DSLを作ることを奨励する言語は二面性があるよね。一方では、使い方により明確で微調整された言語を作れる。もう一方では、サポートのないアドホックな言語を維持しなきゃいけない(他の誰かが事前にそのDSLを知っているとは期待できないから)。歳を重ねるにつれて、よく設計されたAPIがよく知られた言語である方がDSLよりも良い選択肢だと判断するようになった。

APIもまたDSLの一種だよ。

DSLが嫌いになってきた。稀に例外はあるけど、ほとんどのDSLは親言語のもろいサブセットになっちゃってる。

DSLのアイデアは好きだけど、実際のプロジェクトでは同僚が導入したほとんどのDSLが嫌いだ。

同感だよ。最近のプログラミング言語は、ツールがたくさんあって、DSLやDSLに近いAPIは、ホスト言語のツールが提供するパターンを本当に活用しない限り、大きなギャップがあるよね。最近、同僚の作ったミニ言語と関数実行エンジンを使うことになったんだけど、ほぼミニプログラミング言語みたいなもので、デバッガーも型チェッカーもスタックトレースもなくて、ホスト言語を使って「ネイティブ」に実行していれば得られたであろう、他の便利な機能も全然なかったんだ。とはいえ、大きな言語のツールが増えていく一方で、昔のツールを作るハードルは下がっているよね。今のLSPツールのおかげで。いつか、ライブラリにいいツールがあって、開発の手間がかからない言語が出てくるかもしれないし、その時にはDSLに対する見方も変わるかもしれないね。

APIはインターフェースのことで、メタプログラミングはコードをデータとして扱うことでこういったインターフェースを構築するための技術なんだ。これらは同じ意味ではないよ。メタプログラミングは、普通のプログラミングで複雑すぎてメンテナンスが難しいコードができちゃったり、言語の実装のせいで何かを達成できないときに役立つんだ。アプリケーションのロジックを表現するのがすごく簡単になることがあるよ。例えば、SQLみたいな外国のプログラミング言語とやり取りしたり、データからコードを生成したりする時ね。まともなメタプログラミングの仕組みなら、マクロ展開みたいなことができて、現在のコンテキストでメタプログラミングがコンパイルされるコードを見ることができるんだ。

これはすごく大事な教訓だね。GradleやFastlaneで使われてたDSLの名前を思い出すと、イライラしたのを覚えてるよ。特にGradleは頻繁に変わってたから、ドキュメントもあんまり役に立たなかったし、ツールからのサポートもゼロだったしね。

Lispでは、すべてのプログラムがDSLになるって聞いたんだけど、マジ?

大きくて成功しているプロジェクトのDSLでも、ほとんどの場合はイマイチだよね。もしSQLよりも良いクエリ言語を作れると思ってるなら、お願いだからやめてくれ。JQL、Elastic Query DSL、KQL…ほんとにやめて。

ClojureコミュニティがDSLについてどう考えているかを見ているのは面白いね。ClojureはLispの一種で、LispはDSLを作ることで有名だよね。特にPGのいろんな論文がそれを一種のスーパーパワーとして推進した後はね。Clojureは逆の方向に進んでいて、マクロはサポートしてるけど、他の方法を試してからじゃないと使わない方がいいって感じだよ。でも、Clojureのネイティブなデータ構造から作られたDSLは推奨してるんだ。例えば、HTML生成のためのHiccupみたいにね。

これについてずっと考えてるんだ。DSLは重要な問題を解決するけど、方向性が間違ってると思う。客観的な事実を書くのは不可能だよね。私たちが書くものは、表現される文脈に影響されるし、使う文法もその一部だし。DSLはその文法をその場で作れるようにしてくれるけど、問題は、既に書いている文脈から抜け出すのには役立たないってことなんだ。新しい文脈に入ることはできるけど、それは入れ子になってるだけ。じゃあ、実際に抜け出せたらどうなるんだろう?書いている文脈の外から書けたら?それが今考えているアイデアなんだ。可能だと思うけど、すごく抽象的なアイデアだから、掴むのが難しいんだよね。

何度かRebolを試してみたことがあるんだ。いい言語だと思う。Redのことも早い段階で知って、追いかけて少し試してみたけど、他の人が言ってるように、開発作業を資金調達するために暗号通貨に移行したのが俺には合わなかった。お金を稼ぐこと自体は悪くないし、たくさん稼いでもらってもいいと思うけど、暗号通貨をその手段にするのには共感できなかった。そういう方向に行ってしまったのは残念だね。

つまり、REBOLとRedは基本的にFexprベースのLispってことだよね?彼らは自分たちをそう説明することはないけど(代わりに定義スコープとかの用語を使ってる)、結局は非厳密なFexprベースのLispみたいなもんだよね(Kernelのvau計算の軽量版みたいな)。

Redでは関数が引数を評価するかどうか決められないと思う。もっとLogoに近い感じで、関数は固定の引数の数を持ってるから、呼び出しを区切る必要がないし、リスト(「ブロック」)は常に引用されるから、明示的に評価する必要があるんだ。

ここに[0]、どんな感じかの例があるよ。見つけるのにちょっと掘り下げる必要があったけど、もっと目立つべきだと思う。すごくエレガントだよ!何が起こってるのか全部は理解できないけど、構文のビジュアルだけでも興味深いね。[0] https://github.com/red/code/blob/master/Scripts/clock.red

この特定のコーディング例は見た目がいいと思う。なんか美的に心地よいんだよね。でも君と同じでその言語は知らないから、これがその言語を知ってる開発者にとって関数の動作や暗黙の使用契約(つまり関数の型)を理解するのに明確にしてるのか疑問なんだ。おそらくそうだと思うけど、JSやPythonの例と比べてこれらのことがわかるはずだと思う。でもその仮定が正しいなら、Redの「見た目」がすごく気に入ってる。

誰かがXMLからデータベースへのETL製品を作ったみたいだね。https://redata.dev/smartxml/ もししっかりしてるなら、かなり面白そうだね。

もしかしたら自分の慣れ親しんだものに基づく偏見かもしれないけど、その構文があんまり好きじゃないんだ。少なくとも直感的には全然理解できない。見つけられるいくつかの例を見てみると、特定のトークンが何なのかを理解するために、周りの文脈をたくさん見て解釈しないといけないみたいで、例えば関数名とか変数、関数への引数、その引数がどの関数に対するものか、変数の型、代入される値とかね。コードの行がただいくつかの文字列が並んでるだけで、全然句読点がないのもよく見るよ。