ブロックベースとテキストベースの言語

ブロックベースの言語は、主に初心者ユーザー向けに設計されているため、テキストベースの言語とは多くの点で異なります。独自のブロックベース言語を設計する際に考慮すべき事項は次のとおりです。

1 ベースのリストを使用する

文字列の特定のインデックスにある文字を選択し、1 を使用して最初の文字を表すブロック。

初心者プログラマは、ゼロベースのリストに初めて遭遇したときに、悪い反応を示します。そのため、Blockly は Lua と Lambda Moo に倣って、リストと文字列のインデックスを 1 ベースにします。

Blockly をより高度に使用するために、ゼロベースのリストがサポートされており、テキストへの移行が容易になっています。若いユーザーや初心者ユーザーには、引き続き 1 ベースのインデックスをおすすめします。

推奨事項: 1 は最初の番号です。

自由な命名規則をサポートする

大文字と小文字を区別しない変数名 location_x(小文字の x)と location_X(大文字の X)のブロック。

初心者プログラマは、location_Xlocation_x が異なる変数であるとは想定していません。そのため、Blockly では BASIC や HTML と同様に、変数と関数は大文字と小文字を区別しません。Scratch では、より微妙なアプローチが使用されます(右側を参照)。変数名では大文字と小文字が区別されますが、等価性チェックでは区別されません。

また、Blockly では、変数と関数が一般的な [_A-Za-z][_A-Za-z0-9]* スキームに準拠している必要はありません。変数に List of zip codesרשימת מיקודים という名前を付けたい場合、それはまったく問題ありません。

推奨: 大文字と小文字を区別せず、任意の名前を許可する。

すべての変数をグローバルにする

初心者のプログラマはスコープを理解するのも難しいでしょう。そのため、Blockly は Scratch に倣って、すべての変数をグローバルにします。グローバル変数の唯一の欠点は、再帰が複雑になることです(変数をリストに push して pop する必要があります)。これは、Blockly の対象ユーザーの範囲を超えるプログラミング手法です。

推奨事項: サポート範囲外の問題であるため、後で対応します。

省略可能な戻り値を処理する方法について考える

テキストベースのプログラミングでは、多くの関数がアクションを実行してから値を返します。この戻り値は使用される場合と使用されない場合があります。たとえば、スタックの pop() 関数です。Pop は、最後の要素を取得して削除するために呼び出される場合があります。また、戻り値を無視して最後の要素のみを削除するために呼び出されることもあります。

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

ブロックベースの言語は、通常、戻り値を無視することには向いていません。値ブロックは、値を受け入れるものに接続する必要があります。この問題に対処する方法はいくつかあります。

a)問題を回避する。ほとんどのブロックベース言語では、このようなケースを回避するように言語が設計されています。たとえば、Scratch には副作用と戻り値の両方を持つブロックはありません。

b)2 つのブロックを指定します。ツールボックスのスペースが問題にならない場合は、このタイプのブロックをそれぞれ 2 つ(戻り値ありと戻り値なし)用意するのが簡単な解決策です。欠点は、ほぼ同じブロックが多数あるため、ツールボックスが混乱する可能性があることです。

リスト内の最後のアイテムを削除して返す値ブロックと、最後のアイテムのみを削除するステートメント ブロック。

c)1 つのブロックを変更します。プルダウン、チェックボックス、またはユーザーが戻り値があるかどうかを選択できるその他のコントロールを使用します。ブロックは、オプションに応じて形状が変化します。この例は、Blockly のリストアクセス ブロックで確認できます。

リスト内の最後のアイテムを削除するときに、そのアイテムも返すかどうかに応じて、値ブロックからステートメント ブロックに形状を変更するブロック。

d)値を消費します。最初のバージョンの App Inventor では、接続された値をすべて消費する特別なパイプ ブロックが作成されました。ユーザーはこのコンセプトを理解していなかったため、App Inventor の第 2 バージョンではパイプ ブロックが削除され、代わりに値を使い捨て変数に割り当てることをおすすめしています。

ブロックの出力を無視する 2 つの方法を示しています。1 つ目はパイプ ブロックを使用して値を「消費」し、2 つ目は「junk」という名前の変数の値を設定します。

推奨事項: 各戦略には長所と短所があります。ユーザーに適したものを選択してください。

読みやすいコードを生成する

Blockly 上級ユーザーは、生成されたコード(JavaScript、Python、PHP、Lua、Dart など)を見て、自分が書いたプログラムをすぐに認識できる必要があります。つまり、この機械生成コードを読みやすくするために、余分な労力を費やす必要があります。余分なかっこ、数値変数、圧縮された空白文字、冗長なコード テンプレートは、エレガントなコードの作成の妨げになります。生成されたコードにはコメントを含め、Google のスタイルガイドに準拠する必要があります。

推奨事項: 生成されたコードを誇りに思ってください。お客様にご案内します。

言語間の違いを許容する

クリーンなコードを求める副作用として、Blockly の動作は、クロスコンパイルされた言語の動作の観点から大部分が定義されます。最も一般的な出力言語は JavaScript ですが、Blockly を別の言語にクロスコンパイルする場合、両方の言語で動作を完全に維持しようとする不合理な試みは避けてください。たとえば、JavaScript では空の文字列は false ですが、Lua では true です。ターゲット言語に関係なく Blockly のコードが実行する動作の単一パターンを定義すると、GWT コンパイラから出力されたようなメンテナンス不可能なコードが生成されます。

推奨: Blockly は言語ではないため、既存の言語が動作に影響するようにします。