8

現在、私の主要な言語は D です。また、受講しているコースで Python が必要になるため、Python を学習中です。型推論やテンプレートを使わずに静的言語でプログラミングする人々にとって、動的言語が新鮮な空気の息吹になる理由は理解できますが (私見のテンプレートは、コンパイル時のダックタイピングが大部分を占めています)、動的言語の利点が何であるかに興味があります。あなたがそれらを持っていても。

要するに、私が Python を学ぶつもりなら、単に Python で D を書くのではなく、プログラミングに対する私の考え方を本当に変えるような方法で学びたいということです。私はかなり初心者のプログラマーだったので動的言語を使用しておらず、動的言語が提供すると思われる柔軟性を理解できず、今それらを最大限に活用する方法を学びたいと思っています。テンプレート、ポリモーフィズム、静的型推論、そしておそらく実行時リフレクションを使用しても、静的言語では扱いにくい、または不可能な、動的に型付けされたインタープリター言語で簡単/エレガントに実行できることは何ですか?

4

13 に答える 13

15

理論的には、動的言語にできることと静的言語にできないことはありません。頭の良い人は、非常に優れた動的言語を作成するために多大な労力を費やしているため、動的言語が先行し、静的言語が追いつく必要があるという認識につながっています。

やがて、これは逆方向にスイングするでしょう。すでにさまざまな静的言語には次のものがあります。

  • ジェネリック。オブジェクトが渡されるときに適切な型を選択できるようにすることで、静的型の愚かさを軽減し、プログラマーが自分でキャストする必要がないようにします。

  • 明らかなはずのものを書くのに時間を浪費する時間を節約する型推論

  • クロージャーは、メカニズムを意図から切り離すのに役立ち、ほとんど既存の構成要素から複雑なアルゴリズムをまとめることができます

  • 暗黙的な変換。これにより、通常のリスクなしで「モンキー パッチ適用」をシミュレートできます。

  • コードの読み込みとコンパイラへの簡単なプログラム アクセスにより、ユーザーやサード パーティがプログラムをスクリプト化できます。注意して使用してください!

  • それらの中でドメイン固有言語の作成をより助長する構文。

...そして、間違いなくもっと来るでしょう。動的な動きは、静的言語の設計にいくつかの興味深い発展をもたらしました。私たちは皆、競争から恩恵を受けています。これらの機能がもっと主流になることを願っています。

支配的な動的言語が置き換えられていないと思われる場所が 1 つあります。それはブラウザーの Javascript です。置き換えるべき既存の市場が多すぎるため、代わりに Javascript 自体を改善することに重点が置かれているようです。

于 2009-01-30T00:23:01.423 に答える
3

これがこの件に関するスティーブ・エッゲです。

Guido van Rossumも、彼のScalaのテイクでその話にリンクしています。

于 2009-01-29T23:54:36.100 に答える
2

「動的言語を持っている場合でも、動的言語の利点は何なのか興味があります。」

D プログラミング言語との比較:

  • Python はよりコンパクトな言語です。D と同じくらい表現できますが、それを実現するために使用する概念ははるかに少なくなります

  • Python には強力な標準ライブラリがあり、バッテリーが含まれています。

D にインタラクティブなプロンプトがあるかどうかはわかりませんが、Python では、ipythonなどのインタラクティブなシェルが開発プロセスの一部として統合されています。

于 2009-01-30T01:00:21.100 に答える
2

Python での例:

def lengths(sequence):
    try:
        return sum(len(item) for item in sequence)
    except TypeError:
        return "Wolf among the sheep!"

>>> lengths(["a", "b", "c", (1, 2, 3)])
6
>>> lengths( ("1", "2", 3) )
'Wolf among the sheep!'

これを書くのにどれくらいの時間がかかったと思いますか?コンパイル、実行、デバッグのサイクルは何回ですか?

私の例が取るに足らないと思われる場合は、動的言語によって多くのプログラミング タスクが簡単になると答えることができます。

于 2009-01-30T19:45:27.053 に答える
1

動的言語では、正しいことがわかっている方法で値を使用できます。静的に型付けされた言語では、コンパイラーが正しいと認識している方法でのみ値を使用できます。型システムによって奪われた柔軟性を取り戻すには、あなたが言及したすべてのものが必要です(私は静的型システムをバッシングしていません、柔軟性はしばしば正当な理由で奪われます)。これは、言語設計者が予期していなかった方法で値を使用する場合(たとえば、ハッシュテーブルにさまざまなタイプの値を配置する場合)、動的言語で処理する必要のない多くの複雑さです。

したがって、静的に型付けされた言語でこれらのことを実行できないわけではありません(ランタイムリフレクションがある場合)。それはもっと複雑です。

于 2009-01-29T23:59:50.893 に答える
1

私は実際にこれに関するブログ投稿を書きました: linky . しかし、その投稿は基本的に次のように要約できます。

コンパイル時に変数の型を指定する必要がないということで、どれだけの負荷がかかるかに驚かれることでしょう。したがって、python は非常に生産的な言語になる傾向があります。

一方で、優れた単体テストを行ったとしても、どのようなばかげたミスを犯してしまうのかに驚かれることでしょう。

于 2009-01-30T00:27:21.853 に答える
0

JavaScriptでこのe4xの例を見てください。

var sales = <sales vendor="John">
    <item type="peas" price="4" quantity="6"/>
    <item type="carrot" price="3" quantity="10"/>
    <item type="chips" price="5" quantity="3"/>
  </sales>;

alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
  alert( price );
}

特に、次の行を見てください。

alert( sales.item.(@type == "carrot").@quantity );

通常の静的言語では、アイテムが実行時までsalesのプロパティであることがわからないため、sales.itemを記述できません。これはe4xに限定されません。SOAPクライアントまたは実行時までわからないその他の基になるタイプを作成するときに接続するときに、同様のスタイルでプログラムを作成できます。静的言語では、通常、非常に冗長な方法でスタブクラスまたはプログラムを生成するツールを実行する必要があります。次に、Webサービスで何かが変更された場合は、スタブを最初からやり直す必要があります。JavaDOMコードを見てください。

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement( "root" );

        Element author1 = root.addElement( "author" )
            .addAttribute( "name", "James" )
            .addAttribute( "location", "UK" )
            .addText( "James Strachan" );

        Element author2 = root.addElement( "author" )
            .addAttribute( "name", "Bob" )
            .addAttribute( "location", "US" )
            .addText( "Bob McWhirter" );

        return document;
    }
}

動的コードよりも間違いなくはるかに冗長です。そしてもちろん、静的に型付けされていません。実行時まで、「作成者」のつづ​​りを「autor」と間違えたことを確認する方法はありません。この冗長性はすべて、本質的に静的なスタイルで動的なものをキャプチャできるようにするために本質的に存在します。

これが動的言語の強みのひとつだと思います。

于 2009-03-20T17:59:33.347 に答える
0

Perl のような動的言語を見つけましたが、それほどではないが Python を使用すると、実行する必要があることに対して手早く簡単なスクリプトを作成することができます。動的言語では実行サイクルがはるかに短く、多くの場合、静的に型付けされた言語よりも少ないコードを記述する必要があるため、生産性が向上します。残念なことに、これには保守性が犠牲になりますが、それはプログラム自体の言語ではなく、動的言語でプログラムを作成する方法に問題があります。

于 2009-01-30T01:01:42.640 に答える
-2

コンパイル済み言語は、効率と型の安全性が優先される場合に使用される傾向があります。そうでなければ、誰もルビーを使わない理由が思いつきません :)

于 2009-01-30T01:01:51.643 に答える