多天堂语言

2020-11-23 22:43:00

我们需要学习如何有效地使用支持功能,面向对象和过程范式的多范式语言。

编程世界曾经被划分为功能性语言,面向对象的语言以及其他所有语言(大多数是过程语言)。一个人是(至少是业余爱好的)函数式程序员,他们编写Lisp,Haskell或Erlang。或者一个“是” OO程序员(至少是专业的),用Java或C ++编写代码。 (一个人从来没有称自己为“程序程序员”;当这些名字在1990年代从学术界摆脱出来时,称自己为“程序程序员”将类似于穿着宽领带和喇叭裤。)

但是这个世界正在改变。在过去的二十年中,我们看到了结合了功能性和面向对象功能的混合编程语言的兴起。这些语言中的某些语言(例如Scala)从一开始就是多范式。其他语言,例如Python(从Python 2过渡到3)或Java(在Java 8中引入Lambda),都是面向对象的或过程语言,其中添加了功能。尽管我们认为C ++是一种面向对象的语言,但从一开始它就已经是多种范例。它以一种程序语言C开头,并添加了面向对象的功能。后来,从标准模板库开始,C ++受LISP的后代Scheme的许多想法的影响。 JavaScript也受Scheme的严重影响,并普及了匿名函数和作为一流对象的函数的思想。 JavaScript从一开始就是面向对象的,其基于原型的对象模型和语法(尽管不是语义)逐渐演变为与Java类似的语法。

我们还看到了结合静态和动态类型的语言的兴起(JavaScript世界中的TypeScript; Python 3.5中添加了可选的类型提示; Rust具有一些有限的动态类型功能)。键入是范式空间中的另一个维度。动态打字会产生使编程变得有趣且易于生产的语言,而严格打字会大大简化构建,理解和调试大型系统的过程。总是很容易找到赞美动态语言的人,但是,除了00年代后期的几年,动态静态范式并未引起人们的广泛关注。

为什么我们仍然看到函数式和面向对象编程的倡导者之间展开一场神圣的战争?那让我印象深刻,这是一个巨大的机会。 “多范式编程”可能意味着什么?在任何给定的情况下,拒绝纯度并使用任何提供最佳解决方案的功能意味着什么?最重要的软件足够重要,以至于它肯定具有使面向对象的范式更有意义的组件,以及具有功能性范式优越的组件。例如,查看“功能”功能(例如递归)。当然,有一些算法在递归上更有意义(河内的塔楼,或按顺序打印排序的二叉树)。在某些算法中,无论您使用循环还是递归都无济于事(每当尾部递归优化起作用时);当然,在某些情况下,递归会很慢并且需要大量内存。有多少程序员知道哪种解决方案在任何情况下都是最佳选择?

这些是我们需要开始提出的问题。从一开始,设计模式就已经与面向对象的编程相关联。在多范例世界中,哪种设计模式有意义?请记住,设计模式不是“发明”的;他们被观察到,它们是问题的解决方案,这些问题一遍又一遍地出现,并且应该成为您曲目中的一部分。不幸的是,函数式程序员往往不谈论设计模式。当您意识到模式是可观察的解决方案时,“在功能语言中不需要模式”之类的陈述就不再有意义了。函数式程序员肯定会解决问题,并且肯定会看到相同的解决方案反复出现。我们不应该期望这些问题和解决方案与OO程序员所观察到的问题和解决方案相同。哪种模式在这两种范式中都发挥了最佳作用?在给定情况下,哪种模式可能有助于确定哪种方法最合适?

编程语言代表思考问题的方式。多年来,随着我们感兴趣的问题的解决,范式成倍增加。现在我们讨论事件驱动的编程,至少在前端,许多软件系统都是事件驱动的。元编程由JUnit普及,它是第一个广泛使用的依赖于此功能的工具,该功能通常与功能语言相关联;从那时起,几种截然不同的元编程版本使Java,Ruby和其他语言的新事物成为可能。

我们从来没有真正解决过如何使这些范式一起发挥作用的问题;到目前为止,支持多种范例的语言已由程序员自行决定如何使用它们。但是,仅仅临时混合范式可能不是构建大型系统的理想方法-我们现在正在以几年前无法想象的规模和速度构建软件。我们的工具已经改进;现在我们需要学习如何很好地使用它们。这将不可避免地涉及混合我们长期以来一直被视为不同甚至冲突的范例。

每周从行业内部人士那里获得见解,以及有关软件工程主题的独家内容,优惠和更多信息。

查看样本新闻通讯

每周从行业内部人士那里获得见解,以及有关软件工程主题的独家内容,优惠和更多信息。

查看样本新闻通讯