Linux相关概念和重要知识点(4)(自举、vim)

news2025/1/29 14:09:20

1.语言和编译器的发展

(1)汇编语言的出现

计算机只能看懂二进制,但是用二进制实现一个功能就太难了,人们需要发明一种高效的语言。人们抽象出一套编程逻辑,定义了一系列操作,接下来就需要实现它。最初人们用二进制来实现操作到二进制之间的转换,这个过程非常困难,最后终于写出了第一代编译器,即汇编语言的编译器。此后,人们可以用这套更高效率的语言写代码,写的代码通过编译器来编译形成二进制可执行程序。我们需要注意编译器是可执行程序,是二进制的,但它的作用是翻译。

(2)自举

但是,第一代编译器极难理解和维护。于是人们在保证第一代编译器没有问题的情况下,用汇编语言写了一个新的汇编编译器,再用第一代的编译器编译形成可执行程序。这个新的编译器也是个二进制程序,但它的好处在于它本质是用汇编语言写的而不是二进制写的,后续维护或者功能拓展比较方便。之后我们就可以使用第二代编译器来编译汇编语言了。第二代的编译器源码是汇编语言,第一代编译器的源码是二进制。只要第一代编译器没有问题,我们可以对第二代编译器做各种功能上的拓展,最后用第一代编译器编译一下就可以了。这个过程称为自举。

很明显,我们的C语言就是建立在汇编语言上的,先用汇编写出第一代C语言编译器,再用C语言自举,写出第二代编译器,我们的第二代编译器可以实现更多的功能,只要第一代编译器没有问题,我们就能不断以较低成本维护和更新语法。

我们可以发现,第一代编译器是基础,它能保证这个语言的存在,之后我们;利用第一代编译器进行功能不断迭代保证语言发展,第二代、第三代......每一代都离不开首代编译器的支持,但只要保证首代编译器的正常,我们就能以较低的时间和精力来维护编译器。可见,一个语言的发展也是人类智慧的积淀。现在,第一代汇编编译器,第一代C语言编译器都足够完善,我们不需要在写汇编编译器时用二进制写编译器,我们写C语言编译器也无需用汇编语言写编译器。

我们无需担忧怎么用一门语言写自己的编译器,这是语言设计者应当考虑的,设计的语言逻辑必须完备且自洽,是能够对自己的词法语法进行处理的。

(3)C语言->可执行程序过程的理解

C语言->可执行程序就是逆发展的过程,先将C语言翻译成汇编,再将汇编翻译成二进制。对于C语言编译器来说,它只需要把C语言翻译成汇编就行,之后交给汇编的编译器。因为前人已经把汇编->二进制的坑都帮我们踩了,我们无需再走一遍同样的路

2.vim

(1)vim是什么?

vim是一款多模式的编辑器(类似Windows里面的记事本,不是IDE)。我们可以使用vim写代码,退出之后自己编译运行。向文件里写东西有很多方式,如nano、echo等,它们都不如vim功能完备,并且vim有个很大的优势就是Linux自带这个工具,在作为辅助工具时是不错的选择。

(2)模式切换

vim模式较多,适当降低自己的学习成本,提高效率更重要。常用的模式有命令模式、插入模式、底行模式、替换模式、视图模式。

我们需要遵循一个中心的原则,即命令模式是中心(初进入vim时就是命令模式)在任何模式任何状态下,按ESC都能回到命令模式(默认模式),在切换模式前我们需要先ESC回到默认模式再说。

命令模式->插入模式:a、i、o,这三个按键有细微区别,i是进入插入模式后什么都不做,a是如果后面有一个字符光标就会向后跳一位(不能创建空格,后面没有字符时什么都不做),o就是进入后光标换行(可创建空格,后面没有字符时也可以提行)。一般来说i就够用了,其余两个知道即可。

命令模式->底行模式:shift + ;(输入冒号)

命令模式->替换模式:shift + r(大写R)

命令模式->视图模式:ctrl + v(大写V)

(3)各个模式功能

注意任何模式下输入数字不能使用数字键盘,vim识别不了

①命令模式(默认模式)

删除:x从光标位置开始向后删1个,(num) x从光标位置开始向后删num个,shift + x(大写X)从光标位置开始向前删1个,(num) shift + x(大写X)从光标位置向前删n个

光标如果是一个方块,以左边为线,带入Windows操作经验理解

复制:yy复制光标所在行,(num) yy一次性复制num行

剪切:dd剪切光标所在行,(num) dd一次性剪切num行

粘贴:p在该光标所在行换行粘贴(新开一行,原来的下一行会被移至下下行)(num) p在该光标所在行换行开始粘贴,粘贴所选内容num次

