【问题标题】:When to use declarative programming over imperative programming [closed]何时使用声明式编程而不是命令式编程[关闭]
【发布时间】:2016-04-09 00:16:35
【问题描述】:

据我所知,声明式编程和命令式编程之间的主要区别在于,在声明式编程中,您宁愿指定问题所在,而在命令式编程中,您确切说明如何解决问题。

但是,我并不完全清楚何时使用一个而不是另一个。想象一下,您被要求解决某个问题,您决定根据哪些属性以声明方式(即使用 prolog)或命令方式(即使用 Java)来解决这个问题?对于哪种问题,您更愿意使用其中一个而不是另一个?

【问题讨论】:

    标签: prolog declarative paradigms imperative


    【解决方案1】:

    命令式编程更接近实际机器的执行情况。这是一种非常低级的编程形式,您的应用程序越复杂,您就越难以掌握如此低级的所有细节。从好的方面来说,靠近机器,如果你擅长的话,你可以编写相当高性能的代码。

    声明式编程更抽象、层次更高:使用相对较少的代码,您可以以一种更容易被视为正确的方式表达相当复杂的关系。

    要看到一个重要的区别,例如比较纯 Prolog 和 Java:假设我去掉了 Prolog 程序中的一个规则。我知道 先验这可以使程序最多 更具体:以前持有的一些东西现在可能不再持有。

    另一方面,假设我删除了 Java 程序中的一个语句:关于一般效果,无话可说。该程序甚至可能不再编译。

    因此,命令式程序中的更改可能会产生非常不可预见的影响,并且非常难以推理,因为几乎没有保证和不变量,而且很多事情都隐含在程序的某些全局状态中。这使得命令式编程非常容易出错。

    【讨论】:

    • 所以一般来说,使用声明式风格总是更好,因为它更抽象,可能更高效,更不容易出错?这适用于每个应用程序吗?或者是否存在您绝对应该使用命令式语言而不是声明式语言的应用程序/问题?
    • 我可以想象,如果您想在非常低的级别(接近机器)进行编程,例如用于教学或学习目的,使用命令式语言会很有用。您的应用程序增长得越复杂,这将变得越不可持续,因此您通常会在实际应用程序中为更高级、更具声明性的语言编写内置解释器。跨度>
    • s(X)。即使几乎没有任何代数性质,在 Prolog 中表现出色的方法也可以用于其他领域的特殊问题。考虑“Reducers are Fuzzers”(URL blog.regehr.org/archives/1284)。