为什么要在Linux下学习C语言

2020-07-08 00:00:00 语言 文件 都是 学习 命令行

前些日子,由于看到同学安装了deepin,所以我也搞了一个玩玩,后双系统折腾来折腾去,一直在纠结用什么发行版比较好,什么版本适合新手啊。在知乎看了几百个答案也没什么感觉,后一想随便下一个吧,于是在Linux官网,点击Download,看到个是Ubuntu,于是装上了它。

鬼使神差的去慕课网上看了几门Linux C(Linux C语言指针与内存-慕课网,Linux C语言编程基本原理与实践,Linux C语言结构体-慕课网)的课程,发现自己慢慢喜欢上了Linux,喜欢上了C语言。用一句广告词来说:这是一种从未有过的感觉。

大一开始学习C,计算机专业入门课就是C,那个时候学校还在用VC++6.0,谭浩强的教材依然是老师钦点的课外必读书(在四非大学,学校教材是自编的),那个时候我看过教材和老师推荐的这本书,深入的去研究过指针,写过简单的学生管理系统,我以为我已经很会C了。再后来学习C++,发现STL中的algorithm那一套可复用的组件把很多算法都实现了,如果用C语言写是真累,再后来学习了Python,愈发觉得C语言的原始。学了C++以后不想用C,学了STL之后不想自己写数据结构,不想自己写算法,学了Python以后C/C++看都不想看。

但是接触了Linux以后,又对C语言重拾兴趣,我觉得:命令行敲得很爽。

这种爽,试过了才知道。

我以前自认为比较精通C,在慕课网上看了Linux C的视频教程以后,才发现C语言原来可以这么写,在网上看了Linux C编程一站式学习以后,感觉对C语言才算真正入门。

为什么我说在Windows下不适合写C语言,Linux更适合?

我们来看一看C语言的一种标准格式:

刚开始学C语言的时候,书上介绍过main()函数里面有两个参数,然后在我接下来的三年,直到接触Linux之前,不知道也没有接触过关于这两个参数的任何信息。C语言里面为什么要有int argc, char const *argv[]这两个参数,这两个参数代表什么意义?能不能不要(以我们在Windows下编程的经验来看是可以不要的),那么不要这两个参数有什么影响?

再来讲讲return 0;为什么需要return 0;?在codeblocks,devcpp,vs上面不写也能正常运行啊。那这个return 0;还有存在的必要吗?我们隐约知道这个return 0是返回给操作系统的,那操作系统要这个return 0干嘛?

再来讲讲程序执行的过程,在VS上大部分人都是习惯直接按下F5,然后程序编译运行,在codeblocks上按下F9,在DEVCPP上按下F11,然后万事大吉,程序就开始运行了。所以呢?很方便是吗?那么我们为什么要学习C语言?学习C语言不就是为了去了解底层构造,去了解程序的编译链接吗?

.c文件经过预处理变成.i文件,.i文件经过编译变成.s文件,.s文件经过汇编变成.o文件,.o文件经过链接变成执行文件。

在Windows下这些底层知识,程序的构造过程能了解吗?在Windows下学习C,这辈子也不会知道,这些事IDE都帮你干了。而在Linux下,这些事可以自己干。

在Linux下你可以去查看这些文件,去看看预处理到底处理了什么,去看看文件包含到底包含了哪些文件,宏替换是怎么替换的,经过汇编后程序变成了什么样子,多个程序如何进行链接?

在Windows下我只知道新建项目,然而这个项目到底是一个怎样的存在?在Linux下我能把一切搞得明明白白。在IDE里面,所有的这些本质的底层的基础的知识都被屏蔽掉了,某些人可以美其名曰这样更专注于语言本身,而事实上屏蔽掉底层以后我们所接触到的都是肤浅的表面。C语言就那么几个语法吗?你这一行语句写下去以后编译器到底干了什么?他到底做了哪些优化?变量在内存中到底是一种怎样的存在?编译器真的会按照你源代码中定义变量的顺序去内存中开辟空间吗?

在Windows下学C,学了其他更的语言以后会越来越觉得C语言很原始,如果有更好的选择就坚决不会用C语言写代码。而在Linux下学了C,会越发觉得自己的无知 ,会越发想去深究程序背后的构造和解释。

我们在讨论为什么要在Linux下学C的时候,我们来讨论学C的目的是什么?为什么C语言会是科班生的必修课?如果这门语言真的只能去做底层开发,真的很原始,开发效率真的很低的话。。

运行效率很高能成为理由吗?

能,但并不完全能,我们学C,是希望通过学C来了解计算机、内存、程序的构造和解释,使计算机科学真正成为科学,而不仅仅只是技术。一旦把这些东西都屏蔽掉了……那还不如去学Java,python等更的语言,还更好用,学C干嘛?

后讲方法,怎么在Linux下学C?

1. 下载Ubuntu,语言不要改,默认English,时区选择上海,选择小化安装,以后需要什么再装什么。

2. 更新库:sudo apt update;更新软件:sudo apt upgrade;下载vim:sudo apt install vim;下载gcc:sudo apt install gcc,下载gdb:sudo apt install gdb

3. 为了方便写代码,在编辑器中加入行号:cd etc/wim;sudo vi vimrc什么都不要改,只在后一行加上set nu;保存退出。

这个时候一个高端大气上档次的环境就配置好了,vim编辑器带语法高亮,自动缩进,显示行号。而gcc是我用过的喜欢的编译器。

