下一级别的抽象是什么?[关闭]


15

由于编程语言最初只使用顺序执行的代码行,后来演变为包含了第一批抽象级别之一的功能,然后创建了类和对象以进一步抽象它。下一级别的抽象是什么?

还有什么比类还抽象的呢?


17
您似乎认为这是一个线性顺序,具有顺序(“ X比Y更抽象,Y比Z更抽象”)。我不敢苟同。

2
说出为什么要与众不同是一个很好的主意。;)(阅读:我很感兴趣!)
sergserg 2012年

3
我提出了最终的“抽象”: 做我想的,而不是我打的。 ;)
Izkata 2012年

1
@Delnan:抽象没有引入总顺序,但是可以说“更多抽象”,“更少抽象”。例如,合并排序的通用实现比仅适用于整数的合并排序的实现更为抽象。
乔治

2
兄弟,学习一些分类理论。然后我们可以讨论抽象的真正含义,就像文明的人。
davidk01年

Answers:


32

我认为您对计算历史有一些误解。

实际上,第一个抽象(在1936年)是Alonzo Church的Lambda微积分,它是高阶函数和随后所有函数语言概念的基础。它直接启发了Lisp(第二古老的高级编程语言,创建于1959年),从而启发了从ML到Haskell和Clojure的所有内容。

第二个抽象是过程编程。它来自冯·诺依曼(von Neumann)计算机体系结构,该体系结构编写了顺序程序,一次编写了一条指令。FORTRAN(最古老的高级编程语言,1958年)是第一个从过程范式中出现的高级语言。

第三种抽象可能实际上是声明性编程,首先由Absys(1967)举例说明,然后由Prolog(1972)举例说明。它是逻辑编程的基础,其中通过匹配一系列声明或规则而不是执行一系列指令来评估表达式。

然后,第四种抽象是面向对象的程序设计,该程序在60年代的Lisp程序中首次出现,但后来在1972年由Smalltalk进行了举例说明。(尽管关于Smalltalk的消息传递样式是否为一个真正的面向对象的抽象。我不会碰这个。)

所有其他抽象,特别是在传统的von Neumann计算机体系结构上的抽象,都是对这四个主题的变形。我不相信除了这四个之外还有另一种抽象,不仅是它们的变体或组合。

但是,从本质上讲,抽象只是一种建模和描述算法的方法。您可以将算法描述为一系列离散步骤,一组必须遵循的规则,一组数学函数或相互作用的对象。很难想象有任何其他方式来描述或建模算法,即使存在,我也不相信其实用性。

但是,存在量子计算模型。在量子计算中,需要新的抽象来建模量子算法。作为该领域的新手,我无法对此发表评论。


4
是否可以将面向方面的编程视为另一种抽象形式?
Shivan Dragon 2012年

面向对象程序设计是在60年代从Lisp诞生的?[需要引用],时间很长。我所听到的一切都说它来自60年代的Simula,它是ALGOL的直接后代,ALGOL是与Lisp无关的命令性语言。Smalltalk是通过采用Simula引入的概念并将其扭曲而感到更加“轻浮”而产生的。
梅森惠勒2012年

3
@MasonWheeler:它在Lisp 1和1.5手册中,并且经常听到Lispers谈论做面向对象程序,特别是老家伙。当时,人工智能专家在Lisp中从事对象系统的开发工作非常强大。
greyfade 2012年

2
@ShivanDragon:我不会。这只是使用其他工具来检测本来是过程性程序的一种方式。它并没有真正为算法建模,也似乎没有影响数据结构的设计。
greyfade 2012年

4
实际上,SKI组合器演算早于lambda演算和图灵机。
W Mittag'9年

4

对于许多人来说,当前二进制编程时代中最纯粹的代码抽象形式是“高阶函数”。基本上,将函数本身视为数据,并定义函数的功能,就像您在数学方程式中所看到的那样,其中的运算符定义了它们的操作数的结果,而预定的运算顺序则定义了这些运算的“嵌套”。数学在其结构中几乎没有“命令式命令”。我可以想到的两个示例是“让x具有某个值或等于某个约束的任何值”,以及“分段函数”,其中输入确定生成输出所需的表达式。这些结构很容易表示为它们自己的功能。“ function” x始终返回1,“ overloads” 函数的定义是根据传递给它们的内容来定义的(与可基于输入值定义的面向对象的重载不同),即使是在自身方面,也可以“逐段”评估命名的函数组。这样,该程序从低层次上消除了命令的概念,而是专注于给定输入数据的“评估自身”。

这些高阶函数构成了“功能语言”的基础。程序的功能是根据“纯函数”(一个或多个输入,一个或多个输出,无副作用或“隐藏状态”)定义的,这些函数相互嵌套并根据需要进行评估。在这种情况下,大多数“命令式逻辑”都被抽象掉了。运行时处理函数的实际调用,并且可能需要调用函数的一个或另一个重载的任何条件。在这样的程序中,代码不被认为是“在做”某事,而是被认为是“在做”某事,并且确切地确定什么是在给定初始输入的情况下程序运行的。

