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

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

13
データベースが言語機能として統合されないのはなぜですか?
外部SQL(または他の)データベースに接続するのではなく、一流の言語機能として組み込みデータベースを備えたプログラミング言語はありますか?そのような機能の欠点と利点は何ですか?そのような機能はどのように見え、プログラムの方法をどのように変えるでしょうか?

7
「Set」にはGetメソッドが必要ですか?
このC#クラスを作成しましょう(Javaでもほぼ同じです)。 public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

2
なぜScalaには戻りがあるが、壊れて継続しないのか
Scalaにはbreakor はありませんcontinue。そのため、ループの動作にはもう少し考えが必要です。 ループを早期に終了するには、末尾再帰、例外、またはscala.util.control.Breaks(例外を使用する)が必要です。 この理由は、のようにgoto、それらが流れを不明瞭にする流れの構造であり、より良く、驚くほどではない方法で達成できるということです。 しかし、それらと同じ引数を使用できるようですreturn。 なぜScalaはを意図的に省略breakしましたcontinueが、そうではなかったのreturnですか?

4
依存性注入専用に設計されたプログラミング言語はありますか?
多くの一般的なプログラミング言語は、依存性注入をサポートできるほど柔軟です。ライブラリまたはフレームワークのサポートがなくても。しかし、プログラミングの問題を解決するのに十分な言語がチューリングである場合でも、言語は、その中で簡単なことと困難なことに影響を与える選択を行います。 依存関係の注入を簡単にし、逆に隠された依存関係を作成しにくくするために特別に設計された言語はありますか? 明確化: 一部の言語の制限(Javaを見る)のために、多くの人々は依存関係注入の一部として配線と構築の支援を考えています。ここでは、依存関係が副作用で簡単に隠されないことを意味するために、DI用に設計された言語のみを意図しています。構成システムに対する規約も同様に追加されるのは、肉汁だけです。 私は言語の推奨を探していません。これは歴史的な問題です。言語作成者はこれを明示的に始めたことがありますか?

1
Goは「暗黙の」インターフェースで生産性をどのように改善しますか。また、C#の拡張メソッドの概念と比較してどうですか。
Go言語のチュートリアルでは、インターフェイスの仕組みについて説明しています。 Goにはクラスがありません。ただし、構造体型のメソッドを定義できます。メソッドのレシーバは、 FUNCキーワードとメソッド名の間に独自の引数リストに表示されます。 type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } インターフェイスタイプは、一連のメソッドによって定義されます。インターフェイスタイプの値は、これらのメソッドを実装する任意の値を保持できます。 これは、Goでインターフェイスを作成する唯一の方法です。Googleはさらに次のように説明しています。 型は、メソッドを実装することによりインターフェースを実装します。意図の明示的な宣言はありません[ interface宣言]。 暗黙的なインターフェースは、実装パッケージをインターフェースを定義するパッケージから分離します。どちらも他に依存しません。 また、すべての実装を見つけて新しいインターフェイス名でタグ付けする必要がないため、正確なインターフェイスの定義も推奨されます。 これはすべて、Goのメソッドが容赦なく多態的であることを除いて、C#の拡張メソッドに似ています。それらは、それらを実装する任意のタイプで動作します。 Googleは、これが急速な開発を促進すると主張していますが、なぜですか?C#の明示的なインターフェイスから離れることで何かをあきらめますか?C#の拡張メソッドにより、GoインターフェイスがC#に持つ利点のいくつかを引き出すことができますか?
21 c#  language-design  go 

13
データ構造を言語に統合する(Pythonなど)か、標準ライブラリに提供する(Javaなど)必要がありますか?
Pythonおよび他の多くのプログラミング言語では、共通のデータ構造は、専用の構文を持つコア言語の統合された部分として見つけることができます。LISPの統合リスト構文を別にすれば、配列の上の何らかのデータ構造を構文の統合部分として提供する他のどの言語も考えられません。標準ライブラリでそれらを提供するようです。 言語設計の観点から、コア言語のデータ構造に特定の構文を使用することについてのあなたの意見は何ですか?それは良い考えですか、そして言語の目的(など)は、これがどれほど良い選択であるかを変えますか? 編集:(明らかに)私が意味するデータ構造についての混乱を引き起こしてすみません。基本的で一般的に使用されるものについて説明しますが、それでも最も基本的なものではありません。これには、ツリー(複雑すぎる、珍しい)、スタック(あまり使用されない)、配列(単純すぎる)は含まれませんが、セット、リスト、ハッシュマップなどが含まれます。

