关于搜索式的学习

关于搜索式的学习

在刚入门计算机编程时,往往出现以下情况:

我们看到一个专有名词:“GUN”,我不知道它的意思。现在在百度、知乎、维基上进行查找。

GUN(0):Unix(1)系统被发明之后,大家用的很爽。但是后来开始收费和商业闭源了。一个叫 RMS 的大叔觉得很不爽,于是发起 GNU 计划,模仿 Unix 的界面和使用方式,从头做一个开源(1)的版本。然后他自己做了编辑器(1) Emacs 和编译器 GCC(1)。GNU 是一个计划或者叫运动。在这个旗帜下成立了 FSF(1-),起草了 GPL(1-) 等。接下来大家纷纷在 GNU 计划下做了很多的工作和项目,基本实现了当初的计划。包括核心的 gcc 和 glibc。但是 GNU 系统缺少操作系统内核。原定的内核(1) HURD,一直完不成。同时 BSD(1-)(一种 UNIX 发行版)陷入版权纠纷,x86 平台(1)开发暂停。然后一个叫 Linus 的同学为了在 PC 上运行 Unix,在 Minix 的启发下,开发了 Linux。注意,Linux 只是一个系统内核,系统启动之后使用的仍然是 gcc 和 bash 等软件。Linus 在发布 Linux 的时候选择了 GPL,因此符合 GNU 的宗旨。最后,大家突然发现,这玩意不正好是 GNU 计划缺的么。于是合在一起打包发布叫 GNU / Linux。然后大家念着念着省掉了前面部分,变成了 Linux 系统。实际上 Debian,RedHat 等 Linux 发行版中内核(1)只占了很小一部分容量。

以上标红的专有名词,如果我们一个都不认识,那么整段话就不太可能看得懂。这时候,你又要去寻找这些名词的词条解释,很大概率上,这些词条解释又包含了大量的你不认识的专有名词。一般有两种方法解决这种困境:一级一级搜索专有名词,直到你能看懂为止;翻阅相关的专业书籍,从下到上构建一个体系。前者的特点是即时且成本低(立刻就能获取你想知道的名词信息)但却不成体系,后者的特点是基础稳固能保证准确性但很难快速解答你当前疑惑点。今天我们就以前一种方式试着搞懂这一段话。看看我们需要多少层级共多少个点能比较有条理地捋清上述概念。

Unix(1):是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,主要用于工程应用和科学计算等领域。

操作系统(2 close):操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

开源(1):开放源代码(Open source code)也称为源代码公开,指的是一种软件发布模式。一般的软件仅可取得已经过编译(2)二进制可执行档(2),通常只有软件的作者或著作权所有者等拥有程序的原始码。有些软件的作者会将原始码公开,此称之为“源代码公开”,但这并不一定符合“开放源代码”的定义及条件,因为作者可能会设定公开原始码的条件限制,例如限制可阅读原始码的对象、限制衍生品等。

编译器(2):高级语言(如c语言)通过编译器解释为汇编(3)语言再通过汇编器解释为机器语言(二进制语言 binary language)然后硬件通过内核(3)进行执行。

解释器(2+):我们前面已经讲过了什么是编译器,解释器和编译器所做的事情只有一点不同:编译器是在程序还是源代码(高级语言,如c语言、python)的时候将它转换成机器可以直接可以读懂的二进制程序,而解释器则是在程序运行的过程中实时的将代码转换成机器需要的机器码。解释器的运行效率基本上是比不上已经编译好的程序的。人们为了解决这个问题,发明的 JIT 技术,JIT 是 Just in time 的缩写,这个技术的原理其实非常好懂,因为程序代码有经常执行和不经常执行的区分,所以解释器可以在程序运行的过程中将经常执行的代码优化后进行编译,之后的运行中如果还要使用同一段代码就可以直接调用编译好的部分,使得代码的执行效率有了很大的提升。

二进制可执行档(2):.exe文件。通过反编译.exe文件大概率不能得到原始码,因为在编译过程中有信息丢失。能不能反编译,为什么有时不能反编译……这又是一个相对较大的问题。