现在,高阶函数也是许多命令式语言的基础。.NET的lambda语句基本上允许将“匿名”功能输入到另一个“功能”中(强制性地实现,但从理论上讲不是必须的),从而允许高度可定制的“链接”非常通用的“功能”来实现预期的结果。

在最新一轮编程语言中常见的另一种抽象是基于“鸭式输入”概念的动态变量类型。如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样飞行,像鸭子一样嘎嘎叫,您可以称其为鸭子。其实是野鸭还是平装本都没关系。可能的问题,如果它实际上是一个鹅或天鹅,但随后又可能不是问题,如果所有你关心的是,它游泳,苍蝇,和还挺看起来像鸭子。这被认为是对象继承的最终方法。你不在乎它什么,除了给它起个名字;更重要的是它的作用。在这种语言中,基本上只有两种类型;“原子”是信息的单个元素(一个“值”;数字,字符,函数等),而“元组”则由原子和指向该元组中其他所有内容的“指针”组成。确切地说,运行时如何以二进制方式实现这些类型是无关紧要的。使用这些,您可以实现几乎所有可以想到的类型的功能,从简单的值类型到字符串再到集合(由于值可以是不同的“类型”,因此允许“复杂类型”,也就是“对象”)。


1
“鸭式打字”(至少如您所描述的)不是真正新颖的,也不限于动态打字的语言。在静态类型语言中,“结构子类型” 已经存在了长时间,这在OCaml中最为明显。
Tikhon Jelvis

2

可以将像SQL这样的领域特定语言视为一种更高的抽象顺序。SQL是一种很有针对性的语言,它抽象化了诸如存储之类的操作,并基于集合论提供了更高级别的功能。还应考虑当今有多少主流语言不针对特定体系结构,而是针对虚拟机(例如JVM或.NET CLR)。例如,C#被编译为IL,IL被本地运行时引擎解释(或更经常地,JIT(及时编译)为本地实现)。

DSL的概念被用来创建非常高级的语言,这引起了很多争论,而无需太多的技术经验就可以使用它们来创建工作程序。想一想,是否有人能够用简单的英语描述他们的实体和互动,并且操作环境处理了从呈现简单UI到将数据存储在某种数据库中的所有事务。一旦将这些操作抽象化,您就可以想象如何轻松进行编程。

今天有一些产品,例如JetBrains MPS(这是用于描述DSL的工具包或语言生成器)。微软对其M语言进行了短暂的尝试(我可能会非常有前途)(M语言非常完整,以至于用M定义了该语言)。

对该概念的批评者指出,先前曾尝试将程序员从开发程序的工作中解脱出来,与DSL工作台(如Fowler所称)的不同之处在于,开发人员仍将参与整理领域专家可以用来表达的概念他们领域的需求。就像OS和语言供应商创建用于编程的工具一样,我们将使用DSL为业务用户提供工具。可以想象DSL描述数据和逻辑,而开发人员创建解释器来存储和检索数据并应用DSL中表达的逻辑。


1

我认为,元结构,模块,框架,平台和服务都是比类更高层次的功能分组。我的编程系统抽象层次结构:

  • 服务
  • 平台,解决方案堆栈
  • 构架
  • 模块,包装
  • 元结构:元类,高阶函数,泛型,模板,特征,方面,修饰符
  • 对象,类,数据类型
  • 函数,过程,子例程
  • 控制结构
  • 代码行

诸如元类高阶函数泛型之类的元结构 显然为基本类,函数,数据类型和数据实例添加了抽象。特性,方面和修饰符是用于组合代码功能的新机制,并且类似地“加速”其他类和功能。

甚至对象语言都具有模块和包,因此将它们置于类之上可能是有争议的。因为它们包含那些类和元结构,所以我将它们排名更高。

框架是最棘手的答案-它们​​会编排多个类,元结构,模块,函数等,以便提供复杂的高级抽象。然而,框架仍然几乎完全在编程领域中运作。

解决方案堆栈或平台通常将多个框架,子系统或组件组合到一个环境中,以解决多个问题。

最后,有一些服务-通常部署为Web或网络服务。这些是作为完整捆绑包交付的体系结构,框架,解决方案堆栈或应用程序功能。它们的内部通常是不透明的,主要是暴露管理员,程序和用户界面。PaaSSaaS是常见的示例。

现在,由于某些原因,这种进展可能并不完全令人满意。首先,它使整齐的线性进展或层次结构不是完全线性或层次结构。它涵盖了一些不完全受开发人员控制的抽象,例如“堆栈”和服务。而且它不会放置任何新的魔术怪尘。(剧透:没有魔术精灵的灰尘。

我认为仅寻找新的抽象级别是错误的。我上面列出的所有内容都已经存在多年了,即使它们并没有像现在这样突出或受欢迎。在过去的几年中,在每个编码级别的抽象都得到了改进。现在,我们有了通用的通用集合,而不仅仅是数组。我们遍历集合,而不仅仅是索引范围。我们有列表推导以及列表过滤和映射操作。许多语言的函数可以具有可变数量的参数和/或默认参数。等等。我们在每个级别上都在增加抽象,因此增加更多级别并不是提高整体抽象级别的必要条件。


1

类之后的下一个抽象是元类。就这么简单;)

