常用的编辑器与编译器
横向对比一些常用的编辑器,例如:Vim ,VS Code , Sublime Text2 ,Atom
配置方面:
- Vim 的可配置性非常强,各种插件、语法高亮配色方案等多不胜数,但是都需要自己亲手配置.vimrc文件,自由度很高,用户可以自由配置以及想要的功能
- Sublime Text2 有着语法高亮、代码提示补全、代码折叠、自定义皮肤/配色方案、多便签页等等,且Sublime Text 2 的各种配置均由配置文件控制,完完全全的可以由用户自定义,但最要命的一点是这是一款收费的商用软件,价值好像在59美刀,不过功能的确十分强大
- VS Code 支持大量的扩展插件,可以说是一个支持三大平台的VS,更适用于Web和前端开发
- Atom拥有非常精致细腻的界面,并且可配置项丰富,加上它提供了与 SublimeText 上类似的 Package Control (包管理)功能,人们可以非常方便地安装和管理各种插件,并将 Atom 打造成真正适合自己的开发工具。和VS Code一样,更适用于Web开发
性能方面:
- 目前处于初步阶段的 Atom 在性能上与传统的编辑器还有点差距,在打开大文件时尤为明显,而在一些机器上也容易出现 CPU 占用率过高等问题
- Sublime Txet2启动速度很快,尤其在了解了一些快捷键之后,使用起来的流畅度会更高
- VS Code 的启动速度以及打开大型文件的速度都非常迅速流畅,完全不卡,加载大文件几乎秒开,相比 Atom、Sublime Text 等感觉都要优秀!
- Vim性能很高,几乎不会有卡顿现象,虽然已经是古董级的编辑器,但是仍是广大程序员所热爱的神器,也是检验一个程序员真实水平的工具
常用的一些编译器:
MSVC,Windows平台上最常用的编译器,在C++编译器圣战中的胜利者,一个常被人诟病的是对标准的支持不够新不够快(最近开始逐步加快了)。随着微软发布基于Clang / C2,这一条路以后若成功,MSVC与Clang / C2并行,甚至逐步逐步退出舞台,都是有可能的事情。
Clang,重点介绍。licence极度友好,代码质量非常棒,采用的IR为LLVM IR非常优秀,各大公司逐步发力在Clang上,包括不限于微软,IBM,Nvidia等,各大公司也在开始疯狂的往Clang / LLVM交代码(圈地),也开始往Clang实现OpenMP,Nvidia GPU等支持,目前在赶超GCC的道路上一路激情的狂奔,前途一片光明。但是Clang依赖于的LLVM,目前的性能无法与GCC相提辩论,在Benchmark性能测试上几乎没有胜利的项目,优化的道路上任重道远,同时一些开源软件没有办法编译过去,主要是缺乏对GCC 一些Builtin函数、自身带的汇编器的孱弱导致。
GCC/G++,跨体系结构很多,很多开源软件默认编译器都是GCC/G++,这一点上Clang比不上。
- ICC,没有自己专门的前端(传说中的外包),而且是针对Intel体系结构上专门优化。
- IBM XL C++,在IBM特定硬件与平台上表现非常牛逼,Benchmark性能测试非常优秀,其最初的设计思想就是为了性能,其最高优化级别可以达到O5,带来的缺点则是在编译时间上往往过长。而另外一个常被人诟病的是对C++标准的支持、开源软件的支持、错误信息的提示上都不够友好,然而从13.2开始,随着IBM采用Clang融合方案,目前这几项都得到有效改良,然而融合的道路也必定是漫长的,以前的历史包袱等也需要背上。
为什么调试的时候需要编译选项中添加-g
调试的时候需要编译选项中添加 -g. 加选项-g是为了能够调试。不加可以运行,但不能调试。
readelf命令:
用来显示一个或者多个elf格式的目标文件的信息
ELF文件作用:
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件:
如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
如果是共享文件,则两者都含有。
彩色进度条实现
1 #include<stdio.h>
2 #include<unistd.h>
3 int main()
4 {
5 char bar[101];
6 int i=0;
7 const char *lable="-\\|/-";
8 for(;i<=100;i++)
9 {
10 bar[i]='\0';
11 printf("\033[42m[%s]\033[0m[%%%d][%c]\r",bar,i,lable[i%4]);
12 bar[i]=' ';
13 usleep(100000);
14 fflush(stdout);
15 }
16 printf("\n");
17 return 0;
18
19 }