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

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


9
最新のプログラミング言語のほとんどで、Design by Contractのサポートが制限されているのはなぜですか?
私は最近、Design by Contract(DbC)を発見しましたが、コードを記述する非常に興味深い方法であることがわかりました。とりわけ、それは提供するように思われるでしょう: より良いドキュメント。契約は文書であるため、契約が期限切れになることは不可能です。また、コントラクトはルーチンの動作を正確に指定するため、再利用のサポートに役立ちます。 簡単なデバッグ。プログラムの実行はコントラクトが失敗した瞬間に停止するため、エラーは伝播できず、違反した特定のアサーションが強調表示されると考えられます。これにより、開発時およびメンテナンス時にサポートが提供されます。 より良い静的分析。DbCは基本的にHoareロジックの単なる実装であり、同じ原則を適用する必要があります。 それに比べて、コストはかなり小さいようです。 余分な指タイプ。契約書を綴る必要があるため。 契約書の作成に慣れるには、ある程度のトレーニングが必要です。 現在、主にPythonに精通しているため、実際には前提条件(不適切な入力に対して例外をスローするだけ)を作成することが可能であり、特定の事後条件を再度テストするためにアサーションを使用することもできます。しかし、「古い」または「結果」などの特定の機能をシミュレートすることは、最終的に非Pythonicと見なされる余分な魔法なしでは不可能です。(さらに、サポートを提供するライブラリがいくつかありますが、ほとんどの開発者がそうではないように、最終的にはそれらを使用するのは間違っているでしょう。)それは他のすべての言語でも同様の問題だと思います(もちろん、エッフェル)。 私の直感では、サポートの欠如はある種の慣行に対する拒絶の結果であるに違いないが、オンラインでの検索は有益ではなかったと教えてくれます。ほとんどの現代言語がほとんどサポートを提供していないように見える理由を誰かが明確にできるかどうか疑問に思っていますか?DbCに欠陥があるか、過度に高価ですか?それとも、エクストリームプログラミングやその他の方法論のために時代遅れになっているのでしょうか?

12
ほとんどのプログラミング言語には、関数を宣言するための特別なキーワードまたは構文があるのはなぜですか?[閉まっている]
ほとんどのプログラミング言語(動的および静的に型付けされた言語の両方)には、関数を宣言するための変数の宣言とは大きく異なる特別なキーワードおよび/または構文があります。関数は別の名前付きエンティティを宣言するのと同じように見えます: たとえば、Pythonの場合: x = 2 y = addOne(x) def addOne(number): return number + 1 何故なの: x = 2 y = addOne(x) addOne = (number) => return number + 1 同様に、Javaのような言語では: int x = 2; int y = addOne(x); int addOne(int x) { return x + 1; } 何故なの: int x …

4
Goはどれくらいの速度で移動できますか?
Goは、「金属に近い」状態で実行されるはずの数少ない言語の1つです。つまり、コンパイルされ、静的に型指定され、VMなしでネイティブにコードを実行します。これにより、Java、C#などよりも速度が向上します。ただし、Javaの背後にあるようです(プログラミング言語のShootoutを参照) 成熟度の低いコンパイラがこれに大きな責任を負っていると仮定していますが、他の理由はありますか?Goの設計に固有のものはありますか。たとえば、Javaよりも速く動作することを妨げるものはありますか。私はランタイムモデルについて非常に洗練された見方をしていますが、少なくとも原則として、ネイティブコードの実行のおかげで、Javaよりも速く実行できるはずです。

8
スコープベースのメモリ管理の欠点
スコープベースのメモリ管理(SBMM)、またはRAIIは、C ++コミュニティでより一般的に(混乱して?)参照されるため、私は本当に気に入っています。私が知る限り、C ++(およびC)を除いて、SBMM / RAIIをメインメモリ管理メカニズムとする他の主流の言語は現在使用されておらず、代わりにガベージコレクション(GC)を使用しています。 これはかなりわかりにくい SBMMはプログラムをより決定的にします(オブジェクトがいつ破壊されるかを正確に知ることができます)。 GCを使用する言語では、多くの場合、手動でリソース管理を行う必要があります(たとえば、Javaでファイルを閉じるを参照)。これは、GCの目的を部分的に無効にし、エラーも発生しやすくなります。 ヒープメモリは(非常にエレガントに、imo)スコープにバインドすることもできます(std::shared_ptrC ++を参照)。 SBMMがより広く使用されないのはなぜですか?その短所は何ですか?

