パフォーマンスのための型システム


11

プログラムのパフォーマンス特性を形式化しようとする(静的)型システムは存在しますか?私はそのような試みを見つけるように思えません。

型システムは、プログラムに関するステートメントを作成するためのプログラマの武器の(強力な)ツールの1つであり、パフォーマンスが重要な場合が多いため、試行が行われたことを想像するのは遠いことではないようですプログラムのストレージとランタイムの特性について少なくともいくつかのステートメントを作成しようとする型システムを作成します。


1
あなたの型システムは、パフォーマンスについて何と言いますif condition then expensive_operation else cheap_operationか?
svick

抽象解釈を使用して、最悪の場合のコードの複雑さ(および終了)を自動的に推測する開発が行われたことを知っています。あなたはそれに興味があるかもしれません...
バクリウ

完全に関連しているわけではありませんが、それでも:kernelnewbies.org/FAQ/LikelyUnlikely Linux kernel / gccコンパイラには、特定のパスを最適化するためのマクロがありそうです。例:if (likely(operation_went_fine)) { // Do something } else if (unlikely(error_occured)) { // Do something else }
AmazingDreams

Cのvolatileキーワードとregisterキーワードが思い浮かびます。
mattnz

回答:


6

WCETやプログラムの複雑さに関連するほど洗練された型システムを想像できます。次に、問題はサウンドタイプアナライザー(またはチェッカー)を作成することです。つまり、タイピングルールを使用して、それを可能にし、合理的に役立つように効率的に実装します。

ほとんどのタイプシステムは、実際には(少なくとも人間の開発者が手動で作成できる合理的なプログラムのセットに対して)計算を行うのに十分なほど単純です。

いくつかのアカデミックプログラミング言語(AGDAなど)は、チューリング完全な非常に洗練された型システムを持っているため、コンパイラは長い(おそらく無限の)時間を要する場合があります。

(私がよく理解していれば、パリのLIP6で進行中のジェレミー・サルブッチのPhD作業は、あなたの質問にかなり関連しています。私は彼にそれについてメールを送りました。

ただし、ライスの定理停止の問題に注意してください。型システムは、常に望みどおりの銀の弾丸であるとは限りません(古い銀の弾丸のない本を参照してください)。


4
WCETは、このコンテキストでは「最悪の場合の実行時間」です(私の場合以外の人が疑問に思う場合)
クラースファンシェルベン

9
Agda、Coq、Epigram、Guru、Isabelleなどの依存型言語は、チューリング完全ではないことにより、停止問題、ライスの定理、および友人を「解決」します。構成によって(つまり、無限ループ/非終了再帰を書くことは単に不可能)、終了チェッカーが終了を証明できるようにすべてのプログラムを記述する必要があるか、プログラマにマシンチェック可能な終端証明。
ヨルグWミットタグ

3

型のパフォーマンス特性を分類する型システムを作成することは非常に可能です(例:「シリアルアクセスの高速/低速、ランダムアクセスの高速/低速」、「メモリ効率/非効率」)。これらの特性は、より具体的な型が継承されるような方法で階層に配置される抽象型です。ただし、これらの型を使用するプログラムのパフォーマンスは、実際に使用/アクセスされる方法に依存します。プログラム自体に関するステートメントを作成する型システムの場合、それらの型の使用(アクセス)は、型として表す必要があります。これは、組み込みの制御構造(for / whileループなど)の使用を放棄し、代わりにそれらを実装する型を使用することを意味します。したがって、階層には、抽象シリアルアクセス型と子孫リストシリアルシリアルアクセス、ツリーシリアル-アクセスタイプなど。使用効率は、これらのタイプの相互の組み合わせと適用によって、少なくとも部分的に表現される場合があります。

Haskellのような関数型言語-とにかくほとんど制御構造を持たない-では、これはかなり実用的強制力があります。Javaでは、しかし、そのようなシステムは(ないはるかに少ない達成できると思われるので、結果の執行/信頼性のような実装から多く)。

Haskellはすでに、プログラムのどれだけが純粋であるかを明確に述べることを可能にし、封印された箱の中に特定の活動を限定する方法を提供します。Haskellの並列性/並行性は型システムを介して実装されているため、既に(必要な)方法の一部であると主張できます。対照的に、命令型言語(Javaのような静的に型付けされた言語でさえも)は、コーダーに、この試みを打倒するための多くの多くの方法を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.