懂得编程语言的通用布局,恣意哪个语言都是手拿把掐 [复制链接]
发表于 2026-2-4 11:24:42 | 显示全部楼层 |阅读模式
编程语言焦点布局体系:从相似性到本质明白
前言

在打仗过多个编程语言的学习之后,观察到一些通用的范式布局,编程语言固然外貌差别巨大,但底层存在一套不可简化的最小完备集——这是全部语言都必须包罗的根本元素,否则无法表达恣意算法。
而把握住这一点之后,对恣意编程语言的学习都有一种脉络极其明了的感觉,一旦相识到这种通用范式的布局,那么对于入门编程语言就会有一个体系性的学习认知框架,知道该学什么,从那边开始学。
这种通用的范式布局就是全部编程语言共有的根本元素,这种相似性源于盘算机科学的根本原理——全部编程语言本质上都是人与盘算机沟通的抽象工具,须要依照盘算机底层实验逻辑的束缚
正是如许的束缚,导致了编程语言在计划时所共同服从的某种规则,也就是那些隐蔽在各种语法外貌之下的共性规律。也由于是解说共性的内容,以是只会涉及到有哪些共性,不会形貌这些共性在详细语言中是怎么表现的内容。
根本要素

任何编程语言都像一座构筑,须要最根本的质料和布局。这些根本元素是表达步伐逻辑的根本单元,它们共同构成了编程语言的根本框架,包罗如下五个部分:

  • 数据表现
  • 表达式与运算
  • 控制布局
  • 抽象机制
  • 输入输出机制
下面按序次举行先容。
数据表现

任何盘算都涉及数据,必须有表现数据的方式
就像是在草稿本上求解数学题一样,特殊是代数内容,有字母、盘算符号以及数值,这些写在本子上的字符是表达这些内容的详细情势,而且可以包管每个学习过代数的人都可以看懂和明白,由于是一套雷同的机制。
变量

起主要先容的是变量,那么为什么要有变量呢?想象一下,在代数中,如果没有变量,只有常量,也就是详细的数值,那么全部的题目都只是数值盘算题目,而且是必须一次性完成的盘算,不大概分步调,迭代式的盘算。
同时在现真相况中,就是有求解未知量的需求,也有某些量在动态厘革的情况,以是单纯的常量无法建构一个复杂且动态的数学天下,对编程而言也同样云云。
在步伐中,变量的作用如下所示:

  • 暂时生存数据,用于分步盘算,克制一次性大量盘算
  • 克制直接使用常量,由于在一个表达式中,常量是无法修改的

    • 假设界说一个穿了增高鞋的人的身高函数为f(x)=x+2,此中变量x表现这个人的现实身高,而整数常量2就表现增高鞋的高度,是固定的数值
    • 如果它只穿同一个增高鞋的话,这个函数没有题目,但是哪天他换了其他高度的鞋子,这个2就不实用了
    • 岂非要为每个鞋子界说一个专属的函数吗,这显然不大概。但是又不知道鞋子详细能给他提供多少身高
    • 以是这时间就换用变量a来形貌,f(x)=x+a,此时这个变量a就代指了增高鞋的高度,根据现实鞋子的增高功能同步厘革,机动度就更高了。

  • 记载步伐运行状态,差别于暂时生存数据只是某一盘算的中心过程,此处的运行状态可以调控步伐的流程和效果
  • 根据输入厘革举动,提供了与外界交互的大概,由于输入是不确定的,只有变量才华形貌这种不确定性
  • 隐蔽内存细节,由于变量本质上是内存中存储数据的位置代称,否则须要直接操纵内存地点,可读性非常差
下面给一个关于代数中的变量与步伐中的变量的对比:
代数编程雷同点变量表现未知数或可变的量本质上是内存中存储数据的位置代称,大概说一个容器的名字1. 两者都是"符号代表值"
2. 都可以被重新赋值
3. 都依照"先界说后使用"的原则
有一个常见的肴杂点,就是符号=,在数学中,=表现的是一种等价关系,只是一种逻辑关系、好比x=5,表现的是x即是5如许一个关系或毕竟表述;而在步伐中,表现的是一个动作,即赋值,也可以形象的表述为把一个值放入进一个容器中,详细来说就是把数值5放入到名为x的容器中,这个x也称为变量。
作为对比,现在有表达式x=x+1,如果从数学的角度来看,这个等价关系是不建立的,但是从步伐的角度来看,就是取出容器x的值,加一后再放归去的意思。
小结一下,可以以为变量就是一种容器(固然也有别的范例的容器),既然是容器那么就是可重复使用的,同时全部语言都必须提供将数据存储在内存中并可通过名称引用的机制,这是盘算的条件,反面的内容表述中,容器就是变量的意思。
标识符

