タグ付けされた質問 「programming-languages」

プログラミング言語の設計、実装、および分析に関する質問。このサイトのトピックから外れている、プログラミング方法に関する質問は対象外です。

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

1
構造計算の観点から穴を埋める一般的なアルゴリズムはありますか?
Calculus of Constructionsを「穴」で拡張するとします。つまり、まだ埋めていない不完全なコード片です。これらの役割を自動的に埋めるアルゴリズムはあるのでしょうか。例(モートの構文を使用): ケースA: λ (pred : ?) -> λ (Nat : *) -> λ (Succ : Nat -> Nat) -> λ (Zero : Nat) -> (Succ (pred Nat Succ Zero)) このような状況では、型推論アルゴリズムは、それが識別することができ?、明らかに唯一できる∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Natので、pred受信Nat : *、Succ : Nat -> Nat、Zero : …


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

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
型レベルでの連結の表現
スタックに基づいて、連結パラダイムに従って、小さな単純な言語を作成することにより、連結プログラミングについて詳しく学びたいと思います。 残念ながら、私は連結言語とそれらの実装に関する多くのリソースを見つけていません。そのため、私の可能なことを前もって申し訳ありません。 したがって、私は言語を関数の連結の単純なシーケンスとして定義し、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 …

1
可変性のコンテキストで「単調性」とはどういう意味ですか
私はThe Rust Programming Languageを読んでいて、次の文章を見つけました: 構造体への書き込みはアトミック操作ではないことを忘れないでください。また、などの多くの関数vec.push()は内部的に再割り当てして安全でない動作を引き起こす可能性があるため、単調性でも正当化するのに十分ではない場合があります UnsafeCell それは本のどこからともなく出てきた、そして私はこの文脈でそれが正確に何を意味するのかを見つけることを試みるオンラインで苦労した。数学関数の「単調性」の概念に関する情報が多すぎます。これは、すでに知っていましたが、明らかにあまり役に立ちません。 それについて語っているこの記事だけを見つけたようです。 ここで、明白な方法で平等を尊重することに加えて、関数型プログラムは観測の単調性を尊重しなければならないという規定も含めます。これはどういう意味ですか?ある時点で何かを観察した後は、それが将来明らかになるのを止めることはないでしょう。これは、クリプケまたはベスのセマンティクスの単調性プロパティに類似しています。 しかし、これも非常に抽象的なものであり、同じことについて話されているかどうかはわかりません。

7
教師として:適切なプログラミング言語の選択
この質問に適切な場所かどうかはわかりません。少し話題から外れている場合は申し訳ありません。 最初のプログラミングコースに適した言語を選択することは、関連するすべての教師/講師が心に留めておくべき最も重要なことの1つです。特に、学生が若い場合や数学の知識が限られている場合に役立ちます。 私は現在、数学について中程度の知識を持つ非常に熱心な若者(約16〜17歳)のグループを教えています。彼らは今高校の10年生のクラスに通っています。次期のプログラミング言語を教え始めます。 彼らは、並外れたレベルの創造性と勤勉さを備えた、市内の厳選された学生のグループです。したがって、実際のプログラミング言語での作業は、彼らにとって難しい作業ではないでしょう。そのため、Turtle Art、Scratch、Tynkerなどの単純なグラフィカルおよびドラッグアンドドロップソリューションを選択することは、オプションとは見なされません。 選択する前に確認する必要があるいくつかの要因があります。 シンプルさ:それらのほとんどは、おそらく実際のコーディングアクションをこれまで経験したことがありません。 単純さ、繰り返します。主要なアイデアの1つは、アルゴリズムの考え方を教えることです。洗練された、またはほとんど構文化されていない言語があると、それらは道から外れます。 一般性:言語は、特別な開発ケース向けに設計されていない方がよい。PHPとMATLABを、Web開発と計算/モデリング用にそれぞれ設計された例として取り上げます。 最小限の目的のもの:強制的なオブジェクト指向プログラミング(Javaなど)はありません。または、少なくともOOの概念への依存度は最小限です。 プラットフォーム:ほとんどすべてがWindows上にあるため、Windowsをサポートされる開発環境として持つことが重要です。 セットアップが簡単:開発環境をセットアップする簡単な方法を用意することをお勧めします。 業界の好み:深刻な問題ではありません。ただし、少なくとも現在アクティブな言語で、学生がほぼ実際の開発者エクスペリエンスに到達できるようにする必要があります。 ハードウェアの移植性:言語がハードウェアプログラミングで使用できるほど柔軟であることは重要です(必須ではありません)。(私はVerilogやVHDLのようなハードウェア記述言語については話していません。)その目的は、AVRマイクロプロセッサーやRaspberry Pi GPIOインターフェースのようなより単純なプロセッサーベースのハードウェアのプログラミングです。 知りたい 他に欠けている要素はありますか? また、選択肢としてどの言語を提案しますか?

