我的计算机技术「编程」

编程

现代计算机大都是图灵机的物理实现,主流的冯诺伊曼结构的计算机硬件中,数据与指令保存在统一寻址的内存中,计算机程序通过自由组合与调度硬件资源实现功能,编程的本质就是规定调用硬件接口去读取数据与指令(算法)的方式

“只有两种编程语言:大家抱怨的和没人用的。” — 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup)

编程范式

编程范式(programming paradigm),即编程风格。不同编程范式之间的根本区别之一,就是对状态(state)的处理。状态,是程序运行时其内部变量的值。全局状态(global state)是程序运行时其内部全局变量的值,常用的编程范式有过程式编程、函数式编程和面向对象编程。

  • 过程式编程,通过编写一系列步骤来解决问题,每步都是独立存在的,简明直接。编程时将数据存储在全局变量中,并且使用函数进行处理,其中状态都保存在全局变量中,每步都会改变程序的状态,所以随着程序越来越复杂,全局变量的数量也逐渐增加,再加上程序需要不断添加新的功能,也需要修改全局变量,程序很快会变得无法维护
  • 函数式编程源自 λ \lambda λ 运算(数学家阿隆佐·邱奇发明的世界上最小的通用编程语言)不使用或不改变全局状态的函数,唯一使用的状态就是传给函数的参数。一个函数的结果通常被继续传给另一个函数。 因此,这些程序员通过函数之间传递状态,避免了全局状态的问题(通过全局方法可以改变全局状态)。简而言之,不依赖当前函数之外的数据,也不改变当前函数之外的数据,解决了过程式编程中出现的问题
  • 面向对象编程也是通过消除全局状态来解决过程式编程引发的问题,但并不是用函数,而是用对象来保存状态。在面向对象编程中,类定义了一系列相互之间可进行交互的对象。类中的代码主体可以是一个单一语句,或一个叫方法的复合语句。方法就是绑定在类中的函数。面向对象编程有多个优点,鼓励代码复用,从而减少了开发和维护的时间,还鼓励拆解问题,使代码更容易维护。也有一个缺点,编写程序要做很多的事前规划和设计

解决实际问题时需要综合考虑编程的效率、可维护性、可扩展性和可易移植性等多方面因素选择编程范式。参加数学建模比赛,目的是找到比赛场景中的规律通过编程将其映射到计算机中建立一个可行的模型解决相应问题,使用面向过程编程快速的将抽象的规律按照人的理解在计算机中实现即可,数学建模比赛小团队专事专办注重时效,反而而不必去使用面向对象编程写类绑定函数,去从硬件角度出发考虑底层实现使用非结构式编程,虽然最终也能解决问题但显然更没有必要,因此不必拘泥于形式

“优良设计创造价值的速度,快于其增加成本的速度。” — 托马斯·C.盖勒(Thomas C.Gale)

对象

不同编程范式的核心都是处理数据与指令,如果把数据与指令都看成对象,随着看待问题的视角不同与对象的定义不同,可将编程范式大体上划分为非结构式编程,面向过程编程,面向对象编程

请添加图片描述

在计算机的视角看待问题,其对象就是 CPU 与内存里的电路(计算机世界的基石)连通就是 1 断开就是 0,直接操作它们来表达二进制信息,其方式没有太多规律可言,其编程风格即非结构化编程。面向过程编程看待问题的视角介于人与计算机之间,注重编程的形式,其对象是数据与算法,代码可读性更强。面向对象编程是在人的视角看待问题,操作的对象是属性(数据)与方法(算法)的集合,人易于理解具有某些特点(属性)与能力(方法)的对象。

面向对象编程的对象需要实现封装、抽象、继承和多态等特性,核心手段是将问题分解为多个独立的对象进行有机组合解决问题。例如,计算两点间的直线距离,面向对象编程首先实现一个点对象与一个距离对象,然后调用两次点对象与一次距离对象计算两点间的直线距离,它不是最直接的方式,但是低耦合、易维护、易复用和易扩展

封装(encapsulation)包含两个概念,第一个概念是在面向对象编程中,对象将变量(状态)与方法(用来改变状态或执行涉及状态的计算)集中在一个地方—即对象本身。封装包含的第二个概念,指的是隐藏类的内部数据,以避免客户端代码(即类外部的代码)直接进行访问。换句话说,就是利用抽象数据类型将数据和基于数据的操作组合一起,构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,只保留一些对外接口与外部联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交互。用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象,良好的封装能够减少耦合,隐藏信息

抽象(abstraction)指的是“剥离事物的诸多特征,使其只保留最基本的特质”的过程。假设要对人进行建模。人的特征很复杂,头发和眼睛颜色不同,还有身高、体重、 种族、性别等诸多特征。如要创建一个类代表人,有一些细节可能与要解决的问题并不相关。举个例子,我们创建一个 Person 类,但是忽略其眼睛颜色和身高等特征,这就是在进行抽象。Person 对象是对人的抽象,代表的是只具备解决当前问题所需的基本特征的人。

继承(inheritance)在创建类时,该类也可以从另一个类那里继承方法和变量,可以避免重复性的封装,使用已存在的类的定义作为基础建立新类,新类的定义可以增加新的属性或新的方法,且拥有父类非私有的属性与方法,子类可以用自己的方式实现父类的方法

多态(polymorphism)是“为不同的基础形态(数据类型)提供相关接口(函数或方法)的能力”。是对继承功能的优化,即程序中定义的引用变量所指向的具体类型与通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,让程序具有多个运行状态,例如字符串的加法和整数的加法,同样是加法,功能确不同

编程实现

不论何种编程范式都需要使用顺序与跳转两类编程手段去分解实际问题背后的复杂逻辑并通过封装与调用对象逐步的编程解决实际问题

在这里插入图片描述

编程实现的过程需要不断的封装与调用对象,封装通常包含三个层面,全局封装即承载编程语言的外壳,系统封装即编程语言自带的不允许更改的属性与方法,局部封装即自定义的属性与方法且可以嵌套,调用对象同上,每一个层面都有自己的命名空间(Namespace),可以声明变量去实例化对象,与当前空间没有连接的对象则需要先开辟通道导入至与当前空间有连接的任何空间才可调用,全局(Global)空间与系统(Built-in)空间始终和局部空间相连,但是局部空间之间却往往不相连,另外嵌套时如果局部封装中嵌套了局部封装那么对于里层的局部封装和程序的全局封装来讲,外层的局部封装的变量空间就是通常说的即非局部(Nonlocal)或闭包(Enlocal)空间

请添加图片描述

编程后需要让计算机执行,计算机的硬件与系统决定了只能执行二进制数组成的机器码,因此需要将写好的程序转转换成这些机器码,这一过程需要一个转换器(事先定义了从一种语言体系到另一种语言体系转换规则的装置)来实现,汇编语言的符号与机器码几乎是一一对应仅需要一个表查表即可,常用的高级编程语言与机器码间的非常复杂,发展出来不同的转换器即编译器与解释器,编译器是静态的,先编译整个程序成机器码然后再执行整个程序,解释器是动态的,需要执行程序中的哪一句就解释一句成机器码

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值