Dプログラミング言語

すべての人に良い一日を!
素晴らしいプログラミング言語Dについてコミュニティに伝えたいという願望がありました(そしてチャンスも!)。残念なことに、そのネットワークにはまだ最小限の情報しかなく、ハブの情報はさらに少なくなっています。
誰もが彼について知っている可能性もありますが、彼についてプロジェクトを書き込もうとした人はほとんどいませんでした。その理由は、彼が「撃たなかった」からです。 この記事を書いている主なアイデアは、この疑いもなく素晴らしいプログラミング言語についての誤解を払拭することであり、同時に、もちろんそれについてもう少し多くの情報を大衆に提供することです。

何について話しますか?

はい、筆者が最初に書きたくないのは、Haskellファンのように「200行のコードを持つメールサーバー」です。 これは間違いなく言語の力を示していますが、これはこの記事の目的ではありません。

そして、私は言語の作者の考えに従い、C ++の代替(またはアナログ)として間接的に宣伝します-すべての機会がある場合の言語として、そして他の現代言語に対する価値ある競争相手として。

手続き型、オブジェクト指向、関数型という基本的なプログラミングスタイルを知っています。 さらに、オブジェクト指向は、静的言語にとって自然なクラスであり、動的に型付けされた言語で採用されたプロトタイプでもあります。

すべてを知っている人のために:もちろん、私はすべてではなく、現代の応用プログラミングの主な方向性を挙げました。

まず、D言語がこれらすべてのスタイルをサポートし、完全に自然な方法で(不承認に陥るリスクがあるため、C ++よりもはるかに自然です)、この言語が文字通りすべての人に適していることを示したいと思います。

まず、いくつかの一般的な情報:

Dは、Cに似た構文を持つコンパイル済みの静的かつ強く型付けされた言語です。 システムプログラミング用の最新の言語として位置付けられています。 言語にはガベージコレクションがありますが、これは原則として、よく知られているmallocとfreeを使用して、多数のsiを直接操作して手動で静かに行うことを妨げませんが、これは推奨されません。

この言語には根本的に新しいものは何もありません(ほとんど、しかしこれには触れません)、その主な利点は誰にとっても便利です。**これはどういう意味ですか? つまり、この言語はJavaやC#などの言語の能力と表現力を兼ね備え(したがって、開発時間も短縮します)、Cレベル(およびコンパイルされたコードの速度!)でシステムとの直接的な通信を失わないことを意味します。
これは、%langname%でアプリケーションを作成することに慣れているほぼすべてのプログラマーが、プログラミングスタイルを変更することなく、Dに簡単かつ容易に適応できることを意味します!***
さて、これはすべて広告です。詳細に移りましょう。

だから、私はあなたが任意のスタイルを使用して(合理的な制限内で)言語で書くことができることを示すと約束した。
それでは、手続き型から始めましょう。

さて、ここでは独創的なものを思いつくことはほとんど不可能なので、ここではあまり意味がありませんが、それでも機能です:

 int inc(int a) { return a+1; } 
int inc(int a) { return a+1; }


C ++に比べて素晴らしい追加機能は、ネストされた関数です(この場所では、プログラマーはPascalで勝利しています)。

 int incTwice(int a) { int inc(int a) { return a+1; } return inc(inc(a)); } 
int incTwice(int a) { int inc(int a) { return a+1; } return inc(inc(a)); }


カプセル化に非常に便利ですよね?
これがおそらく手続き型スタイルについて言えることのすべてです。もっと興味深いものに移ります。

機能的スタイル:まず、機能は第1種のオブジェクトであるという事実によって特徴付けられます。

 int main() { auto inc = (int a) {return a+1;}; writeln(inc(1)); } 
int main() { auto inc = (int a) {return a+1;}; writeln(inc(1)); }


好奇心の強い人のために、自動型推論なしのアナウンスを以下に示します。

 int function(int) inc = function (int a) {return a+1;}; 
int function(int) inc = function (int a) {return a+1;};


さらに、Dでは、デリゲート(クロージャーをサポートする関数)を作成できます。

 int c = 1; int delegate(int) inc = delegate (int a) {return a+c;}; 
int c = 1; int delegate(int) inc = delegate (int a) {return a+c;};


関数とデリゲートは操作が簡単で、非常に透過的であり、型推論のためにコードにノイズはありません。
原則として、私の意見では、Dはhaskellには到達しませんが、Pythonに劣らず機能的です。

さらに、もう1つの機能的な「トリック」に言及します。純粋な機能です。 見てみましょう:

 pure int inc(int a) { return a+1; } 
pure int inc(int a) { return a+1; }


これは、関数が純粋であることを意味します。つまり、関数自体とシステム全体の状態を含まず、変更せず、同じ引数に同じ値を与えます。

このような機能は、たとえば、並行して実行でき、その結果をキャッシュできます。つまり、コンパイラーは最適化のための巨大なフィールドを取得します。