上一末节先容了变量,也提到变量就是容器,但这些都是抽象的概念,也就是说,给你一些看起来千篇一律的容器,然后拿一个小球随机放进一个容器中,并打乱容器的摆放序次,你还能找到小球在哪个容器中吗?
很难对吧,但是如果给每个容器标识一个唯一的名字,那么只要记着小球放入哪个名字标识的容器就可以了,由于此时容器是可辨认的。
现实上只要标识符能唯一确定某个容器,并不会关心标识符由什么构成,但现实是步伐的标识符须要依照一些规范,好比不能以数字开头、不能包罗特殊字符等。
别的尚有一类编程语言独有的预界说标识符,也称为关键字,这些标识符是不可使用的,好比python中的input、print内置函数名。
数据/值

既然有了容器(变量),那么总要往容器内里放入一些东西,对于步伐而言,就是数据,也可以称为值,而把数据放入变量这种容器的动作就是赋值操纵。
数据有很多种范例,好比一样寻常在excel中有文本范例的数据、有数值范例的数据,尚有一些复合范例的数据,这是由于数据泉源于多种情势的运动中。
此中文本范例的数据大概是公司的员工姓名、数值范例的数据大概是员工的薪资、复合范例的数据大概是员工其他信息的组合。
在数学中,数字有整数、小数,复数等范例,同样在步伐中的数据范例也有多种,好比数值范例(整数,浮点数)、布尔范例(真/假)和字符串范例等。
之以是有这些数据范例,就是要界说数据的性子以及差别范例的处置惩罚方式,既可以是同范例之间的运算,好比3+2是两个整数之间的运算;也可以是差别范例之间的运算,好比3+2.5中一个是整数,另一个是小数,界说它们之间的运算方式为:把整数转换为小数之后再与另一个小数举行盘算。
表达式与运算

没有运算就无法盘算
全部语言都支持将值通过运算符组合成新值,而这种由变量、常量和运算符组合的情势就是表达式,好比x + 5 * 3,和数学中的情势很像,而且一样平常情况下运算符的语义也是相通的。
如许的表达式称为算术表达式,可以包罗变量和常量,也可以通过小括号改变运算序次,但是差别于数学中如许的表达式只表现关系,在步伐中,如许的表达式会现实盘算值,也就是有一个算术效果,而且乘号不能省略。
接下来是比力与逻辑运算,好比数学中x > 5,表现变量与数值的关系,是如许一个毕竟陈诉:x大于5;在步伐中,如许的表达式称为布尔表达式,会产生一个布尔值(真/假)。
要记着只要是值就可以赋值给变量,好比is_greater = x > 5,那么如果x>5,则变量is_greater生存的效果就为一个逻辑真值,在python中就是true,否则为一个逻辑假值false,一样平常布尔表达式用于条件判定,好比if条件判定。
控制布局