1
正式な言語を使用して数学表記を研究できますか?
質問:最適な表記法の研究にそれをどのように適用するかを論じる正式言語またはプログラミング言語理論の紹介テキストはありますか? 特に、スタック言語、解析ツリー、インデックスとは何か、そして特定のタイプの表記法が指数関数的な冗長性につながる時期を予測する方法に興味があります。 数学の専攻として私が学んだ唯一のコンピュータサイエンスは、アルゴリズムとグラフ理論、および複雑さの理論とブール関数の非常に控えめな中級者でした。したがって、これを論じている唯一の本が入門書ではない場合、指数表記の爆発を論じているそのような本と、私の質問に直接取り組む本を準備する入門書をリストした回答の両方に感謝します。 コンテキスト:この質問は、主にPhysics.SEへの回答に触発されており、次のように述べています。 括弧はスタック言語(Chomskyの分類では文脈自由文法)によって解析されるので、括弧はスタックを使用して解析できないため、テンソルインデックスの縮約を再現する括弧表記がないことを(厳密に)証明するのは非常に簡単です。グラフ。括弧は構文解析ツリーを生成し、グラフ内には常に指数関数的に多くの最大ツリーがあるため、表記には指数関数的な冗長性があります。 残りの回答では、「指数表記の爆発」の他の例について、たとえば計算生物学のペトリネットを使用して説明します。 たとえば、ここで言及されているように、関数と引数に適用される関数が明確に区別されていない場合、数学表記が解析しにくい他の例もあります。この関数は、引数になり、引数は、たとえば、関数となる場合には特に混乱になることができ、ここで。

1
例外のあるデータフロー分析
データフロー分析は、制御フローグラフに対して機能します。検討中の言語が例外をサポートしている場合、制御フローグラフが爆発する可能性があります。 この爆破に対処するための標準的なテクニックは何ですか?例外によって引き起こされたエッジを完全に無視できますか?とにかく、データフロー分析は過剰近似を計算するので、精度は落ちますが適切なソリューションになります。これは本当ですか? 更新:最後に掘り下げることができたいくつかの便利なリンクを次に示します。 例外処理構造を持つプログラムの分析とテスト Javaプログラムの分析のための例外の効率的で正確なモデリング

2
BNFが言語を記述するための不十分な手法と見なされるのはなぜですか?
私は先日、C。Stracheyによる論文「プログラミング言語の基本概念」を読んでいました。その中で、私には非常に奇妙なものを読んでいました。直接引用する(奇妙な部分を強調表示した): 今日存在するような、特定のクラスの文法(BNFまたはコンテキストフリーとして知られている)を記述する一般に知られている方法がある状況に直面すると、これらの数学者の最初の本能はBNFの限界を調査することです —面倒で人工的な構造を犠牲にしても、BNFで表現できますか?これはいくつかの数学的な関心の問題かもしれませんが(意味が何であれ)、BNFよりも構文を記述するより良い方法を発見することが重要であるプログラミング言語との関連性はほとんどありません(これはすでにALGOLには不便で不十分です)。それは、私たちがすでに不十分な技術であるとわかっていることの可能な限界を調べることです。 著者がBNFを言語を記述するための不十分な手法であると考える特定の理由はありますか?単一のBNF文法では構文しか記述できず、セマンティクスは記述できないためでしょうか(ただし、属性文法に変換することで、操作セマンティクスを記述するように拡張できます)。

4
コンパイラーを作成してプログラミング言語を作成しますか?
たとえば、自分でプログラミング言語を作成したいと考えました。見た目と動作をどのように決定するかをすべて決定したと仮定すると、そのためのコンパイラーを作成するだけでよいですか? たとえば、高レベルのJavaコードはテキスト以外の何かであり、このテキストは、コンパイラがそれを受け入れて別の何かに変換するための正しい形式になっていますか? 私の質問は、プログラミング言語の作成はコンパイラを介して行われるのですか?ハイレベルで結構です。

2
whileループの理論と実装をつなぐ方法は?
私は教育目的で自分の小さなプログラミング言語に取り組んでおり、少し問題に遭遇しました。それにはいくつかの異なる解決策がありますが、それらはすべて洗練されていないように見えます-私が理解している限りでは不要です。しかし、私が持っている本やグーグル検索を読んでも、エレガントな解決策を見つけることができません。 だから問題は、私が理解しているように、基本的なラムダ計算を構築していることです。true / falseを抽象用語として定義しました。これらを関数と組み合わせて、if / then / elseの動作を実行できます。問題はループで発生します。再帰によって基本的なwhileループを定義できますが、実際にはスタックオーバーフローが発生します。私が理解しているように、通常の解決策はテールコールの最適化を実行することですが、どうすればよいかわかりません。条件文は言語で定義されています。そのため、コンパイラーは、whileループの本体が末尾にあることを認識しません。 ドラゴンブックは、ラベルとゴトがあると仮定してループを実装することに焦点を当てています。私は確かにそれをすることができました。ループ構造を組み込まない他の言語は、少なくとも条件文を組み込んでからTCOを行うように見えます。そして、私も確かにそれを行うことができました。しかし、私の理解では、抽象化を適用して削減を実行できる限り、ループ(およびその他すべて)はこれらの基本ブロックから構築できるはずです。 それで私は何が欠けていますか?それとも、「XとYがあれば何でもモデル化できる」が「実際のコンピュータでXとYがあれば何でもモデル化できる」とは異なり、実用的に組み込みが必要なケースの1つですか?目的?

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 …

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