REBOLは、データ交換言語であり、通信や分散処理に特化した
プログラミング言語です。Relative Expression Based Object Language の略で、設計者
カール・サセンラスはこれをメッセージング言語と捉えています。REBOLの主な目的は、サーバー、クライアント、それらの通信、およびストレージで利用できる言語を提供することです。
プログラミング言語とメタデータ言語の概念を統合することで、
インターネット上のあらゆるデバイス間での情報の保存、交換、処理方法を変革することを目指しています。REBOLは、人間と機械の間での情報の意味的な交換を可能にすることを目的としています。
歴史
1997年にリリースされたREBOLは、
カール・サセンラスが20年かけて設計しました。サセンラスは
AmigaOSの主要アーキテクトであり、REBOLの設計には、表示的意味論の知識に基づき、LISP、Forth、
LOGO、Selfといった
プログラミング言語の概念を取り入れました。
2000年9月には暗号化機能やODBCアクセス機能が追加されたREBOL/Commandがリリースされました。2001年4月にはグラフィックス機能を追加したREBOL/Viewがリリースされ、同年8月には拡張可能なコラボレーション環境を提供するREBOL/IOSがリリースされました。2002年12月には
ソフトウェア開発キットがリリースされています。
2012年9月、REBOL 3 (R3) がオープンソースとして公開され、同年12月には安定版がリリースされました。
ライセンスは
Apache License 2.0です。
言語としての特徴
REBOLは
インタプリタ型の高級言語であり、マルチプラットフォーム、マルチパラダイムに対応し、動的リフレクションをサポートします。コードとデータが同じ形式で表現される同図像性(Homoiconicity)を持ち、
メタプログラミングに適しています。
構造化プログラミング、関数型プログラミング、プロトタイプベースプログラミングをサポートしており、純粋関数型言語ではありませんが、
命令型プログラミングの要素も含まれています。また、純粋オブジェクト指向言語でもなく、オブジェクトでない
データ型も持ち、他の
プログラミングパラダイムもサポートしています。REBOLは特に言語指向プログラミングに適しており、方言(ダイアレクト)派生に適しています。
REBOLは動的
プログラミング言語であり、
動的型付け(値は強い型付けですが、変数はそうではありません)を採用しています。
メモリ管理にはガベージコレクションを使用し、例外処理と動的名前解決をサポートしています。
データ定義とその交換
データ交換言語としての利用を促進するため、REBOLには最小限の構文が備わっています。
文の概念はなく、構文の基本単位は式です。
キーワードは存在しません。
空白、[, ], (, ), ", {, } を区切り記号として使用します。
多くの
データ型が組み込まれており、その多くは字句形式で定義されています。
REBOLは強力な型付けを持つデータ言語であり、30以上の
データ型を標準で備えています。整数、10進数、文字列などの基本的な型に加え、
電子メールアドレス型 (
[email protected])、URL型 (http://www.rebol.com)、マークアップタグ型 (<b>, <font size="2" color="blue">)、価格型 ($100.00, USD$25.25)、日付型 (30-Nov-2005, 1-Dec-2005/10:30-7:00)、時刻型 (12:00:00)、座標対型 (5x5)、タプル型 (255.255.255, 192.168.100.1)、単語列型 (how are you?)など、プログラマ以外にも理解しやすい字句形式で識別される
データ型があります。これらの
データ型により、REBOLは効果的なデータ交換言語として機能します。REBOLにおいて値をグループ化するのに使われる主なデータ構造は「ブロック」と呼ばれ、LISPの「リスト」に似ています。
実装
REBOL
インタプリタには、/Core、/View、/Command、/Base、/Face、/Proなどのエディションがあります。執筆時点では、/Coreが/Base以外のエディションのサブセットとなっており、43のプラットフォームで利用可能です。REBOL
インタプリタのソースコードは非公開です。REBOL/CoreとREBOL/Viewで開発されたアプリケーションは有償で配布しても課金されませんが、REBOL/Proなどの拡張エディションでは
ライセンス料が必要です。これらの拡張エディションには、ODBCアクセス、
ダイナミックリンクライブラリの利用、スタンドアロンのEXEファイル生成などの機能が含まれます。
ランタイム環境は単一の実行ファイルとして提供され、REBOL/Coreは約300kB、REBOL/View(GUIエディション)は約650kBです。アプリケーションのスクリプトは通常数
キロバイト程度であるため、
インタプリタ本体とスクリプトを
フロッピーディスクに保存したり、
電子メールで送信したり、
インターネット経由で実行することが容易です。
REBOLは
インターネット上の各種プロトコルをサポートしており、
電子メールエージェントやWebアプリケーションなどの
インターネットアプリケーションを容易に開発できます。REBOL/Viewはプラットフォームに依存しないグラフィックおよびサウンドアクセスを提供し、独自のウィンドウツールキットと拡張可能なウィジェット群を備えています。これにより、分散GUIアプリケーションを容易に構築できます。また、REBOLのダイアレクティングモデルにより、軽量な
分散コンピューティングアプリケーションの開発も可能です。
REBOLコミュニティは、「REBOL desktop」を通じて繋がっています。REBOL desktopは、
インターネット上のREBOL関連ファイルをグラフィカルに表示するもので、REBOL
インタプリタに付属しています。REBOL desktop自体はオープンソースのREBOLアプリケーションです。
例
コンソールに「
Hello world|Hello_world」と表示するには、以下のように記述します。
rebol
print "
Hello world|Hello_world"
クロスプラットフォームのGUI版では、次のようになります。
rebol
view [text "
Hello world|Hello_world"]
HTTPとSMTPを使った簡単な
インターネットアプリケーションの例は次のとおりです。
rebol
REBOL [
Title: "Simple Internet App"
Date: 20-May-2024
]
url: "http://www.example.com/data.txt"
email: "
[email protected]"
content: read url
send email content
REBOLという単語で始まるヘッダ部は、
インタプリタがスクリプトの開始を認識するために必要です。ヘッダは単に `REBOL []` でも構いませんが、通常は例のように説明的な記述が推奨されます。
方言(ダイアレクト)
REBOLはコンテンツ依存言語であり、ダイアレクトと呼ばれるドメイン固有のサブ言語をサポートしています。例えば、`return`という単語の解釈は文脈によって異なります。通常、`return`は関数を完了し、呼び出し元に値を返すために使用されますが、Visual Interface Dialect (VID) では、`return`はレイアウトエンジンによって改行として解釈されます。REBOLプログラマは独自のダイアレクトを作成し、既存のREBOLの単語に別の意味を付与することができます。
ダイアレクトは、REBOLブロックを特定の方法で処理する関数として実装されるのが一般的です(文字列処理で実装される場合もあります)。他の関数でも、ネイティブのダイアレクトとREBOLで書かれたダイアレクトを識別できます。
ダイアレクトの例:
`do` ダイアレクト - REBOLの通常の `do` 関数が解釈できる(ネイティブ)。
`reduce` ダイアレクト - `do` ダイアレクトで結果を集めるように変更したもの(ネイティブ)。
`compose` ダイアレクト - `reduce` ダイアレクトで括弧だけを評価するように変更したもの(ネイティブ)。
`function spec` ダイアレクト - 関数ヘッダ記述に使われるダイアレクト(ネイティブ)。
`parse` ダイアレクト - バッカス・ナウア記法風の文法規則を記述するためのツール(ネイティブ)。
VID - GUI用ダイアレクトで、`layout`関数として実装されている(mezzanine)。
ユーザーは任意のREBOL関数を使ってダイアレクトを生成できますが、`reduce`関数と`compose`関数がよく使用され、`parse`関数はダイアレクト生成に最適化されています。`parse`関数の目的は、BNF風の形式の
Parsing Expression Grammarの構文規則を指定することでダイアレクトの解釈を与えることです。これは、yaccやBisonのような
構文解析ツールに似ています。REBOLは実行時にこれらの規則を解釈し、
構文解析中に実行すべきことも指定できます。
`parse`関数は、REBOLブロックまたはREBOL文字列を処理するために使用されます。
`parse`による文字列処理は非常に柔軟ですが、低レベルな手法であるため、手間がかかります。ブロック解析の方が簡単ですが、制限があります。ブロック解析では、REBOLは書かれている規則をREBOLの値の並びとして
字句解析します(文字列解析では文字と区切り文字として解釈します)。そのため、より抽象化された規則として記述できますが、通常のREBOLの字句形式に一致している必要があります。
構文規則
`parse`関数に解釈させる規則自体もREBOLのダイアレクトで記述します。文字列として解析する場合は、REBOLの
データ型の一部を規則に使用できます。ブロックとして解析する場合は、すべてのREBOL
データ型が使用でき、さらにダイアレクト構築を容易にする機能を利用できます。
文字列解析例
次の例は、文字列を解析して特定の単語を探し、関連するデータの一部を変数にコピーして利用するものです。この例では、文字列からコピーされた部分も文字列です。具体的には、`write`または`send`で始まる命令文の文字列を入力として、簡単な
構文解析で「何を」「誰が」「どうする」のかを把握する処理を記述します。
rebol
parse [
"write a thank-you note to john"
"send the new source code to developers"
] [
any [
"write" | "send" set what (to "to" skip) to end
]
]
print ["What:" what]
"parse string"ブロックの最後の行を見ると、`copy what`はパーサーが現在見ている位置("a"または"the"の後)からのテキストをコピーし、それを変数`what`に代入することを意味します。ダイアレクトは`to end`を指定しているので、文字列の最後までコピーします。したがって、`what`には最初の文字列では"thank-you note"、2番目の文字列では"new source code"が代入されます。
rebol
What: thank-you note
What: new source code
ブロック解析例
ファイル解析ユーティリティで、ユーザーが操作するファイルを指定し、いつ実行し、結果をどこに送り、誰に通知するかを簡単に指定したいとします。ダイアレクトは、この種のタスクに柔軟なテキストベースのインターフェースを提供できます。
ダイアレクトは複数のアイテムを許容し、語順が異なっても問題なく、可読性を高めるために人間が余分な単語を追加してもプログラムの動作に影響を与えません。
ここでは、ユーザーがアプリケーションに送るコマンドセットを2種類定義します。
rebol
parse [
[
file "data.txt" email "
[email protected]" time 10:00:00 url "http://www.example.com"
]
[
file "config.txt" time 14:00:00 url "http://www.test.com" email "
[email protected]"
]
]
[
any [
"file" set target file!
"email" set who email!
"time" set when time!
"url" set where url!
]
]
print [ "file:" target "email:" who "time:" when "url:" where]
この例では、`file`、`email`、`time`、`url`はすべてREBOLのネイティブな
データ型であり、
構文解析中にこれらの値を抽出して、直接REBOLの式に適用できます。たとえば、`who`の値は`send`関数で
電子メール送信に使用され、`target`の値は`write`関数でデータのポストに使用されます。
関連項目
Boo - 同様の用途の言語だが、共通言語基盤上で動作する。
Oz (
プログラミング言語)
Curl (プログラミング言語)
XL (
プログラミング言語) - ダイアレクティング機能を持つコンパイラ言語
外部リンク
REBOL Technologies - 公式サイト。ダウンロードあり。
REBOL Script Library - 学習用のコード例がある。
REBOL Essentials - 言語入門書
Carl Sassenrath's REBOL blog - 開発者のブログ。開発予定などがある。
Carl's Rebol 3.0 blog - 次期リリースに関するブログ。
REBOLWeek - REBOLコミュニティのニュースサイト
RIX - the Rebol IndeXer - REBOLコミュニティのニュースサイト
Rebol Programming for the Absolute Beginner - チュートリアル
Liquid Rebol - REBOLベースのデータフロー言語
RebGUI REBOL用UIフレームワーク