タグ付けされた質問 「type-checking」

変数、式、または値が宣言された型を持っていることの確認

8
コンピューターはバイトのデータ型をどのように判断しますか?
たとえば、コンピューターが10111100RAMの特定の1バイトに保存されている場合、コンピューターはこのバイトを整数、ASCII文字、または他の何かとして解釈する方法をどのように知るのでしょうか?型データは隣接するバイトに保存されますか?(1バイトに2倍のスペースを使用する結果となるため、これは事実ではないと思います。) おそらくコンピューターはデータの種類さえ知らず、それを使用するプログラムだけが知っているのではないかと思います。私の推測では、RAMはR AMであり、したがって順次読み取られないため、特定のプログラムは特定のアドレスから情報をフェッチするようにCPUに指示し、プログラムはそれを処理する方法を定義します。これは、型キャストの必要性などのプログラミングに適しているようです。 私は正しい軌道に乗っていますか?

2
型検査アルゴリズム
型チェックアルゴリズムに関する個人の書誌研究を始めていますが、いくつかのヒントが必要です。最も一般的に使用されるタイプチェックアルゴリズム、戦略、および一般的な手法は何ですか? 特に、C ++、Java 5 +、Scalaなどの広く知られている強力な静的型付け言語で実装された複雑な型チェックアルゴリズムに興味があります。IE、基礎となる言語(Java 1.4以下など)の非常に単純なタイピングのために非常に単純ではないタイプチェックアルゴリズム。 私は、X、Y、またはZの特定の言語自体には興味がありません。ターゲット言語に関係なく、型チェックアルゴリズムに興味があります。「聞いたことのない言語Lで強く型付けされており、型付けが複雑な言語には、アルゴリズムZを使用してXとYをチェックすることでA、B、Cを実行する型チェックアルゴリズムがあります」または「 Scalaで使用されるストラテジーXとY、およびC#で使用されるAのバリアントZは、R、S、Tの機能がそのように機能するためクールです」と答えがあります。

1
製品タイプとタイプ推論
私は、連結言語用のコンパイラに取り組んでおり、型推論のサポートを追加したいと考えています。Hindley–Milnerは理解していますが、型理論を学んでいるので、それをどのように適応させるかわかりません。次のシステムは健全で、決定的に推測できますか? 用語は、リテラル、用語の構成、用語の引用、またはプリミティブです。 e::=x∣∣ee∣∣[e]∣∣…e::=x|ee|[e]|… e ::= x \:\big|\: e\:e \:\big|\: [e] \:\big|\: \dots すべての用語は関数を示します。2つの関数およびe 2の場合、e 1e1e1e_1e2e2e_2並置が逆組成を示しています。リテラルはニラディック関数を示します。e1e2=e2∘e1e1e2=e2∘e1e_1\:e_2 = e_2 \circ e_1 構成以外の用語には、基本的なタイプルールがあります。 x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γx:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ \dfrac{}{x : \iota}\text{[Lit]} \\ \dfrac{\Gamma\vdash e : \sigma}{\Gamma\vdash [e] : \forall\alpha.\:\alpha\to\sigma\times\alpha}\text{[Quot]}, \alpha \text{ not free in } \Gamma 連結言語にはアプリケーションルールがないため、アプリケーションのルールは特にありません。 型は、リテラル、型変数、またはスタックからスタックへの関数のいずれかです。ここで、スタックは右ネストされたタプルとして定義されます。すべての関数は、「残りのスタック」に関して暗黙的にポリモーフィックです。 τρσ::=ι∣∣α∣∣ρ→ρ::=()∣∣τ×ρ::=τ∣∣∀α.στ::=ι|α|ρ→ρρ::=()|τ×ρσ::=τ|∀α.σ …

2
マネージコードを実行する最小限のカーネルを使用する場合の潜在的な落とし穴は何ですか?
マネージコードインタープリター/ランタイムとして機能する非常に小さなネイティブの下位カーネルと、非ネイティブマシン言語(Javaバイトコード、CILなど)にコンパイルされた上位の上位カーネルに基づいてオペレーティングシステムを構築するとします。同様のオペレーティングシステムの例は、SingularityとCosmosです。 純粋にネイティブなソリューションとは対照的に、この種のインフラストラクチャを備えたOSを作成する際に、どのような落とし穴と開発上の課題が存在しますか?

