关于计算机语言的学习
关于计算机语言的学习
在这个系列的笔记中,我将记录下自己在研究计算机语言的过程中所积累的一些心得体会,笔记的内容将会包括我对编程语言、标记语言的了解,以及我学习各种语言的具体过程。希望这些笔记能够帮助到那些对编程语言感兴趣的朋友们。下面是这一系列学习的路线图规划以及相关的笔记索引。
关于编程语言
在理想情况下,我们当然会更希望能像许多科幻电影中那样,可以直接使用人类语言来向计算机传递操作指令。目前,计算机科学家们在这个方向上也的确取得了显着的进步,并开发出了一系列看似能理解人类语言的产品,例如Siri(苹果)、小艺(华为)等语音助手,以及ChatGPT(OpenAI)、文心一言(百度)这类更新一代的通用内容生成工具。然而,即使不考虑这些产品背后的数学真相,就算AI有一天真的能理解人类的语言,考虑到人类语言中天然存在的模糊性与不精确性,它本身也并不适合用于描述复杂的算法。例如,在“I saw the man in the park with the telescope”这一英文句子中,拿着望远镜的人是我,还是那个男人?在公园里的究竟是谁?人类之所以在大多数时候能够实现相互理解,是因为他们拥有着大量共同的知识和经验。但即便如此,人们之间的误解也依然时有发生。
为了解决上述问题,计算机科学家们专门设计了一系列能精确描述计算指令的符号系统,这些符号系统就是我们今天所知的编程语言(Programming Languages)。换而言之,编程语言就是一套计算机指令的编写规则,其中的每个组成单元都被定义了明确的含义(即语义)以及编写格式(即语法),正因为如此,我们所编写的程序通常被称为计算机代码(Computer Code),而编写代码的过程则被称为编码(Coding)。举例来说,如果我们想让计算机将1和2这两个整数分别存储到a和b两个变量中,然后对它们执行加法运算,其操作指令在编程语言中的表述可能如下所示:
section .data
a dd 1 ; 定义变量 a,并赋值为 1
b dd 2 ; 定义变量 b,并赋值为 2
c dd 0 ; 定义变量 c,并初始化为 0section .text
global _start_start:mov eax, [a] ; 将变量 a 的值加载到寄存器 eax 中add eax, [b] ; 将寄存器 eax 中的值与变量 b 的值相加,结果保存在 eax 中mov [c], eax ; 将寄存器 eax 中的结果存储到变量 c 中; 退出程序(在Linux环境下)mov eax, 1 ; 系统调用号 (sys_exit)xor ebx, ebx ; 返回代码 0int 0x80 ; 调用内核
是不是觉得将两个整数相加的操作指令比想象的要复杂?很遗憾,由于编程语言的最终设计目标是方便人类的使用和理解,故而它们并不属于可被CPU直接执行的机器语言(machine language),后者恐怕还得要用二进制的形式来表示。换而言之,上述指令在计算机中的真面目实际上是一个由0和1组成的数字序列,如果将两者对照起来看,可能会像下面这样:
MOV eax, [a]: 1011 00 000 0000 0000 0100 0000 0000 0000
ADD eax, [b]: 0000 00 000 0000 0000 0100 0000 0000 0100
MOV [c], eax: 1011 00 000 0000 0000 0100 0000 0000 1000
当然,我们在这里所展示的二进制代码只是一种示意性的表述,实际情况还得要取决于计算机具体采用的CPU架构。因此,尽管编程语言可以让我们的编程过程更容易一些,代码的可读性也更好一些,但这也意味着它需要先被“翻译”成机器语言,才能交由计算机硬件去执行。
编程语言的设计类型
目前,尽管市面上现有的编程语言早已琳琅满目、语言的版本迭代也日新月异。但是,无论这些语言在各自的设计上存在着多少不同之处,它们最终都需要被“翻译”成机器语言。根据具体采用的翻译方式,我们可以将编程语言大致分为以下三种基本设计类型:
-
汇编型语言(Assembly Languages):这是一种直接面向计算机硬件的编程语言,由于它将具体的CPU指令改编成了一系列更适合人类编写的助记符,所以在将基于汇编语言的程序交由计算机执行之前,通常需要先用一种被称作汇编器(assembler)的程序将其代码“翻译”回二进制形式的CPU指令。在这里,汇编语言的助记符与CPU指令之间是一一对应的关系,因而,不同的CPU架构使用的指令集通常是不同的,目前市面上较为常见的汇编型语言包括x86汇编、ARM汇编等。总而言之,汇编语言被认为是编程语言中最接近机器语言的一种,通常被称为低级编程语言。
[!NODE] 参考书目
![img]()
-
编译型语言(Compiled Languages):这是一种经过抽象化定义的高级编程语言,目前市面上较为常见的编译型语言包括C、C++、Go、Rust等。这些语言被“翻译”的过程被称之为编译(compiled)。用于执行编译任务的编译器(Compiler)是一个由词法分析器、语法分析器、语义分析器、中间代码生成器、代码优化器以及目标代码生成器等组成的复杂程序,它的功能是分析并理解源代码中的指令,并将其翻译成与目标计算机硬件架构相匹配的机器语言。在其执行任务过程中,被编译的程序被称为源代码(source code),而编译器所输出的就是可被计算机直接执行的机器代码。
[!NODE] 参考书目
![img]()
-
解释型语言(Interpreted Languages):这也是一种抽象层次较高的高级编程语言,目前市面上较为常见的解释型语言包括JavaScript、Python、Ruby等。这些语言被“翻译”的过程被称之为解释(interpreted)。用于执行解释任务的解释器(Interpreter)本质上是一个虚拟程序,它的功能是虚拟一台能直接理解指定高级语言的计算机。换而言之,解释器不会将目标程序的源代码翻译成用机器语言表述的等效程序,它会在“运行程序”的过程中直接逐条分析并执行该源代码中的指令。
[!NODE] 参考书目
![img]()
其中,编译型语言的翻译过程是一次性的,目标程序一旦完成了对源代码的编译,其结果就会以二进制可执行文件袋形式存储在计算机中,后续无论被运行多少次,都不再需要编译器或源代码的参与了。但是,如果目标程序采用的是解释型语言,那么它在计算机上的每次运行都需要有解释器和源代码的参与。也正因为如此,编译型语言通常能赋予程序更快的运行速度,因为它的翻译是一次完成的,而解释型语言则可以赋予人们更灵活的交互式编程体验,因为它的翻译是在程序每次运行过程中逐条进行的。
另外,我们从这里也可以看到高级编程语言相对于汇编语言的另一个优点:可移植性(portability)。一台计算机的机器语言通常是由其CPU的设计者创建的,因此每种类型的计算机都有属于的机器语言。这样一来,我们在笔记本中针对Intel i7处理器编写的程序,通常是无法直接运行在一台装有ARMv8处理器的智能手机上的。而在另一方面,只要拥有了合适的编译器或解释器(它们只不过是另一程序),使用高级语言编写的程序则是可以运行在各种不同类型的计算机上的。例如,我们完全可以在自己的笔记本和平板电脑上运行一模一样的Python程序,因为尽管这两台计算机中装载是不同的CPU,但他们都装配了可用于执行该程序的Python解释器。
关于编程语言的学习笔记
关于具体编程语言的学习,我们需要根据自己所要开发的项目,或者要研究的课题来选择,下面是本人到目前为止以及整理完的、或正在整理的编程语言学习笔记,以及这些笔记各自在本项目中要发挥的作用(它们被维护在我的个人学习笔记库中):
- [[C语言的学习路线图|C 语言学习笔记]]:C 语言是我本人在编程领域的入门语言,这组笔记的主要作用是学习和研究计算机算法与数据结构。
- [[jJavaScript的学习路线图|JavaScript 学习笔记]]:JavaScript 是我在开发 Web 应用/移动端应用时使用的主要编程,这组笔记的主要作用是研究与 C/S 架构相关的分布式开发技术。
- [[Python的学习路线图|Python 学习笔记]]:Python 是我个人在日常工作/学习中最拿手的编程语言,这组笔记的主要作用是学习/研究与计算机系统管理、办公自动化、数据分析、人工智能等相关的技术。
- [[Rust的学习路线图|Rust 学习笔记]]:Rust 是我目前正在学习的编程语言,这组笔记的主要作用是研究与操作系统开发相关的技术。
- [[汇编语言的学习路线图|汇编语言学习笔记]]:汇编语言是我计划要整理的编程语言,这组笔记的主要作用是研究与计算机硬件相关的技术。
关于标记语言
标记语言(Markup Language)是一种用于描述文档结构、语义及其内容元素间关系的文档描述语言。这种语言会通过一系列预先定义好的标记(Markup)来描述文档中各个元素所属的内容类型以及层次结构,目的是将文档的具体内容与其要呈现的外观进行解耦,方便日后的维护和分发。而特定的软件(例如网页浏览器,PDF阅读器等)中自带的解析器会根据相应的文档标准规范(例如 W3C 的 HTML5)来解读这些标记,并结合渲染引擎根据相关的样式表语言渲染出包含多媒体信息的、可读性比较强的文档。
标记语言的功能分类
标记语言中使用的标记通常可以按照功能分为表示性、过程性以及描述性三类,下面来分别介绍一下它们。
-
表示性标记:这种标记侧重于描述文档的简单格式外观,例如文本加粗、居中、缩进等,这种语言常见于早期的文本排版系统,例如,HTML 早期常用的
<b>、<i>、<u>等标签、TeX 中的\textbf{}、\textit{}、\underline{}等命令都属于表示性标记。当然,由于这类标记通常会让文档的内容与外观紧紧地耦合在一起,这会在某些场合中造成文档在维护和分发方面的困难,因此,这类标记如今在许多地方已不再被使用。 -
描述性标记:这种标记侧重于描述文档中各个元素所属的内容类型以及层次结构,例如,HTML 中的
<p>、<div>、<h1>等标签、TeX 中的\chapter{}、\section{}、\subsection{}等命令都属于描述性标记。这类标记通常会让文档的内容与外观进行解耦,方便日后的维护和分发。因此常见于 Markdown、HTML、XML 等主流的标记语言中。 -
过程性标记:这类标记侧重于利用一系列可按顺序执行的指令来控制排版流程,例如,TeX 中的
\newpage{}、\newpage{}、\newpage{}等专用于书籍排版的命令,以及\sum{}、\prod{}、\int{}等专用于编写数学公式的命令。这类标记通常会兼具编程与排版功能,因此常见于 TeX 这类专业的排版系统中。
关于标记语言的学习笔记
关于具体标记语言的学习,我们需要根据自己所要开发的项目,或者要研究的课题来选择,下面是本人到目前为止以及整理完的、或正在整理的标记语言学习笔记,以及这些笔记各自在本项目中要发挥的作用(同样的,它们也被维护在我的个人学习笔记库中):
- Markdown 学习笔记:Markdown 是我在进行日常写作时使用的主要标记语言,用于完成日常笔记的撰写,并利用类似 Obsidian 的双链功能构建笔记库项目。值得一提的是,这部分的笔记被我独立成了一个开源电子书项目:Markdown 使用指南,欢迎读者参考。
- [[LaTeX学习笔记:开场白与索引|LaTeX 学习笔记]]:LaTeX 是我在进行专业文献创作时使用的主要标记语言,它的主要作用是在学习/研究数学、计算机算法等相关内容时完成专业文档的撰写。
- [[HTML 学习笔记]]:HTML 是我在开发 Web 应用/移动端应用时使用的主要标记语言,这组笔记的主要作用是研究与C/S架构相关的分布式开发技术。
- [[JSON 学习笔记]]:JSON 是我在开发网络应用时常用的纯数据标记语言,这组笔记的主要作用是学习/研究基于网络的数据交换技术。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960505.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

