1.前言对于理工科的学生来说,答案可能很简单,因为这是一门必修课。对于程序员来说,选择一门编程语言在某种程度上会对自己的职业发展产生重大影响,所以一定要慎之又慎。那么,为什么要选择一种已经存在了将近半个世纪的语言呢?本文不是老生常谈的废话,比如:“C语言是编程的基础”、“学好C语言,走遍天下都不怕”等,本文力求详细解答这个问题2.C语言C语言是由美国AT&T贝尔实验室的研究员DennisRitchie在B语言的基础上发展起来的。随着C的发展,C开始移植到其他操作系统平台,成为一门独立的编程语言。下图摘自TIOBE编程语言排行榜。过去30年,90%的时间C都是领先者,只是偶尔被Java超越:技术分享。那么是不是因为一门语言一直排在排行榜的前列,应该去学习和使用?显然不是,重复别人的话是程序员的大忌。为操作系统而生的标签注定是平庸的。老实说,C是一门难学难用的编程语言。没有扎实的编译原理、操作系统和计算机体系结构等基础知识,是不可能让C易学易用的。C作为一种工程实用性强的语言,提供了对操作系统和内存的精确控制、高性能的运行环境和源码级的跨平台编译。这就是我们必须学习和使用C的原因。同时,幸运的是,C也是一个有趣的东西。对编程的理解越深,就会越有趣。我简单罗列一下C的一些优点:2.1)结构化的设计语言,语法清晰,结构简单,模块化使得程序的各个部分除必要的信息交换外相互独立,便于开发调试调试.2.2)运算符很多,括号、赋值、强制类型转换等都被当作运算符,灵活运用各种运算符可以实现其他高级语言难以实现的操作。2.3)数据结构丰富,可以实现各种复杂数据类型的操作,引入指针和结构的概念,使程序更加高效。2.4)为操作系统而生,可以像汇编语言一样对位、字节和地址进行操作,允许直接访问物理地址对硬件进行操作,结合了高级语言的基本结构和语句,具有实用性低级语言。2.5)程序执行效率高,一般比汇编器生成的目标代码低10%~20%。2.6)可移植性好,C语言抽象了CPU编程的细节,可广泛应用于大型操作系统和系统软件的编写。2.7)具有强大的绘图功能,可以像C++一样编写非常优雅的二维和三维图形和动画。有人说C是C++的子集。C能做的,C++能做,而且能做的更好,比如:面向对象的三大特性,GUI编程。当然,我承认在GUI编程领域C++占据着绝对的统治地位,至今无人能撼动。但是真的有必要使用C++而不是C来完成工作吗?很多时候,C++的解题思路真的比C更先进吗?3.C和C++的比较写这一段的时候,我感觉如履薄冰,战战兢兢。毕竟C和C++是大多数程序员都熟悉的东西。谈论它是非常可怕的。其实,这是信仰的问题。事实上,任何争论都是无止境的、毫无意义的。希望大家不要花很多精力去争论纯语言的优劣,而是去思考如何正确的做事,什么是正确的做事方式——快速高效的开发,快速稳定的运行,快速简单的维护。下图是LinusTorvalds批评C++和他身边那些C++程序员的犀利话语。事实上,我个人并不欣赏Linus的个人风格。还是希望大家相对于C++,能够冷静的谈谈C。部分优势及现状:技术分享3.1)隐式操作:C语言简单直接,结构清晰,每一行代码都可以清晰地反汇编成相应的语句,系统会严格执行你的代码。C++就不是这样,简单语句中有多少次构造和复制也不清楚。这样写底层代码是完全不可能的,底层需要精确严格的控制。3.2)语言接口:现代软件工程项目的开发不仅对性能有很高的要求,而且对语言接口的对接能力也有很高的要求,因为一个大型项目很少只使用一种语言进行开发。对于底层,C++对内存和硬件的控制没有C那么简洁和精确;很多动态语言和中间件,比如PHP、Python、Apache、Redis,受C的影响很大,甚至用C开发的东西都非常容易连接。方便的。没错,其实C++也可以迂回连接,只是远不如C方便,而且开发维护成本非常高。3.3)硬件层:3.2.1>内存分配:系统上电运行,汇编后初始化堆栈,然后跳转到C语言的start_init()函数。此时内存分配机制还没有建立起来。如何在C++中定义类?如何实例化对象?3.2.2>标准库依赖:C的所有特性都可以在没有任何库的情况下运行。如果需要,您可以根据具体要求编写自己的库。3.2.3>处理器兼容性:C++类依赖基地址+偏移地址的寻址方式。很多微处理器只有给定地址的简单寻址,不支持语句实现base+offset的寻址机制。很多编译的C++代码需要更多的指令来计算地址,导致性能下降太多。3.4)应用层:C++做的是应用层,尤其是GUI编程,这是C++的传统强项。我一直坚持认为C也可以优雅的制作图片和动画,但是开发效率确实比C++低很多。最近有一种非常流行的RUST语言,号称是未来唯一可以替代C++的编程语言。有兴趣的同学可以多关注一下。4.总结下面我罗列了10多个当前流行的开发方向,并简单介绍了以下项目中最常用的编程语言:技术分享从上图可以看出,操作系统基础知识,编译原理、数据结构和算法等,是深入理解、掌握和灵活运用C语言的重要前提。现阶段,程序员职业生涯的热门方向有一半以上与C语言直接或间接相关。我觉得学好C的重要性不言而喻。
