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

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

4
多形型 `forall t:Type、t-> t`をもつ関数が恒等関数でなければならないのはなぜですか?
プログラミング言語理論は初めてです。私は、インストラクターがポリモーフィック型の関数がforall t: Type, t->tアイデンティティであると主張するオンライン講義をいくつか見ていましたが、その理由は説明しませんでした。誰かが私に理由を説明できますか?第一原理からの主張の証拠かもしれません。

3
例外階層の理論はありますか?
私は、何らかの方法で例外を持っている多数のプログラミング言語に精通していますが、2つの「病的な」傾向を目の当たりにしました。 例外の一般的なパターンや階層はないようです。基本的にすべての言語は独自のバージョンをロールし、例外が標準になった場合、標準で見つかる例外の種類はかなりarbitrary意的です(ほとんどの場合、ソースコードの読み取りなど、言語ツールの作成中に実装された例外デバッガーを起動するための文字列または例外、またはファイルが見つからない場合に発生する例外など) 言語で定義された例外がユーザープログラムで再利用されることはほとんどありません。通常、1つまたは2つの一般的な例外があります(たとえば、「実装しない」)。ほとんどの場合、プログラマは独自の例外を作成します。(たとえば、これを新しい数値型または新しいコレクション型の作成と比較してください)。 これは私にとってひどい省略のようです。ユーザープログラムでどのような種類のエラーが必要になるのか、誰も知りません。私は、数値型、コレクション、オブジェクトシステムなどに似た一種の素晴らしい階層が存在することを望んでいました。 さらに悪いことに、GoolgeとWikipediaはこの問題に関してほとんど助けを提供していません。これまでのところ、機能の例外に関する論文を見つけただけです。 このペーパーでは、遅延関数型プログラミングは組み込みの例外処理メカニズムを不要にするだけでなく、例外を使用するプログラムを開発および変換するための強力なツールを提供すると主張します。 (例外の機能理論、Mike Spivey、1988) しかし、例外は良いと思います。例外を使用するプログラムを変換したくはありません。逆に、例外の使用を無秩序にしたいのです。 質問: 例外の理論はありますか?もしそうなら、それは何と呼ばれていますか?基礎となるものは、もしあれば、その基礎となるものは何ですか?

3
機能しない設定でのクロージャーの実装の問題
プログラミング言語では、クロージャは人気があり、しばしば望まれる機能です。ウィキペディアによると(強調鉱山): コンピューターサイエンスでは、クロージャー(...)は、その関数の非ローカル変数の参照環境と一緒の関数です。クロージャを使用すると、関数は直接のレキシカルスコープ外の変数にアクセスできます。 そのため、クロージャーは本質的に(匿名?)関数値であり、それ自身のスコープ外の変数を使用できます。私の経験では、これは、定義ポイントでスコープ内にある変数にアクセスできることを意味します。 ただし、実際には、少なくとも関数型プログラミング以外では、概念は異なるようです。異なる言語は異なるセマンティクスを実装しており、意見の対立さえあるようです。多くのプログラマーは、クロージャーが何であるかを知らないようで、それらを匿名関数にすぎないと見なしています。 また、クロージャを実装するときに大きなハードルが存在するようです。最も注目すべきは、Java 7にはそれらが含まれているはずでしたが、この機能は将来のリリースにプッシュバックされたことです。 閉鎖がなぜ理解するのが難しいのか、理解するのが難しいのはなぜですか?これはあまりにも広範で曖昧な質問なので、これらの相互接続された質問にさらに焦点を当てましょう。 一般的なセマンティック形式(小さなステップ、大きなステップなど)でクロージャを表現する際に問題はありますか? 既存の型システムは閉鎖に適しておらず、簡単に拡張できませんか? クロージャを従来のスタックベースのプロシージャ変換に合わせるのは問題ですか? 質問は主に手続き型、オブジェクト指向、およびスクリプト言語全般に関連していることに注意してください。私の知る限り、関数型言語には問題はありません。

