人々は動的言語について何がそんなに魅力的だと思いますか?[閉まっている]


81

最近、誰もがダイナミックでコンパイルされていない時流に飛び乗っているようです。私は主に、コンパイルされた静的型付き言語(C、Java、.Net)でのみ作業しました。私が動的言語で経験したことは、ASP(Vb Script)、JavaScript、PHPなどです。これらのテクノロジーを使用することは、動的言語について考えるときに私の口に悪い味を残しました。変数名のスペルミスや変数への間違った型の値の割り当てなど、通常はコンパイラーによって検出されることは、実行時まで発生しません。それでも、新しい変数を作成し、デフォルト値を割り当てるだけなので、エラーに気付かない場合があります。また、変数には明示的な型がないため、動的言語でインテリセンスがうまく機能するのを見たことがありません。

私が知りたいのは、動的言語について人々がとても魅力的だと思うものは何ですか?動的言語で実行できること、実行できないこと、またはコンパイル言語では実行が難しいことに関する主な利点は何ですか。かなり前に、コンパイルされていないaspページがランタイム例外をスローするようなことは悪い考えだと私たちが決めたように思えます。このタイプのコードが復活したのはなぜですか?そして、少なくとも私には、Ruby on Railsが10年前にASPで実行できなかったもののように見えないのはなぜですか?


9
動的言語を擁護するものが非常に少ないのを見るのはちょっと悲しい(そして奇妙な)。
davidtbernal 2009年

11
これが、以下のすべての動的嫌悪を和らげる唯一の方法なので、ここで答えます。動的言語を使用すると、コードをより速く書くことができます。2つの方法はありません。変数のタイプについて心配する必要はありません。また、コードを作成するために大きな重いIDEを起動する必要もありません。したがって、型システムの煩雑さのために静的型システムでは時間がかかるような迅速なタスクを実行する方がはるかに優れており、コミラーにすべてを伝えることができます。
RCIX 2009年

2
C#プログラマーの偏狭近視とは何ですか?
azeem.Butt 2009年


5
問題となっているスペルミスのある変数名は、静的/動的ではなく、暗黙的な変数宣言に由来します。明示的な変数宣言を必要とする動的言語(Smalltalkなど)には、この問題はありません。
Frank Shearar 2010

回答:


101

その理由は、人々が静的に型付けされた言語に慣れていて、型システムが非常に限られていて表現力がないためだと思います。これらはJava、C ++、Pascalなどのような言語です。より表現力豊かな型システムとより良い型推論の方向に進む代わりに(たとえばHaskellのように、そしてある程度SQLでさえ)、一部の人々はただ維持することを好みます彼らの頭の中(そして彼らのテスト中)のすべての「型」情報と静的型チェックを完全に排除します。

これが最終的に何を買うのかは不明です。タイプチェックについては多くの誤解された概念がありますが、私が最もよく遭遇するのはこれら2つです。

誤謬:動的言語はそれほど冗長ではありません。誤解は、型情報は型注釈と等しいというものです。これは完全に真実ではありません。型の注釈が煩わしいことは誰もが知っています。マシンはそれを理解できるはずです。そして実際、それは現代のコンパイラーで行われます。これは、Haskellの2行に静的に型付けされたQuickSortですhaskell.orgから):

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

そして、これがLISPで動的に型付けされたQuickSortですswisspig.netから):

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

Haskellの例は、静的に型付けされた仮説を偽造しているため、冗長です。LISPの例では、仮説が冗長であるため、静的に型指定されています。タイピングと冗長性の間には、どちらの方向にも影響はありません。あなたはそれをあなたの心から安全に取り除くことができます。

誤謬:静的に型付けされた言語は、解釈されるのではなく、コンパイルされる必要があります。繰り返しますが、真実ではありません。多くの静的に型付けされた言語にはインタプリタがあります。Haskell用のScalaインタープリター、GHCiおよびHugsインタープリターがあります。もちろん、SQLは静的に型付けされ、私が生きているよりも長い間解釈されてきました。

ご存知のように、ダイナミックな群衆は、自分たちがしていることについてそれほど慎重に考える必要がない自由を望んでいるだけかもしれません。ソフトウェアは正しくないか堅牢ではないかもしれませんが、そうである必要はないかもしれません。

個人的には、ちょっとした一時的な自由を買うために型安全性をあきらめる人は、自由にも型安全性にも値しないと思います。


26
自由のために安全なタイプを
あきらめる

6
lispはそれ自体が非常に冗長であり、動的に型付けされることとは何の関係もありません... Pythonで試してみてください。def qsort(l):return qsort([x for x in l [1:] if x <l [0]])+ l [0] + qsort([x for x in l [1:] if x> = l [0]])if l else l
fortran 2009

13
それがまさにポイントです。動的または静的に型指定されることとは何の関係もありません。
Apocalisp 2009

9
あなたの例はかなり貧弱だと私は主張します。動的言語を称賛する人々は、おそらくHaskellのLispを選択していません。彼らはおそらくJavaやC#よりもPythonやRubyを選んでいます。
Corey D

8
議論は、冗長性とタイプ性の間に関連があるということです。ご覧のとおり、そのような偶然は純粋な偶然です。私がこれらの言語を選んだ理由は、まさに非定型です。Haskellは他の何よりも強く型付けされているので、静的に型付けされた言語の良い代表です。LISPは典型的な動的言語であり、他のすべての言語は必然的に模倣しますが、複製することはありません。
Apocalisp 2009年

70

コンパイラーが行うことを置き換えるために、単体テストで10倍のコードカバレッジを記述する必要があることを忘れないでください:D

私はそこに行ったことがあり、動的言語でそれを行いましたが、まったく利点がありません。


4
嬉しいのは私だけではありません。夜はぐっすり眠れます。
erikkallen 2009

これは確かに、動的型付けに対する静的型の大きな利点です。コンパイラがさらにいくつかのバグを見つけられるようにするためだけに、C ++でtypesafetypedefを見逃した回数はわかりません。(コンパイラーに行きなさい、行きなさい!私にもう少しバグを取りなさい!:-)
Dimitri C.

ナンセンス。メソッドをテストしていて、メソッドを呼び出すメソッドをテストしている場合は、パラメーターの受け渡しに問題がないことがわかります。定義上、十分にテストされたコードは、静的型付けによる追加のメリットをまったく得られません。
ガースキッド2010

