ここから本文です
製品一覧
DADiSP
SPL
DADiSPの設計思想は、ユーザーがプログラミングをすることを無くし、問題解決に集中できるようにすることにあります。しかし、ユーザーがDADiSPをカスタマイズしたい、あるいは特殊な処理機能を追加したい場合があります。そのために、DADiSPは、SPLというシリーズ プロセッシング言語を提供しています。SPLは、C/C++言語を基礎としてC/C++ライクの構文を持っています。それゆえ、SPLのルーティンは、なじみ易いものとなっています。
この分野でよく知られているMATLABと比べてみますと、MATLABは、もともとFORTRANで開発され、その後Cに書き換えられため、MATLABのプログラムは、一般的に一貫性に乏しく、FORTANとCのコーデング スタイルを組合せたようなものになります。SPLとMATLABは、それぞれの設計思想と特徴を持っていますが、プログラムを相互にコンバートすることが、かなり簡単にできます。次に例として、台形法則による面積計算のプログラムを示します。
バーチャル シリーズ マネージメント
|
SPLは、バーチャル シリーズ マネージメントと呼ぶ最適化手法を採用しています。各シリーズと配列の大きさは、使用可能なディスク容量によってのみ制限されます。シリーズの大きさが、利用可能なメモリー容量を超えると、SPLは自動的にハードディスクを使います。バーチャル シリーズ マネージメントは、シリーズの処理を最適化します。それゆえ、この手法は、汎用OSのページ スワッピングより高速かつ確実に処理します。メモリー内のシリーズの大きさは調整可能で、ユーザーがシステムメモリー上の処理を最適化することを可能にします。つまり、SPLは、大量の大容量シリーズの処理に理想的に対応できます。
| MATLAB M File | SPL Function |
|---|---|---|
| function s = traprl(f, a, b, m) % % trapezoidal rule. h = (b - a)/m; s = 0; for k=1:(m-1), x = a + h*k; s = s + feval(f,x); end s = h*(feval(f,a)+feval(f,b))/2; s = s + h*s; | traprl(f, a, b, m) { // trapezoidal rule h = (b - a)/m; s = 0; for (k = 1; k < m; k++) { x = a + h*k; s = s + feval(f,x); } s = h*(feval(f,a)+feval(f,b))/2; s = s + h*s; return(s); } |
MATLBと比べてみますと、MATLABの配列の大きさは、物理的メモリー容量で制限されています。MATLABが、OSの汎用仮想メモリー管理に依存しているためです。配列の大きさが、使用可能なメモリー容量を超えると計算はエラーとなるか、メモリーページがディスクにスワップされない限り停止します。
C/C++スタイルの構文法
SPLは、C/C++の構文法を多く借用しているので大部分のC/C++プログラムは、SPLのルーティンとして直接読み込むことができます。例えば、SPLは、次のC/C++の演算子をサポートしています。
++, --, +=, -=, /=, *= %=, ==, !=, >>, <<, >>=, <<=, ||, &&, スカラーポインター
また、次のループや反復は、C/C++と同じ動作を正確におこないます。
for, while, do while, if, else, switch, goto
配列の構成は、C/C++構文法と似ています。さらに、SPLには次のC/C++ライクのプロセッサーも含まれています。
#if, #ifdef, #elif, #endif, #include, #define, #undef
MATLAB MファイルからSPLへのコンバート
MファイルからSPLルーティンへのコンバートが必要になった場合は、MathWorks社が提供しているMATLAB-to-C変換ユーティリティが役に立ちます。SPLは、C/C++とかなり似ているのでMファイルからSPLルーティンへのコンバートにこのユーティリティが使えます。参考のために、次にSPLとC/C++、MATLABの演算子と構文法の比較を示します
SPLとC/C++およびMATLABの演算子と構文法の比較
| Operation | MATLAB | C/C++ | SPL |
|---|---|---|---|
| scalar or series multiply | a .* b | a * b | a * b |
| scalar or series divide | a ./ b | a / b | a / b |
| matrix multiply | a * b | N/A | a *^ b |
| matrix divide | a ? b | N/A | a ?^ b |
| matrix transpose | a' | N/A | a' |
| block statement | begin, end | {} | {} |
| range specifier | 1:10 | N/A | 1..10 |
| series constructor | [1,2] | {1,2} | {1,2} |
| array constructor | [1,2;3,4] | {{1,2}, {3,4}} | {{1,2}, {3,4}} |
| array reference | a(n,m) | a[n][m] | a[n][m] a[n,m] |
| function call | f(x,y) | f(x,y) | f(x,y) |
| iteration | for n:100 end while n < 100 end | for (n=0; n <= 100; n++) while (n < 100) do { } while (n < 100) | for (n=0; n <= 100; n++) while (n < 100) do { } while (n < 100) loop (n..100) |
| jump statements | goto switch | goto switch | goto switch |
| input arg count | nargin | argc | argc |
| output arg count | nargout | N/A | outargc |
| string character | 'text' | "text" | "text" 'text' |
| pre/postfix | N/A | a++ a-- ++a --a | a++ a-- ++a --a |
| multiple assign | [a,b]=f(x) | N/A | a++ a-- ++a --a |
| multiple return | [a,b]=f(x) | N/A | return(a,b) |
| assignments | a = b | a = b a += b a -= b a /= b a *= b a %= b | a = b a += b a -= b a /= b a *= b a %= b a @= b a := b |
| address | N/A | &a | &a |
| pointer reference | N/A | *a | *a |
| logicals | a | b a & b | a || b a && b | a || b a && b |
| relationals | a > b a < b a >= b a <= b | a > b a < b a >= b a <= b | a > b a < b a >= b a <= b |
| equalities | a == b a  ̄= b | a == b a != b | a == b a != b |
| bit operators | N/A | a << b a >> b a <<= b a >>= b | a << b a >> b a <<= b a >>= b |
| modulus | N/A | a % b | a % b |
| comment | % text | // text /* text */ | // text /* text */ |
| preprocessor | N/A | #if #ifdef #elif #endif | #if #ifdef #elif #endif |
| file inclusion | N/A | #include | #include |
| macros | N/A | #define #else #elif #endif #undef | #define #else #elif #endif #undef |
| ternary conditional | N/A | a ? b : c | a ? b : c |