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
①版本查看
②配置
每个用户的家目录中都有一些隐藏文件,.vimrc就是其中之一。每个用户都可以单独有一份.vimrc,里面有一些vim基本的设置,我们可以在.vimrc里配置加命令,这些设置都只会影响单个用户,包括root都不会被影响。当打开vim时,它会先读取家目录下的配置文件.vimrc,vim就可以展示出默认状态没有的视觉效果和代码帮助。
每个人都能配置自己的vim,尽量在普通用户下安装自己的。root安装会使全局的vim默认设置改变,需要每个用户自己的.vimrc覆盖