撤销:u按照修改历史向前回溯,撤销本身不视作修改,注意理清修改的逻辑线 

重做:ctrl + r按照修改历史向后回溯,重做本身不视作修改,注意理清修改的逻辑线

替换:r + (要替换字符)替换光标开始向后1个字符,(num) r + (要替换字符)替换光标开始向后num个字符(num超出该行字符数就不做处理)

保存退出:shift + zz(连按两下大写Z)保存文件并退出

大小写切换:shift + ·(输入~)从光标位置开始向后切换1个字母的大小写,(num) shift + ·(输入~)从光标位置开始向后切换num个字母的大小写

定位行:gg光标回到第一行,shift + g(大写G)光标定位到最后一行,(num) shift + g(大写G)光标定位到第num行

锚点:shift + 4(输入$)定位到该行行尾,shift + 6(输入^)定位到该行行首

光标移动:h左,j下,k上,l右,在非视图模式下可用方向键代替

按单词前进或后退:w按单词前行,b按单词回退(判断是不是单词是根据有没有空格、有没有非字母来决定的,不是真正意义上的单词)

②插入模式(命令模式->插入模式:a、i、o)、替换模式shift + r(大写R)

除了ESC所有输入都会当作字符处理,注意如果输入数字不能使用数字键盘,vim识别不了

替换模式下会从当前光标开始覆盖,但覆盖不是删除,删除覆盖字符时原来的字符会再显示出来

③底行模式(命令模式->底行模式:shift + ;(输入冒号))

行号显示与关闭:set nu行号显示,set nonu关闭行号显示

查找:/ + (查找内容)可查找含指定内容的行,输入n切换下一行,最后一行之后返回第一行 

保存和退出:w保存,q直接退出,wq保存并退出;w!强制写入,q!强制退出,wq!强制保存退出

强制修改退出在某些场景有必要,如root修改/etc/sudoers里面的内容时就只能使用wq!强制保存,普通用户则根本无法操作

不退出执行操作:! (指令)会在不退出vim的情况下在当前工作目录下执行指令,如!pwd,!ls -al。执行完指令后按任意键就可返回vim继续操作

多开窗口(最多3个):vs + (文件名)可同时打开并显示多个文件,光标只能在一个窗口,ctrl + ww可切换窗口

④视图模式(命令模式->视图模式:ctrl + v(大写V))

光标移动:h左,j下,k上,l右选中行,可使用插入模式的定位行来批量选中

批量编辑:光标选中后shift + i(大写I)进入编辑(此时显示插入模式),输入完毕后再按ESC,选中行都会在光标选中区域最前面(同样以最左侧为线,按照Windows操作逻辑理解)加上编辑内容

批量删除:光标选中后d删除光标选中所有内容

(4)配置vim

①版本查看

命令行输入vim查看vim的版本

②配置

每个用户的家目录中都有一些隐藏文件,.vimrc就是其中之一。每个用户都可以单独有一份.vimrc,里面有一些vim基本的设置,我们可以在.vimrc里配置加命令,这些设置都只会影响单个用户,包括root都不会被影响当打开vim时,它会先读取家目录下的配置文件.vimrc,vim就可以展示出默认状态没有的视觉效果和代码帮助。

每个人都能配置自己的vim,尽量在普通用户下安装自己的。root安装会使全局的vim默认设置改变,需要每个用户自己的.vimrc覆盖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

假期学习笔记总结--iOS 自动释放池

iOS 自动释放池 https://juejin.cn/post/6844904094503567368#heading-23 ARC和MRC 苹果在 iOS 5 中引入了ARC(Automatic Reference Counting)自动引用计数内存管理技术,通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编…

Linux进阶命令-重定向

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解,我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

我的创作纪念日-20240919

何尝不是一种纪念。 话说,毕业之后和大学同学去深圳,后面回家考编制,现在在家里的中国邮政的代理金融网点上班。

C++:布尔类型,引用,堆区空间

1.布尔类型 #include <iostream>using namespace std;int main() {bool b13;bool b20;cout << "b1" <<b1<< endl;cout << "b2" <<b2<< endl;cout <<boolalpha<< "b1" <<b1<<…

CGE:基于Causal LLM的Code Embedding模型

近日&#xff0c;CodeFuse-CGE 项目在外滩大会展出&#xff0c;吸引了众多技术、产品从业者的到访&#xff0c;部分参观者表示“文搜代码”令人耳目一新&#xff0c;期待模型后续的表现。 以下是 CodeFuse-CGE 项目的相关开源介绍&#xff0c;如果对这部分内容感兴趣&#xff…

Qt 窗口事件机制

