前言:
在系统的软件开发中,不仅仅是只使用一种语言,也会涉及到不同的语言,各个语言之间有共性、也有个性。正是这些不同的个性、注定它们会用在不同的场合来解决不同类型的问题。
在了解各种语言的区别之前,先来了解下各个语言用在什么场合和阶段。
1.软件开发有五个大的阶段
1.1 需求分析
确定需求,将问题进行拆分,模块化;同时设计合适的软件框架将各个模块联系起来,实现可移植、可配置、易扩展、易维护的软件工程。
1.2 编码
写出在框架下的符合语法、规范、简明的代码,无论是嵌入式底层的c代码、上层应用的c++/java代码,还是基于PC用QT或C#的上位机代码。都是可以采用面向对象的思想来设计代码,而在对象的方法中则采用面向过程的方式来解决实际的问题,这有点抽象(面向对象)和具体(面向过程)的概念在里面。
1.3 翻译
由于CPU只认识机器码,且不同的CPU架构认识的机器码还不一样,所以在编译之前还会根据平台来进行配置(PC环境下visio studio中的目标平台配置、嵌入式nuttx/linux系统的menuconfig等)。而我们开发过程中用的语言都是高级语言,所以需要翻译,翻译有两种方式:编译和解释。根据翻译过程的差异性,来区分编译型语言和解释性语言。
1.4 运行
根据编译生成的可行性文件,系统需要运行,这里就是涉及如何让代码运行的问题,在嵌入式系统中,基于nuttx/linux系统,都会有启动脚本的东西,就是根据人为制定的顺序来启动不同的模块,这里就涉及脚本型语言(shell),当然了上层软件还会涉及PHP/JavaScript等脚本语言。
1.5 测试
分为白盒和黑盒测试,测试软件系统的稳定性和可靠性。
1.6 迭代
软件开发都会不断的迭代,处于优化和重构的过程,不断让系统完善。
2.编程语言在开发阶段中的差异性
在软件开发这个抽象的概念下,编程语言的差异性主要体现编码和编译以及运行上。
先来看看编译型语言定义:
编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。也就是在运行之前,代码已经被翻译位机器码了。
再来看看解释型语言的定义:
解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。也就是到机器码需要两个步骤,运行前先到中间码,运行时再编译成机器码。
再来看看脚本型语言的定义:
脚本语言又被称为扩建的语言,或者动态语言,用来控制软件应用程序,脚本通常以文本保存,只在被调用时进行解释。也就是处于软件的运行阶段,不参与编译,动态的解释并运行。
C/C++语言是属于编译型的,在编写完成C/C++程序后,由编译器进行预编译、编译、链接三个步骤生成可执行文件(exe)。
C#、java属于解释性语言,c#先是翻译成IL代码,在运行时被编译成机器码;Java先是翻译成bytecode,在运行时通过JVM(java 虚拟机)编译成机器码。
注意:此处生成机器语言前的操作是解释型,每次运行都要重新解释。因此,此处表明 java 是解释型。但是,部分 JVM有一种 JIT(Just in time)机制,能够将部分已经解释翻译的常用机器指令保存。下次不需要解释,直接运行即可。此时 java 是编译型。这个概念在这里已经有点模糊了,理解它的过程就行了,不必下一个“精确”的定义。
shell、JavaScript、php、python属于脚本语言,本质上也是解释性的,脚本语言不需要编译,可以直接用,由解释器来负责解释。比如shell,就是linux系统的命令,批量或者需要重复操作的命令,就写在一个文本中,批量处理,使用方便快捷。
写在最后:
语言只是工具,用起来只有熟练不熟练之分,核心是对问题的抽象能力,框架能力,以及解决问题的方法论。当然了,精通语言也是可以加快需求实现的过程,写出更少bug的代码。
在我看来,三七分,语言占三。