タグ付けされた質問 「semantics」

セマンティクスは、いくつかの構文の意味を正式に説明します。

3
参照カウントGCとトレースGCは言語プロパティですか、実装プロパティですか?
「Swiftはクラシック(トレース)GCを実行せず、ARCを使用する」と聞くことがあります。 しかし、参照カウントを必要とするSwiftセマンティクスに何かがあるかどうかはわかりません。トレースGCを使用するために、独自のSwiftコンパイラーとランタイムを構築できるようです。 それでは、Swiftについて正確に「参照カウント」とは何ですか?Appleの実装または言語自体?言語自体にそのラベルを使用できるほどARCを強力にサポートする言語またはライブラリの一部はありますか?


2
Haskellリストタイプはどのフィックスポイントですか?
リストが次のように定義されているとしましょう List a = Nil | Cons a (List a) 次に、HaskellでList x最大または最小の固定点は何ですか?lfpは無限リストを除外する必要がありますが(ただし、Haskellで作成できます)、gfpは有限リストを除外する必要があるためです。

2
「純粋な」関数の標準的な定義はありますか?
StackOverflowは私をここに指し示したので、質問は一般人の言葉では少しかもしれません。 ウィキペディアは純粋な関数を次のように定義しています コンピュータプログラミングでは、関数に関するこれらのステートメントが両方とも成立する場合、関数は純粋な関数として記述できます。 関数は常に、同じ引数値が指定された同じ結果値を評価します。関数の結果値は、プログラムの実行が進むにつれて、またはプログラムの異なる実行間で変化する可能性のある非表示の情報や状態に依存したり、I / Oデバイスからの外部入力に依存したりすることはできません。 結果の評価は、変更可能なオブジェクトの変異やI / Oデバイスへの出力など、意味的に観察可能な副作用や出力を引き起こしません。 ただし、出典を引用しているようには見えないため、これが受け入れられた定義であるのか、誰がこのように定義したのかを判断するのは困難です。 「純粋な」関数の構文/注釈が言語に含まれているときの言語の動作を見ると、かなりいくつかの異なるアプローチがあります。 Dでは、唯一の制限はグローバル状態の非変異です。「純粋な」関数はその引数を変更できます。 GCCには、「純粋」の2つのタイプがあります:(pure副作用はありませんが、グローバルな状態を読み取ることができます)およびconst(Wikipediaの定義に従って厳密に純粋です)。 C#では、「目に見える状態の変更を行わない」(それが何であれ)と定義されています。 HaskellはWikipediaの定義に従います。 だから私の質問は、純粋な関数の標準的な定義はありますか? そして、もしあるなら、その源は何ですか?

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

1
ラムダ計算:評価コンテキストが「機能する」方法
純粋なラムダ計算には、帰納的に定義された一連の用語(文法)があります: e::=x∣λx.e∣e1e2e::=x∣λx.e∣e1e2e::= x \mid \lambda x . e \mid e_1 e_2 値による呼び出し評価戦略では、ベータ削減の推論規則とアプリケーションの評価方法に関する規則(合同規則)があります。私は、実際に言語の構文を変更することなく、評価コンテキストが合同ルールをどのように置き換えることができるかを理解しようとしています。評価コンテキストがなければ、次のようになります。 e2→e ′ 2e1→e′1e1e2→e′1e2e1→e1′e1e2→e1′e2 \frac{e_1 \rightarrow e_1'}{e_1e_2 \rightarrow e_1'e_2} および e2→e′2ve2→ve′2.e2→e2′ve2→ve2′. \frac{e_2 \rightarrow e_2'}{ve_2 \rightarrow ve_2'}. 式がある場合、これはという形式で、したがってE 1 、E 2 → E ' 1、E 2(λ F 。λ X 。F X )((λ Y 。Y )λ Z 。Z )λt=(λf.λx.fx)((λy.y)λz.z)λw.wt=(λf.λx.fx)((λy.y)λz.z)λw.wt = (\lambda …

1
新しいドメイン固有のプログラミング言語を正式に説明する
私は社会学習の慣習を表現するためにドメイン固有の言語を実装しようとしています。実装の一部は、言語の正式な記述-その「計算」、記号、および論理式です。 私のアプローチは、文法を記述することによって言語を記述することですが、関係、対話、より理論的なアプローチを必要とする期待やロジックの説明などの概念もあります。 この説明に役立つ例と参考文献(論文、本)をお願いしたいと思います。私はこのタスクに比較的有能に近づいていると感じているので、完全な手持ちを求めているわけではありませんが、この分野の理論家の助けをいただければ幸いです。