5
C#がcaseブロックにローカルスコープを持たないのはなぜですか?
私はこのコードを書いていました: private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x => x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } そして、コンパイルエラーを見つけて驚いた: 「action」という名前のローカル変数がこのスコープで既に定義されています 解決するのは非常に簡単な問題でした。2番目の要素を取り除くだけでvarうまくいきました。 明らかに宣言された変数caseのブロックは親のスコープを持っているswitchが、私はこれが理由として興味があります。C#は、実行が(それは他のケースを落下することはできませんことを考える必要があり …

26
言語デザイナーに何に注意してもらいたいですか?[閉まっている]
この質問の目的は、それなしでは生きていけない、または選択したメイン言語で望んでいたプログラミング言語機能のランドリーリストを組み立てることではありません。この質問の目的は、ほとんどの言語設計者が考えていないかもしれない言語設計の隅を明らかにすることです。したがって、言語機能Xについて考える代わりに、もう少し哲学的に考えてください。 私の偏見の1つであり、おそらく議論の余地があるかもしれませんが、エンジニアリングのより柔らかい側面(理由と理由)が、より具体的な側面よりも何倍も重要であるということです。たとえば、Rubyは、開発者の幸福を改善するという目標を掲げて設計されました。それが実現したかどうかについてあなたの意見はまちまちかもしれませんが、目標であったという事実は、言語設計の選択のいくつかがその哲学によって影響を受けたことを意味します。 投稿しないでください: 構文フレーム戦争。それに直面しましょう、私たちには好みがあり、言語設計に関係する構文が重要です。私は、emacs vs. VI(最近では多くの人が何も知らない)の性質の壮大な戦いを避けたいだけです。 「機能Xを持たない言語は存在するに値しない」とコメントを入力します。すべてのプログラミング言語が存在する理由は、少なくとも1つあります。良いか悪いかです。 してください行うポスト: 言語デザイナーが見逃していると思われる哲学的アイデア。 実装頻度が低いと思われる技術的概念。それが引き起こす痛みの例を提供してください、そしてあなたがそれが機能するのを好む方法のアイデアがあれば。 希望するものはプラットフォームの共通ライブラリにありましたが、めったにありません。同じトークンがありますが、通常は共通ライブラリにあるものはそうではありません。 すべてのプログラミング言語が適切に実装され、適切に定義されることを望む、組み込みのテスト/アサーション/契約/エラー処理サポートなどの概念的な機能。 私の希望は、これが楽しく刺激的なトピックになることです。 編集: Syntax Flame Warsの意味を明確にしました。特に構文はプログラム言語設計の基本的な部分であるため、構文のすべての議論を避けようとはしていません。