汇编是平台相关的(3):汇编语言一般都和硬件平台有很深的联系(汇编与CPU的指令集相关,指令集是硬件层面的东西),Java的跨平台是“一次编译,到处运行”。Java在编译的时候没有编译成指定CPU类型的汇编代码,也没有和具体操作系统的系统调用相关联,所以编译出来的结果是和CPU,操作系统都不相关的。Java编译出来的是一种字节码,这种字节码必须在Java的虚拟机上才能运行,Java虚拟机会屏蔽不同操作系统,CPU之间的差异。C编译出来后,就是指定CPU类型的汇编代码,编译过程中肯定也要和具体操作系统的系统库相关连,所以做不到Java那种跨平台。但是,如果写的C代码,没有直接调用任何系统调用,这个代码在不同的平台下都能编译,也能运行。和Java的区别是,C要在不同平台上分别编译。有些语言如JavaScript,Python等,他们是解释(2)执行的,不存在编译过程,所以也能跨平台,前提是必须要有一个对应的解释器。

内核(3 close):人与操作系统交互,操作系统中有一块程序与电脑硬件交互,规定了最基本的操作,如IO(输入输出)、网络、内存管理、驱动、调度,该程序称为内核。

编辑器(1):编辑器和编译器不同,编辑器面向用户,用户在编辑器上写源码,编译器将源码编译成汇编语言。常见的编辑器有vim,visual studio(2)(ide其实和编辑器差不多,可以理解为功能扩展的编辑器)

学习visual studio(2):在windows平台上(像工科大学生windows平台的占有率应该是80%以上的),而visual studio作为汉化完全,编译器自研,微软官方出品的IDE(集成式开发环境),在windows平台上是无可争议的第一。 除了代码编辑,Visual Studio IDE 还将图形设计器、编译器、代码完成工具(3)源代码管理(3)、扩展以及更多功能集中在一个位置。 观看此视频以熟悉 IDE 并了解如何使用它完成基本任务。

代码完成工具(3):代码高亮,自动联想等等。

源代码管理(3):将大型工程的各个源代码有机结合起来的管理方法,可以通过软件来实现,如git(4)

Git(4):先了解什么是版本控制系统(5)。如果你之前使用过SVN(5),那么Git和SVN是类似的。git是一种分布式的版本管理系统,Linux的创造者Linus写的。GitHub是基于git的代码库托管站,也算是程序员的SMS(以码会友),其中一个主要的开源代码发布或托管站git的作用就是对文件进行版本管理,方便在不同版本进行切换修改,类似文件分不同时间备份让后需要时找回其中一份代替,不过更方便使用。GitHub某种程度上就是代码的网盘,也有开源开发商作为代码发布、存放、征集Bug和意见用。

版本控制系统(5):你可以先简单的理解成“可以追踪每次文件修改的系统,如果你某次修改出错,想回退,那么可以回退到某次修改,避免一些灾难性事件发生(比如电脑坏了、硬盘烧了)”。

SVN(5 close):SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。svn是个中心化的东西.啥意义嘞,就是说svn是有一个服务中心的,总的代码就在这个服务中心上,然后其他各个电脑上的客户端可以链接到这个中心,从而可以从中心拉取代码以及提交代码.svn中有“权限”的概念,每个人只能看到你应该看到的代码。在几个人同时修改一个代码的时候可能会发生冲突。Svn还可以进行回滚操作。

x86平台or arm平台(1 close):不同平台有不同的指令集,汇编出的机器码也不同,因此机器码不能在不同平台上成功运行。

我们看到,为了搞懂这一段文字,我们平均需要的搜索层级是3层,一共搜索了16次,意味着平均每一个问题包含着2.52个新的专有名词。其中最深的层级达到了5层,因为出现了部分偏题的情况,我们在不知不觉中,好奇心被其他的问题吸引走了,如“为什么java、python等解释性语言能进行完全的反编译?(在不主观加密的情况下)”。在理解这段关于“GUN”的技术性文档的过程中,我发现:至少我的脑子是不适合处理并行程序的,我还是适合单线的、有逻辑的书本式学习。还是那句老话,一口气吃不成个胖子,进一寸自有进一寸的欢喜,相比从顶到底的这种搜索,我更喜欢从底到顶慢慢构建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值