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

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


3
段階的な機能とは(概念的に)
最近のCACMの記事[1]で、著者は段階的な機能の実装を提示しています。彼らはそれがよく知られているかのようにこの用語を使用し、どの参考文献も明らかな紹介のようには見えません。 彼らは簡単な説明をします(強調鉱山と参照番号が変更されました;オリジナルでは22です) プログラム生成のコンテキストでは、Taha and Sheard [2] によって確立されたマルチステージプログラミング(MSP、略してステージング)により、プログラマーはプログラム式の評価を後のステージに明示的に遅らせることができます(したがって、式のステージング)。現在のステージは、次のステージのプログラムを構成(および場合によっては実行)するコードジェネレーターとして効果的に機能します。 ただし、Taha and Sheardは次のように書いています(強調強調): マルチステージプログラムは、コードの生成、コンパイル、実行をすべて含むプロセスであり、すべて同じプロセス内にあります。多段階言語は多段階プログラムを表現します。ステージング、したがってマルチステージプログラミングは、実行時の解釈オーバーヘッドを払わない汎用ソリューションの必要性に対処します。 彼らはさらに、ステージングが効果的であることを示す古い作品へのいくつかの参照に進み、それは概念がさらに古いことを示唆しています。彼らは用語自体の参照を与えません。 これらの記述は、矛盾していないにしても、直交しているように見えます。RompfとOderskyが書いたものは、TahaとSheardが提案したものの応用かもしれませんが、それは同じことに関する別の視点かもしれません。彼らは重要な点は、実行時にプログラムが自分自身の一部を(再)作成することであることに同意しているようですが、それが必要な能力であるか、十分な能力であるかはわかりません。 それでは、このコンテキストでのステージングの解釈は、それぞれステージングとは何ですか?この用語はどこから来たのですか? 軽量モジュラーステージング: T. RompfおよびM. Oderskyによるランタイムコード生成およびコンパイル済みDSLへの実用的なアプローチ(2012) W. TahaおよびT. Sheardによる明示的な注釈付きのMetaMLおよびマルチステージプログラミング(2000)

3
SMLのファンクターとカテゴリー理論の関係は何ですか?
この答えでのアンドレイ・バウアーのこの声明と同じ考え方に沿って Haskellコミュニティは、カテゴリ理論に触発されたいくつかの手法を開発しました。モナドは最もよく知られていますが、モナドと混同しないでください。 SMLのファンクターとカテゴリー理論のファンクターの関係は何ですか? HaskellやOCamlなどの他の言語のファンクターの詳細については知らないので、価値のある情報がある場合は、他の言語のセクションも追加してください。

2
プログラミング言語の基礎として一般的な再帰関数を使用していますか?
これはナイーブであり、したがって、おそらく不正な形式の質問なので、事前に謝罪します! 私の見解では、チューリングマシンは手続き型/命令型プログラミング言語の計算基盤と見なすことができます。同様に、ラムダ計算は関数型プログラミング言語の基盤です。 私は最近、チャーチ・チューリング・テーゼが計算の第3のモデルである一般的な再帰関数と相互等価性を示していることを学びました。これを計算のモデルとして使用するプログラミング言語はありますか?そうでない場合、技術的な理由があります。すなわち、「誰もまだ試していません」以外に?

