web-dev-qa-db-ja.com

Python type safe?

Wikipedia によると

コンピュータ科学者は、言語が型システムの規則に違反する操作または変換を許可しない場合、「型安全」と見なします。

Pythonランタイムチェックは型システムルールが満たされていることを確認するので、Python型安全言語を検討する必要があります。

Programming Rust :でジェイソン・オレンドルフとジム・ブランディが同じ点を指摘しています。

型セーフであることは、言語がコンパイル時または実行時にタイプをチェックするかどうかに依存しないことに注意してください。Cはコンパイル時にチェックし、タイプセーフではありません。 Python実行時にチェックし、タイプセーフです。

静的型チェックと型安全性の両方の概念を分離します。

あれは正しいですか?

25
user8664060

多くのプログラマーは、静的型チェックを型安全性と同一視します。

  • 「言語Aには static 型チェックがあるため、 is 型安全です」
  • 「言語Bには dynamic 型チェックがあるため、 not 型安全です」

悲しいことに、それはそれほど単純ではありません。

現実世界では

たとえば、 Type punning を使用して型システムを弱体化させる可能性があるため、CおよびC++は型セーフではありません。また、C/C++言語仕様では、エラーを明示的に処理するのではなく、 undefined behavior(UB) を広範に許可しており、これが stack smashing エクスプロイトおよび format string attack 。このようなエクスプロイトは、タイプセーフな言語では不可能です。 Javaの初期バージョンには、 completely type-ではないことを証明する Generics のタイプバグがありました。安全。

今日でも、Python、Java、C++などのプログラミング言語の場合、これらの言語が数学的な証明を必要とするため、完全にタイプセーフであることを示すのは困難です。これらの言語は massive であり、コンパイラ/インタープリターにはバグがあり、バグは常に reported で修正されています。

[ Wikipedia ]一方、多くの言語は、数千のケースをチェックする必要があることが多いため、人間が生成した型安全性証明には大きすぎます。 ....実装のバグ、または他の言語で記述されたリンクライブラリのバグにより、実行時に特定のエラーが発生する場合があります。このようなエラーにより、特定の状況で特定の実装タイプが安全でなくなる可能性があります。

アカデミアでは

型の安全性と型システムは、実際のプログラミングに適用できますが、その根と定義は academia に由来します。正確に is 「タイプセーフティ」には困難が伴います。特に、現実の世界で使用される実際のプログラミング言語について話す場合はそうです。学者は、 toy言語 と呼ばれる小さなプログラミング言語を数学的に(形式的に)定義することを好みます。これらの言語についてのみ、それらがタイプセーフであることを正式に示すことができます(そして、それらが論理的に correct であることを証明します)。

[ Wikipedia ]型安全性は、通常、アカデミックプログラミング言語の研究で提案されている toy言語 の要件です。

たとえば、学者はJavaがタイプセーフであることを証明するのに苦労しました。そのため、Featherweight Javaと呼ばれる小さなバージョンを作成し、 it is type-safe。同様に、Christopher Lyon Andersonによるこの Ph.D。paper はJavascriptのサブセットを取りました、それをJS0と呼び、タイプセーフであることを証明しました。

Python、Java、c ++などの適切な言語は、非常に大きいため、完全にタイプセーフではないと想定されています。小さなバグが型システムを損なうような亀裂をすり抜けるのはとても簡単です。

概要

  • Nopythonはおそらく[////] not 完全にタイプセーフ–誰も持っていないあなたはそれがタイプセーフではないことを実証する言語の小さなバグを見つける可能性が高いです。
  • 実際、ほとんどのプログラミング言語はおそらくない完全にタイプセーフです-すべて同じ理由で(のみおもちゃの学術的なものであることが証明されています)
  • あなたは本当に静的型付け言語が必然的にtype safeであると信じるべきではありません。通常、動的に型付けされた言語よりも safeer ですが、 completely 確実に型保証されているとは言えません。このため。

参照: http://www.pl-enthusiast.net/2014/08/05/type-safety/ および https://en.wikipedia.org/ wiki/Type_system

38
James Lawson

ウィキペディアの記事では、タイプセーフとメモリセーフを関連付けています。つまり、同じメモリ領域にアクセスすることはできません。整数と文字列。このようにPythonはタイプセーフです。オブジェクトのタイプを暗黙的に変更することはできません。

9
Daniel

まだ誰も言っていないので、Pythonは強く型付けされた言語であり、混同しないでください。動的に入力されます。 Pythonは、可能な限り最後まで型チェックを延期し、通常は例外がスローされます。これは、Mureinikが言及する動作を説明しています。そうは言っても、Pythonは自動変換も頻繁に行います。たとえば、算術演算のためにintをfloatに変換しようとすることを意味します。

入力のタイプをチェックすることにより、プログラムでタイプセーフを手動で実施できます。すべてがオブジェクトであるため、ベースクラスから派生するクラスをいつでも作成でき、isinstance関数を使用して型を検証できます(もちろん実行時に)。 Python 3はタイプヒントを追加しましたが、これは強制されません。また、 mypy を使用すると、言語に静的型チェックが追加されますが、これは型の安全性を保証するものではありません。

7
VoNWooDSoN

Pythonでは、間違ったコンテキストで間違った型の変数を使用すると、ランタイムエラーが発生します。例えば。:

>>> 'a' + 1

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

このチェックはruntimeでのみ行われ、プログラムを実行する前ではないため、Pythonはタイプセーフ言語ではありません( PEP-484 にもかかわらず)。

3
Mureinik