2
Java(または一般的な命令型言語)の正式な実行モデル
いくつかの厳しい制限の下でJavaプログラムの実行に関するいくつかのステートメントを証明しようとしています(基本的に、2つのメソッドが特定の入力の一連の制約を満たす場合、それらは同等であると推測されます(つまり、戻り値と後の状態)実行は同じです)。これを証明するために、私はこれについて話すことができるある種の形式主義を探しています。 私は関数型言語の操作上のセマンティクスに精通しており、forループ/ whileループを再帰的な関数に変換できる可能性があります...これを行うのではなく、いくつかの機械を用意して命令型の土地に留まることができるとよいでしょう。 より具体的には、実行のk番目のステップでのメソッドの状態について推論したいと思います。これには、グローバルな状態が含まれます。 this.field = 2クラスの状態を更新するような呼び出し パラメータを変更する呼び出しは、メソッドの外部で状態を更新します。 myParam.setFoo(...) myParam.x = y 静的メソッドの呼び出し Blah.static_side_effects() これはすべて確定的であると想定しています。つまり、状態に対するこれらのグローバル更新のいずれかが2つのメソッドで発生し、その両方のグローバル実行状態とローカル実行状態が同じである場合、新しい状態も同じになるという仮定を正式化したいと思います-計算の各ステップが決定されるということです正確には、グローバル状態とローカル状態によって。これは明らかにRNGと並列処理を排除します(ただし、これは後で処理する可能性があります...)。 これにどのように取り組むことができるかについてのアイデアや情報源はありますか?私の唯一の考えは、メソッドをステートメントのリストとして扱い、ステートメントのセマンティクスを正式に記述しようとすることです。 できれば、JVMレベルではなく、Java言語レベルでこれを実行したいと思います。これは現実的ではないかもしれませんが、今の私の目標は、運用上のセマンティクスについていくつかの合理的な仮定を行い、そこからそれを取得することです。 ああ、最後のメモです。この質問をどのように改善できるかについての提案があれば、大歓迎です。私は質問をするのに適切な言語を見つけようとするのにちょっと気まぐれになっていて、用語を乱用しているかどうか(ローカル/グローバル実行状態など)は、これを修正したいです。

1
行多態性と有界多態性の違いは?
私は最近、Brian McKennaが行のポリモーフィズムを説明しているこのブログ投稿を見つけました。これは私にとっては素晴らしいアイデアのように見えましたが、その後、制限付きパラメトリック多態性のようなひどいにおいがすることに気付きました。 行ポリモーフィズムの場合: sum: {x: int, y: int | rho} -> int function sum r = r.x + r.y 制限付きパラメトリック多態性: sum: forall a <: {x: int, y: int}. a -> int function sum r = r.x + r.y 誰かがこれらの2つのアプローチの多型性の違いを明確にできますか?

2
意味保存の健全性(または正確性)または完全性
用語をある言語から別の言語に変換する場合、直感的に望ましいプロパティは、セマンティクスの保持です(たとえば、ここではCPS変換に使用されます)。 s⇓v⟹c(s)⇓c(v)s⇓v⟹c(s)⇓c(v) s \Downarrow v \implies c(s) \Downarrow c(v) しかし、これを古典的な用語の正しさ(または健全性)と論理システムの完全性と一致させることで、少し問題があります。通常、私は上記のステートメントをの完全性プロパティと見なし(正しさの定義を逆にします)。ccc ただし、直感的には、コンパイラーは完全ではなく正しいはずです(たとえば、型チェックは正しいプログラムを除外することが多いため)。上記の文の逆は、が単射である場合にのみ当てはまります。たとえば、ソース言語にブールとその演算が含まれていて、コンパイルでChurch-encodingを使用して置き換えられた場合、ターゲット言語はブールリテラルからコンパイルされた用語のブール演算を評価できます。ソース言語が評価できないラムダ抽象化。ccc 上記のステートメントがの完全性プロパティであると仮定するのは正しいのでしょうか?ccc 私はまた、非単射コンパイラは通常正しくないという私の結論で正しいのでしょうか?

3
継承、およびJavaのような言語でのメンバー/属性およびメソッドへの動的アクセス
JavaのようなOOプログラミング言語での継承について質問があります。メソッドとその呼び出しをコンパイルする方法を説明したとき、それは私のコンパイラクラスで思い付きました。コンパイルするソース言語の例としてJavaを使用していました。 次に、このJavaプログラムについて考えてみましょう。 class A { public int x = 0; void f () { System.out.println ( "A:f" ); } } class B extends A { public int x = 1; void f () { System.out.println ( "B:f" ); } } public class Main { public static void main ( String …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.