8
すべての表現が意味をなすプログラミング言語
推奨に従って、私はこれをStack Overflowから再投稿しています。 最近、次の問題を考えています。 標準の「Hello world!」のコードを検討してください。プログラム: main() { printf("Hello World"); } これで、このコードのほとんどすべての変更は完全に役に立たなくなり、実際、ほとんどすべての変更はコードのコンパイルを妨げます。例えば: main(5 { printf("Hello World"); } さて、実際の質問に。シンボルのあらゆる可能な組み合わせ、つまりすべての表現が意味をなすプログラミング言語はありますか?私はある種の解決策について考えてみましたが、2つ考えました 限られた数の変数を持つPostfix。基本的に、コードを記述する前にすべての変数が既に定義されているので、それらを操作する必要があります。理論的には、多くの単純なプログラムのチェーンを形成して、それぞれが他の人に結果を供給することにより、任意の数の操作を実行できます。コードは、後置記法の一連の文字として書くことができます。 変数のスタックを持つ「Postfix」。変数はスタックに保存されます。すべての操作は、上から2つの変数を取り、その場所に結果を置きます。プログラムは、最後の操作または変数に到達すると終了します。 個人的に私はこれらの両方が嫌いです。それらは限られているだけでなく、優雅でもありません。これらは回避策のような実際のソリューションではなく、本質的に外部プロセスへの一部の作業の「オフショアリング」です。 この問題を解決する方法は他にありますか?

10
すべてのコンピューターに対応したユニバーサルアセンブリ言語は可能ですか?
アセンブリ言語についていくつか質問をしたいと思います。私の理解では、機械語に非常に近いため、より高速で効率的になります。 さまざまなコンピューターアーキテクチャが存在するため、異なるアーキテクチャ向けにアセンブリで異なるコードを記述する必要がありますか?もしそうなら、なぜAssemblyではない、一度書く-どこでも言語の種類を実行する?単純に汎用化するのは簡単ではないので、一度書くだけで、さまざまな構成のほぼすべてのマシンで実行できますか?(それは不可能だと思いますが、具体的で詳細な答えが欲しいです) Cが私が探している言語だと言う人もいるかもしれません。私は以前にCを使用したことはありませんが、おそらくJavaよりも高速かもしれませんが、Cはまだ高レベル言語だと思います。私はここで間違っているかもしれません。

4
ガベージコレクターはどのようにスタックオーバーフローを回避しますか?
それで、ガベージコレクターがどのように機能するかを考えていて、興味深い問題を考えました。おそらく、ガベージコレクターはすべての構造を同じ方法で走査する必要があります。彼らは、リンクリストやバランスの取れたツリーなどを横断している天気を知ることができません。また、検索でメモリを使い果たすこともできません。1つの可能な方法、およびALL構造をトラバースする唯一の方法は、バイナリツリーの場合と同じようにすべて再帰的にトラバースすることです。ただし、これにより、リンクリストまたは単にバランスの悪いバイナリツリーでスタックオーバーフローが発生します。しかし、私が今まで使用したガベージコレクション言語はすべて、このようなケースに対処するのに問題がないようです。 ドラゴンブックでは、「スキャンされていない」種類のキューを使用しています。基本的に、構造を再帰的にトラバースするのではなく、キューとしてマークする必要があるものを追加し、最後にマークされていないものごとに削除します。しかし、このキューは非常に大きくなりませんか? それでは、ガベージコレクタはどのように任意の構造をトラバースしますか?このトラバーサル技術はどのようにオーバーフローを回避しますか?

3
型システムの分類(強い/弱い、動的/静的)
要するに、型システムは学術的文脈でどのように分類されるのか。特に、異なる種類の型システム間の区別を明確にする信頼できるソースをどこで見つけることができますか? ある意味で、この質問の難しさは、答えを見つけることができないということではなく、むしろあまりにも多く見つけることができ、どれも正しいと際立っていないことです。背景は、Haskell wikiのタイピングに関する記事を改善しようとしていることです。現在、次の区別を主張しています: 型なし:言語には型の概念がない、または型付きの観点から:言語には型が1つだけあります。アセンブリ言語のタイプは「ビットパターン」のみ、RexxとTkのタイプは「テキスト」のみ、コアMatLabのタイプは「複素数値行列」のみです。 弱い型付け:識別型はほとんどなく、いくつかの型の同義語もあります。たとえば、Cはブール値、整数、文字、ビットセット、および列挙に整数を使用します。 強い型付け:Ada、Wirthian言語(Pascal、Modula-2)、Eiffelのようなきめ細かい型のセット これは、私の個人的な認識とはまったく反対です。 弱い型付け:オブジェクトには型がありますが、コンテキストが要求すると、暗黙的に他の型に変換されます。たとえば、Perl、PHP、およびJavaScriptはすべて、"1"、多かれ少なかれ可能なコンテキストで使用できる1です。 強い型付け:オブジェクトには型があり、暗黙的な変換はありません(ただし、シミュレートするためにオーバーロードが使用される場合があります)ので、間違ったコンテキストでオブジェクトを使用するとエラーになります。Pythonでは、文字列または浮動小数点で配列のインデックスを作成すると、TypeError例外がスローされます。Haskellでは、コンパイル時に失敗します。 私は、私よりもこの分野で経験のある他の人々にこのことについて意見を求めました。 弱いタイピング:データに対する無効な操作の実行は制御または拒否されませんが、無効/任意の結果を生成するだけです。 厳密な型指定:データの操作は、データが操作と互換性がある場合にのみ許可されます。 私が理解するように、最初と最後の特性化はCを弱く型付けし、2番目はCを強く型付けしたと呼びます。最初と2番目は弱い型のPerlとPHPを呼び出し、3番目は強い型のPerlとPHPを呼び出します。3つすべてがPythonを厳密に型指定されていると説明します。 ほとんどの人は「まあ、コンセンサスはなく、用語の受け入れられた意味はない」と言うだろうと思う。それらの人々が間違っている場合、私はそれについて聞いてうれしいですが、彼らが正しい場合、どのようにか CSの研究者が説明し、タイプのシステムを比較しますか?問題の少ない用語を使用できますか? 関連する質問として、私は動的/静的な区別が「コンパイル時間」と「実行時間」の観点からしばしば与えられると感じます。言語がコンパイルされるかどうかはその言語の特性ではないので不満足だと思いますその実装として。動的タイピングと静的タイピングの純粋に意味論的な記述があるべきだと思います。「静的言語とは、すべての部分式を入力できるもの」の行に沿ったものです。この概念を明確にする考え、特に参考文献をいただければ幸いです。

1
チューリング完全性にはdo-whileループで十分ですか?
命令型プログラミング言語では、言語をチューリング完全にするための制御フロー構造としてwhile-doループで十分であることを知っています(制御フローに関する限り-もちろん、無制限のメモリと特定の演算子も必要です...) 。私の質問の要点は、do-whileループはwhile-doループと同じ計算能力を持っていますか?言い換えれば、命令を完全にスキップすることが不可能な場合、言語をチューリング完全にすることができます。 ここでのセマンティクスの一部は少し曖昧かもしれないことを理解しているので、具体的な例で実際の質問を言いましょう。 Brainfuck(BF)は、Turingターピットであり、唯一の制御フローはwhile-doループです[...](Brainfuckに慣れていない場合に備えて、質問の下部に完全な言語仕様があります)。さんはどこ、*新しい言語BFを定義してみましょう,.+-<>BFと同じ意味を持っていますが、代わりに[]私たちが持ってい{}たdo-whileループを示しています。つまり、BFとの唯一の違いは、すべてのループが少なくとも1回実行されてから、さらに反復がスキップされることです。 BF *チューリング完全ですか?もしそうなら、BFをBF *に変換する方法に興味があります。そうでない場合、どうすればそれを証明できますか? 私自身のいくつかの観察: すべてのBFプログラムをBF *に翻訳できるわけではありません。たとえば、BF *で値を読み取ったり印刷したりするプログラムを書くことは不可能です。プログラムが1つ以上の値を印刷する可能性がある場合、常に少なくとも1つを印刷します。ただし、BF *に変換できるBFのチューリング完全サブセットがある場合があります。 [f](最初の反復の効果をキャンセルしようとして)に(最初の反復の効果をキャンセルするために)単純に変換することはできません(a fのみで構成されるBrainfuckプログラム)。すべての計算可能な関数に計算可能な逆関数とb)がある場合でも、ループが必ずしも少ないとは限らないため、このステップを再帰的に適用しても、最初に終了することは保証されません。+-[]<>f-1{f}f-1f Brainfuck言語の簡単な概要を次に示します。Brainfuckは、各セルに最初はゼロのバイト値が含まれる無限テープで動作します。オーバーフローはラップアラウンドするため、255をインクリメントすると0になり、逆も同様です。言語は8つの命令で構成されています。 + Increment the current cell. - Decrement the current cell. > Move tape head to the right. < Move tape head to the left. , Input a character from STDIN into the current cell. . …

