【问题标题】:Differences between imperative and declarative programming languages?命令式和声明式编程语言之间的区别?
【发布时间】:2015-10-29 11:58:50
【问题描述】:

我知道它们是什么:

在命令式编程语言中,您逐步告诉编译器您希望发生什么,而在声明性语言中,您编写代码来描述结果,但不一定要如何实现所需的结果。

但是,我不知道使用这两种编程语言的优化。除此之外 - 是否有任何并发​​症?例如,运行以任一语言开发的程序时需要空间/时间。

【问题讨论】:

  • 我会说这个问题的答案会占用一整本书,或者好几本书。
  • @biziclop 我只需要一些小例子来帮助我把整个想法包装起来哈哈
  • 您需要缩小范围,无论是在语言方面还是在问题方面,最好两者兼而有之。

标签: declarative paradigms imperative-programming


【解决方案1】:

Comparison of programming paradigms WikiPedia 页面的性能比较部分大致涵盖了您所询问的内容。

纯粹就总指令路径长度而言,一个程序编码在 命令式风格,根本不使用任何子例程,将有 最低的计数。然而,这种程序的二进制大小可能是 大于使用子程序编码的相同程序(如功能 和程序编程)并且会引用更多的“非本地” 可能会增加高速缓存未命中并增加 现代处理器中的指令获取开销。

广泛使用子程序的范例(包括函数式、 过程和面向对象)并且不要使用显着的 因此,内联(通过编译器优化)将使用 子程序链接占总资源的更大百分比 他们自己。不会故意改变的面向对象程序 直接编程状态,而不是使用 mutator 方法(或“setter”) 封装这些状态变化,将作为直接结果, 有更大的开销。这是因为消息传递 本质上是一个子程序调用,但还有另外三个 开销:动态内存分配、参数复制和动态 派遣。从堆中获取内存并复制参数 消息传递可能涉及远远超过 状态所需的那些改变本身。访问器(或“getter”) 仅返回私有成员变量的值也取决于 在类似的消息传递子例程上,而不是使用更多 直接分配(或比较),增加总路径长度。

...继续

【讨论】:

  • 而且并非在所有情况下都是如此。
  • @biziclop 一般不适用于哪些情况?
  • @madcrazydrumma 这就是我想说的:没有“一般”,这两个语言家族过于多样化,无法在这个层面上得出任何有意义和普遍的差异。这完全取决于特定的语言和特定的环境。 (例如,大多数现代 Java 虚拟机确实使用大量内联,这使得该段中的很多内容在 Java 的情况下大多无关紧要。但你最终可能会在 JIT 编译更好的平台上编码,或者不- 存在。)
  • 恕我直言,我认为您误读了那段@biziclop - 它并没有说函数式、过程式和oo语言不使用内联。它说功能性、程序性和 oo 的语言也不使用内联。因此涵盖了您提到的Java案例。 ...虽然我明白你关于泛化的观点。
  • @biziclop 不管怎样,我们都同意这样抽象的概念很难概括,但我的回答至少是一个起点。 :)
猜你喜欢
  • 2018-05-06
  • 2012-01-02
  • 2013-07-23
  • 2014-03-25
  • 2022-10-15
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多