30

動的プログラミング言語を活用する方法を本当に知っている人は、静的言語で作業している人とは異なる方法でプログラミングにアプローチするでしょうか?

私は静的型付けと動的型付けの議論全体に精通していますが、それは私が得ているものではありません。動的言語では実用的で静的言語では実用的でない問題解決手法について説明したいと思います。

私が見た動的プログラミング言語で書かれたコードのほとんどは、静的プログラミング言語で書かれたコードとそれほど違いはありません。ことわざにあるように、FORTRAN はどの言語でも記述できます。多くの人がそうしています。しかし、動的プログラミング言語を使用して、C++ などに簡単に変換できない方法で問題を解決する人もいます。彼らのテクニックにはどのようなものがありますか?

動的プログラミング言語の使用方法について説明している優れたリソースは何ですか? 言語構文や API リファレンスに関する本ではなく、動的言語機能を利用した問題解決アプローチに関するリソースです。

編集 (2009 年 1 月 5 日): 以下の回答に感謝しますが、動的言語の支持者が経験していると言う生産性の大幅な向上を説明していないようです。

4

15 に答える 15

9

私はスリムの答えが好きです。私はJavaとC++で、Python/Rubyで無料のカスタムデータ構造を作成するのにかなりの時間を費やしています。そして、これらのカスタムデータ構造を処理するための特殊な関数を作成します。はい、C ++では、STLは本当に素晴らしいです。はい、Javaのジェネリックは素晴らしいです。カスタムデータ構造をはるかに高速に作成するのに役立ちますが、それでも多くの考慮と考慮が必要です。

ただし、動的言語の方が扱いやすいという、より根本的な理由があります。それはダックタイピングと呼ばれる深い考えです。上記のいくつかのコメントはダックタイピングに言及していますが、ダックタイピングとは何かを熟考するために時間をかけてください。それは世界を見る根本的に異なる方法です。JavaやC++などの言語と互換性のないビュー。

ダックタイピングとは、アヒルが何であるかを定義するのに時間を無駄にしないことを意味します。オブジェクトを正式に定義する必要がないため、時間とエネルギーを大幅に節約できます。定義を正しくするのは難しいです。私が例を挙げている私のこのブログ投稿を見てください:正式な定義はあなたが思っているよりも役に立たないです

ダックタイピングは非常に便利であることが証明されています。XMLの「無視しなければならない」原則は、XMLをWeb上で非常に重要で有用なものにしているものです。しかし、それはダックタイピングのほんの一例です。

ダックタイピングを表現するもう1つの方法は、「送信するものを厳しくし、受け入れるものを寛大にする」というWebマントラを使用することです。それも非常に基本的な考え方です。

最後に、私の長いブログ投稿に戻って、ダックタイピングとそれがAIやモデリングなどにどのように関連しているかを説明します:ダックタイピング、人工知能、哲学

于 2009-04-09T04:15:45.683 に答える
4

私が通常動的計画法言語を利用していることに気付く1つの方法は、構文を単純化して明確にすることです。たとえば、データベースを表現している場合、そのテーブルのデータベースオブジェクト、列のテーブルと行などにプロパティとメソッドを動的にロードできれば、データベースとの対話に使用する構文ははるかにクリーンになります。 。違いは次のとおりです。

$row = $db->getTable('user')->getRow(27);
$row->setValue('name', 'Bob');

$row = $db->user->getRow(27);
$row->name = 'Bob';

2番目の形式の「視覚的なノイズの節約」は、複雑なことをしているときに実際に加算され始めます。

于 2008-12-18T20:38:20.343 に答える
3

動的言語は、実行時にオブジェクトを変更したり、メソッドやプロパティを追加したりできます...

動的言語の魔法の 1 つの良い例は、わずか 2 行のコードで Web サービスのメソッドを呼び出す次の Groovy コード スニペットです。

def proxy = new SoapClient("http://localhost:6980/MathServiceInterface?wsdl");
def result = proxy.add(1.0, 2.0);

これは、XML からデータを抽出する別の Groovy スニペットです。

def contacts = new XmlParser().parseText("<contacts><name>Bahaa Zaid</name></contacts>");
def myName = contacts.name[0].text();

これは静的言語では実行できません。動的言語は、実際のランタイム条件を反映するようにオブジェクトを変更できます。

于 2009-02-05T20:07:47.940 に答える
2

反復が速いとプログラマーは幸せになり、インタラクティブなインタープリターよりも速くなることはありません。優れたインタプリタの活用により、サンドボックス、テスト、およびプロトタイピングを同時に行うことができます。

ただし、順列によるプログラミングには注意してください。私の個人的な経験則では、それが機能するからといって、それが準備ができているとは限らないということです。なぜそれが機能するのかを説明できれば、準備ができています。

于 2008-12-19T05:43:16.793 に答える
2

動的言語では、私はもっと実験的です。その場で物事を変更する方が簡単なので、解決策をより早く探求できます。

自分がやりたいこと、そして一般的にそれを行う方法を知っているなら、私はC++が好きです。自分がやりたいことをどうやってやるのかわからず、自分がやりたいことについて完全に確信が持てない場合は、Lispの方がはるかに好きです。