5
関数型言語のチューリングが完全なのはなぜですか?
主題に関する私の限られた理解はおそらく間違っていますが、これは私がこれまでのところ理解していることです: 関数型プログラミングは、Alonzo Churchが策定したLambda Calculusに基づいています。 命令型プログラミングは、教会の学生であるアランチューリングによって作成されたチューリングマシンモデルに基づいています。 ラムダ計算は、チューリングマシンと同じくらい強力で 能力があります。つまり、計算能力は同等です。 関数型プログラミングがチューリングマシンではなくLambda Calculusに基づいている場合、なぜそれらの一部(またはすべて)がチューリング完全であると記述され、ラムダ完全などではないのですか?「チューリング完全性」という用語は、チューリングマシンにとって特別な意味がありますか、それとも単なる言葉ですか。 最後に、命令型言語がチューリングマシンに基づいており、コンピューターが基本的に無限メモリのないチューリングマシンである場合、現代のPCで機能するプログラミング言語よりもパフォーマンスが高いことを意味しますか? その場合、ラムダ計算機と同等のものは何でしょうか? これは3つの別個の質問のように見えますが、それらはすべて密接に関連しており、それぞれが最初の有効な質問である前の質問に依存しています。


7
Unix / Cの不整合と不完全性の例は何ですか?
リチャードガブリエルの有名なエッセイThe Rise of Worse is Betterは、MIT / Stanford(Lisp)とNew Jersey(C / Unix)デザインの似顔絵バージョンを、シンプルさ、正確さ、一貫性、完全性の軸に沿って比較しています。彼は、「PC敗者問題」(Josh Habermanが別の場所で議論した)の例を挙げて、Unixがインターフェースの単純さよりも実装の単純さを優先していると主張します。 私が思いついたもう1つの例は、数値へのさまざまなアプローチです。Lispは任意の大きな数値(メモリのサイズまで)を表現できますが、Cは数値を固定ビット数(通常は32〜64)に制限します。これは正しさの軸を示していると思います。 一貫性と完全性の例は何ですか?ガブリエルのすべての説明は次のとおりです(彼は似顔絵だと認めています)。 MIT /スタンフォードのアプローチ シンプルさ-設計は、実装とインターフェースの両方においてシンプルでなければなりません。インターフェイスは実装よりも単純であることが重要です。 正確性-設計は、観察可能なすべての側面において正しいものでなければなりません。不正確さは単に許可されません。 一貫性-設計は一貫していてはいけません。一貫性を保つために、デザインの単純さや完成度を少し下げることができます。一貫性は正確さと同じくらい重要です。 完全性-設計は、実用的な限り多くの重要な状況をカバーする必要があります。合理的に予想されるすべてのケースをカバーする必要があります。シンプルさは、完全性を過度に低下させることは許されません。 ニュージャージーのアプローチ シンプルさ-設計は実装とインターフェースの両方でシンプルでなければなりません。実装がインターフェースよりも単純であることがより重要です。シンプルさは、設計において最も重要な考慮事項です。 正確性-設計は、観察可能なすべての側面において正しいものでなければなりません。正しいよりも単純である方がわずかに優れています。 一貫性-設計が過度に一貫していてはなりません。場合によっては一貫性を犠牲にして単純化することもできますが、実装の複雑さや不整合を導入するよりも、あまり一般的ではない状況に対処する設計の部分を削除する方が適切です。 完全性-設計は、実用的な限り多くの重要な状況をカバーする必要があります。合理的に予想されるすべてのケースをカバーする必要があります。他の品質を優先して、完全性を犠牲にすることができます。実際、実装の単純さが危険にさらされるたびに、完全性が犠牲になります。シンプルさを維持する場合、完全性を達成するために一貫性を犠牲にすることができます。特に価値がないのは、インターフェースの一貫性です。 Gabrielが正しいかどうかを尋ねているのではないことに注意してください(これはStackExchangeには不適切な質問です)。