在 Qt 开发中&#xff0c;窗口的关闭、隐藏、显示等事件是常见且重要的功能。不同的事件触发条件、处理方式不同&#xff0c;了解和掌握这些事件有助于我们更好地控制窗口行为。本文将详细讲解这些事件的使用方法&#xff0c;并通过代码实例来展示其应用。 1. done(int r) — 关…

9.19总结

这几天学习了网络流 1&#xff0c;EK ek的主要思路是不断通过bfs找到增广路&#xff0c;找到增广路再建立反向边&#xff0c;直到不能再bfs到汇点&#xff0c;为什么可以通过建反向边呢&#xff1f;以上图举例&#xff0c;上图走完第一条增广路建立了一条反向边&#xff0c;当…

fps pve制作

1 导入素材 将人物模型和骨骼导入&#xff08;直接将fps拖进去&#xff0c;选择正确的骨骼即可&#xff09; 将枪支模型导入&#xff0c;取消创建骨骼&#xff0c;将静态网格体导入其中 2创建角色蓝图&#xff0c;也就是我们玩家控制的对象 然后在角色的组件中找到网格体并使…

几何 | 数学专项

日期内容2024.9.19创建 { d > 0 , 递增数列 d < 0 , 递减数列 d 0 &#xff0c;常数列 \begin{cases} d>0,递增数列\\ d<0,递减数列\\ d0&#xff0c;常数列 \end{cases} ⎩ ⎨ ⎧​d>0,递增数列d<0,递减数列d0&#xff0c;常数列​ 【2010.13】 【1.历年真…

【算法题】46. 全排列-力扣(LeetCode)

【算法题】46. 全排列-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3…

漏件、丢件常发生?海外仓智能化管理来解决

随着海外仓业务的迅猛发展&#xff0c;一些仓库在日常运营中出现了出入库操作不规范、库存管理不够严格等问题。这些问题多数源于高度依赖人工操作及随意性较强的管理方式&#xff0c;导致了库存数据不准确、货物遗漏或丢失等情况的发生。长此以往&#xff0c;不仅会增加客户的…

让自动驾驶系统无限逼近人类?最新混合规划器实现高度安全的实车导航

导读&#xff1a; 本篇文章针对基于学习的规划器难以保证安全闭环驾驶这一问题&#xff0c;提出了一种新型的混合运动规划器&#xff0c;其结合了基于学习和基于优化的技术。通过仿真实验和实车实验&#xff0c;证明了本文规划器的有效性和鲁棒性。©️【深蓝AI】编译 1. 摘…

【已解决】Uncaught RangeError: Maximum depth reached

【已解决】Uncaught RangeError: Maximum depth reached 在JavaScript编程中&#xff0c;Uncaught RangeError: Maximum depth reached 是一个常见的错误&#xff0c;通常与递归调用深度过大有关。递归是一种编程技巧&#xff0c;它允许函数直接或间接地调用自身。然而&#xf…

2024年轻人驯化AI指南

或许Python编程是答案 我为您精心准备了一份全面的Python学习大礼包&#xff0c;完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者&#xff0c;都欢迎加入我们的学习之旅&#xff0c;共同交流进步&#xff01; &…

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…

saltstack入门

一、saltstack入门 一、saltstack介绍 1、saltstack简述 SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台&#xff0c;管理端称为 Master&#xff0c;客户端称为 Minion。SaltStack 具备配置管理、远程执行、监控等功能&#xff0c;一般可以理解为是简化版的 Pup…

安卓Settings值原理源码剖析存储最大的字符数量是多少?

背景&#xff1a; 平常做rom相关开发时候经常需要与settings值打交道&#xff0c;需要独立或者存储一个settings的场景&#xff0c;群里有个学员朋友就问了一个疑问&#xff0c;那就是Settings的putString方式来存储字符&#xff0c;那么可以存储的最大字符是多少呢&#xff1…

初始c++:入门基础(完结)

打字不易&#xff0c;留个赞再走吧~~~ 目录 一函数重载二引用1 引⽤的概念和定义2引⽤的特性3引⽤的使⽤三inline四nullptr 一函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤…

【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数

给定一个二进制数组 nums 和一个整数 k 。 k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 &#xff0c;同时把子数组中的每一个 0 都改成 1 &#xff0c;把子数组中的每一个 1 都改成 0 。 返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能&#xff0c;则返回 -…

代码随想录算法训练营43期 | Day 20 —— 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

代码随想录算法训练营 代码随想录算法训练营43期235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 代码随想录算法训练营43期 235.二叉搜索树的最近公共祖先 解题思路&#xff1a; 二叉搜索树一定是有序的 判断条件&#xff1a; cur>p &…