于 2008-12-18T21:00:41.170 に答える
2

私の最大の利点は、データベースとオブジェクト (ORM) の間のマッピングです。

型の概念がない場合、行のすべての列をオブジェクトの値に割り当てると言うのは非常に簡単になります。もちろん、トレードオフは、そこにあると考える値のタイプとコンピューターが実行するタイプとの間に不一致が生じる可能性があることです。

于 2009-01-05T20:40:58.657 に答える
2

データ構造の選択における最も劇的な違いだと思います。

Java または CI では、構造体またはクラスを非常に厳密に定義します。プロパティを追加する必要がある場合は、戻って定義を変更します。

Perl では、ハッシュを使用し、コーディング時にキーを「発明」します。

于 2008-12-18T20:30:41.077 に答える
2

これは、私のお気に入りの比率の 1 つに帰着します。つまり、問題の解決について考えるのに費やす時間と、問題を解決するために使用するツールについて考えるのに費やす時間です。S/N比に相当すると考えてください。

ダックタイピング言語 (生産性を向上させるのに最も役立つ要因だと私は考えています) を使用すると、問題とその解決策について考える (そしてそれらに具体的に対処するコードを書く) ことにもっと時間を費やすことができます。言語アーティファクトをまっすぐに保つ時間が短縮されます。

それから、宣言や特に型キャストを含む、私が書いていないコードがたくさんあります。

しかし、それは主にスイートスポットに焦点を合わせ続けることです.

于 2009-04-09T04:26:35.533 に答える
2

今はこれを引用することはできませんが (記憶が曖昧です)、次のようなことを聞​​いたことがあります。

プログラミング業界が特効薬に最も近づいたのはマネージ言語です。これにより、プログラマはメモリ管理の詳細について心配する必要がなくなり、目前の問題の解決により多くのエネルギーを集中させることができます。

したがって、私は推測して、プログラミングが異なるということではなく、ソリューションの実装の詳細ではなく、「問題の解決」により多くの脳を費やすことができると言うかもしれません。

于 2009-10-14T15:01:07.080 に答える
1

MarkJasonDominusによる「HigherOrderPerl」を読んでください。Perlについてのみ説明しますが、ほとんどの静的言語ではあまり自然ではない、Perlにとって自然な手法を提供します。

All languages obviously have their strengths and weaknesses and dymanic vs static 

言語を分類する多くの方法の1つにすぎません。私は、動的言語が全体として静的言語よりも優れている、または劣っているという議論はしません。しかし、この本は、Perlを使用して問題に取り組むさまざまな方法を示すのに非常に優れていると思います。これは、ほとんどの静的言語ではより困難または不可能です。

于 2009-11-26T01:54:49.827 に答える
1

具体的な答えはありませんが、提案だけです。 「 Rubyのデザインパターン」という本を見てください。これは、ほとんどの古典的なデザインパターン(àlaGamma et al。など)を網羅し、それらを表現しています。簡潔に言えば、Rubyでは:)

于 2009-04-09T12:02:18.120 に答える
1

John さん、2009 年 1 月 5 日の更新編集に基づいて、AMOPが興味深い読み物であることに気付くかもしれません。これはかなり Lisp 中心ですが、結局のところ、優れた動的なアイデアの多くはそこから始まりました。したがって、その側面を楽しむ (または乗り越える) ことができる場合、著者は必要であり、このようなことを行うために使用される動的な側面について説明します。かなり強力なアイテムです。

于 2009-04-09T04:31:47.517 に答える
1

より多くのライブラリと、より重要でより使いやすいライブラリ

私の推測では、通常動的言語に関連付けられている「ダック タイピング」は、コードを大幅に簡素化し、汎用コードの記述をはるかに容易にするのに役立ちます。厳密なクラス階層に制約されないため、さまざまなライブラリからコンポーネントをまとめてより簡単に構成できます。

于 2009-01-05T20:58:51.663 に答える
0

動的言語は、実行時に作成されたコードを実行できます。悪意のあるコードが挿入された場合、これは非常に危険です。しかし、環境を消毒できれば非常に強力です。

Javascript の人々は、JSON ファイルを実行することでこれを行うと思います。

于 2008-12-18T21:16:35.147 に答える
0

私にとっては、ターンアラウンドの速度です。私が使用する動的言語 (現時点では Python と少しの JavaScript) は解釈されます。これは、その場で物事を試すことができることを意味します。API の特定のビットがどのように動作するかを確認したい場合は、インタープリターを数分間ハッキングするだけです。

C# のような言語で同じことをしたい場合は、VS を起動し、プロジェクトを作成してからコンパイルする必要があります。私が取り組んでいるより大きなソフトウェアの一部をテストしたい場合は、おそらくそれをコンパイルする必要がありますが、これには時間がかかる場合があります。幸いなことに、.Net では、IronPython の大きなプロジェクトからアセンブリをロードして、インタープリター言語と同じ利点 (つまり、API のさまざまな部分をすばやくテストする) を得ることができます。

于 2009-10-14T15:15:25.780 に答える