Atitit 提升开发效率 声明式编程范式 目录 1. 声明式编程体系树 1 1.1. 声明式(对比:指令式,,主要包括 函数式,逻辑式编程) 2 1.2. 声明式编程:表达与运行分离 3 1.3

Atitit 提升开发效率  声明式编程范式

 

目录

1. 声明式编程体系树 1

1.1. 声明式(对比:指令式,,主要包括 函数式,逻辑式编程) 2

1.2. 声明式编程:表达与运行分离 3

1.3. 不仅表达当下,还表达未来 3

1.4. 不仅表达自己有的,还表达自己没有的 3

2. 子编程范式[编辑] 4

2.1.1. 约束式编程[数据库约束  注解约束 4

2.1.2. 领域专属语言[编辑] 5

2.1.3. 函数式编程[编辑] 5

2.1.4. 逻辑式编程[编辑] 5

 

 

  1. 声明式编程体系树

范式

声明式

函数式

Lisp家族

 

ML家族

 

 

  •  

 

 

 

逻辑式

 

 

 

命令式

结构化

过程式

 

面向对象

 

 

 

非结构化

 

 

 

 

 

元编程

泛型

模板

 

 

 

 

反射化

 

 

 

 

 

 

 

 

 

 

    1. 声明式编程:表达与运行分离

如果将命令式编程看作是一种“忠实的”表达(表达了就要执行,而且所表达的正是要执行的内容),那么声明式编程就是相当不老实的表达。

表达了可以不执行,甚至没法执行

 声明式编程中延迟计算是一个常见的特性,它极大增加了逻辑组织结构的灵活性。比如在WebMVC架构中

    1. 不仅表达当下,还表达未来

现代编程语言中标配的Promise对象,它表示了未来可以获得的一个值,当我们还未真正得到这个值的时候,就可以把它作为返回值返回,并在程序中作为参数传来传去。

而在传统的命令式编程概念中,函数的返回就表示执行完毕,如果是异步执行,则只能通过回调函数获取通知,在概念层面上我们并无法直接定义和使用“未来的值”。

    1. 不仅表达自己有的,还表达自己没有的

未来的值虽然现在未来,但毕竟未来可期。但如果根本不知道未来是否会来,那能否给它分配一个表达形式呢?

在groovy语言中,提供了类似Ruby的methodMissing机制

 

整个软件开发生态环境正在不断向着声明式和命令式水乳交融的方向发展。以前,为了突出声明式的部分,我们会选择模板语言,即在描述性内容中嵌入少量的命令式控制逻辑。而在今天,出现了JSX这种直接将描述性内容嵌入到命令式上下文中的技术。更进一步,类似SwiftUI这种基于通用程序语言直接实现声明式表达的技术正快步向我们走来

 

  1. 子编程范式[编辑]

声明式编程是一个大的概念,其下包含一些有名的子编程范式。

      1. 约束式编程[数据库约束  注解约束

约束式编程(英语:Constraint programming)中,变量之间的关系是在约束中说明的,定义了问题的解的范围。这些约束然后被应用程序来求解,以使得每个变量获得一个值,并让最多的约束得到满足。

约束式编程经常被用作函数式编程、逻辑编程甚至命令式编程的补充。

 

约束编程

 约束编程Constraint programming)是一种编程典范,在这种编程范式中,变量之间的“关系”是以约束的形式陈述(组织)的。这些“关系(约束)”和命令式编程语言元素不同的是:它们并非明确说明了要去执行的步骤中的某一步,而是规范其解的一些属性。这样看来,约束编程是一种声明式的编程范式。

 

      1. 领域专属语言[编辑]

一些着名的声明式领域专属语言(DSLs)包括yacc语法分析器,编译说明语言MakePuppet管理配置语言,正则表达式SQL的一些子集(例如Select queries等)。DSLs有时非常有用,并且不需要是图灵完全的,这往往让其很容易以一种纯声明式的方式来表达。

很多文本标记语言例如HTMLMXMLXAMLXSLT往往是声明式的。

      1. 函数式编程[编辑]

函数式编程,特别是纯函数式编程,尝试最小化状态带来的副作用,因此被认为是声明式的。大多数函数式编程语言,例如SchemeClojureHaskellOCamlStandard MLUnlambda,允许副作用的存在。

      1. 逻辑式编程[编辑]

逻辑式编程语言如Prolog声明关系并且对关系进行提问。同函数式编程一样,许多逻辑编程语言允许副作用的存在。

 

posted @ 2020-08-05 23:50  attilaxAti  阅读(40)  评论(0编辑  收藏  举报