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

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

2
最も表現力豊かな、終了言語は何ですか?
私はほとんど何でも書くことができる言語にはあまり興味がありませんが、あなたが書いたものが終了するという付随する証拠を書く必要があります。 私は本質的に、構造によって特定の複雑さのクラスに本質的に制限されている言語のデザインスペースに興味があります。 サブチューリング完全言語には何らかの理論階層がありますか?

1
「状態」が許容されない場合、関数型言語を使用して命令型言語ですべてを実行できますか?
私はMITのコンピュータープログラムの構造と解釈(SICP)を読んでいました。私が理解したのは、純粋な関数型プログラミング言語では、ローカルな状態などは存在しないということです。SICP、pg 230は言う: 「この本の最後の2つの章で行ったように、割り当てを使用しないプログラミングは、関数型プログラミングと呼ばれています。」 私は命令型プログラミングのバックグラウンドを持っており、実際のシステム(単純な銀行やライブラリ管理ソフトウェアなど)をモデル化して、状態を意識せずにプログラムを作成する方法を理解できていないようです。 関数型プログラミングに状態の概念がない場合、どうすればよいですか?

1
確定的な文法では説明できない実際のコンピュータ言語はどれですか?
非決定的である実際のコンピューター言語の例はありますか? コンピュータ言語ごとに、プログラミング言語、マークアップ言語、クエリ言語、モデリング言語、変換言語などを含めます。 非確定的とは、確定的文法では解析できないことを意味します。

2
Hindley-Milner型に適用されるCurry-Howard同型では、どの命題がa-> [a]に対応しますか?
(質問はHaskellに触発されているため、Haskell構文を使用しますが、SMLやElmなどの一般的なHindley-Milnerポリモーフィック型システムに適用されます)。 型シグネチャがある場合f :: a -> [a]、その型シグネチャによってエンコードされる論理命題は何ですか? 私はそのコンストラクタは好きなタイプを知って->、(,)あなたのロジックで「操作」に対応して:->「意味」シンボルに対応。→→\rightarrow 私[]も型コンストラクタであると想定しており、答えは再帰的な定義と関係があるかもしれないと感じています。これは次のように実装できることがわかっています。 data List a = Cons a (List a) | Nil しかし、これが論理の意味で何を意味するのかはわかりません。

1
割り当て、評価、名前のバインドの違いは何ですか?
Nameバインディングが識別子(data / code / expression)にいくつかの値を割り当てることを読みました。割り当てと評価は同じことをしているようです。それは紛らわしい。バインドされた変数に値が割り当てられているのに、値が割り当てられていない自由変数が1つであると言えますか?

3
短いプログラムでは解決できない問題は何ですか?
バックグラウンド: 最近、入力として数値の配列を取得するという特定の難しい問題を解決しようとしました。以下のため、私は見つけることができる唯一の解決策は、それぞれに異なる治療持つことだった 3つの数字の順序。つまり、場合には1つのソリューションがあり、の場合には別のソリューションがあります(場合は、これら2つのソリューションのいずれかで解決できます)。nnnn=3n=3n=3n!=6n!=6n!=6A>B>CA>B>CA>B>CA>C>BA>C>BA>C>BA>C=BA>C=BA>C=B ケースについて考えると、唯一の方法は、やはり、すべての異なる順序を考慮して、ケースごとに異なるソリューションを開発することです。それぞれの場合の解決策は高速ですが、プログラム自体は非常に大きくなります。したがって、問題の実行時の複雑さは小さいですが、「開発時間」の複雑さまたは「プログラムサイズ」の複雑さは非常に大きくなります。n=4n=4n=4n!=24n!=24n!=24 これは私が私の問題が短いプログラムでは解決できないことを試み、証明するように促しました。そこで、同様の証明の参考文献を探しました。 私が見つけた最初の概念はコルモゴロフの複雑さです。ただし、このトピックについて私が見つけた情報は非常に一般的であり、主に存在の結果が含まれています。 質問: サイズ入力配列でを解くプログラムは少なくともサイズでなければならないなど、特定の実際の問題について説明できますか。ここで、は増加する関数ですの?PPPPPPnnnΩ(f(n))Ω(f(n))\Omega(f(n))f(n)f(n)f(n)nnn 答えは明らかにプログラミング言語の選択に依存するので、JavaまたはTuringマシンでプログラミングすると仮定します。 すべての決定不可能な問題は、まったく解決策がないため、この要件を簡単に満たします。だから私は決定的な言語を探しています。

