タグ付けされた質問 「language-design」

7
ガベージコレクションされた言語のオブジェクトデストラクターパラダイムがなぜ普及しないのですか?
ガベージコレクションされた言語設計に関する決定についての洞察を探しています。おそらく、言語の専門家が私を啓発できるでしょうか?私はC ++のバックグラウンドを持っているので、この領域は私を困惑させます。 Ruby、Javascript / ES6 / ES7、Actionscript、LuaなどのOOPyオブジェクトをサポートするほとんどすべてのガベージコレクション言語は、デストラクタ/ファイナライズパラダイムを完全に省略しているようです。Pythonは、そのclass __del__()メソッドを持つ唯一のものであるようです。どうしてこれなの?オブジェクトのデストラクタ/ファイナライズメソッドの効果的な実装を妨げる自動ガベージコレクションを使用する言語には、機能的/理論的な制限がありますか? これらの言語がメモリを管理する価値のある唯一のリソースと見なしていることは非常に欠けていると思います。ソケット、ファイルハンドル、アプリケーションの状態はどうですか?オブジェクトファイナライズの非メモリリソースと状態をクリーンアップするカスタムロジックを実装する機能がない場合、アプリケーションにカスタムmyObject.destroy()スタイルの呼び出しを散らかし、クリーンアップロジックを「クラス」の外に配置し、カプセル化を中断し、 gcによって自動的に処理されるのではなく、人的エラーによるリソースリークへのアプリケーション。 これらの言語がオブジェクト破棄のカスタムロジックを実行する方法を持たないことにつながる言語設計の決定は何ですか?正当な理由があると想像しなければなりません。これらの言語がオブジェクトの破壊/最終化をサポートしなくなった技術的および理論的な決定をよりよく理解したいと思います。 更新: おそらく私の質問を表現するより良い方法: なぜ言語には、カスタムインスタンス化(コンストラクター)とともにクラスまたはクラスに似た構造を持つオブジェクトインスタンスの組み込みコンセプトがありますが、完全に破棄/ファイナライズ機能を省略しますか?自動ガベージコレクションを提供する言語は、オブジェクトが使用されなくなったときに100%の確実性でわかるように、オブジェクトの破壊/最終化をサポートする主要な候補のようです。しかし、これらの言語のほとんどはサポートしていません。 私は、デストラクタが呼び出されることは決してないだろうとは思わない。それは、gcsが回避するように設計されているコアメモリリークだからだ。デストラクタ/ファイナライザは、将来の不確定な時間まで呼び出されないかもしれないが、JavaまたはPythonが機能をサポートするのを止めなかったという議論を見ることができました。 オブジェクトのファイナライズをサポートしない理由は、言語設計の中核となる理由は何ですか?

3
ビジュアルプログラミングツール、なぜASTと直接連携しないのですか?
Blocklyや友人などのオープンソースのビジュアルプログラミングツール、およびGithubでホストされている他のプロジェクトをいくつか見つけましたが、抽象構文ツリーで直接機能するものは見つかりませんでした。 何故ですか? 私が尋ねているのは、すべてのコンパイラがコンパイルプロセスにソースコードをASTに解析する段階があることを発見した後、いくつかの視覚的なプログラミングツールがこれを利用してプログラマに方法を与えることができることは明らかだったからですASTを視覚的な方法で直接編集し、ソースからノードグラフへのラウンドトリップを行い、必要に応じてソースに再び戻すこともできます。 たとえば、人は JavaScript AST Visualizerから実際のJavaSriptビジュアルプログラミングツールまで、それほど大きな違いはない。 だから、私は何が欠けていますか?

4
「null」と「Maybe」の両方の概念を持つことは意味がありますか?
C#でWeb APIのクライアントを作成しているときに、null2つの異なるものを表す値として問題が発生しました。 何もありません。たとえばfoo、bar 不明:デフォルトでは、API応答にはプロパティのサブセットのみが含まれます。必要な追加のプロパティを指定する必要があります。したがって、不明とは、プロパティがAPIからリクエストされなかったことを意味します。 Maybe(またはOption)タイプ、関数型言語での使用方法、およびユーザーに値の不在について考えさせることによりnull逆参照の問題を「解決」する方法について調べたところ、次のことがわかりました。しかし、私が遭遇したすべてのリソースはnullをMaybeで置き換えることについて話しました。私は3値的論理についての言及をいくつか見つけましたが、私はそれを完全には理解していません。ほとんどの場合、その言及は「それは悪いこと」の文脈で行われていました。 nullとMaybeの両方の概念を持ち、それぞれ未知数と何も表現しないことが理にかなっているのではないかと思っています。これは私が読んだ3値論理ですか、それとも別の名前ですか?または、多分多分に多分をネストするための意図された方法ですか?

3
タイプを推測することによる自動ダウンキャスト
Javaでは、変数をダウンキャストするために明示的にキャストする必要があります public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String args[]) { // An implicit upcast Fruit parent = new Apple(); // An explicit downcast to Apple Apple child = (Apple)parent; } javaが型推論を行わないという事実を除いて、この要件には何らかの理由がありますか? 新しい言語で自動ダウンキャストを実装する際の「落とし穴」はありますか? 例えば: Apple child = parent; // no …



2
正確なGCがライブラリとして実装可能な言語はどのようなものでしょうか。
手動のメモリ管理を備えたプログラミング言語があるとします。正確なガベージコレクションを、基本的な言語構成要素としてではなく、ライブラリとして実装できるようにするために、この言語にはどのような機能が必要ですか? 正確なGCとは、ヒープへのポインタのみがトラバースされ、どの変数が有効であるかどうかを確認することを意味します。 その他の考慮事項: CとC ++にはBoehmガベージコレクターがありますが、正確なGCではないため、これはカウントしません。Boehmコレクターは、スタック上でポインターである可能性のあるものはすべて、純粋にメモリー調整要件に基づいているものをポインターであると想定しています。たとえば、ポインタは4バイト境界で整列する必要があるため、ポインタのようにビットレベルkで(k % 4) == 0見える整数。 カササギは、正確なガベージコレクターを使用するように既存のCコードを変換します。生成されたCコードには、ガベージコレクション用の多くのスタブがあります。つまり、コレクターを使用してスタックポインターをヒープに登録するためのものです。誰もそのようにコードを書くことは期待できないので、私はこれを数えません。これは、他の言語のコンパイルターゲットの詳細です。 そのような言語には次のものが必要だと思います。 マクロまたは何らかの形のメタプログラミング。GCルートの登録などを行うために必要なすべての追加コードをカプセル化します。 構造体または共用体を検査できる反射メカニズム。どのメンバーがポインターであるかを判別する必要があります。 スタックフレームのレイアウトを確認できる反射メカニズム。これは2よりもはるかに難しいようです。 これが漠然としたり、意見に基づくものではないことを願っていますが、しばらくの間、それについて疑問に思っていました。

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