程序员如果要学多门编程语言,应该学哪些?

咱们先介绍这几门语言,至于学习的话再根据自己的需要来看学习的顺序。

1、汇编

汇编必须要学,这是离计算最近的一门语言(机器码就不要学了,目前不需要打卡编程了),是最能深刻理解计算机的运行逻辑的,列如做一个加法:

MOV AX, A ; 将A的值放入AX寄存器
ADD AX, B ; 将B的值与AX中的值相加
MOV C, AX ; 将结果存入C

学习汇编语言就会了解计算机存储结构、指令格式、各指令的速度等等,配合计算机体系结构这门课学习是最好的,只有深刻理解了计算机后面涉及计算机性能的编程才会更好地去对程序进行优化。当然目前用高级语言比较多了,除了做操作系统或者嵌入式的少部分特殊代码,没几个人再去大量地写汇编代码,但要想真正地从事软件开发或硬件开发行业,搞几个小程序,试验一下汇编语言还是必要的。

汇编语言也需要编译,实则这个编译过程超级简单,编译器干的事儿超级少,就是把每条指令对应改成二进制的机器码。

2、C

C语言是必学的语言,它也是目前做与硬件相关或系统软件用得最多的语言,没有之一,尤其是做嵌入式基本上都是C/C++,除Linux或一些性能比较好的带操作系统的应用上用C++,在裸芯片上开开发的基本是C。C语言是与操作系统最接近的一门语言,由于绝大多数的操作系统都是用C写的。

C语言相比汇编语言也已经是高级语言了,比较接近人的思维方式了,运算符号基本跟数学一样,函数实则也是数学里的函数的含义,有输入、有输出,内部是计算逻辑关系。C语言是编译型的语言,C代码会被编译成二进制的机器码,由操作系统调度直接执行。

C语言难,难在它的指针,指针可以指向进程的任何一个地方,包括程序代码,列如我们在嵌入式系统中写一个系统重启的函数很简单:

