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

プログラミング言語のあらゆる側面の設計に関連する質問のタグ。

30
「最小驚き」と可変デフォルト引数
Pythonをいじくり回している人は誰でも、次の問題で噛まれ(または引き裂かれ)ています。 def foo(a=[]): a.append(5) return a Python初心者は、この関数が常に1つの要素のみのリストを返すことを期待します[5]。結果は非常に異なり、非常に驚​​くべきものです(初心者にとって)。 >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 私のマネージャーはかつてこの機能に初めて遭遇し、それを言語の「劇的な設計上の欠陥」と呼んでいました。私はその振る舞いには根本的な説明があったと答えました、そしてあなたがその内部を理解していなければ、それは確かに非常に不可解で予想外です。しかし、私は次の質問に(自分自身で)答えることができませんでした。関数の実行時にではなく、関数の定義時にデフォルト引数をバインドする理由は何ですか?経験豊富な振る舞いが実際に使用されているとは思えません(実際にバグを増殖させることなく、Cで静的変数を使用したのは誰ですか?) 編集: Baczekは興味深い例を作りました。あなたのほとんどのコメント、特にウタールのコメントとともに、私はさらに詳しく説明しました: >>> def a(): ... print("a executed") ... return [] ... >>> >>> def b(x=a()): ... x.append(5) ... print(x) ... a …

16
Javaがunsigned intをサポートしないのはなぜですか?
Javaに符号なし整数のサポートが含まれていないのはなぜですか? 予想外に大きな入力でオーバーフローが発生する可能性が低いコードを記述できることを考えると、私には奇妙な省略のようです。 さらに、符号なし整数を使用すると、unsigned intが保持することを意図していた値が負になることは決してないことが示されているため、自己文書化の一種になる可能性があります。 最後に、場合によっては、除算などの特定の演算では符号なし整数の方が効率的です。 これらを含めることの欠点は何ですか?

13
C#で==と!=の両方を定義する必要があるのはなぜですか?
C#コンパイラでは、カスタム型がoperatorを定義する場合は常に==、それも定義する必要があります!=(ここを参照)。 どうして? デザイナーがなぜそれを必要と考えたのか、そしてどちらか一方しか存在しない場合にコンパイラーがどちらかの演算子の妥当な実装をデフォルトにできないのか知りたいです。たとえば、Luaでは等値演算子のみを定義でき、もう1つは無料で取得できます。C#は、==または==と!=の両方を定義して、不足している!=演算子をとして自動的にコンパイルするように要求することで、同じことを行うことができます!(left == right)。 (IEEE-754 NaNのように)一部のエンティティが等しくも等しくもない場合がある奇妙なコーナーケースがあることを理解していますが、それらは例外ではなく、規則のように見えます。したがって、これは、C#コンパイラの設計者が例外をルールにした理由を説明していません。 等号演算子が定義されている仕上がりの悪さの例を見てきましたが、不等号演算子は、すべての比較が反転され、すべての&&が||に切り替えられたコピー/貼り付けです。(要点がわかります...基本的に!(a == b)は、ドモルガンのルールによって拡張されます)。これは、Luaの場合のように、コンパイラーが意図的に排除できるのは悪い習慣です。 注:演算子<> <=> =についても同様です。これらを不自然な方法で定義する必要がある場合は想像できません。Luaでは、前者の否定を通して、<と<=だけを定義し、> =と>を自然に定義できます。C#が同じことをしないのはなぜですか(少なくとも「デフォルト」)。 編集 どうやらプログラマーが等しいかどうかのチェックを実装できるようにする正当な理由があるようです。いくつかの回答は、それが良い場合を示しています。 しかし、私の質問の核心は、通常これが論理的に必要ではないのに、なぜこれがC#で強制的に要求されるのかということです。 またObject.Equals、のような.NETインターフェースの設計上の選択とは著しく対照的IEquatable.Equals IEqualityComparer.Equalsです。NotEquals対応するものがないため、フレームワークは!Equals()オブジェクトを不平等と見なし、それがそうです。さらに、のようなクラスDictionaryとメソッドのようなもの.Contains()は、前述のインターフェースにのみ依存しており、たとえ定義されていても、直接演算子を使用しません。実際、ReSharperが同等のメンバーを生成するとき、ReSharperは、ユーザーが演算子を生成することを選択した場合に限り、その両方の観点から、そしてその場合でも、両方==を定義します。オブジェクトの等価性を理解するために、フレームワークでは等価演算子は必要ありません。!=Equals() 基本的に、.NETフレームワークはこれらの演算子を考慮せず、いくつかのEqualsメソッドのみを考慮します。==と!=の両方の演算子をユーザーがタンデムで定義することを要求する決定は、.NETに関する限り、オブジェクトのセマンティクスではなく、純粋に言語設計に関連しています。

