有没有基于操作变量和函数的编程范例?

时间:2010-09-07 08:15:49

标签: programming-languages paradigms

实际上我所知道的每种语言基本上都是主题的变体:你创建变量和函数,然后使用条件和其他结构来操作它们。我理解功能编程等与“传统”语言略有不同,但在它们下面几乎是相同的。您仍在使用变量(有些,即使它们是不可变的等等),也可以创建函数。

是否有任何语言或系统完全取消我们现在使用的内容并采用完全不同的方法?

11 个答案:

答案 0 :(得分:15)

尽管你对Functional Programming进行了高压解雇,但我认为你需要再次查看它才能阅读理解和学习,而不是使用确认偏见将其视为“更多相同”。以函数式编写代码与在imperative style中编写代码截然不同。但是,如果它与你不同,为什么不看看其中任何一个?:

基本上,只要查看可用的几十个programming paradigms中的任何一个,并阅读理解和启示的描述,而不是通过确认偏差解雇。为每个看起来完全不同的语言学习一种语言,因为你所使用的“不同”的模糊定义和乐趣。

答案 1 :(得分:8)

图形语言已有多次尝试。来自的LabVIEW系统 National Instruments可能是最成功的。它使用数据流图 包含对数据起作用的组件。

图形语言的另一种尝试是UML。我猜这个陪审团已经出局了。在标准委员会参与并将其转化为适合每个人的事情之前,这可能是一个好主意。

大量的机电系统由PLC s控制 用ladder logic编程。它本质上是一个创造高度的学科 可靠的有限状态机,但与程序性几乎没有相似之处 语言。

然后有一些深奥的,模糊的和替代的语言除了提醒人们Turing-complete不要求语言是明智的之外,它在很大程度上没有任何实际用途。有些人可能会把图灵机本身放在这个类别中,但BrainF*ckPiet在这群人中真的很突出。

深奥的语言whenever也是一项有趣的练习,因为它根本没有流量控制。

修改:我差点忘了Befunge。其源文本是ASCII字符网格,其中每个单元格都是操作码。执行在四个方向中的任何一个方向上运行,因此可以以四个不同的顺序流过单个操作码。它是另一种深奥的语言,旨在尽可能地(在1993年)编写编译器。并不是说这实际上阻止了某人这样做。

我指出的几种语言都是深奥的语言。这些通常是具有小型(通常只有一个或两个)用户社区的语言。它们是出于各种原因而创建的,并且探索图灵完成的含义以及如何代表一个程序的界限是引用的更严重的原因。

所有深奥语言的祖父都是INTERCAL,它是在1972年创建的。它是一种表面上类似于COBOL的语言,但在其众多怪癖中要求该程序具有足够的礼貌(但不是太客气)。为了继续执行。为了支持礼貌,PLEASE DODO的礼貌形式。一个值得注意的扩展是COME FROM语句,它可以使控制从命名位置流向此处。

答案 2 :(得分:8)

本身不是语言,但analog computers在某些方面与更受欢迎的数码电脑完全不同。

答案 3 :(得分:6)

嗯,有Piet。那是非常不同的。 (下面是Piet中的Hello World。)虽然即便如此,你可能会争辩说你正在处理一个包含一定数量整数的数据结构(在这种情况下是一个堆栈)然后你要从堆栈中添加和删除东西,操纵价值等,所以真的它仍然是一样的。

alt text

答案 4 :(得分:3)

这取决于你的要求,但答案可能不是。

原因是Turing Complete的所有当前计算机语言都是图灵完成的。这意味着任何这些语言都可以由该组中的任何其他语言模拟。然后,任何编程语言都可以有一个可以在我们当前的计算机上运行的编译器或解释器(近似值)。这些在架构上确实具有代码和数据的概念。

因此,如果您认为函数式编程和命令式(“传统”)编程是相同的,因为它们在计算机上运行,​​那么就没有其他选项。

