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

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

3
Swiftがサブクラスの適切なフィールドを最初に初期化するのはなぜですか?
Swift言語では、インスタンスを初期化するには、そのクラスのすべてのフィールドに入力し、その後でスーパーコンストラクターを呼び出す必要があります。 class Base { var name: String init(name: String) { self.name = name } } class Derived: Base { var number: Int init(name: String, number: Int) { // won't compile if interchange lines self.number = number super.init(name) } } selfフィールドに値を割り当てる前にインスタンスを作成する必要があり、そのコードはチェーンが割り当て後にのみ発生するかのような印象を与えるため、私にとっては逆に思えます。それとは別に、スーパークラスにはサブクラスの導入された属性を読み取る法的な手段がないため、この場合は安全性は考慮されません。 また、JavaScriptのような他の多くの言語や、Swiftのいくらか霊的な祖先であるObjective Cでさえ、アクセスする前selfではなく、アクセスする前にチェーン呼び出しが必要です。 スーパーコンストラクタを呼び出す前にフィールドを定義する必要があるというこの選択の背後にある理由は何ですか?

3
Cの変数の「真の」サイジングはどの程度役に立ちますか?
Cのポジティブな機能(実際にはgcc、clangなどの実装の機能)として常に直感的に私を驚かせた1つのことは、実行時に独自の変数の隣に隠された情報を格納しないという事実です。つまり、たとえば「uint16_t」タイプの変数「x」が必要な場合、「x」が2バイトのスペースしか占有しないことを確認できます(そのタイプなどの非表示の情報は含まれません)。 。)。同様に、100個の整数の配列が必要な場合は、100個の整数と同じ大きさであることを確認できます。 しかし、より多くの私はそれが実際に持っている場合はより多くの私は疑問に思って、この機能のための具体的なユースケースを思い付くしようとしています任意のすべての実用的な利点を。私がこれまでに思いつくことができる唯一のことは明らかにそれがより少ないRAMを必要とするということです。AVRチップなどの限られた環境では、これは間違いなく大きなプラスですが、日常のデスクトップ/サーバーのユースケースでは、それはかなり無関係であるようです。私が考えている別の可能性は、ハードウェアへのアクセス、またはメモリ領域のマッピング(たとえば、VGA出力など)に役立つ/重要である可能性があることです... ... 私の質問:この機能なしでは実装できないか、非常に煩雑にしか実装できない具体的なドメインはありますか? PSより良い名前があるかどうか教えてください!;)

3
名前付き関数を定義するための重複した構文は、言語設計の悪い決定ですか?
私は楽しみのためにプログラミング言語をモデリングしており、構文はScala、特に関数定義に大きく影響されています。 私の言語は、def構文(クラスメソッド)によって定義された関数と値に割り当てられた匿名関数(を使用して作成された)を区別しないため、設計上の問題が発生しました=>- 実装と動作の両方の違いが取り除かれます。 その結果、次の2つの定義は同じ意味になります。 def square(x: Int) = x*x val square = (x: Int) => x*x 後者の形式(即時の無名関数の割り当て)が通常の状況で使用される理由はありません- フォームの代わりにそれを使用することは単に可能defです。 名前付き関数を定義するためにそのような重複した構文を使用すると、言語の直交性やその他の設計上の側面が損なわれますか? メソッドと名前付き関数の短くて直感的な定義(を介してdef)と匿名関数の短い定義(を使用=>)が可能になるため、このソリューションを選択します。 編集:Scala は 2つを区別します。無名関数はdef、Scalaで定義されたメソッドと同じではありません。違いは比較的微妙ですが、以前にリンクした投稿を参照してください。

3
プログラミング言語の設計者がモジュロ演算の結果の符号を決定するときに使用される理論的根拠は何ですか?
通って行く剰余演算(の違いを探索しながら、私が入った大通りremとmod)私が出くわしました: 数学では、剰余演算の結果はユークリッド除算の残りの部分です。ただし、他の規則も可能です。コンピュータと計算機には、数値を保存および表現するさまざまな方法があります。したがって、それらのモジュロ演算の定義は、プログラミング言語や基盤となるハードウェアに依存します。 質問: 通って行くユークリッド除算私は、この操作のremainnderは常に正(または0)であることがわかりました。基盤となるコンピューターハードウェアの制限によって、プログラミング言語の設計者は数学とは異なるものになりますか? すべてのプログラミング言語には、モジュロ演算の結果に応じて符号が付けられる、定義済みまたは未定義のルールがあります。これらのルールを作成する際に採用される根拠は何ですか?基盤となるハードウェアが問題である場合、プログラミング言語とは関係なく、それに応じてルールを変更しないでください。