2
4番目と5番目のプログラミング言語の世代とは何ですか?それらはもっとありますか?[閉まっている]
多くの場合、学校/大学レベルで分類されているため、一般的なプログラミング言語(C#、Java、C ++)はすべて第3世代の言語です(マシンの物理部分からの抽象度が高い)。また、アセンブリ言語は第2世代、機械言語は第1世代言語に分類されます。 最初は、SQLは第4世代言語と見なされるべきだと考えていました。これは、SQLがより抽象的であり、ループの詳細からはるかに離れており、より記述的だからです。 今、第4世代と第5世代の言語があることがわかりましたが、プログラミング言語またはテクノロジを第4世代または第5世代の言語として分類する根拠は何ですか? また、第6世代または第7世代の言語もありますか?

7
なぜこれほど多くの言語が値渡しされるのですか?
Cのような明示的なポインター操作がある言語でさえ、常に値で渡されます(参照で渡すことができますが、これはデフォルトの動作ではありません)。 これの利点は何ですか、なぜ多くの言語が値で渡されるのか、なぜ他の言語は参照で渡されるのですか?(私は確信していませんが、Haskellが参照渡しであることを理解しています)。

3
通常、Java開発にはC#/。NETよりも多くのサブクラスが含まれますか?
最近、Androidの開発を検討し始めました。これにより、私はJavaソフトウェア開発の世界に戻ってきました。私が最後にJavaで作業したときは、OOPを(私が思うに)今ほど理解していないことを認めます。 私のキャリアでは主にC#を使用していましたが、継承がJavaとC#を使用する方法に驚くべき違いがあることに気付きました。 C#では、ほとんどの状況で継承を回避できるように思われました。通常、当面のタスクは、.NETフレームワークの具体的なクラスを使用して実現できます。 Javaでは、コードサンプルから収集したものから、Javaフレームワークは多くのインターフェイスまたは抽象クラスを提供し、開発者が実装/拡張することを意図しているようです。 これは、スタイルにまで煮詰めるには大きすぎる違いのようです。この背後にある理由は何ですか?これを理解するまで、きれいなJavaコードを書くことはできないと思います。 また、これはAndroid SDKだけに限定されていますか?これはOOPに対するJava全体のアプローチですか? または別の言い方をすれば、 これら2つの言語の設計について、他の言語よりも多かれ少なかれ継承を使用しているように思われますか? 言語が継承を同一に扱い、私の観察が有効であると仮定すると、これは言語ではなくフレームワーク/ライブラリの設計に関連することを意味します。この種のデザインの動機は何でしょうか?

5
自分の言語を最初にCコードにコンパイルするのが理にかなっているのはいつですか?
独自のプログラミング言語を設計するとき、gccなどの既存のコンパイラを使用してマシンコードを作成できるように、ソースコードを取得してCまたはC ++コードに変換するコンバーターを記述するのはいつ意味がありますか?このアプローチを使用するプロジェクトはありますか?

5
C#とJavaが参照の等価性を「==」のデフォルトとして使用するのはなぜですか?
私はしばらくの間、JavaとC#(および他の言語)がデフォルトでの等価性を参照する理由を熟考してきました==。 私が行うプログラミング(確かにプログラミングの問題のごく一部にすぎません)では、オブジェクトを比較するとき、参照の等価性ではなく、論理的な等価性がほとんど常に必要です。私は、これらの言語の両方が、==論理的な平等性を持ち.ReferenceEquals()、参照の平等性を使用するのではなく、このルートを採用した理由を考えようとしました。 明らかに、参照の等価性を使用することは実装が非常に簡単で、非常に一貫した動作を提供しますが、今日見られるほとんどのプログラミング手法にうまく適合するとは思えません。 論理比較を実装しようとすることの問題について無知に思われたくはありません。また、すべてのクラスで実装する必要があります。また、これらの言語はかなり前に設計されたものであることに気づきましたが、一般的な疑問が残っています。 これにデフォルトを設定することの大きな利点はありますか、それとも単にデフォルトの動作が論理的等価であるべきであり、クラスに論理的等価性が存在しない場合に参照の等価性にデフォルト設定することは妥当と思われますか?

6
なぜプログラミング言語が変数と関数のシャドウ/非表示を許可するのですか?
(などC ++やJava、Pythonなど)で最も人気のあるプログラミングlangugesの多くの概念持って隠しを / シャドーイング、変数や関数の。非表示またはシャドウイングに遭遇したとき、それらはバグを見つけるのが困難な原因であり、これらの言語の機能を使用する必要があることを発見したことはありません。 私には、非表示とシャドウイングを許可しない方が良いと思われます。 誰もがこれらの概念をうまく利用していることを知っていますか? 更新: クラスメンバー(プライベート/保護されたメンバー)のカプセル化について言及していません。

10
Math.Sqrt()が静的関数なのはなぜですか?
静的メソッドとインスタンスメソッドに関する議論Sqrt()では、静的メソッドではなく、数値型のインスタンスメソッドである必要があると常に考えています。何故ですか?それは明らかに価値に作用します。 // looks wrong to me var y = Math.Sqrt(x); // looks better to me var y = x.Sqrt(); 多くの言語にはインスタンスメソッドがあるので、値型にはインスタンスメソッドを含めることができますToString()。 コメントからいくつかの質問に答えるには:なぜ1.Sqrt()合法ではないのですか?1.ToString()です。 一部の言語では値型のメソッドを使用できませんが、一部の言語では使用できます。Java、ECMAScript、C#、Python(__str__(self)定義済み)など、これらについて話します。同じことがceil()、floor()などの他の関数にも当てはまります。

4
.equals()がJavaのクラスにあるのに、なぜ.compareTo()がインターフェイスにあるのですか?
クラス内にあるようなメソッド.compareTo()がComparableインターフェイスにある理由を知りたいです。私には、なぜそのようなメソッドがクラスにないのかはarbitrary意的に思えます。.equalsObject.compareTo()Object を使用する.compareTo()には、目的に応じてComparableインターフェイスを実装し、.compareTo()メソッドを実装します。以下のために.equals()、すべてのクラスから継承するため、この方法は、単に、あなたのクラスのメソッドをオーバーライドしObjectたクラス。 私の質問は、なぜ.compareTo()クラスのようなものではなく、実装するインターフェースのようなメソッドなのObjectですか?同様に、実装されるインターフェースではなく.equals()、クラスのメソッドがなぜObjectですか?

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