代码和数据转换为函数和数据结构(变量)。他们确实允许变化:

  1. 不变性是函数式编程的主要因素。
  2. 代码和数据之间的差异可能会模糊不清。例如homoiconicity表示函数可以用作数据结构。请参阅Lisp语言。
  3. 与此相关的是self-modifying code
  4. 另一方面,如何表达程序也可能有点不同。使用函数组合作为基础可能会引导您进行连接编程,尽管数据流编程(包括许多图形语言)和函数式编程也同样支持它。

    表达语言的最后一组方法是建模为数据结构上的优化或搜索过程:

    1. 逻辑编程,如Prolog
    2. Evolutionary Computation以标准编程语言输出程序。但是大概可以编写一种描述性语言,可以“执行”以找到生成的程序并执行它。这也可以用于许多机器学习方法。
    3. 这有点学术性。我的建议是尝试确定不同的含义。可能,功能编程与您的目的不同。

      编辑:我刚刚注意到您使用了“使用条件和其他结构操纵它们”这一表达式。控制流构造不必是与代码和数据不同的构造。例如,条件if可以表示为filter,或者循环可以表示为map。如果只使用函数和数据结构,则可以在没有显式iffor的情况下执行更高阶函数和惰性求值。这并不意味着你实际上失去了做到这一点的能力。如果你想看到类似的东西,你可能会对Haskell感兴趣。

      另外,请参阅看起来不同的语言的其他答案,例如图形语言和主题语言,同时仍然使用应用于具有控制结构方法的数据结构的函数。

答案 5 :(得分:3)

好问题。我们退一步吧。在我的第一个aswer中,我会尝试发布,你正在寻找的不是一种新语言,而是一种新的架构,我敢肯定,你至少知道那些重要的语言。

20年前,计算机程序是使用“串行”逻辑构建的,就像基本程序一样:

10 INPUT "PASSWORD: ";A$
20 IF A$="PASSWORD" THEN GOTO 40
30 PRINT "TRY AGAIN" : GOTO 10
40 PRINT "WELCOME"

MS-DOS程序是相同的:它们运行wile,然后等待用户输入,然后再次运行。在Unix系统上,即使它是一个多任务系统,游戏也非常相似,不止一个用户可以这样运行程序。

有两个berakthrough wave:

  • 事件驱动系统:程序流从根本上改变了(事件处理程序,回调,监听器);
  • 网络系统,尤其是AJAX:程序在不同的机器上运行(分布式处理,客户端 - 服务器架构,服务)。

与此同时,编译和程序结构发生了变化,但我认为更少:

  • 元编程(基于IDE的代码生成器,预处理器),
  • 插入thecnique,
  • 动态图书馆。

此外,编程目标环境发生了很大变化:

  • 虚拟机(Java),
  • 解释器平台(PHP),
  • 系统服务,
  • 框架,
  • 门户系统(Drupal)。

一些大而肥胖的节目成了平台:

  • Lotus Notes(自己的语言,现在:Java),
  • MS Excel(Visual Basic)。

我没有提到任何新的语言,但是即使用同一种语言也可以是如此不同的编程,例如,在JAVA中编写用于移动电话的J2ME游戏和为Oracle SQL编写存储过程。

也许您正在寻找的不是编程语言。比如,任务是在浏览器中显示数据列表,某些表格。网络应用应该看起来:

  • PHP脚本执行SQL查询,模板系统将获取的数据插入到准备好的HTML模板中。
  • PHP脚本将从SQL获得的数据放入XML,浏览器使用XSLT转换将其转换为最终HTML。
  • JavaScript应用程序向PHP脚本请求数据,该脚本以JSON格式发送SQL结果,然后JS应用程序呈现最终的HTML。

HTML + XSLT是一种编程语言吗?不。他们是否执行PHP在服务器端执行的相同任务,或JS在客户端执行的任务? Absolutelly。这是一个共同的平台吗?是的,所有浏览器都支持它。

我认为,有足够的低级编程语言,我的意思是程序语言,OOP或其他图灵完备语言。新的(低于编程)语言的目标是更强大有效:更快的代码生成,更灵活的应用程序,社区工作支持,可伸缩性,更易于维护,可重用性等。

