6 个新奇的编程方式,改变你对编码的认知

2018 年 3 月 16 日 开源中国 OSC - 周其


编译自:Reddit

译者:周其


我时不时会发现一种编程语言的不同用法它有时候会改变我对编程的看法啊。这篇文章中,我想分享一下让我惊讶的发现。这不是类似于高呼“函数式编程会改变世界!”博客文章。我敢打赌,大多数读者都没有听说过下面的大多数语言和范例,所以你应该也会被这些新概念吸引。


注意:我对以下大多数语言的使用经验都很少,但是我发现他们背后的想法非常吸引人,但对其没有专业知识,所以有任何错误请指出并指导更正。如果您也有新的范例和想法,欢迎分享。


默认并发



示例语言:ANIPlaid


让我们用一个哲学家的思想来解决问题吧:有些编程语言是默认情况下并发的,也就是说,每行代码都是并行执行的。


例如,假设你写了三行代码,A,B和C:



在大多数编程语言中,A先执行,然后执行B,最后执行C。在像ANI这样的语言中,A,B和C都将同时执行。


ANI中代码行之间的控制流或排序,仅仅是代码行之间显式依赖关系的副作用。例如,如果B引用了A中定义的变量,则A和C将同时执行,而B只会在A完成后执行。


以下是ANI中的“Hello World”示例:



在ANI术语中,我们将"Hello, World!"对象(字符串)发送到std.out流。如果我们发送另一个字符串,会发生 std.out什么



这两行代码并行执行,因此它们可以在控制台中以任何顺序结束。现在,看看当我们在一行上引入一个变量并参考它会发生什么:



第一行声明一个“锁存(latch)”(锁存器有点像变量),调用 s它包含一个字符串; 第二行将文本赋值 "Hello, World!"给s; 第三行“解锁” s并将内容发送给std.out。在这里,您可以看到ANI的隐式程序排序:由于每行都依赖于前一行,因此此代码将按写入的顺序执行。


Plaid 语言还声称通过默认支持并发性,但使用权限模型,如在本文中,设置控制流程。多核技术正在兴起,并发性仍然是大多数语言中难点。ANI 和 Plaid 提供了一个新的解决方案,可以带来惊人的性能提升;,问题在于“默认并行”是否会改变开发的状态。有关更多信息,请参阅并发性并行性


相关类型



示例语言:Idris, Agda, Coq


你可能习惯使用C和Java等语言来键入系统,编译器可以检查变量是整数,列表还是字符串。但是如果你的编译器能检查一个变量是“一个正整数”,“一个长度为2的列表”还是“一个回文字符串”呢?


下面是如何声明一个Vector包含无形库1,2,3的值:



这将创建一个变量l1,它的类型签名不仅指定它Vector是包含的Ints,而且指定它的Vector长度为3.编译器可以使用此信息来捕获错误。让我们使用该vAdd方法在Vector两个之间执行成对加法Vectors:



上面的例子工作正常,因为类型系统知道两者 Vectors都有长度3.但是,如果我们尝试了vAdd 两种Vectors不同的长度,我们没等到运行时就会在编译时得到一个错误。



Shapeless 是一个仍然有点粗糙的库,只支持依赖类型的一个子集,并有相当冗长的代码和类型签名。相反,Idris使得类型成为编程语言的第一类成员,因此依赖类型系统似乎更加强大和干净。为了进行比较,请查看Scala vs Idris:相关类型,现在以及未来的讨论。


连贯语言




示例语言:Forth, catjoy


有没有想过不用变量和函数应用程序编程会是什么样子?至少我没有,但显然有些人这么想了,他们提出了连续编程。这个想法是,语言中的所有内容都是将数据推送到堆栈或从堆栈中弹出数据的函数; 程序几乎完全通过功能组合(串联组合)来构建。

这听起来很抽象,所以我们来看看cat中的一个简单例子 :



在这里,我们将两个数字推入堆栈,然后调用该+函数,将两个数字从堆栈中弹出,并将其添加到堆栈中的结果:代码的输出为5。下面是一个稍微有趣的示例:



让我们一行一行地浏览一下:


  1. 首先,我们声明一个函数foo。请注意,cat中的函数没有指定输入参数:所有参数都从堆栈中隐式读取。

  2. foo调用<函数,该函数弹出的第一项在堆栈中,将它与10,并且推动任一True或 False背面压入堆栈。

  3. 接下来,我们将值0和42输入堆栈:我们将它们包括在括号中以确保它们未被执行就推入堆栈。这是因为它们将分别用于调用if下一行函数的“then”和“else”分支。

  4. 该if函数从堆栈中弹出3个项目:布尔条件,“then”分支和“else”分支。根据布尔条件的值,它会将“then”或“else”分支的结果输回堆栈。

  5. 最后,我们将20输入堆栈并调用foo函数。

  6. 当所有的事情都做完后,会得到一个42的结果


