1. ホーム
  2. c#

[解決済み] 弱型付け言語に関する明らかな矛盾の解明を求めて

2022-04-20 14:45:57

質問

理解しているつもりです ストロングタイピング しかし、弱い型付けとは何かという例を探すたびに、単純に自動的に型を強制したり変換したりするプログラミング言語の例を見つけてしまうのです。

例えば、この記事で 型付け。強い型と弱い型、静的型と動的型 は、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;弱く型付けされた言語と言えます。

本当はどちらなのか? それは、話す人の視点と、さまざまな言語の特徴に対する考え方によるので、一概には言えません。