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

プログラミング言語の設計と構造に関する質問。

22
null参照は本当に悪いことですか?
プログラミング言語にnull参照を含めることは「10億ドルの間違い」だと言ったと聞きました。しかし、なぜ?確かに、それらはNullReferenceExceptionsを引き起こす可能性がありますが、それではどうでしょうか?不適切に使用すると、言語の要素がエラーの原因になる可能性があります。 そして、代替手段は何ですか?私はこれを言う代わりに: Customer c = Customer.GetByLastName("Goodman"); // returns null if not found if (c != null) { Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!"); } else { Console.WriteLine("There was no customer named Goodman. How lame!"); } あなたはこれを言うことができます: if (Customer.ExistsWithLastName("Goodman")) { Customer c = Customer.GetByLastName("Goodman") // throws error …

14
なぜほとんどのプログラミング言語は、関数から単一の値を返すことしかサポートしないのですか?[閉まっている]
ほとんどのプログラミング言語の関数が、任意の数の入力パラメーターをサポートするように設計されていますが、戻り値は1つだけである理由はありますか? ほとんどの言語では、その制限を「回避する」ことができます。たとえば、出力パラメータを使用したり、ポインタを返したり、構造体/クラスを定義/返したりすることができます。しかし、プログラミング言語が複数の戻り値をより「自然な」方法でサポートするように設計されていないことは奇妙に思えます。 これについての説明はありますか?