4
@Garth:奇妙な定義。多くの人が同意することはありません。OTOH、ほとんどの人は、コンパイラの型チェッカーが多くの(時には非常に複雑な)テストを実装することに同意するでしょう。
Konrad Rudolph

3
@yar、コードをテストしていない場合は、ロジックのバグに対して脆弱です。私はPythonで10年間働いてきましたが、今はそうです。実稼働環境でTypeErrorが発生したことはないと思います。ただし、ロジックのバグはたくさんあります。結論:静的型チェックはあまり必要ありませんが、ユニットテストは間違いなく必要です。
Garth Kidd

40

他の人の反応を読むとき、動的言語には多かれ少なかれ3つの議論があるようです。

1)コードはそれほど冗長ではありません。これは有効ではありません。一部の動的言語は、一部の静的言語よりも冗長ではありません。ただし、F#は静的に型付けされていますが、静的に型付けしても、コードはほとんど追加されません。暗黙的に型付けされていますが、それは別のことです。

2)「私のお気に入りの動的言語Xには私のお気に入りの機能機能Yがあるので、動的が優れています」。機能と動的を混同しないでください(なぜこれを言わなければならないのか理解できません)。

3)動的言語では、結果をすぐに確認できます。ニュース:Visual StudioのC#でも(2005年以降)それを行うことができます。ブレークポイントを設定し、デバッガーでプログラムを実行し、デバッグ中にプログラムを変更するだけです。私はいつもこれをしていて、それは完璧に機能します。

私自身、主な理由の1つである保守性のために、静的型付けを強く支持しています。私はそれはJavaScriptのカップルの10kラインでシステムを持っており、いずれかの私は(存在しない)コンパイラはその変数が台無しにリネームものを私に教えてくれませんので、半日のようになりますやりたいリファクタリング。そして、それは私が自分で書いたコードであり、IMOもよく構成されています。他の誰かが書いたのと同等の動的システムを担当するという仕事は望まないでしょう。

私はこれに大いに反対票を投じると思いますが、チャンスをつかみます。


引用:動的言語では、結果をすぐに確認できます。ニュース:Visual StudioのC#でも(2005年以降)それを行うことができます。ブレークポイントを設定し、デバッガーでプログラムを実行し、デバッグ中にプログラムを変更するだけです。私はいつもこれをしていて、それは完璧に機能します。これは初日(1995年?)からDelphiにあり、おそらくその前にTurbo Pascalにありました(正確には覚えていません)。
No'am Newman

6
1万行のJavaScript?約9,000行が多すぎると思いますが、スクリプト言語が大好きです...
オズ。

@ No'am:わかっています。Visual C ++ 6でもそれを行うことができます(これは、VS2k5がリリースされるまでC#に切り替えないことが実際の主なポイントでした)。どちらかといえば、これはポイントを追加するだけです。@Oz:私のJSがどれだけの仕事をしなければならないかをどうやって知るのですか?
erikkallen 2009年

変更を確認したい人は、VSではなくプレーンテキストエディタを使用するのと同じようにすぐに有効になると思います。それぞれ自分自身に。JSLintのようなものの使用を検討するかもしれません。
dlamblin 2009年

2
リファクタリングの良い点。私はラピッドプロトタイピングと小さなスクリプトのためにRubyを本当に楽しみ始めていますが、静的な型付けなしに複数の開発者にわたって大きな製品を維持しようとは決してしません。
LoveMeSomeCode 2010年

19

VBScriptは、VBの別のフレーバーと比較しない限り、最悪です。PHPは、大きくなりすぎたテンプレート言語であることを覚えている限り、問題ありません。現代のJavascriptは素晴らしいです。本当に。たくさんの楽しみ。「DHTML」とタグ付けされたスクリプトには近づかないでください。

ランタイムエラーを許可しない言語を使用したことはありません。私見、それは大部分が赤字です。コンパイラはすべてのタイプミスをキャッチするわけではなく、意図を検証するわけでもありません。明示的な型指定は、明示的な型が必要な場合に最適ですが、ほとんどの場合、そうではありません。ここで質問を検索するgenericsか、符号なし型を使用することがインデックス変数に適しているかどうかについての質問を検索してください-多くの場合、このようなものは邪魔になり、時間があればいじくり回すことができます。

しかし、私はあなたの質問に本当に答えていません。なぜ動的言語が魅力的なのですか?しばらくすると、コードの記述が鈍くなり、アルゴリズムを実装したいだけだからです。あなたはすでにすべてをペンで座って解決し、潜在的な問題のシナリオを図解し、それらが解決可能であることを証明しました。あとは、20行の実装をコード化するだけです...そして200行の定型文をコンパイルしてください。次に、使用している型システムが実際に行っていることを反映していないことに気付きますが、他の誰かがあなた行っている可能性があることについての超抽象的な考えを持っており、ずっと前にプログラミングを放棄して、微調整を行っていました。強迫観念-それは架空の探偵エイドリアンモンクさえ恥ずかしいでしょう。

それはあなたが漆喰を塗るときです動的言語を真剣に見始めます。


面白いもの... Rubyが私を納得させるかどうかを確認します。PHPはそうではありませんが、その多くはOOのものが後から付け加えられたものだからだと思います。
ダンローゼンスターク2009年

3
「20行の実装...そしてそれをコンパイルするための200行の定型文」:私はこの声明に同意しません。確かに、それはJavaの時代には真実でしたが、C#3とScalaによって、必要な定型文の量が大幅に削減されました。
cdmckay 2009

5
Javaの時代は終わりましたか?ビールを割って祝う準備をします...待って... C ++。
Shog9 2009

2
「VBScriptは、VBの別のフレーバーと比較しない限り、最悪です」え?VBScriptがVisualBasicの最良のバリアントであると言っていますか?私はあなたを過小評価したに違いない。
MusiGenesis 2009

19

私はフルタイムの.Netプログラマーであり、静的に型指定されたC#の苦境に完全に固執しています。しかし、私は最新のJavaScriptが大好きです。

一般的に言って、動的言語では、静的に型付けされた言語よりも簡潔に意図を表現できると思います。多くの場合、それらが自明である場合に、表現しようとしているものの構成要素を定義する時間とスペースが少なくて済みます。

