176

「JavaScript は型指定されていません」というスライド デッキを読んでいます。これは私が真実だと思っていたことと矛盾していたので、もっと学ぼうと掘り下げ始めました.

JavaScript は型指定されていない言語ですか?に対するすべての回答 JavaScript は型付けされていないと述べており静的、動的、強力、および弱い型付けのさまざまな形式の例を提供しています。

JavaScript の作成者である Brendan Eich に尋ねたところ、彼は次のように述べています。

アカデミック型は「型なし」を「静的型なし」を意味するために使用します。彼らは、値が型を持っていることを確認するのに十分賢いです(当たり前!)。コンテキストが重要です。

学術的に焦点を当てたコンピューターサイエンスの人々は、「型なし」を「動的型付き」の同義語として使用していますか(これは有効ですか?)、それとも私が見逃しているもっと深いものがありますか? コンテキストが重要であるというブレンダンに同意しますが、私の現在の「行く」本はこのトピックでボールをプレーしていないので、説明の引用は素晴らしいでしょう.

ウィキペディアでさえ、この代替の使用法について言及していないため (とにかく、私は見つけることができます)、理解を深めることができるように、これを明確にしたいと思います。私が間違っている場合、用語を使用したり、将来的に用語の使用に疑問を呈したりすることを台無しにしたくありません:-)

(トップの Smalltalker が Smalltalk も「型指定されていない」と言っているのを見たことがあります。そのため、このクエストで私を突き動かしたのは 1 回限りではありません! :-))

4

9 に答える 9

153

はい、これは学術文献の標準的な慣行です。それを理解するには、「型」の概念が 1930 年代にラムダ計算の文脈で発明されたことを知っておくと役に立ちます (実際には、集合論の文脈ではさらに以前のことです)。それ以来、「型理論」として知られる計算論理の一分野が登場しました。プログラミング言語理論は、これらの基礎に基づいています。そして、これらすべての数学的文脈において、「型」には特定の確立された意味があります。

「動的型付け」という用語はずっと後に発明されたものであり、「型」という言葉の一般的な数学的使用に直面すると、用語の矛盾です。

たとえば、Benjamin Pierce が彼の標準的な教科書「Types and Programming Languages 」で使用している「型システム」の定義は次のとおりです。

型システムは、計算される値の種類に従って句を分類することにより、特定のプログラムの動作がないことを証明するための扱いやすい構文法です。

彼はまた次のように述べています。

「静的」という言葉が明示的に追加されることがあります。たとえば、「静的に型付けされたプログラミング言語」について話します。ここで検討しているコンパイル時の分析の種類と、スキーマ (Sussman と Steele、1975 年; Kelsey、Clinger、および Rees、1998 年; Dybvig、1996 年) では、実行時の型タグを使用して、ヒープ内のさまざまな種類の構造を区別します。「動的に型付けされた」などの用語は間違いなく誤称であり、おそらく「動的にチェックされた」に置き換える必要がありますが、使用法は標準的です。

この分野で働くほとんどの人は、この観点を共有しているようです。

これは、「型なし」と「動的型付き」が同義語であることを意味するものではないことに注意してください。むしろ、後者は前者の特定のケースの(技術的に誤解を招くような)名前です。

PS: そして FWIW、私はたまたま型システムの学術研究者であり、学術的ではない JavaScript の実装者でもあるので、分裂を受け入れなければなりません。:)

于 2012-02-06T20:06:11.567 に答える
73

私はプログラミング言語を専門とするアカデミック コンピューター サイエンティストです。そうです、「型指定されていない」という言葉は、このように頻繁に (誤って) 使用されています。Forth やアセンブリ コードなど、動的な型タグを持たない言語で使用するために単語を予約しておくと便利ですが、これらの言語はめったに使用されず、さらにめったに研究されません。 「動的型付け」より。

Bob Harper は、Scheme や Javascript などの言語はただ 1 つの type: value を持つ型付き言語と見なすべきだと好んで言います。1つの型式だけで一貫した世界観を構築できるので、私はこの考え方に傾倒しています。

PS 純粋なラムダ計算では、唯一の「値」は正規形の項であり、正規形の唯一の閉じた項は関数です。しかし、ラムダ計算を使用するほとんどの科学者は、基本型と定数を追加します。その後、ラムダの静的型システムを含めるか、動的型タグに戻ります。