2
パッケージとモジュールがJava 9で別個の概念である理由
Java 9には、パッケージに加えてモジュールがあります。通常、言語にはどちらか一方があります。そして、ほとんどのプログラマーは 2つの用語を同義語として認識しています。モジュールはパッケージの上に構築され、それらをプリミティブとして扱います。複合パターンは、プリミティブと複合物を均一に処理することを提案します。そうしないと、悪いことが起こります。たとえば、プロジェクトValhallaを見てください。そこでは、プリミティブ(値)および参照型の共通スーパータイプを後付けしようとしています。 モジュールとパッケージは意味的に分離した概念を表していますか?それを意味することの両方を持つことが賢明である任意の言語(関心事の分離)。または、Javaは後方互換性への賛辞として両方を持たなければなりませんか? 既存の概念を補強するのではなく、なぜ新しい概念を導入するのですか? JSR 376:プロジェクトJigsaw内に実装された「Javaプラットフォームモジュールシステム」。 SOTMSによると モジュールは、コードとデータの名前付きの自己記述型コレクションです。そのコードは、Javaクラスとインターフェースなどのタイプを含むパッケージのセットとして編成されています。そのデータには、リソースおよびその他の種類の静的情報が含まれます。 JLSは、パッケージとは何かを定義することを慎重に避けます。ウィキペディアから: Javaパッケージは、JavaクラスをModulaのモジュールに似た名前空間に編成するための手法で、Javaでのモジュール式プログラミングを提供します。 ウィキペディアを引用するのは悪い習慣であることは知っていますが、それは一般的な理解を反映しています。モジュラープログラミングのエントリから: パッケージという用語は、モジュールの代わりに使用されることがあります(Dart、Go、またはJavaなど)。他の実装では、これは明確な概念です。Pythonではパッケージはモジュールのコレクションですが、今後のJava 9では新しいモジュールの概念(強化されたアクセス制御を備えたパッケージのコレクション)の導入が計画されています。

6
超高レベルの言語はありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 歴史的に、HLLはC、FortranまたはPascalのようなものであり、VHLLはRubyまたはPythonのようなものです。私は4GL、5GL、DSL、LOPという用語に精通しており、定義についてはウィキペディアを読むべきではありません。UHLLを探しています。 私の質問は、生産性が一桁以上高いコンピューター言語がありますか? 生産性が高いということは、オーサリングされたコードが少なくなり、結果を達成するプログラマの時間が減り、バグやデバッグが減り、コードと要件の概念的リンクが密接になり、変更と保守の労力が減るということです。 私が興味を持っている主なドメインは、GUIまたはブラウザのフロントエンド、データの永続性、および印刷や電子メールなどの他のシステムへの接続を備えた汎用のビジネスおよびコンシューマアプリケーションです。他の人は他の場所に集中するかもしれません。 これらの言語の一部はドメイン固有である可能性があり、それらは大規模で機能的なアプリケーションの構成機能にすぎない可能性があることを認識しています。Excelスプレッドシートはこのカテゴリに分類されます。 これらの言語の一部は一般的に見えるかもしれませんが、それでも範囲が狭く、多くの問題に適さない可能性があることを認識しています。たとえば、Matlabは、主にユーザーインタラクションとテキストデータを扱うプログラムには適していません。 VHLLとの類推によって、UHLLにあるかもしれない機能のいくつかを知っています。次の1つ以上を見つけることを期待しています(そして、リストに自由に追加してください)。 GUIフォームの描画は、GUIフォームのプログラムです 行、列、ヘッダーを含むテーブルは、データベース内のテーブルのプログラムです 宣言ロジックは、IFステートメントなしで、何をいつ実行するかを指示します FORループなしのデータセットの操作 データ駆動、パターンマッチング、ツリーウォーキングなどの非順次実行 この質問の動機は、比較的単純なビジネス要件を大量のコードに変換して、コンピューターが望むものや必要なものを提供するという大変な努力にますます飽き飽きしていることです。問題は、私の痛みを分かち合い、言語のレベルを上げ、コンピューターにもっと多くのハードワークをさせることに取り組んでいる他の人を見つけることです。これは1970年代から80年代の主要な焦点でしたが、まだ起こっていますか? これらは私の質問に対するいくつかの提案された回答であり、私が知っている言語を要約または列挙するためにここに提供されており、私の見解ではどれが足りないかです。 HLLまたはVHLLであり、より高いレベルに属する個々の機能を含む多くの言語があります。私はそれらのほとんどを使用しました(しばしばひどく)。彼らが含まれます マクロと自己変更機能を備えたLisp Haskell、データ依存性とパターンマッチング 行とテーブルを扱うSQL Rebol、それは賢いようですが、私は本当にそれを取得しません APL(およびJ)、その多次元配列と超小型演算子 LINQを使用したC# 素晴らしいコレクションと正規表現が組み込まれたAWK / Perl / Python / Ruby これらの言語には低レベルの機能が多すぎてUHLLにはなりません。プログラマーは、有用なプログラムのために、多くの低レベルの構成体を作成する必要があります。 RAD / 4GLパッケージがあります。私はいくつかを使用しました: dBase / Foxpro Dataflex / Powerflex(私の製品) アクセス PowerBuilder そして、私が使ったことのないものがたくさんあります。ほとんどの場合、言語はせいぜいHLLですが、パッケージにはフレームワークが含まれており、言語とパッケージ間の特権接続が含まれているため、アプリケーションを迅速に構築できます。なぜこのアプローチが蒸気を使い果たしたのかはわかりませんが、いずれにしてもUHLLはそうではありません。 生のフレームワーク/ライブラリがあります。私はいくつか使用しました: …