8
OOPは実際に手続き型プログラミングのどのような問題を解決しますか?
私は本「C ++ Demystified」を研究しました。今、私はRobert Laforeによる「Turbo C ++のオブジェクト指向プログラミング初版(第1版)」を読み始めました。これらの本を超えるプログラミングの知識はありません。この本は20年前のものなので、時代遅れかもしれません。私は最新版を持っています、私はそれが好きなので古いものを使用しています。主に、ラフォーの本の初版を通してC ++で使用されるOOPの基本概念を研究しています。 Laforeの本は、「OOP」が大きくて複雑なプログラムにのみ役立つことを強調しています。すべてのOOP本(同じくLaforeの本)で、手続き型のパラダイムはエラーを起こしやすいと言われています。たとえば、グローバルデータは関数によって簡単に脆弱です。プログラマーは、誤ってデータを破壊する関数を作成するなど、手続き型言語で正直なエラーを犯す可能性があると言われています。 正直に言って、この本に記載されている説明を把握していないため、質問を投稿しています。C++(4版)のオブジェクト指向プログラミングラフォーの本に書かれたこれらのステートメントを把握していません。 オブジェクト指向プログラミングは、プログラミングへの以前のアプローチで制限が発見されたために開発されました....プログラムがますます大きく複雑になるにつれて、構造化プログラミングアプローチでさえ緊張の兆候を示し始めます... ....これらの失敗は、手続き型パラダイム自体に弱点があることを明らかにしています。構造化プログラミングのアプローチがどれほどうまく実装されていても、大規模なプログラムは過度に複雑になります。...関連する2つの問題があります。まず、関数はグローバルデータに無制限にアクセスできます。第二に、手続き型パラダイムの基礎である無関係な関数とデータは、現実世界の貧弱なモデルを提供します... 私はジェフ・ケントによる「dysmystified C ++」という本を研究しました。この本がとても好きで、この本では主に手続き型プログラミングが説明されています。手続き型(構造化)プログラミングが弱い理由がわかりません! Laforeの本は、いくつかの良い例を使って概念を非常にうまく説明しています。また、OOPは手続き型プログラミングよりも優れているというLaforeの本を読んで、直感を理解しましたが、実際には手続き型プログラミングがOOPよりも弱いことを知りたいと思います。 手続き型プログラミングで直面する実際的な問題とは何か、OOPがプログラミングを容易にする方法を自分で確認したいと思います。私はLaforeの本を黙想的に読むだけで答えが得られると思いますが、手続き型コードの問題を自分の目で見たいです。プログラムのOOPスタイルのコードが、同じプログラムが手続き型パラダイムを使用して記述されていました。 OOPには多くの機能があり、これらのすべての機能が手続き型のコードを記述することによって発生する前述のエラーをどのように除去するかを説明することは不可能だと理解しています。 だから、ここに私の質問があります: OOPは手続き型プログラミングのどの制限に対処し、実際にこれらの制限を効果的に削除するのですか? 特に、手続き型パラダイムを使用して設計するのは難しいが、OOPを使用して簡単に設計するプログラムの例はありますか? PS:https : //stackoverflow.com/q/22510004/3429430からクロス投稿

2
スコット連続関数:代替定義
私はこのプロパティに本当に苦労しています: ましょであり、コヒーレンススペースと単調関数です。は、が有向集合であるようなすべての場合にのみ連続です。X,YX,YX,Yf:Cl(X)→Cl(Y)f:Cl(X)→Cl(Y)f: Cl(X) \rightarrow Cl(Y)ffff(⋃x∈Dx)=⋃x∈Df(x)f(⋃x∈Dx)=⋃x∈Df(x)f(\bigcup_{x\in D} x)=\bigcup_{x \in D}f(x)D⊆Cl(X)D⊆Cl(X)D \subseteq Cl(X)DDD したがって、有向集合は次のように定義されます POSET は、などの有向集合でやです。はクリークを表します:コヒーレント。D⊆D⊆D \subseteq ∀x,x′∈D∀x,x′∈D \forall x, x' \in D ∃z∈D∃z∈D \exists z \in D x⊆zx⊆z x \subseteq zx′⊆zx′⊆zx' \subseteq z Cl(X)Cl(X)Cl(X) {x⊆|X|∣a,b∈x⇒a{x⊆|X|∣a,b∈x⇒a\{x \subseteq |X| \mid a,b \in x \Rightarrow ab}b}b \} 多くの本は、スコット連続関数の定義としてそれを与えていますが、残念ながら私の先生ではありません。彼はこの連続的な定義を与えました: f:Cl(X)→Cl(Y)f:Cl(X)→Cl(Y)f : Cl(X) \rightarrow Cl(Y)は、単調かつ場合、連続です。。 ここで、モノトーンは次のように定義されます …