5
関数パラメーター型としてボトム型の使用例はありますか?
関数の戻り値の型が⊥(bottom type)の場合、戻り値がないことを意味します。たとえば、どちらもかなり普通の状況で終了またはスローできます。 おそらく、関数にtype型のパラメーターがある場合、(安全に)呼び出すことはできません。そのような関数を定義する理由はありますか?

1
コンパイル時間の保証に向けてさらに調査しないのはなぜですか?
私はそれがすべてコンパイル時間であり、プログラムをコンパイルするとその実行について多くの保証が行われるという考えが大好きです。一般的に、静的型システム(Has​​kell、C ++など)は、動的型システムよりも強力なコンパイル時保証を提供するようです。 私が理解していることから、Adaはコンパイル時のチェックに関してさらに進んでおり、実行前にさまざまなバグを検出することができます。また、ある時点で、デリケートなフィールド(プログラミングエラーが人命にかかわる可能性がある場合)に選択されたことを考えると、かなり安全だと考えられています。 今、私は疑問に思う:より強力な静的保証が、より文書化され安全なコードにつながるなら、なぜ私たちはその方向でもっと研究しないのか? 欠落しているように見えるものの例はint、基礎となるアーキテクチャのビット数によって決定される範囲を持つジェネリック型を定義する代わりに、範囲を持つことができる言語です(次の例でInt [a..b]は、 aおよびbを含む): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int [-23..11] または(これをAdaから): a : Int [mod 24] b : Int [mod 24] a + b : Int [mod …

2
HoTTの製品を教会/スコットエンコーディングに削減
だから私は現在、何人かの人と一緒にHoTTの本を読んでいます。私が目にするほとんどの帰納的な型は、同等の型のインスピレーションとして再帰子の型を取ることにより、依存する関数型とユニバースのみを含む型に還元できると主張しました。私はこれがどのように機能するかをスケッチし始めました、そしていくつかのつまずきの後に私は私が答えであると思ったものに行きました。 (⋅ 、⋅ )≡ λ A :A 。λ B :B 。λ C :U。λ G :A → B → C 。g (a )(b )i n d⋅×⋅≡∏A,B,C:U(A→B→C)→C⋅×⋅≡∏A,B,C:U(A→B→C)→C\cdot \times \cdot \equiv \prod_{A, B, C : \mathcal{U}} (A \to B \to C) \to C (⋅,⋅)≡λa:A.λb:B.λC:U.λg:A→B→C.g(a)(b)(⋅,⋅)≡λa:A.λb:B.λC:U.λg:A→B→C.g(a)(b) (\cdot, \cdot) \equiv \lambda a : A. \lambda b …

1
ML型推論の指数コストの簡潔な例
OCamlのような関数型言語での型推論のコストは非常に高くなる可能性があることに私の注意が向けられました。各式について、対応する型の長さが式の長さに対して指数関数的であるような一連の式があるという主張です。 以下のシーケンスを考案しました。私の質問は次のとおりです。同じ型を実現する、より簡潔な式のシーケンスを知っていますか? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

1
Coqにlet表現がコア言語で含まれているのはなぜですか
Coqには、コア言語のlet式が含まれています。let式を次のようなアプリケーションに変換できます。タイプ チェック時にlet x : t = v in b ~> (\(x:t). b) v 値vを使用できないため、これが常に機能するとは限りませんb。ただし、これは、フォームのアプリケーションのタイプチェックを特別なケーシングで簡単に修正できます(\(x:t). b) v。これにより、タイプチェック中に特殊なケースを犠牲にしてlet式を削除できます。Coqインクルードにlet式がまだ含まれているのはなぜですか?それらには他の利点がありますか(特別なケースを必要としない以外に)?

1
静的型チェックが保守的すぎるのは不自然な例では何ですか?
でプログラミング言語で概念、ジョン・ミッチェルは、静的な型チェックが原因で停止問題の(過度に厳格な)は、必ずしも保守的であることを書き込みます。彼は例として以下を与えます: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) 誰かが実際に問題となる不自然な答えを提供できますか? 私はJavaが次のような場合に動的にチェックされるキャストを許可することを理解しています: if (foo instanceof Person) { Person p = (Person) foo; : } しかし、私は、言語間の問題よりも、Java言語/コンパイラーの欠陥の必要性を考えています。