1
ScalaのXMLリテラルの何が問題になっていますか?
で、この記事、マーティン(言語の頭本町)が書いています: [XMLリテラル]当時は素晴らしいアイデアだと思われていましたが、今では親指のように突出しています。新しい文字列補間スキームを使用すると、すべてのXML処理をライブラリーに入れることができると信じています。これは大きな利益になるはずです。 私自身、言語設計に興味を持っているので、疑問に思っています。なぜ、XMLリテラルを言語に組み込むのが誤りだったと彼は書いているのでしょうか。この機能に関する論争は何ですか?



3
.NETモジュールがモジュールファイル名を名前空間から分離するのはなぜですか?
Schemeプログラミング言語(R6RS標準)の実装では、次のようにモジュールをインポートできます。 (import (abc def xyz)) システムは、ファイルを検索しようとするあなたのスキームモジュールを維持するいくつかのディレクトリです。モジュールのソースコードであり、必要に応じてオンザフライでコンパイルされます。$DIR/abc/def/xyz.sls$DIRxyz.sls Ruby、Python、およびPerlモジュールシステムは、この点で似ています。 一方、C#はもう少し複雑です。 まず、プロジェクトごとに参照する必要があるdllファイルがあります。それぞれを明示的に参照する必要があります。これは言うよりも複雑で、ディレクトリにdllファイルをドロップし、C#に名前でピックアップさせます。 次に、dllのファイル名と、dllによって提供される名前空間との間に1対1の名前の対応はありません。この柔軟性は高く評価できますが、手に負えなくなる可能性もあります。 これを具体的にするために、私がこれを言うときusing abc.def.xyz;、C#がC#がabc/def/xyz.dll参照することを知っている(プロジェクトごとに構成可能)ディレクトリでファイルを見つけようとするとよいでしょう。 Ruby、Python、Perl、Schemeのモジュール処理方法の方がエレガントだと思います。新興言語はより単純な設計で行く傾向があるようです。 .NET / C#の世界が、このようにして、間接レベルをさらに上げているのはなぜですか?

7
オブジェクト指向に必要な機能は何ですか?
言語またはライブラリが「オブジェクト指向」として定義されるために、言語またはライブラリが提供しなければならない機能とは正確には何なのかと思います。オブジェクト指向は、缶は、多かれ少なかれ、中に達成されることを何かである任意のまともな機能を備えた汎用プログラミング言語?それとも、オブジェクト指向プログラミングをサポートしていることを具体的に宣伝している言語でのみ達成できるものですか? たとえば、次のCコードを見てください。 SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE); SDL_FreeSurface( screen ); またはここで説明したコード。 さて、上記のコードは継承、ランタイムポリモーフィズム(?)、仮想関数などを使用していません。しかし、私にはほとんどOOPのようです。 オブジェクト指向は、オブジェクト、クラス、構造体など、プログラミング言語またはライブラリによって提供される特別なパターンや機能を必要としない、作成および破壊可能なデータ構造に基づくコードを単に記述しているのですか?

2
言語設計では1つの数値タイプのみ
私は現在、コンパイラの構築と言語設計について学び、自分の言語でサポートしたいネイティブデータ型について考えています。現在、整数と実数を区別する多くの言語があります。しかし、私は彼が言ったダグラス・クロックフォードによる講演を見たのを覚えています。 システムに単一の数値タイプがあることは、間違った数値タイプを選択してバグを発生させることができないことを意味します 彼はまた、一般的に使用されているIEEE-754とは異なる数値表現をお勧めします(間違っている場合は修正してください)。したがって、私の質問:主に教育に重点を置いている汎用言語の場合、どの数値表現を使用する必要がありますか? 編集:教育的焦点を当てて、私は他の人を教育するためではなく、コンパイラについて学ぶ私の自身の進歩について話しています。

8
SQLの列がデフォルトでnull可能であるという説得力のある理由はありますか?
私はCSの学生として、長年にわたってまともな数のプログラミング言語を学びました。そのほとんどは、「null可能」または「オプション」タイプの概念を持っています。ここでは、nullポインターや参照、JavaScriptのような弱く型付けされた言語については触れていませんnull。私が話していることの例には、boost::optional(C ++)、java.util.Optional(Java 8.0)、prelude.Maybe(Haskell)、およびすべての「?」種類(例えばint?、float?、C#やKotlin)。これらは、厳密な静的型システム内で、以前はnullにすることができなかった型にnullの可能性を追加する構成体です。 SQLにも同様の概念があります。たとえば、INTEGERnull可能またはnull不可にできるような型ですが、ひねりがあります。SQLでは、INTEGERデフォルトでnull可能であり、null INTEGER NOT NULL不可になるように明示的に記述する必要があります。 NULLをデフォルトの動作にすることを許可することは非常に直観に反し、潜在的に危険であると私は思います。明らかに、SQLはこの時点で非常に長い間存在しており、(ほとんどの)SQL開発者はNULLの落とし穴について健全な認識を築いています。しかし、私は仕方がないのですが、初期の頃、NULLが予期せず問題のある場所に忍び込んでいたことを想像してみてください。 SQLは私が提供したすべての例よりも古いため、これは単に歴史的な進化の問題である可能性があります。それでも、私は尋ねなければなりません、言語がこのように設計され、型がデフォルトでnull可能であるという正当な理由はありますか? もしそうなら、それは単なる歴史的な理由でしょうか、それとも今日のデータベース設計にロジックは耐えますか? 編集:なぜNULLがSQLの一部であるのか、またはNULL可能列がなぜ有用なのかは尋ねていません。列がデフォルトで null可能である理由を尋ねています。たとえば、次のように書くのはなぜですか。 column1 FLOAT, column2 FLOAT NOT NULL のではなく: column1 FLOAT NULLABLE, column2 FLOAT

2
Cが同じ変数の複数のグローバル宣言を許可し、複数のローカル宣言を許可しないのはなぜですか?
グローバル変数を複数回宣言すると、コンパイラは警告を出力しません。 ただし、たとえば関数内でローカル変数を複数回宣言すると、gccコンパイラーはエラーを出力し、ファイルをコンパイルしません。(私はgccに関して質問しますが、これはより一般的な言語設計の質問であり、gccについての質問ではありません。他のコンパイラーが同様に動作する可能性があるためです)。 この動作の説明は何ですか?

1
JSにコンパイルされた言語–同期式の待機を行う最もエレガントな方法
JavaScriptにコンパイルする(まだ別の)言語を作成しようとしています。私が持たせたい機能の1つは、JavaScriptの非同期操作を同期的に(正確には同期ではなく、もちろんメインスレッドをブロックせずに)実行できることです。より少ない話、より多くの例: /* These two snippets should do exactly the same thing */ // the js way var url = 'file.txt'; fetch(url) .then(function (data) { data = "(" + data + ")"; return sendToServer(data); }).then(function (response) { console.log(response); }); // synchronous-like way var url = 'file.txt'; var response = sendToServer("(" + …

4
Javaの配列がequals()をオーバーライドしないのはなぜですか?
私はHashSet先日、これを仕様書に書いているので作業していました: [add()]このセットに要素e2が含まれていない場合、指定された要素eをこのセットに追加します(e == null?e2 == null:e.equals(e2))。 私が使っていたchar[]中でHashSet、私は、この契約に基づいて、以下のことを実現するまで、それはよりも良いではなかったですArrayList!オーバーライドされていないを使用しているため.equals()、私の配列は参照の等価性のみがチェックされますが、これは特に有用ではありません。私はそれArrays.equals()が存在することを知っていますが、などのコレクションを使用しているときは役に立ちませんHashSet。 だから私の質問は、Java配列が等号をオーバーライドしないのはなぜですか?

3
文法、レクサー、パーサーに関する説明
背景情報(5月スキップ):提供されているDSLの文法を設計する必要があるuniで設定されたタスクに取り組んでいます。文法はBNFまたはEBNFでなければなりません。他にも、文法の語彙ルールと構文解析ルールについて評価されています。たとえば、ルールが言語サブセットに適しているかどうか、これらのルールがどれほど包括的であるか、ルールがどれほど明確であるかなどです。 私が理解していないのは、これらのルールがBNFで定義された文法でカバーされているかどうかです(これは私たちにとって新しいトピックです)。 質問:BNFまたはEBNFのいずれかで定義されている特定の言語の文法には、字句解析 または構文解析、あるいはその両方のルールが含まれていますか?(またはこれらは他の場所で指定する必要がありますか?) また、何が字句規則と考えられますか?そして、何が解析ルールと考えられますか?

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