PPS 元の投稿者へ: プログラミング言語、特に型システムに関しては、ウィキペディアの情報は質が悪いです。信用しないでください。

于 2012-02-06T04:35:39.373 に答える
44

私はそれを調べたところ、あなたの質問に対する答えは単純に、そして驚くべきことに「はい」であることがわかりました.アカデミックなCSタイプ、または少なくともそれらのいくつかは、「動的に型付けされた」ことを意味するために「型なし」を使用しています. たとえば、『Programming Languages: Principles and Practices』、Third Edition (Kenneth C. Louden および Kenneth A. Lambert 共著、2012 年発行) には次のように書かれています。

静的型システムを持たない言語は通常、型なし言語(または動的型付き言語) と呼ばれます。このような言語には、Scheme や、Lisp、Smalltalk、および Perl、Python、Ruby などのほとんどのスクリプト言語の他の方言が含まれます。ただし、型指定されていない言語を使用しても、必ずしもプログラムがデータを破損できるとは限らないことに注意してください。これは、すべての安全性チェックが実行時に実行されることを意味します。[…]

[リンク] (注: オリジナルでは太字) であり、まさにこのように「型なし」を使用しています。

これは驚くべきことだと思います (afrischke と Adam Mihalcin が与えたのとほぼ同じ理由で) が、そこにあります。:-)


追加するために編集:"untyped languages" Google ブック検索に接続すると、さらに多くの例を見つけることができます。例えば:

[…] これは、多くの型付けされていない言語の主要な情報隠蔽メカニズムです。たとえば、PLT スキーム [4] は生成的structな s を使用します […]

— ジェイコブ・マシューズとアマル・アーメド、2008 [リンク]

[…]、型指定されていない関数型言語のバインド時間分析を提示します […]。[…] これは実装されており、Scheme の副作用のない方言の部分評価器で使用されています。ただし、分析は十分に一般的であり、Haskell などの非厳密な型付き関数型言語にも有効です。[…]

— チャールズ・コンセル、1990 年 [リンク]

ところで、これらの検索結果を見た後の私の印象は、研究者が「型指定されていない」関数型言語について書いた場合、型指定されていないラムダと同じ意味で「型指定されていない」と考える可能性が非常に高いということです。 Adam Mihalcin が言及している微積分。少なくとも、Scheme とラムダ計算を同時に言及する研究者が何人かいます。

もちろん、検索結果が示していないのは、この識別を拒否し、これらの言語を「型なし」と見なさない研究者がいるかどうかです。さて、私はこれを見つけました:

その後、動的型付け言語は型付けされていない言語ではないため、実際には循環性がないことに気付きました。通常、型がプログラム テキストからすぐに明らかではないというだけです。

— 誰か (誰だかわからない)、1998 年 [リンク]

しかし明らかに、この識別を拒否するほとんどの人は、はっきりとそう言う必要を感じないでしょう。

于 2012-02-06T02:15:47.887 に答える
10

型付けされていないものと動的に型付けされているものは、まったく同義語ではありません。最も頻繁に「型なし」と呼ばれる言語はラムダ計算です。これは実際には統一された言語です。すべてが関数であるため、すべての型が関数であることを静的に証明できます。動的に型指定された言語には複数の型がありますが、コンパイラがそれらを静的にチェックする方法が追加されていないため、コンパイラは変数の型に実行時チェックを挿入する必要があります。

次に、JavaScript は動的に型付けされた言語です。JavaScript でプログラムを記述して、変数xが数値、関数、文字列、またはその他の何かになるようにすることができます (そして、停止問題またはいくつかの問題を解決する必要があるかどうかを判断します)。難しい数学の問題)、x引数に適用でき、ブラウザは実行時にそれxが関数であることを確認する必要があります。

于 2012-02-06T01:12:19.743 に答える
6

値と変数のどちらについて話しているかに応じて、どちらのステートメントも正しいです。JavaScript 変数には型がなく、JavaScript 値には型があり、変数は実行時に (つまり「動的に」) 任意の値型にまたがることができます。