这种编程风格颇有趣味:程序可以以无数种方式拆分和连接以创建新程序; 非常简单的语法(甚至比LISP更简单),导致非常简洁的程序; 也具有强大的元编程支持。看起来你必须记住或想象堆栈的当前状态,而不是能够从代码中的变量名称中读取它,这可能使得很难推断代码。


声明式编程



示例语言:Prolog, SQL


声明式编程已经存在了很多年,但大多数程序员仍然不知道这个概念。这里的要点是:在大多数主流语言中,你需要描述如何解决一个特定的问题; 在声明性语言中,你只需描述你想要的结果,而语言本身就能找出到达那里的方法。


例如,如果您在C中从头开始编写排序算法,例如编写合并排序的指令,该指令逐步描述如何递归地将数据集分成一半并按排序顺序合并到一起。


如果您使用像Prolog这样的声明性语言对数字进行排序 ,则应该描述所需的输出:“我需要相同的值列表,但索引中的每个项目 i应小于或等于索引处的项目i + 1”。将以前的C解决方案与此Prolog代码进行比较:



如果你使用过SQL,那么你已经完成了一种声明式编程,你可能没有意识到这一点:当你发出查询时select X from Y where Z,你正在描述你想要返回的数据集;它是真正计算出如何执行查询的数据库引擎。


声明性语言的美妙之处在于它允许你在更高层次的抽象中工作:你只需要描述所需输出的规范。例如,prolog中简单数独求解器的代码,只是列出了解决的数独谜题的每行,每列和对角线应该是什么样的:



以下是数独解算器的运行结果:



不幸的是,声明式编程语言很容易造成性能瓶颈。上面的排序算法很可能 O(n!)让数独解算器进行了一次强力搜索; 而且大多数开发人员必须提供数据库提示和额外索引,避免执行SQL查询时出现代价高昂且效率低下的情况。


符号编程



示例语言:Aurora


Aurora语言是一个典型的符号编程的例子:它不仅包括纯文本编程,而且还包括图像,数学方程,图形,图表等。这能够用该数据的原始格式操作和描述各种数据,而不是用文本描述所有数据。Aurora也是完全互动的,可以立即显示每行代码的结果,例如 REPL。


Aurora语言由Chris Granger创建,他也创建了Light Table IDE。Chris在他的文章中概述了Aurora的动机:实现更好的编程。目标是使编程更加具有可观察性,直接并减少偶然的复杂性。欲了解更多信息,请务必查看Bret Victor令人难以置信的会谈: Inventing on PrincipleMedia for Thinking the Unthinkable, and Learnable Programming


基于知识的编程



示例:Wolfram语言


像上面提到的 Aurora 语言一样,Wolfram语言也是基于符号编程的。但是,符号层仅仅是为Wolfram语言的核心提供一致的接口的一种方式,这是基于知识的编程:内置于大量的库,算法和数据。这使得从绘制Facebook连接到操纵图像,查看天气,处理自然语言查询,绘制地图上的方向,求解数学方程式等等都可以轻松地完成。


我怀疑 Wolfram 语言是否有最大的“标准库”和有任何语言的数据集。互联网的连接是编写代码的内在组成部分的想法让我感到兴奋:它几乎就像一个自动完成功能进行谷歌搜索的IDE。符号编程模型是否像Wolfram声称的那样灵活,而且可以真正利用所有这些数据?如果是的话,会很有趣。


更新:虽然Wolfram声称Wolfram语言支持“符号编程”和“知识编程”,但这些术语的定义略有不同。更多有关信息,请参阅知识编程符号编程wiki。



推荐阅读

Let's Encrypt 的 ACME v2 正式支持通配符证书

【官方文档】Spring Boot 2.0 迁移指南

从零开始写简易读写分离,不难嘛!

即将发布的 JDK 10 有 109 项新特性

50+ 实用的 Docker 工具推荐

点击“阅读原文”查看更多精彩内容

登录查看更多
0

相关内容

人们为了让计算机解决各种棘手的问题,使用编程语言 编写程序代码并通过计算机运算得到最终结果的过程。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
57+阅读 · 2020年4月26日
【图神经网络(GNN)结构化数据分析】
专知会员服务
114+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
已删除
AI掘金志
7+阅读 · 2019年7月8日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
PyTorch:60分钟入门学习
全球人工智能
13+阅读 · 2018年5月18日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
专知,一个新的认知方式!
专知
165+阅读 · 2017年9月16日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Learning by Abstraction: The Neural State Machine
Arxiv
6+阅读 · 2019年7月11日
Doubly Attentive Transformer Machine Translation
Arxiv
4+阅读 · 2018年7月30日
Arxiv
3+阅读 · 2018年4月18日
Arxiv
3+阅读 · 2015年5月16日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
57+阅读 · 2020年4月26日
【图神经网络(GNN)结构化数据分析】
专知会员服务
114+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
相关资讯
已删除
AI掘金志
7+阅读 · 2019年7月8日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
PyTorch:60分钟入门学习
全球人工智能
13+阅读 · 2018年5月18日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
专知,一个新的认知方式!
专知
165+阅读 · 2017年9月16日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Top
微信扫码咨询专知VIP会员