| パラダイム | マルチパラダイム:オブジェクト指向(クラスベース)、手続き型(命令型)、 構造化 |
|---|---|
| デザイン: | サイモン・C・ナッシュ(IBM) |
| 初登場 | 1988年 |
| 安定版リリース | 5.0.0 / 2023年5月10日 |
| プレビューリリース | 5.1.0
|
| タイピングの規律 | 動的 |
| メモリ管理 | ガベージコレクション |
| 実装言語 | C++ |
| プラットフォーム | IA-32、x86-64、ARM、s390x |
| OS | クロスプラットフォーム: Linux、Microsoft Windows、macOS、Solaris、OpenIndiana、 AIX、FreeBSD、OS/2 |
| ライセンス | CPL 1.0、GPLv2 |
| ファイル名拡張子 | .rxs、.rex、.rexx、.cls、.orx、.rexg、.rexp |
| Webサイト | 詳しくはこちら |
| 主な実装 | |
| Object REXX (2004 年まで) ooRexx (2005 年以降) | |
| 影響を受けた | |
| Rexx、スモールトーク | |
| 影響を受けた | |
| ネットレックス | |
Object REXXは、高水準、汎用、解釈型、オブジェクト指向(クラスベース)プログラミング言語です。現在、この言語は一般に ooRexx (「Open Object Rexx」の略) と呼ばれており、Object REXX の直接的なオープンソースの後継としてメンテナンスされています。
これは、 Rexxプログラミング言語 (「Classic Rexx」と呼ばれることが多い)の後継で、大幅な拡張です。すべての機能と構文を保持しながら、完全なオブジェクト指向プログラミング (OOP) 機能とその他の新しい拡張機能が追加されています。Classic Rexx の影響を受けて、ooRexx は簡単に学習、使用、および保守できるように設計されています。基本的に、「情報技術 - プログラミング言語 REXX」ANSI X3.274-1996 [1]標準に準拠しているため、他の準拠した Rexx 実装とのクロスプラットフォームの相互運用性が保証されます。したがって、Classic Rexx プログラムは通常、変更なしで ooRexx で実行されます。
また、Kilowatt Softwareによって開発されたRexx Object Oriented (“roo!”)もあり、これはClassic Rexxのメンテナンスされていないオブジェクト指向実装です。[2]
歴史
1988年、 IBMの「Oryx」プロジェクトは、Simon C. Nashの技術指導の下、Classic RexxをSmalltalkのオブジェクトモデルと統合する実験を行った。[3] [4]このプロジェクトの目的は、互換性を保ちながらOOPの利点をClassic Rexxに移行し、Classic Rexxの使いやすさをOOPに移行することだった。[5]当初、プロジェクトでは、すべてをオブジェクトとして扱うこと、オブジェクトベースのカプセル化とメッセージパッシング、オブジェクトベースの並行性、クラスと継承などのOOPの側面に重点が置かれていた。[6]

この初期の作業は、後にリック・マグワイアの指揮の下、1992年に発表されたObject REXXの最初のプロトタイプに繋がりました。 1994年にIBMは、次期バージョンのOS/2で、Object REXXがClassic Rexxに代わる標準REXXインタープリターになると発表しました。 [4] 1996年に、Object REXX [a]はOS/2 Warp 4オペレーティングシステムの一部としてリリースされました。 [7] 1997年には、Windows 95、Windows NT、Linux用のバージョンが続きました。[8] [9] 1999年には、 AIX V4.1.5以降用のObject REXXバージョンがリリースされました。 [10] 2000年には、 zLinuxおよびSun/Solaris用のバージョンが続きました。Windows 2000、Windows Me、Windows 98、Windows NT 4.0では、Object REXXの最後のメジャーアップデートが2001年にリリースされました。[11]

