問題タブ [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.
language-agnostic - あなたのお気に入りの言語は、深層再帰をどのように処理しますか?
私は最近 Python の学習を始めましたが、(デフォルトで) 1000 の深い再帰制限を見つけてかなり驚きました。30000 くらいに設定すると、C と同じようにセグメンテーション違反でクラッシュします。ただし、C はかなり高くなるようです。
(Python 関係者は、いつでも再帰関数を反復関数に変換でき、常に高速であるとすぐに指摘します。それは 100% 真実です。しかし、それは実際には私の質問の内容ではありません。)
Perl で同じ実験を試みたところ、約 1000 万回の再帰で 4 ギガの RAM がすべて消費され、^C を使用して試行を停止しました。明らかに、Perl は C スタックを使用しませんが、再帰の際に途方もない量のメモリを使用します。関数を呼び出すためにどれだけの作業をしなければならないかを考えると、それほど衝撃的ではありません。
Pike で試してみたところ、約 2 秒で 100,000,000 回の再帰が得られたことに完全に驚きました。それがどのように行われたかはわかりませんが、反復プロセスへの再帰を平坦化したのではないかと思います-実行中に余分なメモリを消費していないようです. [注: Pike は些細なケースを平坦化しますが、より複雑なケースでは segfault を実行します。そう言われています。]
私はこれらの無用な機能を使用しました:
他の言語 (PHP、Ruby、Java、Lua、Ocaml、Haskell など) が再帰をどのように処理するのか、またなぜそのように処理するのか、非常に興味があります。さらに、関数が「末尾再帰」である場合に違いが生じるかどうかに注意してください (コメントを参照)。
c - なぜswitchステートメントは休憩が必要になるように設計されたのですか?
単純なswitchステートメントが与えられた
ケース2にbreakステートメントがないということは、ケース3のコード内で実行が続行されることを意味します。これは偶然ではありません。そのように設計されました。なぜこの決定がなされたのですか?これは、ブロックの自動ブレークセマンティクスを持つことと比較してどのような利点がありますか?理論的根拠は何でしたか?
language-agnostic - 例外またはエラー コードの規則
昨日、私は同僚とどのようなエラー報告方法が望ましいかについて白熱した議論をしていました。主に、アプリケーション層またはモジュール間のエラーを報告するための例外またはエラー コードの使用について説明していました。
エラー報告のために例外をスローするか、エラー コードを返すかを決定するために、どのような規則を使用しますか?
c - 「entry」キーワードはどうなりましたか?
先日ホワイト ブックをめくっていたときに、C キーワードのリストに気付きました。 エントリは、そのリストのキーワードの 1 つです。
将来の使用のために予約されています。私の Fortran 時代を思い出すと、 entryステートメントを使用して 2 番目の引数の署名、または関数へのエントリ ポイントを作成する何らかの関数がありました。
これは、もともとこのエントリが使用されることを意図していたものですか? または完全に異なる何か?
エントリーキーワードのストーリーは?
c# - 別のインターフェースがすでに継承しているインターフェースの再実装
私はこのようなものをたくさん見ます:
B が既に A を継承しているのに、なぜ C がインターフェイス A を実装すると指定するのでしょうか? 意味的な違いはありますか、それとも単にスタイルの問題ですか?
(多くの例の 1 つは と の実装List<T>
ですが、からも派生しています)。IList<T>
ICollection<T>
IList<T>
ICollection<T>
更新:セマンティックな違いはないという私の推測を確認していただきありがとうございます。
すでに継承ツリーにあるインターフェイスに明示的に名前を付けることが違いを生む、関連する状況を思いつきました。
B
クラスの場合、' ' の後に明示的に名前が付けられている場合にC
のみ、からのインターフェイス メンバーを (再) 実装します。A
A
:
[編集] オブジェクトがインターフェイスとしてキャストされる場合にメンバーの使用を制限する、明示的に実装されたインターフェイス メンバーとの混乱を避けるために、質問の文言を変更しました。
c++ - C++ は pimpl イディオムを回避できなかったのでしょうか?
私が理解しているように、pimpl イディオムが存在するのは、C++ がすべてのプライベート クラス メンバーをヘッダーに配置することを強制するためだけです。ヘッダーにパブリック インターフェイスのみが含まれている場合、理論的には、クラスの実装を変更しても、プログラムの残りの部分を再コンパイルする必要はありません。
私が知りたいのは、C++ がそのような利便性を考慮して設計されていない理由です。クラスの非公開部分をヘッダーに公然と表示する必要があるのはなぜですか (しゃれは意図されていません)。
language-features - bignum を使用するオーバーヘッド
数値が含まれる場合に、自分の言語でデフォルトのデータ型として bignum を使用するかどうかについて、この問題に遭遇しました。私はこれを自分で評価し、利便性と快適性とパフォーマンスの質問に減らしました。その質問に対する答えは、最適化されていないプログラムでパフォーマンス ヒットがどの程度大きくなるかによって異なります。
fixnum または整数で十分だった場所で bignum を使用した場合のオーバーヘッドはどれくらい小さいでしょうか? 最高の実装でどれくらい小さくできますか? どのような種類の実装が最小のオーバーヘッドに達し、どのような種類の追加のトレードオフが発生しますか?
言語をデフォルトで bignum に設定した場合、全体的な言語パフォーマンスの結果にどのような影響を期待できますか?
programming-languages - C/C++/C#/Java などの命令型言語またはオブジェクト指向言語にスワップ/交換演算子が存在しないのはなぜですか?
2 つの変数の内容を交換するような単純で基本的な操作が、なぜ多くの言語に組み込まれていないのか、いつも疑問に思っていました。
これは、コンピューター サイエンスの授業で最も基本的なプログラミング演習の 1 つです。多くのアルゴリズム(ソートなど)で頻繁に使用されます。時々それが必要になり、一時変数を使用するか、テンプレート/ジェネリック関数を使用する必要があります。
これは、多くのプロセッサでは基本的なマシン命令であるため、一時変数を使用した標準的なスキームが最適化されます。
代入演算子 (たとえば += など、累積的なマシン命令を反映するために作成された可能性があります。たとえば、add ax,bx) や ?? C# の演算子。
それで、理由は何ですか?それとも実際に存在し、私はいつもそれを見逃していましたか?
class - 静的なダック型言語はありますか?
この質問についてしばらく考えた後、静的ダック型の言語が実際に機能する可能性があることに気づきました。定義済みクラスをコンパイル時にインターフェイスにバインドできないのはなぜですか? 例:
そのような機能をサポートする言語を知っていますか? Java または C# で役に立ちますか? 何らかの形で根本的に欠陥がありますか?MyClass をサブクラス化してインターフェイスを実装したり、Adapter デザイン パターンを使用して同じことを達成したりできることは理解していますが、これらのアプローチは不必要なボイラープレート コードのように思えます。
initialization - C、C ++、C#、Java、Pythonでの宣言、定義、初期化
上記の各言語での用語の意味は何ですか?この点で、なぜ言語が異なるのですか(どこで行っても)。