動的言語にも複数のクラスがあると思います。VBScriptで従来のASPページを作成することに戻るつもりはありません。有用であるためには、動的言語は、オブジェクト(またはオブジェクトに渡されるもの)を表現してより複雑な構造を構築できるように、コアである種のコレクション、リスト、または連想構造をサポートする必要があると思います。(たぶん私たちは皆LISPでコーディングするべきです...それは冗談です...)

.Netサークルでは、動的言語はVBScriptやJavaScriptに関連付けられているため、悪いラップになると思います。VBScriptは、Kibbeeが述べた多くの理由で悪夢として思い出されました。誰もが、CLngを使用してVBScriptで型を強制し、32ビット整数に十分なビットを確保することを覚えています。また、JavaScriptは、すべてのブラウザーで異なる方法で記述されたドロップダウンメニューのブラウザー言語と見なされていると思います。その場合、問題は言語ではなく、さまざまなブラウザオブジェクトモデルです。興味深いのは、C#が成熟すればするほど、ダイナミックに見え始めることです。ラムダ式、無名オブジェクト、型推論が大好きです。毎日JavaScriptのように感じます。


1
誰かがファイル処理、ソケット、およびGUIライブラリをJavaScriptに追加してから、コンパイラを構築することを
望み


また、jscriptを使用してWindowsGUIアプリを作成することは常に可能です。まあ、とにかく非常に長い間。詳細については、「windowshta」を参照してください-ブラウザでは取得できないhtaで実行される追加のAPIを取得します。ダッシュボードウィジェットは非常に強力です。iphone上のWebアプリケーションは多く、ほとんどの人が彼らのために信用を与えるよりも強力。Appleは、モバイルサファリでJSを閲覧するために多くの強力なAPIを利用できるようにしました。
ブルトン語


ここでの意図は+1です。コードはいつか静的言語に翻訳されるかもしれませんが、ダイナミクス(特にPython)は1回限りのプロトタイプに最適です。
new123456 2011年

18

これは、Haskellの2行に静的に型付けされたQuickSortです(haskell.orgから):

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

そして、これがLISPで動的に型付けされたQuickSortです(swisspig.netから):

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

ここでは、選択した言語で物事にバイアスをかけていると思います。Lispは悪名高いパレンヘビーです。Haskellに近いのはPythonでしょう。

if len(L) <= 1: return L
return qsort([lt for lt in L[1:] if lt < L[0]]) + [L[0]] + qsort([ge for ge in L[1:] if ge >= L[0]])

ここからのPythonコード


25
それはレトルトではなく、裏付けとなる議論です。言語の型システム(またはその欠如)は、それが冗長であるか簡潔であるかについてほとんど教えてくれないことを示しています。
Apocalisp 2008

2
私はApocalispに同意します。冗長性は、動的言語でも静的言語でも依存しません。静的/動的型付けは、言語の冗長性にほとんどまたはまったく影響を与えないとさえ言えます。そうです、これはレトルトを破壊する静的型付けキャンプではありません。
BefittingTheorem 2009

またはperl!sort(@array);
ジェームズアンダーソン

Apocalispの全体的な比較はでたらめでした。まず、クイックソート(Tony Hoareによる元の論文で定義されている)は、最小限の余分なスペースを使用するように特別に設計されたインプレースアルゴリズムですが、Apocalispは、漸近的により多くのメモリを浪費し、数百回実行されるHaskellコミュニティのろくでなしのアウトオブプレースバージョンを使用しました実際のクイックソートよりも遅い。Haskellは突然変異(!)に依存しているため、実際のクイックソートアルゴリズムを表現するのに苦労しています。これらのHaskellの試みをチェックして、Haskellの簡潔さについて私に連絡
JD

第二に、言語の1つのために特別にろくでなしにされたアルゴリズムの2つの実装に基づいて、冗長性について強い発言をすることはできません。APL、J、K、Mathematica、またはその他の簡潔な(=最新の)動的に型付けされた言語を見てください。静的に型付けされた言語よりも簡潔にする必要があります。型推論はギャップを縮小しますが、それでもギャップがあるはずです。
JD

15

私にとって、動的言語の利点は、コードが少なくなり、RubyのブロックやPythonのリスト内包表記などの機能技術により、コードがどれだけ読みやすくなるかということです。

しかし、コンパイル時のチェック(タイプミスは発生します)とIDEのオートコンプリートが見落とされます。全体として、コードの量が少なくて読みやすさは私にとって有益です。

もう1つの利点は、言語の通常解釈される/コンパイルされない性質です。いくつかのコードを変更して、すぐに結果を確認してください。これは、開発中の時間の節約になります。

大事なことを言い忘れましたが、コンソールを起動して、これまで使用したことのないクラスやメソッドなど、よくわからないことを試して、その動作を確認できるという事実が気に入っています。コンソールには多くの用途がありますが、それはあなたが理解できるように残しておきます。


私が知っている少なくとも1つのPythonIDE(つまり、Pythonインタープリターの通常のビルドに付属しているIDLE)には確かにオートコンプリート機能がありますが、宣言された変数にはインタープリターウィンドウにしかありません。
JAB

読みやすい?クイックソートの例を見たことがありますか?何が起こっているのかわかりません。あなたはそれがどれだけ速く何かを書くことができるかを示すためにひどく書かれていると主張することができますが、それは読むことができません。
IAdapter 2009

1
@ 01:言語の一般的な構成を使用しています。あなたが言語の基本を知っていれば、それはかなり読みやすいです。
エステバンKüber

1
読みやすさは動的型付けとは何の関係もありません。たとえば、Scalaのラムダは通常、Rubyのブロックよりも短く(そして間違いなくより表現力があります)、HaskellとPythonのリスト内包表記を比較しても同じです。REPLコンソールは、F#、Scala、Haskellなどに存在します。変更されたコードを実行中のアプリケーションにすばやくロードすることは、動的言語の長所です。静的言語(JavaRebelなど)を可能にするいくつかのテクノロジーがありますが。
Alexey 2010

1
興味深いことに、私はコードがあまり読みにくいと感じています。1つ目は、IDEを使用して宣言や埋め込みドキュメントなどを見つけることができないことが多いためです。2つ目は、構文が非常にコンパクトであるため、一体何を意味するのかを忘れてしまいます。また、IDEのオートコンプリートが失われることをはるかに重視します。天の恵みであるだけでなく、保守性も絶対に向上すると思います。
spronkey 2010

