精华内容
下载资源
问答
  • 所以不同的操作系统要用不同编译器 在 GNU中(GNU是某个内核为Linux的操作系统,除了GNU还有安卓,内核可以理解成为汽车发动机,GNU和安卓理解为车壳)使用的是gcc和g++编译器 在WINDOWS平台中使用的是msvc

    编译器的编译有三步
    1 源代码生成汇编码
    2 汇编语言生成中间代码.obj类型,一个源文件一个.obj
    3.连接,在汇编里称Link,在C里叫生成,即Build,它的作用是生成后缀为.exe等机器码可执行文件

    二进制机器码要先访问操作系统,再由操作系统访问CPU和内存等硬件不同的操作系统有相应的二进制机器码的规范,所以不同的操作系统要用不同的编译器

    在 GNU/Linux中使用的是gcc和g++编译器
    在WINDOWS平台中使用的是msvc编译器,还有gcc g++的Windows版本mingw,目前只知道两个。
    其他硬件还有对应的编译器,如DSP芯片的开发平台CCS内置的编译器。
    还有其他的编译器,我就不太了解了。

    make cmake
    编译器不能生成可执行文件,只能到.obj,一个源文件对应一个.obj。make是调用上述编译器批量编译生成.obj ,打包成exe 。 由于makefile 文件冗长,因此有了cmake 和qmake 等,使用简便,可以自动生成makefile
    window 可以使用cmake qmake, 一些IDE 如VS内置了其他的make 工具,也可以使用,具体我也不知道叫什么。
    VS提供了一套工具,从编译到 make,因此使用时极其方便。

    展开全文
  • 分辨不同编译器下不同数据类型的实际长度

    通常,在运用不同程序语言编写程序代码过程中,我们也许都将遇到数据类型长度确认的问题,有时也关系着程序结构或者算法思路解析的过程,稍有记忆模糊或者记忆出错都将导致代码调试与程序编译出错。因此,熟悉掌握与分辨出不同编译器下不同数据类型的实际长度十分重要。下面便是进一步说明。
    对于数据类型长度的掌握需分清两个方面的内容:
    一、程序编译器识别
    这里指的是代码源程序实际在运行过程中所用到的编译器,数据类型的实际长度由编译器在编译期间决定。因为在不同的平台下不同数据类型被分配的字节数是不同的,主要包括三个方面的含义,涉及:CPU、OS和Complier。
    CPU,即中央处理器,主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。它与内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。它包括包括运算逻辑部件、寄存器部件和控制部件等。主要实现处理指令、执行操作、控制时间、处理数据等功能,对数据长度的变化没有影响。
    OS,即操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。目前使用最多的是32位和64位的OS,但不同OS中也可装载不同的编译器(如64位OS中也可以装32位的OS或者编译器),因此,OS对数据类型的长度没有直接的影响。
    Complier,即编译器,是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。工作流程为:现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)。在编译过程中就会涉及到数据类型长度分配的问题。因此,16位、32位、64位编译器会使得数据类型的长度发生改变。

    二、不同编译器下的数据类型长度

    32位编译器:(Visual Studio C++)
    sizeof(char) = 1
    sizeof(short) = 2
    sizeof(float) = 4
    sizeof(double) = 8
    sizeof(int) = 4
    sizeof(long) = 4
    sizeof(long long) = 8
    sizeof(void *) = 4 (表示指针类型数据长度)

    64位编译器:
    sizeof(char) = 1
    sizeof(short) = 2
    sizeof(float) = 4
    sizeof(double) = 8
    sizeof(int) = 4
    sizeof(long) = 8
    sizeof(long long) = 8
    sizeof(void *) = 8

    16位编译器:(Turbo C/Turbo C++)
    sizeof(char) = 1
    sizeof(short) = 2
    sizeof(float) = 4
    sizeof(double) = 8
    sizeof(int) = 2
    sizeof(long) = 4
    sizeof(long double) = 16
    sizeof(void *) = 4

    展开全文
  • 不同编译器下基本数据长度

    千次阅读 2007-12-13 22:47:00
    KEIL uVision2 C51编译器所支持的数据类型 表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和doubl

    KEIL uVision2 C51编译器所支持的数据类型

    表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:

    数据类型

     

    长 度

     

    值 域

     

    unsigned char

     

    单字节

     

    0~255

     

    signed char

     

    单字节

     

    -128~+127

     

    unsigned int

     

    双字节

     

    0~65535

     

    signed int

     

    双字节

     

    -32768~+32767

     

    unsigned long

     

    四字节

     

    0~4294967295

     

    signed long

     

    四字节

     

    -2147483648~+2147483647

     

    float

     

    四字节

     

    ±1.175494E-38~±3.402823E+38

     

    *

     

    1~3字节

     

    对象的地址

     

    bit

     

     

    0或1

     

    sfr

     

    单字节

     

    0~255

     

    sfr16

     

    双字节

     

    0~65535

     

    sbit

     

     

    0或1

     

    TorboC编译器的数据长度说明:

    整型变量

      整型变量可分为以下几类:

      1.基本型

      类型说明符为int,在内存中占2个字节,其取值为基本整常数。

      2.短整量

      类型说明符为short int或short'C110F1。所占字节和取值范围均与基本型相同。

      3.长整型

      类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。

      4.无符号型

      类型说明符为unsigned。

      无符号型又可与上述三种类型匹配而构成:

      (1)无符号基本型 类型说明符为unsigned int或unsigned。

      (2)无符号短整型 类型说明符为unsigned short

      (3)无符号长整型 类型说明符为unsigned long

      各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。

    类型说明符    数的范围     分配字节数
    int       -32768~32767     ■■
    short int    -32768~32767     ■■
    signed int    -32768~32767     ■■
    unsigned int   0~65535        ■■
    long int  -2147483648~2147483647  ■■■■
    unsigned long  0~4294967295     ■■■■                           

    在ARM系统应用的数据类型如下 不同编译器可能有所不同

    ARM编译器支持的数据类型

    ************************************************************
    数据类型 长度(位) 对齐特性
    Char 8 1(字节对齐)
    short 16 2(百字对齐)
    Int 32 4(字对齐)
    Long 32 4(字对齐)
    Longlong 64 4(字对齐)
    Float 32 4(字对齐)
    Double 64 4(字对齐)
    Long double 64 4(字对齐)
    All pointers 32 4(字对齐)
    Bool(C++ only) 32 4(字对齐)

    1.整数类型
    ARM体系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big endian模式下,其低32位保存在高地址的字单元中,高32为保存在低地址的字单元中。对于整型数据的操作遵守下面的规则:
    **所有带符号的整型书的运算是按照二进制的补码进行的。
    **带符号的整型数的运算不进行符号的扩展。
    **带符号的整型数的右移操作是算数移位。
    **制定的移位位数的数是8位的无符号数。
    **进行移位操作的数被作为32位数。
    **超过31位的逻辑左移的结果为0。
    **对于无符号数和有符号的正数来说,超过32位的右移操作结果为0;对于有符号的负数来说,超过32位的右移操作结果为-1。
    **整数除法运算的余数和除数有相同的符号。
    **当把一个整数截断成位数更短的整数类型的数时,并不能保证所得到的结果的最高位的符号位的正确性。
    **整型数据之间的类型转换不会产生异常中断。
    **整型数据的溢出不会产生异常中断。
    **整型数据除以0将会产生异常中断。
    2.浮点数
    ARM体系中,浮点数是按照IEEE标准存储的。
    **float类型的数是按照IEEE的单精度数表示的。
    **double和long double 是用IEEE的双精度数表示的。
    对于浮点数的操作遵守下面的规则:
    **遵守正常的IEEE754规则。
    **当默认情况下禁止浮点数运算异常中断。
    **当发生卷绕时,用最接近的数据来表示。
    3.指针类型的数据
    下面的规则适用于处数据成员指针以外的其他指针:
    **NULL被定义为0。
    **相邻的两个存储单元地址相差一。
    **在指向函数的指针和指向数据的指针进行数据转换时,编译器将会产生警告信息。
    **类型size_t被定义为unsigned int.
    **类型ptrdiff_t被定义为signed int。
    **两个指针类型的数据相减时,结果可以按照下面的公式得到。
    ((int)a-(int)b)/(int)sizeof(type pointed to)
    这时,只要指针所指的对象不是pack的,其对齐特性能够满足整除的要求。
    ARM基础知识
    *****************************************************

    ARM编译器中预定义的宏

    *****************************************************
    ARM编译器预定义了一些宏,这些预定义宏对应一定的数值,有些预定义宏没有对应数值,见下表:

    _arm _ 使用编译器armcc,tcc,armcpp,tcpp时

    _ARMCC_VERSION Ver 代表编译器版本号,其格式为:
    PVtbbb,其中:
    P为产品编号(1代表ADS)
    V为副版本号(1代表1.1)
    T为补丁版本号(0代表1.1)
    bbb为build号(比如650)

    _APCS_INTERWORK _ 使用编译选项-apcs/interwork时

    _APCS_ROPI _ 使用编译选项apcs/ropi时

    _RWPI _ 使用编译选项-apcs/rwpi时

    _APCS_SWST _ 使用编译选项-apcs/swst时

    _BIG_ENDIAN _ 编译器针对目标系统使用big-endian内存模式时

    _cplusplus _ 编译器工作与C++模式时

    _CC_ARM _ 返回编译器的名称

    _DATE_ date 编译源文件的日期

    _embedded_cplusplus 编译器工作于EC++模式时

    _FEATURE_SINGED_CHAE 使用编译设置选项-zc时设置该预定义宏

    _FILE_ name 包含全路径的当前被编译的源文件名称

    _func_ name 当前被编译的函数名称

    _LINE_ num 当前被编译的代码行号名称

    _MOUDLE_ mod 预定义宏_FILE_的文件名称部分

    _OPTIMISE_SPACE _ 使用编译选项-OSPACE时

    _OPTIMISE_TIME _ 使用编译选项-Otime时

    _pretty_func name unmangled的当前函数名称

    _sizeof_int 4 sizeof(int),在预处理表达式中可以使用

    _sizeof_long 4 sizeof(long),在预处理表达式中可以使用

    _sizeof_ptr 4 sizeof(void*)在预处理表达式中可以使用

    _SOFTFP _ 编译时使用浮点数

    _ _ 在各种编译器模式下

    _STDC_VERSION _ 标准的版本信息

    _STRICT_ANSI_ _ 使用编译选项-STRICT时

    _TARGET_ARCH_xx _ xx代表ARM体系编号

    _TARGET_CPU_xx _ xx代表CPU编号

    _TARGET_FEATURE_ 当ARM体系支持指令PLD,LDRD,STRD,MCRR,MRRC时
    DOUBLEWORD _ 设置该定义宏

    _TARGET_FEATURE_ 当系统中包含DSP乘法处理器时,设置该
    DSPMUL _ 预定义宏

    _TARGET_FEATURE_ 如果目标ARM体系支持半字访问以及有符号的字节数据
    HALFWORD _ ,设置该预定义宏

    _TARGET_FEATURE_ 如果目标ARM体系支持长乘法指令MULL和
    MULTIPLY _ MUAL,设置该预定义宏

    _TARGET_FEATURE_ 如果目标ARM体系支持THUMB指令
    THUMB _

    _TARGET_FPU_xx _ 表示FPU选项,可能取值如下所示:
    _TARGET_FPU_VFP
    _TARGET_FPU_FPA
    _TARGET_FPU_SOFTVFP
    _TARGET_FPU_SOFTVFP_VFP
    _TARGET_FPU_SOFTFPA
    _TARGET_FPU_NONE

    _thumb _ 编译器为tcc或tcpp时,设置该预定义宏

    _TIME 源文件编译时间 

    展开全文
  • 操作系统,CPU编译器,运行时库,系统调用。这是计算机科学中相对高大上的几个概念,许多科班出身的码农甚至也搞不清楚一个简单代码执行过程中,哪块是操作系统控制,哪块是编译器控制,CPU到底扮演了何种角色,...

    操作系统,CPU,编译器,运行时库,系统调用。这是计算机科学中相对高大上的几个概念,许多科班出身的码农甚至也搞不清楚一个简单代码执行过程中,哪块是操作系统控制,哪块是编译器控制,CPU到底扮演了何种角色,什么是运行时库。

    思考问题,我们首先要把握宏观,掌握好了大致情况,然后再对自己感兴趣的节点做深入分析。这是一种很实用的思考问题的方式,不会让你陷入“局部最优解”,更重要的是,它可以让你更深刻地理解问题的本质,遇到困难时不致迷茫。本文将梳理计算机科学中一些基本的概念,我们将沿着程序从出生到消亡的脉络,探讨CPU,探讨编译器,探讨操作系统和运行时库,以此来深入理解计算机系统。


    编译器


             编译器绝对是计算机科学中殿堂级的领域,能够写编译器的都是大牛中的大牛,笔者依稀记得自己本科做编译原理大作业的情境,那4张8K的纸愣是没有画出一个简单语言的语法状态转移图。今天,我们不谈编译器原理,只关注其作用。编译器是高级语言到机器语言的转换器。当你洋洋洒洒地写完一万行代码时,那些struct、if、while除了你和C编译器看得懂外,没人能看得懂了,机器也不例外。机器只能看懂01码,编译器就是负责把源代码翻译成01码的。Windows下.exe后缀的程序就是一串01码,linux下你的a.out也是01码,但是01码绝对不止这些,linux下的.o和windows下的.dll也都是01码,只不过这些01码不能直接执行,而是由a.out和.exe程序调用。

             这就是编译器了,其实你只要记住它是高级语言到机器语言的转换器即可,这种工作在现实生活中叫:翻译。有了编译器,你的思想就结晶为01码了。

             没有这么简单,我们还要再深入一层。都知道程序包括代码数据,对于代码其实我们能有个感官的认识,这主要因为大家基本都学过汇编语言,代码汇编的层面基本都转化为mov,jmp,add等指令了,相信许多人也写过类似代码,但是数据呢?编译器如何“编译”数据

             你该鄙视我了:数据这东西怎么能“编译”呢?是的,数据确实不是编译的,你可以说它被编译器“安置”在一个位置上,但是对于数据的理解绝对不止此。首先全局变量和局部变量有着重大的差别,还有就是那些看似简单但是充满着智慧的基本数据类型(int,short,double等),还有就是老生常谈的字符串    

     

    全局变量和局部变量


             最终的可执行文件以01码存储,这点已经确定。分析一个典型的可执行文件,以ELF文件(Linux下可执行文件)为例,发现最终的01码主要包括以下几个部分:静态数据区,代码区,字符串常量区等等。其中你的全局变量就是存放在ELF文件的静态数据区,代码就是存放在代码区,而像以如下方式声明的字符串“hello world1”则是存储在了字符串常量区:

                                                                                        char *str  ="hello world1";

             还有局部变量。记住,在可执行文件的01码当中,不会有局部变量的位置,这是因为局部变量是放到了程序的栈空间中。说到了栈,栈仅仅是在程序运行的时候才会有的概念,所以在编译器产生的01码中,不会有类似于“局部变量区”的分块。趁热打铁。以上我们解决了代码的安置、全局变量以及字符串的安置,那么局部变量是怎么安置的呢,它总不会无缘无故地就出现了吧。所谓的局部变量就是在函数内部定义的变量,比如以下函数:

                                                               
     int func{
        int a;
        char b[2];
    }

            其中,a和b都是局部变量,局部变量位于该函数的栈空间中。比如,当调用函数func时,程序的堆栈将会是如下的状态:


            由于栈是一个动态的结构,只有在程序执行的时候才会涉及,所以a和b变量肯定在是程序执行过程中产生的。所以已经不难理解了,每一个子函数汇编代码的初始部分肯定会有一个压栈的过程,上例中是压入1个int和2个char。子函数中的对a和b的引用都被关联到栈上的这块区域。所以,局部变量和全局变量有着本质的不同:全局变量在01码中就存在了,是静态的,而局部变量在01码中还仅仅是一些push变量,是动态的;全局变量将伴随整个程序执行过程,而局部变量生命期只是短短的子函数执行时间。


    基本数据类型


           几乎所有C语言教科书的入门章节都是基本数据类型,在这里我们不谈那些强数据类型与弱数据类型的差别了,来点干货。为什么要说数据类型?源于我自己的一个疑惑。学计算机这几年中,每当遇到数据类型的问题,我耳边总是充斥着各种各样的声音:数据类型和编译器相关,数据类型和操作系统相关,数据类型和CPU相关,数据类型和平台相关。数据类型到底和什么相关?

             不妨挨个来分析。首先数据类型肯定和CPU相关,比如32位和64位CPU的sizeof(char*)返回值就不一样,说明由于CPU的不同数据的类型有很大的不同。和编译器肯定也是相关的,数据类型不但包括该类型所占内存的大小,还包括对于该种类型所施加的操作(这个定义和C++中的类很像,除了数据还应该有函数)。在数据类型的转换操作中,不同编译器的行为很是不一样。比如unsigned char类型强转long类型,有些编译器就可能会把long多出来的3个byte分别赋值为0xFF,而有些编译器则会将这3个byte赋值为0x00。这样,同一个操作在不同的编译器上产生了不同的行为与结果,而这些行为都是对应程序静态的01码的,所以数据类型与编译器也是相关的。对于操作系统,由于它也仅仅是一个程序而已,是一个“政府程序”,本身构建于CPU之上,所以不能说数据类型与操作系统相关。

             好,分析到这里,我基本上是得出了一个结论,那就是数据类型是和CPU、编译器相关,这就是某些人所谈到的平台。至于操作系统,我们姑且把它当作一个和普通程序无异的程序吧,只不过它手里握有资源。

             说到这里,编译器就说完了。是的,编译器用来产生01码,产生的过程中用到了各种智慧!在这个阶段,程序还是躺在硬盘上的一个代码,静静地等待执行。

    展开全文
  • 64位CPU的计算机上安装64位系统。   16位编译器 32位编译器(VS中设置为x86:即32位OS) 64位编译器(VS中设置为x64:即64位OS) char ...
  • 编译器CPU和操作系统的宏 编译器 GCC #ifdef __GNUC__ #if __GNUC__ >= 3 // GCC3.0以上 Visual C++ #ifdef _MSC_VER(非VC编译器很多地方也有定义) #if _MSC_VER >=1000 // VC++4.0以上 #if _MSC_...
  • 既然不同cpu指令集系统都要求适合自己的目标程序才能运算识别,为什么我们安装的软件可以在各个不同cpu指令集的机器上运行,而不用区分指令集版本
  • Sun Studio ,AIX xlc,及gcc使用方法:简介: Sun Studio编译器支持sun公司出产的sparc处理器,及x86体系机构的处理器。目前最新版本为5.10,5.3以后的版本对C语言c89、c99标准都支持。可以通过-xc99指定编译器按...
  • linux下不同arm 编译器的异同

    千次阅读 2016-11-19 19:06:26
    在为ARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,  gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用  --with-newlib时,gcc编译器不使用Glibc...
  • 编译器相关

    2017-06-29 18:11:44
    同样,对于不同的平台(不同CPU,不同的操作系统),我们需要不同的代码生成部分,但是整个编译器的中间端可以在不同的源代码,不同的平台之间共享。 有一点需要注意的是,这里说的不同语言,是指像C/C++/Fortran/...
  • TVM是深度学习系统的编译器堆栈。 它旨在缩小以生产力为重点的深度学习框架与以性能和效率为重点的硬件后端之间的差距。 TVM与深度学习框架协同工作,为不同的后端提供端到端编译。
  • 开放深度学习编译器堆栈文档|贡献者|社区|发行说明Apache TVM 是用于深度学习系统的编译器堆栈。它旨在缩小以生产力为中心的深度学习框架与以性能和效率为中心的硬件后端之间的差距。TVM 与深度学习框架配合使用,为...
  • 前面四篇文章主要介绍了c++ memory order的概念和使用,在实际的lock free编程中,知道这些基本就够了,定好了memory order剩下的事情编译器cpu会给我们保证,但了解底层实现有助于加深理解,本篇文章就来介绍一下...
  • 打开深度学习编译器堆栈文档| 贡献者| 社区| 发行说明Apache TVM(正在孵化)是用于深度...TVM与深度学习框架一起使用,以提供对不同后端的端到端编译。 许可:copyright:提供者根据Apache-2.0许可获得许可。 贡献TVM
  • TVM是深度学习系统的编译器堆栈。 它旨在缩小以生产力为重点的深度学习框架与以性能和效率为重点的硬件后端之间的差距。 TVM与深度学习框架协同工作,为不同的后端提供端到端编译。 打开深度学习编译器堆栈文档 | ...
  • 编译器原理

    千次阅读 2020-06-29 10:35:40
    所以编译的过程则是将源代码转化成机器码的过程,也就是 cpu 可执行的二进制代码。 编译的过程大概可以分为三个阶段,这也正是当前主流的编译器架构,即:编译前端(frontEnd)、中间代码优化(optimizer)、编译后端...
  • 交叉编译器

    2012-04-11 08:42:47
    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是...
  • TVM与深度学习框架协同工作,以提供对不同后端的端到端编译。 执照 :copyright:贡献者根据许可获得许可。 贡献TVM TVM采用apache提交者模型,我们的目标是创建一个由社区维护和拥有的开源项目。 检阅 致谢 在构建...
  • 详解编译器编译原理

    2021-01-01 08:22:41
    详解编译器编译原理 什么是gcc  什么是gcc:gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如...4)gcc是按模块化设计的,可以加入新语言和新CPU架构的支
  • 编译器、操作系统、CPU是三个几乎像无底洞一样大的方向,实现了“在自己写的CPU上运行自己写的操作系统,以及自己实现的编译器生成的程序”究竟有多厉害,知乎用户霍华德言简意赅地评价道: 差不多等于下面这四本书...
  • 一、cpu指令集 cpu是什么? cpu就是cpu芯片,也叫处理器。是机算机真正的运行实体。 cpu指令集是什么? cpu指令集就是cpu指令的集合,cpu指令集的数量也很多,如常见的x86指令集和arm指令集,还有一些小众的指令集如...
  • 疑问一、 How to list compiler predefined macros?...参考这篇文章,里面相近介绍了如何利用宏定义实现跨操作系统代码,包含各个编译器下在不同操作系统下针对操作系统而包含的预处理宏定义: ...
  • 编译器优化

    2011-09-15 19:32:25
    编译器优化 ...一直想给大家介绍一些编译器优化方面的知识,只是又觉得这方面知识内容太多了,介绍起来太花费时间了,实在没有精力去逐一介绍,并且很多编译器方面术语我都不知道中文该如何翻译(国内
  • 编译器介绍

    千次阅读 2018-03-14 11:41:50
    源文件经过编译器编译后才可生成二进制文件,编译过程包括预处理、编译、汇编和链接,日常交流中常用“编译”称呼此四个过程。编译器是一系列工具的集合,如arm平台使用的交叉编译器arm-linux-gcc包括arm-linux-cpp...
  • Linux/macOSCPU/GPU,地址:... macOS CPU/GPU,地址:https://tensorflow.google.cn/install/source Windows CPU/GPU,地址:https://tensorflow.google.cn/install/source_w...
  • 标准C语言编译器

    千次阅读 2018-09-03 13:45:51
    CC 转自CC和GCC编译器  从名字上看,老的unix系统的CC程式叫做C Compiler。但GCC这个名字按GNU的说法叫做Gnu ...所以他们是不相同的,一个是个古老的C编译器,一个是编译器的Gnu的编译器的集合(Gcc里的C编译器...
  • 走进Golang之编译器原理

    千次阅读 2019-11-14 09:49:16
    为了学好Golang底层知识装逼,折腾了一下编译器相关知识。下面的内容并不会提升你的生产技能点,但可以提高你的装逼指数。请按需进入! 本文目录速览: 认识 go build 编译器原理 词法分析 语法分析 语义分析 ...
  • Javac编译器详解

    千次阅读 2016-08-31 13:38:27
    前端编译器:把*.java文件转变成*.class文件  后端运行期编译器(JIT编译器,Just In Time Compiler):把字节码转成机器码  静态提前编译器(AOT编译器,Ahead Of Time Compiler):把*.java编译成本地机器码 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 153,093
精华内容 61,237
关键字:

不同的cpu需要不同的编译器