2004年10月12日、IBMはObject REXXの開発中止を発表し、ソースコードとライセンス権[b]を非営利のSpecial Interest Group (SIG)であるRexx Language Association (RexxLA)に譲渡した。IBMがオープンソースとしてリリースしたコードには、 OS/2のWorkplace Shell (WPS)のオブジェクトフレームワークとして知られるIBM System Object Model (SOM)のクラスは含まれていなかった。[12] IBMは1997年にSOMの開発を中止したが、それは今でもOS/2の基本的なフレームワークである。[13] OS/2版のObject REXXには、SOMとWPSをサポートするクラスが含まれている。[14] [15]これらはOS/2の最初の後継製品であるeComStationに含まれており、IBMのオリジナルのObject REXXインタープリターが引き続き利用できる現在の後継製品であるArcaOSにも含まれている。[16]
2005年、RexxLAは、Object REXXの新しいバージョンであるooRexxを、 Common Public Licenseの下で無料のオープンソースソフトウェアとしてリリースしました。[17]この最初のバージョンのooRexx 3.0.0は、可読性を高めるために、元のIBMソースコードと比較して大幅にリファクタリングされています。その後、ooRexxカーネルは純粋なC++で書き直され、新しいアーキテクチャとネイティブインターフェイスがRick McGuireの技術指導の下で設計および実装されました。この作業により、RexxLAは2009年に64ビットをサポートするooRexx 4.0.0をリリースすることができました。今日まで、RexxLAはooRexxだけでなく、Classic Rexx( Regina)とNetRexxの開発、サポート、保守を続けています。さらに、RexxLAは国際シンポジウムを毎年開催しています。[18]
リリース
次の表には、Object REXX および ooRexx インタープリタの主要なバージョンの注目すべき機能と変更点が記載されています。すべての ooRexx リリースと必要なドキュメントは Sourceforge で無料で入手できます。[19] [20] Arch Linux ベースのディストリビューションでは、現在のバージョンと開発バージョンがArch User Repositoryとして入手できます。バージョン 5.0.0 以降では、インストールしなくても使用できるインタープリタのポータブル バージョンがあり、OS/2 への非公式ポートも存在します。Intellij IDEAでは、ooRexxPluginによって、構文の強調表示、構文チェック、コード補完、注釈を使用したJavadocをモデルにしたドキュメント サポートが追加されます。[21]
デザイン哲学
ooRexxはClassic Rexxの設計哲学を踏襲し、学習、コーディング、記憶、保守が容易な「人間中心」のプログラミング言語を作成しています。これは、言語を小さく保ち、驚きを最小にする原則に従うことで部分的に実現されています。[2] [29]大文字と小文字を区別せず、自由形式で、句読点をできるだけ少なくし、わかりやすい英語の命令を使用することで、読みやすい構文が実現されています。[29]さらに、柔軟性を提供し、言語の制約ではなく開発に集中できる 動的プログラミング言語です。
Classic Rexxの「実装前のドキュメント作成」設計原則に従い、ooRexxはIBMスタイルガイドに準拠した構文図や例を含む包括的なドキュメントを提供しています。[29] [30]
説明書
Classic Rexxと同様に、代入命令、キーワード命令、コマンド命令がある。言語を小さく保ちたいという要望に沿って、ooRexx 5.0.0には30のキーワード命令しかない。[30]他の多くの言語とは異なり、キーワードは予約されていないため、予約語の長いリストを記憶する必要はありません。[31]命令が代入でもキーワード命令でもない場合は、文字列リテラルまたは有効な式でなければならず、コマンド命令と見なされ、インタープリターは文字列をオペレーティングシステムに渡して実行し、戻りRCコードの変数を設定します。 さらに、この命令により、 Bourne Shell、Bash、Z-Shell、コマンドプロンプトADDRESSなどの特定のコマンド環境、 ISPF、TSO EDIT、XEDITとその適応を含む一部のエディターにコマンドをリダイレクトしたり、エラーを傍受したりすることができます。
a = "hello world" /* 代入命令 */
do i = 1 to 2 /* キーワード命令 "DO" */
say "round #" i ":" a /* キーワード命令 "SAY" */
end /* キーワード命令 "END" */
"echo Hello World" /* オペレーティング システムへのコマンド */
「RC:」と言うrc /* コマンドの数値戻りコード */
Classic Rexx の 3 つの命令タイプに加えて、ooRexx はプログラムの末尾に配置する必要があるディレクティブ[c]命令を追加します。ロードと構文チェックの後、インタープリタは定義されたすべてのディレクティブを実行して、プログラムの実行環境をセットアップしてから、次の命令を実行します。ディレクティブは、ルーチン、クラス、メソッド、属性、または算術で使用する桁数などの実行オプションを定義するために使用できます。ディレクティブ命令を簡単に認識できるように、連続した 2 つのコロン ( ::) で始まります。[30]
コードの再利用性を高めるために、::REQUIRESディレクティブは別の Rexx プログラム (パッケージとも呼ばれる) または外部 (ネイティブ) ライブラリの統合を許可します。 このディレクティブにより、インタープリタは、PUBLIC指定された Rexx プログラム (パッケージ) のオプションを指定するすべてのルーチンとクラスに直接アクセスできるようになります。 外部パッケージは通常、ファイル拡張子 を使用します.cls(例:::requires "csvstream.cls"または::requires "json.cls")。 一部の外部パッケージとライブラリは、ooRexx インタープリタとともに配信されます。
自由形式
ooRexx は、プログラムコードの位置が関係ない自由形式の構文を持ち、高い柔軟性を実現しています。実行前に、インタープリタは引用符で囲まれていない複数の空白を 1 つにマージしますが、引用符 (一重引用符または二重引用符) で囲まれた文字列は変更されません。連結は、2 つの縦棒 ( ||) で明示的に要求することも、スペースで区切ったり、隣接する用語によって暗黙的に要求することもできます。オプションで、カンマ ( ,) またはマイナス記号 ( ) を継続文字として使用して、節を複数行に分散したり、セミコロン ( )-で区切って 1 行に複数の節を使用したりできます。 [30]自由形式の言語は柔軟性があり、考慮すべき構文規則が少ないため、固有の認知負荷が軽減され、学習の労力が軽減されると考えられています。[32];
「Hello World!」と言う/* 出力: Hello World! */
「これは」と言う- /* 継続のための末尾のダッシュ */
"REXX" || "!" /* 出力: これは REXX です! */
大文字と小文字を区別しない
Classic Rexxと同様に、ooRexxは大文字と小文字を区別しないプログラミング言語です。インタープリタは引用符の外側にあるすべての文字を大文字にして実行します。大文字と小文字を区別する必要がないため、学習する必要のある追加の詳細が少なくなり、イライラする構文エラーを回避できます。[32]
a = 「これは REXX です!」
Say A /* 出力: これは REXX です! */
SAY a /* 出力: これは REXX です! */
すべてはオブジェクトである
Classic Rexx は「すべてが文字列」という哲学に従い、文字列を唯一のデータ型としていますが、ooRexx は配列、ストリームなどの非文字列オブジェクトも含め、すべてをオブジェクトと見なします。オブジェクトは、従来の関数ではなくメソッドを使用して操作されます。
ooRexxでは、文字列変数は文字列オブジェクトへの参照であり、宣言する必要がないため、厳密に型付けされた言語と比較してプログラマーの労力が軽減されます。[33]文字列オブジェクトは任意の長さにすることができ、数値を含む任意の文字を含めることができます。したがって、文字列操作とクラスのメソッドを使用して数値を変更することができますString。さらに、文字列変数には、キーワード命令を使用して評価または実行できる実行可能命令を含む、任意のタイプの式を含めることができますINTERPRET。[30]
a = 2 /* 数値を持つ文字列 */
a = a || '0' /* 結果の文字列: 20 */
str = "do i = 1 to " a "; say i; end" /* 文字列にはループ命令が含まれています */
strを解釈/* 文字列を解釈: 20 までカウントします */
メッセージパラダイム
Smalltalk でAlan Kayが実装したメッセージング パラダイムと同様に、ooRexx のすべては通信可能なオブジェクトです。オブジェクトを生き物のように扱うという概念は、初心者が OOP の概念を学ぶのに役立ちます。[31] Smalltalk とは対照的に、明示的なメッセージ演算子であるチルダ ( ~) があり、受信オブジェクトはその左側に配置され、操作の結果が返されます。メッセージを送信すると、対応するメソッド名を持つメソッドがアクティブになり、受信オブジェクトが操作されます。Smalltalk と同様に、ooRexx メッセージは、チルダ ( ~~) を 1 つではなく 2 つ使用することでカスケード化でき、生成された結果ではなく、メソッドを受信したオブジェクトが返されます。[34]
ほとんどのメソッドのデフォルトの動作は、オプションを指定することで変更できます。オプションは、スペルアウトまたは省略形のいずれかで指定でき、大文字と小文字は区別されません。コードを読むときに、これにより文字通りの理解が可能になり、省略形の意味を学ぶ必要がないため、初心者の学習労力が軽減されます。[32]たとえば、名前のメソッドは、stripデフォルトで先頭と末尾の空白を削除します。この動作は、たとえば、"leading"またはを"l"オプションとして指定することで変更できます。Classic Rexxでは関数がネストされていますが、ooRexxではメッセージをチェーン化できるため、ステートメントの読みやすさが向上します。[31]
a = " 私は ooRexx です!"
say a /* 出力: 私は ooRexx です! */
say a ~ Strip ( "Leading" ) /* 出力: I am ooRexx! */
say a ~ strip ( "l" ) ~逆/* 出力: !xxeRoo ma I */
クロスプラットフォームの相互運用性
ooRexx はClassic Rexx のすべての機能を保持するように設計されており、基本的に Rexx 言語の ANSI 標準 (X3.274-1996、「プログラミング言語 REXX」) に準拠しています。[1] ANSI 標準のオプション仕様とは対照的に、ooRexxでは@、記号に#、$、などの文字は使用できません¢。Classic Rexx では、式に のデフォルト値が割り当てられますb. = a.が、インタープリタはのエイリアスを作成します。さらに、ooRexxでは、をコメント マークとして、 を行継続として使用できますが、これらは標準では指定されていません。[1]b.a.b.a.---
クラシックRexxスクリプトは通常、ooRexxで変更なしで実行されるため、元のコードに費やした時間を維持しながら、必要な速度でOOP機能に簡単に移行できます。[2]インタープリタは多数のプラットフォームをサポートしているため、これらのプラットフォームへのコード移行も可能です。
特徴
何よりも、ooRexxはサブクラス化、ポリモーフィズム、データのカプセル化、ミックスインクラスによる多重継承などのOOP機能を提供します。インタープリタにはユーティリティが含まれており、ooRexxプログラムをコンパイルし、オプションで結果をbase64としてエンコードすることができます。base64はソースのないファイルであり、初期の解析とコンパイルがすでに完了しているため、起動が速くなります。[34] rexxc
解析
キーワードPARSE命令を使用すると、文字列を迅速かつ柔軟に解析し、その一部を 1 つのステップで変数に割り当てることができます。[2]後続の命令は、文字列のソースを指定するために使用されます。たとえば、ARGプログラムまたは関数が呼び出されたときにリストされる引数、VAR変数、PULLデータ キューまたは標準入力 (通常はキーボード)、VALUE任意の式などです。 を使用する場合VALUE、WITHキーワードは式の終わりを指定し、その後に解析パターンを指定する必要があります。このパターンは、変数のリスト、位置番号、またはリテラル区切り文字にすることができ、これらのパターンを組み合わせて使用できます。オプションで、解析前に文字列の大文字と小文字を変換できます。[30]
str = "人物: リック・マグワイア"
/* リテラル「:」と単語間の空白を使用して文字列を解析します
変数 a ("Person")、b ("Rick")、c ("McGuire") に代入します */
parse var str a ":" b c /* リテラルと空白で解析 */
say b c /* 出力: Rick McGuire */
手順と機能
ooRexx は、ディレクティブを使用して、特定のクラスに固有ではないプロシージャと関数を定義する新しい方法を提供します::ROUTINE。このCALL命令は、ルーチンをプロシージャとして呼び出すために使用できます。さらに、RETURNキーワード命令を介して値を返すルーチンは、ルーチン名の後に括弧を指定して関数呼び出しを使用して呼び出すことができます。括弧内の内容は、ルーチンに引数として渡されます。このPARSE命令を使用して、受け取った引数を解析し、変数に割り当てることができます。[30]
call DoSomething /* "CALL" キーワード命令 */
Sum = myFunction ( "2" , "4" ) /* 関数呼び出し */
say Sum /* 出力: 6 */
:: Routine DoSomething /* "ROUTINE" ディレクティブ (プロシージャ) */
「何かやったよ!」と言う/* 出力: 何かやったよ! */
::ルーチン myFunction /* "ROUTINE" ディレクティブ (関数) */
parse arg FirstVar 、 SecondVar /* 変数に引数を割り当てる */
Sum = FirstVar + SecondVar /* 計算を行う */
return Sum /* "RETURN" 結果 */
クラスとメソッド
ディレクティブ::CLASSの後にクラス名を続けると、インタープリタは新しいクラスを定義します。クラス名の後にMETACLASS、、、、などのオプションを設定して、 OOP 機能を使用できます。ディレクティブは、最後のディレクティブに関連付けられた新しいクラスメソッドを定義するために使用できます。ディレクティブは、オブジェクト変数を取得または割り当てることができるアクセサメソッドを定義するために使用されます。命令を使用すると、SUBCLASSオブジェクト変数をメソッドに直接公開できます。[30]MIXINCLASSABSTRACTINHERIT::METHOD::CLASS::ATTRIBUTEEXPOSE
d = . dog ~ new ( "Bella" ) /* 犬を作成して割り当てる */
d ~ bark /* bark メッセージを送信する */
say d ~ name /* 出力: Bella */
:: class dog /* クラスディレクティブ */
::属性 名/* 属性ディレクティブ */
::メソッド init /* オブジェクト初期化メソッド */
名前を公開する/* 犬の名前を公開する */
引数名を解析/* 名前に「Bella」を割り当てます */
::メソッド バーク/* メソッド ディレクティブ */
名前
を公開 名前を「ワンワン!」と言う/* 出力: ベラがワンワン! */
マルチスレッド
概念的には、ooRexx はオブジェクトベースの並行性を提供します。これによれば、オブジェクトはメソッドを実行するための独立したリソースを持ち、メッセージングパラダイムを使用して互いに通信できます。複数のオブジェクトが同時にアクティブになり、同期のためにメッセージを交換できます。[30]並行性はREPLY、キーワード命令を使用して実現できます。これにより、メソッドから早期に戻り、残りのメソッドが新しいスレッドで実行され続けます。または、キーワード命令をGUARD使用してメソッドを非保護としてマークし、同じクラスの他のメソッドと一緒に実行できるようにすることもできます。最後に、STARTメソッド (Object または Message クラス) を使用すると、受信者は受信したメッセージを別のスレッドで処理するため、並行性も有効になります。[30]
トレース
Classic Rexx と同様に、TRACEキーワード ステートメントと組み込みTRACE()関数によってデバッグが容易になります。どちらも詳細レベルを制御でき、実行時に対話型デバッグが可能になります。[35]対話型デバッグでは、インタープリタはトレースされたほとんどの命令の後に一時停止します。[30] ooRexx 5.1.0 ではTraceObject、タイムスタンプ、インタープリタ インスタンス、メッセージがディスパッチされるスレッド ID、マルチスレッド プログラムをトレースするためのガード ロックの状態などの追加情報を提供するクラスが導入されました。このクラスにより、現在ガードされブロックされているメソッドを簡単に特定できます。[35]
組み込み関数とクラス
ooRexxはClassic Rexxとの互換性を目指しているため、従来の組み込み関数も引き続き利用可能です。[34]リリース5.0.0では、文字操作、変換、情報関数など82の組み込み関数が提供されており、その多くはクラスのメソッドを呼び出しますString。さらに、組み込みのダイナミックリンクライブラリRexxUtilは、システムファイル、ディレクトリ、クラス、オブジェクトを操作するための29のクロスプラットフォーム関数、25のWindows固有関数、4つのUnix固有関数を提供します。[30]
オブジェクト指向のルーツに従い、ooRexx は組み込みクラスとメソッドを通じてほとんどの機能を提供します。ooRexx 5.0.0 には合計 57 個の組み込みクラスが付属しており、これらは Fundamental、Stream、Collection、Utility のクラス グループに分かれています。[30]
基礎クラス
基本クラスは、他のすべてのクラスの基本的な構成要素です。クラスはクラス階層Objectのルートであるため、そのメソッドと属性は、各クラスのインスタンス化されたすべてのオブジェクトで使用できます。 クラス(別名メタクラス)は、クラスのプロパティ(メソッドオブジェクトなど)を維持するために使用され、インスタンス(別名オブジェクト、値)の作成に使用されます。したがって、このクラスのインスタンス(別名クラスオブジェクト)は、各ディレクティブに対して作成されます。[30]クラスとクラスの目的は、メソッドまたはルーチンオブジェクトを作成することです。クラス は、論理演算、連結、コピー、結合、分割、反転、算術、変換など、文字列を処理するためのメソッドを提供します。[34]クラスインスタンスには、作成されたすべてのルーチン、クラス、およびメソッドが含まれ、ディレクティブによって参照される外部依存関係を管理します。クラスは、メッセージの非同期送信を可能にし、メソッドの同時実行を可能にします。[30] [34]Class::CLASSMethodRoutineStringPackage::REQUIRESMessage
ストリームクラス
ストリームクラスは、ファイル、キュー、シリアルインターフェース、デバイスなどの外部オブジェクトとの通信を容易にします。クラス自体は継承可能なミックスインクラスであり、、クラスStreamのサブクラスです。[30]InputOutputStreamInputStream,OutputStream
このStreamクラスは、ストリームを開く、読む、書く、閉じる、バッファをフラッシュする、ファイルの場所を設定する、情報を取得する、その他のストリーム関連の操作を行うメソッドを提供します。OPENメソッドはストリームを開いている間に、ARRAYINその内容を配列オブジェクトに読み込むために使用できます。メソッドは、ストリームオブジェクトがガベージコレクターCLOSEによって回収される前に、ストリームを明示的に閉じます。[30] [34]
StreamObj = .stream ~ new ( "someFile.txt" ) /* ストリームオブジェクトを作成 * /
StreamObj ~ open /* ストリームを開く */
FileContent = StreamObj ~ ArrayIn /* コンテンツを読み取る */
StreamObj ~ close /* ストリームを閉じる */
say FileContent /* コンテンツを出力します */
コレクションクラス
ATコレクションは、またはメソッドを使用してアイテムを取得できるようにする関連インデックスを持つ複数のアイテムを含むオブジェクトです[]。MapCollection、SetCollection、OrderedCollectionクラスがあり、これらはすべて特定のコレクション型を操作できます。[34]
MapCollection は、インデックスから値にマップするすべてのコレクションによって実装される基本的なメソッド セットを定義するミックスイン クラスです。、、、、、およびクラスDirectoryはこれらのメソッドを継承します。[30] Directory または StringTable オブジェクトは、一意の文字列インデックスのコレクションです。IdentityTable オブジェクトでは、各項目は 1 つのインデックスに関連付けられ、各インデックスには 1 つの項目しか存在できません。Properties オブジェクトは、プロパティをファイルに保存および読み込むための特定のメソッドを提供します。重複するインデックスを含めることができない Table オブジェクトとは異なり、Relation オブジェクトは、任意のオブジェクト タイプにすることができる同じインデックスを持つ要素を持つことができるコレクションです。
StringTableIdentityTablePropertiesTableRelationStem
Stemオブジェクトは、複合変数が使用されると自動的に作成されます。Classic Rexxと同様に、このような変数は、ドット( )で区切られたステムとテールで構成されます。ステムは文字で始まる必要がありますが、テールは任意の文字にすることができます。単一の数値テールを使用すると配列.と同じ効果が得られ、複数の数値テールを使用すると多次元配列を作成できます。[30] [34]
果物. 1 = "Apple" /* ステム変数に代入 */
果物. 4 = "オレンジ" /* ステム変数に代入 */
果物と言う。4 /* 出力: オレンジ */
果物と言う。[ 1 ] /* 出力: Apple */
SetCollectionsはMapCollectionsの特殊なタイプで、インデックスと要素は同じオブジェクトです。オブジェクト内のインデックスはSet一意ですが、オブジェクト内の各インデックスはBag複数回出現することがあります。[30]
ListOrderedCollection は、、、QueueクラスCircularQueueなど、固有のインデックス順序を持つすべてのコレクションの基本メソッドを定義するミックスイン クラスですArray。List オブジェクトを使用すると、新しいインデックスが作成された新しいアイテムをコレクション内の任意の位置に追加できます。関連付けられたインデックスは、他の追加や削除に関係なく、そのアイテムに対して有効なままです。Queue オブジェクトを使用すると、アイテムを先頭から削除し、キューの末尾または先頭に追加できます。CircularQueue オブジェクトは、定義済みのサイズを持つキューです。循環キューの末尾に達すると、新しい要素が先頭から挿入され、以前のアイテムが置き換えられます。[30] [34]
配列は整数インデックスで順序付けられたシーケンスコレクションです。他のコレクションクラスと同様に、このArrayクラスはMAKESTRING要素を文字列オブジェクトとしてエンコードするメソッドを提供します。[30]
ArrayObj = . array ~ of ( "One" , "Two" , "Three" ) /* 3 つの項目を持つ配列 */
say ArrayObj ~ at ( 2 ) /* 出力: 2 */
say ArrayObj ~ makeString (, "; " ) /* 出力: One; Two; Three */
ユーティリティクラス
ユーティリティクラスは、一般的なタスクの実装を提供する 31 個のクラスのコレクションです。このクラスを使用するMutableBufferと、新しいオブジェクトを割り当てる必要がないため、連結などの文字列操作の効率が向上します。このFileクラスは、ディレクトリ内のファイルを一覧表示したり、ファイルやディレクトリに関する情報を取得したりするためのメソッドを提供します。[30]
FileObj = . File ~ new ( "~/someFolder/" ) /* フォルダーのファイルオブジェクトを作成 */
FileArr = FileObj ~ ListFiles /* ファイルの配列を取得 */
do FilePath over FileArr /* 配列項目を反復処理する */
say FilePath /* 出力: FilePath 項目 */
終わり
DateTimeまたはクラスTimeSpanは、さまざまな形式での日付、時刻、またはタイムスタンプの取得とフォーマットをサポートし、それらの間の算術演算を可能にします。いくつかの Comparator クラスは、File、DateTime などの組み込みクラスのソートを容易にします。クラスSupplierとそのサブクラスはStreamSupplier、インデックス コレクションと一緒にアイテム コレクションの列挙を可能にします。Validateクラスは、指定された引数が正しいクラスとタイプであるか、または数値範囲内であるかを確認するために使用できるメソッドを提供します。VariableReferenceインスタンスは参照を維持し、インスタンスWeakReferenceは固定されていない別のオブジェクトへの参照を作成します。[30]
正規表現は、文字列を一致させるために使用できるパターンです。コード内のパターンの可読性を高めるために、RegularExpressionクラスでは、共通セットにコロン ( ) で囲まれたシンボル名を使用できます:。たとえば、通常 と記述される文字のみを含む文字列に一致する場合は、[A-Za-z]と省略できます[:alpha:]。[30]
他のクラスは、環境シンボルを介して、現在実行されているコード ( RexxContext)、Rexx 言語または実行プラットフォーム ( RexxInfo)、および実行の詳細 ( ) のコンテキストに関する情報を取得するのに役立ちます。クラスとクラスは、C/C++ API を使用してネイティブコードでメソッドと関数を記述できるように特別に設計されています。クラスとクラスは通知機能を提供し、クラスとクラスはマルチスレッドアクティビティの同期メカニズムを実装します。クラスは、メッセージをさまざまなターゲットオブジェクトに転送することを可能にし、クラスは外部 Rexx データキューへのオブジェクトのようなアクセスを提供します。[30]StackFrameBufferPointerAlarmTickerEventSempahoreMutexSempahoreMonitorRexxQueue
外部パッケージとライブラリ
ディレクティブを使用し::REQUIRES、LIBRARYオプションを指定することで、プログラムごとに外部ライブラリを統合することができます。このようなライブラリは通常、ドメイン固有の機能を中心に構成されます。[30]
Rexx拡張ライブラリは、カンマ区切り値(CSV)ファイルの読み取りと書き込み、およびJavaScript Object Notation(JSON)データの作成と処理のためのクラスを提供します。また、 TSO / CMS環境を部分的にエミュレートする「hostemenu」というライブラリも含まれています。[36] RxSockネイティブライブラリを使用すると、 TCP / IPプロトコルを組み込むことができ、[37] RxFtpネイティブライブラリ[38]は、ファイル転送プロトコル(FTP)へのアクセスを具体的に提供します。RxMathネイティブライブラリは、平方根計算、指数関数、対数、正弦、余弦、正接、逆正弦、累乗計算などの高度な数学関数を提供します。[39]
rxcalcsin ( 1 )とします/* 出力: 0.0174524064 */
:: requires 'rxmath' LIBRARY /* ネイティブライブラリをロードする */
Windowsの場合、ooRexxにはWindowsダイアログとグラフィカルユーザーインターフェイスを作成できるooDialogフレームワークが含まれています。[40]インタープリタには、このフレームワークの使用方法を示すいくつかのサンプルプログラムと関数パッケージが付属しています。[34] POSIX互換オペレーティングシステムの場合、orxnCursesクラスライブラリにより、 ncursesプログラミングライブラリを使用してテキストベースのユーザーインターフェイスを作成できます。[41] RxUnixSysライブラリは、ほとんどのUnixシステムでプロセスとスレッド、ユーザーとユーザーグループ、ファイルとファイルシステムなどと対話するための機能を提供します。 [42]
これらの外部パッケージとライブラリの多くは、他のRexx 実装とも互換性があります。
橋
ooRexx は Object REXX と比較して SOM および WPS サポート用のクラスがなくなりましたが、CまたはC++で記述されたコードと対話するためのアプリケーション プログラミング インターフェイス(API)を提供しています。[43]また、双方向Javaブリッジを実装する外部ライブラリもあり、ooRexx と Java 間の対話を可能にします。[31]さらに、Windows アプリケーションの自動化を可能にするクラスも提供されています。ooSQLite クラスは、自己完結型、サーバーレス、ゼロ構成、トランザクションSQLデータベース エンジンを実装するインプロセス ライブラリであるSQLiteへのインターフェイスを提供します。[44]これにより、スクリプトを変更することなく、いくつかの種類の SQL データベースと対話できますが、マルチスレッドはサポートされていません。[45]
C/C++ API について
Classic Rexxと同様に、ooRexxにはCで書かれたアプリケーションでRexxを拡張するためのAPIが含まれており、その逆も可能です。これにより、アプリケーションマクロとして実行されるRexxプログラムで使用されるサブコマンドのハンドラー、ooRexx関数セットを直接拡張できる外部関数、およびインタープリターの動作をカスタマイズできるシステム関数を作成できます。[43]
ooRexx 4.0.0 では、C++ アプリケーションが ooRexx を拡張したり、その逆を行ったりできる API が導入されました。これには、C++ で記述され、ooRexx を拡張するメソッドと関数のハンドラーが含まれます。これらは、外部ライブラリとしてパッケージ化されています。これらは、 Windows ではダイナミック リンク ライブラリ、Unix ベースのシステムでは共有ライブラリです。外部ライブラリは、ディレクティブを使用してロードするか、、、またはディレクティブの一部としてキーワード命令を::REQUIRES使用してロードできます。
EXTERNAL::ROUTINE::METHOD::ATTRIBUTE
ジャワ