1
型の安全性と型の健全性に違いはありますか?
私は型の安全性と型の健全性の定義をばらばらにしようとしてきました、そして私はそれの時間の一体を持っています。私は最近教授に尋ねました、そして少し考えた後、彼は本当に何の違いもなかったと言いました。ただし、これを読んだ後 は次のようになります。 型の安全性は、データへの関数(および演算子)の適用は意味がある(つまり、1 / "Hello"はナンセンスであり、許可されない)とする言語の特性です。 型の健全性は、型チェックシステムのプロパティであり、静的型予測が実行時に正確であることを保証します。 これは明らかに一人のメモであり、PLコミュニティ内に何らかの基準があるのか​​と思います。いくつか検索を行ったが、満足のいく答えが見つからなかった。


1
型レベルでの連結の表現
スタックに基づいて、連結パラダイムに従って、小さな単純な言語を作成することにより、連結プログラミングについて詳しく学びたいと思います。 残念ながら、私は連結言語とそれらの実装に関する多くのリソースを見つけていません。そのため、私の可能なことを前もって申し訳ありません。 したがって、私は言語を関数の連結の単純なシーケンスとして定義し、ASTでリストとして表しています。 data Operation = Concat [Operation] | Quotation Operation | Var String | Lit Literal | LitOp LiteralOperation data Literal = Int Int | Float Float data LiteralOperation = Add | Sub | Mul | Div 次のプログラム4 2 swap dup * +(に対応2 * 2 + 4)が解析されると、次のASTが得られます。 Concat [Lit …

2
型チェックの決定可能性、入力可能性の決定可能性、および強い正規化の関係
ヨ!これはおそらくばかげた質問ですが、たとえば、型チェックの決定可能性が強力な正規化プロパティと同等である場合、明示的に書き留められたことはありません。したがって、私はこの質問をして、型チェック、型付け可能性、および強力な正規化の間のすべての可能な関係を明らかにします。 やる気を説明させてください。型理論(私はここでは意図的に曖昧にしていますが、主に依存型理論に興味があります)では、強い正規化を使用して型チェックの決定可能性を証明しています。反対に、これらのプロパティの1つを持っていることがわかっている型指定されたシステムには、もう1つのタイプもあります。ただし、強い正規化が型チェックの決定可能性に相当することを明示的に述べたことはありません。 同様に、タイプ可能性を証明するために、通常(多分常に)、用語を正規形に減らします。しかし、型付け可能性は依存型の理論には当てはまらないことはわかっていますが、強い正規化が保持される場合があります。 型チェックの決定可能性とは、特定の型、コンテキストおよび型なし項、がtrueでかどうかを有限数のステップで決定できることを意味します。ああAA Γ ⊢ A :AΓΓ\GammaaaaΓ ⊢ :AΓ⊢a:あ\Gamma \vdash a: A タイプ可能性の決定可能性と、特定の型なし用語、がtrueになるようなコンテキストとタイプが存在するかどうかを有限数のステップで決定できることを意味します。Γ A Γ ⊢ :AaaaΓΓ\GammaああAΓ ⊢ :AΓ⊢a:あ\Gamma \vdash a: A 1)型チェックの決定可能性は、すべての項が強く正規化可能であることと同じですか? 2)より一般的には、型チェックの決定可能性、タイプ可能性、強力な正規化の関係は何ですか?どちらが他を意味するのですか? 前もって感謝します。 編集 私の質問の一般性のレベル(私は知らなかった)に関する不満を考慮して、純粋なタイプシステムのみに限定したいと思います。もちろん、他のタイプ理論に関する追加のコメントや反例は非常に有用です。

1
タイプ割り当てシステム(TA)とHindley-Milnerシステムの関係
最近、型理論/型システムとラムダ計算の研究を始めました。 Church and Curryスタイルの単純型付きラムダ計算についてはすでに読みました。最後の1つは、タイプ割り当てシステム(TA)とも呼ばれます。 TAと、MLやHaskellのような言語のシステムであるHindley-Milner(HM)の関係について考えています。 ラムダ計算と結合子:はじめに(Hindley)の本は、TAは多態性であると述べています(ページ119)。それは、HMやSystem-Fなどのシステムでの多態性と同じ意味ですか? TAは強力な正規化特性を持つと言われているため、完全なチューリングではありません。HMシステムを使用する言語は、Haskellなどのように完全なものになりつつあります。したがって、HMシステムでは、無限ループような用語が型を受け取ることができるようになっている必要があります。それは正しいですか、それとも何か不足していますか?ΩΩ\Omega とにかくTAとHMの関係を知りたい。

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