编译型语言和解释型语言
编译型语言:需要通过编译器将源代码编译成机器码,之后才能运行的语言。一般需要经过编译、链接这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖串连起来生存可执行文件。优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以1编译型语言的程序执行效率高。可以脱离语言环境独立运行。缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。代表语言:C、C++。
解释型语言:解释型语言的程序不需要编译,相比编译型语言省了道工序,解释型语言在运行程序的时候才逐行翻译。优点:有良好的平台兼容性,在任何环境中都可以运行,前提时安装了解释器。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。代表语言:JavaScript、Python。
混合型语言:半编译型语言,C#在编译的时候不是直接翻译成机器码而是中间码,.Net平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。Java是先生成字节码再在Java虚拟机种解释执行。
动态语言和静态语言
动态语言:在运行时可以改变其结构的语言,简单来说就是在运行时代码可以根据某些条件改变自身结构。如Python、C#、JavaScript
静态语言:运行时结构不可变的语言就是静态语言。如Java、C、C++。
动态类型语言和静态类型语言
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,动态类型语言的数据类型不是在编译阶段决定的,而是把绑定延后到了运行阶段。如Python、JavaScript。
静态类型语言:静态类型语言的数据类型是在编译期间确定的、运行之前,编写代码时要明确变量的数据类型。如C、C++、Java。
注:动态类型语言与动态语言时两个概念,动态类型语言说的是数据类型,而动态语言说的是代码结构。并非解释型语言都是动态类型语言,编译型语言都是静态类型语言,如swift是编译型语言但它是动态类型语言,C#和Java是解释型语言也是静态类型语言。
强类型语言和弱类型语言
强类型语言:一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远就是这个数据类型。你不能把一个整形变量当成一个字符串处理。如Java、Python。
弱类型语言:数据类型可以忽略,一个变量可以赋不同数据类型的值。一旦给一个整形变量赋一个字符串值,那么整形变量就变成字符类型。如JavaScript,C和C++(有争议)。
注:一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。Python是动态类型语言,是强类型语言。JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。
C和C++的区别
结构不同:C语言结构只有成员变量(结构体),而没有成员方法。C++结构种可以有自己的成员变量和成员函数。
设计不同:C语言是进行过程化、抽象化的通用程序设计。C++既可以进行C语言的过程化设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行继承和多态为特点的面向对象的程序设计。
函数库不同:C语言有标准的函数库,它们是松散的,只是把功能相同的函数放在一个头文件中。C++对于大多数的函数都是继承的紧密,是一个集体。
关键字不同:C++继承了C语言的所有关键字,C++种还包含C语言没有的关键字。
源文件不同:C语言文件后缀为.c,C++文件后缀为.cpp。
返回值不同:C语言中如果函数没有指定返回值类型,默认是int返回随机数。C++如果函数没有返回值必须指定为void,否则编译会出错。
C++文件编译
预处理阶段:预处理器(cpp)会根据字符#开头的命令,修改原始的C程序。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以 .i 作为文件扩展名。
编译阶段:编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。
汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结构保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们再文本文件中打开hello.o文件,看到的将是一堆乱码。
链接阶段:连接器(ld)负责处理合并目标代码,生存一个可执行目标文件,可以被加载到内存中,由系统执行。
gcc和g++的区别和联系
gcc和g++都是GNU的编译器。①对于.c后