2

私は、言語が「動的」であることが実際に何を意味するのかをよりよく理解しようとしています。Adobe(旧Macromedia)Director製品ラインのスクリプト言語であるLingoについてはかなりの経験があり、「動的言語」と見なされるのではないかと思っています。

変数とリストの処理方法は、私には非常に「動的言語」のように思えます。

変数を使用すると、foo = 3またはを書くだけbar = "Hello World"です。int変数をまたはとして宣言しないでください-それはそのままでそれstringを理解します。

リストを使用すると、のようなものを書くことができますmiscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]。これは?に似ていませんtupleか?

これらの機能は、「動的言語」ステータスの資格を得るのに十分ですか?

興味深いことに、私はC#をより多く使用し、Director / Lingoをより少なく使用していますが、最近の動的言語に対するすべての興奮で、私は実際に穀物に反対しているのではないかと思います。

編集

以下のMarkRushakoffの回答に関して、このWikipediaの記事を使用して、Lingoが「動的」であるかどうかを分析する試みを示します。

  1. Eval--Lingoにはキーワードがdoあります。コマンド全体を実行します。たとえば、または。文字列を数値に変換しようとしますが、これは単なる解析演算子ではありません。実際には、変数の文字列表現をその数値に変換できます。たとえば、ステートメントが23と評価されると仮定します。valuedodo "foo = 23"do "foo = sum(20, 3)"valuefoo = 23value("foo")

  2. 高階関数-私がこの権利を理解している場合、これは基本的に私がC#で「デリゲート」と呼ぶものです。Lingoは、私が知る限り、これを直接サポートしていませんが、関数を持つ型(「親スクリプト」と呼ばれる)を作成し、その型のインスタンスを渡すことはできます。

  3. 閉鎖-私が知る限り、これはサポートされていません。

  4. 継続-私が知る限り、これはサポートされていません。

  5. リフレクション-少なくともある意味ではそうです。実際には、文字列を使用して型の新しいインスタンスを作成します(例:fooInstance = script("Foo").new(bar)。型のインスタンスを、型の名前を含む文字列に変換することもできます(したがって、c#のGetType()機能を模倣することができます)。プロパティの名前を知らなくてもタイプのプロパティをクエリして(たとえば、インデックスでプロパティを検索する)、インデックスでプロパティの名前を見つけることもできます。

  6. マクロ-ウィキペディアの記事がマクロを説明しているように、私はそうは思わない。ただし、実行時にスクリプトを編集することは可能ですが、それが重要になる可能性があります。

したがって、Lingoは動的機能で6点満点中2〜3点を獲得しているようですが、Lingoがそれらをサポートしていないことを確認するには、クロージャと継続について十分に明確ではありません。何を結論付けたらいいのかわからないと思います。コメントを歓迎します。

4

4 に答える 4

5

型推論 ( and の例foo = 3などbar = "Hello World") は、動的言語を意味するものではありません。C#のvarキーワードは、コンパイル時に変数の型を推測します。また、Haskell は、コンパイルされたプログラムであっても、すべての変数に対して暗黙の型指定を使用できます。

「動的プログラミング言語」はかなり大まかに定義された用語ですが、修飾子を 1 つに限定する必要があるとすれば、それはランタイム リフレクションになると思います。リフレクションを実行できる場合は、ウィキペディアの記事にリストされている他の修飾子 (eval、オブジェクトのランタイム変更、クロージャー、マクロなど) を実行できる可能性があります。

私は Lingo 言語について何も知りませんが、一般的に、ある言語を動的であると見なすよりも、ある言語を動的であると見なす方が簡単だ思います。Lingo はウィキペディアの記事の修飾子の一部またはすべてを実行できますか? そうでない場合は、おそらく動的ではありません。それができるなら、それはおそらく少なくとも「十分に動的」です。

于 2009-11-02T02:07:05.977 に答える
2

「ダイナミック」という言葉はファッショナブルな言葉のひとつですが、実際には「私がやっていることはかっこいい」という意味過ぎません...正確な定義はありません。

そうは言っても、型についてのあなたの質問に答えることができます。あるいは、少なくとも型付き言語と型なし(一部の人々は動的または動的型付き)言語の違いをよりよく説明しようと試みることができます。

型付き言語は、プログラムを実行するに実行できない変数を使用して何かを実行しようとしないことを確認します。型指定されていない言語はこのチェックを行いません-それは単に最良のものを期待し、それが必要なものに不適切な値を持っている場合、エラーを出します。

これらは2つの極端です。人生のすべてのように、実際には言語は2つの理論上の両極端の間のどこかにあります。したがって、言語が型指定されているか型指定されていないかを判断するのは難しい場合があります。多くの場合、「言語Xはコンパイル時に言語Yよりも型チェックが優れています。これらのエラーはXでキャッチされますが、Yではキャッチされないためです。... 。」

その定義を考えると、(1)型付き言語はプログラムでより多くのテキストを必要とする(各値がどの型であるかを言う必要があるため)、(2)型付き言語は不必要にできることを制限する可能性がある(型システムは、あなたが見ることができる何かが機能することを可能にするほど賢くはありません)。

これらは両方とも問題になる可能性があります。しかし、これらは両方とも、型付き言語が良くなるにつれて重要性が低下している問題です。たとえば、次のようなコードがあるのはなぜですか。

String s = "hello"

それがただで明らかなとき

s = "hello"

その「s」は文字列でなければなりませんか?このように「スマート」で、すべてのタイプが何であるかを言う必要はないが、まだチェックされている言語は、最初にその方法を考え出した人々であるため、「HindleyMilner」と呼ばれることがよくあります。詳細に。

したがって、Hindley Milner型システムを使用する言語用に作成されたプログラムを見ると、型がないように見える場合があります。しかし、それは間違いです。それでも、プログラムを実行する前に、すべての変数のすべてのタイプが何である必要があるかを調べ、間違ったタイプで何かをしようとしてエラーが発生しないことを確認します(これは素晴らしいと思います-これはに近いです一種の人工知能...)

つまり、言語が入力されているかどうかを知る唯一の方法は、その言語がどのように実装されているかを知ることです。ソースを見ただけでは明らかではないかもしれません。

編集:私は上記を読み直しただけで、もう少し明確にできたはずです。私が作ろうとしていたのは、型システムのある言語とない言語の違いでした。型システムには、型自体と、型が正しいことを確認するロジックの2つが含まれます。

私が「型なし」(または動的型付き)と呼んでいた言語には型があります。たとえば、Python(型指定されていない動的言語)では、文字列と整数の間に違いがあります。ただし、実行前にプログラムをチェックする追加のロジックはありません。したがって、型はあるが型システムはないと言う方が正確です。

対照的に、「型付き」言語は、私が言ったように、プログラムを実行するにチェックするので、型だけでなく、その作業を行うための追加のロジックが必要です。

于 2009-11-10T12:54:51.233 に答える
1

プログラミング言語が「動的」であると言うとき、通常は動的型システムを指しています。私がこれまでに読んだ動的型システムとは何か (およびそうでないもの) の最も良い定義は、Chris Smith の優れた記事What to Know Before Debating Type Systemsです。

この記事を読んだら、特定の言語が静的型付けと動的型付けのどちらであるかについての答えが得られるはずです。

于 2009-11-02T22:51:10.953 に答える
0

Lingo が動的言語であることを示したいと思います。

Lingo の関数型プログラミング フレームワークであるLingoFを作成しました。このフレームワークは完全に Lingo で記述されており、エクストラや低レベルのコンポーネントは使用されていないため、言語が動的でなければ、このようなフレームワークを開発することはできません。

そのフレームワークを考慮して、動的言語としての Lingo に対する私の評価は次のとおりです。

1 - Eval - Lingo にはキーワードがdoあります。valueさらに、実行時にスクリプトをコンパイルできます。LingoF の機能「Lingo Expressions」を参照してください。

2 - 高次関数 - LingoF は、Lingo で高次関数を広範囲に使用する方法を示しています。

3 - クロージャー - 再び LingoF は、Lingo でクロージャーを操作する方法を示します。

4 - 継続 - LingoF シンタックス ヘルパーは継続テクニックで定義されます。継続渡しスタイルで関数を書くことができます。これを確認してください (LingoF モジュールから取得):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - 振り返り - すでに「はい」と答えており、同意します。たとえば、LingoF モジュール マネージャーは、DanM が言及した Lingo の Reflection 機能を使用して実装されています。

6 - マクロ - この分野については、さらに調査を行う必要があります。Director はリンク スクリプト (外部テキスト ファイルに保存されたスクリプト) をサポートしているため、ある種のマクロを実装することができます。startMovieたぶん、マクロ マネージャは(それらを展開するため) やstopMovie(再び圧縮するため)のようないくつかのイベントをインターセプトできます。もう 1 つの可能性は、フィールドをスクリプトとして使用し、それらをスクリプト メンバーに展開することです。うまくいくと確信しています。

したがって、動的機能に関する私のスコアは 6 段階中 5 から 6 です。

于 2010-01-18T05:02:53.270 に答える