Blocklyやfriendsなどのオープンソースのビジュアルプログラミングツールや、Githubでホストされている他のプロジェクトをいくつか見つけましたが、直接機能するものは見つかりませんでした。抽象構文木。
それはなぜですか?
I “mコンパイルプロセスにソースコードをASTに解析するフェーズがあることを発見すると、一部のビジュアルプログラミングツールがこれを利用してプログラマーに編集方法を提供できることは明らかでした。視覚的な方法で直接ASTし、ソースからノードグラフへのラウンドトリップを実行し、必要に応じてソースに戻ることもできます。
たとえば、 JavaScript AST Visualizer と実際のJavaSriptビジュアルプログラミングツールの違いはそれほど大きくありません。
、何が欠けていますか?
コメント
- ASTは非常に冗長であり、プログラミングにはあまり便利ではありません。これらはプログラマーではなくコンパイラー向けに設計されています。
- en.wikipedia.org/wiki/Structure_editor
- 機能"抽象構文木"を直接操作するという意味ですか?おそらく、BlocklyのようなすべてのブロックベースのツールはASTを編集しています。それらはネスト(または、そのように表示したい場合はスタック)によってエッジを表し、ユーザーは(たとえば)ドラッグアンドドロップによってツリーを編集できます。
- それは'コンパイラが好きな私たちの多くが持っていた素晴らしい質問です。簡単に言えば、これを実行してユーザーフレンドリーにすることができれば、人々はそれを使用するということだと思います。唯一の問題は、'大きな" if "であるということです。
- Lisp を調べましたか? " [It ' s] Lispに構文がないので、Lispに奇妙な構文があるほどではありません。他の言語が解析されるときにコンパイラ内で生成される解析ツリーでプログラムを記述します。ただし、これらの解析ツリーには、プログラムから完全にアクセスできます。それらを操作するプログラムを作成できます。"
回答
これらのツールの多くは do は、抽象構文ツリーを直接操作します(つまり、直接1対-それの1つの視覚化)。これには、これまでに見たBlocklyや、その他のブロックベースの言語やエディター(スクラッチ、ペンシルコード / ドロップレット、スナップ!、 GP 、タイトル付きグレースなど。
これらのシステムはそうではありません。他の場所で説明されている理由(スペース、および相互作用の難しさ)のために、従来の頂点とエッジのグラフ表現を示していますが、これらは直接ツリーを表しています。あるノードまたはブロックが、直接、物理的に親の内部にある場合、別のノードの子です。
これらのシステムの1つを構築しました(タイル張りのグレース、紙、紙)。確かに、ASTと直接連携しています。画面に表示されるのは、ネストされたDOM要素(つまり、ツリー)としての構文ツリーの正確な表現です。
これは一部のコードのASTです。ルートは「for … do」のメソッド呼び出しノードです。そのノードには、「_ .. _」で始まる子がいくつかあり、「_ .. _」自体には、「1」ノードと「10」ノードの2つの子があります。画面に表示されるのは、プロセスの途中でコンパイラのバックエンドが吐き出すものです。これが基本的にシステムの動作方法です。
必要に応じて、標準のツリーレイアウトと考えることができます。エッジが画面の外側を向いている(そしてエッジの前のブロックによって遮られている)が、ネストは頂点図と同じようにツリーを表示する有効な方法です。
「ソースからノードグラフへのラウンドトリップ、そして必要に応じてソースへの往復」。実際、下部の「コードビュー」をクリックすると、それが発生することがわかります。テキストを変更すると、「再作成されます。解析され、結果のツリーがレンダリングされて再度編集できるようになります。ブロックを変更すると、ソースでも同じことが起こります。
ペンシルコードは、この時点で基本的に同じことを行います。 より優れたインターフェース。使用するブロックは、CoffeeScriptASTのグラフィカルビューです。他のブロックベースまたはタイルベースのシステムも同様ですが、それらの中には、視覚的表現でネストの側面をそれほど明確にしないものもあれば、実際のテキスト言語が背後にないものもあります。構文木」は少し幻想的かもしれませんが、原則はそこにあります。
あなたが欠けているのは、これらのシステムが実際に 直接動作しているということです。抽象構文木。表示および操作するのは、スペース効率の高いツリーのレンダリングであり、多くの場合、文字通り、コンパイラまたはパーサーが生成するASTです。
回答
少なくとも2つの理由:
-
ソースコードははるかにより簡潔な表現であるため。ASTをグラフとしてレイアウトする
プログラマーは、できるだけ多くのコンテキストを持っていることを高く評価します。つまり、同時に画面上にできるだけ多くのコードを表示します。コンテキストは、管理を改善するのに役立ちます。複雑さ(それが多くのプログラムが行われる理由の1つですアマーはこれらのクレイジーな小さなフォントと巨大な30インチの画面を使用します。)
ASTをグラフまたはツリーとして表示しようとすると、1つの画面に収まるコードの量ははるかに少なくなります。ソースコードとして表される場合よりも。これは、開発者の生産性にとって大きな損失です。
-
ASTは、プログラマーが簡単に理解できるようにするためではなく、コンパイラープログラミングを目的としています。既存のAST表現を取得して視覚的に表示した場合、ASTは開発者が簡単に学習できるように設計されていないため、開発者が理解するのはおそらく難しいでしょう。
対照的に、ソースコードは通常は、開発者が読み取り/理解できるように設計されています。これは通常、ソースコードの重要な設計基準ですが、ASTの場合はそうではありません。ASTは、日常の開発者ではなく、コンパイラの作成者だけが理解する必要があります。 p>
そして、いずれにせよ、AST言語は、ソース言語に加えて、開発者が学ばなければならない第2の言語になるでしょう。勝利ではありません。
その他の考えられる理由については、 https://softwareengineering.stackexchange.com/q/119463/34181 も参照してください。
コメント
- "対照的に、ソースコードは、開発者が読み取り/理解できるように設計されています"-反例:ほとんどのesolang、Perl、Lisp
- " eソースコードははるかに簡潔な表現です。"; " AST言語は、ソース言語に加えて、開発者が学習しなければならない第二言語になります"-これらは<に対する反論ですi>すべてのビジュアルPLですが、OPが懸念している違いを説明するのに役立ちません。
- "(That '多くのプログラマーがこれらのクレイジーな小さなフォントと巨大な30 "画面を使用する理由の1つ。)" -if十分なコンテキストを表示するには、大きな画面が必要です。'スパゲッティコーディングをしているのではないでしょうか? ;)
- @Raphaelおそらく、しかし'リファクタリングよりもお金を投入する手間が少ないです!
- @JanDvorak、.. ASTは 言語であるため、.LISPは反例です。これが、ASTに表現力を与えるものです。他のLISPコードを再コンパイルするLISPコードを書くことは、標準のLISPデータ構造を変更するコードを書くことと同じくらい簡単です…これはまさにLISPコードが書かれているものです。 '理由は'半世紀以上続いた-家族'のデザインは珍しく表現力豊かです。 Goは、非同期拡張機能を言語とランタイムの奥深くに組み込む必要がありました。 Clojureの場合、'は単なるライブラリです。参照:平均を上回る。
回答
コンパイラによる典型的なASTは、かなり複雑で冗長です。有向グラフの表現は、すぐに追跡するのが非常に難しくなります。しかし、ASTが使用されるCSには2つの大きな領域があります。
- Lisp言語は実際にはASTとして記述されています。プログラムのソースコードはリストとして記述され、コンパイラやインタプリタによって直接使用されます(使用されているバリアントによって異なります)。
- モデリング言語(例: UML、および多くのビジュアルドメイン固有言語は、一般的な汎用言語ASTよりも高いレベルの抽象化で効果的な抽象構文グラフ(ASG)であるグラフィカル表記を使用します。