为什么选择语言English?因为什么都看不懂,你就不会乱花时间去折腾Linux系统,不会去搞什么美化,下载一些有用没用的软件。还有重要的一点,如果你有理想,终有一天你会去看英文文档。

为什么选择小化安装?因为不是要你去使用Linux,你现在功力还不够,要的只是有这么个环境,本质目标是在这个环境下学C。

在王爽的《汇编语言》里面有一句话:以后用到的知识,我们以后再说。

当你把C语言学的差不多以后,如果你觉得对命令行感兴趣,去好好玩玩Linux,折腾桌面,玩玩壁纸,寻猎新奇的软件,对系统进行个性化的定制,还可以学习运维,尝试其他N多发行版本,你觉得对命令行不感兴趣,继续回到Windows搞开发,这个时候在Linux下你已经把基础打好了。

刚开始的时候,学C,就学C。不要把时间花在折腾环境上,不要把时间花在纠结发行版本上,折腾多系统,换各个发行版本,炫酷的桌面,高度的可定制性确实是比较好玩,但是你现在是来学C的。这些以后的事情,我们以后再说。

其实Linux真的挺好玩的。~~其实大神都是玩出来的。

-----------------------------------------------------------------------------------------------我只是建议在Linux下学习C语言,由于我所见到的好处。

我无意去讨论两个操作系统的优劣,我也无意去辩解哪个发行版本更好。




更新:个人感觉,Linux对编程初学者还是相当之友好的,我现在所接触到的,C语言只需要gcc,C++只需要g++,调试用gdb;Java只需要java和javac,调试jdb;包括python也是,idle也可以直接install,调试可以pdb,mysql的学习也是可以直接安装。如果一些指令没有下载,输入这些指令的时候会有提示,commond not found,but Can be install with:……按照提示直接安装就可以,开发环境就算搭建好了。不需要打开任何网页去找官网。

我身边的同学下载VS的时候一般都是十几个G,因为大部分初学者一般都不太清楚什么应该选,什么可以不选,所以都选了,我可能不太懂,但是个人揣测,再怎么精简Windows下的IDE,它也要比直接在linux下的开发环境庞大。比如初学MySQL在Linux下只需要下载80几M,这个环境对我了解SQL语句和基本操作已经够了。等以后要进行更复杂的操作,以后再安装。以后需要的可以以后再说。

针对评论区的一些回复:

有人说main函数里面的两个参数就是命令行传参,百度上不需要半个小时就能知道,被我大张旗鼓的宣扬,但是我还是想,只在IDE下,没有试过在命令行下编程,去理解命令行传参,应该还是很难深入理解。

有人说操作系统的选择,命令行还是IDE都只是工具,关键还是看人。对于大神来讲或许如此,因为在什么环境他们都能写,而且都能把代码写好,但是对于初学者我想也不尽然,工具可以影响人,工具是真的能影响人,会影响对编程的看法,对于我而言,我希望对自己写的东西有掌握,对每一个文件都清清楚楚,初学的时候,在IDE里面会产生很多特定IDE的项目文件,这些不是我写的,我不知道他们有什么用,所以我还是选择从基础的开始,自己去组织项目,自己一个文件一个文件的去写,当然也有人会说那些特定IDE的文件百度上不要半个小时就能知道,但是我不想去查。

于我而言,写代码,做项目是一回事,而学习又是另一回事,IDE的功能确实强大,但是很多功能对于初学者而言并不需要。而对于vim,一开始我写的代码很少,不需要配置,后来写的代码超过10行,编译器报错的时候很难一行一行的去找,于是set nu,后来觉得每次都要敲很多相同的东西,于是设置个map,后来又觉得每次都要手敲,不能像IDE一样复制粘贴,从后一行到一行每次一直按着↑,要按好久,删除一个函数的时候也要删好久,于是又了解一下vim的这几个快捷键……对vim的熟练,每一次更改配置都标志着自己能力的一点点进步。当前需要什么就去了解什么,哪里不方便就去配置哪里,以后需要的以后再说。我喜欢这种看着自己的编辑器越来越强大,用的越来越顺手的感觉。我想那些说vim复杂的,说命令行难用的,大部分都是一开始就想配置的跟ide一样,花了一个上午,一个下午去配置现在还不需要的功能,怎么能不复杂?觉得linux难用的也大部分是想去逐一尝试Windows上的功能,后来发现很多没有,于是无比失望,通过不断对比来验证linux的难用,但是于我而言,我只用来学习一些编程,我并不需要用它来撩QQ,微信,我也并不需要拿他来玩游戏,所以,就算我在连四级都没过的情况下安装的是纯english语言,就算我并没有学过linux编程,我也不觉得难用,我现在掌握的全部linux命令也只有找目录cd,建文件夹mkdir,建文件vi等不超过10个而已,只是对我学学编程,这些够了。Linux我以后肯定会去系统学习的,只是现在没在我的计划之内,现在在我计划之内的也并不需要了解过多linux知识。以后需要的自然以后再说。

我对Linux确有狂热的欣喜,他给了我一种能掌握自己电脑的感觉,我很清楚我写了什么,有几个文件,他们怎样组织;我也逐渐去了解编译器或者解释器产生的文件到底是什么。至少在Windows下这种感觉没有,这些东西根本就不会去在意。

所以学习编程我觉得linux比windows友好,能学的很基础更深,至于以后学的差不多了,去写代码做项目的的时候自然看个人心情。

若我有偏激之处,欢迎指正。

相关文章