12

動的言語に対するあなたの議論は完全に有効です。ただし、次の点を考慮してください。

  1. 動的言語はコンパイルする必要はありません。実行するだけです。ほとんどの場合、アプリケーションを再起動せずに、実行時にファイルをリロードすることもできます。
  2. 動的言語は一般的に冗長性が低く、読みやすくなっています。静的言語で実装された特定のアルゴリズムまたはプログラムを調べて、RubyまたはPythonの同等のものと比較したことがありますか。一般に、コード行を3分の1に削減することを検討しています。動的言語では多くのスキャフォールディングコードが不要であるため、最終結果が読みやすくなり、目前の実際の問題に焦点が当てられます。
  3. タイピングの問題について心配する必要はありません。動的言語でプログラミングする場合の一般的なアプローチは、タイピングについて心配することではありません。ほとんどの場合、正しい種類の引数がメソッドに渡されます。そして時々、誰かがたまたまうまくいく別の種類の議論を使うかもしれません。問題が発生すると、プログラムが停止する場合がありますが、いくつかのテストを実行した場合、これはめったに発生しません。

私も最初は静的型付けの安全な世界から離れるのが少し怖いと思いましたが、私にとっては長所が短所をはるかに上回り、振り返ることはありませんでした。


23
1 ..完全なゴミ。コンパイルが表示されないからといって、コンパイルが行われないという意味ではありません。それはあなたが走っている間に起こるだけです。2 ..完全なゴミ。適切に構造化されコメント化されたコードは、すべての言語で簡単に準備できます。3ほとんどの場合!ほとんどの場合、どの世界で快適に感じますか?めったにありません!
baash05 2009

7
@wvdschel:あなたの論理では、C#やJavaのようなコンパイルされた言語は、IDEの[再生]ボタンをクリックするだけで実行されるため、コンパイルする必要はないと主張できます。IDEがコンパイルされていることに気づかないので、「問題ではありません」。
cdmckay 2009

2
@cdmckay:実行中のC#/ Javaプログラムに接続して、実行中にコマンドを実行し、実行中に変更またはクエリを実行できますか。インタープリター型(多くの動的言語)の言語では、コンパイルされた言語では不可能なランタイムイントロスペクションが可能です。
RHSeeger 2009

4
@ RHSeeger-ええと、そうです、VisualStudioですべてを行うことができます。編集と続行は動的言語に限定されません。
グレッグブナ

4
@ baash05、この回答のポイントを完全に見逃していると思います。1。は、コンパイラがすべての小さな変更の影響を確認するのを待つ必要がなく、コードを正しく実行できることを意味します。2.天候がその影響に同意するかどうかにかかわらず、この事実を主張することなく、記述および読み取りのコードが少なくなります。
ファイアクロウ

8

動的型付け言語に対する「新たに発見された愛」は、特定の動的言語の人気の高まりよりも、静的型付け言語が絶対的な意味で優れているか最悪であるかとは関係がないと思います。Ruby on Railsは明らかに、動的言語の復活を引き起こす大きな現象でした。Railsを非常に人気のあるものにし、静的キャンプから非常に多くの変換を作成したのは、主に、非常に簡潔でDRYのコードと構成でした。これは、大量のXML構成を必要とするJavaWebフレームワークと比較した場合に特に当てはまります。多くのJavaプログラマー(賢いプログラマーも)が転向し、ルビーや他の動的言語を伝道した人もいます。私にとって、3つの異なる機能により、RubyやPythonなどの動的言語をより簡潔にすることができます。

  1. ミニマリスト構文-大きな問題は、型の注釈が不要なことですが、言語設計者は最初から言語を簡潔に設計しました
  2. インライン関数構文(またはラムダ)-インライン関数を記述し、それらを変数として渡す機能により、多くの種類のコードがより簡潔になります。特に、これはリスト/配列操作に当てはまります。このアイデアのルーツは明らかに-LISPでした。
  3. メタプログラミング-メタプログラミングは、レールを動かしているものの大きな部分です。これにより、コードをリファクタリングする新しい方法が生まれ、ライブラリのクライアントコードをより簡潔にすることができました。これもLISPに由来します。

これらの3つの機能はすべて動的言語に限定されているわけではありませんが、今日の一般的な静的言語であるJavaとC#には確かに存在しません。C#はデリゲートで#2を持っていると主張するかもしれませんが、リスト操作などでは、C#はまったく広く使用されていないと主張します。

より高度な静的言語に関しては... Haskellは素晴らしい言語であり、#1と#2があり、#3はありませんが、型システムは非常に柔軟なので、メタの欠如を見つけることはおそらくないでしょう。制限する。言語拡張機能を使用して、コンパイル時にOCamlでメタプログラミングを実行できると思います。Scalaはごく最近追加されたものであり、非常に有望です。.NETキャンプのF#。しかし、これらの言語のユーザーは少数派であるため、プログラミング言語の状況におけるこの変化には実際には貢献していません。実際、Rubyの人気は、他の動的言語に加えて、Haskell、OCaml、Scala、F#などの言語の人気にプラスの影響を与えたと私は信じています。


5
-1:無知。OCamlを含むMLファミリーの言語は、メタプログラミングのために特別に開発されました。そのため、MLはメタ言語の略です。MLプログラマーは、プログラミング言語の世界に革命を起こし続けています。.NETとJavaのジェネリックはMLから来ました。Microsoftの新しいVisualF#2010は直接MLの子孫です(そしてそれはあなたの#1、#2、#3を満たします)。
JD

7

個人的には、あなたが使った「動的」言語のほとんどは、たまたま一般的な言語の貧弱な例だと思います。

私は、CやJavaよりもPythonの方がはるかに生産的であり、edit-compile-link-runダンスをしなければならないという理由だけではありません。私はObjective-Cでより生産的になっていますが、それはおそらくフレームワークによるものです。

言うまでもなく、私はこれらの言語のいずれにおいてもPHPよりも生産性が高くなっています。地獄、私はPHPよりもSchemeまたはPrologでコーディングしたいです。(しかし、最近、私は実際に他の何よりも多くのPrologを行っているので、それを一粒の塩で取ってください!)


6

動的言語に対する私の感謝は、それらがどれほど機能的であるかに非常に関係しています。Pythonのリスト内包表記、Rubyのクロージャ、JavaScriptのプロトタイプ化されたオブジェクトはすべて、これらの言語の非常に魅力的な側面です。すべてに一流の機能も備わっています。これは、二度となくては生きていくことができないものです。