控制流就是逻辑的表达
根本控制布局有下表所示:
元素本质作用阐明序次实验默认实验方式语句按序次依次实验条件分支根据条件选择路径必须支持if或等价机制循环/迭代重复实验代码块必须支持while或等价机制跳转/返回改变实验位置,表现头脑的跳跃如return、break此中序次实验图示如下:
graph TD    A[开始] --> B[步调1]    B --> C[步调2]    C --> D[竣事]按照规定好的工序一步步序次实验,不完成步调1,就不会实验到步调2,就好比洗完澡穿衣服,正常的序次应该是先穿亵服再穿外衣,也就是步调1是穿亵服,步调2是穿外衣,扫除不穿亵服的情况,那么应该没人会先实验步调2穿外衣,再实验步调1穿亵服吧(不会吧不会吧😲😲)
条件分支图示如下:
graph TD    Start([开始]) --> Condition{条件判定}    Condition -->|True| ProcessA[实验操纵A]    Condition -->|False| ProcessB[实验操纵B]    ProcessA --> End([竣事])    ProcessB --> End一个逻辑判定只会产生两个效果,不是真就是假,好比你本日放工买菜了吗这个逻辑判定,要么买了,要么没买,以是对应到图上,只会产生两条支路,如果买菜了,那么就实验操纵A,可以是自己做晚饭,如果没买菜,那么实验操纵B,可以是点外卖
循环布局图示如下:
graph TD    Start([开始]) --> Init[初始化计数器]    Init --> Condition{判定循环条件}        subgraph 循环体        Process[实验循环操纵]        Update[更新计数器]    end        Condition -->|满足条件| Process    Process --> Update    Update --> Condition    Condition -->|不满足条件| End([竣事])循环,可以明白为就是重复,好比你操持一个长达1年的早起风俗养成目标,那么对应到图上,循环条件就是不满365天,也就是还在风俗养成过程中。
然后循环体中就是要实验早起这个动作而且累计早起天数,从开始早起的第一天算起,反面天天早起都增长天数,直到高出365天,这时间就恭喜完成1年的目标啦
对于跳转和返回这类非序次的控制流,关键在于冲破默认的从上至下的实验序次,但一样平常用在循环的竣事条件和函数上下文切换中,其他地方不保举使用,好比goto语句,由于属于逻辑跳跃,倒霉于明白。
其次是全部图灵完备语言都必须支持条件判定和循环(或等价的递归),这是表达恣意算法的须要条件
抽象机制

没有抽象就无法管理复杂度
从本质上讲,抽象就是信息隐蔽——将复杂的内部实现封装起来,只对外提供须要的操纵接口。这就像驾驶汽车:你只须要知道油门、刹车、方向盘,而不须要相识发动机怎样工作、变速箱怎样换挡。在步伐中,根本的抽象的情势紧张有:函数/过程,类与对象。
函数/过程​

什么是函数呢,本质上是将一段完成特定任务的代码封装成一个独立的、可复用的单元,通过界说输入(参数)和输出(返回值)来隐蔽内部实现细节。
它是最根本、最焦点的编程抽象机制。通过这种方式我们可以将复杂体系分解为易于明白和管理的小模块,全部实用语言都提供代码构造成可复用单元的机制,否则无法编写大型步伐。
形象的明白函数,可以以为函数就是一台呆板,扫除额外的改造之外,每台呆板都有各自的功能,这是在呆板诞生之日起就固定下来了,好比吸尘器,顾名思义,就是吸入尘土的。
也就是说吸尘器的输入是尘土,尘土颠末吸尘器之后会有一个输出,一团圆集的尘土,这是呆板的理想工作状态,那如果输入纸巾呢,好像也委曲能吸收吧,大概有的呆板处置惩罚的不是很好吧,但如果输入砖头呢,应该没有哪个吸尘器醒目这个事变吧。
以是一台呆板的输入是有规定的,固然它的输入是不受呆板自身控制,而泉源于外部,但是如果想要正常使用呆板的功能,那么就不能由着自己的性子,想输入什么就输入什么
同样的对于输出而言,这是呆板自己固定的部分,吸尘器不能把尘土变成黄金,同时对于输入是砖头时,吸尘器也不知道该输出什么,它直接罢工不干了。
总结下来,函数的焦点作用如下所示:

  • 代码复用,一次界说,多次使用
  • 可维护性,修改一处即可
  • 可读性,函数名表达意图
  • 错误排查,错误会集在函数内
那么该怎么使用函数呢,起首就是界说的题目,也就是确定函数的作用函数的输入以及函数的输出,即函数名、参数以及返回值。作为对比,可以和数学中的函数界说举行比力,
数学头脑编程头脑函数是一种映射关系,  
从界说域映射到值域函数是一个可实验过程,  
会现实盘算出效果函数的输入来自于界说域函数的参数有范例束缚函数的输出来自于值域函数的返回值也有范例束缚须要注意的是,须要区分函数的界说与调用,也就是先有界说才可以调用,好比先有函数f(x)=2x,才会有f(2)=2*x=4这个盘算过程。
输入输出机制

