問題タブ [language-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# で抽象静的メソッドを使用できないのはなぜですか?
私は最近、かなりの量のプロバイダーを扱ってきましたが、抽象静的メソッドを持つ抽象クラスが必要な興味深い状況に遭遇しました。このトピックに関するいくつかの投稿を読みましたが、それはある程度理にかなっていますが、明確な説明はありますか?
file-io - 多くの言語で「ファイルが存在する」メソッドがディレクトリに対して true を返すのはなぜですか?
私はそれが PHP でもできることを知っていますし、Java でもできると確信しています。私は最新バージョンの .NET を使用したことがないので、それらについては説明しません。非常に厄介なように思えますが、これには根本的な理由があるのではないかと考えていました。
.net - .NET 用の Side-by-Side コンパイラを作成する方法
Nikhil Kothari のScript#は、かなり長い間 JavaScript の分野で目にした中で最も驚くべき概念の 1 つです。この質問は JavaScript に関するものではなく、.NET ランタイムでの言語のコンパイルに関するものです。
私は、.NET プラットフォームを使用して、元のコンパイラが出力を生成できるようにしながら、元のコンパイラから別の出力を生成するコンパイラ (C# など) を既に持っている言語用のコンパイラを作成する方法にかなり興味を持っていました。他のコンパイラの出力も参照/使用している間、同じビルド操作中に同じソース。
正しい詳細を質問するのに十分なほどプロセスを理解しているかどうかは完全にはわかりませんが、Script# ドキュメントの図に従って、これが現在のプロセスの見方です。私は、このような概念を利用できる可能性のある複雑な言語設計とコンパイルを含む多くのことについて考えてきました。また、他の人がその概念についてどう考えているかに興味があります。
--
編集:これまでにコメントしていただきありがとうございます。あなたの情報は、それ自体が非常に興味深いものであり、もっと調査したいのですが、私の質問は、実際には、同じソースで同時に実行できる独自のコンパイラをどのように作成できるかについてですCLR を使用して、複数の異なるタイプの (潜在的に) 相互に依存する出力を生成します。Script# は、同じ C# ソースを使用して JavaScript とアセンブリを生成し、コンパイルされたアセンブリを JavaScript と連携させるため、例として役立ちます。この性質のものを設計する際に、さまざまなアプローチと理論的概念がどのようなものであるかに興味があります。
garbage-collection - gcなしでクロージャーを実装するには?
言語を設計しています。まず、生成するコードを決定します。この言語には、レキシカル クロージャと、javascript に似たプロトタイプ ベースの継承があります。しかし、私は gc のファンではないので、できる限り避けようとしています。質問: スタック フレームをヒープに割り当ててガベージ コレクターに任せずにクロージャーを実装するエレガントな方法はありますか?
私の最初の考え:
- 参照カウントを使用し、サイクルをガベージ コレクションします (これはあまり好きではありません)。
- スパゲッティ スタックを使用します (非常に非効率に見えます)。
- クロージャの形成を一部のコンテキストに制限して、リターン アドレス スタックとローカル スタックを回避できるようにします。
高級言語を使用したり、呼び出し規約に従ったりしないので、好きなだけスタックを粉砕できます。
(編集:参照カウントがガベージコレクションの一種であることは知っていますが、より一般的な意味でgcを使用しています)
c# - 「catch」または「finally」のスコープで「try」で変数が宣言されないのはなぜですか?
C# および Java (場合によっては他の言語も) では、"try" ブロックで宣言された変数は、対応する "catch" ブロックまたは "finally" ブロックのスコープ内にありません。たとえば、次のコードはコンパイルされません。
このコードでは、catch ブロック内の s への参照でコンパイル時エラーが発生します。これは、s が try ブロック内でのみスコープ内にあるためです。(Java では、コンパイル エラーは「s を解決できません」です。C# では、「名前 's' は現在のコンテキストに存在しません」です。)
この問題の一般的な解決策は、try ブロック内ではなく、try ブロックの直前に変数を宣言することです。
ただし、少なくとも私にとっては、(1) これは不格好な解決策のように感じられ、(2) プログラマーが意図したよりも大きなスコープを持つ変数が発生します (メソッドのコンテキストだけではなく、メソッドの残りの部分全体)。 try-catch-finally)。
私の質問は、この言語設計の決定 (Java、C#、および/または他の適用可能な言語) の背後にある理論的根拠は何ですか?
java - 静的型と動的型の両方をサポートするように Java を変更すると便利でしょうか?
Java が静的型と動的型の両方を許可するとどうなるでしょうか。これにより、両方の長所を活かすことができます。すなわち:
- それは可能でしょうか?
- それは有益でしょうか?
- 現在、両方をサポートしている言語はありますか? また、どの程度うまく機能していますか?
より良い例を次に示します (ジェネリックは使用できませんが、プログラムは型を知っています)。
language-agnostic - デフォルトで、言語が整数オーバーフローでエラーを発生させないのはなぜですか?
いくつかの最新のプログラミング言語 (C++、Java、および C# を含む) では、この言語では、実行時に整数オーバーフローが発生しても、エラー状態が発生することはありません。
たとえば、オーバーフロー/アンダーフローの可能性を考慮していない、この (考案された) C# メソッドについて考えてみましょう。(簡潔にするために、このメソッドは、指定されたリストが null 参照の場合も処理しません。)
このメソッドが次のように呼び出された場合:
sumList()
メソッドでオーバーフローが発生します( int
C# の型は 32 ビット符号付き整数であり、リスト内の値の合計が最大 32 ビット符号付き整数の値を超えるため)。sum 変数の値は -294967296 になります (4000000000 の値ではありません)。これはおそらく、sumList メソッドの (架空の) 開発者が意図したものではありません。
明らかに、開発者が整数オーバーフローの可能性を回避するために使用できるさまざまな手法があります。たとえば、Java の のような型を使用しBigInteger
たり、 C# でchecked
キーワードと/checked
コンパイラ スイッチを使用したりします。
しかし、私が興味を持っているのは、これらの言語が、たとえば、実行時に操作が実行されたときに例外を発生させて、オーバーフロー。このような動作は、オーバーフローが発生する可能性のある算術演算を実行するコードを記述する際に、開発者がオーバーフローの可能性を考慮することを怠った場合に、バグを回避するのに役立つようです。(これらの言語には、開発者がその動作を明示的に意図している場合に、例外が発生することなく整数オーバーフローの発生が許可されるブロックを指定できる「unchecked」キーワードのようなものが含まれていた可能性があります。C# には実際に this . )
答えは単純にパフォーマンスに帰着しますか?言語設計者は、該当するすべての算術演算で、オーバーフローが発生したかどうかを確認するためにランタイムが余分な作業を行う必要がある「遅い」算術整数演算をそれぞれの言語にデフォルトで設定することを望んでいませんでした。操作 - このパフォーマンスの考慮事項は、不注意なオーバーフローが発生した場合の「サイレント」障害を回避する価値を上回りましたか?
パフォーマンスの考慮事項以外に、この言語設計の決定にも他の理由はありますか?
html - XML ベースの GUI 言語に「必要な」機能は何ですか?
せっかちな人のためのまとめ:
私が知りたいのは、あなたが新しい GUI 言語で何をしたいのかということです。言及している短い回答について$your_favorite_one
; そのような言語は$your_favorite_one
. これらは役に立ちません。誘惑に抵抗します。
XHTML (または HTML。XML ではありませんが、非常によく似ています)、XUL、MXML などの XML ベースの言語の使いやすさについて考えています (このコンテキストでの「その他」とは、他の言語とその実装は元の言語に代わるものであり、これらの言語のみを名前で言及する目的は、私が話していることのアイデアを与えることであり、他の言語について言及する気はありません。いずれにせよ包括的なリストを作成しようとする点に注意してください。) そのような言語が持つべき機能について、私はいくつかの意見を持っています。
- 言語は「人間が書き込み可能」であるべきであり、平均的な開発者は、どのタグがどのプロパティを持ち、何が内部で許可されているかを常に参照することなく、かなりの量をコーディングできる必要があります。この点では、XHTML/HTML が最適です。
- 一般的なタスクには、組み込みのコントロールの適切なコレクションが必要です。ここでは、XHTML/HTML が最悪です。
- CSS のような言語でスタイルを設定できる必要があります (機能に関して)。構造と見栄えに関する懸念を簡単に分離できる必要があります。この結合された全体のレイアウト アルゴリズムは、単純で直感的でなければなりません。ヘルフロートがレイアウトから要素を削除するのはなぜですか? layout:not-included または同様のものがないのはなぜですか?
レンダリング エンジンや他の汎用言語とのやり取り、データ バインディング、厳格な XML 準拠 (名前空間なしで新しいタグを定義する機能?) などの非常に重要な設計上の考慮事項についても言及していませんが、これらは私が望むポイントです。そのような言語にとって何が重要だと思うかを尋ねるには?
language-design - Fantom プログラミング言語の第一印象は?
Fantom プログラミング言語を試してみた人はいますか? (しゃれた意図)。
私の第一印象:
- コードを .NET または Java VM で実行できる機能が気に入っています。
- 構文は素晴らしく、きれいで、凝ったことは何も試みません。
- 私は「ライブラリは言語である」という信念を持っており、Fan の開発者はUSP が API であると信じています。
しかし、Java と .NET の両方で実行する言語を取得するのは簡単です。実際、この問題には多くの解決策があります。難しいのは、移植可能な API を入手することです。Fan は、Java および .NET API を抽象化する一連の API を提供します。Java や .NET のカウンター パーツに比べてエレガントで使いやすい一連のシステム API を開発する機会が得られるため、これは実際には Fan の主な利点の 1 つだと考えています。
他の考え、第一印象、長所と短所はありますか?
javascript - 「this」キーワードは関数内でどのように機能しますか?
JavaScript で興味深い状況に遭遇しました。オブジェクトリテラル表記を使用して複数のオブジェクトを定義するメソッドを持つクラスがあります。これらのオブジェクト内では、this
ポインターが使用されています。this
プログラムの動作から、ポインターは、リテラルによって作成されたオブジェクトではなく、メソッドが呼び出されたクラスを参照して いると推測しました。
これは恣意的なように思えますが、私が期待する方法です。これは定義された動作ですか? クロスブラウザセーフですか?「仕様がそう言っている」を超えた方法である理由の根底にある理由はありますか(たとえば、それはより広範な設計上の決定/哲学の結果ですか)? 簡素化されたコード例: