新银河是诚信为本,市场在变,我们的诚信永远不变...
各位,关于编译器和集成开发环境这两个名称,我们平时一直在说,但这二位究竟有什么区别和联系呢,今天就跟大家简单聊一聊。
我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序( )。
在 下,可执行程序的后缀有 .exe 和 .com(其中 .exe 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。
可执行程序的内部是一系列计算机指令和数据的集合,它们都是二进制形式的,CPU 可以直接识别,毫无障碍;但是对于程序员,它们非常晦涩,难以记忆和使用。
例如,在屏幕上输出“VIP会员”,C语言的写法为:
puts("VIP会员");
二进制的写法为:
你感受一下,直接使用二进制是不是想撞墙,是不是受到一吨重的伤害?
在计算机发展的初期,程序员就是使用这样的二进制指令来编写程序的,那个拓荒的年代还没有编程语言。
直接使用二进制指令编程对程序员来说简直是噩梦,尤其是当程序比较大的时候,不但编写麻烦,需要频繁查询指令手册,而且除错会异常苦恼,要直接面对一堆二进制数据,让人眼花缭乱。另外,用二进制指令编程步骤繁琐,要考虑各种边界情况和底层问题,开发效率十分低下。
这就倒逼程序员开发出了编程语言,提高自己的生产力,例如汇编、C语言、C++、Java、、Go语言等,都是在逐步提高开发效率。至此,编程终于不再是只有极客能做的事情了,不了解计算机的读者经过一定的训练也可以编写出有模有样的程序。
一、什么是编译器
C语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是对于CPU,C语言代码就是天书,根本不认识,CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成 .exe 程序;这个工具是一个特殊的软件,叫做编译器()。
编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译()。
编译也可以理解为“翻译”,类似于将中文翻译成英文、将英文翻译成象形文字,它是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件架构。对于学计算机或者软件的大学生,“编译原理”是一门专业课程,有兴趣的读者请自行阅读《编译原理》一书,这里我们不再展开讲解。
注意:不了解编译原理并不影响我们学习C语言,我也不建议初学者去钻研编译原理,贪多嚼不烂,不要把自己绕进去。
C语言的编译器有很多种,不同的平台下有不同的编译器,例如:
下常用的是微软开发的 cl.exe,它被集成在 或 C++ 中,一般不单独使用;
Linux 下常用的是 GUN 组织开发的 GCC,很多 Linux 发行版都自带 GCC;
Mac 下常用的是 LLVM/Clang,它被集成在 Xcode 中(Xcode 以前集成的是 GCC,后来由于 GCC 的不配合才改为 LLVM/Clang,LLVM/Clang 的性能比 GCC 更加强大)。
你的代码语法正确与否,编译器说了才算,我们学习C语言,从某种意义上说就是学习如何使用编译器,让编译器生成可执行程序(例如 下的 .exe 程序)。
编译器可以 100% 保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,便于你的更改。
二、什么是集成开发环境
实际开发中,除了编译器是必须的工具,我们往往还需要很多其他辅助软件,例如:
编辑器:用来编写代码,并且给代码着色,以方便阅读;
代码提示器:输入部分代码,即可提示全部代码,加速代码的编写过程;
调试器:观察程序的每一个运行步骤,发现程序的逻辑错误;
项目管理工具:对程序涉及到的所有资源进行管理,包括源文件、图片、视频、第三方库等;
漂亮的界面:各种按钮、面板、菜单、窗口等控件整齐排布,操作更方便。
这些工具通常被打包在一起,统一发布和安装,例如 、Dev C++、Xcode、 C++ 6.0、C-Free、Code:: 等,它们统称为集成开发环境(IDE, )。
集成开发环境就是一系列开发工具的组合套装。这就好比台式机,一个台式机的核心部件是主机,有了主机就能独立工作了,但是我们在购买台式机时,往往还要附带上显示器、键盘、鼠标、U盘、摄像头等外围设备,因为只有主机太不方便了,必须有外设才能玩的爽。集成开发环境也是这个道理,只有编译器不方便,所以还要增加其他的辅助工具。
三、选择哪种集成开发环境
C语言的集成开发环境有很多种,以前写过专门的推送介绍过,这里就不再赘述了。如果你实在不知怎么选择的话,那就VS吧,毕竟号称宇宙第一IDE,哈哈,就讲到这里吧,各位了解了吗?
汇编语言开发环境 编程语言-什么是低级语言?
信息的有效传递至少需要传递者、接收者、共识信息等才能构成一个闭环,举个栗子(如下图):
信息在上图中其实就是 ‘中文’,共识的意思就是都能听的懂,下图是一个无效的信息传递:
人们想要和计算机打交道并且让计算机帮助我们去做一些事情时,作为主动传达信息的人们则需要‘说’一些计算机能听懂的‘语言’()也就是常说的编程语言。
计算机早期的时候人们的目的只有一个,让计算机能听懂就行,于是就有了早期的编程语言-机器语言( )
机器语言有个特点就是由0和1组序列组成的指令码,如下示例:
# 指令示例
0000 代表 LOAD
0001 代表 SET
# 内存示例
000000000000 代表 地址为0的内存区域
000000000001 代表 地址为1的内存区域
000000001000 代表 地址为16的内存区域
# 暂存器示例
0000 代表 暂存器A
0001 代表 暂存器B
# 将上述集成在一起示例
-----------------------------------------------------
指令 暂存器 内存地址 含义
-----------------------------------------------------
0000,0000,000000000001 LOAD,A,1(加载内存地址为1的暂存器A)
好了,计算机这回算是听的懂人们说的了,但是程序员们可要忙坏了[吐]
许多繁杂琐碎的细节牵制着程序员,即使智力超群的程序员也常常会顾此失彼,屡出差错,因而所编出的程序可靠性差,且开发周期长。因此机器语言也被称为 低级语言(相对)
人们的思想一直在演变与进步,为了更加友好地写出计算机能听得懂的语言,于是就有了第二代编程语言--汇编语言( ),其特点是用一些容易理解和记忆的字母,单词来代替一个特定的指令
# 简单示例
START 表示 程序的入口
END START 表示 程序结束
DATA SEGMENT 表示 定义数据段,可以把数据放入这个段内
DATA ENDS 表示 数据段结束
下面是用汇编语言实现的输出 ‘Hello World!’ 先来感受一下(左右滑动有注释)
DATA SEGMENT ;定义数据段
PRINT DB "Hello World!", 0AH, 0DH, '#39; ;定义一个字符串,以'#39;结束
DATA ENDS ;定义数据段结束
STACK SEGMENT STACK ;定义堆栈段
DW 20 DUP(0) ;为堆栈段分配空间
STACK ENDS ;定义堆栈段结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA, SS:STACK ;告诉编译器将段寄存器与符号对应起来
START: ;程序入口
MOV AX, DATA
MOV DS, AX ;将段地址DATA送入DS中
MOV DX, OFFSET PRINT ;将字符串地址送人DX中
MOV AH, 09H
INT 21H ;调用INT 21H的9号中断
MOV AH, 4CH ;返回DOS系统
INT 21H
CODE ENDS ;定义代码段结束
END START ;程序结束
目测一下,汇编语言比起机器语言仅仅只是在编写量和程序员维护起来方便了那么一丢丢,其编写层面上还是要懂得CPU运行、内存空间加载的原理,还是直接操作硬件来传达信息,并没有什么实质上的改变。
因此汇编语言和机器语言一样都被称为 低级语言。
优点对比总结:
机器语言:编写的程序指令()可以被计算机无障碍理解并直接运行,没有中间商赚差价,效率贼高。
汇编语言:使用易懂的英文编写,执行效率比机器语言稍低(仍然是直接操作硬件)
缺点对比总结:
机器语言:仍然是直接操作硬件,因此开发复杂效率低跨平台性差
汇编语言:同上
万物星辰都在不断演变,如今我们谈论到的低级语言是站在现在环境的角度去评价的,然而在语言的诞生时代,是非常有意义的,现在今后也一样。