1
IOはどのようにモナドですか?
私はHaskellプログラミング言語を学んでいます。私が読んでいるものから、入力/出力(IO)はHaskellの純粋さに対する課題を引き起こします。なぜなら、定義により、私たちは外の世界と相互作用しているからです。ウィキペディアから: Haskellなどの純粋に関数型の言語では、関数は、関数のセマンティクスの一部として、外部から見える副作用を持ちません。関数は直接的な副作用を引き起こすことはできませんが、呼び出し側が都合のよいときに適用する必要のある副作用を説明する値を作成できます。 Haskell表記では、タイプIO aの値は、実行時にタイプaの値を生成するアクションを表します。 すぐに、IOがHaskellモナドの例であることを知りました。モナドが何であるかについての多くの説明はありませんが。ファンクタ、Applicatives、そしてモナドでの写真 モナドについて学ぶ方法: コンピュータサイエンスの博士号を取得します。 このセクションでは必要ないので、捨ててください! これまでに、私はさまざまな定義を読みました。それらは、コンテキストを追加したり、特定の概念に基づいて大きな言語の中に小さなプログラミング言語を作成したりしています。それでも、どのモナドとそれらのアイデアがどのように適用されるかを理解しようとしています。 Haskellにmonadは、もう1つの型クラスがあり、基本的にそれを定義するルールは1つだけです。そしてIOその一例です。 class Monad m where (>>=) :: m a -> (a -> m b) -> m b /programming/44965/what-is-a-monad ここで代数学が起こっていますか?IOの代数とは何ですか? 言語固有であることをお詫び申し上げます。私の希望は、この議論のほとんどがすべての関数型プログラミング言語に当てはまることです。私の議論における誤りは、この領域についての私自身の限られた理解を表しています。 私がnLabで見つけたモナドの別の定義があり、それはプログラミング言語にさえ特定されていません。 別の質問で、Haskellの場合のモナドのカテゴリー理論の概念がCSの定義とどのように一致するかを理解したいと思います。

4
なぜ複数の戻り値が一般的ではないのですか?
複数の戻り値について質問したいのですが、なぜこの構造がプログラミング言語で好まれないのですか(概念的および/または技術的な問題)。スタックフレームについて何か聞いたことがあります。また、戻り値と変数の戻り値のためにメモリを予約することで、これが問題になる可能性があります。 接触型言語(FORTHなど)では、関数からの複数の戻り値を持つことは一般的で非常に便利なものであり、java / cのような言語でこのようなものも役立つと思います(非常に基本的な例)。 x, y = multRet(5); multret(int x) { return x+1; return x+2; exit; } 明確にするために:私は複数の値を返す方法を尋ねていません(これは既知の回答を持つ既知の質問です)が、この習慣がプログラミング言語では一般的ではない理由を明確にしたいと思います。

1
オブジェクト指向言語用のタグなしのガベージコレクション
私は自分の言語に適したガベージコレクション手法を探していて、このペーパーを見つけました。ベンジャミンゴールドバーグは、厳密に型指定された言語のガベージコレクション手法について説明しているため、実行時の型情報の必要性がありません。 簡単に言えば、これは、コンパイルされたコードに直接、関数呼び出しの直後にガベージコレクション関数へのポインターを置くことによって行われます。次に、これを拡張して、MLのようなパラメトリック多態性をサポートします。 今私の質問:このテクニックをオブジェクト指向言語でどのように実装できるかについての作業はありましたか?仮想テーブルのポインタを使用した間接呼び出しを通じて多くの機能が実装されていますか?

1
REGEXPはプログラミング言語でどのように実装されていますか?
変数の有無にかかわらず、パターンマッチング用のプログラミング言語でのREGEXPの解釈またはコンパイルに関する優れた一般的な論文はありますか?私はDFAの構築について簡単な説明を求めているのではなく、プログラミング言語の実装で実際にそれがどのように行われるか、そして単純または難しいと考えられるものについての実際の論文を求めています。言語間の違いに影響があると思います。REGEXPの実装方法に関する正式な論文も役に立ちます:-)

1
一般的なプログラミング言語は、チューリングが完全でないことにどれほど近いですか?
「完全性のチューリング」という用語は、私が受けたいくつかのコンピュータサイエンスのクラスで議論されています。しかし、チューリングの完全性が実際に必要とするものを直感的に感じることはありません。私はこの質問を見つけましたが、答えは私が探しているものよりも少し数学的です。 C ++、Python、Java、Lispなどの一般的なプログラミング言語を取り上げます。これらの言語はチューリング完全ではないのですか?これらの言語には、削除するとチューリング言語が完全ではなくなる基本的な機能がありますか?または、言語のプロパティを変更して(たとえば、何かをランダムにする)、それを行うことにより、言語を完全なチューリングでなくすることができますか?

