`
pengpeng
  • 浏览: 85206 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【原】编程范式漫谈

阅读更多
            本文最早写在豆瓣:http://www.douban.com/note/341910359/      
      写在前边:我们知道现有语言的编程范式有:过程式,面向对象,函数式,逻辑式。随着软件工业化程度的普及,以及软件的复杂度越来越高,编程语言的发展历程也是从最初的过程式(命令式)语言c,发展到以java语言为代表的面向对象编程语言。而逻辑编程语言(以prolog为代表)和函数式语言(lisp系列)还多用在学术和人工智能领域中。近几年,随着多核,云计算时代的到来。函数式编程语言逐渐浮出水面,最经典的语言以scheme,common-lisp,ml,clojure,go为代表.而且最近的jdk8也逐步加入了functional,closure,lambda等语法,而且scala的作者也越来越推崇编码者以函数式语言的思维来coding。可见编程语言的发展也是满足时代的变化不断变化着。从其中的发展历程中我们可以看到:技术的发展都是在围绕着解决“软件的复杂度”这个基本的需求而发展的。

    一、 编程语言概述
        编程语言是计算机的符号,是人和计算机的通信符号和协议。我们学习一门新的编程语言时,应该观察这门语言的那些特性呢?《SICP》一书的作者列举了一下三点:
       *  primitive elements. (基本元素)
       * means of combination. (组合手段)
       * means of abstraction.  (抽象手段)       
         以上3个特性,基本上涵盖了所有编程语言的特性,并且也是一个语言设计者从开始就要考虑的。我对这三点的理解:primitive elements表示语言的基本符号(基本数据类型,关键字等)也就是词法部分。means of combination利用基本元素通过组合的过程构建大型程序的手段,不同的语言提供的组合手段是不同的,下边我会详细描述。means of abstraction表示抽象,抽象是解决软件复杂度的重要手段,让软件的可读性,可扩展,可重复利用等得到提升。一下会从组合元素和抽象手段来对比更重语言特性。

二、 组合手段
       汇编语言:算是最简单的词法和语法形式了。汇编器通过直译的过程将汇编代码翻译为二进制代码。 提供的primitive elements有:数字,字符,-,+,*,/ , case,if, break, go,指令等基本元素;
       c语言相比汇编语言更高级,让程序员脱离和寄存器,内存直接打交道的工作,提供了更多的组合手段:比如数组,结构体等数据结构。
       java语言自称是面向对象语言,所以比c语言更进一步,通过强大的类型系统手段来组合属性和方法。
       lisp方言以s-expression(著名的S表达式)来组合数据和函数。在lisp中不区分数据和函数,一切皆为数据。

三、 抽象手段
       从c语言开始,以函数为单元提供了对程序的抽象。这样大大的提高了程序的可复用,模块化等。让团队合作编码也成为可能。
      面向对象编程:基本上隐藏了计算机的细节,开发者通过对象来抽象具体业务。但严格意义上来说java也属于imperative-lang的范畴而且都是传值调用。相比来说,python,ruby更面向对象一些,python融合了面向对象和函数式编程范式,更接近自然语言些。
      以lisp为代表的函数式语言:以函数和模块为抽象手段;common-lisp基于宏开发了一套object-oriented的编程方式。 我比较倾向于函数式编程理念:函数的无副作用(不用考虑线程安全,特别是对于变态的Haskell),高阶函数,闭包,lambda等。

四、 类型系统
      大家平时经常会说:javascript是一个弱类型的语言,java语言是强类型的语言。将编程语言从类型系统的角度区分语言也很有趣。一般来说弱类型语言更偏向自然语言一些,语法也很自由活泼些。而现今语言的走势也趋向与弱类型方向.
      实现:
          我们知道计算机是结构化很强的,堆栈上一个二进制位的错误就会导致溢出,bus等错误。所以语言层面的自由得益于编译器或者解释器的功劳。比如java,c等语言有很强的编译时类型检测机制,强类型的好处驱使编码人员写出很少有语法,语义错误的代码,对IDE的支持也很棒,是大型技术团队的基石。
       弱类型语言让我们获取了自由(不需要类型信息),让程序员少敲了许多键盘。自由是有代价的,编译器或解释器中内含类型推理(infer type); 类型推理是利用归一方法,基于上下文中的变量显式类型,操作符,返回值等信息,利用栈和逐渐替换的过程来推到出类型。 弱类型虽然可以轻松编译通过(或者不需要编译而是解释执行),但都是有类型检查过程的,只是将此过程延迟到运行时了。所以弱类型语言结构化不强,编码时很难确保类型无误,IDE,大型团队开发也不友好。 但是通过一些分析器可以不断的检测语法,语义错误,相当于达到了强类型语言的IDE效果。

五、编译/解释
       java语言是解释型还是编译型的呢? 这个很难说,从java source code -> class byte code 的过程式javac编译器的过程。但是byte code 在jvm上执行的过程可能是解释执行也可能是编译执行的。解释型和编译型的内部都遵从编译原理的过程:词法分析-> 语法分析->语义解析 -> 编译器后端-> native code . 的过程。 但有各自的优点:
    解释器:加载code速度快;解释器需要维护运行时上下文等信息。所以加载必要的代码,片段解释执行。但是对于相同的代码都经过编译过程就很多余,造成时间浪费。
   编译器:执行速度快。而且编译器后端也更容易优化中间代码,因为优化过程式一个结构化过程:往往需要遍历整个中间代码,整体优化代码,提高运行效率。   
   runtime:一般来说解释型语言需要在内存维护运行时上下文信息,服务于运行过程中变量的查找,绑定,scope等。 而编译语言基于堆栈模型执行代码,相对来说运行时简单,运行速度也快;
        hotspot-jvm结合了解释和编译的各自优点;最先解释执行过程,如果方法被频繁执行,而且达到热点(hotspot),jvm会启动编译过程,将次代码编译为native-code,然后缓存起来,下一次的调研直接执行即可。     hotspot-jvm执行基于堆栈的指令byte code, 这一点也是基于跨平台byte-code运行的考虑,而牺牲了寄存器指令; (基于android操作系统上的dalvik虚拟机是基于寄存器指令的);  
       所以说,设计一个语言往往是一个权衡过程;获取的“自由”越多,"牺牲“也更大。

六、 总结:
      最初从图灵为了解决莱布尼茨提出的:是否存在一个通用模型来解决一切计算任务这个命题,提出了图灵机。到冯洛伊曼仿真人脑神经元思考过程产生第一台基于存储器,运算器的计算机ENIAC,至今,计算机硬件技术并没有实质性的变化,只是随着摩尔定律的破灭,人们发展了多级高级缓存,多核,多cpu技术来支撑越来越大的计算任务。 在这个过程中,随着人们对逻辑学,符号学,算法的不断研究,用来和计算机交互的语言也越来越抽象和丰富。我们通过这个形象的符号来抽象时间和空间,通过这个形象的符号来解决软件的复杂性问题,通过这个符号来表达指令的计算过程。

                                                                                               --------- 老徐 (2014.03.31)转载请注明出处
分享到:
评论

相关推荐

    NET 4.0面向对象编程漫谈 代码

    面向对象编程是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在.NET 4.0中,我们可以通过以下关键特性实现OOP: 1. 类与对象:类是创建对象的蓝图,定义了对象的属性(数据成员)和方法...

    NET 4.0面向对象编程漫谈 基础篇

    NET 4.0面向对象编程漫谈 基础篇 C#

    net 4.0面向对象编程漫谈 基础篇

    net 4.0面向对象编程漫谈 基础篇

    NET.4.0面向对象编程漫谈 基础篇 金旭亮.pdf

    献给所有对技术充满激情与好奇心的软件工程师们。

    net 4.0面向对象编程漫谈 应用篇

    面向对象编程(Object-Oriented Programming,简称OOP)是一种强大的编程范式,通过类、对象、封装、继承和多态等核心概念,使得代码更加模块化、可维护和可重用。在这个应用篇中,我们将深入探讨这些关键概念以及在...

    [NET 4.0面向对象编程漫谈 应用篇].金旭亮---高清版.pdf

    面向对象编程是一种编程范式,它使用对象来设计软件。对象可以包含数据、代码,以模拟现实世界中的实体。面向对象编程的主要概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和...

    编程思路漫谈(匠人手记)

    ### 编程思路漫谈(匠人手记) #### 一、引言 在《编程思路漫谈(匠人手记)》这篇文章中,作者深入浅出地探讨了单片机编程的一些核心概念与技巧。文章不仅适用于初学者,也为经验丰富的开发者提供了有价值的思考...

    [NET 4.0面向对象编程漫谈 基础篇].金旭亮--高清版.pdf

    面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据,以字段(通常称为属性)的形式表示,以及代码,以方法的形式表示。面向对象编程可以提高代码的重用...

    C语言编程漫谈 pdf

    根据提供的信息,我们可以总结出以下关于《C语言编程漫谈》PDF文档的相关知识点: ### C语言编程漫谈 #### 知识点概述 本PDF文档《C语言编程漫谈》是一份高清晰度且可复制文字版本的学习资料,旨在通过实践的方式...

    net 4.0面向对象编程漫谈(基础篇).pdf

    . NET 4.0 面向对象编程 以面向对象理论为指导,从.NET平台各项技术中精选出一些亮点进行深入的剖析和讲解

    net 4.0面向对象编程漫谈

    在.NET Framework 4.0中,面向对象编程(Object-Oriented Programming,简称OOP)是一种核心的编程范式,它极大地增强了开发人员构建可维护、可扩展和可重用软件的能力。本篇将深入探讨.NET 4.0中面向对象编程的基础...

    [NET.4.0面向对象编程漫谈.基础篇

    本书《基础篇》以面向对象理论为指导,从.NET平台的各项技术中精选出一些亮点进行深入的剖析和讲解,并展示出它们在实际开发中的具体应用实例,不仅让读者能“知其然”,而且能“知其所以然”。...

    漫谈兼容内核.7z

    谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核...

    漫谈兼容内核.zip

    漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...

    架构漫谈(王概凯架构系列文章整理)

    架构漫谈(一):什么是架构? 架构漫谈(二):认识概念是理解架构的基础 架构漫谈(三):如何做好架构之识别问题 架构漫谈(四):如何做好架构之架构切分 架构漫谈(五):什么是软件 架构漫谈(六):软件架构...

    .NET 4.0面向对象编程漫谈 (基础篇)

    本书《基础篇》以面向对象理论为指导,从.NET平台的各项技术中精选出一些亮点进行深入的剖析和讲解,并展示出它们在实际开发中的具体应用实例,不仅让读者能“知其然”,而且能“知其所以然”。...

    客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析.docx

    ### 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析 #### 原生开发技术 ##### Microsoft阵营 **WinForm** - **简介**:WinForm是.NET框架的一部分,用于创建Windows图形用户界面的应用程序。它是.NET ...

    漫谈兼容内核[pdf]

    01.漫谈兼容内核之一:Wine的系统结构.pdf 02.漫谈兼容内核之二:关于kernel-win32的对象管理.pdf 03.漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 04.漫谈兼容内核之四:Kernel-win32的进程管理.pdf 05.漫谈...

    华为防火墙技术漫谈.pdf

    华为防火墙技术漫谈,理论篇共包含十章,涵盖了会话与状态检测、安全策略、攻击防范、NAT、GRE 、L2TP 、IPSec 、SSL、双机热备、出口选路的原理、应用场景及配置方法

Global site tag (gtag.js) - Google Analytics