编译器_编译器错误 - CSDN
编译器 订阅
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。 展开全文
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
信息
别    称
译码器
表达式
源代码→预处理器 → 编译器 → 目标代码
提出者
葛丽丝·霍普
应用学科
计算机
中文名
编译器
适用领域范围
计算机,单片机,编程语言
外文名
Compiler
提出时间
20世纪50年代末
编译器工作原理
编译 [1]  是从源代码(通常为高级语言)到能直接被计算机 或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,所以我们电脑上的文件都是经过编译后的文件。
收起全文
精华内容
参与话题
  • 几款好的C/C++编译器编译器而非IDE)

    万次阅读 多人点赞 2018-11-10 17:38:39
    几款好的C/C++编译器编译器而非IDE)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    几个介绍IDE的博客:

    C/C++开发常用工具及系统编程

    C/C++开发者必不可少的15款编译器+IDE

     C/C++圣战

    大家说的都已经很多了,那么我在这里就不罗嗦口了,我着重讲下编译器。

    GCC(GNU Compiler Collection)

    官方网站:   https://gcc.gnu.org/

    GCC有Windows移植版本,比较出名的就是MinGW和TDM-GCC

    MinGW :http://www.mingw.org/

    TDM-GCC:  http://tdm-gcc.tdragon.net/download

    Cygwin:http://www.cygwin.com/

    GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

    llvm+Clang

    LLVM官方网站:http://llvm.org/

    Clang官方网站:http://clang.llvm.org/get_started.html

    LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者.

    Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang ( 发音为 /klæŋ/) 是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 Abstract Syntax Tree ( 抽象语法树 ) ,最后使用 LLVM 作为后端代码的生成器。
    Clang 的开发目标是提供一个可以替代 GCC 的前端编译器。与 GCC 相比,Clang 是一个重新设计的编译器前端,具有一系列优点,例如模块化,代码简单易懂,占用内存小以及容易扩展和重用等。由于 Clang 在设计上的优异性,使得 Clang 非常适合用于设计源代码级别的分析和转化工具。Clang 也已经被应用到一些重要的开发领域,如 Static Analysis 是一个基于 Clang 的静态代码分析工具。

     

    Watcom C/C++

    官方网站:http://www.openwatcom.org/index.php/Download

        在DOS开发环境中,Watcom C/C++ 编译器 以编译后的exe运行高速而著称,且首个支持Intel 80386 "保护模式"的编译器。于90年代中期,大批的雄心技术游戏(例如 Doom、Descent、Duke Nukem 3D 都以 Watcom C 写成)

        Watcom C/C++ 编译器、Watch Fortran 编译器 经已在不其先前所属公司Sybase售卖, 而被 SciTech 软件公司 作为 Open Watcom 开源包 发行。类似于其他的 开源编译器(例如 [GCC])项目,Watcom C代码小而便携, 其编译器后端(代码生成器)的目标码可变。该编译器可在DOS、OS/2、Windows等操作系统上运行,并生成各种可运行的(不必是该操作系统的)代码。该编译器支持Novell NetWare的 NLM 目标码。目前正进行 为 Linux[1] 、modern BSD (例如FreeBSD) 操作系统 重定目标码, 以便在 x86、PowerPC 及 其它处理器上运行。Open Watcom C/C++ 的1.4版于2005年12月发行,采用 Linux x86 为实验目标, 支持NT、OS/2等host平台. 曾有某被弃置的QNX版本,但其编译所须的库并未开源发行。当前最近的稳定版是1.9版,在2010年6月发行

    Digital Mars

    官方网站:http://www.digitalmars.com/

       DigitalMars是一款高性能的编译器,功能包含,快速编译/链接时、强大的优化技术、Contract设计、完整的资源库、浏览HTML文档,反汇编、库、资源编译器等。命令行及GUI版本、教程、代码示例、在线更新、标准模板库等等。

    MSVC系列

        与Visual Studio集成发布,微软自己的编译器,VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。

     Borland系列(turbo c和Borland C++)

        Borland C++ Builder Compiler 是一个 BC编译器。它是用来优化 BC 开发系统的工具。它包括最后版本的 ANSI/ISO C++ 语言的支持,包括 RTL,C++ 的 STL框架结构支持。Turbo C(TC)是其早期的命令行编译器作品

    Intel C++

    Intel C++ Compiler (简称 icc 或 icl)是美国 Intel 公司开发的 C/C++编译器,适用于 Linux、Microsoft Windows 和 Mac OS X 操作系统。

            Intel 编译支持 IA-32、Intel 64、Itanium 2、Intel Atom 处理器和某些非 Intel 的兼容处理器(例如某些 AMD 处理器)。开发人员应当检查系统需求。适用于 IA-32 和 Intel 64 的 Intel C++ 编译器的主要特点是自动向量化器,它能够生成 SSE、SSE2 和 SSE3 的 SIMD 指令及其适用于 Intel 无线 MMX 和 MMX 2 的嵌入式变种。
    Intel C++ Compiler 进一步支持 OpenMP 3.0 和适用于对称多处理的自动并行化。借助于 Cluster OpenMP 的附加能力,编译器还可为分布存储多处理根据 OpenMP 指示自动生成消息传递接口调用。
    Intel C++ Compiler 可通过四种方式获得,它分别是 Intel Parallel Studio、Intel C++ Compiler 专业版、Intel 编译器套装和 Intel Cluster Toolkit 编译器版的一部分。该编译器的最新发布是 Intel C++ Compiler 14.0 版本

    TCC(Tiny C Compiler)

    官方网站:http://bellard.org/tcc/

        Tiny C Compiler(缩写为TCC, tCc或TinyCC)用于x86(16/32位)或是x86-64(64位)系统的C compiler,而开发者为Fabrice Bellard。软件是设计用于低级电脑环境,或是于磁盘容量有限的空间中(1.44磁片或是硬盘)。软件可以适用于Windows、Linux、Unix操作系统,而最新版本为0.9.26(Feb 15, 2013)。TCC是在GNU宽通用公共许可证(LGPL)协议规范下发布。作者是大神法布里斯·贝拉(FabriceBellard)

    TCC符合ANSI C(C89/C90)规范,Tiny C Compiler Reference Documentation accessed on 2008-08-07]亦符合新版的ISO C99标准规范,与GNU C扩展的内嵌汇编语言(即inline assembler,内联汇编大陆用语)功能汇编语言。

    而Google Andriod系统内亦曾经内置于其中,于Andriod 2.0版本中

     

    其他一些没有详细解释的编译器
    VectorC1.3.3,IBMVisualAgeforC++,KAIC/C++4.03fforRedHat7.2,Lcc4.1,LCC-WIN32,SmallC,CC386,PacificC
    另外还有C的解释器Quincy,Eic,CINT

                Intel C/C++大家一看名称就知道是Intel的东西,它和VC6完全兼容,不过要挂在VC6下才能用。Watcom C/C++是早先编译器四国大战中的一员,原本是很不错的东西,可惜战略不对,现在已不见声息了。倒是以它为基础的一个OpenWatcom现在还在奋战。VectorC是我近日才发现的一个好东东,它是个纯C的编译器。IBM的VisualAge for C++原本是IBM想用来淌C++编译器这片浑水的东西,不过IBM的战略改了,它就被放弃了。DigitalMars C/C++的前身的Symantec C++(它也是编译器四国大战中的一员),不过现在Symantec不做了,于是它的作者就把它改成了DigitalMars C/C++开放给大家使用。以上这些都是WIN32平台上的东西。KAI C/C++是个很强大的C/C++编译器,它是个多平台的编译器。不过现在被INTEL收购了,已经停止开发了。Lcc4.1是个纯C的编译器它是开放源代码的。不过不怎么好用。LCC-WIN32是一个在LCC基础上开发的C语言的集成开发环境,很好用,而且有很详细的资料,FREE!Pacific C是一个纯DOS的C的集成开发环境,就不多说了。Small C CC386都是开放源代码的编译器,它们都很简单,应用来给大家学习编译器的。

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 编译器介绍

    千次阅读 2018-03-14 11:54:35
    源文件经过编译器编译后才可生成二进制文件,编译过程包括预处理、编译、汇编和链接,日常交流中常用“编译”称呼此四个过程。编译器是一系列工具的集合,如arm平台使用的交叉编译器arm-linux-gcc包括arm-linux-cpp...

          源文件经过编译器编译后才可生成二进制文件,编译过程包括预处理、编译、汇编和链接,日常交流中常用“编译”称呼此四个过程。编译器是一系列工具的集合,如arm平台使用的交叉编译器arm-linux-gcc包括arm-linux-cpp(compiler preprocessor预处理)、arm-linux-cc1(c compiler编译)、arm-linux-as(assembly 汇编)、arm-linux-ld(linker链接)等工具。常见的编译器种类如下:

    GCC编译器

       一、GCC简介(转载https://www.cnblogs.com/zengkefu/p/6372282.html?utm_source=itdadao&utm_medium=referral

    The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,这是GNU项目里面的著名开源编译器集,即Linux系统下常用的编译器为什么是编译器集而不是编译器呢?

         那是因为它不仅支持 C 语言编译,还支持 C++, Ada,Objective C 等许多语言。另外 GCC 对硬件平台的支持,可以所无所不在,它不仅支持 X86处理器架构, 还支持 ARM, Motorola 68000, Motorola 8800,AtmelAVR,MIPS 等处理器架构。

     

    二、GCC的组成结构

    GCC 内部结构主要由 Binutils、gcc-core、Glibc 等软件包组成。

     

    1. Binutils:它是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。关于 Binutils 的介绍可以参考 Binutils 简单介绍。这个软件包依赖于不同的目标机的平台。因为不同目标机的指令集是不一样的,比如 arm 跟 x86 就不一样。

     

    2. gcc-core:顾明之意是 GCC 的核心部分,这部分是只包含 c 的编译器及公共部分,而对其他语言(C++、Ada 等)的支持包需要另外安装,这也是 GCC 为何如此强大的重要原因 。gcc-core依赖于 Binutils。

     

    3. Glibc:包含了主要的 c 库,这个库提供了基本的例程,用于分配内存,搜索目录,读写文件,字符串处理等等。kernel 和 bootloader不需要这个库的支持。

     

    举例描述下上面 3 个包是如何进行运作的。有一个 c 源文件 test.c 源码如下:

     

    1. #include<stdio.h>  

    2. int main(int argc, char *argv[])  

    3. {  

    4.     printf("Hello Linux!!\n");  

    5.     return 0;  

    6. }  

     

    编译命令为: gcc -o test test.c 编译生成 test 可执行文件。gcc 编译流程分为四个步骤:预处理、编译 、汇编、链接。预处理和编译主要由 gcc-core 来完成,汇编和链接主要由 Binutils 来完成。那么何时用到 glibc 呢?看到源码中的 printf 函数没有,这个函数在 GCC 中是以库函数的形式存在,这个库函数在 glibc 库中,在 stdio.h 头文件中被声明。


    总的来说,如果真正了解了上面 3 个软件包的作用,自然就明白 GCC 是如何工作的。

    三、对编译器的控制(以arm-linux-gcc为例)

    通过编译器命令参数,来控制编译器的执行过程,详细如下:



    三、交叉编译

    交叉编译(或交叉建立)是这样一种过程,它在一种机器结构下编译的软件将在另一种完全不同的机器结构下执行。一个常见的例子是在 PC 机上为运行在基于 ARM、PowerPC或 MIPS 的目标机的编译软件。幸运的是,GCC 使得这一过程所面临的困难要比听起来小得多。

     

    GCC 中的一般工具通常都是通过在命令行上调用命令(如 gcc)来执行的。在使用交叉编译的情况下,这些工具将根据它编译的目标而命名。例如,要使用交叉工具链为 ARM 机器编译简单的 Hello World 程序,你可以运行如下所示的命令:使用如下命令编译并测试这个代码: arm-linux-gcc -o hello hello.c。

     

    四、arm-linux-gcc

    arm-linux-gcc 是基于 ARM 目标机的交叉编译软件, arm-linux-gcc 跟 GCC 所需的安装包不同,但仅仅是名字不同而已,这是为什么呢?

     

    x86 跟 ARM 所使用的指令集是不一样的,所以所需要的 binutils 肯定不一样;上面提到过 gcc-core 是依赖于 binutils 的,自然 ARM 跟 x86 所使用的 gcc-core 包也不一样;glibc 一个 c 库,最终是以库的形式存在于编译器中,自然 ARM 所使用的 glibc 库跟 x86 同样也不一样,其它的依此类推。

     


    五、arm-elf-gcc

    arm-elf-gcc 跟 arm-linux-gcc 一样,也是是基于 ARM 目标机的交叉编译软件。但是它们不是同一个交叉编译软件,两者是有区别的,两者区别主要在于使用不同的 C 库文件。arm-linux-gcc使用 GNU 的 Glibc,而 arm-elf-gcc 一般使用 uClibc/uC-libc 或者使用 RedHat专门为嵌入式系统的开发的C库newlib。只是所应用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型化C语言库,实现了Glibc部分功能。

     

    六、uClibc/uC-libc 

    uClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差别,下面就简单的介绍一下二者的不同之处。

     

    uC -libc是最早为uClinux开发的库,是Jeff Dionne和Kenneth Albanowski为在EKLs项目中支持m68000在Linux-8086 C库源码上移植的。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的标准也没有实现。uC-libc稳定地支持 m68000,ColdFire和没有MMU的ARM。其主要设计目标是“小”、“轻”,并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并不像它期望的那样和所有标准一致。

     

    uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确的返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到多种架构中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以在许多支持MMU的平台上被编译成共享库。

     

    Erik Anderson在uClibc背后做了很多的工作。

     

    uClibc支持许多系列的处理器:m68000,Coldfire,ARM,MIPS,v850, x86,i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc能够很容易的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是uClibc编译。对于m68000和Coldfire平台来说,选择uC-libc还是稍微好一点,因为它支持共享库,而共享库是这些cpu经常使用的 libc。uClibc也几乎和所有的平台都能很好的工作。

     

    newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到很多CPU结构上。

     

    newlib实现了许多复杂的功能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。

     

    七、C语言库的选择

    在为ARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用--with-newlib时,gcc编译器不使用Glibc。

     

    当没有交叉编译Glibc时,可以使用--with-newlib禁止连接Glibc而编译bootstrap gcc编译器。

    从gcc源目录下的config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影响gcc连接C语言库,t-linux(--target=arm-linux)默认使用Glibc,-arm-elf(--target=arm-elf)使用- Dinhibit_libc禁止连接Glibc,这时我们就可以使用newlib等其他C语言库编译GCC工具链。

     

    虽然GCC工具链配置了不同的的C语言库,但由于这些C语言库都可以用来支持GCC,它们对核心数据的处理上不存在较大出入。因而arm-linux-* 和 arm-elf-*区别主要表现在C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI/启动代码以及不同系统特性等微小的差别。

     

    arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可以编译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只是在遵循下面的描述时系统程序显得更加协调:

     

    •  arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。

    •  arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib等其他C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等能使得系统程序更加小巧快捷

    Visual C++编译器

    一、定义

    是微软开发的编译器,主要使用在Windows系统下。

    The Visual C++ Build Tools allow you to build C++ libraries and applications targeting Windows desktopThey are the same tools that you find in Visual Studio 2017 and Visual Studio 2015 in a scriptable standalone installer. Now you only need to download the MSVC compiler toolset you need to build C++ projects on your build servers.

    The Visual C++ Build Tools download is refreshed to include every Visual Studio update. The installer includes most updates of the MSVC compiler toolset from Visual Studio 2017. The installer also includes the MSVC compiler toolset from VS 2015 Update 3.

    二、Visual Studio是微软开发的使用与Windows平台的集成开发环境;


    现在主流或者说是常见的编译器有四种:

    1、Visual C++:这可能是大家用的最多的。不用说也知道是微软家的。Visual C++ 6.0可能是学C++的人最熟悉不过的了,不过6.0出来的时候,它的编译器对C++标准的兼容性比较低,只有70%左右。当然,这有其历史原因,Visual C++6.0出生的时候,C++标准还没出来呢~。Visual C++编译器发展到现在对C++标准的兼容性已经很好了,可以达到98%左右。

    2、Borland C++:这是由Borland公司出品。该公司的编译器以速度快、占用空间少著称。Borland C++ Builder和Borland C++ Builder X这两种开发工具用的就是这个编译器。

    3、GNU C++:又名GCC。这是GNU项目里面的著名开源编译器,是类UNIX系统下编写C++首先的编译器。其特点是可移植性好,可以在广泛的平台上使用它,是跨平台嵌入式系统开发的首选。在兼容性方面,GCC3.3达到了96.15%。

    4、Intel C++:从名字就可以知道此编译器的主人了。它是针对Intel x86体系结构的CPU特别优化定制的,换句话说就是,它是基于Intel的处理器内核而开发的。此编译器对于高性能数值运算这种环境下的优势很明显,可以不优化代码的情况下就能提升程序的性能。










    展开全文
  • 我们将要讨论的是两大...今天我们围绕的主角是一些超级棒的 C 和 C++ 的集成开发环境(IDE)和编译器。IDE 主要是在程序员开发时提供各种软件应用组件,最受程序员受欢迎的 IDE 都有一个共同点,那就是非常有吸引...

    我们将要讨论的是两大古老而又流行的语言: C 和 C++,它们有着许多卓越的特性,更高效的功能和支持工具。现在这两种语言依然那么活跃,因为它们的 rubout 函数集提供了巨大的安全保障,可靠性非常强。

    今天我们围绕的主角是一些超级棒的 C 和 C++ 的集成开发环境(IDE)和编译器。IDE 主要是在程序员开发时提供各种软件应用组件,最受程序员受欢迎的 IDE 都有一个共同点,那就是非常有吸引力的用户界面。这里我们收集了一些最好的 C 和 C++ 的 IDEs 和编译器。

    集成开发环境:

    1 kDevelop

    Kdevelop 是 C/C++ 和其他语言的开源插件可扩展 IDE,是基于 KDevPlatform ,KDevPlatform 是个开源程序集,可以作为 IDE 的基础。

    kDevelop
    kDevelop

    2 Anjuta

    Anjuta Devstudio 是另一个卓越的开发环境,拥有很多超棒的功能,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI 设计工具,性能分析器等等。这个 IDE 提供超强大的用户界面开发 C/C++ 程序的接口。

    Anjuta Devstudio
    Anjuta

    3 Code Blocks

    code block 是最流行的免费开源的集成环境之一,这个 IDE 包括所有开发者需要的功能,比如:高效的用户界面,编译器和调试器等等。

    Code Blocks
    Code Blocks

    4 Visual Mingw

    Visual-MigGW 是个极其抽象的开源 IDE。它所有 Windows API 都变得极其简单,可以进行快速开发。它提供一个简化代码和获取 C++ 对象的模块,提前准备好使用应用框架的环境。

    Visual_MigGW
    Visual Mingw

    5 Ideone

    Ideone 是 C 和 C++ 的在线编译和调试工具,支持其他的 60 种语言。这个工具提供许多强大的功能,允许程序员快速高效的编译源代码。

    Ideone
    Ideone

    当然还有很多其他好用的IDE工具,比如dev C++等,柳猫就不一一列举了……

    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。

    展开全文
  • 21分钟学会写编译器

    千次阅读 2018-08-20 11:17:57
    知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?...


    本文来自网易云社区


    知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。


    先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?


    很显然,损耗的比例肯定非常高,毕竟国内互联网公司日常开发工作中,程序员基本很少接触这三块知识。大部分程序员工作几年后对编译原理相关的概念只能生理上起反应,脑海里很难再串联起相关概念了。


    编译原理的概念有让人看到就头痛的特质,学校里要死记硬背,考试过了巴不得赶紧全忘掉,相信不少同学现在看到下面概念还会觉得蛋疼:


    • 非确定性有限自动机/确定性有限自动机

    • 四元式序列

    • 上下文无关文法/BNF

    • 终结符/非终结符

    • LL(1)/LR(1)

    • 特设语法制导转换

    • 局部优化


    如果要按照课程来,光是背下这些名词和释义别说21分钟了,21天都搞不定。更何况背下来这些名词之后如何写编译器又是另一个问题。


    我们很多时候,都只是想快速上手写一个编译器,有可能是因为好奇,有可能是想实现自己的玩具DSL(领域特定语言),或者有可能是为了在约架时候防身。


    今天,我们就来看看如何用21分钟的时间学会写编译器,上面的废话大概花费1分钟,接下来还剩20分钟。


    正式开始做编译器之前,先以问答的形式对接下来的内容做个简单介绍:


    • 什么是编译器

    广义的编译器可以指任意把一种语言代码转为另一种语言代码的程序。


    • 做编译器实际上都需要做什么

    编译器是一整套工具链,从前端的词法分析、语法分析,到中间表示生成、检查、分析、优化,再到代码生成。


    如果是编译器从业者,大部分时间在做中间这块;如果是业余爱好者,大部分时间在做前端和代码生成。


    • 那我们今天做的是个什么编译器

    既然是21分钟,那学会写个gcc肯定是不可能的,就算拿来学Flex+Bison都只能入个门。


    我们接下来会先确定一下源语言的语法集,然后设计一下抽象语法树(AST)结构,写一个Parser,把源语言转换成一棵抽象语法树,再写一个CodeGenerator,把语法树转换为目标语言。


    也就是说,相比于一个正常的编译器,我们省去了类型检查和中间表示的分析优化,并且为了能21分钟内学会,我们会把源语言定义得特别蠢。


    接下来开始正文。


    先确定源语言:


    这是一门看起来像lisp的四则运算语言,四个双目运算符分别是「add」「sub」「mul」「div」。


    多项四则运算可以这样写:


    (mul (sub 5 (add 1 2)) 4)

    再来确定目标语言:


    同样是一门四则运算语言,但是看起来可读性更强,对应的四个双目运算符分别是「+」「-」「*」「/」。


    上面源语言的例子编译完后应该是这样:


    ((5 - (1 + 2)) * 4)

    最后确定我们写编译器要用的语言:

    选择Haskell,有两个原因,一是写Haskell有大名鼎鼎的ParseC,写Parser非常方便;二是Haskell的代数数据类型的定义本身就是AST。


    ParseC的全称是Parser组合子。Parser,抽象理解就是一个输入为字符串输出为类型T的值的函数。ParseC库实现了大量基础Parser和Parser组合子,Parser组合子可以将库自带的基础Parser和用户定义的Parser随意组合成新的更强大的Parser。


    举个例子,你实现了一个Parser,功能是根据输入文本返回解析到的标识符名称。ParseC库实现了一个名叫many的parser组合子,跟你自己的Parser组合起来就产生了一个新的Parser:可以根据输入文本返回解析到的标识符名称list。


    为什么要用ParseC呢?因为用ParseC定义Parser具有PEG(解析表达式文法,原理不细讲,不影响接下来学习)的所有好处,同时还不用再学习语言之外的知识(比如用flex和bison前要先学习这两者自己的「DSL」)。


    当然,其他语言也有类似的库,比如c++有boost::spirit,Java/C#/F#/JS有Haskell的ParseC的工业级实现。这些语言跟Haskell的区别无非在于要写一些额外的逻辑把Parser的解析结果转成AST。


    如果没有接触过Haskell的话也没关系,接下来的示例代码都非常declarative,非常self-descriptive,请放心食用。


    接下来就开始写代码了,首先我们要定义AST的结构,目的是为了能用这个结构描述一切源语言表达式。


    简单分析一下源语言,我们可以直接得出表达式这个概念的递归定义:一个表达式要么是一个字面值,要么是一个双目运算符和两个表达式的求值结果。


    然后是字面值这个概念的递归定义:一个字面值要么是一个整型值,要么是一个浮点型值。 在Haskell里面这两个定义写成下面这样:


    type BinOp = String
    data Val = IntVal Integer     | FloatVal Float deriving (Eq, Ord, Show)
    data Exp =  ConstExp Val     | BinOpExp BinOp Exp Exp deriving (Eq, Ord, Show)

    跟前面的文字定义对应一下:

    • 表达式Exp,要么是一个字面值表达式ConstExp,由一个Val组成;要么是一个双目运算表达式BinOpExp,由一个操作符和两个Exp组成。

    • 值Val,要么是一个整型值IntVal,由一个Integer组成;要么是一个浮点型值FloatVal,由一个Float组成。

    接下来开始写Parser。流程是先为AST中的每个节点类型写一个parser,然后再把这些parser组合起来形成能parse出整棵AST的parser。 我们先给自己定个小目标,比如先实现一个int_parser。


    p_int是能从文本中Parse出Integer的Parser定义。而p_int_val改造了p_int,定义了能从文本中Parse出IntVal的Parser。


    然后我们把int和float的parser组合起来成为一个val_parser。

    p_val :: Parser Val
    p_val =  listplus [p_int_val,p_float_val]

    listplus可以简单理解为并,在具体实现上会做回溯。


    同理,我们先分别实现ConstExp的parser和BinOpExp的parser,再把两者组合为exp_parser。

    p_const_exp :: Parser Exp p_const_exp =  ConstExp <$> p_parse p_val
     <?> "p_const_exp"  p_bin_op_exp :: Parser Exp p_bin_op_exp =  p_between '(' ')' inner <?> "p_bin_op_exp"     where         inner = BinOpExp
     <$> p_parse (listplus [string "add", 
                                    string "sub", string "mul", string "div"])
     <*> p_parse p_exp
     <*> p_parse p_exp
     <?> "p_bin_op_exp_inner"  p_exp :: Parser Exp p_exp =  listplus [p_const_exp, p_bin_op_exp]         <?> "p_exp"

    到目前为止,我们的parser部分就完工了。


    对Haskell有兴趣的同学,可以安装下ghci,是haskell的REPL,然后加载刚才写好的Parser.hs,在命令行里试一下:


    Prelude> parse p_exp "" "(mul (sub 5 (add 1 2)) 4)"


    可以看到输出结果。稍微排版下,输出结果变成了我们熟悉的树形结构,Op为「mul」的BinOpExp就是树的根节点。整个输出就是一棵AST。


    Right (BinOpExp 
                "mul" 
                (BinOpExp 
                    "sub" 
                    (ConstExp (IntVal 5)) 
                    (BinOpExp 
                        "add" 
                        (ConstExp (IntVal 1)) 
                        (ConstExp (IntVal 2)))) 
                (ConstExp (IntVal 4)))


    有了这棵AST,我们就可以开始做后续的代码生成了。


    CodeGenerator的主体是把Exp转换成目标语言代码的函数:


    exp_gen :: Exp -> Maybe String
    exp_gen (BinOpExp op e1 e2) = do
        s1 <- exp_gen e1
        sop <- op_gen op
        s2 <- exp_gen e2
        return (format "({0} {1} {2})" [s1, sop, s2])
    exp_gen (ConstExp val) = do
        case val of 
            IntVal int_val -> return (show int_val)
            FloatVal float_val -> return (show float_val)


    利用模式匹配这个语言特性实现多态既容易又优雅。


    最后再套个壳,比如读源文件,写目标文件,整个编译器就大功告成了。

    好了,看到这里,相信你对怎么快速写一个编译器已经有了比较充分的了解。


    当然,我不否认,「21分钟学会写编译器」有标题党的嫌疑,如果想按本文介绍的方法从零开始写编译器,即使不用学flex和bison,不用回忆编译原理课程内容,也还是需要了解PEG,了解自己熟悉语言的ParseC库用法。


    但是,这仍然是个人认为的最快上手写编译器的方法。远离痛苦的抽象概念,从动手开始,不正是很多同学喜欢上写代码的初心吗?


    如之前所说,我们虽然实现了一个编译器,但是这个编译器非常蠢,比如BinOp的存在本身就有问题:


    • BinOp在AST中用字符串表示,我们就没办法检查两个操作数的类型。

    • BinOp成了特殊概念,而不是普通的函数。


    文章中的一些背景知识由于篇幅原因我没办法一一解释,这里简单列个reference,对相关话题感兴趣的可以去搜索引擎搜索对应的关键字:


    • haskell的相关概念,看real world haskell即可。

    • ParseC的相关概念,可以找这几篇文献,「the essence of fp」「monads for fp」「monadic parser combinator」。

    • 编译原理相关概念,不建议看《龙书》,有兴趣的可以翻翻看《Engineering a Compiler》。



    原文:21分钟学会写编译器

    本文来自网易云社区,经作者王迅授权发布。


    了解网易云 :

    网易云官网:https://www.163yun.com

    网易云社区:https://sq.163yun.com/blog

    网易云新用户大礼包:https://www.163yun.com/gift


    更多网易研发、产品、运营经验分享请访问网易云社区

    展开全文
  • 编译器汇总~

    2018-10-04 15:08:27
    各种编译器gcc/g++基本用法执行过程Turbo C基本使用java编译器python解释器CPythonIPythonPyPyJythonIronPython gcc/g++ GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go...
  • 程序猿专用十大在线编译器(IDE)整理

    千次阅读 2019-03-13 14:16:53
    1. CodeSandbox(基于 React 的在线代码沙盒平台) 我常用的 ① 主流的脚手架都支持,比如在线create-react-app,vue-cli等(在线 fork 修改),支持 github 登录(项目导入),也支持 cli 上传例子,例子可以在线访问和下载,...
  • 本系列的第一篇,我想概述一下编译器的构造,同时帮助大家了解编译器中各个组成部分的用途。想必大家看别的编译原理书籍,大都在第一章或者序言之类的地方,将编译器分成许多模块,然后每一个模块负责编译的特定阶段
  • 编译器背后的故事

    2020-10-16 21:24:16
    编译器背后的故事用gcc形成静态库和动态库1.1创建目录1.2生成文件1.3由.o 文件创建静态库1.4在程序中使用静态库。1.5 由.o 文件创建动态库文件 文件创建动态库文件1.6在程序中使用动态库二、Linux 下静态库.a 与.so ...
  • 编译器编译的过程

    2020-10-16 22:30:07
    我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是...
  • 编译器的相关

    2020-10-17 22:53:20
    目录一、gcc生成.a和.so文件(一)仿照实验(二)比较.a和.so文件二...这篇博文解决这些问题,对gcc编译器较为深入学习。 如有错误,请大佬指出更正。 一、gcc生成.a和.so文件 (一)仿照实验 1.编写代码 #ifndef HELL
  • 推荐一款强大的在线编译器

    万次阅读 2019-08-31 12:02:27
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649284021&idx=1&sn=9ba0bfcaaad0a9042098c2370ab3000f&scene=19&token=261764750&... 前言 今天给大家推荐一个强大的...
  • C语言编译器哪个好?几款好用的C语言编译器推荐

    万次阅读 多人点赞 2018-06-28 11:19:21
    一些刚开始接触C语言编译的小伙伴想下载一款C语言编译器来使用,网络上有不少C语言编译器相关的软件,让人很难抉择。那么,C语言编译器哪个好?今天的文章,老九君给小伙伴们整理了几款好用的C语言编译器推荐给大家...
  • 编译器(GNU & GCC & clang & llvm)

    万次阅读 多人点赞 2015-01-23 16:25:26
    很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透彻他们直接的关系与区别。 ...
  • 编译器

    2007-05-17 19:52:00
    编译器,是将便于我们编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源程序...
  • 来源:伯乐在线,作者:Chaobs首先向C语言之父Dennis Ritchie致敬!当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如...
  • Python编译器-PyCharm

    千次阅读 2018-07-31 18:46:31
    PyCharm是一款功能强大的python编辑器,具有跨平台性,介绍PyCharm下载和安装,使用方法。  PyCharm的下载地址:... 备注:professional表示专业版,community是社区版,professio...
  • 常用C++编译器推荐

    千次阅读 2020-01-03 11:19:53
    本文将为大家带来的是几款简单实用的C++编译器(非IDE),希望大家喜欢。 GCC(GNUCompilerCollection) 官方网站:https://gcc.gnu.org/ GCC有Windows移植版本,比较出名的就是MinGW和TDM-GCC GNU编译器套件...
  • C语言---编译器、编辑器

    千次阅读 2020-04-18 13:11:21
    什么是C语言编译器,C语言代码编辑器,C语言标准库. 相信很多C语言方面的书籍开篇都是先讲C语言的历史什么的,但是我觉得应该对学习C语言所使用安装的各种“软件”进行一个讲解和说明, 了解C语言的环境,这对于学习...
  • Keil C51编译器

    千次下载 热门讨论 2020-07-30 23:33:35
    在Keil u4 for ARM 下增加 C51支持的扩展包
  • 大家最早开始接触编程语言应该就是C/C++了吧,这也是在大学中必考的一个证书,但在学校学习的那些知识,当你出校门时就会发现略显得陈旧了,尤其是经过这么多年的发展,C/C++编译器越来越多,究竟哪个好用呢?...
1 2 3 4 5 ... 20
收藏数 1,165,676
精华内容 466,270
关键字:

编译器