問題タブ [declarative-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java はどのように「命令型」プログラミング言語であり、「宣言型」プログラミング言語ではありませんか?
特に C/C++ (宣言型) と比較して、Java はどのように命令型ですか?
c# - プログラミングにおける宣言型パラダイムと命令型パラダイムの違いは何ですか?
私はWebを検索して、私に光を当てる宣言型および命令型プログラミングの定義を探しています。しかし、私が見つけたいくつかのリソースで使用されている言語は、たとえばWikipediaなどでは気が遠くなるようなものです。この主題に何らかの視点をもたらす可能性のある実際の例を誰かが私に示すことができますか(おそらくC#で)?
wpf - WPF / XAMLのオープンソースの代替手段は何ですか?
HTML / CSSから何かを学んだ場合、宣言型言語(XMLなど)は、次の理由でユーザーインターフェイスを適切に記述できます。
- コードを効果的にテンプレート化できるコードプリプロセッサを簡単に構築できます。
- コードは明確に定義された適切に構造化された(理想的には)形式であるため、解析が容易です。
- XMLベースのソースファイルを効果的に解析またはクロールするテクノロジーはすでに存在します。
- UIのスクリプトコードは、はるかに単純で理解しやすくなります。
- 設計者が自分でインターフェイスを設計できるほど単純です。
- プログラマーはUIの作成に夢中になっているので、デザイナーにとっては十分に簡単にする必要があります。
最近、WPFアプリケーション(つまり、XAML)の要点を調べましたが、HTMLで使用される宣言型言語スタイルに驚くほど馴染みがあるように見えます。
デスクトップUI開発の現在の状態は、大部分が細分化されています。そうでない場合、グラフィカルユーザーインターフェイスデザイン(つまり、GTK、XUL、Qt、Winforms、WPFなど)のドメインでの重複作業はそれほど多くありません。
これらの特性を表すいくつかのオープンソースGUIは何ですか?
- 標準化
- プラットフォームに依存しない
- 宣言型マークアップ言語
- 言語にとらわれない
WPF、より具体的にはXAMLは、正しい方向へのステップである可能性が非常に高いようです。
アップデート:
情報をどうもありがとう、それを続けてください。コメントと回答から収集したオプションは次のとおりです。
- 編集者:Glade Interface Designer
- OSプラットフォーム:すべて
- GUIプラットフォーム:GTK +
- 言語:C(libglade)、C ++、C#(Glade#)、Python、Ada、Pike、Perl、PHP、Eiffel、Ruby
- 編集者:wxGlade、XRCed、wxDesigner、DialogBlocks(無料ではない)
- OSプラットフォーム:すべて
- GUIプラットフォーム:wxWidgets
- 言語:C ++、Python(wxPython)、Perl(wxPerl)、. NET(wx.NET)
無料ではない、クロスプラットフォームではない、または言語固有ではないXMLベースの形式
- エディター:基本的なテキストエディター
- OSプラットフォーム:XULをサポートするブラウザを実行しているOS
- GUIプラットフォーム:Geckoエンジン?
- 言語:ベース言語ではなくプラグイン言語としてのC ++、Python、Ruby
注:XULはデスクトップGUI言語ではなく、make-webapps-run-on-the-desktop言語であるため、このリストで言及する価値があるかどうかはわかりません。さらに、実行するにはブラウザが必要です。IE、それは「デスクトップ用のDHTML」です。
- エディター:WindowBuilderを介したEclipse、Swing GUI Builder(別名Matisse )を介したNetBeans 5.0(無料ではない)
- OSプラットフォーム:すべて
- GUIプラットフォーム:Java
- 言語:Javaのみ
- 編集者:MonoDevelop
- OSプラットフォーム:Linuxおよびその他のUnix/X11ベースのOSのみ
- GUIプラットフォーム:GTK +
- 言語:.NET
注:XAMLは、Microsoftがいつでも条件を変更する権利を含む使用条件を管理しているため、純粋なオープンソース形式ではありません。Moonlightを合法的にWindowsまたはMacで実行することはできません。さらに、法的措置が免除される唯一のプラットフォームはNovellです。私が何を意味するかの完全な説明については、これを参照してください。XAMLは、C#、Managed C ++、CLRのようなECMA標準でもありません。
更新:質問が「元の質問が間違っていたため、WPFに代わるオープンソースはありますか?」から変更されました。この質問の方向は、新しい入力に合わせて方向が変更されました。お詫び申し上げます。それが変わる前に反応した人々。
functional-programming - 宣言型 I/O に対するこのアプローチの問題点があるとすれば、それは何か
これが「プログラム言語設計」ではなく「プログラミング」にどの程度当てはまるかは正確にはわかりません。しかし、問題はこれです:
簡単にするために、2 つの「特別な」リスト/配列/ベクトル/単に「ポート」と呼んでいるものは何でも、1 つは呼び出されstdIn
、もう1 つはstdOut
. これらはそれぞれ概念的に表します
- プログラムの実行中にプログラムに与えられたすべてのユーザー入力
- プログラムの実行中に端末に書き込まれたすべての出力
Haskell にインスパイアされた疑似コードでは、この完全に宣言的なプログラムを作成できるはずです。
どちらが期待どおりで、2 つの番号を要求し、製品を印刷します。トリックは、stdOut がプログラムの完了時に端末に書き込まれた文字列のリストを表し、stdIn が入力文字列のリストを表すことです。タイプエラーと、新しい行が入力された後に次の行のみを印刷するための安全策が必要であるという事実は、簡単にするためにここでは残しておきますが、おそらくそれを解決するのは簡単です.
では、このアイデアを実装する前に、私が見落としていた落とし穴はありますか? 私は似たような構造がすでに存在していることを認識していないので、私が見落としていた明らかな落とし穴があることを考慮しないのはナイーブです.
そうでなければ、私はもちろんそれを知っています:
これらの結果を上記と同様の方法で織り合わせる必要がある場合は、エラーになります。
asp.net - ASP.NET は宣言型プログラミングに基づいていますか?
最近、GridView のページング メカニズムに微妙な制限があることに気付きました。効率的なページング、要求されたページのデータの読み込みは、ObjectDataSource などの DataSource コントロールを使用する場合にのみ可能です。これは、宣言的なデータ バインディングを意味し、データ ソースを使用せずにコード ビハインドからだけでは不可能です (MSDN では、ここで説明しています)。
これは、ASP.NET がコード ビハインドではなく、宣言型プログラミングに基づいているということですか? そして、デフォルトで宣言型プログラミングを行う方が良いですか?
programming-languages - 宣言型プログラミング言語に関するフィードバック、リソース、および情報
私は、新しい言語の根底にあるいくつかの概念について考えてきました。最初はオモチャのようなものでしたが、今は本当に意味があるのだろうかと思っています。この質問を Stack Overflow に投稿して、以前に行われたかどうか、フィードバック、アイデア、またはその他の情報を入手できるかどうかを確認します。
私がこれについて考えるようになったのは、主に宣言型プログラミングに関する Jonathan Edward のプレゼンテーションを読んだ後です。それから私はそれを私の古い考えのいくつかと私が現代言語で見たものと混ぜ合わせました.
宣言型プログラミングの背後にある主な考え方は、「何を」対「どのように」です。しかし、それは何度も聞いているので、ほとんど「面白い」という言葉のように、実際には何も語らず、もどかしいものです。
ただし、ジョナサン・エドワードのバージョンでは、最初に遅延評価を強調することから始めました。これには、関数型リアクティブ プログラミング (FRP)という興味深い結果があります。これは、アニメーション付きの FRP の例です (私が作成した構文を使用):
したがって、ここでは、入力が変更されると値が自動的に変更されます。私の好きな言語の 1 つであるDでは、「純粋な」関数と「不純な」関数が区別されていました。純粋関数は、外界との接続がなく、他の純粋関数のみを使用する関数です。そうでなければ、それは不純です。ポイントは、純粋な関数が与えられた引数に対して同じ値を返すことを常に信頼できるということでした。
ここでも同様の推移的な原則が適用されると思います。私たちの不純物はtime
です。time
、存在x
、したがってy
、およびしたがって、によって触れられるものはすべてnew Point(x, y)
不純です。しかし、通知(2 * 500)
は純粋です。ご覧のとおり、これはコンパイラにその制限がどこにあるかを伝えます。数式を変数で単純化するようなものだと思います。
何が純粋で何がそうでないかをコンパイラに伝えることで、プログラムを大幅に単純化できます。もう 1 つのポイントは、熱心なデータまたは変更可能なデータです。ジョナサン・エドワードは、入力は変更可能で積極的であるが、出力は機能的で怠惰であると認識しました。基本的に、新しい入力が与えられると、プログラムはアトミック状態の変更を定義し、出力は単に現在の状態の関数になります。これが重要な理由を知りたい場合は、プレゼンテーションを参照してください。入力が不純です。遅延評価は、原子状態の変更を定義するのに役立ちます。プログラムが手続き的にどのように書かれるかを見てみましょう。
ここでのbind
キーワードは、変更があった場合に次のコードが実行されることを示していますbegin
。このmutable
キーワードは、入力が遅延ではなく積極的であることを示しています。それでは、「原子状態の変化」がそれをどのように表すかを見てみましょう。
ここで、プログラマーにとってより簡単に、より読みやすくすることができるものを見てきました。まず第一に、醜いstep
変数と、それを毎回どのようにインクリメントしてテストする必要があるかです。以下は、新しく改善されたバージョンがどのように見えるかの例です。
その方がいいです。ただし、完璧ではありません。でも完璧な答えを知っていたら、私はここにいないでしょう?
ゲームエンジンを使用したより良い例を次に示します。
これには、コールバック、イベント、さらにはループなども必要なく、スレッドが明らかであることが気に入っています。何が起こっているのかが分かりやすくなり、Python のような構文だけではありません。言語開発者が、人々がラベルと goto を for で使用しているものは、条件付き分岐とループだけであることに気付いたときのようなものだと思います。そのため、if-then-else、while、for を言語に組み込むと、ラベルと goto は非推奨になり、コンパイラと人々は何が起こっているかを知ることができました。私たちが使用するもののほとんどは、そのプロセスから来ています。
スレッドに戻ると、これの良いところは、スレッドがはるかに柔軟であることです。私たちがやりたいことではなく、やりたいことを言うことに近づいたので、コンパイラがやりたいことを自由にできる場合。そのため、コンパイラはマルチコアおよび分散プロセッサを利用できますが、適切なスレッド サポートのないプラットフォームを補うことができます。
最後に 1 つ言いたいことがあります。そして、それがテンプレートに関する私の見解です。これは、私がプログラミングを始めたとき (実際には約 2 年前) に発達し始めた概念的な卵のようなもので、その後、割れ始めました。基本的には抽象化の原則でしたが、クラスやオブジェクトにまで及びました。
それは私が機能をどのように認識したかに関係していました。例えば:
わかりましadd
た、 が返されましたが、それはint
何でしたか? int
起こるのを待っているような気がしました。数ピースのないパズルのように。可能性は限られており、特定のピースしか適合しませんでしたが、完成したら、他の場所で使用できる完成品ができました。これは、私が言ったように、抽象化の原則です。抽象化 + 欠落部分 -> 具体的な関係と思われる例をいくつか示します。
- 関数 + 引数 -> 値
- 抽象クラス + メソッド -> クラス
- クラス + インスタンス値 -> オブジェクト
- テンプレート + 引数 -> 関数またはクラス
- プログラム + 入力 + 状態 -> 出力
それらはすべて密接に関連しています。これを活かすことができそうです。しかし、どのように?繰り返しますが、これが質問である理由です。しかし、遅延評価はここで興味深いものです。なぜなら、まだ欠落している部分を別のものに渡すことができるからです。コンパイラにとっては、ほとんどの場合、名前を不純物にまで逆参照することです。上記の私の例のように:
コンパイラに提供する部分が多ければ多いほど、コンパイラはそれを完成させ、プログラムを本質的なコアに縮小することができます。上記のadd
関数は、外部リソースに依存しないため、コンパイル時に自動的に解決されます。コンパイラがどれだけ賢いかによっては、多くのクラスやオブジェクト、そしてプログラムの大部分を解決することさえできます。
それは今のところすべてです。これらのことの例がすでに行われているのを見たことがあるなら、私はそれを見たいと思います. また、アイデア、イノベーション、リソース、またはフィードバックがあれば、それもよろしくお願いします。
declarative-programming - 宣言型スタイルでどのようにプログラミングしますか?
puppet宣言型モデルを楽しんでいます。これをもっとコードに組み込んでみたいと思います。
ただし、現在は python でプログラミングしていますが、そうしている間は命令的に考える傾向があります。これは、グラフィック デザインの問題と同じです。最終製品に何を見たいかはわかっていますが、それを組み立てる方法がわかりません。
コードが宣言型になるように構造化するにはどうすればよいですか? ソリューションが認識可能な「宣言型」である場合、最初にどのような手順を実行しますか?
Functional, Declarative, and Imperative Programming これを読んだところ、少し洞察が得られました。
十分ではありませんが、正確に言葉にすることはできません。私の混乱:(
編集:言葉が来ました:宣言のために与えられた例は、常に他の高レベルのものに関して与えられています:
Regexen は確かに宣言的ですが、C からエンジンを作成します。
Make は確かに宣言的ですが、C で書かれています。
Puppet のメインフェストはもちろん宣言型ですが、Ruby コードはそうではありません。
では、どの時点で「OK、メソッドはここにあります。これで宣言部分を開始できます」と言うでしょうか?
scala - Scalaで宣言的にリストを作成するにはどうすればよいですか?
C#では、リストを宣言的に宣言できます。つまり、次のように、リストの構造を宣言し、同時に初期化できます。
.NetのリストとScalaのリストの違いを無視すると(つまり、別のコレクションタイプを自由に使用できます)、Scala 2.8で同様のことを行うことは可能ですか?
アップデート
トーマスのコードを下から適応させるこれは、示されているC#コードに最も近いものだと思います。
c# - .NET での宣言型言語のサポート
ビジネス プロセス シミュレーションの構築をサポートする Visual Studio を使用したシミュレーション エンジンを開発しています。重要な機能の 1 つは、ビジネス ユーザーがシミュレーション モデルをすばやくセットアップできるようにする宣言型言語です。私が言いたいことの非常に簡単な例を挙げます:
したがって、Visual Studio で上記のようなシミュレーション モデルを定義したいと思います。これで、Java や groovy などの他の環境でこれを行う方法がわかりましたが、会社で使用しているため、VS で開発する必要があります。VSで何が見つかるかについてのアイデアはありますか?
乾杯。