JavaScript や他の多くの言語では、変数ではなく値が型を持ちます。すべての変数はすべての型の値に及ぶ可能性があり、「動的に型付けされた」または「型付けされていない」と見なされる場合があります。 . 型理論家が言語と型について話すとき、彼らは通常、これ (型を運ぶ変数) について話します。なぜなら、型チェッカーやコンパイラなどを書くことに関心があるからです。これらは、メモリ内で実行中のプログラムではなく、プログラム テキスト (つまり、変数) を操作します。 (つまり、値)。

対照的に、C などの他の言語では、変数は型を持ちますが、値は持ちません。Java などの言語では、変数と値の両方に型があります。C++ では、いくつかの値 (仮想関数を持つもの) は型を持ち、他の値は持ちません。一部の言語では、値の型を変更することさえ可能ですが、これは通常悪い設計と見なされます。

于 2012-02-06T12:58:59.857 に答える
5

型について書いている CS 研究者のほとんどが、本質的に構文的に派生可能な型を持つ言語のみを型付き言語と見なしていることは事実ですが、動的/潜在的に型付けされた言語を使用していて、その使用法に不満を持っている人はもっとたくさんいます。

私は、言語には 3 つのタイプ [SIC] があると考えています。

型なし - 値の解釈を決定するのは演算子のみであり、通常は何でも動作します。例: アセンブラ、BCPL

静的型付け - 式/変数には型が関連付けられており、その型によってコンパイル時の演算子の解釈/有効性が決まります。例: C、Java、C++、ML、Haskell

動的に型指定される - 値には型が関連付けられており、その型によって実行時の演算子の解釈/有効性が決まります。例: LISP、Scheme、Smalltalk、Ruby、Python、Javascript

私の知る限り、すべての動的型付け言語は型安全です。つまり、有効な演算子だけが値を操作できます。しかし、静的に型付けされた言語については同じではありません。使用される型システムの能力に応じて、一部の演算子は実行時にのみチェックされるか、まったくチェックされない場合があります。たとえば、ほとんどの静的型付け言語は整数のオーバーフローを適切に処理せず (2 つの正の整数を追加すると負の整数が生成される可能性があります)、範囲外の配列参照はまったくチェックされない (C、C++) か、ランタイム。さらに、一部の型システムは非常に弱いため、有用なプログラミングでは、コンパイル時の式の型を変更するためにエスケープ ハッチ (C およびファミリーのキャスト) が必要になります。

これらはすべて、C++ は (静的に型付けされている) Python よりも安全であるなどのばかげた主張につながりますが、実際には Python は本質的に安全ですが、C++ で足を撃ち落とすことができます。

于 2012-08-03T12:31:03.663 に答える
4

この質問はセマンティクスに関するものです

私があなたにこのデータを与えるとしたら、その12タイプは何ですか? 確かに知る方法はありません。整数、浮動小数点数、文字列のいずれかです。その意味では、これは非常に「型指定されていない」データです。

このデータと他の任意のデータに対して「加算」、「減算」、「連結」などの演算子を使用できる架空の言語を提供すると、「タイプ」は(私の架空の言語には)多少無関係です(例: おそらく) の ascii 値を足したものがadd(12, a)得られます。10912a

Cについて少し話しましょう。C では、任意のデータを使って、やりたいことを何でもできます。2 つの s を取る関数を使用している場合uint(何でもキャストして渡すことができます)、値は単純にuints として解釈されます。その意味で、C は「型なし」です (そのように扱う場合)。

しかし、ブレンダンの要点を言えば、「私の年齢は12」と言った場合12、型があります。少なくとも、それが数値であることがわかります。コンテキストがあれば、言語に関係なく、すべてに型があります。

これが私が最初に言った理由です-あなたの質問は意味論の1つです。「タイプされていない」とはどういう意味ですか? ブレンダンが「静的型はありません」と言ったとき、頭に釘を打ったと思います-それがおそらく意味するすべてだからです。人間は自然に物事をタイプに分類します。私たちは、車とサルの間には何か根本的な違いがあることを直感的に知っています。

最初の例に戻ると、「型を気にしない」(それ自体) 言語では、構文エラーを発生させずに「年齢」と「名前」を「追加」できますが、論理的に健全な操作であるとは限りません。