PHPとVB(スクリプト)を同じように分類することはしません。私にとって、これらはほとんどが命令型言語であり、動的型付けの欠点がすべてあります。

確かに、(コンパイル時間がないため)同じレベルのコンパイル時チェックは得られませんが、静的構文チェックツールは、少なくとも部分的にその問題に対処するために時間とともに進化すると予想されます。


JavaScriptのプロトタイプオブジェクトが好きだと言う人さえ聞いたことがありません。
erikkallen 2009

6

動的言語で指摘されている利点の1つは、コードを変更して実行を継続できることです。再コンパイルする必要はありません。VS.Net 2008では、デバッグ時に、実際にコードを変更して、再コンパイルせずに実行を継続できます。コンパイラーとIDEの進歩により、動的言語を使用することのこの利点やその他の利点がなくなる可能性があります。


動的に型付けされた言語に固有の、実行中のシステムのコードを変更できるものは何もないというのは正しいことです。インタープリター型言語の方がはるかに簡単ですが(動的と混同しないでください)、コンパイルされたコードでも実行できます。一例として、OracleのPL / SQLは静的に型付けされたコンパイル言語であり、Oracleには、実行中のシステムでPL / SQLプロシージャを変更できる機能が数十年前からあります。
Apocalisp 2009年

現在、MonoにC#の担当者がいます-mono-project.com/CsharpRepl
Steve

動的言語は、デバッガーの外部で、アプリケーション内からそのようなことを行うことができます。また、ユニットテスト時にクラスにモンキーパッチを適用できる可能性があるため、時間の節約になります。
エステバンKüber

6

ああ、私が同様の質問を投稿したとき、私はこのトピックを見ませんでした

動的言語についてここで言及されている他の人々の優れた機能は別として、私は誰もが1つ、最も基本的なこと、つまりメタプログラミングを忘れていると思います。

プログラムのプログラミング。

コンパイルされた言語で行うのはかなり難しいですが、一般的には、たとえば.Netを取り上げます。それを機能させるには、あらゆる種類のマンボジャンボを作成する必要があり、通常、実行速度が約100倍遅くなるコードで終了します。

ほとんどの動的言語にはメタプログラミングを行う方法があり、それが私をそこに留めておくものです。メモリ内にあらゆる種類のコードを作成し、それをアプリケーションに完全に統合する機能です。

たとえば、Luaで電卓を作成するには、次のことを行う必要があります。

print( loadstring( "return " .. io.read() )() )

さて、.Netでそれをやってみてください。


6
電卓をよく作成しますか?「20文字でhelloworldアプリケーションを作成できる」というタイプの引数には、まったく値がありません。
erikkallen 2009年

あなたはあなたがどれほど非常に低い想像力を持っているかを示しました。m8のプログラミングには悪いことです。GL。
majkinetor 2009年

個人的になる必要はありません。ポイントは正しいと思います。タイプ 'の引数を思い付くのは非常に簡単です(そして非常に一般的です)。C#でコンソールに行を出力するためにどれだけのコードを書く必要があるかを見てください。luaではprint( "Hello、world")と言うことができます。 '。しかし、プロジェクトが現実的なサイズに成長したとき、ボイラープレートに対する実際のコードの比率はそのようにとどまりません。
erikkallen 2009年

2
でたらめ。.NETで実行される静的に型指定されたF#を次に示します。Linq.QuotationEvaluator.Evaluate<@ 2 + 3 @>
JD

6

動的(スレッドの焦点であるように思われるため、入力された)言語が好きな私の主な理由は、(作業環境で)使用した言語が、使用した非動的言語よりもはるかに優れているためです。C、C ++、Javaなど...これらはすべて実際の作業を行うための恐ろしい言語です。動的に型付けされた言語と同じくらい自然にプログラムできる暗黙的に型付けされた言語が欲しいです。

そうは言っても、動的に型付けされた言語で驚くべき特定の構造があります。たとえば、Tclでは

 lindex $mylist end-2

必要なインデックスを示すために「end-2」を渡すという事実は、非常に簡潔で、読者には明白です。私はまだそのようなことを達成する静的に型付けされた言語を見たことがありません。


1
これは$ mylist.length-2よりもどのように優れていますか?私には、この種の構文はキーワードを追加するだけで、実際の利点はないように見えます。つまり、言語を習得するのが難しくなります。
erikkallen 2009年

私は少し衒学者になりますが、言語自体にキーワードを追加するのではなく、そのコマンドにキーワードを追加することを指摘します。そうは言っても、それはより明確にすることの問題です。「終了」という用語は、そこに到達する方法ではなく、意図/意味を表します。「最後の要素」と書いてあります。
RHSeeger 2009年

1
私があなたが正しいと理解しているなら、その場合はさらに悪いです。各コマンドの新しい構文を学ぶ必要があります。コマンドfooで使用する場合、キーワードバーはどういう意味ですか?
erikkallen 2009年

@erikkallen:標準ライブラリへのさまざまな入力が他の言語で何であるかを学習するのと同じです。実際、コアTclのすべてのコマンドは、多かれ少なかれ、標準ライブラリの一部にすぎません。理論的には、削除して純粋なTclコードとして再実装できなかったコマンドはありません。そうは言っても、入力とその意味は、そのライブラリ全体でかなり一貫しています(つまり、endはすべてのコマンドで同じことを意味します)
RHSeeger 2009年

5

この種の議論は少しばかげていると思います。「変数名のつづりを間違えたり、変数に間違った型の値を割り当てたりするなど、通常はコンパイラーによってキャッチされることは、実行時まで発生しません」そうです。 PHP開発者私は実行時まで変数の入力ミスのようなものを見ませんが、実行時は私にとってステップ2です。C++(これは私が経験した唯一のコンパイル言語です)では、リンクしてコンパイルした後のステップ3です。
私のコードはコンパイル中です
言うまでもなく、保存を押してからコードを実行する準備ができるまでには数秒かかります。これは、文字通り数時間かかるコンパイル言語とは異なります。これが少し怒っているように聞こえたら申し訳ありませんが、コードをコンパイルする必要がないので、私を二流のプログラマーとして扱っている人にはうんざりしています。