3
なぜ論理演算子(||、&&など)の複合代入演算子がないのですか?
この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 6年前に移行され ました。 ECMA-262、パート11.13によると、複合割り当て演算子の完全なリストは次のとおりです*= /= %= += -= <<= >>= >>>= &= ^= |=。 パート11.11によると、var c = a || b置くaに値をc場合はToBoolean(a)trueで、入れますbに値をcそれ以外の場合は。そのため、論理ORは合体演算子としてよく使用されます。たとえば、 function (options) { options = options || {}; } 多くの場合、上記のように、合体を使用して変数のデフォルト値を指定しますa = a || b。 複合代入演算子||=は非常に便利で、上記のコードを短く簡潔に書くことができますa ||= b。ただし、そこにはありません(ただし*=、+=および他の複合代入演算子はあります)。 問題は、なぜですか?

7
Javaに異なるサイズの数値のプリミティブがあるのはなぜですか?
Javaではプリミティブ型がありbyte、short、intとlongとのために同じものfloatとdouble。プリミティブ値に使用するバイト数を設定する必要があるのはなぜですか?渡される数値の大きさに応じて、サイズを動的に決定することはできませんでしたか? 私が考えることができる2つの理由があります: データのサイズを動的に設定することは、動的に変更できる必要があることを意味します。これにより、パフォーマンスの問題が発生する可能性がありますか? おそらくプログラマーは、誰かが特定のサイズよりも大きな数を使用できるようにしたくないでしょう。これにより、制限することができます。 私はまだ、シングルintとfloatタイプを使用するシンプルな方法で多くのことが得られたと思いますが、Javaがこの方法を採用しないことに決めた特別な理由はありましたか?

2
C#にnew()制約があるのに、他の同様の制約がないのはなぜですか?
C#ジェネリックでは、と言うことで、型パラメーターの制約を宣言Tしてデフォルトコンストラクターを持たせることができますwhere T : new()。ただし、このような他の種類の制約は有効ではありません- new(string)たとえば、など 言語設計および/または実装の観点から、この理由は何ですか? コンストラクタの動作方法や、これを禁止する(または少なくとも難しくする)型システムの実装方法に何かありますか?もしそうなら、それは何ですか?default(T)実際にコンパイルさnew T()れた場所を読んだことを思い出しT : structます。これと関係があるのでしょうか? それとも、言語が複雑になりすぎないようにするために、単に設計上の決定を下しただけですか?

