問題タブ [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.
boolean - Boolean true - 正の 1 または負の 1?
私は言語を設計しており、true
0x01 か 0xFF かを決定しようとしています。明らかに、ゼロ以外の値はすべて true に変換されますが、正確な内部表現を決定しようとしています。
それぞれの選択の長所と短所は何ですか?
c++ - C++ で参照を再配置できないのはなぜですか
C++ 参照には、次の 2 つのプロパティがあります。
- それらは常に同じオブジェクトを指します。
- 0 にすることはできません。
ポインタは反対です:
- それらは異なるオブジェクトを指すことができます。
- それらは 0 になる可能性があります。
C++に「null不可で再配置可能な参照またはポインタ」がないのはなぜですか? 参照が再配置可能であってはならない正当な理由が思いつきません。
編集: 「関連付け」(ここでは「参照」または「ポインター」という言葉を避けている)が決して無効ではないことを確認したいときに参照を使用するため、この質問は頻繁に発生します。
「この参照が常に同じオブジェクトを参照するのは素晴らしい」と思ったことはないと思います。参照が再配置可能な場合、次のような現在の動作を取得できます。
これはすでに正当な C++ ですが、意味がありません。
私は自分の質問を次のように言い直します。
乾杯、フェリックス
c# - C# foreach ステートメントの反復変数が読み取り専用なのはなぜですか?
私が理解しているように、C# の foreach 反復変数は不変です。
つまり、次のようにイテレータを変更することはできません。
イテレータ変数を直接変更することはできず、代わりに for ループを使用する必要があります
C++ のバックグラウンドを持っているので、foreach は for ループの代わりになると考えています。しかし、上記の制限があるため、通常は for ループを使用するようにフォールバックします。
イテレータを不変にする理由は何ですか?
編集:
この質問は好奇心に関する質問であり、コーディングに関する質問ではありません。コーディングの回答には感謝していますが、回答としてマークすることはできません。
また、上記の例は単純化しすぎています。これが私がやりたいことのC ++の例です:
イテレータ i が不変であるため、C# の foreach で上記のことを行うことはできません。これは、言語における foreach の設計に固有のものだと思います (間違っている場合は訂正してください)。
foreach イテレータが不変である理由に興味があります。
sql - ORACLE がコマンドで連続した改行文字を許可しないのはなぜですか?
私は書きます:
ファイル「a.sql」に保存します。
次に、SQL*Plus コマンド プロンプトで「@a」と入力して実行すると、「ssn」で始まる行がコマンドとして認識されず、無視されることがわかります。
私が収集したものから、複数の改行文字が連続して発生した場合、sqlplus はコマンドを終了するようです。これは正確な声明ですか?もしそうなら、これが必要かどうか/なぜこれを選択するのか誰かが知っていますか?
templates - プログラミング言語でテンプレートを実装する最良の方法は何ですか?
高レベルのオブジェクト指向のガベージ コレクション プログラミング言語を設計していますが、テンプレートの作成方法に問題があります。.NET や JVM に似た VM タイプのシステムを作成する予定です (ただし、内部では LLVM を使用します)。問題は、強力な C++ ライクなテンプレートが必要であるが、動的リンクが必要なことです (そのため、テンプレート ライブラリを使用するすべてを再コンパイルせずにテンプレート ライブラリを置き換えることができます)。テンプレートの定義がなくてもソース ファイルをコンパイルできるようにしたいと考えています。JIT 時のコード生成は最小限に抑える必要があります。
私が考えているオプションは次のとおりです。
- 各コンパイル単位に静的にリンクされたテンプレート ライブラリの概念を持っています。テンプレート ライブラリは基本的に、テンプレートがインスタンス化されるときに空白が埋められる AST のようなものです。これに関する問題は、2 つのファイルが異なるバージョンのテンプレート ライブラリでコンパイルされた場合、互換性がないか、テンプレート ライブラリにバグがある場合、すべてを再コンパイルする必要があることです。これが C++ のやり方です。
- JIT 時にリンクされるテンプレート ライブラリを用意します。これはほとんどの問題を解決しますが、IR が基本的に AST である必要があります。IRのレベルをもっと低くしてほしい。これには、JIT を行うためにより多くの作業が必要です。
- 型のみを引数として持つ弱い C# のようなジェネリックを使用します。これは非常に制限的ですが、単純なコード生成と動的リンクを可能にします。
私が考えていない他の良い方法はありますか?私は最初のオプションに傾いていますが、どのオプションもあまり好きではありません。最良の選択肢は何だと思いますか?
c - C ベースの言語を GCC に追加するにはどうすればよいですか
独自の拡張機能を C に変更または追加し、それらを GCC C コンパイラに追加したい場合、何をする必要がありますか? 言語の変更を提案したくはありません。C コンパイラが実際にどのように機能するかを知りたいのです。
私はGCCのソースコードを見てきました.Objective-Cは、変更されたランタイムライブラリを参照するコードを生成する単純なパーサーとして実装されているように見えます.Cベースのすべてのものに対して、通常のC コンパイラ。私はそれを熱心に研究していないので、おそらく正しい軌道に乗っていません。
たとえば、自分のキーワードを Objective-C に追加したいとします。多分のように、実装しやすいと思われるものを追加したいと思い@assert
ます。私が望むのは@assert
、Objective-C ランタイムに追加する関数を呼び出すことだけです。
明らかに、これを関数呼び出しとマクロとして実装することもできますが、C ソース コードの解析とコンパイルの段階を理解したいので、言語に独自の拡張機能を追加して、自分で使用できるようにしたいと考えています。
私が一貫して見てきたソース コードは「ツリー」を参照しており、アクションを実行したり、これらのツリーから情報を取得したりするマクロは非常に多くあります。
この種のことを詳細に説明しているドキュメントはありますか?
language-design - 通常の算術変換-より良いルールのセット?
次のコードを検討してください。
C ++、C#、D、およびJavaでは、両方の関数呼び出しが「int」オーバーロードに解決されます...これは「仕様」に含まれていることをすでに認識していますが、言語がこのように設計されているのはなぜですか?もっと深い理由を探しています。
私にとって、結果が両方のオペランドのすべての可能な値を表すことができる最小の型であることが理にかなっています。たとえば、次のようになります。
これにより、などの不便なコードが排除されshort s3 = (short)(s1 + s2)
、IMOがはるかに直感的で理解しやすくなります。
これはCの時代からの残された遺産ですか、それとも現在の動作のより良い理由がありますか?
c++ - C/C++ に ^^ 演算子がないのはなぜですか?
&
持ってい&&
ます。|
持ってい||
ます。なぜないのです^
か^^
?
ショートサーキットではないことは理解していますが、セマンティクスが異なります。C では、true
実際にはゼロ以外の任意の値です。ビット単位の XOR は、常に論理 XOR と同じではありません。
1
真の値がorであることに常に依存できるとは限ら-1
ないため、^^
演算子は非常に役に立ちませんか? 私はしばしば次のような奇妙なことをしなければなりません: