「JavaScriptは型付けされていません」と書かれているスライドデッキを読んでいます。これは私が本当だと思っていたことと矛盾していたので、私はより多くを学ぶために掘り始めました。
JavaScriptは型付けされていない言語ですか? に対するすべての答えは、JavaScriptがnot型付けされておらず、さまざまな形式の静的、動的の例を提供していることを示しています、強い、そして弱いタイピングは、私が慣れ親しんでおり、満足しています。
そこで、私はJavaScriptの作成者であるBrendan Eichに尋ねました。
アカデミックタイプは、「型なし」を使用して「静的タイプなし」を意味します。それらは値が型を持っていることを見るのに十分賢いです(ダァ!)。コンテキストが重要です。
学術に焦点を合わせたコンピューターサイエンスの人々は、「動的に型付けされた」の同義語として「型付けされていない」を使用していますか(これは有効ですか?)私は文脈が重要であるというブレンダンに同意しますが、私の現在の「行く」本はこのトピックでボールをプレーしていないので、説明の引用は素晴らしいでしょう。
私が理解を深めることができるように、そしてウィキペディアでさえこの代替的な使用法を参照していないので、とにかくこれを特定したい(とにかく見つけることができる)。私が間違っている場合、用語を使用したり、将来的に用語の使用を疑ったりすることを台無しにしたくない:-)
(Smalltalkも「型付けされていない」と言うSmalltalkerのトップを見てきましたので、このクエストで私を引き離したのは一度きりではありません!:-))
はい、これは学術文献の標準的な慣行です。それを理解するには、1930年代にラムダ計算(実際には、さらに早い段階で集合論のコンテキスト)で「タイプ」の概念が発明されたことを知ることが役立ちます。それ以来、「型理論」として知られる計算ロジックのブランチ全体が登場しました。プログラミング言語の理論は、これらの基礎に基づいています。そして、これらすべての数学的文脈において、「タイプ」には特定の、十分に確立された意味があります。
「ダイナミックタイピング」という用語はかなり後に発明されたものであり、「タイプ」という言葉の一般的な数学的使用に直面して用語の矛盾です。
たとえば、Benjamin Pierceが標準テキストTypes and Programming Languagesで使用する「型システム」の定義は次のとおりです。 :
型システムとは、計算する値の種類に応じてフレーズを分類することにより、特定のプログラムの動作がないことを証明する、扱いやすい構文方法です。
彼はまた次のように述べています。
ここで検討しているコンパイル時分析の種類を、次のような言語で見られる動的または潜在的な型付けと区別するために、「静的」という言葉が明示的に追加されることがあります。スキーム(Sussman and Steele、1975; Kelsey、Clinger、and Rees、1998; Dybvig、1996)では、実行時型タグを使用して、ヒープ内のさまざまな種類の構造を区別します。 「動的に型付けされた」などの用語は間違いなく誤った名前であり、おそらく「動的にチェックされた」に置き換える必要がありますが、使用法は標準です。
現場で働くほとんどの人は、この観点を共有しているようです。
これはnotを行うことに注意してください。これは、「型なし」と「動的に型付けされた」が同義語であることを意味します。むしろ、後者は前者の特定のケースの(技術的に誤解を招く)名前であること。
PS:そしてFWIW、私はたまたま型システムの学術研究者であり、JavaScriptの非学術的実装者でもあるので、私は分裂と一緒に暮らさなければなりません。 :)
私はプログラミング言語を専門とする学術コンピューター科学者であり、はい、「untyped」という言葉はこの方法で頻繁に(誤)使用されます。 ForthやAssemblyコードなど、動的な型タグを持たない言語で使用するためにWordを予約しておくと便利ですが、これらの言語はめったに使用されず、さらに研究されることはほとんどありません。 「動的に型付けされる」より。
ボブ・ハーパーは、Scheme、Javascriptなどのような言語は、単一の型:値を持つ型付き言語と見なされるべきだと言うのが好きです。私はこの見方に傾いています。なぜなら、たった1つの型形式を使用して一貫した世界観を構築することが可能になるからです。
追伸純粋なラムダ計算では、「値」のみが標準形式の用語であり、標準形式の唯一のclosed用語は関数です。しかし、ラムダ計算を使用するほとんどの科学者は基本型と定数を追加し、ラムダの静的型システムを含めるか、動的型タグに戻ります。
P.P.S.元のポスター:プログラミング言語、特に型システムに関しては、Wikipediaの情報は質が悪いです。信用しないでください。
私はそれを調べましたが、あなたの質問に対する答えは単純に、そして驚くべきことに「はい」であることがわかりました。学術的なCSタイプ、または少なくともそれらのいくつかは「型なし」を使用して「動的に型付け」を意味します。例えば、 プログラミング言語:原則と実践、第3版(Kenneth C. LoudenとKenneth A. Lambertによる2012年発行)は次のように述べています。
静的型システムのない言語は通常untyped languages(またはdynamically typed languages)。このような言語には、SchemeおよびLISPの他の方言、Smalltalk、およびPerl、Python、Rubyなどのほとんどのスクリプト言語が含まれます。ただし、型指定されていない言語では、プログラムによるデータの破損が必ずしも許可されないことに注意してください。これは、すべての安全チェックが実行時に実行されることを意味します。 […]
[ link ](注:オリジナルでは太字)そして、このように「型なし」を使用し続けます。
これは驚くべきことだと思います(afrischkeとAdam Mihalcinが与えるのとほぼ同じ理由で)が、あなたはそこにいます。 :-)
追加して編集:"untyped languages"
Googleブック検索に。例えば:
[…]これは、多くの型付けされていない言語の主要な情報隠蔽メカニズムです。たとえば、PLT Scheme [4]は生成
struct
s、[…]を使用します
—ジェイコブ・マシューズとアマル・アーメド、2008 [ link ]
[…]、型付けされていない関数型言語のバインディング時間分析を提示します[…]。 […]実装されており、Schemeの副作用のない方言の部分評価器で使用されています。ただし、この分析は、Haskellなどの厳密ではない型付き関数型言語に有効であるほど一般的です。 […]
—チャールズコンセル、1990 [ link ]
ちなみに、これらの検索結果を見た後の私の印象は、研究者が「型付けされていない」関数型言語を書いた場合、型付けされていないラムダと同じ意味で「型付けされていない」と考える可能性が高いということですAdam Mihalcinが言及している微積分学。少なくとも、何人かの研究者は、Schemeとラムダ計算を同じ息の中で言及しています。
検索がしないことは、もちろん、この識別を拒否する研究者がいるかどうか、そしてしない考慮するこれらの言語は「型なし」になります。さて、私はこれを見つけました:
動的に型付けされた言語は型付けされていない言語ではないため、実際には循環性はないことに気付きました。通常、型はプログラムテキストからすぐには明らかにならないということです。
—誰か(誰に言えないか)、1998 [ link ]
しかし、明らかにmostこの識別を拒否する人々は、明示的にそう言う必要を感じないでしょう。
型なしと動的型は絶対に同義語ではありません。最もよく「型なし」と呼ばれる言語は、ラムダ計算です。これは実際には統一された言語です。すべてが関数であるため、すべての型が関数であることを静的に証明できます。動的に型付けされた言語には複数の型がありますが、コンパイラがそれらを静的にチェックする方法を追加せず、コンパイラが変数の型にランタイムチェックを強制するようにします。
次に、JavaScriptは動的に型付けされた言語です。変数x
が数値、関数、文字列、またはその他のものになるようにJavaScriptでプログラムを書くことができます停止問題またはいくつかの難しい数学的な問題を解く)、x
を引数に適用でき、ブラウザは実行時にx
が関数であることを確認する必要があります。
値または変数について話しているかどうかに応じて、両方のステートメントが正しいです。 JavaScript変数は型指定されておらず、JavaScript値には型があり、変数は実行時に任意の値型の範囲をとることができます(つまり、「動的に」)。
JavaScriptおよび他の多くの言語では、変数ではなく値が型を保持します。すべての変数はすべてのタイプの値に及ぶことができ、「動的に型付けされた」または「型付けされていない」と見なされる場合があります-型チェックの観点から、タイプが不明/不明な変数と任意の型を取ることができる変数は論理的および実際的に同等です。型理論家が言語と型について話すとき、彼らは通常これについて話している-型を運ぶ変数-彼らはプログラムチェッカーやコンパイラなどを書くことに興味があるので(つまり、値)。
Cのような他の言語とは対照的に、変数は型を持ちますが、値は持ちません。 Javaのような言語では、変数と値は両方とも型を持ちます。 C++では、一部の値(仮想関数を持つ値)は型を保持し、他の値は保持しません。一部の言語では、値が型を変更することさえ可能ですが、これは通常、不適切な設計と見なされます。
この質問はすべて Semantics に関するものです
このデータを提供する場合:_12
_タイプは何ですか?確実に知る方法はありません。整数にすることも、浮動小数点数にすることも、文字列にすることもできます。その意味で、それは非常に「型付けされていない」データです。
このデータや他の任意のデータに対して「加算」、「減算」、「連結」などの演算子を使用できる架空の言語を指定した場合、「タイプ」はやや無関係です(私の架空の言語)(例:おそらくadd(12, a)
は_109
_を生成します。これは_12
_とa
のASCII値を加算したものです。
Cについて少し話しましょう。 Cを使用すると、任意のデータを使用して任意の処理を実行できます。 2つのuint
sを取る関数を使用している場合-必要なものをキャストして渡すことができます-値は単にuint
sとして解釈されます。その意味で、Cは「型指定なし」です(そのように扱う場合)。
しかし-そして、ブレンダンのポイントに到達-「私の年齢は_12
_」だと言ったら-_12
_には型があります-少なくとも数値であることはわかっています。 contextでは、言語に関係なくすべてにタイプがあります。
これが私が最初に言った理由です-あなたの質問は意味論の一つです。 「型なし」の意味は何ですか?私は、ブレンダンが「静的型なし」と言ったときに頭に釘を打ったと思います-それはおそらくそれが意味することができるすべてだからです。人間は自然に物事をタイプに分類します。私たちは、車と猿の間には根本的に異なるものがあることを直感的に知っています-それらの区別をするように教えられることはありません。
最初に私の例に戻ります-「型を気にしない」言語(per-se)を使用すると、構文エラーを生成せずに「年齢」と「名前」を「追加」できますが...論理的に健全な操作であることを意味しません。
Javascriptを使用すると、「エラー」を考慮することなく、あらゆる種類のクレイジーなことを実行できます。それはあなたがやっていることが論理的に健全であることを意味しません。開発者が解決するのはこれです。
コンパイル/ビルド/解釈時に型の安全性を強制しないシステム/言語は、「型なし」または「動的型付け」ですか?
セマンティクス。
[〜#〜] edit [〜#〜]
ここに何かを追加したかったのは、「ええ、しかしJavascriptにはいくつかの「タイプ」がある」と思われる人がいるからです。
他の人の答えに対する私のコメントで私は言った:
Javascriptでは、「Monkeys」になるように構築したオブジェクトと「Humans」になるように構築したオブジェクトを持つことができ、「Humans」のみで動作するように設計された機能もあります。 「Things With Arms」のみに関する他の人。言語に「武器を持つもの」などのオブジェクトのカテゴリがあると言われたかどうかは、Javascript(「動的」)と同様にアセンブリ(「型なし」)とは無関係です。それはすべて論理的整合性の問題です-唯一のエラーは、その方法で武器を持っていなかったものを使用することです。
したがって、Javascriptが内部的に「型の概念」を持ち、したがって「動的型」であるとみなし、これが何らかの形で「型付けされていないシステムとは明らかに異なる」と考えると、上記の例から、それが内部的に持っている「型の概念」は本当に無関係です。
たとえば、C#で同じ操作を実行するには、ICreatureWithArms
などのインターフェイスが必要です。 Javascriptではそうではありません-CやASMではそうではありません。
明らかに、Javascriptが「タイプ」をまったく理解しているかどうかは無関係です。
型について書くCS研究者のほとんどが、本質的に構文的に派生可能な型を持つ言語のみを型付き言語と見なしているのは事実ですが、その使用法を理解していない動的/潜在的に型付けされた言語を使用している人はたくさんいます。
私は3種類の言語[SIC]があると考えています。
型なし-演算子のみが値の解釈を決定します-そして、それは一般に何でも動作します。例:アセンブラー、BCPL
静的型付け-式/変数には型が関連付けられており、その型はコンパイル時の演算子の解釈/有効性を決定します。例:C、Java、C++、ML、Haskell
動的型付け-値には型が関連付けられており、その型は実行時の演算子の解釈/有効性を決定します。例:LISP、Scheme、Smalltalk、Ruby、Python、Javascript
私の知る限り、すべての動的型付け言語は型保証されています-つまり、有効な演算子のみが値を操作できます。しかし、静的に型付けされた言語には同じことが当てはまりません。使用する型システムの能力に応じて、一部の演算子は実行時にのみチェックされる場合と、まったくチェックされない場合があります。たとえば、ほとんどの静的型付け言語は整数オーバーフローを適切に処理せず(2つの正の整数を追加すると負の整数を生成できる)、範囲外の配列参照はまったくチェックされない(C、C++)またはランタイム。さらに、一部の型システムは非常に弱いため、有用なプログラミングには、式のコンパイル時の型を変更するためのエスケープハッチ(Cおよびファミリのキャスト)が必要です。
C++は(静的に型付けされているため)Pythonより安全であるが、真実はPythonは本質的にC++で足を落とすことができますが、安全です。
私はコンピューター科学者ではありませんが、CSコミュニティー(少なくとも科学出版物)で「動的に型付けされた」の同義語として「型付けされていない」が実際に使用されると、これら2つの用語が異なる概念を表すため、かなり驚かされます。動的に型付けされた言語には型の概念があり、実行時に型の制約を適用します(たとえば、エラーを発生させずに整数をLISPの文字列で除算することはできません)が、型なしの言語には型の概念がありませんすべて(アセンブラーなど)。プログラミング言語に関するウィキペディアの記事(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages)でもこの区別を行っています。
更新:たぶん混乱は、一部のテキストがJavascriptで「変数が入力されていない」という程度のことを言っているという事実から生じているのかもしれません(これは本当です)。しかし、それは言語が型付けされていないことを自動的に意味するわけではありません(これは偽です)。
ブレンダンに同意する-コンテキストがすべてです。
私のテイク:
2004年頃、混乱していたことを覚えています。なぜなら、Rubyが型付けされていないのか、動的に型付けされたのかについて議論がありました。そして、Rubyは型なしでした。
Cには、ランタイムタイプはなく、アドレスのみがあり、実行中のコードがそのアドレスにあるものをそうではないものとして扱うことを決定した場合、覚えておいてください。それは間違いなく型付けされておらず、動的型付けとは大きく異なります。
その世界では、「タイピング」はすべてコンパイラーに関するものです。コンパイラのチェックがより厳密であるため、C++には「強力な型指定」がありました。 JavaとCはより「弱く型付けされた」(Javaが強く型付けされたか弱く型付けされたかについての議論さえあった)。動的言語は、その連続体において、コンパイラの型チェックがないため、「型なし」。
今日、プログラマーを練習するために、私たちは動的言語に非常に慣れており、コンパイラーやインタープリターの型チェックがないことを意味するように型付けされていないことを明らかに考えています。しかし、それは明らかではなかった時期があり、CSのより理論的な世界では意味がありません。
深い意味では、意味のあるアルゴリズムを作成するために値を操作する意図が必要なため、何も型指定できません(とにかくほとんど何もありません)。これは理論的なCSの世界であり、コンパイラまたはインタープリターが特定の言語にどのように実装されているかという詳細を扱っていません。そのため、「型付けされていない」ということは(おそらく、私は知りませんが)その文脈ではまったく意味がありません。