一个实例为类的类。正如普通类定义某些对象的行为一样,元类定义某些类及其实例的行为。并非所有面向对象的编程语言都支持元类。在那些可以做到的事情中,元类可以覆盖类行为的任何给定方面的程度各不相同。每种语言都有其自己的元对象协议,这是一组控制对象,类和元类如何交互的规则...


1
元类是语言继承层次结构的根对象。.NET是对象。您也可以将接口视为元类。它们独立于继承者的实际“父”类定义其继承者的接口。
KeithS 2012年

1
@KeithS在我所看到的任何上下文中都不是这个词的意思-从CLOS到UML到C#。元类是一个类,其实例为类的类–一个较弱的实现是C#的实现Type,它提供了反射功能,但没有突变(您不能在CLOS中MyType这样说来添加新方法typeof(MyType).Methods += new Method ( "Foo", (int x)=>x*x )
Pete Kirkham

1

我很惊讶没有人提到范畴论。

编程的最基本单位是基于类型的功能。函数通常表示为f:A-> B,其中A和B是类型。如果以正确的方式将这些东西(我称之为类型和函数)放在一起,就会得到一个称为类别的东西。您不必在这一点上停止。

拿这些东西,分类,问问自己,将它们彼此关联的正确方法是什么。如果做对了,您会得到一个叫做仿函数的函数,它介于两类之间,通常表示为F:C->B。同样,您不必停止。

您可以将所有函子以正确的方式组合在一起,如果您正确地做事,您会开始想知道如何将两个函子相互关联。在这一点上,您会得到一个称为自然变换的信息,即mu:F-> G,其中F和G是函子。

此时我的知识变得模糊,但是您可以继续这样做,并继续攀登抽象阶梯。对象和类甚至都无法描述您可以爬上抽象梯子的高度。有许多种语言可以通过计算表达上述概念,其中最突出的是Haskell。因此,如果您真的想知道真正的抽象概念,那就去学习一些Haskell或Agda或HOL或ML。


1

我认为候选人名单中缺少演员模型。

这就是演员的意思:

  • 独立实体
  • 接收消息,并且在接收消息时,可能
  • 创造新的演员,
  • 更新下一条消息的某些内部状态,
  • 并发送消息

该模型超出了确定性Turing机器的范围,并且在查看并发程序时实际上更接近我们的实际硬件。除非您采用额外的(昂贵的)同步步骤,否则这些天来,当您的代码接收数据时,该值可能已在同一裸片的另一侧更改,甚至在同一内核内也是如此。

简短的讨论/简介:http: //youtube.com/watch?v=7erJ1DV_Tlo


您的帖子很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
蚊蚋

0

如果我对您的理解正确,那么您的“升序抽象”可以被认为是越来越大的逻辑封装,主要与代码重用有关。

从一个接一个执行的特定指令开始,我们转到函数/子例程,该函数/子例程将指令的逻辑分组封装或抽象为单个元素。然后,我们有了对象模块,它们封装了与某个逻辑实体或类别相关的子例程,因此我可以将所有字符串操作归为该类下的String所有子集,或者将所有常见数学运算归为该Math模块(或静态类,如C#等语言)下的子集。 。

那么,如果这就是我们的进步,那么接下来会发生什么?好吧,我认为您没有明确的下一步。正如其他人回答的那样,您的进度仅适用于命令式/过程式编程样式,而其他范例则不共享您的抽象概念。但是,如果我有某种可以在逻辑上扩展您的隐喻的东西,那就是服务

从某种意义上说,服务是一个类,它是一个提供功能的实体,但它与您实例化的对象之间的来回交互要严格得多。它们公开了一组有限的操作,隐藏了内部逻辑,甚至不一定在同一台计算机上运行。

同样,有一个很好的区别。在大多数情况下,您将使用一个对象充当服务的代理,并且两者将非常相似,但是作为体系结构,两者是截然不同的。


0

新的抽象形式对您隐藏了底层工作。命名的过程和函数对您隐藏了程序地址。对象隐藏动态内存管理和一些类型相关的“ if语句”。

我建议对您隐藏低级繁琐工作的下一层实用抽象是函数式反应式编程。在http://elm-lang.org/之类的东西中查看“信号”,它隐藏了回调并更新了必须在javascript中显式管理的依赖项。FRP可以隐藏进程间和机器间通信的许多复杂性,这也是大规模Internet应用程序和高性能并行性所需的。

我很确定,这就是我们在接下来的五年左右的时间里都会感到兴奋的事情。


1
FRP很棒,但是它处理的是相当具体的编程(即反应式编程)。对其他类型的程序进行建模不是很好。但是,它所代表的更通用的编程方式-用代数形式编写代码- 提高抽象水平的理想选择。
Tikhon Jelvis

0

集合论-在关系数据库中部分实现,但在诸如SAS和R这样的统计语言中,也提供了与OO不同但可以说更高的抽象级别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.