(我在这里分开了答案;在下一部分,我会告诉你一个,我正在玩一段时间。)

答案 6 :(得分:2)

仔细阅读http://en.wikipedia.org/wiki/Programming_paradigm以及右侧链接框中链接的所有网页。根据你的看法,有些是完全不同的,或者它们基本相同。

答案 7 :(得分:1)

查看Forth,它是一个完全不同的系统,几乎所有东西都是关于操纵堆栈的。它几乎就像一个非常原始的小VM。

答案 8 :(得分:1)

正如我所说,今天有许多平台或环境可以编程。对于某些平台,您可以从一长串语言中进行选择,例如: Microsoft .NET,可以用VisualBasic,C#等编程;在其他情况下,非常不同的平台使用相同的语言,例如JAVA,用于Android,Oracle SQL Server存储过程等。

此外,还有非编程语言,它涵盖了一个域,或者它们表达了某种配置,这种配置作为一种真正的编程语言非常简单,但可以比编程语言更好地使用。例如:PLC的梯形逻辑编程。

数据流编程是这种编程之一。让我们看看维基百科,什么是数据流编程(也称为基于流程的编程):

  

在计算机科学中,基于流动   编程(FBP)是一种编程   将应用程序定义为的范例   “黑匣子”流程网络,   它跨预定义交换数据   通过消息传递的连接,在哪里   指定了连接   在流程外部。这些   黑盒子进程可以重新连接   无休止地形成不同   应用程序,而不必是   内部改变了。因此FBP就是这样   自然是以组件为导向的。

来自:http://en.wikipedia.org/wiki/Flow-based_programming, 另见http://en.wikipedia.org/wiki/Dataflow_programming

维基百科的文章很棒,我已经回答了其他一些问题,所以我不想重复自己。相反,我正在描述我用于异步数据流服务器的语言。

有3种语言元素。

  • 组件声明

    cmp:比较

这是一个名为“cmp”的组件实例,它是一种比较。

  • 消息定义

    src.out>> cmp.value   cmp.gt>> dst1.in   cmp.lt>> dst2.in   cmp.eq>> dst3.in

点之前的单词是组件实例的名称,点之后的单词是端口名称,左侧组件端口对是源,右侧是目标。 (端口是发送或接收消息的组件的固定点。请参阅Wkikpedia文章。)

  • 属性

    cmp.base = 8

这定义了组件实例的端口值。

(把这些行放在一起,我们得到一个简短的数据流程序,这意味着:一个valus来自src,cmp检查它的值,并将它传递给dst1,如果它超过8,dst2,如果它小于8,和dst3如果它恰好是8.)

我认为,这种语言符合您的标准,不是程序性的,没有传统变量,没有子程序,没有循环。

有趣的是,有一些严肃的项目实现了数据流编程,但他们甚至没有提到它:

(我的数据流项目还没有网页,它正在建设中。)

可以显示数据流程序,也可以将其编辑为图形(参见SynthEdit)。

答案 9 :(得分:0)

这不是关于语言,而是你用它做的最重要的事情。许多语言都会将你推向一个特定的方向,像Haskell这样的纯函数式语言会使得几乎不可能强制编程,例如但只要你不花时间学习范例,大多数语言看起来都和机器一样实际运行的语言,评估条件并为内存空间赋值。

范例为您提供了您正在寻找的抽象。良好的面向对象或功能代码看起来与您描述的完全不同。而且您不需要语言来执行此操作。我见过用C语言编写的用C语言编写的面向对象的优秀代码和功能代码。虽然为正确的工作使用正确的语言有很大帮助。不幸的是,事情也是相反的。如果你不花时间理解这些范例,你仍然会在Scheme或Smalltalk中编写命令式代码。

答案 10 :(得分:0)

研究Turing Machine。维基百科文章列出了一些可以运行程序的模拟器。它至少在美学上是不同的。