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

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

9
セルフホスティングコンパイラが新しい言語の通過儀礼と見なされるのはなぜですか?
尊敬に値するために、言語がセルフホスティングコンパイラを使用するか、少なくとも持っていることを人々が期待していると、今では多くの場所で聞いています。 これがなぜなのか興味があります。コンパイラは書くべき非常に重要なソフトウェアのようであり、すべての言語がそれらを作成するのに適しているわけではないと思います。より良い結果をもたらす何かに努力を費やす方が理にかなっていますか?

5
LispでLispインタープリターを勉強することがなぜそんなに重要なのですか?
私は、特にlispで書かれたLispインタープリターを研究することを志望するプログラマーに求める新しいプログラマーのための多くのCSカリキュラムと学習提案を見てきました。これらのサイトはすべて、「その知的な啓示」、「すべての真面目なプログラマーが持つべき啓発体験」、「ハードウェアとソフトウェアの関係を示す」、その他の曖昧な声明、特にこの記事からこの評判の高いハウツー。 私の質問の一般的な感情は、Lispが上記の目標をどのように達成し、なぜLispを達成するのかということです。他の言語はなぜですか? Schemeでスキームインタプリタの記述を終えたばかりなので(SICP http://mitpress.mit.edu/sicp/から取得)、現在スキームでPythonインタプリタを記述しており、この伝説的なエピファニーを得るのに苦労しているため、これを求めています。それは前者から具体的に来ることになっています。プログラムの仕組みを理解するために、スキームインタープリターで活用できる2つの言語間の特定の技術的な詳細を探しています。 すなわち: 解釈する言語で書かれた通訳者の研究が強調されているのはなぜですか?元の言語と構築された言語をまっすぐに保つのは単に素晴らしい精神的な運動ですか、それともその性質でしか解決できない特定の問題がありますか?元の言語? Lispインタプリタは、将来のソフトウェア設計のために優れたアーキテクチャの概念をどのように実証しますか? この演習をC ++やJavaなどの別の言語で行った場合、何が恋しいですか? 何が最も使用され、この運動からテイクアウトや「精神的なツールが」?** ** このエクササイズから、他のどのツールよりも頭の中で解析ツールを設計するスキルが得られていることに気付いたので、答えを選択しました。スキームに適した異なる解析方法を見つけたいと思います。 Pythonインタープリターよりもインタープリター。

3
Kotlinに静的キーワードがないのはなぜですか?
Kotlinは主にJavaのドロップイン置換として知られていますが、よく知られているJava構成要素であるstaticキーワードを取り除きます。代わりに、そのクラスレベルの機能は、主にコンパニオンオブジェクトによって提供されます。 コンパニオンオブジェクトがより良い代替を提供する静的メソッドとフィールドの何が問題になっていますか?私は理論的根拠について混乱しており、ドキュメンテーションで説明を見つけることができませんでした。


9
ほとんどの「よく知られた」命令型/オブジェクト指向言語が、「何もない」値を表すことができる型への未チェックのアクセスを許可するのはなぜですか?
null(たとえば)の代わりに持つことの(不)利便性について読んでいMaybeます。この記事を読んだ後、私はそれを使用する方がはるかに良いと確信していますMaybe(または同様のもの)。しかし、すべての「よく知られた」命令型またはオブジェクト指向プログラミング言語がまだ使用しておりnull(「何もしない」値を表すことができる型への未チェックのアクセスを許可します)、そしてMaybeほとんどが関数型プログラミング言語で使用されていることに驚いています。 例として、次のC#コードを見てください。 void doSomething(string username) { // Check that username is not null // Do something } ここで何か悪臭がします...引数がnullかどうかを確認する必要があるのはなぜですか?すべての変数にオブジェクトへの参照が含まれると仮定すべきではありませんか?ご覧のとおり、問題は、定義上、ほとんどすべての変数にnull参照が含まれている可能性があることです。どの変数が「null可能」で、どれがそうでないかを判断できたらどうでしょうか。これにより、デバッグと「NullReferenceException」の検索中に多くの労力を節約できます。デフォルトでは、null参照を含むことができる型はないことを想像してください。その代わりに、本当に必要な場合にのみ、変数にnull参照を含めることができると明示的に述べます。それが多分背後にある考え方です。場合によっては失敗する関数(ゼロ除算など)がある場合は、Maybe<int>、結果がintである可能性があることを明示的に示しますが、何もありません!これは、nullではなくMaybeを好む理由の1つです。他の例に興味がある場合は、この記事を読むことをお勧めします。 事実は、ほとんどの型をデフォルトでNULL可能にするという欠点にもかかわらず、ほとんどのオブジェクト指向プログラミング言語は実際にそれをNULL可能にします。それが私が疑問に思う理由です: nullプログラミング言語ではなく、どのような引数を実装する必要がありMaybeますか?理由はありますか、それとも単に「歴史的な荷物」ですか? この質問に答える前に、nullとMaybeの違いを理解してください。

16
言語構文について書いています。メソッド名の中にパラメータが配置される言語はありますか?
JavaScriptで: function getTopCustomersOfTheYear(howManyCustomers, whichYear) { // Some code here. } getTopCustomersOfTheYear(50, 2010); C#の場合: public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers, int whichYear) { // Some code here } List<Customer> customers = GetTopCustomersOfTheYear(50, 2010); PHPの場合: public function getTopCustomersOfTheYear($howManyCustomers, $whichYear) { // Some code here } $customers = getTopCustomersOfTheYear(50, 2010); この構文をサポートする言語はありますか? function GetTop(x)CustomersOfTheYear(y) { // …

30
プログラミング言語で直面した最大の設計上の欠陥は何ですか?[閉まっている]
すべてのプログラミング言語に設計上の欠陥があるのは、他のほとんどの(すべて?)それはさておき、プログラミング言語のどの設計上の欠陥がプログラマとしてのあなたの歴史を通してあなたを最も悩ませましたか? 特定の目的のために設計されていないという理由だけで言語が「悪い」場合は、設計上の欠陥ではなく、設計の機能なので、そのような煩わしさを挙げないでください。言語がその設計目的に適していない場合、それはもちろん設計の欠陥です。実装固有のことや内部的なことも考慮されません。

4
プログラミング言語は関数をどのように定義しますか?
プログラミング言語は、関数/メソッドをどのように定義して保存しますか?Rubyでインタープリター型プログラミング言語を作成しています。関数宣言の実装方法を見つけようとしています。 私の最初のアイデアは、宣言の内容をマップに保存することです。たとえば、次のようなことをした場合 def a() { callSomething(); x += 5; } 次に、マップにエントリを追加します。 { 'a' => 'callSomething(); x += 5;' } これの問題はparse、文字列に対してメソッドを呼び出す必要があるため再帰的になり、parse遭遇したときに再度呼び出す必要がありdoSomething、最終的にスタックスペースが不足することです。 では、インタープリター言語はこれをどのように処理しますか?

3
F#でrecキーワードが必要なのはなぜですか?
F#では、recキーワードを使用する必要があります。Haskellでは、特定の関数が再帰的であるかどうかを明示的に伝える必要はありません。 関数型プログラミングにおける再帰の役割を考えると、F#の設計はかなり奇妙に思えます。それは良い言語設計の決定ですか、それとも歴史的な理由または実装の制約のためにのみ存在しますか?

16
浮動小数点の落とし穴を避けるために、プログラミング言語に何ができるでしょうか?
浮動小数点演算とその欠点の誤解は、プログラミングにおける驚きと混乱の主な原因です(「数値が正しく加算されない」に関するスタックオーバーフローの質問の数を考慮してください)。多くのプログラマーがその意味をまだ理解していないことを考慮すると、多くの微妙なバグを(特に金融ソフトウェアに)導入する可能性があります。精度があるもののために重要ではないとき、まだその速度を提供しながら、プログラミング言語は、概念に慣れていないもののためにその落とし穴を避けるために何ができるん概念を理解できますか?

6
基本型(intなど)をクラスとして実装する場合の注意点は何ですか?
オブジェクト指向プログラミング言語を設計し、implentingすると、いくつかの点で1が基本型(のような実装の選択をする必要がありint、float、doubleクラスまたは何か他のものとして、または同等の)。明らかに、Cファミリーの言語はそれらをクラスとして定義しない傾向があります(Javaには特別なプリミティブ型があり、C#はそれらを不変の構造体として実装します)。 基本型が(統一された階層を持つ型システムで)クラスとして実装される場合、非常に重要な利点を考えることができます。これらの型は、ルート型の適切なLiskovサブタイプになります。したがって、ボクシング/アンボクシング(明示的または暗黙的)、ラッパータイプ、特別な分散ルール、特別な動作などで言語を複雑にすることは避けます。 もちろん、言語デザイナーがその方法を決定する理由を部分的に理解することができます:クラスインスタンスは、空間のオーバーヘッドを持っている傾向がある(インスタンスのメモリレイアウトにvtableまたはその他のメタデータが含まれている可能性があるため) have(言語がそれらの継承を許可しない場合) 基本型がクラスではないことが多いのは、空間効率(および特に大きな配列での空間的局所性の向上)だけですか? 私は一般的に答えがイエスであると仮定しましたが、コンパイラにはエスケープ分析アルゴリズムがあり、インスタンス(基本タイプだけでなく任意のインスタンス)が厳密に証明されたときに空間的オーバーヘッドを(選択的に)省略できるかどうかを推測できます地元。 上記は間違っていますか、それとも私が見逃しているものがありますか?

10
すべての関数呼び出し/ブロックが個別のスレッドで実行されるプログラミング言語?[閉まっている]
私は現在、すべての関数呼び出し/新しいブロック(if句、ループなど)が別のスレッドで動作するという考え方で、楽しみのためにプログラミング言語を作成しています。新しいスレッドを作成する代わりに、標準では自動的にそれを行う必要があります。メインスレッドで実行する場合は、それを指定する必要があります。 私はマルチスレッドの並列プログラミングについて知らされていませんが、基本(未来、スレッドセーフオブジェクト)は知っています。したがって、そのような言語がどのように構文的に賢く見えるのか、そもそも可能であるのかと疑問に思っています 目標は、それを「有用」にすることではなく、それを楽しむことと学習体験のためのものです。 (投稿する場所が間違っている場合は申し訳ありません。もしそうであれば、私のような質問が許可されている適切な場所を教えていただければ幸いです。)


9
最小限の開発アプローチに従うプログラミング言語はありますか?
言語が商用ソフトウェアと同じと見なされる場合、新しいリリースを正当化するために常に新しい機能を追加する必要が常にあることがわかります。 バージョン1.0が最終バージョンである言語は存在しますか、または存在しますか?もちろん、バグ修正はこれを免除されますが、機能セットは常に同じままですか? この方法では、言語のすべての機能がうまく適合し、後方互換性のために廃止された機能がまだ残っているという事実の後にボルトで固定されているようには見えません。 いくつかの学術言語はこのようなものだと思いますか?しかし、この考えに従って商業的に成功した言語はありますか?付属のライブラリも新しい機能を無料で入手できますが、言語は常に一定です。 私が挙げることができる一例は、私がよく使用するお気に入りの言語C#の1つです。リリースごとにますます多くの機能が追加されています。これらを活用するには、些細な概念を取り上げてそれらを組み合わせてより複雑な問題を簡単に解決するのではなく、実際のタスクを手元に落とし、これらの学習にかなりの時間を費やさなければなりません。 だから私は、すべてが一貫し、理にかなっており、可能な限り直交するミニマリストのアプローチを探していると思います。

5
C ++ヘッダーファイルが嫌いな場合はどうすればよいですか?
私はいつもヘッダーファイルについて混乱していた。それらはとても奇妙です。.cppを含まない.hファイルをインクルードしますが、.cppも何らかの方法でコンパイルされます。 最近、私はチームプロジェクトに参加しました。もちろん、.hと.cppの両方が使用されます。 これが非常に重要であることは理解していますが、複数のクラスのそれぞれにあるすべての関数宣言をコピーアンドペーストすることはできません。 2ファイルの規則を効率的に処理するにはどうすればよいですか? それを支援するツールはありますか、または以下の例のような1つのファイルを.hと.cppに自動的に変更しますか?(特にMS VC ++ 2010の場合) class A { ... Type f(Type a,Type b) { //implementation here, not in another file! } ... }; Type f(Type a) { //implementation here } ...

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