プログラミング言語のシンタックスシュガーとは何ですか?


ベストアンサー

シンタックスシュガー、またはシンタックスシュガーは、言語によって提供される視覚的または論理的に魅力的な「ショートカット」です。一般的な状況で記述しなければならないコードの量を減らします。

たとえば、条件に依存する値に変数を設定する場合、「糖衣構文」の少ない単純な言語で行うことができます。これ:

int a;

if(SomeFunction() == 2)

a = 4;

else

a = 9;

これは、このような単純な操作には少し多くなります。より単純な言語では、開発者はこのロジックをより簡潔なものにラップするために「インラインIf」関数を作成することがよくあります。

public T Iif(bool condition, T ifTrue, T ifFalse)

{

if(condition) return ifTrue;

return ifFalse;

}

...

//usage

int a = Iif(SomeFunction() == 2, 4, 9);

ここで、実際の使用法ははるかに簡潔になりました。 C#を含む多くの最新の言語では、このような操作が「3値条件演算子」の形式で言語仕様に直接組み込まれています。

int a = SomeFunction() == 2 ? 4 : 9;

この演算子は、条件演算用に言語で提供される「シンタックスシュガー」です。

この条件変数設定の一般的なサブケースは、値を生成する手段の最初の選択肢である場合です。 nullと評価される変数に設定するには、別の方法を使用する必要があります。例:

MyClass theClass = GetMyClass();

if(theClass == null)

theClass = FailSafeMyClassGetter();

悪くはありませんが、改善することができます:

MyClass theClass = GetMyClass() ?? FailSafeMyClassGetter();

「??」演算子は「null合体演算子」と呼ばれ、基本的に左から右に読み取られたときにnullではない最初の値を生成します。

最近取得したもう1つのC#は「自動プロパティ」です。簡潔に言うと、C#には「プロパティ」と呼ばれるものがあります。オブジェクトの「データメンバー」を表すコードブロックのペア。単純なフィールドよりも複雑な検証または計算ロジックを実行できますが、GetX()およびSetXを使用する代わりに、メンバーがフィールドであるかのようにアクセスできます。 ()メソッド呼び出し。「データにアクセスするときと操作を実行するときのコードを簡単に区別できます。一貫性とメンテナンスの理由から、C#では、公開されているデータメンバーを実装するときにフィールドではなくプロパティを使用することをお勧めします。 。ただし、10回のうち9回は、プロパティがプライベートフィールド変数を「ラップ」するだけなので、ベストプラクティスに従うと、単純なデータ値のプロパティ実装は次のようになります。

private int \_myIntProperty;

public int MyIntProperty

{

get

{

return \_myIntProperty;

}

set

{

\_myIntProperty = value;

}

}

醜く、非常に反復的で、実際に必要な数よりもはるかに多くのコード行があります。過去には、見捨てたくなりました。ベストプラクティスであり、これらの単純なケースではフィールドを使用するだけなので、後でプロパティが本当に必要であると判断した場合に、その誘惑とコードベースに与える可能性のある悪影響を減らすために、C#の設計者はC#3.0に構文シュガーを含めました。仕様:

public int MyIntProperty { get; set; }

このプロパティ宣言は上記の宣言と同じものとして扱われますが、より高速で簡単に記述できます。これらのクラスは、古い方法よりもいっぱいで、保守もはるかに簡単です。

これらは、C#で利用できる「シンタックスシュガー」のほんの一例です。その他には次のものがあります。

*変数の型の推論-var someInt = 5;-コンパイラは最初の割り当てから宣言されたローカル変数の型を判別できるため、明示的に指定します(必要なタイプを変更する場合は変更します)。

* yield return-多くの.NETプログラミングには、オブジェクトのコレクションが含まれます。同じ要素ごとに繰り返しタスクを実行します。以前は、IEnumerableインターフェイスを実装するための非常に複雑なプロセスでした。これによりforeachが機能するには、コレクションの反復処理を処理するためにIEnumeratorを実装した2番目のクラス全体が必要です。yield returnキーワードは、それを劇的に単純化し、反復子ロジック自体をコレクションの独自のGetEnumerator()メソッド内で定義できるようにします。

* async / await-同様に、より多くのプログラミングタスクを「非同期に」実行する必要があります。アプリケーションの別の「スレッド」で動作するため、プログラムの動作を最新のPCの複数のプロセッサに分割できますが、アプリケーションのユーザーインターフェイスは、OSからのUIの再描画と実行の要求に「応答」したままです。他の視覚的なタスク。スレッド化の概念を理解するのは難しいことではありませんが、C#4.0までは、基本的にメソッドを2つに分割する必要がありました。 1つのメソッドは非同期操作を開始し、バックグラウンドスレッドが作業を終了したときに2番目のメソッドが呼び出されます。もういや;これらの2つの新しいキーワードにより、非同期作業を行う関数を非常に同期的に見える方法で定義できます。一方、コンパイラーは、コードをビルドするときにバックグラウンドでメソッド分割を行います。

回答

シンタックスシュガーの正式な定義はありません。これはあいまいな概念です。

最も受け入れられている定義のシンタックスシュガーは、コンパイラによってすぐにより原始的で扱いにくい形式に変換される追加の構文ですが、プログラマーが特定の一般的な命令を表現する際の「より甘い」体験を可能にします。

この定義の問題は、「余分な」構文があまり意味のない説明ではないことです。場合によっては、シンタックスシュガーがあることは明らかです。たとえば、Haskell言語レポートは、より単純な構文での翻訳によって、特定のシンタックス要素(do-blockおよびリスト内包表記)を明示的に定義します。これは構文シュガーのかなり明確なケースであり、プログラムの作成を容易にするためにのみ存在し、プログラムをシンボリックツリーにコンパイラーで変換する際の深い意味ではありません。

その他の場合、言語がこの種の形式化に煩わされないため、それははるかに明確ではありません。たとえば、Pythonのデコレータは、それらなしで同等のコードを記述する方法で記述されることがよくありますが、私が知る限り、明示的には言われていません。デコレータを直接中間表現にコンパイルするのではなく、事前にこの方法で変換する必要があります。」 Pythonの実装の中には、それを選択するものもありますが、中間表現の機能としてデコレータを追加しているものもあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です