C++ APIを使用して、BSF4ooRexxはBean Scripting Framework
に基づく双方向Javaブリッジとして開発されました。このブリッジにより、ooRexxはJavaオブジェクトと通信し、JavaはRexxアプリケーションと対話することができます。[46] [47]BSF.CLSこのブリッジは、パブリックルーチン、クラス、環境シンボルを定義するooRexxパッケージを要求することで実現されます.BSF4REXX。[47] AWT、Swing、JavaFX、JDBC、Java 2Dなどとの接続におけるJavaクラスの使用例が提供されています。 [46]
/* Java オブジェクトを作成する */
frame = .bsf ~ new ( "javax.swing.JFrame" , "こんにちは、私の愛する世界 - ooRexx から!" )
frame ~ setSize ( 410 , 20 ) /* 幅と高さを設定する */
frame ~ visible = .true /* JFrame を表示する */
call SysSleep 10 /* 10秒間スリープする */
:: requires "BSF.CLS" /* Java サポートを取得 */
BSF4ooRexxをベースに、OpenOfficeやLibreOfficeで使用されているUniversal Network Objects (UNO)との相互作用がパッケージ経由でサポートされています。[48]さらに、 Jini4Netと組み合わせることで、 .NETフレームワークの使用が可能になります。[49]このパッケージを使用すると、Linux上のD-Busミドルウェアを介してプロセスと通信できます。[50]UNO.CLSCLR.CLS DBUS.CLS
Windows 自動化
Windows拡張機能には、一般的な自動化タスクを実行するために使用できるWindows Script Host (WSH) スクリプトエンジンが含まれています。また、OLE ( Object Linking and Embedding / ActiveX )サポートも含まれており、OLEを介してWindowsプログラムと対話できますOLEObject。[51] OLEオートメーションは、 Microsoftが開発したプロセス間通信メカニズムであり、コンポーネントオブジェクトモデル(COM)のサブセットに基づいています。このメカニズムにより、プログラム関数の呼び出し、属性のクエリと設定、コンポーネントイベントの傍受などが可能になります。ooRexxインタープリタには、Access、Word、Excel、OpenOffice / LibreOffice、ActiveDirectory、WMIなどのプログラムとのOLE対話を示す例が付属しています。さらに、利用可能なOLEオブジェクトを検索するためのユーティリティプログラムも含まれています。[34]
exc = . OLEObject ~ new ( "Excel.Application" ) /* Excel のオブジェクトを作成 */
exc ~ visible = . true /* Excel を表示する */
Worksheet = exc ~ Workbooks ~ Add ~ Worksheets [ 1 ] /* ワークシートを追加 */
ワークシート~ cells ( 1 , 1 ) ~値= “最初のセル” /* セルに文字列を挿入 */
OLEサポートに加えて、Windows拡張機能では、Windowsプログラムマネージャ、システムイベントログ、クリップボード、レジストリとの対話が可能になるほか、ウィンドウ、メニュー、サブメニューの照会、編集、対話も可能になります。[51]
注記
- ^ システムオブジェクトモデル (SOM)とワークプレイスシェル (WPS)へのインターフェースを含む
- ^ SOMおよびWPSパッケージを除く
- ^ 5.0.0時点では、ooRexx には、、、、、、、、および
::ANNOTATEディレクティブがあります。::ATTRIBUTE::CLASS::CONSTANT::METHOD::OPTIONS::REQUIRES::RESOURCE::ROUTINE
参照
参考文献
- ^ abc 「X3.274-1996 アメリカ規格協会プログラミング言語Rexx」(PDF)。
- ^ abcd Fosdick, Howard (2024). Rexx プログラマーズリファレンス(PDF) (第 2 版). Rexx 言語協会. ISBN 978-9-40374-552-7。
- ^ 「Rexx が依然として重要な 7 つの理由」SmartBear.com 。2024年 6 月 19 日閲覧。
- ^ ab "IBM Object REXX - EDM2". www.edm2.com . 2024年6月19日閲覧。
- ^ Nash, Simon C. (1990-06-11). 「オブジェクト指向 REXX」(PDF)。開発者およびユーザー向け REXX シンポジウム議事録: 76-100。
- ^ Nash, Simon C. (2009-05-21). 「An Object Rexx Retrospective」(PDF)。第 20 回 Rexx 言語シンポジウムの議事録。
- ^ ab 「IBM Object REXX for OS/2 - EDM2」。www.edm2.com 。 2024年6月19日閲覧。
- ^ ab 「IBM Object REXX が Windows NT および Windows 95 で実行可能に」 IBM. 1997-02-25.
- ^ Schweizer, Manfred; Berger, Uwe (2005-04-21). 「Object REXX から ooRexx へ」(PDF)。第 16 回 Rexx 言語シンポジウムの議事録。
- ^ ab 「IBM Object REXX for AIX - 初心者から上級プログラマーまでを対象としたオブジェクト指向スクリプト言語」IBM。1999 年 3 月 30 日。
- ^ ab 「IBM Object REXX for Windows V2R1 - 初心者から上級者までを対象としたオブジェクト指向プログラミング」IBM。2001-03-20。
- ^ 4.0.0 では SOM サポートはどこに行ったのでしょうか?
- ^ 「SOM と Object REXX - EDM2」www.edm2.com . 2024 年 12 月 11 日閲覧。
- ^ Willis Boughton (2004). 「SOM と Object REXX」. EDM/2 . 2014 年 2 月 2 日閲覧。
- ^ 「Workplace Shell オブジェクトへのアクセス」。Object REXX リファレンス。IBM。
- ^ 「ArcaOS には REXX サポートが含まれていますか?」2020 年 9 月 3 日閲覧。
- ^ 「ソフトウェアの廃止とサービスの中止: IBM Object REXX」。IBM。2004 年 10 月 12 日。
- ^ 「RexxLA - Rexx Symposia」www.rexxla.org . 2024年5月17日閲覧。
- ^ 「ooRexx (Open Object Rexx) - SourceForge.net で /oorexx を参照」。sourceforge.net。2024年5 月 18 日閲覧。
- ^ 「ooRexx (Open Object Rexx) - SourceForge.net で /oorexx-docs を参照」。sourceforge.net。2024年5 月 18 日閲覧。
- ^ Flatscher, Rony G. (2023). 「Rexx および ooRexx 5.0 用の IntelliJ IDEA プラグイン ooRexxPlugin 2.2」(PDF)。
- ^ abcd "ooRexx News". Sourceforge . 2024年5月18日閲覧。
- ^ Open Object Rexx リファレンス バージョン 3.0.0 エディション(PDF) . RexxLA. 2005 年 3 月 24 日. 2024 年5 月 18 日閲覧。
- ^ 「ooRexx 4.0.0: Readme」(PDF) . 2024年5月18日閲覧。
- ^ 「ooRexx 4.1.0: ReleaseNotes」 。 2024年5月18日閲覧。
- ^ 「ooSQLite: Readme」 。 2024年5月18日閲覧。
- ^ 「ooRexx 4.2.0: 変更点」 。 2024年5月18日閲覧。
- ^ 「ooRexx 5.0.0: 変更点」 。 2024年5月18日閲覧。
- ^ abc Cowlishaw, Mike (1987). 「REXX言語の設計」ACM SIGPLAN Notices . 22 (2): 26–35. doi :10.1145/24686.24687.
- ^ abcdefghijklmnopqrstu vwxyz aa Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Open Object Rexx リファレンス(PDF) . RexxLA.
- ^ abcd Flatscher, Rony G.; Winkler, Till. 「メッセージパラダイムを採用してオブジェクト指向の概念とプログラミングの学習を容易にする」(PDF)。2024年第47回MIPRO ICTおよびエレクトロニクスコンベンション(MIPRO):1244–1249。
- ^ abc Winkler, Till; Flatscher, Rony G. 「プログラミング教育における認知負荷: REXX による初心者の負担軽減」(PDF)。中央ヨーロッパ情報知能システム会議。
- ^ Stefik, Andreas; Siebert, Susanna (2013). 「プログラミング言語構文の実証的調査」ACM Transactions on Computing Education . 13 (4): 1–40. doi :10.1145/2534973.
- ^ abcdefghijk アシュリー、W. デヴィッド;フラッチャー、ロニー G.ヘスリング、マーク。リック・マクガイア。ピーディン、リー。シムズ、オリバー。ジョン・ウルファーズ(2022)。 ooRexx Documentation 5.0.0 プログラマー ガイド(PDF)。 RexxLA。
- ^ ab Flatscher, Rony G.; Winkler, Till (2024). 「ooRexx アプリケーションの実行時モニタリングを改善するための TraceObject クラスの考案」。実行時実行時の検証とモニタリングに関する第 7 回 ACM 国際ワークショップの議事録: 19-24。doi : 10.1145 / 3679008.3685543。ISBN 979-8-4007-1119-0。
- ^ Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Rexx 拡張ライブラリリファレンス(PDF) . RexxLA.
- ^ Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 RxSock TCP/IP ソケット関数リファレンス(PDF) . RexxLA.
- ^ Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 RxFtp クラスライブラリリファレンス(PDF) . RexxLA.
- ^ アシュリー、W. デビッド;フラッチャー、ロニー G.ヘスリング、マーク。リック・マクガイア。ピーディン、リー。シムズ、オリバー。ジョン・ウルファーズ(2022)。 ooRexx ドキュメント 5.0.0 RxMath 数学関数リファレンス(PDF)。 RexxLA。
- ^ アシュリー、W. デビッド;フラッチャー、ロニー G.リック・マクガイア。ピーディン、リー。シムズ、オリバー。ジョン・ウルファーズ(2019)。 ooRexx ドキュメント 4.2.4 ooDialog リファレンス(PDF)。 RexxLA。
- ^ アシュリー、W. デビッド;フラッチャー、ロニー G.ヘスリング、マーク。リック・マクガイア。ピーディン、リー。シムズ、オリバー。シュタインベック、エーリッヒ。ジョン・ウルファーズ(2022)。 ooRexx ドキュメント 5.0.0 nCurses クラス ライブラリ リファレンス(PDF)。 RexxLA。
- ^ Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Steinböck, Erich; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Unix 拡張関数リファレンス(PDF) . RexxLA.
- ^ ab Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 アプリケーションプログラミングインターフェイス(PDF) . RexxLA.
- ^ アシュリー、W. デビッド;フラッチャー、ロニー G.リック・マクガイア。マーク・ミースフェルト。ピーディン、リー。シムズ、オリバー。ジョン・ウルファーズ(2022)。 ooRexx ドキュメント 1.0.0 ooSQLite リファレンス(PDF)。 RexxLA。
- ^ 「OREXX/SQL オブジェクト フレームワーク - EDM2」。www.edm2.com。2024年 12 月 11 日閲覧。
- ^ ab "BSF4ooRexx". sourceforge.net . 2024年8月12日. 2024年11月10日閲覧。
- ^ ab Flatscher, Rony G. (2009). 「BSF4Rexx 2009 版 パート I」(PDF) .第 20 回 Rexx 言語シンポジウム. RexxLA.
- ^ Waglechner, Christoph (2009). OpenOffice.org Automation Using ooRexx Scripting Language by means of Selected Nutshell Examples by Andrew Pitonyak (PDF) .
- ^ Baginski, Adrian (2016). ooRexx.NET を使用した .NET クックブック(PDF) .
- ^ Lagler, Richard (2015). ooRexx の D-Bus 言語バインディング: Nutshell の例の紹介(PDF)。
- ^ ab Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Windows 拡張機能リファレンス(PDF) . RexxLA.
さらに読む
- Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Open Object Rexx リファレンス(PDF) . RexxLA.
- アシュリー、W. デビッド。フラッチャー、ロニー G.ヘスリング、マーク。リック・マクガイア。ピーディン、リー。シムズ、オリバー。ジョン・ウルファーズ(2022)。 ooRexx Documentation 5.0.0 プログラマー ガイド(PDF)。 RexxLA。
- Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 Windows 拡張機能リファレンス(PDF) . RexxLA.
- Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2022). ooRexx ドキュメント 5.0.0 アプリケーション プログラミング インターフェイス(PDF) . RexxLA.
- Fosdick, Howard (2024)。Rexx プログラマーズ リファレンス(PDF) (第 2 版)。Rexx 言語協会。ISBN 978-9-40374-552-7。
- Flatscher, Rony G. (2024). Rexx と ooRexx の紹介: Rexx から Open Object Rexx (ooRexx)へ。Mijnbestseller。ISBN 978-9403755038。
外部リンク
- レックス言語協会
- Open Object Rexx 5.0.0 ドキュメント
- Sourceforge で Object Rexx を開く
- Open Object Rexx ウェブサイト
- Rosetta コード上の Open Object Rexx
- Sourceforge の BSF4ooRexx
