编程是什么
2022-3-16
#计算机 #编程
这篇文章将讲解编程的基础概念,带你对编程语言有基本的认识,以便学习时能更加高效。
编程的概念
你面前的电子设备,包括手机、电脑、手表是如何工作的?
主要是两大部分组成
- 硬件:也就是设备本身,由世界上或大或小的公司生产芯片、电路板等等,将其组合在一起
- 软件:通过对设备的编程,产生“软件”,使硬件按照我们的需求进行工作
那,计算机是如何工作的?
比如一个灯泡,想让他关掉,你会把开关给开一下。两个灯泡,你要调两个。多个,要调多个。
有趣的是,你可以将电路串在一起或并在一起。串在一起的需要全部打开所有开关,并在一起的只需要任意一个开关。
除此之外,你把电路接地,电流就会往地上跑(电阻小),此时你断掉开关,反而会跑到灯泡;打开开关,灯反而灭了。
这就赋予了计算机编程的能力。我们将这些概念抽象后,恰好发现万能的数学有一个分支叫布尔代数,恰好可以解决计算机运算的很多问题。
这就是最基础的三种电路,与或非,他们的组合可以组成最基本的两种设备:运算数据的加法器,存储数据的寄存器,继续组合可以增强运算能力或存储能力。
在计算机发展早期,编程没有抽象的编程语言和逻辑符号,通过对电路板的电路开关直接进行或开或关,或者把电线从一个接口接到另外一个地方,使得他们的数据和运输方式发生改变。
这种编程,就是对计算机硬件直接编程,逻辑化后,我们称这种编程语言叫机器语言。
之后伴随着对编程的需求,我们不断优化程序的描述方式,让编程语言跃进发展。
编程语言
随着计算机规模的增大,对程序员(接线员)的要求越来越高,这种方式容易出错且费时费力。
于是程序员将机器语言组合起来,抽象成数学符号,规定哪些是读取数据的命令,哪些是加法的命令等等,由此诞生了汇编语言。
程序员只需要用汇编语言把程序写好,然后经过链接器,自动处理成机器语言给计算机听。
汇编语言同样用久了,会感觉不是足够舒服。有些命令还是可以组合起来一起用。之后,汇编语言随着发展继续抽象,变成了高级语言。
高级语言就简洁了很多,使用起来会更加高效。
运行方式还是套娃,编程软件先把高级语言编译成汇编语言,然后汇编语言转化为机器语言。
完美
高级语言还能抽象吗?
可以,但没必要,曾经有人抛弃了输入语法的过程,全程采用可视化编程,但后来效果并不好,无法精细的表达意思、代码测试也有很多问题。
对程序员来说,高级语言够用了,目前的高级语言还可以很多 IDE 、插件有可视化设计、调试的功能。
C语言 是最基础的高级语言,可以直接访问计算机硬件,一般用于电路设备的编程,比如电子信息的学生就用这个。
为了让 C 拓宽更多功能,解决其在应用软件编程时效率不高的问题,诞生了「C++」和它的老乡「Objective-C」,都是C的后代,但设计思路和C++不太一样,主要是苹果在用。
C/C++ 一度是各种编程语言、设计工具的鼻祖。
- 其他编程语言诸如 Java、C#、PHP、Lua、Go等语言,都是基于这样的语言开发的,使得功能专业化。
- 比如 Java 广泛应用于前端设计、工具开发、安卓开发,是目前就业市场的主流语言之一。
- Windows、硬件驱动的开发,就是使用 C/C++ 为核心的语言开发的。
- 3D引擎也是基于此开发的
还有一个语言叫 Basic ,它和「C语言」也是一个辈分的,后来在微软手中变成了「Visual Baisc」再往后变成「.Net VB」。
今天,微软Office就内置了 Visual Baisc 程序,支持在Excel、Word、PPT中发挥更多编程和设计功能。
但也没有更方便的语言呢?
有,Python 是目前最简洁的编程语言之一。
为了减少高级语言编译的过程,Python、JavaScript 这样的语言直接逐条执行(解释),因为不需要转化为特定的「二进制文件」,而是用脚本就能运行,所以也称为 脚本语言 。
虽然这类语言出现了性能羸弱的情况,但人们依然喜欢用它进行写点小工具、在特定领域发挥作用,因为简单易用。
一般来说,不同语言有对应的特点。通过编程语言的热门指数 TIOBE Index - TIOBE ,可了解编程的分工格局,但不能认为热度高就是最好的,没有最好的语言,只有最合适的语言。
以上内容还可以参考:Crash Course Computer Science 关于编程的演化历史,感兴趣可以看看
编程领域
除此之外,特定领域也可以编程,也有对应的开发工具。
比如 Matlab 是数学分析软件,同样可以进行编程、设计,主要在数学领域进行建模、分析发挥作用,操作方面比Python还简单不少。
MATLAB、Maple、Mathematica 被称为三大数学分析软件。
比如诸如「Unity」、「UE4」这样的3D引擎,可以实现对画面的设计、模拟等功能。
这样的工具也是基于C++、C#、Java、JavaScript、GLSL及各类脚本开发的。
编程环境
顺带一提,编程语言需要有对应的 [[编程方式]] ,这样才能提高使用编程语言的效率。
编程语言的软件由最基本编辑器、处理工具组成,写好的程序在操作系统上运行
- 编辑器用来写字符、数字啥的;
- 处理工具用来把你写的东西给处理出来;
- 操作系统用来运行程序
比如安装 python ,实际上安装了两个工具,编辑器 IDLE,Python 解释器核心。
如果用 pyinstaller 对程序进行打包,就可以获得代码经过解释器处理后的程序,可以直接在操作系统上运行,不需要再安装python解释器了。
编程软件
编程软件是由多部分组成的,包括编辑器、编译器、链接器、调试器、版本管理等等,集成起来的叫整体叫 IDE。
- 编辑器就是写文字、代码的工具,一般需要代码高亮、自动补全、错误提示,提高开发效率
- 编译器是把代码转化为机器语言的工具,是编程语言的核心
- 预编译:变成组合文件
- 编译:变成汇编语言
- 处理:目标文件.obj
- 链接器:整合用到的文件,变成机器语言
- 解释器是特殊的编译器,它的特点是一步一步执行,所以一般不像编译器一样打包完了再执行
- 调试器:也是一种特殊的编译器,用来中断执行代码,是 debug 工具
- 版本管理:管理好不同的版本记录
- IDE:把以上工具集成起来的整体
- 操作系统:运行生成的 exe 文件
一个方便的软件可以事半功倍,我建议使用最简单的工具,然后熟练后再增加复杂度。
- 比如一开始编程 Python,可以用自带的 IDLE,别看他小,人家是一个 IDE。
- F1 可以打开Python文档,这个太有用了
- 刚打开IDLE,是个解释器,直接可以输入并执行。比在cmd里执行要好的多
- 上一条命令:Alt+P,相当于在shell里按上方向键↑
- 运行:F5,Breakpoint 甚至可以断点运行
- 熟练后使用 Pycharm,用自动补全、错误提示来熟悉更优雅的代码写法,还可以学习使用 Git 等工具
- 等很熟练之后,可以使用 VS Code 来编辑,使用插件来感受原来的功能,拓展软件的可能性
- 再往后,可以试一下 Vim 来编辑, Git 来版本管理,最自由化管理程序
这个过程最好不要跳,否则会因为对功能的不熟悉,出现代码错误找不到,程序错误修不了等情况
更多编程软件可见:[[编程方式]]
跨平台
因为不同系统运行的程序不一样,有的编程语言就在每个 OS 准备了一个虚拟机,这样的话一个程序就可以跨平台运行了。
比如对 Java 来说
- 编程过程:
- 准备一个编辑器写好
.java
代码 -
.java
和对应的库经过 JDK 编译成了.class
-
.class
可通过 JVM 运行
- 编程工具组成:
- Java IDE = JDK + 编辑器 + 其他编程工具
- JDK = JRE + 开发工具(编译程序)
- JRE = JVM(运行程序) + 核心类库(被调用)
开发框架
除了 IDE,以编程语言为基础还有开发框架,提供库、功能的支持。
比如软件领域, C++ 有「.Net」「QT」这些这两个比较知名的开发框架。
比如 AI 领域,Python 有「TensorFlow」、「PyTorch」这两个很好用的框架。
编程的语法
说了编程的基本概念,接下来我们来看看编程是该怎么写的。
和一门自然语言(汉语、英语等)一样,计算机有自己的语法结构,包括数据类型、语句结构等等。
数据类型
首先我们定义几种基本的量,用来区分和计算
- 数字:最基本的东西,十进制
- 整型:整数,123就是一百二十三
- 浮点型:由精确位和指数位组成,比如123会存成两部分:0000123(精确位0-8388608)和002(指数位0-255)(我记得不太清了,但大体是这样)
- 复数:和浮点型类似,复数也是两部分,实部和虚部组成的,实际上是复合类型
- 字符:我们把刚才的数字进行编码,然后做个一一对应的编码表,就可以表示字母、汉字等东西了
- 字符串:我们说话不会说一个字,需要把多个字符组合起来,这也是是后面要讲的复合类型
- 序列(列表):按顺序给一堆量编个号,放一起统一管理,比如字符串、数组
- 元组:固定的列表,每个编号的量不再改动
- 字典:二维的列表,每个编号存两个量,一个叫键,一个叫值,键对应值,比如名字对应王福昊
- 集合:不重复的列表,如果列表里由两个或更多相同的量,变成集合后,这个量就只剩一个了
- 其他结构
- 结构体:列表要求数据类型要一致,为了存储不同数据我们创造结构体使不同数据共存,同时可作为模板做到批量生成不同数据
- 共用体:互相覆盖的结构体
- 类:既可以像「结构体」一样把各成员实例化,也可以构造函数
- 枚举:批量
#define
- 指针:对地址进行编辑
在C语言中,一个变量是什么类型,要预先说明,否则报错。
int a;
a = 1;
float b;
b = 3.14;
char c;
c = "hi";
int d[5] = {1, 2, 3, 4, 5};
在Python中就省事,直接定义,python自动识别。
a = 1
b = 3.14
c = "hi"
d = [1, 2, 3, 4, 5]
其他语言都差不多,比如Shell脚本语言(高级语言的一种,用来向操作系统输命令,一般比较简单)
a = 1
b = 3.14
c = "hi"
d = ( 1, 2, 3, 4, 5)
然后我们可以用语句将他们组合起来,比如上述定义变量的语句,就是用 这个运算符实现的。
除此之外,运算符还有很多,自行查找即可。
语句结构
在编程中,出于习惯形成了三种基本的语句结构。
- 顺序:做完第一个做第二个,然后第三个,以此类推
- 分支:如果满足,就XX,否则,就YY
- 循环:把一段语句重复很多次,for循环是让某个东西循环多少次,while循环是满足某个条件就循环
不同语言的语句规范大同小异,我就不举例了
编程就是对各种量进行处理的过程,处理其实就是函数,有输入对象,变成输出对象,编程里有自己的叫法。
- 函数:比如
y = function(x)
就是把x经过function函数赋值给y - 方法:比如
y = x.method()
就是把x经过method方法复制给y - 其他:比如
S = a*b
、*p = NULL
、for i in ls:
等等,都是把一些东西赋值给另一个东西
虽然我们只能看到函数、方法的名字,给我们的,只有一个括号来输入。
实际上,函数是有自己的语句的,但藏起来了,没被看到。
比如 print()
函数长这样
def print(
*values: object,
sep: str | None = ...,
end: str | None = ...,
file: SupportsWrite[str] | None = ...,
flush: Literal[False] = ...,
) -> None: ...
如果没有print函数,你就要每次输出一次,就打那么多东西,费事、易错、难懂。
就比如说我们学指数计算, 我们当然可以写成
print()是一个内置函数,在写程序的过程中,你如果自己写的一段代码用的很多,也可以自己写一个函数。
比如python你经常使用 print("hello")
这句话,就可以用def定义一个函数,起名叫hello吧。
def hello():
print("hello")
然后你就可以用函数 hello()
来代替这东西了。
当你运行时,编程语言会调用这个函数,运行 print("hello")
。
C语言等类似,都是定义函数,然后复用,就不多举例了。
以上是编程语言的基本组成部分,还有一些以后再写。
这些部分组合后可以实现很多功能,当今计算机应用如此广泛,就是这些功能的产物。
函数、类、库
编程是由最基本的一些语句组成的,比如基本的运算、转换数据类型等,为了批量运行,我们将其封装成函数、类等功能,实现抽象化。
这比较像数学,当你学会一个二级结论的时候,比如▲三角形面积公式,就不愿意一点点计算了边、高、勾股定理了。
当我们编程时,经常发现自己的功能可能不够用,而别人已经写好了我们需要的功能,基于不要重复造轮子的原理,拿别人的功能过来用是非常好(懒)的方法。
那如何才能弄到手呢?
对 python
来说,它内置了一个叫包管理器的功能(叫 pip
),用来在命令行中快速下载需要的库。
比如 pyinstaller
是一个可以把 .py
文件编译为 .exe
的库。我们只需要打开命令行(比如Cmd或Powershell),然后运行pip,也就是输入 pip install pyinstaller
,稍等片刻即可安装完成。
然后我们就可以在命令行中调用pyinstaller来安装程序了,比如 pyinstaller -F xxx.py
。
专业来说,编程是抽象化地设计功能。我们通过属性和行为(python叫方法)设计功能,实现操作对象,并通过类对属性和方法进行管理。通过对属性和行为的封装并提供接口,我们创造了函数,以层层封装出需要的功能。
编程的发展
面向对象编程
相关概念
类是工厂,对象是产品。
- 静态类:新建的类只能用,不能 new
- 分布类:一个类没写完,在其他地方继续写
- 继承:子类继承了父类的特点,使得父类具有多形态
注:本文写作时间较久远,相关概念了解并不深刻,仅供参考