動的に生成された式の静的分析

はじめに



多くの場合、複雑なソフトウェアシステムを開発する場合、単一のソースファイル内であっても、複数のプログラミング言語が使用されます。 この場合、メイン(またはソース)言語と1つ以上の組み込み言語について話すのが習慣です。 メイン言語の文字列式から、プログラムはそれとは異なる言語で動的に形成され、データベースやWebブラウザーなどの実行中に動作する特別なコンポーネントによって解釈されます。 ほとんどの汎用プログラミング言語は、コア言語と組み込み言語の両方の役割を果たすことができます。 以下は、埋め込み言語の使用例です。



JavaコードからJavaScriptコードを実行する:



import javax.script.*; public class InvokeScriptFunction { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // JavaScript code in a String String script = "function hello(name) {print('Hello, ' + name);}"; // evaluate script engine.eval(script); } }
      
      







動的SQLを使用したコード:



 CREATE PROCEDURE [dbo].[MyProc] @TABLERes VarChar(30) AS EXECUTE ( 'INSERT INTO ' + @TABLERes + ' (sText1)' + ' SELECT ''Additional condition: '' + sName' + ' from #tt where sAction = ''1000000''') GO
      
      





PHPに組み込まれたいくつかの異なる言語(MySQL、HTML)の使用:



 <?php // Embedded SQL $query = 'SELECT * FROM my_table'; $result = mysql_query($query); // HTML markup generation echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; ?>
      
      







組み込み言語は、対象言語に固有のコンテキストで使用される場合、汎用言語の表現力の欠如を補うことができます。 ただし、このアプローチの使用には多くの困難が伴います。 動的に生成される式は、通常、ループ、条件付きステートメントの分岐、または再帰的プロシージャの連結を通じて、文字列定数とメイン言語の式から構築され、これらの構造は互いに入れ子にすることができ、多くの異なるオプションが発生します。 埋め込み言語のコードフラグメントは、ソース言語のコンパイラによって、分析できない単純な文字列として認識されます。 したがって、標準ツールでは、動的に生成された式の単純な構文解析さえも許可されません。 生成された式の正確性を静的に検証できないと、プログラム実行中にエラーが発生する可能性が高くなります。



コードを記述する際の一般的なプラクティスは、構文の強調表示と自動補完を生成し、構文エラーを通知し、さまざまなリファクタリングを実行する機能を提供する統合開発環境(IDE)を使用することです。 これらの機能はすべて、アプリケーションの開発とデバッグのプロセスを大幅に簡素化します。 プログラムの実行中にメイン言語の文字列式から動的に形成される多くの式を分析するために使用できるツールが役立つ場合があります。 このプロセスは、動的に生成された式の静的分析または抽象と呼ばれます

分析。



既存のツール



現時点では、特定の言語で動的に生成された式を操作するための多くのツールがあり、それらは実際によく証明されています。 ツールは、使用されるアプローチと新しい言語拡張機能の追加のしやすさで異なります。 以下は、ツールの機能の概要です。



Phpstorm


PhpStormは、HTML、CSS、JavaScript、SQLに埋め込まれたコードの強調表示と自動補完を提供するPHPの統合開発環境です。 ただし、このようなサポートは、文字列操作(連結など)を使用せずに文字列を受信した場合にのみ提供されます。 例として、図1に示されているプログラムを考えます。演算子「。」および「。=」は、連結および代入との連結の演算子です。 $hello1



変数$hello1



の右側$hello1



認識され、HTMLの式として強調表示されます。 ただし、これは$string



変数については言えません。



画像



図 1. PHPStormのPHPコードのスニペット。



PHPStormは、埋め込み言語ごとに個別のテキストエディタも提供します。

このツールの欠点には、組み込み言語のリクエストにエラーが含まれている場合、それらに関する通知が表示されないという事実が含まれます(図の$エラーを参照)。



IntelliLang


IntelliLangはPHPStormおよびIntelliJ IDEA開発環境用のプラグインであり、指定された開発環境で組み込み言語(HTML、SQL、XML、JavaScript)のエラーを強調表示および報告できます。



IntelliLangの仕組みの例を図2に示します。



画像

図 2. IDEAの組み込みJava言語のコードのスニペット。



IDEA開発環境の場合、Intellilangプラグインは、埋め込み言語(PHPStormと同様)を操作するための個別のテキストエディターも提供します。



プラグインの短所には、文字列変数ごとに手動で言語を指定する必要があるという事実が含まれます。 たとえば、図3を検討してくださいhtml



の式としてのhtml



変数に注意してください。 その後、タグのみが定義の右側で直接強調表示されます。 この場合、 body



変数の右側部分は通常の文字列として認識されますが、変数はHTMLとしてマークされた式の形成に関与します。



画像

図 3:文字列“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .




“” HTML, body







Alvor

Alvor — Eclipse, SQL-, Java. , . 4].



画像

. 4 Alvor



— Alvor . , . , (. 5).



画像

.5 Eclipse IDE



SQL-, , . Alvor SQL (PLSQL, MySQL), .



Java String Analyzer

Java String Analyzer — , , Java. JSA 6.



画像

. 6 JSA



JSA , front-end , flow-. Back-end flow- - , . Java . . , , , .



PHP String Analyzer

PHP String Analyzer — , PHP. HTML XML. JSA. -. .





, , ORM. , . , COBOL. C++, Java .



, , , . .







All Articles