[解決済み] 弱型付け言語に関する明らかな矛盾の解明を求めて
質問
理解しているつもりです ストロングタイピング しかし、弱い型付けとは何かという例を探すたびに、単純に自動的に型を強制したり変換したりするプログラミング言語の例を見つけてしまうのです。
例えば、この記事で 型付け。強い型と弱い型、静的型と動的型 は、Pythonは型付けをしようとすると例外が発生するため、強く型付けされていると言っています。
Python
1 + "1"
Traceback (most recent call last):
File "", line 1, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'
しかし、JavaやC#でもそのようなことは可能であり、それだけを理由に弱型化されたとは考えていない。
ジャワ
int a = 10;
String b = "b";
String result = a + b;
System.out.println(result);
C#
int a = 10;
string b = "b";
string c = a + b;
Console.WriteLine(c);
という別の記事で 脆弱な型言語 著者は、Perlが弱型であるのは、単に文字列を数値に連結したり、その逆を明示的な変換なしに行えるからだと言っている。
パール
$a=10;
$b="a";
$c=$a.$b;
print $c; #10a
つまり、同じ例でPerlは弱型化されるが、JavaとC#は弱型化されないということですね。
げっ、これは紛らわしい
著者は、異なる型の値に対して特定の操作を適用できない言語を強型付け、その逆は弱型付けを意味すると言っているようです。
したがって、ある時点で、(perlのように)型間の自動変換や強制を多く提供する言語は弱型化とみなされ、一方、変換をわずかしか提供しない他の言語は強型化とみなされるかもしれないと信じるように促された気がする。
しかし、私はこの解釈は間違っていると信じたい。
そこで、質問です。
- ある言語が本当に弱型化されているとはどういう意味ですか?
- 言語が行う自動変換・自動強制とは関係なく、弱型化の良い例があれば教えてください。
- ある言語は弱型付けと強型付けを同時に行うことができるのか?
どのように解決するのですか?
UPDATEしてください。 この質問は、2012年10月15日のブログで取り上げました。 素晴らしい質問をありがとうございました。
<ブロッククオート
言語がquot;weakly typed"であることの本当の意味は何でしょうか?
それは、「この言語は、私が不快に感じる型システムを使用している」という意味です。それに対して、quot;strongly typed"言語は、私が快適だと思う型システムを持つ言語です。
この用語は基本的に意味がないので、避けた方がよいでしょう。 ウィキペディア リスト 11種類の意味 には、いくつかの矛盾がある。このことから、quot;strongly typed"やquot;weakly typed"という用語を含む会話では、混乱が生じる確率が高いことがわかります。
確実に言えることは、quot;強く型付けされた言語には、実行時またはコンパイル時に型システムに何らかの制限があり、quot;弱く型付けされた言語にはない、ということです。その制約がどのようなものであるかは、さらなる文脈がなければ判断できない。
強型付けと弱型付けを使い分けるのではなく、どのような型安全性を意味するのか、詳しく記述してください。例えば、C#は 静的型付け 言語であり タイプセーフ 言語と メモリセーフ 言語を使用します。 おおむね . C#では、これら3つの形式の型付けをすべて違反することができます。 キャスト演算子は静的型付けに違反しており、コンパイラに対して「私はあなたよりもこの式の実行時の型について知っていますよ」と言うのです。もし開発者が間違っていれば、ランタイムは型安全性を守るために例外を投げます。もし開発者が型安全性やメモリ安全性を破りたい場合は、"unsafe"ブロックを作って型安全性のシステムをオフにすることで実現することができます。unsafeブロックでは、ポインタマジックを使ってintをfloatとして扱ったり(型安全性の侵害)、自分が所有していないメモリに書き込んだりすることができる。(メモリーセーフティ違反)
C#は、コンパイル時と実行時の両方でチェックされる型制限を課しているため、コンパイル時のチェックや実行時のチェックが少ない言語と比較して、quot;strongly typed"と呼ばれる言語となります。また、C#は特殊な状況下でこれらの制約を回避することも可能であり、そのような回避を許さない言語と比較すると、quot;弱く型付けされた言語と言えます。
本当はどちらなのか? それは、話す人の視点と、さまざまな言語の特徴に対する考え方によるので、一概には言えません。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】C#におけるtypedefの等価性
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み] 2つのリストを結合する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】Pythonは強型付けされていますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 文字列の連結:concat()と "+"演算子の比較
-
[解決済み】Pythonは強型付けされていますか?
-
[解決済み] アカデミックなCSの世界では、「untyped」は「dynamically typed」の意味もあるのか?