2
配列の最小限の説明を見つける方法は?
次の配列は、メモリ内の10000スロットを占有します。 a = [0,1,2,3,4,5,6,7,8,9,10,...,10000] しかし、同じ配列を次のように簡単に表すことができます。 a = {len:10000, get: λ idx -> idx} はるかにコンパクトです。同様に、コンパクトに表現できる配列がいくつかあります。 a = {a:1000, get: λ idx -> idx * 2} Is a description for [0,2,4,6,8,10,...,2000] a = {a:1000, get λ idx -> idx ^ 2} Is a description for [0,1,2,4,9,...1000000] And so on... 非常に多くの配列を提供すると、各要素をメモリに格納するよりもはるかに短い方法で表現できます。 この現象に名前はありますか? 特定の配列の最小表現を見つける方法はありますか? …

1
C言語の構文はCFGによって完全に定義されていますか?
質問はそれだけで十分だと思います。C言語の構文は、コンテキストフリーの文法によって完全に定義されていますか、それとも、解析中に非コンテキストフリーの定義を必要とする可能性のある言語構成体がありますか? 非CFL構成の例として、使用前の変数の宣言を考えました。しかし、コンパイラ(Aho Ullman Sethi)では、C言語は名前に基づいて識別子を区別しないと述べられています。すべての識別子は、字句解析器によって「id」としてトークン化されます。CがCFGによって完全に定義されていない場合、誰でもCの非CFL構成の例を挙げていただけますか?

1
構造化プログラムの定理を証明する方法は?
ウィキペディア: 構造化プログラムの定理[...]は、[...]アルゴリズムは3つの制御構造のみを使用して表現できると述べています。彼らです 1つのサブプログラムを実行してから、別のサブプログラム(シーケンス)を実行する ブール式(選択)の値に従って2つのサブプログラムの1つを実行する ブール式が真になるまでサブプログラムを実行する(反復) この定理は、次の論文で開発されました。 C.ベーム、「チューリングマシンと関連プログラミング言語のファミリーについて」、ICC Bull。、3、185〜194、1964年7月。 C.ベーム、G。ヤコピニ、「流れ図、チューリングマシン、および2つの形成ルールのみを持つ言語」、Comm。ACMの9(5):366–371,1966。 残念ながら、1つ目は実際には利用できず、2つ目は(少なくとも私にとって)少し不可解であることに加えて、1つ目を参照しているため、証明を理解するのに問題があります。誰か助けてもらえますか?証拠を提示する現代の紙や本はありますか?ありがとう。 更新 正確には、CACMペーパーの第2部(セクション3)を理解したいと思います。著者はセクション1で次のように書いています。 論文の2番目の部分(C.Böhm著)では、以前の論文のいくつかの結果が報告されており[8]、次にこの論文の最初の部分の結果を使用して、すべてのチューリングマシンが決定的な感覚は、構成と反復のみを形成規則として認める言語で書かれたプログラムと同等です。 ここで[8]は利用できないICC Bulletinペーパーを指します。ウィキペディアからの上記の引用がCACM論文のこの2番目の部分を参照していることは容易に理解できます(チューリングマシンはアルゴリズムの正確な定義として機能します。「構成」はシーケンスを意味します。反復により選択を置き換えることができます)。

5
プログラミング言語とチューリングマシンの正確な関係は何ですか?
yacc、bison、flex、lexについてよく知らないので、間違っている場合は修正してください。ただし、プログラミング言語もTuringマシンであり、Turingマシンはタプル where、、、 as input、は遷移関数として、 =左へのステップ数、 =右へのステップ数、 = "スタンバイ"、は初期状態、(Q,Γ,b,Σ,δ,q0,F)(Q,Γ,b,Σ,δ,q0,F)(Q, \Gamma, b, \Sigma, \delta, q_0, F)QQQΓΓ\Gammab∈Γb∈Γb \in \GammaΣ⊆Γ∖{b}Σ⊆Γ∖{b}\Sigma \subseteq \Gamma \smallsetminus \{ b \}δ:Q×Γ→Q×Γ×{L,R,N}δ:Q×Γ→Q×Γ×{L,R,N}\delta: Q \times \Gamma \rightarrow Q \times \Gamma \times \{ L, R, N \}LLLRRRNNNq0∈Qq0∈Qq_0 \in QF⊆QF⊆QF \subseteq Q 終了状態のセットです。 プログラミング言語の実装は、チューリングマシンの実装とどの程度似ていますか?上記のようなチューリングマシンが定義されたことでプログラミング言語が実装されたときに何が行われると言えるのでしょうか?もしそうなら、プログラミング言語が定義されているときに、チューリングマシンの定義のように見えるモデルを使用できないのはなぜですか?代わりに、BNFのような何かが標準のようです。

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