3
ああ、実際には...まあ、私は無能かもしれませんが、PHPでは、変数のスペルミスによる落とし穴は非常に時間の浪費です。特に、厳密な警告をオンにできない巨大なコードベースを継承する場合。
ダンローゼンスターク2009年

1
常に厳密なerror_reporting()をオンにすることができ、優れたIDEを使用すると、変数のスペルミスの99%を防ぐことができます。
UnkwnTech 2009年

言うまでもなく、どの言語でもスペルを間違える可能性がありますが、私のインタプリタはリンク/コンパイルと同じステップにあるため、これらの間違いを見つけるのは簡単です(おそらく速くなります)。
UnkwnTech 2009年

4
-1:コンパイル引数は、静的または動的なタイピングに関する実際の引数から注意をそらしています。動的言語と静的言語の両方をコンパイルして解釈できます。スペルとコンパイル時間に関する苦情は、これらの問題の範囲外です。
BefittingTheorem 2009

文字通り何時間?オリジナルのIBMPCで、何をコンパイルしていますか?
xcramps 2009

3

議論はこれよりも複雑です(興味深い概要については、Yeggeの記事「弱いタイピングは十分強い」を読んでください)。

動的言語も必ずしもエラーチェックを欠いているわけではありません-C#の型推論はおそらく1つの例です。同様に、CとC ++にはひどいコンパイルチェックがあり、静的に型付けされています。

動的言語の主な利点は、a)機能(必ずしも常に使用する必要はない)とb)ボイドの反復法則です

後者の理由は巨大です。


3
型推論は動的型付けと同じではありません。これは、推論された型がコンパイル時に明確に認識される必要があるためです。
マーカスダウニング

4
-1:C#は静的に型付けされ、動的に型付けされません。
ジュリエット

2

私はまだRubyの大ファンではありませんが、動的言語は本当に素晴らしく強力なツールだと思います。

型チェックや変数宣言がないという考えは、それほど大きな問題ではありません。確かに、これらのエラーは実行時までキャッチできませんが、経験豊富な開発者にとってはこれは実際には問題ではなく、間違いを犯した場合、通常は簡単に修正できます。

また、初心者は自分が書いているものをもっと注意深く読むように強制されます。PHPを学ぶことで、実際に入力している内容にもっと注意を払うようになり、コンパイルされた言語でもプログラミングが改善されたことを知っています。

優れたIDEは、変数が「宣言」されているかどうかを知るのに十分なインテリセンスを提供し、変数が何であるかを判断できるように型推論を実行しようとします。

私の意見では、動的言語で実行できることの力が、動的言語を非常に楽しく使用できるようにしているのです。もちろん、コンパイルされた言語でも同じことができますが、より多くのコードが必要になります。PythonやPHPのような言語を使用すると、開発にかかる時間を短縮し、ほとんどの場合、機能的なコードベースをより速く取得できます。

ちなみに、私はフルタイムの.NET開発者であり、コンパイル言語が大好きです。私は自由な時間に動的言語を使用して、動的言語についてさらに学び、開発者としての自分自身を向上させています。


2
「経験豊富な開発者にとって、これは実際には問題ではない」という議論は、通常は少し危険だと思います。のように、C ++でのOOP /メモリ管理などは経験豊富な開発者にとって問題ではないと言えます。変数宣言や基本的な型チェックのような単純なもので、なぜ私はそれほど慎重で経験豊富である必要があるのですか?静的なアプローチを使用して簡単に防ぐことができるエラーを作成するのではなく、言語がプログラミングに役立つことを望んでいます。そして、冗長性は動的または静的な型付けとはほとんど関係がないと思います。HaskellまたはScalaをチェックしてください。
BefittingTheorem 2009

私は同意します、私は議論も少し危険だと思います。私のポイントは、コーディング時の型チェックの問題はそれほど悪くないということです。90%のケースですぐにエラーが表示されます。暗黙の型変換がストレスを引き起こす可能性があるケースの10%にとっては問題ですが、自分が何をしているのかを知っていれば、それを起こさせません。JavaSciptは、それが危険である可能性がある10%の優れた例ですが、JavaSciptを開発している間、私はJavaSciptに噛まれたことはありません。
ダンハーバート

@ブライアンヘイリン:それならあなたは嫌いでなければなりませんC!自分の足を撃つ方法はたくさんありますが、とてもよく使われ、(場合によっては)愛されています。
エステバンKüber

2

何を達成しようとしているのか、それを使って解決しようとしているのかによって、さまざまな種類の言語が必要だと思います。インターネットを介してデータベースからレコードを作成、取得、更新、および削除するアプリケーションが必要な場合は、静的に型指定された言語で最初から作成するよりも、1行のRORコード(スキャフォールドを使用)で実行する方が適切です。動的言語を使用すると、心が不思議に思うことから解放されます

  • どの変数がどのタイプを持っているか
  • 必要に応じて文字列を動的に拡張する方法
  • 1つの変数のタイプを変更した場合に、それと相互作用するすべての関数を書き直す必要がないようにコードを記述する方法

次のようなビジネスニーズに近い問題に

  • データがデータベースに保存/更新されているなど、どのように使用してサイトへのトラフィックを増やすことができますか

とにかく、緩く型付けされた言語の1つの利点は、それが想定どおりに動作する場合、それがどの型であるかを実際には気にしないことです。これが、動的型付け言語でダックタイピングを行う理由です。これは素晴らしい機能であり、必要に応じて同じ変数名を使用してさまざまなタイプのデータを格納できます。また、静的に型付けされた言語は、マシンのように考えるように強制します(コンパイラーはコードとどのように相互作用するかなど)が、動的に型付けされた言語、特にruby / rorは、マシンを人間のように考えさせます。

これらは、動的言語での私の仕事と経験を正当化するために私が使用する議論の一部です!


1
ポイント1と3は同じであり、IMOが静的型付けを好む理由です。タイプを互換性のないものに変更した場合はどうなりますか?変数をintからstringに変更する場合は、おそらく理由があります。そうでない場合は、すべてのビルドエラーがなくなるまでプロジェクトを再構築します。通常はそれほど時間はかかりませんが、その過程で、コンパイラーが指摘してくれてうれしいという本当の問題を発見することがあります。ポイント2は、文字列がC.除いて(私が推測する、私は最後の15年出会った少なくともすべての)すべての言語に自動的に実行されて成長し、無効である
erikkallen

