ポッドキャストを聞いていると、C#は動的言語ではありませんが、Rubyは動的言語であると聞きました。
「動的言語」とは何ですか?動的言語の存在は、静的言語があることを意味しますか?
C#が動的言語であり、他のどの言語が動的であるのですか?C#が動的でない場合、なぜMicrosoftはC#を市場に強く押し付けているのでしょうか。
また、なぜほとんどの.NETプログラマーがそれに夢中になり、他の言語を離れてC#に移行しているのでしょうか。
Rubyが「未来の言語」なのはなぜですか?
ポッドキャストを聞いていると、C#は動的言語ではありませんが、Rubyは動的言語であると聞きました。
「動的言語」とは何ですか?動的言語の存在は、静的言語があることを意味しますか?
C#が動的言語であり、他のどの言語が動的であるのですか?C#が動的でない場合、なぜMicrosoftはC#を市場に強く押し付けているのでしょうか。
また、なぜほとんどの.NETプログラマーがそれに夢中になり、他の言語を離れてC#に移行しているのでしょうか。
Rubyが「未来の言語」なのはなぜですか?
言語が動的であるかどうかは、通常、コンパイラが行うバインディングのタイプ (静的または遅延バインディング) を指します。
静的バインディングとは、単にメソッド (または仮想メソッドのメソッド階層) がコンパイル時にバインドされることを意味します。実行時に仮想ディスパッチが含まれる場合がありますが、メソッド トークンはコンパイル時にバインドされます。コンパイル時に適切なメソッドが存在しない場合、エラーが発生します。
動的言語は反対です。実行時に作業を行います。コンパイル時にメソッドの存在をほとんど、またはまったくチェックしませんが、実行時にすべてのチェックを行います。
4.0 より前の C# は、静的にバインドされた言語であるため、動的言語ではありません。
この質問は、プログラミングの未来となる言語が 1 つ存在するという誤った前提に基づいています。今日、そのような言語はありません。実行する必要があるさまざまな種類のプログラミングをすべて実行するのに最適な単一の言語はないからです。
たとえば、Ruby はさまざまなアプリケーションに適した言語です。Web 開発は人気のある言語です。しかし、私はそれにオペレーティングシステムを書きません。
動的言語では、次のことができます。
var something = 1;
something = "Foo";
something = {"Something", 5.5};
つまり、型は静的ではありません。静的に型付けされた言語では、これによりコンパイラ エラーが発生します。
C、C++、C#、Java などの言語は静的に型付けされます。
Ruby、Python、Javascript などの言語は動的に型付けされます。
また、これは「強くまたは弱く」型付けされたものと同じではありません。それはすべて一緒に何か違うものです。
私は、C# がプログラミング パラダイムの基本セットを取り入れている方法に驚いています。
c# は、豊富なオブジェクト指向プログラミング、豊富なコンポーネント指向プログラミング、十分に統合された関数型プログラミング、さまざまなタイプのデータ ソース (linq) に対するクエリ操作の完全なセット、pLinq と並列による並行プログラミングの洗練されたアプローチを可能にすると言えます。次のリリース (c# 4.0) では強力な動的機能が実装され、c# 5.0 では確実なメタプログラミング機能が実装されることはほぼ確実です。
C# は、この強力な機能をすべて 1 つのツール ボックスに統合するという素晴らしい仕事をしていると言えます。私の意見では、あるプログラミング言語から別のプログラミング言語にスキップすることは、ほとんどの場合非常に苦痛であるため、そうあるべきだと思います。
VB6が静的で動的であることをご存知ですか?
特定の型で変数を宣言すると、静的な動作が得られます。
Dim name as Label
これで、sである名前のメンバーにのみアクセスできLabel
、インテリセンスはそれを認識します。
クラスがあり、キーワードを追加すると、そのimplements
クラスは別のクラスのメソッドを実装できます。これは、VB6で許可されているインターフェイスの継承です。実行時のポリモーフィズムを取得できます。
次のように変数を宣言することもできます。
Dim proxy As Object
現在、インテリセンスはあなたに何の助けも与えません、そして、VB6はあなたがあなたが好きなことを何でもすることを可能にしますproxy
:
proxy.foo()
この行は、コンパイルされ実行されているプログラムの内部にあり、特にそれ自体が実行されていない場合は、問題を引き起こすことはありません。回線が実行されたときにのみ、ルックアップが実行されます。
次のことも実行できます。
set proxy = <any instance>
これが実行されます。<any instance>
メソッドがあるかどうかは関係ありfoo
ません。
そして、実装するクラスのインスタンスを割り当てるfoo
ことができ、呼び出されたメソッドとVB6が満足します。
動的になるにつれて、実行時のパフォーマンスが低下することに注意してください。
C# は静的に型指定された言語です。これは、使用するすべてのオブジェクトの型をコンパイル時に認識する必要があるためです。動的言語では、コンパイル時にオブジェクトの型を知る必要はありません。プラグインなどのフォルダー内のすべてのクラスをインポートするように、事前に知らないいくつかのクラスをインポートする場合があります。または、オブジェクトのタイプでさえ、ユーザーの操作に依存する場合があります。
インターフェイスまたは基本クラスを使用して同様の効果を実現できますが、そのインターフェイスから明示的に継承または実装するクラスの使用に制限されているため、完全に同じではありません。
動的に型付けされた言語では、コンパイル時に型が何であるかは気にしません。名前で指定されたメソッドを呼び出そうとします。そのメソッドがオブジェクトに存在しない場合、実行時例外がスローされます。 、したがって、それが起こらないようにするか、適切に処理するかは、プログラマーの責任です。柔軟性は向上しますが、コンパイル時のエラー チェックが少し失われます。
ウィキペディアのエントリを見ると、動的言語とは、ほとんどがコンパイル時に行うことを実行時に行う言語であることがわかります。通常、動的言語では、変数の型をすばやく簡単に変更でき、通常、個別のコンパイル手順はありません (むしろ、解釈された実行または非常に高速なコンパイルのいずれかです)。C# は、変数宣言を使用してコンパイルされる、より従来型の言語です。
ウィキペディアのエントリには、多数の動的言語がリストされています。
一方、「X は未来の Y です」は、誰かがあなたに何かを売り込もうとしているという意味です。(必ずしも文字通りではありませんが、話者にとって都合の良い方法であなたの信念に影響を与えようとしています。)
静的および動的という言葉は明確に定義されていません。
ただし、最も頻繁に意味されるのは、次の 2 つの問題です。
1) 静的言語では、変数の型(つまり、変数が格納またはポイントできる値の型) は、プログラムの進行中に変更できません。たとえば C# では、次のように、変数を定義するときにその型を宣言します。
int a;
a
値のみを保持できるようになりましint
た。文字列を値に代入しようとしたり、メソッドを呼び出そうとすると、コンパイル タイプ エラーが発生します。
2) 静的言語では、オブジェクトの型は変更できません。動的言語では、メソッドやプロパティを追加または削除できるという点でオブジェクトを変更できるため、基本的に完全に別のオブジェクトに変えることができます。
C# 3.0 では、コンパイル時にすべての型を認識する必要があります。静的言語です。動的言語は、実行時に動的ディスパッチを使用して、モノのタイプと、それらのモノに対して呼び出すメソッドを決定します。どちらのタイプの言語にも、長所と短所があります。C# 4.0 では、動的機能が追加されます。 Anders Hejlsberg は、PDC で静的言語と動的言語、および C# 4.0 について素晴らしい講演を行いました。
動的言語は、一般に、実行時にコードを動的に解釈および生成できる言語と見なされます。C# ではそれができません。
動的に型付けされた言語と静的に型付けされた言語もあります。動的型付けとは、変数の型が設定されておらず、プログラムの実行中に変化する可能性があることを意味します。
c# は静的に型付けされます。つまり、int i =0; i を文字列に設定してみてください。コンパイラは文句を言います、
Python では、整数を保持していた変数を文字列を保持するように設定できます。
静的: 型は最終的、動的: 型は変更可能、
c# は、たとえば var などのより動的な機能を追加しようとしています
真の「未来の言語」はありません。言語が異なれば、目的も異なります。せいぜい、Ruby は未来の言語であると言えます。
ウィキペディアによると:
動的プログラミング言語は、コンピューター サイエンスで広く使用されている用語で、実行時に他の言語がコンパイル中に実行する可能性のある多くの一般的な動作を実行する高レベル プログラミング言語のクラスを表します。これらの動作には、新しいコードの追加、オブジェクトと定義の拡張、または型システムの変更による、すべてプログラム実行中のプログラムの拡張が含まれる場合があります。これらの動作は、十分に複雑なほぼすべての言語でエミュレートできますが、動的言語はそれらを利用するための直接的なツールを提供します。ほとんどの動的言語は動的に型付けされますが、すべてではありません。
Ruby は動的言語ですが、C# は動的言語ではありません。Ruby は解釈され、C# はコンパイルされるためです。ただし、C# には動的に見える機能がいくつか含まれています。