typedef void (*reset_t)( void ) ;
void reboot( void )
{
    reset_t reset_entry = 0;
    reset_entry();
{

指针是把双刃剑,既强劲也危险,在操作系统和嵌入式系统中一旦出现指针错误,不是数据出错就是系统崩溃。同样,所有的内存都可以由程序员自己控制,控制不好就会导致内存泄漏,这也是C和C++难的地方,但效率是真高,对于性能敏感的应用还得用C或C++。

程序员如果要学多门编程语言,应该学哪些?

3. C++

C语言是面向过程的语言,流程图来表明C语言的软件架构超级合适,而C++是教科书式的面向对象编程语言,面向对象的继承、多态、构造函数、析构函数特性一应俱全,还支持多重继承,支持得有点儿过了,后来多重继承反而成了反模式,超级不提议用。C++是C语言的一个超集,继承了C语言的全部特性的基础上增加了面向对象特性。

把C++的面向对象学好了基本就无敌了,在学习C#、Java这类带虚拟机的语言时就超级清楚内存的运行机制,内存管理学好了,再去理解C#和Java的new带来的性能开销就超级清楚,很容易写出高效的代码。

C++还引入了异常机制,try-catch使异常和处理超级友善,比起C语言中使用返回值和errno优雅了不少,这个也是后来高级程序语言的标配,但到Rust这儿又做了改变,由于异常捕获的性能成本有点儿高,由于要存储catch的异常链,无论在内存占用还是在CPU占用上都挺高。

与C语言一样,C++也是编译型语言,需要将代码编译成二进制然后直接运行即可。

4. C#/Java

为什么把这两个放一起呢?是由于这两个都是属于运行在虚拟机上的语言,C#是CLR,Java是JVM实则是一类东西,这类程序运行时是受虚拟机托管的,不直接与操作系统打交道,所以不会把操作系统搞崩溃,顶多就是把虚拟机搞崩溃了,应用退出了,不会影响在同一台主机上的其它应用,实现了应用之间的绝对隔离,这是这类语言的第一大好处。

这两个语言的第二大好处就是内存分配与回收受虚拟机托管,通过new创建对象,在堆上分配内存,由虚拟机负责检测在不需要的时候来释放这些内存,好处显而易见,不容易出现内存泄漏的问题,节省了大量的编程成本,但牺牲的是性能。性能上有两个问题,一是new出的对象在堆上,很容易形成内存碎片,在分配大块内存的时候不够用,而且对象默认是创建在堆上的而不是栈上,所以创建、销毁的成本超级高,在其是在处理字符串类的应用逻辑时,快速的创建销毁会占用大量的CPU;性能的另一个问题是内存抖动,由于虚拟机会在它认为合适的时间聚焦销毁一次不再使用的变量,这时会占用大量的CPU,所以在高负载的大规模应用上会导致应用暂时卡顿,让应用运行不那么流畅导致用户体验不好,甚至会由于事务积压而导致内存耗尽而崩溃。

C#的意思就是C++++,是C++的一个超集,最大的升级是增加了运行时,由CLR负责变量的销毁,而在C++的语法基础上(没有完全继承语法,只是特性基本继承)也增加了许多特性,如属性、LINQ查询等。就从语言本身来讲,我觉得C#是面向对象类语言中设计得最完美的一门语言,C#不光可以写桌面应用还可以做Web应用,尤其是Windows上的桌面应用再配合WPF真的无敌,但在其它平台就没有WPF这么强劲的库了,毕竟微软是为了卖它的Windows。

Java设计之初是一次编码,到处可用,想统一全世界的,后来在服务器开发领域成了巨无霸,具有超级强劲的应用生态,尤其是在它的Web后台开发方面,而它的JSX、Servlet、AWT基本已经形同虚设,用的人少之又少,MagicDraw是一个另类,用Java写的UML的设计桌面软件,真的很强,但不知道这个公司目前运行如何,软件是真的好。

Java的特性没有C#那么丰富,C#属于后来者居上,但Java的用户基础和生态之强劲是C#所不能比的,也可以说他们两个各有所长,C#主要用于桌面开发,Java主要用于Web服务开发。

C#和Java的执行与C/C++不同,这两种语言需要被编译成一种中间语言—字节码,然后在运行的时候再由虚拟机进行解释运行,后来虚拟机进行了优化,增加了运行时的即时编译JIT,即可类或或文件为单位,在执行时编译成二进制机器码,第二次运行的时候性能会有大幅提升,所以服务启动时运行会比较慢,当运行一段时间后就会性能明显提升。但整体性能上还是要低于C/C++这些编译型的语言,由于还有虚拟机的开销,具体差多少还要看应用调用的资源情况,对于网络、磁盘等操作的话应该差别不大,主要在于对内存密集型和计算机密集型的任务上,C#、Java与C/C++相比来讲差异较大。

程序员如果要学多门编程语言,应该学哪些?

5. JavaScript/TypeScript

C#和Java主要是做Web的后端开发,而在前端开发这一块,JavaScript则占据着霸主的地位,无可匹敌。最近新出的WebAssembly可能未来会带着其它编程语言瓜分一些份额,但在GUI这一块儿还没有看到可能被替代的迹象。Rust的前端框架Yew是潜在的威胁,但试过之后感觉Yew前面的路还很长。TypeScript可以说是JavaScript的一个外挂,真搞不清楚为啥就不能融合一起非要搞两套。不过Vew、Angular等框架也逐步将TypeScript作为默认语言了,而且Node.js在 23.6.0 版本之后,TypeScript 运行支持有了重大变化,TypeScrpt的.ts文件,不需要额外参数。Node.js已经把Javascript/TypeScript从前端带到的桌面和服务后端,成为Web开发领域的一个全栈编程语言。

TypeScript相较于JavaScript主要增加了强类型系统和面向对象编程,由于JavaScript最初做前端页面,就是一些简单的逻辑脚本,随着单页面应用的兴起,系统越来越庞大,代码量越来越多,给程序员的自由度太大,程序员会为自己埋下太多的雷,直到把自己炸得体无完肤,TypeScript就是增加了这些限制,以提高大系统的稳定性。

JavaScript、TypeScript属于解释型语言,与C#/Java还不同,它们是逐行解释运行的,解释一行执行一行,所以性能比C#/Java还要差一些。实际上TypeScript是先翻译成JavaScript然后再在浏览器上运行,Node.js目前也引入了JIT机制,也可以在第一次运行时编译成二进制运行来大幅提升性能。

个人超级喜爱TypeScript,既有其语法的灵活性,又有严格的类型系统来保障项目的可靠性,语法也比较美观,组织部都是C系的,看顺眼了,而且let来定义函数自推导类型也比较方便。

程序员如果要学多门编程语言,应该学哪些?

6. Rust

Rust属于后起之秀,站在巨人的肩上,设计了许多特性如零成本抽象、生命周期系统、match表达式、新的Result/Option返回值系统、Cargo包管理系统、内置编码规范、自动化测试系统、增强的注释系统等,属于编译型的函数式语言,前面已经写了一篇《Rust中的工程美学》来解释Rust中的一些很好的特性设计,不再赘述,最近也在写一个《Rust编程思想》的专栏,来一起学习Rust编程语言。

程序员如果要学多门编程语言,应该学哪些?

7. Python

最后说一下Python,虽然不太喜爱这门语言,如果写小项目脚本来处理数据或做小的Web应用的话,宁愿使用Node.js而不是Python,但是,由于目前少儿编程以及AI的兴起,由于其简单性,许多库是支持Python的,所以在TIOBE中的排名很强势。Python不太适合做大项目,由于学习资源比较多,如果做一些简单的科学运算、自动化脚本等,还是推荐学一下,前面C系的编程语言难度相对大一些,尤其Rust饱受吐槽。

程序员如果要学多门编程语言,应该学哪些?

具体要学习哪门语言,或者哪几门语言还是要看自己的需求,上面把各语言擅长的领域及语言特点基本介绍了一下,供参考选择。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共15条

请登录后发表评论