![]() | |
| 開発者 | Ekky ソフトウェア |
|---|---|
| 安定リリース | 1.4 / 2012年7月1日[1] |
| 書かれた | C++ |
| オペレーティング·システム | WindowsとLinux |
| タイプ | スクリプト言語 |
| ライセンス | 無料(独自仕様) |
| Webサイト | ホームページ |
TScript は、階層的な一時型変数 (TVariable) をサポートする、 C++用のオブジェクト指向の埋め込み可能なスクリプト言語です。主な設計基準は、C++ とインターフェイスし、データを変換して結果を返すスクリプト言語を作成することです。これにより、C++ アプリケーションはインストール後に機能を変更できるようになります。
Hello Worldの例
基本的な「Hello World!」TScript の例。
CTScript ts ; ts.SetParameter ( CTScript :: SOURCE_STRING 、0 、TEXT ( "main(){" ) TEXT ( "System :: MessageBox ( L \" Hello World! \" );" ) TEXT ( "}" )); ts.ExecuteStaticMethod ( );
TVariables
標準変数[2]は、ブール値、整数、小数などの固定データと、ASCII 文字列、ワイド文字列、バイナリ文字列などの可変長変数として形成できます。データの型を使用して変数を定義することも、型を明示的に宣言することもできます。たとえば、コード - はvariable myInteger = 0;、myInteger という変数を作成し、それにゼロの値を割り当てます。整数型は - として宣言することもできInteger myInteger;、そのデフォルト値はゼロに設定されます。
TVariable は本質的に階層的であり、 XML、JavaScript、PHP変数 と非常によく似ています。
TVariable 型も一時的であり、Integer は文字列値を割り当てるか、変数を AString にキャストすることで AString に変換できます。たとえば、整数変数を作成して使用した後、それを AString に等しくすることで再割り当てできます。
TVariables は TVariables の配列を保持するためにも使用できます。有効な変数が作成されると、配列インデックスの添え字表記を使用してそれを配列に変換できます。たとえば、次のコードはvariable list = {0,2,4,6};4 つの要素を持つ配列を作成します。"list.type" の TVariable 型は構造体の型になり、 の各要素はlist[0].type整数になります。
TScript のクラスは、TVariable が処理する方法が配列に似ていますが、配列スクリプトとして文字列を使用します。たとえば、コード -は、list.Monday が true で list.Tuesday が false である構造化変数を作成します。ネイティブ C++ コードでは、構造化された TVariable 要素は、C++ では - によって、ネイティブ コードではまたはによってアクセスできます。
variable list = {"Monday" => true, "Tuesday" => false};list["Monday"];list.Mondaylist["Monday"]
定義された変数(クラス)
階層型変数をサポートしているTScriptは、プリミティブ変数と複合変数の両方を同じ変数構造内に格納できます。[3]これにより、プリミティブと構造化データ間の一意の違いが不要になり、クラス構造はデータストレージタイプではなく機能の論理的なグループ化になります。
TScript は、定義済みの変数を通じて継承とコードのカプセル化の概念を実装します。たとえば、次のコード スニペットは、コンストラクタをサポートする 定義済みの変数FooとBar を示しています。
変数Bar {整数minimum , maximum ; Bar ( ) { this.minimum = 1 ; } }
変数Foo はBarを拡張します{ WString name ; Foo ( WString name ){ this . name = name ; this . Bar (); } }
パブリックmain (){ Foo foo ( L "Goo" ); System :: MessageBox ( foo . ToString ()); }
関数宣言
TScriptのもう一つの顕著な特徴は関数宣言である。[4]これは戻り値ではなく出力パラメータを使用し、これらに対する構文サポートを提供する。Algolに従う多くの手続き型言語の標準関数は、次の形式である。
- [戻り値の型] <関数名>([入力変数], ...)。
TScript では、このパターンは次の形式に変更されました。
- <関数名>([入力変数],...:[出力変数],...)。
この変更により、2 つのことが実現しました。1 つ目は、複数の出力変数が許可されること、2 つ目は、return ステートメントがエラー処理関数に変更されることです。
関数がセミコロン ":" で区切られた入力変数と出力変数のリストを持つことを許可することで、関数の呼び出しと使用の通常の流れが変更されました。これにより、C/C++ で一般的な複数の変数を返すために参照ポインタを使用する必要性が一部なくなり、他のほとんどのスクリプト言語での参照の使用が実際に防止され、複数の値を返すために構造体または配列の使用が強制されます。
呼び出し規約に関する 2 つ目の注目すべき点は、すべての関数に C++ や Java と同様にエラー処理機能が統合されていることです。TScriptではすべての関数がエラーを返すため、return ステートメントは throw ステートメントと同様に動作します。たとえば、ステートメント:- return error = "Have an error message"; は関数を終了し、エラー メッセージを返します。一方、空のステートメント;- return; は関数を終了しますが、エラーは返しません。
try{…}catch(…){…}throw new Exception()
複数の戻り値の例
public TextExtent ( WString text : Integer width , Integer height ){ text = text . Fragment ( L " \n " ); for ( height = width = 0 ; height < text . length ; height ++ ){ if ( width < text [ height ]. length ) width = text [ height ]. length ; } }
速記表記
便宜上、TScript は、返される変数が 1 つしかない状況で、関数の呼び出しを省略形として提供します。 のこの表記は、 の場合を置き換えます。 この短縮表記により、呼び出しコードがエラーをキャッチすることがなくなり、エラーは自動的に親の呼び出しコードに返されます。
function(: variable); for variable = function();
エラー処理
他の多くの言語では、エラー処理は例外を使用して行われます。TScript は、わずかに異なりますが、同様のエラー処理プロセスを使用します[5] 。TScript には、C の従来のerrnoに似たグローバルエラー変数がありますが、TScript のエラー変数は、エラーコードと詳細なエラーメッセージの両方を保持できます。
構文を使用する多くの言語では、エラーは catch ステートメントを介して返されますが、一部のエラーが回復可能な状況では、コードの操作フローが不自然になる可能性があります。TScript では、呼び出しコードがエラーをフィルター処理できる表記法が使用され、エラーから回復して通常の操作に戻ったり、エラーを呼び出し関数自体に返したりする可能性があります。
try{...}catch(...){...}if(...){...} else{...}
返品および処理エラーの例
関数(){ return error = -1 ;}
public main (){ if ( ! function ()){ if ( error != -1 ) return error ; } System :: MessageBox ( L "関数は正しく実行されました" ); }
実行時リンク
C++ は関数のオーバーロードをサポートしており、これにより、関数は同じ名前を持ちながら、入力パラメータによって区別することができます。これにより、ソフトウェアが実行されるまで変数の型がわからないため、TScript では緩い型変数をサポートする際に問題が発生します。
この問題に対処するために、TScript は実行時リンクを使用して記述されています。これは、呼び出される特定の関数が、関数が呼び出されたときの変数の型に依存する場合です。
これは珍しい戦術ですが、いくつかの追加の利点があります。まず、関数を使用する前に宣言する必要がないことを意味します。たとえば、C++ では、と のように、2 つの関数が互いを呼び出すことがあります。この状況では、がそれを呼び出すためには、 をプロトタイプ化する必要があります。TScript のランタイム リンクでは、プロトタイプ化の必要がなく、関数を任意の順序で宣言できます。これにより、経験の浅いプログラマーでもコードの作成がはるかに簡単になり、言語の要件ではなくソフトウェアのロジックに集中できるようになります。
void Foo(){ Bar();}void Bar(){Bar();}Bar()Foo()
実行時リンクにより、言語はAddMethodやAddDefinedVariableなどのメソッドを使用して実行時コーディングをサポートすることもできます。これにより、TScript プログラムが独自に記述できるようになります。たとえば、SOAPインターフェイスを使用する場合、リモートWSDL はスクリプト ライブラリにエンコードされ、設計時にコーディングされたかのようにその中の関数を呼び出すことができます。さらに、必要に応じて新しい関数を記述し、自ら学習できるコードを記述することもできます。
ライブラリの動的リンク
TScript は、既存の共有ライブラリを動的にロードしてリンクする機能を提供するスクリプト言語の小さなグループに属しています。Java のJNIとVB6 は、サードパーティのライブラリをロードしてネイティブ インターフェイスを介して実行するコードを記述できる他の 2 つのスクリプト言語です。これにより、TScript は、既存の豊富な機能やさまざまな言語で記述されたコードを使用できるようになり、共有ライブラリのインターフェイスを変更したり、ソース コードでコンパイルしたりする必要がありません。
メモリ管理
TScript は、標準の C++ クラス カプセル化を使用してメモリ リソースの割り当てと割り当て解除を行います。つまり、割り当てられたすべてのメモリは、それを含む変数が破棄されると解放され、Java のガベージ コレクション モデルや.NET言語の参照カウント モデルとは異なる方法で操作されます。
ファイル、ソケット、暗号化キーなどのオペレーティング システム リソースは、.NET と同様の参照カウント メカニズムを介して管理されるため、それらの値を含む変数がなくなるとすぐに解放されます。
プロアクティブなセキュリティ
既存の共有ライブラリをロードする機能により、スクリプトは、それを実行するユーザーに付与されたすべての権限にアクセスできます。悪意のあるコードから保護するために、基本的なメモリ割り当てを超えるすべてのリソースを各スクリプトに付与する必要があります。これには、メッセージ ボックスを使用してユーザーにプロンプトを表示したり、任意のファイルまたはディレクトリへの読み取り/書き込みアクセスやインターネット接続を使用したりすることも含まれます。
このセキュリティ アーキテクチャは、 Perlなどのより強力なスクリプト言語の有用性を有効にしながら、JavaScriptと同様の方法でスクリプトを実行できるように設計されています。
参考文献
- ^ Ekky Software 2012-09-29 にWayback Machineでアーカイブ
- ^ TScript TVariable ヘルプドキュメント
- ^ TScript ドキュメント - 定義済み変数
- ^ TScript ドキュメント - 関数宣言
- ^ TScript ドキュメント - エラー処理
外部リンク
- TScript 入門