アプリケーションによっては、どちらかのタイプの言語を他の言語よりも優先する理由があり、より高速な静的言語がより優れたパフォーマンスを提供する可能性があることに同意します。しかし、他のすべてのWebアプリケーションと同じように作成する必要がある場合は、静的言語よりも動的言語を使用する方が、機能をより速く提供できる方がよいと言っていました。また、x.func = "yes"およびx.func _ = "no"のように変数xを使用する必要があるとします。どちらのタイプでもかまいません。アヒルのように泳ぐ限り、アヒルです。そのため、動的型付けはダックタイピングとも呼ばれます。残り0!
umar

1

どちらのスタイルにも長所があると思います。私の意見では、このどちらかまたは両方の考え方は、私たちのコミュニティにとって一種の不自由です。私は上から下に静的に型付けされたアーキテクチャで作業しましたが、それは問題ありませんでした。私のお気に入りのアーキテクチャは、UIレベルで動的に型付けされ、機能レベルで静的に型付けされるためのものです。これはまた、UIと機能の分離を強制する言語の壁を助長します。

皮肉なことに、動的言語を使用すると、開発者は怠惰になり、コンピューティングの基礎についてあまり知らずに物事を成し遂げることができます。これが良いことか悪いことかは読者次第です:)


1

FWIW、ほとんどのアプリケーションでのコンパイルは数時間かかることはありません。私は、コンパイルに数分かかる200〜500k行のアプリケーションを使用してきました。確かに数時間ではありません。

私は自分でコンパイル言語を好みます。デバッグツール(私の経験では、すべてに当てはまるとは限らない)が優れており、IDEツールも優れているように感じます。

VisualStudioを実行中のプロセスにアタッチできるのが好きです。他のIDEはそれを行うことができますか?たぶん、でも私はそれらについて知りません。私は最近いくつかのPHP開発作業を行っていますが、正直言ってそれほど悪くはありません。ただし、私はC#とVSIDEの方がはるかに好きです。私はより速く働き、問題をより速くデバッグするように感じます。

それで、多分それは動的/静的言語の問題よりも私にとってツールセットのものですか?

最後のコメント...ローカルサーバーで開発している場合、保存はコンパイルよりも高速ですが、ローカルマシン上のすべてにアクセスできないことがよくあります。データベースとファイル共有は他の場所にあります。WebサーバーにFTPで転送してから、PHPコードを実行してエラーを見つけ、修正して再ftpする方が簡単です。


1
コンパイル時間は実際に使用されている言語に依存すると思います。.Netでは、そのサイズのプロジェクトはコンパイルに数分しかかからない場合があります。それがCで行われた場合、すべてをコンパイルするのに時間がかかることがわかりました。
Kibbee 2009

さて、私はあなたにそれをあげます。しかし、それについて考えるとき、Cで書くと思うプロジェクトの数は、かなりのコンパイル時間でPHPで書くことが可能でしょうか?インタープリター言語は仕事に適したツールではなく、その逆もある点があると思います。私は仕事に適したツールを使い、あなたが最も得意とするものを使用するのが大好きです。ある言語ですべてを実行できるのに、別の言語で簡単に実行できるようにする理由はわかりません。あなたが知っていることを再学習する理由はありません。
bdwakefield 2009

ところで、VS jcxsoftware.com/vs.php用のphpプラグインがあります。無料ではないのでまだ試していませんが、聞いたところによると、PHPはZend(5.5 as 6 sucks)と同じくらい優れています。 VSの良さ
UnkwnTech 2009

動的言語をあまり使用しない最大の理由の1つにたどり着きました。誰もあなたのためにほとんど何でもできる2mのコードIDEを構築したことはないので、誰もが「タイプセーフではないので間違いを犯しやすい」と
嘆きます

私はタイプセーフなナンセンスを気にしません。それは私をそれほど気にしません。私の最大の不満は、物理的に時間がかかるだけで、問題を追跡するのがはるかに難しいことです。私にとって、開発のスタイルは私がどのように働きたいかとは逆だと思います。
bdwakefield 2009年

1

特定のコンテキストでの生産性。しかし、それは私が知っている、または使用されているのを見た他のいくつかの環境と比較して、私が知っている1つの環境にすぎません。

Squeak / Pharo with SeasideのSmalltalkは、複雑なアプリケーション向けに、ASP.Net(/ MVC)、RoR、またはWicketよりもはるかに効果的で効率的なWebプラットフォームです。それらの1つにライブラリがあり、smalltalkがないものとインターフェイスする必要があるまで。

スペルミスのある変数名はIDEで赤で表示され、IntelliSenseは機能しますが、それほど具体的ではありません。Webページの実行時エラーは問題ではありませんが、機能です。ワンクリックでデバッガーを起動し、ワンクリックでIDEを起動し、デバッガーのバグを修正し、保存して続行します。単純なバグの場合、このサイクルのラウンドトリップ時間は20秒未満です。



1

ボックスのタイプを宣言しなければならないのは愚かだと思うからです。タイプはコンテナではなくエンティティに残ります。静的型付けは、ボックスの型がメモリ内のビットの解釈方法に直接影響する場合に意味がありました。

GoFのデザインパターンを見ると、それらの大部分は言語の静的な性質と戦うためだけにあり、動的言語に存在する理由はまったくないことがわかります。

また、MyFancyObjectInterface f = new MyFancyObject()のようなものを書かなければならないことにうんざりしています。DRYの原則は誰ですか?


1

最初に言語を選択するまったく新しいプログラマーの代わりに自分自身を置きます。このプログラマーは、動的、静的、ラムダ、これ、それなどを気にしません。どの言語を選びますか?

C#

using System;
class MyProgram
{
    public static void Main(string[] args)
    {
        foreach (string s in args)
        {
            Console.WriteLine(s);
        }
    }
}

Lua:

function printStuff(args)
    for key,value in pairs(args) do
       print value .. " "
    end
end
strings = {
    "hello",
    "world",
    "from lua"
}
printStuff(strings)

3
本当に、それは議論の余地がありません。私たちはまったく新しいプログラマーではありません。この議論は、まったく新しいプログラマーの間で最も激しく激怒しています。
peSHIr 2009年

これが、プログラマーが動的言語を好むようになった理由の1つにすぎません。それらは一般的に他のものより理解しやすいので、より多くの新しいプログラマーを引き付けます。
RCIX 2009年