私は彼が正しさも監視していることに注意する。 次のようには機能しません。

 int c = 1; pure int inc(int a) { return a+c; // ,      . } 
int c = 1; pure int inc(int a) { return a+c; // , . }


それでは、オブジェクト指向スタイルに移りましょう。
まず、クラスを作成し、これらのクラスのオブジェクトをインスタンス化することは誰にとっても驚くことではありません。

 class A { int v; int inc(int a) { return a+1; } } 
class A { int v; int inc(int a) { return a+1; } }


それらを継承する能力でさえ、誰も驚かないでしょう!

 class B : A { int v; override int inc(int a) { return a+2; // trollface } } 
class B : A { int v; override int inc(int a) { return a+2; // trollface } }


驚くことではない場合、最初のメッセージは確認済みとみなすことができます-OOP言語のプログラマーは簡単に適応できます。

言語には、クラスの多重継承はなく、インターフェースの多重継承のみがあることを付け加えます。
言語にはトリックもあります。クラス間の関連関係のグラフのツリー構造に違反することなく、クラスの多重継承をシミュレートできます。 興味がある人のために、私は陰謀を明らかにしません-アレクサンドレスクの本「Dプログラミング言語」を読んでください。

これは非常に面白く、同時に便利な機能です。

他に何を約束しましたか? ああ、プロトタイプの継承。

C ++のような言語で書く人は誰でも、そのようなことを見てコードを書くことに慣れていません。 これは、静的型付けのために、コンパイルされた言語では不自然なようです。

ただし、これはここでも可能です(多くの行がありますが、OOPコードが少し太字であることがわかります)。

 class A { string s; this() { s = ""; } // ,   , - ,    . this(string s) { this.s = s; } override string toString() //     Object { return s; } } A createA(string s) { class B : A // ,    ! { this() { s = ""; } this(string s) //   . { this.s = s; } override string toString() { return "trollface"; } } return new B(s); } void main() { A a = new A("hi!"); A b = createA("hi!"); writeln(a, " : ", b); //  ,  "hi! : trollface" readln(); } 
class A { string s; this() { s = ""; } // , , - , . this(string s) { this.s = s; } override string toString() // Object { return s; } } A createA(string s) { class B : A // , ! { this() { s = ""; } this(string s) // . { this.s = s; } override string toString() { return "trollface"; } } return new B(s); } void main() { A a = new A("hi!"); A b = createA("hi!"); writeln(a, " : ", b); // , "hi! : trollface" readln(); }


さらに、怠laで美人が好きな人のために、匿名クラスがあります。次のコードを書き直してください。

 A createA(string s) { return new class A //  ,    A { this() { s = ""; } this(string s) {this.s = s;} override string toString() { return "trollface"; } }; } 
A createA(string s) { return new class A // , A { this() { s = ""; } this(string s) {this.s = s;} override string toString() { return "trollface"; } }; }


したがって、発表されたプログラミング概念はすべてD言語でサポートされており、同時に非常に簡潔です。
もちろん、これは言語を良くするのに十分ではありません。 本当に強力で便利になるには、これらすべての概念の美しくエレガントな相互作用が必要です。

たとえば、JavaScriptプログラマーとC ++プログラマーがDで1つのプロジェクトを一緒に書いたり、自分の分野で以前と同じように書いたり、少なくともそれに近づいたり、同時に読みやすさが失われないようにしたりするのはいいことですさらに重要なことは、両方のスタイルがシームレスに相互に松葉杖なしで対話できることです。

しかし、これは別の記事のトピックです。

私自身はこの素晴らしい言語を学んでいるだけです。

まず、エラーを見つけた教祖がここにいる場合、喜んで指示を聞きます。

第二に、私はそこで止まるつもりはありません。コミュニティが興味を持っているなら、私はそれを勉強しながらDについての記事を書き続けることを嬉しく思います。

第三に、疑問が生じた場合、私は熱狂的でない限り、答え、議論し、議論することを嬉しく思います。

結論として、私の記事が、これが「離陸していない」言語ではない、人々が麻痺している、または新しい言語を恐れている、そしていずれにせよ、他の多くの言語から切り替える価値があることを理解するのに役立つことを願っています価値のある代替手段としてそれを検討する。

*多くのため。
**はい、はい、キャッチ-再び多くの人に。
***そして、同時にコードは率直になりません-例えばC ++からhaskellへの移行中にそれがどうなるか(これは私についてです:)が、それは言語の一般的なスタイルに適合します。
****そして、私自身が記事のタイトルを思いついたと本当に思っていましたか?

PS
コメントで示唆されたように、Pythonにはまだクロージャがあります。 どうやら、私はそれを長い間試した、または何かが変わった、または私はただ忘れている。 謝ります

Source: https://habr.com/ru/post/J135044/


All Articles