没有I/O的步伐无法与外界交互
一样寻常中,我们能感知到的输入输出机制就是在使用手机的过程中,好比刷手机时,手指滑动屏幕,会切换到下一个视频。
此时输入就是手指滑动这个动作,输出就是手机屏幕做切换视频的动作,这就是一种与用户交互的方式,可以很直观的被用户感知到。
全部实用语言都提供与外部天下交互的途径,否则步伐的作用就被限定在盘算机内部。
除了这种显式的交互方式,尚有就是隐蔽在体系内部发生的输入输出过程,这里涉及到多层级的过程,对于用户而言,输入和输出都在最外层。
这个过程就像食品加工过程一样,好比水果罐头的加工过程,如下图所示:
graph TD    %% 输入源    水果质料[🍎 水果质料] --> 质料预备        %% 第一层:质料预备    subgraph 第一层_质料预备        质料预备[质料预处置惩罚
输入: 水果质料
输出: 清洁果块] --> 装罐[装罐与糖水灌注
输入: 清洁果块 + 糖水
输出: 半成品罐头]    end        %% 第二层:密封杀菌    subgraph 第二层_密封杀菌        装罐 --> 密封杀菌[密封与杀菌
输入: 半成品罐头
输出: 杀菌罐头]    end        %% 第三层:成品处置惩罚    subgraph 第三层_成品处置惩罚        密封杀菌 --> 冷却包装[冷却与包装
输入: 杀菌罐头
输出: 包装成品]    end        %% 终极输出    冷却包装 --> 成品[🍑 整果罐头成品]        %% 样式设置    style 第一层_质料预备 fill:#fff3e0,stroke:#ef6c00,stroke-width:2px    style 第二层_密封杀菌 fill:#f3e5f5,stroke:#8e24aa,stroke-width:2px    style 第三层_成品处置惩罚 fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px    style 水果质料 fill:#ffccbc,stroke:#d84315,stroke-width:2px    style 成品 fill:#c8e6c9,stroke:#388e3c,stroke-width:3px输入输出关系标注规则如下所示:

  • 输入:当前工序吸收的物料/半成品
  • 输出:当前工序处置惩罚后产生的物料/半成品
  • 每个工序框内都明确标注了输入和输出内容
  • 箭头方向表现物料流向,即上一工序的输出是下一工序的输入
对比到app的登岸验证过程中,用户输入暗码->app内部做验证->返回验证效果,对于用户而言内部怎么做验证是不须要关心的,只要暗码准确就应该登录进账户,暗码错误就应该无法进入账户。
而对于app而言,它不会直接吸收到用户的输入,用户的输入直接给到了键盘,这中心尚有操纵体系的工作,app只是吸收了某一过程的输出作为输入。
同样对于验证效果而言,用户能看到的只有屏幕,但是屏幕绝不会做验证暗码的事变,现实上app输出的验证效果也不是直接给到屏幕作为输入的,这个验证效果也要颠末操纵体系的底层操纵,输出给屏幕,然后屏幕再输出给用户表现效果。
在学习编程时,都会想要看到反馈的效果,一个广泛的做法是把效果或其他信息输出到屏幕上,好比python的print函数,就可以输出信息到屏幕,好比print("读取文件失败")这一语句就表现步伐想要读取某个文件,但是读取失败了。
那么接下来可以就为啥会读取失败这个题目,有针对性的调试代码了,这种信息就是调试信息。而这个print函数着实并不能直接驱动屏幕,它只是触发了驱动屏幕的开关,给了下一层级一个输入,也就是哪个调试信息文本,整个流程就和上面先容的水果罐头加工过程一样,涉及到底层I/O操纵。
总结

颠末以上内容的先容,我们知道在学习新语言时,就应该先把握住如下重点:

  • 它怎样表现数据(变量、值),怎样声明变量和赋值,有哪些数据范例
  • 它怎样举行盘算(运算符、表达式),有哪些根本运算符(算术、比力、逻辑)
  • 它怎样控制流程(条件、循环),怎样写条件语句(if或等价情势),怎样写循环(while/for或等价情势)
  • 它怎样封装代码(函数、作用域),怎样界说和调用函数
  • 它怎样与外界交互(I/O),怎样读取输入和输出效果
一旦对编程语言的认知框架形成,根本就把握了使用这个编程语言的本领,处置惩罚一些简单题目是完全富足的。
在明白语言共性时,应关注功能等价性而非语法相似性。比方,Python的缩进和C++的花括号都是表达代码块的方式,本质雷同。
这种"透过语法看语义"的视角,才华真正把握编程语言的共性规律。
加油吧,每个初学编程的朋侪。

原文链接

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表