Javascript を使用すると、「エラー」を考慮せずにあらゆる種類のクレイジーなことを実行できる場合があります。それはあなたがやっていることは論理的に正しいという意味ではありません。それは開発者が解決することです。

コンパイル/ビルド/解釈時に型安全性を強制しないシステム/言語は、「型なし」または「動的型付き」ですか?

セマンティクス。

編集

一部の人々が「ええ、しかしJavascriptにはいくつかの「型」があります」に巻き込まれているように見えるので、ここに何かを追加したかった.

他の誰かの答えに対する私のコメントで、私は言いました:

Javascript では、「サル」になるように構築したオブジェクトと「人間」になるように構築したオブジェクトを持つことができ、一部の関数は「人間」のみで動作するように設計でき、他の関数は「サル」のみで動作するように設計できます。 「Things With Arms」だけの他の人. 言語が「腕のあるもの」のようなオブジェクトのカテゴリがあると言われたことがあるかどうかは、Javascript (「動的」) と同様に、アセンブリ (「型なし」) とは無関係です。それはすべて論理的な整合性の問題です。唯一のエラーは、そのメソッドでアームを持たないものを使用することです。

したがって、Javascript が内部的に何らかの「型の概念」を持っていると見なし、したがって「動的型」があり、これが何らかの形で「型指定されていないシステムとは明らかに異なる」と考える場合は、上記の例から、「の概念タイプ」が内部的に持つことは、実際には無関係です。

たとえば、C# で同じ操作を実行するには、インターフェイスICreatureWithArmsなどと呼ばれるものが必要です。Javascript ではそうではありません - C や ASM ではそうではありません。

明らかに、Javascript が「型」をまったく理解しているかどうかは関係ありません。

于 2012-02-06T01:01:06.263 に答える
2

私はコンピューター科学者ではありませんが、CSコミュニティ(少なくとも科学出版物では)で「動的型付け」の同義語として「型なし」が実際に使用された場合、これら2つの用語は異なる概念を表すため、かなり驚きます。動的型付け言語には型の概念があり、実行時に型制約を適用します(たとえば、エラーが発生せずにLispで整数を文字列で除算することはできません)が、型なし言語には型の概念がありません。すべて(例:アセンブラー)。プログラミング言語に関するウィキペディアの記事(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages)でさえ、この区別をしています。

更新:おそらく混乱は、一部のテキストがJavascriptで「変数が入力されていない」という程度に何かを言っているという事実から来ています(これは本当です)。しかし、それは言語が型指定されていないことを自動的に意味するわけではありません(これは誤りです)。

于 2012-02-06T01:07:33.263 に答える
1

ブレンダンに同意する-コンテキストがすべてです。

私の見解:

Rubyが型指定されていないのか動的型付けされているのかについて議論があったため、2004年頃に混乱したことを覚えています。古い学校のC/C ++の人々(私もその1人でした)はコンパイラについて考えていて、Rubyは型指定されていないと言っていました。

Cには、ランタイムタイプはなく、アドレスだけがあり、実行中のコードがそのアドレスにあるものをそうでないものとして扱うことを決定した場合は、おっと、覚えておいてください。これは間違いなく型指定されておらず、動的型付けとは大きく異なります。

その世界では、「タイピング」はすべてコンパイラーに関するものです。コンパイラのチェックがより厳密だったため、C++には「強い型付け」がありました。JavaとCはより「弱い型付け」でした(Javaが強い型であるか弱い型であるかについての議論さえありました)。動的言語は、コンパイラーの型チェックがなかったため、その連続体では「型なし」でした。

今日、プログラマーを実践するために、私たちは動的言語に非常に慣れています。型なしとは、デバッグがめちゃくちゃ難しいコンパイラーやインタープリターの型チェックがないことを意味すると明らかに考えています。しかし、それが明白ではなかった時期があり、CSのより理論的な世界では意味がないかもしれません。

ある深い意味では、意味のあるアルゴリズムを作成するために値を操作する意図が必要なため、型指定されていないものはありません(またはとにかくほとんど何もありません)。これは理論的なCSの世界であり、特定の言語に対してコンパイラーまたはインタープリターがどのように実装されているかについての詳細を扱っていません。したがって、「型なし」は(おそらく、私にはわかりませんが)その文脈では完全に無意味です。

于 2012-02-06T04:43:44.327 に答える