编程语言及工具
C语言学习4大段位,青铜,白银,黄金,王者,测测你在哪一级?第四季Back2School的第五节课,陈强老师讲解C语言学习路线,助力大家早日成为C语言大拿。
1 常见编程语言
图上列举了几种目前我们常用的软件编程语言。从左边的机器语言、汇编语言开始,从一个计算机的角度来看,越底层的语言越不利于人类理解,也就不容易编写。
一般C++语言以后我们才称为高级语言,因为出现了类和对象的概念,更符合我们人类的思维方式。
C语言它没有类,但是它有结构体、联合的概念,也算比较高级,所以C语言一般都是学习其他语言的基础。C语言比汇编语言要高级一点,已经非常容易理解和编写,限制少,通用性很强,小到几M频率的单片机,大到服务器,C程序都可以运行,移植容易。但是它还是非常底层,因为它和硬件的关系非常铁,所以它的执行效率很高,现在的操作系统和追求效率的大型软件还是使用C/C++父子俩来编写的。
2 C语言学习路线
学习C语言软件编程需要掌握哪些知识呢?上图将软件编程需要的技能列举了几个部分,编程语言跟学习外语的路线类似:
1)最基本的语法,然后组织语言,将想法表达出来,具体使用哪种方式表达,也就是算法和数据结构这才是软件编程的精髓和灵魂。刚才讲到,C语言和硬件关系密切,所以学C语言编程最好了解一下计算机的结构组成包括嵌入式硬件结构,以及计算机外设资源,尤其是对于单片机开发来说不懂硬件就没法编程。
2)高级用法,操作系统是躲不过去的坎,了解操作系统的工作原理,对学习编程非常有帮助,然后就是利用可运行的平台做项目练习,也就是应用部分。
青铜小白入门C语言的话,要学习哪些内容?首先就是C语言的基本语法,比如变量与常量、数据类型、运算符、数组、函数、结构体。还有C语言最最重要的指针部分,指针是C的灵魂,掌握了前面的基础,就可以进阶到白银。
白银阶段这里,需要掌握指针的一些高级用法,比如函数指针,内存管理、堆栈、队列、结构体联合链表等复杂的数据结构,文件的读写,预处理命令,编译环境和工具,当然还要掌握复杂一些的程序结构。
到黄金阶段,基本就是一名高手了,这时候需要补充做项目的经验,数据结构和算法仍然是一个程序的灵魂,最后编写任何C语言的项目就可以随心所欲了,现在C程序应用最多的地方,一个是单片机编程,另一个是基于操作系统Linux的编程,当然了这需要大量练习,需要无数的打怪升级的锻炼才可以达到王者的随心所欲。这里推荐几本比较好的书,C语言祖师爷写的《C程序设计语言》、另外《C和指针》也非常不错。
3 知识点举例
C语言强大的地方是指针,最容易令人迷糊的地方也是指针。这里我们来看一个例子:
ip是一个指针,*ip则指向该地址下的变量;把一个变量取地址之后付给ip,那么在指针变量中存储的就是这个变量的地址了。如果要获取这个变量实际的值,则在ip前面加*,所以地址的使用要格外仔细。
那么地址和数组直接是什么关系呢,下图是一个比较经典的面试题,需要搞清楚数组指针和指针数组。用变量a 给出下面的定义:
下面再看结构体和指针的例子:
这是STM32F4 hal库UART外设库的一个函数,函数的入口是结构体指针,也就是结构体的首地址。这是通过typedef定义的数据类型。在内部调用函数HAL_UART_MspInit()的入口参数是结构体指针huart。
结构体在实际C语言项目中经常用来描述事务的综合属性,类似其他高级编程语言中类的概念,由此才有面向对象的意思。在STM32 库函数中大量使用了结构体指针的方式,通过传递结构体的地址而不是整个结构体,调用函数的开销会更小,效率更高。
这里说到STM32库函数,有必要说一下C语言的一大应用领域,微控制器开发。微控制器也就是单片机,处理能力和存储资源有限,开发流程还是要在PC端编辑并编译完成之后,下载到单片机上运行,开发语言以面向底层的C语言为主,涉及的操作系统也是实时操作系统。由于MCU种类繁多,程序编写方式也不统一。
上图是ARM 的CMSIS标准,即ARM Cortex 微控制器软件接口标准,使用CMSIS,可以为处理器和外设实现统一的软件接口,从而简化软件的重用、缩短新开发人员的学习过程,并缩短开发时间。我们在使用C语开发单片机时,多参考厂家的SDK是非常有必要的,目前各大半导体厂商提供的SDK非常有参考价值,大家学习单片机c语言编程可以模仿sdk的写法,规范的写每一行代码。
除了单片机开发之外,基于PC或系统的编程中,Linux系统对C语言天然友好。不同于windows下单片机开发的集成开发环境KEIL MDK,在Linux下可以很方便的独立调用编译链工具。比如这里hello.c C文件的编译过程有4步,预处理、编译、汇编和链接。
每一步调用工具链的哪个工具产生什么文件怎么实现的,这几步搞明白了对C对操作系统的理解会更深入。
Linux下的编程内容庞大,比如网络编程,线程与进程等。
当然开发以上内容除了C语言以外C++、Python、Java也是常用的语言,对同一个项目,哪种语言可能都可以实现,但是不同的语言实现起来的方式和难易程度不同,所以大家学习C语言之后也要打开自己的视野。
大家在学习C语言编程的时候不要只是在PC机上玩VC++,来回折腾51单片机,高级点单片机的只知道个32,也要多关注新技术的发展,目前很多单片机像乐鑫的ESP32/树莓派的Pico已经支持microPython,而且开源库很多。目前MCU已在IOT领域大量应用,而且在超低功耗的微控制器设备上开发和部署的机器学习模型比如TinyML。使机器学习可以在低延迟、低功耗和低带宽的边缘设备上运行。所以大家学习技术的时候一定要睁眼看世界,关注新事物,尤其是现在大火的人工智能领域。
最后,给新手朋友几点学习的建议:大家学习软件编程时,要避免学校里上课考试的模式,而是以项目式学习,通过不断的做项目练手,关键是保持对技术的追求和兴趣,一路打怪升级不放弃。此外,千万不要闭门造车和搞深山修炼,学东西要不断的与外界交流,把自己融入技术圈里,多观摩、多请教、多交流,成为王者指日可待。
手撕代码最快的方式呢就是保持一颗进取的心,跟随高手的脚步,踏踏实实,不断打怪不断升级。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !