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

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

4
JavaScriptで正確に未定義とはどういう意味ですか?なぜそこにあるのですか?どのような用途がありますか?どのように役立つのでしょうか?
JavaScriptには、undefinedと呼ばれるものがあります。基本クラスなのか、組み込み変数なのか、キーワードなのか、他の何かなのか本当にわからないからです。そこにあることを知っているだけです。 動作を確認するには、次のように書くだけです。 undefined; typeof undefined; この理由は誰も私に説明していただけます事は JavaScriptを挿入されていますか?nullこの言語には価値があるため、のようなものであってはなりませんnull。他の言語では、プロパティまたは変数の値がわからない場合、単にnullに設定します。ここでも同じことができます。 JavaScriptでこのことをどのように使用できますか?

2
言語開発フレームワークの使用はどれくらい簡単ですか?
これは、フレームワークの形式で言語設計で使用される概念を抽象化することを目的とする抽象化プロジェクトと呼ばれるプロジェクトに焦点を当てた一連の質問の一部です。 構造タイピングに関連する別のページは、ここで表示できます。フレームワークに関する質問と投稿する適切な場所に関連するメタトピックは、ここにあります。 言語開発フレームワークを使用するのはどれくらい簡単ですか? 大規模なコード生成フレームワークを作成しました。このフレームワークには、言語固有のコンパイラーに結果を送信する機能も含まれています。使いやすさのトピックは、そのようなフレームワークの例の1つです。CodeDOM、またはCode Document Object Modelです。 マイクロソフトによって書かれたフレームワークであり、一般的なコード構造を記述しますが、一般に多くのことを省き(式強制)、特定の構成体の表現では少し抽象的である傾向がありました。 CodeDOM は、使用されるタイプが汎用インターフェイスである場合、PrivateImplementationTypeonの発行を適切に処理しませんCodeMemberMethodでした。CodeDOMは、最初のコードジェネレーターを作成した最初の理由でした。 フレームワークを簡素化するために私がやろうとしていることの1つは、何かをするために必要な作業量を減らし、アクションとそれらのアクションを構成する特定のタイプに焦点を当てることです。 ここに、私が書いているフレームワークがどのように機能するかを並べて比較します。 //Truncated... /* * * From a project that generates a lexer, this is the * state->state transition character range selection logic. * */ var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference())); //... char start = rangeElement.B.Value.Start; char end = rangeElement.B.Value.End; …