1

これはすべて、特定の目標に適切なものと、一般的な個人的な好みに部分的に帰着します。(EGこれは、合理的な会議を一緒に行うことができるよりも多くの人々によって維持される巨大なコードベースになるのでしょうか?型チェックが必要です。)

個人的な部分は、開発とテストの速度のためにいくつかのチェックと他のステップをトレードオフすることです(CPUパフォーマンスをいくらかあきらめる可能性があります)。これが解放されてパフォーマンスが向上する人もいれば、まったく逆の人もいます。そうです、それはあなたの言語の特定のフレーバーにも依存します。ここでは、Javaがスピーディーで簡潔な開発に適しているとか、PHPが堅実な言語であり、タイプミスを見つけるのが難しいと言っている人は誰もいないということです。


1

私は静的言語と動的言語の両方が大好きです。私が2002年頃から関わってきたすべてのプロジェクトは、Pythonインタープリターが埋め込まれたC / C ++アプリケーションです。これは私に両方の長所を与えます:

  1. アプリケーションを構成するコンポーネントとフレームワークは、アプリケーションの特定のリリースでは不変です。また、非常に安定している必要があるため、十分にテストされています。静的に型付けされた言語は、これらのパーツを構築するための正しい選択です。
  2. コンポーネントの配線、コンポーネントDLL、アートワーク、ほとんどのGUIなどのロードは、フレームワークやコンポーネントコードを変更する必要なしに、大きく異なる可能性があります(たとえば、クライアント用にアプリケーションをカスタマイズするため)。これには動的言語が最適です。

システムを構築するための静的に型付けされた言語と、システムを構成するための動的に型付けされた言語を組み合わせると、柔軟性、安定性、生産性が得られることがわかりました。

「動的言語の愛とは何ですか?」という質問に答えるために。私にとっては、実行時にシステムを完全に再配線する機能です。スクリプト言語は「ショーの実行」と見なしているため、実行中のアプリケーションは必要な処理を実行できます。


1

私は一般的に動的言語の経験はあまりありませんが、私が知っている動的言語の1つであるJavaScript(別名ECMAScript)は絶対に大好きです。

さて、待って、ここでの議論は何ですか?動的コンパイル?または動的型付け?JavaScriptは両方のベースをカバーしているので、両方について説明すると思います。

動的コンパイル

まず、動的言語コンパイルされ、コンパイルは後で実行されるだけです。そして、Javaと.NETは実際には2回コンパイルされています。一度はそれぞれの中間言語に、そして再び動的に、機械語に。

しかし、コンパイルを延期すると、結果をより早く確認できます。それが1つの利点です。私は単にファイルを保存して、プログラムがかなり速く動作するのを見るのを楽しんでいます。

もう1つの利点は、実行時にコード記述してコンパイルできることです。。これが静的にコンパイルされたコードで可能かどうかはわかりません。JavaScriptをコンパイルするものはすべて、最終的にはマシンコードであり、静的にコンパイルされるため、そうなるはずだと思います。しかし、動的言語では、これは簡単なことです。コードはそれ自体を記述して実行できます。(そして、.NETがこれを実行できることはかなり確信していますが、.NETがコンパイルされるCILは、とにかくその場で動的にコンパイルされ、C#ではそれほど簡単ではありません)

動的型付け

動的型付けは静的型付けよりも表現力に富んでいると思います。動的型付けはより少ないリソースでより多くのことを言うことができると言うために、非公式に表現的な用語を使用していることに注意してください。JavaScriptコードは次のとおりです。

var Person = {};

あなたは今の人が何であるか知っていますか?これは一般的な辞書です。私がすることができます:

Person ["First_Name"] = "John";
Person ["Last_Name"] = "Smith";

しかし、それはオブジェクトでもあります。私はこれらの「キー」のいずれかを次のように参照できます。

Person.First_Name

そして、私が必要だと思うメソッドを追加します。

Person.changeFirstName = function(newName){
  this.First_Name = newName;
};

確かに、newNameが文字列でない場合は、問題が発生する可能性があります。すぐには捕まえられませんが、自分で確認することはできます。それは、表現力と柔軟性を安全性と交換することの問題です。型などをチェックするためのコードを自分で追加してもかまいませんが、型のバグに遭遇したことはまだありません。 ))。しかし、私はその場で適応するその能力を非常に楽しんでいます。


1

同じトピックに関する素敵なブログ投稿:Pythonは私を神経質にします

メソッドシグネチャは、Pythonでは事実上役に立ちません。Javaでは、静的型付けによってメソッドのシグネチャがレシピになります。このメソッドを機能させるために必要なのはそれだけです。Pythonではそうではありません。ここで、メソッドシグネチャは1つのことだけを教えてくれます:それを機能させるために必要な引数の数です。** kwargsをいじり始めた場合、それがうまくいかないこともあります。


0

楽しいから楽しい。たとえば、メモリ割り当てについて心配しないのは楽しいことです。コンパイルを待たずに楽しいです。などなどなど


19
ガベージコレクションは、静的/動的型チェックと直交しています。
mmagin 2008

0

弱く型付けされた言語は、データの管理方法に柔軟性をもたらします。

去年の春にいくつかのクラスでVHDLを使用しましたが、ビット/バイトを表す方法と、6ビットバスを9ビットバスに割り当てようとした場合にコンパイラがエラーをキャッチする方法が気に入っています。私はそれをC ++で再作成しようとしましたが、既存の型でタイピングをスムーズに機能させるのにかなり苦労しています。Steve Yeggeは、強力な型システムに関連する問題を説明するのに非常に優れた仕事をしていると思います。

冗長性について:JavaとC#は、大規模では非常に冗長であることがわかります(要点を「証明」するために、小規模なアルゴリズムを選択しないでください)。そして、はい、私は両方で書いています。C ++も同じ分野で苦労しています。VHDLはここで屈服します。

倹約は一般的に動的言語の美徳のようです(例としてPerlとF#を紹介します)。


9ビットバスを6ビットバスに割り当てるのと同じことは、intをshortなどに割り当てようとすることです。これはC#(およびJavaだと思います)のエラーであり、CまたはC ++コンパイラーは警告を発することができるはずです。
erikkallen 2009年

-1。Weakly typed language != Dynamically typed language
ジョーD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.