3
2つのシミュレーションがバイシミュレーションではない場合
ラベル付き遷移システム 与えられた(S,Λ,→)(S,Λ,→)(S,\Lambda,\to)場合、SSSは状態のセット、はラベルのセット、は三項関係です。いつものように、書き込みため→ ⊆ S × Λ × S P α → Q (P 、α 、Q )∈ →ΛΛ\Lambda→⊆S×Λ×S→⊆S×Λ×S\to\subseteq S\times\Lambda\times Sp→αqp→αqp \stackrel\alpha\rightarrow q(p,α,q)∈→(p,α,q)∈→(p,\alpha,q)\in\to。ラベルされた移行p→αqp→αqp\stackrel\alpha\to q状態でシステムという意味pppに状態が変化するqqqラベルとαα\alphaということを意味し、αα\alpha状態の変化を引き起こすいくつかの観察可能なアクションです。 今、関係R⊆S×SR⊆S×SR \subseteq S \times S呼び出されたシミュレーション IFF ∀(p,q)∈R, if p→αp′ then ∃q′,q→αq′ and (p′,q′)∈R.∀(p,q)∈R, if p→αp′ then ∃q′,q→αq′ and (p′,q′)∈R. \forall (p,q)\in R, \text{ if } p \stackrel\alpha\rightarrow p' …

3
タイプ 'a->' bのML関数
私たちの教授は、型を持つOCamlの関数を考えるように頼みました。 'a -> 'b つまり、何でもかまいませんが、異なるものを返すことができる1つの引数の関数です。 raise引数を無視する関数で使用することを考えました: let f x = raise Exit しかし、教授は、標準ライブラリの機能を必要としないソリューションがあると述べました。私は混乱'bしています。最初に持っていない場合、どうやって作ることができますか? 何が起こっているのかを理解したいので、スタックオーバーフローではなくここで質問しています。説明のないプログラムを見たくありません。

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の機能がそのように機能するためクールです」と答えがあります。

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