5
Java 8インターフェイスメソッドで「最終」が許可されないのはなぜですか?
Java 8の最も便利な機能の1つは、defaultインターフェースの新しいメソッドです。それらが導入された理由は基本的に2つあります(他にもある場合があります)。 実際のデフォルト実装を提供します。例:Iterator.remove() JDK APIの進化を可能にする。例:Iterable.forEach() APIデザイナーの観点から、インターフェイスメソッドで他の修飾子を使用できるようにしたいと思っていましたfinal。これは、便利なメソッドを追加するときに役立ち、クラスの実装における「偶発的な」オーバーライドを防ぎます。 interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } 上記がSenderクラスの場合、すでに一般的な方法です。 abstract class Sender { // Convenience method to send an empty message final void …


5
原型継承が古典よりも優れている点は?
それで、私はついにこれらの年の間ずっと足を引きずることをやめて、JavaScriptを「適切に」学ぶことを決めました。言語設計の最も頭を悩ます要素の1つは、継承の実装です。Rubyの経験があったので、クロージャーと動的型付けを見て本当に幸せでした。しかし、私の人生では、継承のために他のインスタンスを使用するオブジェクトインスタンスからどのようなメリットが得られるかを理解できません。

11
Ruby、PythonがJavascript V8の速度を得るために何を妨げているのですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 5年前休業。 ロックされています。この質問とトピックへの回答はロックされています。質問はトピックから外れていますが、歴史的に重要です。現在、新しい回答や相互作用を受け入れていません。 V8エンジンの最適化(インラインキャッシュなど)の実装をブロックしているRuby / Python機能はありますか? PythonはGoogleのメンバーによって共同開発されているため、ソフトウェア特許によってブロックされるべきではありません。 または、これはGoogleがV8プロジェクトに投入したリソースの問題です。

14
戻り値の型による関数のオーバーロード?
より主流の静的型付き言語が戻り値型による関数/メソッドのオーバーロードをサポートしないのはなぜですか?そんなことは考えられません。パラメータタイプによるオーバーロードをサポートするのと同じくらい便利または合理的です。なぜそれほど人気が​​ないのですか?

5
「this」キーワードは関数内でどのように機能しますか?
JavaScriptで興味深い状況に遭遇しました。オブジェクトリテラル表記を使用して複数のオブジェクトを定義するメソッドを持つクラスがあります。これらのオブジェクト内では、thisポインターが使用されています。プログラムの動作から、thisポインタはメソッドが呼び出されたクラスを参照しており、リテラルによって作成されているオブジェクトを参照していないと推定しました。 これは私には期待できる方法ですが、これは恣意的です。これは定義された動作ですか?ブラウザ間で安全ですか?それが「仕様がそう言っている」ことを超えている理由である根本的な理由はありますか(たとえば、それはいくつかのより広範な設計決定/哲学の結果ですか)?削減されたコード例: // inside class definition, itself an object literal, we have this function: onRender: function() { this.menuItems = this.menuItems.concat([ { text: 'Group by Module', rptletdiv: this }, { text: 'Group by Status', rptletdiv: this }]); // etc }

12
Pythonに符号関数がないのはなぜですか?
なぜPythonにsign関数がないのか理解できません。それは持っているabs(私は考える組み込みsignの妹)が、ありませんsign。 Python 2.6にはcopysign(mathの)関数さえありますが、符号はありません。なぜcopysign(x,y)a signと書いて、copysign直接から直接得ることができるのに、わざわざaを書くのabs(x) * sign(y)ですか?後者の方がはるかに明確です。xにyの符号が付いているのに対し、copysignでは、xがyの符号を持つか、yがxの符号を持つかを覚えておく必要があります。 明らかにsign(x)以外のものは何も提供しませんcmp(x,0)が、これもはるかに読みやすくなります(Pythonのような非常に読みやすい言語の場合、これは大きなプラスになります)。 もし私がpythonデザイナーだったら、私はその逆でした:cmp組み込みではなくsign。必要なcmp(x,y)場合は、単にaを実行することができますsign(x-y)(または、数値以外の場合はx> yを使用します-もちろん、これにはsorted整数コンパレータの代わりにブール値を受け入れる必要があります)。これはより明確になります:正の場合x>y(一方cmp、最初の規則が大きい場合は、規則を正に覚えておく必要がありますが、逆の場合もあります)。もちろんcmp、他の理由でそれ自体が理にかなっています(たとえば、非数値のものを並べ替えるとき、または並べ替えを安定させたい場合、単純にブール値では使用できません)。 では、問題は次のとおりです。なぜPythonデザイナーはsign関数を言語から除外することにしたのですか?なぜ一体copysignは親ではなく気になるのsignですか? 何か不足していますか? 編集-ピーターハンセンコメントの後。あなたがそれを使用しなかったが、Pythonを何のために使用するかを言っていないほど十分に公平です。私がpythonを使用していた7年間で、私は何度もそれを必要としました、そして最後はラクダの背中を壊したストローです! はい、CMPを渡すことができますが、合格する必要があった時間の90%は、lambda x,y: cmp(score(x),score(y))記号でうまく機能するようなイディオムでした 。 最後に、私はあなたsignがそれよりも有用であることをあなたが同意することを望みますcopysign、それで私があなたの見解を買ったとしても、なぜそれを符号の代わりに数学で定義することに悩むのですか?どのようにして、コピーサインはサインよりも非常に便利ですか?

5
配列がIterableに割り当てられないのはなぜですか?
Java5では、次のように記述できます。 Foo[] foos = ... for (Foo foo : foos) またはforループでIterableを使用するだけです。これはとても便利です。 ただし、次のようにイテラブルのジェネリックメソッドを作成することはできません。 public void bar(Iterable<Foo> foos) { .. } Iterableではないため、配列で呼び出します。 Foo[] foos = { .. }; bar(foos); // compile time error このデザイン決定の背後にある理由について疑問に思っています。



3
なぜステートメントだったのですか(j ++); 禁止?
次のコードは間違っています(ideoneで参照してください): public class Test { public static void Main() { int j = 5; (j++); // if we remove the "(" and ")" then this compiles fine. } } エラーCS0201:割り当て、呼び出し、インクリメント、デクリメント、待機、および新しいオブジェクト式のみをステートメントとして使用できます かっこを削除するとコードがコンパイルされるのはなぜですか? 括弧でコンパイルしないのはなぜですか? なぜC#はそのように設計されたのですか?

13
誰かが新しいプログラミング言語を書くとき、彼らはそれを何でINに書きますか?
私の無知を許してください。私はPHPに手を出して、SOのブラウジングをウェットにしていて、何年もの間疑問に思ってきた質問をしなければならないのです。 まったく新しいプログラミング言語を書くとき、何を書いていますか? これはおそらく私が途方もない敬意を払っているすべてのプログラマーにとって本当にばかげているように聞こえますが、それは私にとって戸惑う鶏と卵の問題です。職業はなんですか?自分自身に言う今日、私は新しい言語を発明するつもりです!そして、起動します...メモ帳?すべてのコンパイラは以前から存在していた言語に基づいて構築されていますか?気になる人は、これまでに考案されたすべてのプログラミング言語を1つの巨大な分岐ツリーにまとめることができます...ますか? 私のかすかな知性で、これは魅力的だと思います...教えてください!

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