5
ファーストクラス機能
今週末、私は真剣にLispに目を向け始めました(つまり、Lispを学習しているだけで、C#のプロジェクトに戻らないことを意味します)。私は他の関数型言語(F#、Haskell、Erlang)に手を出したことがありますが、Lispから得られた魅力を感じていません。 Lispを学び続けると、なぜ非関数型言語が一流の関数をサポートしないのか疑問に思い始めました。C#などの言語はデリゲートで同様のことができ、C / C ++の関数へのポインタを使用できる範囲でできることを知っていますが、これがこれらの言語の機能にならない理由はありますか?関数をファーストクラスにすることに欠点はありますか?私にとっては、非常に便利なので、なぜ機能パラダイム以外の言語でそれを実装しないのかが分からなくなっています。 [編集]これまでの回答に感謝します。現在、多くの言語がファーストクラスの機能をサポートしていることが示されているので、言語を実装するのになぜ時間がかかるのかという質問を言い換えます。[/編集]

1
C ++の静的グローバルと匿名名前空間
後者を導入するときに、C ++が静的グローバル(内部リンケージ)と名前のない名前空間のシンボル(外部リンケージですが、外部から参照する方法がない)を区別したのはなぜですか? これらの理由のいずれかがまだ有効ですか、それとも新しい理由がありますか? それらがまだ異なる場所が残っていますか?しかし、匿名グローバル(または名前空間スコープ)ユニオンはである必要staticがあるという任意のルール、およびそれらは何ですか? ボーナスポイントに関して、それらが異なる理由が残っていない場合、それらを同等にするリクエストはありますか? C ++が名前空間(C ++ 98)、特に名前のない名前空間を導入したとき、静的グローバルは陳腐化し、熱意の中で新しいものよりも劣っていたが、C ++ 11で元に戻された: staticキーワードの廃止…もういや? C ++ 11より前は、内部リンケージのあるシンボルをテンプレート引数として使用できませんでした。C++ 03が外部リンケージを持つためにテンプレートパラメーターを必要とするのはなぜですか。

1
Swiftにウィットネステーブルが必要なのはなぜですか?
Swiftの実装の詳細を読み込もうとしていますが、特定できないのは、その「ウィットネステーブル」です。構造体に使用される別個のvtableポインターのようです。 しかし、なぜそれが必要なのでしょうか。構造体は値によってコピーされるため、コンパイル時にそれらの型がわかっています。では、どのメソッドを呼び出してそれを実行するかをハードコーディングするだけではないでしょうか?これらのメソッドで仮想ディスパッチを実行する理由

2
JavaおよびC#によってメモリの安全性が提供されるのと同様のプログラミング言語によって、スレッドの安全性をどのように提供できますか?
JavaとC#は、配列の境界とポインターの逆参照をチェックすることにより、メモリの安全性を提供します。 競合状態やデッドロックの可能性を防ぐために、プログラミング言語にどのようなメカニズムを実装できますか?

1
ファーストクラスの継続は、最新のオブジェクト指向プログラミング言語で役立ちますか?
継続はCont、命令型コードの単純で規則的な表記を可能にするため、関数型プログラミング言語(Haskell のモナドなど)では非常に便利です。また、欠落している言語機能(例外、コルーチン、グリーンスレッドなど)の実装に使用できるため、一部の古い命令型言語でも役立ちます。しかし、これらの機能のために建てられたサポート付きのモダンなオブジェクト指向言語のためにも(かどうか、より現代的なスタイル区切られたファーストクラスの継続のためのサポートを追加するためにどのような引数があるだろうresetとshiftか、スキームのようなcall-with-current-continuation)? パフォーマンスと実装の複雑さ以外のサポートを追加することに反対する議論はありますか?

3
if()の遅延評価を実装する方法
私は現在、以下に基づいて式エバリュエーター(式のような単一行式)を実装しています。 入力された式は、リテラルブール、整数、小数、文字列、関数、識別子(変数)を分離するためにトークン化されます シャンティングヤードアルゴリズムを実装し(可変数の引数を持つ関数を処理するように少し変更)、括弧を取り除き、適切な優先順位で演算子を後置された順序で並べます 私のシャンティングヤードは、トークンの(シミュレートされた)キューを単に生成します(配列によって、Powerbuilder Classic言語はオブジェクトを定義できますが、ネイティブストレージとしてのみ動的配列を持ちます-真のリストではなく、ディクショナリーではありません)。シンプルなスタックマシン 私の評価者はうまく働いていますが、私はまだ足りないので、if()どうすればいいのか迷っています。 私のシャンティングヤードのポストフィックスおよびスタックベースの評価if()で、trueとfalseの部分を持つ別の関数として追加すると、1つif(true, msgbox("ok"), msgbox("not ok"))で両方のメッセージが表示され、1つだけ表示したいとします。これは、関数を評価する必要がある場合、その引数はすべて評価済みでスタックに配置されているためです。 if()怠惰な方法で実装する方法を教えてもらえますか? 私はこれらを一種のマクロとして処理することについて考えましたが、初期の段階ではまだ条件の評価ができていません。おそらく、キューとは別の種類の構造を使用して、条件とtrue / false式を別々に保持する必要があるのでしょうか?現時点では、式は評価前に解析されますが、将来の評価のために中間表現を一種のプリコンパイルされた式として保存することも計画しています。 編集:問題について少し後で、私は自分の式のツリー表現(線形トークンストリームの代わりにAST)を構築でき、そこから自分のの別のブランチを簡単に無視できると思いif()ます。

4
文芸的プログラミング、良い/悪い設計方法論
私は最近、文芸的プログラミングの概念を見つけました。そして、私はそれがかなり興味深いと感じました。それでも、プログラムを構成するのは悪い方法であるという主張には遭遇していません。多くの場所をカバーしていないようです。ここでさえこれに関する質問を見つけることができませんでした。 私の質問は、その欠陥やドキュメントの処理方法についてではありません。ドキュメンテーションは、文芸的プログラミングの流れにとってそれが何を意味するのかという副作用だと考えています。この設計はもともと、簡単な文書化とフォワードプログラミングフローの概念を目的としたものでした。 問題を小さな文ベースの問題に分割するという概念は、本当に素晴らしいアイデアのようです。これにより、プログラムの流れの理解が容易になります。 文芸的設計法の結果として、必要な機能の数はプログラマーの想像力に制限されます。特定のタスクの関数を定義する代わりに、それをscrap文芸的メソッドとして作成することができます。これにより、個別の関数コンパイルの代わりにコードが自動的に挿入され、同等の速度を得るために手続き間コンパイルの最適化ステップが必要になります。実際、ドナルドE.クヌースの最初の試みは、この事実のために実行時間が劣っていました。私はコンパイラがこれの多くに作られることができることを知っています、しかしこれは私の心配ではありません。 それで、なぜこれが悪い/良い設計方法論であると考える必要があるのか​​についてフィードバックを得たいですか?

6
プログラミング言語の直交性を検証/証明する方法は?
私は直交性の概念を知っていますが、プログラミング言語の観点から、それを検証/証明する方法はありますか? たとえば、C#では、メソッドのシグネチャとして、publicまたはstaticメソッドシグネチャを使用できます。どちらか一方または両方を使用でき、それらは互いに干渉しないので、互いに直交していますよね? 私の質問は、残りの機能、特に互いに関連しない機能についてはどうすればよいですか? すべての機能が共存/スタックする必要がありますか? 100%直交するプログラミング言語はありますか?

5
DSLの構築:汎用言語の上にスクリプト化されたものですか、それともスタンドアロンですか?
私は、特定のあいまいなプログラミングモデルを簡略化するために、ドメイン固有の言語を設計することについて議論しています。議論の一部は、既存の言語/ランタイム(Javaなど)の上にそれを(スクリプトとして)構築するか、それをスタンドアロン(独自のコンパイラ、&c)にするかです。 DSL設計の経験がある方、長所/短所、または適切なアプローチに対する確実な答えはありますか?


12
ある値を他の2つ以上の値と比較する機能を備えた言語がないのはなぜですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 以下を検討してください。 if(a == b or c) ほとんどの言語では、これは次のように記述する必要があります。 if(a == b or a == c) これは少し面倒で情報を繰り返します。 上記のサンプル構文は少し不格好ですが、アイデアを伝えるためのより良い方法があると確信しています。 より多くの言語がそれを提供しないのはなぜですか?パフォーマンスや構文の問題はありますか?

1
型パラメーターの型引数を推論する手法の名前は?
セットアップ:Iterator型パラメーターを持つと呼ばれる型があるとしましょうElement: interface Iterator<Element> {} 次に、をIterable返す1つのメソッドを持つインターフェースがありますIterator。 // T has an upper bound of Iterator interface Iterable<T: Iterator> { getIterator(): T } Iteratorジェネリックであることの問題は、型引数を指定する必要があることです。 これを解決する1つのアイデアは、イテレータのタイプを「推測」することです。次の疑似コードは、Elementへの型引数であると推定される型変数があるという考えを表していますIterator。 interface <Element> Iterable<T: Iterator<Element>> { getIterator(): T } そして、次のような場所で使用します。 class Vec<Element> implements Iterable<VecIterator<Element>> {/*...*/} このの定義は、その定義の他の場所ではIterable使用していませんElementが、実際の使用例では使用しています。を使用する特定の関数は、双方向のイテレータなど、特定の種類のイテレータのみを返すs Iterableを受け入れるようにパラメータを制約できる必要もあります。そのIterableため、返されるイテレータは要素タイプだけではなくパラメータ化されます。 質問: これらの推定された型変数の確立された名前はありますか?テクニック全体についてはどうですか?特定の命名法を知らないために、この例を実際に検索したり、言語固有の機能について学ぶことが困難になっています。 総称を持つすべての言語がこの手法を備えているわけではありません。これらの言語で同様の技術の名前はありますか?

4
「yield」などのジェネレーター言語機能を使用するのは良い考えですか?
PHP、C#、Python、およびおそらく他のいくつかの言語には、yieldジェネレーター関数の作成に使用されるキーワードがあります。 PHPの場合:http : //php.net/manual/en/language.generators.syntax.php Pythonの場合:https : //www.pythoncentral.io/python-generators-and-yield-keyword/ C#の場合:https : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield 言語の機能/機能として、yieldいくつかの規則に違反していることを心配しています。それらの1つは、「確実性」と呼んでいるものです。呼び出すたびに異なる結果を返すメソッドです。通常の非ジェネレーター関数を使用してそれを呼び出すことができ、同じ入力が与えられた場合、同じ出力を返します。yieldでは、内部状態に基づいて異なる出力を返します。したがって、以前の状態を知らないで生成関数をランダムに呼び出すと、特定の結果を返すことは期待できません。 このような関数はどのように言語パラダイムに適合しますか?それは実際に慣習に違反していますか?この機能を使用することは良い考えですか?(良い点と悪い点の例を示すために、gotoかつては多くの言語の機能でしたが、現在もそうですが、それは有害であると見なされ、Javaなどの一部の言語からは根絶されました)。プログラミング言語のコンパイラ/インタープリターは、そのような機能を実装するために何らかの規則を破る必要がありますか?たとえば、言語はこの機能を動作させるためにマルチスレッドを実装する必要がありますか、それともスレッド化テクノロジなしで実行できますか?

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