3
言語をホモイコニックにする方法
この記事によると、次のLispコード行は「Hello world」を標準出力に出力します。 (format t "hello, world") ホモイコニック言語であるLispは、次の方法でコードをデータとして扱うことができます。 ここで、次のマクロを作成したと想像してください。 (defmacro backwards (expr) (reverse expr)) backwardsはマクロの名前で、式(リストとして表される)を取り、それを逆にします。もう一度、「Hello、world」で、今回はマクロを使用しています。 (backwards ("hello, world" t format)) Lispコンパイラはそのコード行を見ると、リストの最初のアトム(backwards)を見て、マクロに名前を付けていることに気付きます。未評価のリスト("hello, world" t format)をマクロに渡し、マクロはリストをに再配置します(format t "hello, world")。結果のリストはマクロ式を置き換え、実行時に評価されるものです。Lisp環境は、最初のアトム(format)が関数であることを確認し、評価して残りの引数を渡します。 Lispでは、コードがリスト(s-expressions?)として実装されているため、このタスクを達成するのは簡単です(間違っている場合は修正してください)。 次に、このOCaml(ホモイコニック言語ではない)スニペットを見てください。 let print () = let message = "Hello world" in print_endline message ;; OCamlにホモイコニシティを追加するとします。OCamlはLispと比べてはるかに複雑な構文を使用します。どうしますか?同種性を実現するために、言語は特に簡単な構文を持っている必要がありますか? 編集:このトピックから、Lispのものとは異なるホモイコニック性を達成する別の方法を見つけました:io言語で実装されたもの。この質問に部分的に答えるかもしれません。 ここでは、簡単なブロックから始めましょう。 Io> plus := block(a, b, a …

5
特定のタスク用に言語を「最適化」するのはなぜですか?
この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供します。十分な詳細のない回答は、編集または削除できます。 多くの場合、特定のタスクに特化したプログラミング言語があります。一部のプログラミング言語は、配列演算(マトリックスや多次元配列の使用など)に優れていますが、一部のプログラミング言語は、他の言語で再現するのが難しい高レベルの数学に優れています(それでもなお可能です)。 とにかくアセンブリに至るまで最も単純にコンパイルされることを考えると、ある言語は他の言語よりも特定のタスクまたは最終目標に対してそれを改善しますか? 私はチューリング完全な言語、チューリングと同等の言語について話している。

2
PROLOGチューリングを完全にするものは何ですか?
次のようなチューリングマシンをシミュレートするプログラムを作成することで、PROLOGがチューリング完全であることを証明できることを知っています。 turing(Tape0, Tape) :- perform(q0, [], Ls, Tape0, Rs), reverse(Ls, Ls1), append(Ls1, Rs, Tape). perform(qf, Ls, Ls, Rs, Rs) :- !. perform(Q0, Ls0, Ls, Rs0, Rs) :- symbol(Rs0, Sym, RsRest), once(rule(Q0, Sym, Q1, NewSym, Action)), action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), perform(Q1, Ls1, Ls, Rs1, Rs). symbol([], b, []). symbol([Sym|Rs], Sym, …

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 連結言語にはアプリケーションルールがないため、アプリケーションのルールは特にありません。 型は、リテラル、型変数、またはスタックからスタックへの関数のいずれかです。ここで、スタックは右ネストされたタプルとして定義されます。すべての関数は、「残りのスタック」に関して暗黙的にポリモーフィックです。 τρσ::=ι∣∣α∣∣ρ→ρ::=()∣∣τ×ρ::=τ∣∣∀α.στ::=ι|α|ρ→ρρ::=()|τ×ρσ::=τ|∀α.σ …

4
プログラムが言語のセマンティクスを拡張できるほど十分に順応性があるか
プログラマーがクラス(Stringなどのクラスを含む)を定義した後、いつでもクラスを拡張/オーバーライドできるようにするruby(およびjavascript)などの言語の機能を参照して、プログラムを後で拡張できる言語を設計することは理論的に実行可能ですか?そのセマンティクス。 例:Rubyは多重継承を許可していませんが、デフォルトの言語動作を拡張/オーバーライドして多重継承の実装を許可できます。 これを許可する他の言語はありますか?これは実際に言語設計者の関心事ですか?Webアプリケーション開発用のRailsフレームワークを構築するためにrubyを使用する選択肢を見ると、このような言語は非常に強力で、さまざまなアプリケーションのフレームワーク(またはDSL)を設計できます。

3
Haskellよりも強力なタイプシステムを持つ研究言語はどれですか?
ここで私はそれを読みました: Haskellには間違いなく最先端の型システムはありません(研究言語を数えたとしても近いものではありません)が、実稼働で実際に使用されるすべての言語のうちHaskellがおそらくトップです。 だから私は2つのことを求めています: どの研究言語がHaskellより強力な型システムを持っているか。 彼らは何を改善しますか。 私は単なるプログラマーなので、型理論で使用される多くの数学的なオブジェクトを知りません。できれば穏やかな説明を提供してください。


7
負の配列インデックスが意味をなすのはなぜですか?
私はCプログラミングの奇妙な経験に出会いました。次のコードを検討してください。 int main(){ int array1[6] = {0, 1, 2, 3, 4, 5}; int array2[6] = {6, 7, 8, 9, 10, 11}; printf("%d\n", array1[-1]); return 0; } これをコンパイルして実行しても、エラーや警告は表示されません。私の講師が言ったように、配列インデックス-1は別の変数にアクセスします。私はまだ混乱していますが、なぜプログラミング言語にはこの機能があるのですか?つまり、なぜ負の配列インデックスを許可するのですか?

3
微積分とプログラミング言語の違いは何ですか?
私は微積分学と呼ばれるものとプログラミング言語と呼ばれるものについてかなり混乱していると思います。 私は、微積分はプログラムの等価性について推論するための正式なシステムであると考える傾向があり、言われたかもしれません。プログラムには、マシンによって指定された操作上のセマンティクスがあります。このようにして、言語Lの(正しい)計算LLLは、プログラムの等価性の証明方法です。 これは私にとって合理的な分割のように思えますが、これは一般に受け入れられている意味ですか?それとも間違っているのでしょうか? 関連して、なぜいくつかの操作上のセマンティクスは非決定的です(コンフルエントであると仮定します)?戦略の選択を自由にしておくことから何が得られますか? これらについて明確に説明していただければ幸いです。さらに具体的なリファレンス!ありがとう!

2
参照要求:型システムに適用されるカテゴリ理論
プログラミング言語理論を真に理解するために、カテゴリー理論をどのように学ばなければならないかについて、私は聞き続けています。これまでのところ、カテゴリーの領域に足を踏み入れることなく、かなりのPLを学びました。しかし、私は自分が行方不明になっていたものを見るために飛躍する時だと思った。 残念ながら、私が見つけることのできるソースはどれも、型システムやプログラミングに接続しているようには見えません。彼らはそれがコンピューター科学者のためのカテゴリー理論への入門であると言うが、それから一般的な抽象的なナンセンス(私はこれを愛情を込めて言う)に変わります。 私の質問は実際には2つあると思います: カテゴリー理論はPLの「深い概念」を理解するために不可欠ですか? 型システムとプログラミングへの実用的なアプリケーションの観点からカテゴリー理論を説明するソースは何ですか? これまでのところ、私が得た最も遠いのは、ファンクターの漠然とした概念です(私が知る限り、これはMLのファンクターとは関係がないようです)。カテゴリ理論的な観点からモナドを理解するために頭の中に留めておかなければならない抽象化を恐れています。

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