14
0はなぜ偽ですか?
この質問は馬鹿げているように聞こえるかもしれませんが、ほとんどのプログラミング言語が0評価されfalse、他の[整数]値が評価されるのはなぜtrueですか? 文字列比較 質問は少し単純すぎるように思えるので、もう少し説明します。まず、プログラマーにとっては明白に思えるかもしれませんが、なぜプログラミング言語がないのか-実際にはあるかもしれませんが、私は使用しました-どこに0評価しtrue、他のすべての[整数]値を評価しfalseますか?その発言はランダムに見えるかもしれませんが、私はそれが良いアイデアだったかもしれないいくつかの例を持っています。まず、文字列の3者間比較の例を取り上げましょstrcmpう。Cを例に取ります。C 言語を最初の言語として試すプログラマーは、次のコードを書きたくなるかもしれません。 if (strcmp(str1, str2)) { // Do something... } 文字列が等しいときに評価されるstrcmp戻り値なので、最初のプログラマーがやろうとしたことは惨めに失敗し、一般的に最初はなぜか理解できません。していたために評価上記1 - -代わりに、この関数はその最も単純な式で使用されている可能性が平等を比較するとき、およびのための適切なチェックとは、必要なときにのみ行われていたであろう。ほとんどの場合、戻り値の型を(私たちの考えでは)考えていたでしょう。0false0true-11bool さらに、sign値-1、0およびのみを受け取る新しいタイプを導入しましょう1。それはかなり便利です。C ++に宇宙船オペレーターがあり、それを望んでいると想像してくださいstd::string(まあ、既にcompare関数はありますが、宇宙船オペレーターはもっと楽しいです)。現在、宣言は次のようになります。 sign operator<=>(const std::string& lhs, const std::string& rhs); していた0ために評価されtrue、宇宙船演算子は存在さえしないだろう、と私たちは宣言している可能性がoperator==そのように: sign operator==(const std::string& lhs, const std::string& rhs); これoperator==は3者間比較を一度に処理し、必要に応じてどの文字列が辞書的に優れているかを確認しながら、次のチェックを実行するために使用できます。 if (str1 == str2) { // Do something... } 古いエラー処理 現在、例外があるため、この部分は、そのようなものが存在しない古い言語(Cなど)にのみ適用されます。Cの標準ライブラリ(およびPOSIXのライブラリ)を見ると、maaaaany関数0が成功すると必ず戻り、それ以外の整数は必ず戻ります。悲しいことに、このようなことをする人を見たことがあります。 #define TRUE 0 // ... if …

6
XMLが正確に「言語」と呼ばれるのはなぜですか?
XMLの名前になぜLが含まれているのかと思っていました。 XML自体は何も「行いません」。これは単なるデータストレージ形式であり、言語ではありません!言語は物事を「行う」。 XMLを適切に言語に変換するためにXMLを取得する方法はxmlns、ルート要素に属性を追加することです。その場合にのみ、環境の内容を伝えます。 1つの例はXHTMLです。アクティブで、リンク、ハイパーテキスト、スタイルなどがあり、すべてによってトリガーされますxmlns。それがなければ、XHTMLファイルは、マークアップノード内の単なるデータの集まりです。 では、なぜXMLは言語と呼ばれるのでしょうか?それは何も説明せず、解釈もせず、ただそうです。 編集:たぶん私の質問はもっと広くすべきだった。現在、答えは「XMLはGMLなどにちなんで命名されたSGMLにちなんで命名されているから」という質問なので、質問は(XMLなどの)マークアップ言語が言語と呼ばれるのはなぜですか? ああ、そしてWRTの投票権:いいえ、私はXについては質問していません。Lについては質問しています!

12
例外は例外的な場合にのみ使用されるべきだと言われました。私のケースが例外的であるかどうかを知るにはどうすればよいですか?
ここでの私の具体的なケースは、ユーザーがアプリケーションに文字列を渡すことができ、アプリケーションがそれを解析し、構造化オブジェクトに割り当てることです。ユーザーが無効なものを入力する場合があります。例えば、彼らの入力は人を説明するかもしれませんが、彼らは彼らの年齢が「リンゴ」であると言うかもしれません。その場合の正しい動作は、トランザクションをロールバックし、エラーが発生したことをユーザーに伝えることであり、ユーザーは再試行する必要があります。最初のエラーだけでなく、入力で見つかったすべてのエラーについてレポートする必要があるかもしれません。 この場合、例外をスローする必要があると主張しました。彼は、「例外は例外であるべきだ。ユーザーが無効なデータを入力する可能性があるため、これは例外的なケースではない」と言って同意しませんでした。正しいようです。 しかし、そもそも例外が発明されたのはこのためだと私は理解しています。それはあなたがために使用いたエラーが発生したかどうかを確認するために、結果を検査します。チェックに失敗すると、気付かないうちに悪いことが起こる可能性があります。 例外なく、スタックのすべてのレベルが呼び出すメソッドの結果を確認する必要があり、プログラマーがこれらのレベルのいずれかをチェックインするのを忘れると、コードが誤って続行して無効なデータを保存する可能性があります(たとえば)。そのようになりやすいエラーのようです。 とにかく、ここで言ったことは何でも修正してください。私の主な質問は、例外が例外的であるべきだと誰かが言った場合、私の事例が例外的であるかどうかをどのように知ることができますか?


30
PHPにはどのような機能が必要ですか?[閉まっている]
今はホリデーシーズンであり、誰もが希望を抱いているので、PHPでどの言語機能を追加したいのでしょうか。私は、言語に対する実用的な提案/要望に興味があります。実用的には: 実際にできること(「PHPが私のコードの意味を推測してバグを修正してくれることを望んでいる」または「コードが5ミリ秒未満で実行されることを望んでいる」) PHPを別の言語に変更する必要のないもの(「中括弧の代わりに$記号を削除してスペースを使用したい」または「PHPをコンパイルし、静的に入力し、名前に#を含めたい」) 既存のすべてのコードを壊す必要のないもの(「500個の関数の名前を変更し、それらのパラメーターの順序を変更しましょう」) 何かない言語やそれのいくつかの興味深い側面を変更(ない:「私はXYZのプロトコルをサポートするための拡張があったことを望む」または「私はバグ#12345を希望するが最終的に固定されました」) 暴言以上のもの(「PHPがそんなにひどく吸わないように」) 誰にも良い願いがありますか? Mod編集:Stanislav MalyshevはコアPHP開発者です。

11
Javaの開発者は意識的にRAIIを放棄しましたか?
長年のC#プログラマーとして、最近、Resource Acquisition Is Initialization(RAII)の利点について詳しく知るようになりました。特に、C#のイディオムは次のとおりです。 using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } C ++に相当するものがあります。 { DbConnection dbConn(connStr); // do stuff with dbConn } つまりDbConnection、usingブロックのようにリソースの使用を囲むことを覚えておくことは、C ++では不要です。これは、C ++の大きな利点のようです。あなたはタイプのインスタンスメンバを持つクラスを考えるとき、これは、より説得力があるDbConnectionたとえば、 class Foo { DbConnection dbConn; // ... } C#では、Foo IDisposableを次のように実装する必要があります。 class Foo : IDisposable { DbConnection dbConn; public void …
82 java  c#  c++  language-design 

10
nullが悪い場合、なぜ現代の言語はそれを実装するのですか?[閉まっている]
JavaやC#のような言語のデザイナーは、null参照の存在に関連する問題を知っていたはずです(null参照は本当に悪いことですか?を参照)。また、オプションタイプの実装は、null参照ほど複雑ではありません。 とにかくそれを含めることにしたのはなぜですか?null参照の欠如は、言語の作成者とユーザーの両方から、より良い品質のコード(特により優れたライブラリ設計)を奨励(または強制)するだろうと確信しています。 それは単に保守主義のせいなのでしょうか-「他の言語にもあります、我々もそれを持たなければなりません...」?


11
Javaで文字列が不変なのはなぜですか?
その理由を理解できませんでした。私は常に他の開発者のようにStringクラスを使用しますが、その値を変更すると、Stringの新しいインスタンスが作成されます。 JavaのStringクラスの不変性の理由は何ですか? StringBufferやStringBuilderのような代替手段があることを知っています。それは単なる好奇心です。

14
算術オーバーフローが無視されるのはなぜですか?
お気に入りのプログラミング言語で1〜2,000,000のすべての数値を合計しようとしたことがありますか?結果は手動で簡単に計算できます。2,000,001,000,000は、符号なし32ビット整数の最大値の約900倍です。 C#が出力される-1453759936-負の値!そして、Javaも同じことをしていると思います。 つまり、デフォルトでは算術オーバーフローを無視する一般的なプログラミング言語がいくつかあります(C#には、それを変更するための非表示オプションがあります)。それは私には非常に危険に見える動作であり、Ariane 5のクラッシュはそのようなオーバーフローによって引き起こされたのではありませんか? では、このような危険な動作の背後にある設計上の決定は何ですか? 編集: この質問に対する最初の回答は、チェックの過剰なコストを表しています。短いC#プログラムを実行して、この仮定をテストしましょう。 Stopwatch watch = Stopwatch.StartNew(); checked { for (int i = 0; i < 200000; i++) { int sum = 0; for (int j = 1; j < 50000; j++) { sum += j; } } } watch.Stop(); Console.WriteLine(watch.Elapsed.TotalMilliseconds); 私のマシンでは、チェックされていないバージョンは4125msかかりますが、チェックされたバージョンは11015msかかります。つまり、チェック手順は、数値を追加するのにほぼ2倍の時間がかかります(元の時間の合計3倍)。しかし、10,000,000,000回の繰り返しで、チェックにかかる時間はまだ1ナノ秒未満です。それが重要な状況があるかもしれませんが、ほとんどのアプリケーションでは、それは重要ではありません。 編集2: サーバーアプリケーション(いくつかのセンサーから受信したデータを分析するWindowsサービス)を/p:CheckForOverflowUnderflow="false"パラメーターで再コンパイルし(通常、オーバーフローチェックをオンにします)、デバイスに展開しました。Nagiosモニタリングは、平均CPU負荷が17%に留まったことを示しています。 これは、上記の構成例で見つかったパフォーマンスヒットは、アプリケーションにとってまったく無関係であることを意味します。

9
なぜ部分クラスを使用するのですか?
私の理解では、このpartialキーワードはクラスを複数のソースファイルに分割することを許可するだけです。コードの整理以外にこれを行う理由はありますか?生成されたUIクラスで使用されているのを見ました。 キーワード全体を作成するのは不十分な理由のようです。クラスが複数のファイルを必要とするのに十分な大きさである場合、おそらくあまりにも多くのことを行っています。どこかで完了させる別のプログラマーのためにクラスを部分的に定義するために使用できると思いましたが、抽象クラスを作成する方が良いでしょう。

8
一部の言語コミュニティ(RubyやPythonなど)が断片化を防止できる一方で、他の言語コミュニティ(LispやMLなど)ができないのはどうしてですか?
「Lisp」(または「Lispライク」)という用語は、Common Lisp、Scheme、Arcなど、さまざまな言語の総称です。MLなど、他の言語コミュニティにも同様の断片化があります。 ただし、RubyとPythonはどちらも、言語自体に変更を加えるのではなく、実装(PyPyやYARVなど)でイノベーションが発生したこの運命を回避することに成功しています。 RubyとPythonのコミュニティは、言語の断片化を防ぐために特別なことをしましたか?

10
構文設計-引数が渡されないときに括弧を使用する理由
多くの言語では、構文function_name(arg1, arg2, ...)を使用して関数を呼び出します。引数なしで関数を呼び出す場合は、実行する必要がありますfunction_name()。 コンパイラーまたはスクリプトインタープリターが()関数呼び出しとして正常に検出する必要があることは奇妙に感じます。変数が呼び出し可能とわかっている場合、なぜfunction_name;十分ではないのでしょうか? 一方、一部の言語では次のことを実行できます。関数またはコマンドを呼び出すことfunction_name 'test';もできますfunction_name 'first' 'second';。 括弧は、優先順位を宣言するためだけに必要であり、他の場所ではオプションである場合、括弧はより良いと思います。たとえば、行うことif expression == true function_name;はとして有効である必要がありますif (expression == true) function_name();。 私の意見で最も厄介なことは'SOME_STRING'.toLowerCase()、プロトタイプ関数が引数を必要としないことが明らかになったときに行うことです。なぜデザイナーはよりシンプルなものに反対したの'SOME_STRING'.lowerですか? 免責事項:誤解しないでください、Cのような構文が大好きです!;)私はそれがもっと良いかどうか尋ねているだけです。要求に()はパフォーマンス上の利点がありますか、それともコードを理解しやすくしますか?正確な理由は何なのか本当に興味があります。

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