编程是什么
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 关于编程的演化历史,感兴趣可以看看:编程难在哪里? - 知乎 (zhihu.com)
编程领域
除此之外,特定领域也可以编程,也有对应的开发工具。
比如 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函数,你就要每次输出一次,就打那么多东西,费事、易错、难懂。 就比如说我们学指数计算,
a
8
a^8
a8 我们当然可以写成
a
∗
a
∗
a
∗
a
∗
a
∗
a
∗
a
∗
a
a*a*a*a*a*a*a*a
a∗a∗a∗a∗a∗a∗a∗a 但费事、易错、难懂。
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 。
20分钟通俗讲解编程的基本框架_哔哩哔哩_bilibili 专业来说,编程是抽象化地设计功能。我们通过属性和行为(python叫方法)设计功能,实现操作对象,并通过类对属性和方法进行管理。通过对属性和行为的封装并提供接口,我们创造了函数,以层层封装出需要的功能。
编程的发展
面向对象编程
基本概念:5分钟通俗讲解面向对象编程_哔哩哔哩_bilibili
相关概念
类是工厂,对象是产品。
静态类:新建的类只能用,不能 new分布类:一个类没写完,在其他地方继续写继承:子类继承了父类的特点,使得父类具有多形态
注:本文写作时间较久远,相关概念了解并不深刻,仅供参考
文章链接:https://blog.csdn.net/dao1023/article/details/128738983