8
x = x ++が未定義なのはなぜですか?
xシーケンスポイント間で2回変更されるため、未定義です。標準では、定義されていないため、定義されていません。 それだけ知っています。 しかし、なぜ? 私の理解では、これを禁止することで、コンパイラーの最適化が向上します。Cが発明されたとき、これは理にかなっていたかもしれませんが、今は弱い議論のように思えます。 今日Cを再発明する場合、この方法でそれを行うのでしょうか、それとももっと良くすることができますか? または、より深い問題があり、そのような式に一貫したルールを定義するのが難しくなるので、それらを禁止するのが最善ですか? したがって、今日Cを再発明するとします。のような式の単純なルールを提案したいのx=x++ですが、これは既存のルールよりもうまく機能しているように思えます。 提案されたルールを既存のルールと比較したり、他の提案について意見を聞きたいと思います。 推奨ルール: シーケンスポイント間では、評価の順序は指定されていません。 副作用はすぐに起こります。 関連する未定義の動作はありません。式はこの値またはそれを評価しますが、確かにハードディスクをフォーマットしません(奇妙なことに、x=x++ハードディスクをフォーマットする実装を見たことはありません)。 式の例 x=x++-明確に定義され、変更されませんx。 最初に、x(x++評価されるとすぐに)インクリメントされ、次に古い値がに保存されxます。 x++ + ++x-2 x回インクリメントし、評価され2*x+2ます。 どちらかの側が最初に評価されますが、結果はx + (x+2)(左側が最初)または(x+1) + (x+1)(右側が最初)です。 x = x + (x=3)-指定なし、またはにx設定。 右側が最初に評価される場合、それはです。最初に評価される可能性もあるため、です。どちらの場合でも、評価は評価されるとすぐに行われるため、保存されている値は他の割り当てによって上書きされます。x+36x+3x=33+3x=3x=3 x+=(x=3)-明確に定義され、x6 に設定されます。 これは、上記の表現の単なる省略形であると言えます。 ただし、2つの部分(読み取り、評価、追加、新しい値の保存)ではなく、の+=後x=3に実行する必要があります。xx=3 利点は何ですか? いくつかのコメントはこの良い点を提起しました。 私は確かに、そのような表現x=x++は通常のコードで使用されるべきだとは思いません。 実は、私ははるかに厳しいものよりだ-私はのための唯一の良い使い方を考えるx++ようでx++;一人で。 ただし、言語のルールはできるだけシンプルでなければなりません。それ以外の場合、プログラマーはそれらを理解しません。シーケンスポイント間で変数を2回変更することを禁止する規則は、ほとんどのプログラマーが理解していない規則です。 非常に基本的なルールは次のとおり です。Aが有効で、Bが有効であり、それらが有効な方法で結合されている場合、結果は有効です。 xは有効なL値でx++あり、有効な式であり=、L値と式を組み合わせる有効な方法x=x++です。 C標準はここで例外を作成し、この例外はルールを複雑にします。stackoverflow.comを検索して、この例外がユーザーをどれほど混乱させるかを確認できます。 だから私は言う-この混乱を取り除く。 ===回答の要約=== どうしてですか? 上記のセクションで説明しようとしました-Cルールをシンプルにしたいのです。 最適化の可能性: これはコンパイラーからある程度の自由を奪いますが、それが重要であると私に納得させるものは見ませんでした。 ほとんどの最適化は引き続き実行できます。たとえばa=3;b=5;、標準で順序が指定されていても、並べ替えることができます。などの式もa=b[i++]同様に最適化できます。 …

3
Javaおよび.NET:異なるソートアルゴリズムがデフォルトで使用される理由
デフォルトで異なるソートアルゴリズムJavaを.NET Framework使用する理由と疑問に思います。 Java Array.Sort()では、デフォルトでMerge Sortアルゴリズムを使用し、Wikipedia.comが次のように述べています。 Javaでは、Arrays.sort()メソッドは、データ型に応じてマージソートまたは調整されたクイックソートを使用し、実装効率のために7つ未満の配列要素がソートされている場合は挿入ソートに切り替えます .NET Framework Array.Sort/List.Sort()では、クイックソートをデフォルトのソートアルゴリズムとして使用します(MSDN): List.Sort()は、QuickSortアルゴリズムを使用するArray.Sortを使用します。この実装は、不安定なソートを実行します。つまり、2つの要素が等しい場合、それらの順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。 優れた「アルゴリズムの比較」表を見ると、両方のアルゴリズムの動作がワーストケースとメモリ使用量の観点からかなり異なっていることがわかります。 どちらJavaと.NETエンタープライズ・ソリューション開発のための素晴らしいフレームワークです、両方が組込み開発のためのプラットフォームを持っています。では、なぜ彼らはデフォルトで異なるソートアルゴリズムを使用しているのでしょうか?

6
C ++のインライン関数。ポイントは何ですか?
私が読んだことによると、コンパイラーはインライン関数の関数呼び出しをその本体で置き換える義務はありませんが、可能であれば置き換えます。これは私に考えさせられました-それが事実である場合、なぜ私たちはインラインワードを持っていますか?デフォルトですべての関数をインライン関数にして、呼び出しを関数本体で置き換えることができるかどうかをコンパイラーに判断させてみませんか?

10
Java開発者はScalaについてどう思いますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 IDEのサポートはそれほど良いものではありませんが、言語自体は関数型プログラミングのイディオムをよりきれいにサポートしています。

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