问题标签 [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.
procedural-programming - 声明式和过程式编程范式有什么区别?
声明式和过程式编程范式之间有什么区别?你能提供一些例子吗?
还存在哪些其他编程范式?
java - Java 如何是一种“命令式”编程语言而不是“声明式”编程语言?
特别是与 C/C++(声明性的)相比,Java 的命令性如何?
c# - 编程中的声明式范式和命令式范式有什么区别?
我一直在网上搜索声明式和命令式编程的定义,这将为我带来一些启发。但是,我发现的一些资源中使用的语言令人生畏——例如在Wikipedia中。有没有人有一个真实的例子,他们可以向我展示这可能会给这个主题带来一些观点(也许在 C# 中)?
wpf - WPF/XAML 的开源替代方案是什么?
如果我们从 HTML/CSS 中学到了什么,那就是声明性语言(如 XML)在描述用户界面方面做得很好,因为:
- 构建可以有效模板化代码的代码预处理器很容易。
- 该代码采用定义良好的结构(理想情况下)格式,因此易于解析。
- 有效解析或抓取基于 XML 的源文件的技术已经存在。
- UI 脚本代码变得更加简单易懂。
- 设计人员能够自己设计界面非常简单。
- 程序员不擅长创建 UI,因此对于设计师来说应该足够简单。
我最近看了一个 WPF 应用程序(即 XAML)的内容,它看起来与 HTML 中使用的声明性语言样式非常相似。
桌面 UI 开发的当前状态在很大程度上是碎片化的,否则在图形用户界面设计领域(IE.GTK、XUL、Qt、Winforms、WPF 等)不会有那么多重复的工作。
代表这些特征的一些开源 GUI 是什么:
- 标准化
- 平台无关
- 声明性标记语言
- 语言不可知论者
WPF,或者更具体地说,XAML 似乎是朝着正确方向迈出的一大步。
更新:
非常感谢您提供的信息,请继续关注。以下是我从评论和答案中收集的选项。
- 编辑:Glade 界面设计师
- 操作系统平台:全部
- 图形界面平台:GTK+
- 语言:C (libglade)、C++、C# (Glade#)、Python、Ada、Pike、Perl、PHP、Eiffel、Ruby
- 编辑器:wxGlade、XRCed、wxDesigner、DialogBlocks(非免费)
- 操作系统平台:全部
- GUI平台:wxWidgets
- 语言:C++、Python ( wxPython )、Perl ( wxPerl )、.NET ( wx.NET )
基于 XML 的格式不是免费的、不是跨平台的或特定于语言的
- 编辑器:任何基本的文本编辑器
- 操作系统平台:任何运行支持 XUL 的浏览器的操作系统
- GUI 平台:Gecko 引擎?
- 语言:C++、Python、Ruby 作为插件语言而非基础语言
注意:我不确定 XUL 是否值得在此列表中提及,因为它与其说是一种桌面 GUI 语言,不如说是一种 make-webapps-run-on-the-desktop 语言。另外,它需要浏览器才能运行。IE,它是“桌面的 DHTML”。
- 编辑器:Eclipse通过WindowBuilder,NetBeans 5.0(非免费)通过Swing GUI Builder aka Matisse
- 操作系统平台:全部
- 图形用户界面平台:Java
- 语言:仅限 Java
- 编辑:MonoDevelop
- 操作系统平台:仅限 Linux 和其他基于 Unix/X11 的操作系统
- 图形用户界面平台:GTK+
- 语言:.NET
注意:XAML 不是纯粹的开源格式,因为 Microsoft 控制其使用条款,包括随时更改条款的权利。Moonlight 不能合法地在 Windows 或 Mac 上运行。此外,唯一免于法律诉讼的平台是 Novell。有关我的意思的完整描述,请参阅此内容。XAML 也不是像 C#、托管 C++ 和 CLR 那样的 ECMA 标准。
更新:问题已从“是否有 WPF 的开源替代方案?因为原始问题是错误的,而且很糟糕。这个问题的方向已经改变方向以匹配新的输入。我很抱歉在它改变之前做出回应的人。
functional-programming - 这种声明式 I/O 方法有什么问题(如果有的话)
我不确定这到底有多少属于“编程”而不是“程序语言设计”。但问题是这样的:
说,为了简单起见,我们有两个“特殊”列表/数组/向量/为了简单起见,我们只是称为“端口”,一个称为“端口”,另一个称为“端口stdIn
” stdOut
。这些在概念上分别代表
- 在程序执行期间给予程序的所有用户输入
- 在程序执行期间写入终端的所有输出
在受 Haskell 启发的伪代码中,应该可以创建这个完全声明性的程序:
哪个会达到预期,要求两个数字,然后打印他们的产品。诀窍在于 stdOut 表示程序完成时写入终端的字符串列表,而 stdIn 表示输入字符串列表。类型错误以及需要采取一些保护措施才能在输入新行后仅打印下一行的事实为了简单起见将其放在一边,解决这个问题可能很容易。
那么,在我开始实施这个想法之前,有没有我忽略的陷阱?我不知道已经存在类似的构造,因此不考虑我忽略的明显陷阱是天真的。
否则,我当然知道:
如果这些结果需要以与上述类似的方式交织在一起,那将是一个错误。
asp.net - ASP.NET 是基于声明式编程的吗?
最近我注意到 GridView 的分页机制有一个微妙的限制。有效的分页,加载刚刚请求的数据页面,只有使用像 ObjectDataSource 这样的 DataSource 控件才可能实现,这意味着声明性数据绑定,并且在不使用数据源并且仅来自代码隐藏(MSDN 在此处描述)时是不可能的。
这是否意味着 ASP.NET 是基于声明式编程而不是背后的代码?并且默认情况下进行声明式编程会更好吗?
programming-languages - 声明式编程语言的反馈、资源和信息
我一直在思考一种新语言背后的一些概念。起初它是一种玩具,但现在我想知道它是否真的意味着什么。我将这个问题发布到 Stack Overflow 以查看之前是否已完成,以及是否可以获得任何反馈、想法或其他信息。
我主要是在阅读了Jonathan Edward 关于声明式编程的演讲后开始思考这个问题的。然后我将它与我的一些旧想法以及我在现代语言中看到的东西混合在一起。
声明式编程背后的主要思想是“什么”与“如何”。然而,我已经听过很多次了,所以它似乎几乎总是像“有趣”这个词,它实际上并没有告诉你任何东西,这令人沮丧。
然而,在 Jonathan Edward 的版本中,他首先强调惰性求值。这会产生一些有趣的结果,即函数式反应式编程 (FRP)。这是带有动画的 FRP 示例(使用我编写的语法):
因此,如果输入发生变化,这里的值会自动改变。在我最喜欢的语言之一D中,“纯”和“不纯”函数之间存在区别。纯函数是与外界没有任何联系,只使用其他纯函数的函数。不然就不纯了。关键是你总是可以相信一个纯函数为给定的参数返回相同的值。
我想这里也适用类似的传递原则。我们的杂质是time
。time
被、 存在x
、 因此y
、 因此所触及的一切new Point(x, y)
都是不纯的。然而,通知(2 * 500)
是纯粹的。所以你看到这告诉编译器它的限制在哪里。我认为它就像用变量简化数学表达式:
通过告诉编译器什么是纯的,什么不是,我们可以大大简化我们的程序。另一点是急切或可变的数据。乔纳森爱德华认为输入是可变的和渴望的,但输出是功能性的和懒惰的。基本上,给定新的输入,程序定义了一个原子状态变化,然后输出只是当前状态的一个函数。如果您想了解为什么这很重要,请参阅演示文稿。输入不纯。惰性求值有助于定义原子状态变化。让我们看一下程序是如何编写的:
这里的bind
关键字表示如果begin
发生更改,则执行以下代码。mutable
关键字表示输入不是懒惰的,而是急切的。现在让我们看看“原子状态变化”如何表示它。
现在,我们看到了一些对于程序员来说可以变得更容易、更易读的东西。首先是丑陋的step
变量,以及我们每次必须如何递增和测试它。下面是一个新的改进版本的示例:
这样更好。不过,并不完美。但如果我知道完美的答案,我就不会在这里了,对吧?
这是一个更好的例子,使用游戏引擎:
我喜欢这不需要回调、事件,甚至循环或任何东西,而且线程是显而易见的。更容易判断发生了什么,而且不仅仅是类似于 Python 的语法。我认为这就像语言开发人员意识到人们使用标签和 goto 的只有少数东西:条件分支和循环。因此,他们将 if-then-else、while 和 for 构建到语言中,标签和 goto 已被弃用,编译器和人们可以知道发生了什么。我们使用的大部分内容都来自该过程。
回到线程,这样做的好处是线程更加灵活。如果编译器可以自由地做它想做的事,因为我们已经更接近说出我们想要的东西,而不是我们想要它如何完成。因此,编译器可以利用多核和分布式处理器,但仍然可以补偿没有良好线程支持的平台。
我想提最后一件事。这就是我对模板的看法。这是一个概念性的鸡蛋,在我开始编程时开始发展(实际上是大约 2 年前),然后开始破解。基本上它是抽象的原则,但它比类和对象延伸得更远。
这与我对功能的看法有关。例如:
好的,add
返回一个int
,但它是什么?这有点像是在int
等待发生。就像一个没有几块的拼图。可能性有限,只有某些部分适合,但当你完成后,你就有了一个成品,你可以在其他地方使用。就像我说的,这就是抽象的原则。以下是一些我认为是抽象+缺失部分->具体关系的示例:
- 函数 + 参数 -> 值
- 抽象类+方法->类
- 类 + 实例值 -> 对象
- 模板 + 参数 -> 函数或类
- 程序 + 输入 + 状态 -> 输出
它们都是密切相关的。似乎可以利用这一点。但是怎么做?同样,这就是为什么这是一个问题。但是惰性求值在这里很有趣,因为您可以将仍然缺少部分的东西传递给其他东西。对于编译器来说,这主要是将名称取消引用到杂质的问题。就像我上面的例子:
你给编译器的部分越多,它就越能完成它并将程序简化为它的基本核心。并且add
上面的函数将在编译时自动解析,因为它不依赖于外部资源。甚至可以解析大量的类和对象,以及大部分程序,这取决于编译器的智能程度。
目前为止就这样了。如果你已经看过这些事情的例子,我想看看。如果您有任何想法、创新、资源或反馈,我也将不胜感激。
declarative-programming - 如何以声明式风格进行编程?
我很喜欢puppet声明式模型。我想尝试将更多内容合并到我的代码中。
然而,我目前在 python 中编程,并且在这样做时我倾向于强制思考。这就像我的图形设计问题:我知道我喜欢在最终产品中看到什么,但不知道如何组装它。
我如何构造事物以使代码具有声明性?如果解决方案要具有可识别的“声明性”,应采取哪些初始步骤?
函数式、声明式和命令式编程 我刚刚读过这篇文章,带来了一些见解。
不过还不够,不能准确地说出来,我的困惑:(
编辑:话来了:为声明给出的示例总是根据其他一些高级事物给出:
Regexen 是声明性的,当然,但是你用 C 语言制作引擎。
Make 是声明性的,当然,但它是用 C 编写的。
Puppet mainifests 当然是声明性的,但 Ruby 代码不是。
那么我在什么时候说:“好的,方法在这里,现在我可以开始声明部分了”?
scala - 如何在 Scala 中以声明方式创建列表?
在 C# 中,我可以声明式地声明一个列表,换句话说,声明它的结构并同时对其进行初始化,如下所示:
忽略 .Net 中的 List 和 Scala 中的 List 之间的差异(即,随意使用不同的集合类型),是否可以在 Scala 2.8 中做类似的事情?
更新
从下面调整 Thomas 的代码我相信这是与所示 C# 代码最接近的等价物:
c# - .NET 中的声明性语言支持
我正在使用 Visual Studio 开发一个模拟引擎,它将为构建业务流程模拟提供支持。其中一个关键特性将是一种声明性语言,它允许业务用户快速设置模拟模型。我将举一个非常简短的例子来说明我的意思:
所以我想在 Visual Studio 中类似于上面的东西来定义模拟模型。现在我知道如何在 java 和 groovy 等其他环境中执行此操作,但我需要在 VS 中开发它,因为这是我公司使用的。关于我可以在 VS 中找到什么的任何想法?
干杯。