精华内容
下载资源
问答
  • 本节我们先从一个简易的可以识别四则运算和整数值的词法分析扫描器开始。它实现的功能也很简单,就是读取我们给定的文件,并识别出文件中的token将其输出。 这个简易的扫描器支持的词法元素只有五个: ...

    本节我们先从一个简易的可以识别四则运算和整数值的词法分析扫描器开始。它实现的功能也很简单,就是读取我们给定的文件,并识别出文件中的token将其输出。

    这个简易的扫描器支持的词法元素只有五个:

    四个基本的算术运算符:+、-、*、/
    十进制整数
    我们需要事先定义好每一个token,使用枚举类型来表示:

    //defs.h
    
    // Tokens
    enum {
      T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
    };
    

    在扫描到token后将其存储在一个如下的结构体中,当标记是 T_INTLIT(即整数文字)时,该intvalue 字段将保存我们扫描的整数值:

    //defs.h
    
    // Token structure
    struct token {
      int token;
      int intvalue;
    };
    

    我们现在假定有一个文件,其内部的的代码就是一个四则运算表达式:

    2 + 34 * 5 - 8 / 3
    我们要实现的是读取他的每一个有效字符并输出,就像这样:

    Token intlit, value 2
    Token +
    Token intlit, value 34
    Token *
    Token intlit, value 5
    Token -
    Token intlit, value 8
    Token /
    Token intlit, value 3
    

    我们看到了最终要实现的目标,让我们来一步步分析需要的功能。

    首先我们需要一个逐字符的读出文件中的内容并返回的函数。当我们在输入流中读的太远时,需要将读取到的字符放回(如上例当读到数字时,因无法直接获取数字是否结束,只能循环读取,当读到第一个非数字字符时则判定该十进制数读取结束,需将该十进制数返回并将读取的非数字字符放回),记录行号的的功能也是在这里实现。

    // Get the next character from the input file.
    static int next(void) {
      int c;
    
      if (Putback) {                // Use the character put
        c = Putback;                // back if there is one
        Putback = 0;
        return c;
      }
    
      c = fgetc(Infile);            // Read from input file
      if ('\n' == c)
        Line++;                     // Increment line count
      return c;
    }
    

    我们只需要有效字符,所以需要去除空白字符的功能

    // Skip past input that we don't need to deal with, 
    // i.e. whitespace, newlines. Return the first
    // character we do need to deal with.
    static int skip(void) {
      int c;
    
      c = next();
      while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
        c = next();
      }
      return (c);
    }
    

    当读到的是数字的时候,怎么确定数字有多少位呢?所以我们需要一个专门处理数字的函数。

    // Return the position of character c
    // in string s, or -1 if c not found
    static int chrpos(char *s, int c) {
      char *p;
    
      p = strchr(s, c);
      return (p ? p - s : -1);
    }
    
    
    // Scan and return an integer literal
    // value from the input file. Store
    // the value as a string in Text.
    static int scanint(int c) {
      int k, val = 0;
    
      // Convert each character into an int value
      while ((k = chrpos("0123456789", c)) >= 0) { 
        val = val * 10 + k;
        c = next();
      }
    
      // We hit a non-integer character, put it back.
      putback(c);
      return val;
    }
    

    所以现在我们可以在跳过空格的同时读取字符;如果我们读到一个字符太远,我们也可以放回一个字符。我们现在可以编写我们的第一个词法扫描器:

    int scan(struct token *t) {
      int c;
    
      // Skip whitespace
      c = skip();
    
      // Determine the token based on
      // the input character
      switch (c) {
      case EOF:
        return (0);
      case '+':
        t->token = T_PLUS;
        break;
      case '-':
        t->token = T_MINUS;
        break;
      case '*':
        t->token = T_STAR;
        break;
      case '/':
        t->token = T_SLASH;
        break;
      default:
    
        // If it's a digit, scan the
        // literal integer value in
        if (isdigit(c)) {
          t->intvalue = scanint(c);
          t->token = T_INTLIT;
          break;
        }
    
        printf("Unrecognised character %c on line %d\n", c, Line);
        exit(1);
      }
      // We found a token
      return (1);
    }
    

    现在我们可以读取token并将其返回。

    main() 函数打开一个文件,然后扫描它的令牌:
    
    void main(int argc, char *argv[]) {
      ...
      init();
      ...
      Infile = fopen(argv[1], "r");
      ...
      scanfile();
      exit(0);
    }
    

    并scanfile()在有新token时循环并打印出token的详细信息:

    // List of printable tokens
    char *tokstr[] = { "+", "-", "*", "/", "intlit" };
    
    // Loop scanning in all the tokens in the input file.
    // Print out details of each token found.
    static void scanfile() {
      struct token T;
    
      while (scan(&T)) {
        printf("Token %s", tokstr[T.token]);
        if (T.token == T_INTLIT)
          printf(", value %d", T.intvalue);
        printf("\n");
      }
    }
    
    展开全文
  • 解析器将识别的语言定义一个语法。我么这里采用BNF描述: expression: number | expression ‘*’ expression | expression ‘/’ expression | expression ‘+’ expression | expression ‘-’ expression ...

    解析器将识别的语言定义一个语法。我么这里采用BNF描述:

    expression: number
    | expression ‘*’ expression
    | expression ‘/’ expression
    | expression ‘+’ expression
    | expression ‘-’ expression
    ;

    number: T_INTLIT
    ;
    我们都知道BNF定义的语法是递归定义的,那么我们也需要一个递归函数去解析输入的表达式。在我们现有的语法元素可以构成的表达式中第一个语法元素始终为数字,否则就是语法错误。其后可能是一个运算符,或者只有一个数字。那么我们可以用如下伪代码表示我们的递归下降解析函数:

    function expression() {
    Scan and check the first token is a number. Error if it’s not
    Get the next token
    If we have reached the end of the input, return, i.e. base case

    Otherwise, call expression()
    }
    让我们来模拟一次此函数的运行,输入为2 + 3 - 5 T_EOF其中T_EOF 是反映输入结束的标记。

    expression0:
    Scan in the 2, it’s a number
    Get next token, +, which isn’t T_EOF
    Call expression()

    expression1:
      Scan in the 3, it's a number
      Get next token, -, which isn't T_EOF
      Call expression()
    
        expression2:
          Scan in the 5, it's a number
          Get next token, T_EOF, so return from expression2
    
      return from expression1
    

    return from expression0
    为了进行语义分析,我们需要代码来解释识别的输入,或者将其转换为另一种格式,例如汇编代码。在旅程的这一部分,我们将为输入构建一个解释器。但要实现这一目标,我们首先要将输入转换为抽象语法树。

    抽象语法树的节点结构定义如下:

    // defs.h
    // AST node types
    enum {
    A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
    };

    // Abstract Syntax Tree structure
    struct ASTnode {
    int op; // “Operation” to be performed on this tree
    struct ASTnode *left; // Left and right child trees
    struct ASTnode *right;
    int intvalue; // For A_INTLIT, the integer value
    };
    节点元素op表示该节点的类型,当op的值为A_ADD、A_SUBTRACT等运算符时,该节点具有左右两颗子树,我们将使用op代表的运算符对左右两棵子树的值做计算;当op的值为A_INTLIT时,代表该节点是整数值,是叶节点,节点元素intvalue存储着该整数的值。

    tree.c 中的代码具有构建 AST 的功能。函数mkastnode()生成一个节点并返回指向节点的指针:

    // tree.c
    // Build and return a generic AST node
    struct ASTnode *mkastnode(int op, struct ASTnode *left,
    struct ASTnode *right, int intvalue) {
    struct ASTnode *n;

    // Malloc a new ASTnode
    n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
    if (n == NULL) {
    fprintf(stderr, “Unable to malloc in mkastnode()\n”);
    exit(1);
    }
    // Copy in the field values and return it
    n->op = op;
    n->left = left;
    n->right = right;
    n->intvalue = intvalue;
    return (n);
    }
    我们对其进一步封装出两个常用的函数,分别用来创建左子树与叶节点:

    // Make an AST leaf node
    struct ASTnode *mkastleaf(int op, int intvalue) {
    return (mkastnode(op, NULL, NULL, intvalue));
    }

    // Make a unary AST node: only one child
    struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
    return (mkastnode(op, left, NULL, intvalue));
    我们将使用 AST 来存储我们识别的每个表达式,以便稍后我们可以递归遍历它来计算表达式的最终值。 我们确实想处理数学运算符的优先级。 这是一个例子。 考虑表达式 2 * 3 4 * 5。现在,乘法比加法具有更高的优先级。 因此,我们希望将乘法操作数绑定在一起并在进行加法之前执行这些操作。

    如果我们生成 AST 树看起来像这样:

          +
         / \
        /   \
       /     \
      *       *
     / \     / \
    2   3   4   5
    

    然后,在遍历树时,我们会先执行 2 * 3,然后是 4 * 5。一旦我们有了这些结果,我们就可以将它们传递给树的根来执行加法。

    在开始解析语法树之前,我们需要一个将扫描到的token转换为AST节点操作值的函数,如下:

    // expr.c
    // Convert a token into an AST operation.
    int arithop(int tok) {
    switch (tok) {
    case T_PLUS:
    return (A_ADD);
    case T_MINUS:
    return (A_SUBTRACT);
    case T_STAR:
    return (A_MULTIPLY);
    case T_SLASH:
    return (A_DIVIDE);
    default:
    fprintf(stderr, “unknown token in arithop() on line %d\n”, Line);
    exit(1);
    }
    }
    我们需要一个函数来检查下一个标记是否是整数文字,并构建一个 AST 节点来保存文字值。如下:

    // Parse a primary factor and return an
    // AST node representing it.
    static struct ASTnode *primary(void) {
    struct ASTnode *n;

    // For an INTLIT token, make a leaf AST node for it
    // and scan in the next token. Otherwise, a syntax error
    // for any other token type.
    switch (Token.token) {
    case T_INTLIT:
    n = mkastleaf(A_INTLIT, Token.intvalue);
    scan(&Token);
    return (n);
    default:
    fprintf(stderr, “syntax error on line %d\n”, Line);
    exit(1);
    }
    }
    这里的Token是一个全局变量,保存着扫描到的最新的值。

    那么我们现在可以写解析输入表达式生成AST的方法:

    // Return an AST tree whose root is a binary operator
    struct ASTnode *binexpr(void) {
    struct ASTnode *n, *left, *right;
    int nodetype;

    // Get the integer literal on the left.
    // Fetch the next token at the same time.
    left = primary();

    // If no tokens left, return just the left node
    if (Token.token == T_EOF)
    return (left);

    // Convert the token into a node type
    nodetype = arithop(Token.token);

    // Get the next token in
    scan(&Token);

    // Recursively get the right-hand tree
    right = binexpr();

    // Now build a tree with both sub-trees
    n = mkastnode(nodetype, left, right, 0);
    return (n);
    }
    这只是一个子简单的解析器,他的解析结果没有实现优先级的调整,解析结果如下:

     *
    / \
    

    2 +
    /
    3 *
    /
    4 5
    正确的树状结构应该是这样的:

          +
         / \
        /   \
       /     \
      *       *
     / \     / \
    2   3   4   5
    

    我们将在下一节实现生成一个正确的AST。

    那么接下来我们来试着写代码递归的解释这颗AST。我们以正确的语法树为例,伪代码:

    interpretTree:
    First, interpret the left-hand sub-tree and get its value
    Then, interpret the right-hand sub-tree and get its value
    Perform the operation in the node at the root of our tree
    on the two sub-tree values, and return this value
    调用过程可以用如下过程表示:

    interpretTree0(tree with +):
    Call interpretTree1(left tree with *):
    Call interpretTree2(tree with 2):
    No maths operation, just return 2
    Call interpretTree3(tree with 3):
    No maths operation, just return 3
    Perform 2 * 3, return 6

    Call interpretTree1(right tree with *):
    Call interpretTree2(tree with 4):
    No maths operation, just return 4
    Call interpretTree3(tree with 5):
    No maths operation, just return 5
    Perform 4 * 5, return 20

    Perform 6 + 20, return 26
    这是在interp.c 中并依据上述伪代码写的功能:

    // Given an AST, interpret the
    // operators in it and return
    // a final value.
    int interpretAST(struct ASTnode *n) {
    int leftval, rightval;

    // Get the left and right sub-tree values
    if (n->left)
    leftval = interpretAST(n->left);
    if (n->right)
    rightval = interpretAST(n->right);

    switch (n->op) {
    case A_ADD:
    return (leftval + rightval);
    case A_SUBTRACT:
    return (leftval - rightval);
    case A_MULTIPLY:
    return (leftval * rightval);
    case A_DIVIDE:
    return (leftval / rightval);
    case A_INTLIT:
    return (n->intvalue);
    default:
    fprintf(stderr, “Unknown AST operator %d\n”, n->op);
    exit(1);
    }
    }
    这里还有一些其他代码,比如调用 main() 中的解释器:

    scan(&Token); // Get the first token from the input
    n = binexpr(); // Parse the expression in the file
    printf("%d\n", interpretAST(n)); // Calculate the final result
    exit(0);
    USB Microphone https://www.soft-voice.com/
    Wooden Speakers https://www.zeshuiplatform.com/
    亚马逊测评 www.yisuping.cn
    深圳网站建设www.sz886.com

    展开全文
  • 义隆 C语言编译器

    2018-07-30 17:01:07
    义隆单片机c语言编译器,支持C语言开发,可转换为汇编代码。
  • C语言编译器的设计开发,pdf格式,欢迎下载!
  • 松翰单片机C语言编译器,用于开发松翰8位单片机软件的编译工具
  • 嵌入式C语言编译器

    2018-02-09 16:59:57
    上述两者的区别:GCC(GUN Compiler Colletion),是指GUN编译器集合包含众多语言得到编译器如C语言(gcc),C++(g++),Java语言(jdk)、D语言(gdc)、等gcc 则指的是单纯的C语言编译器当代的嵌入式开发已经和...

    1.嵌入式C语言编译器

    1.1 GCC与gcc

    上述两者的区别:
    GCC(GUN Compiler Colletion),是指GUN编译器集合包含众多语言得到编译器如C语言(gcc),C++(g++),Java语言(jdk)、D语言(gdc)、等
    gcc 则指的是单纯的C语言编译器
    当代的嵌入式开发已经和传统的嵌入式开发不同,硬件性能的提升使其越来越接近桌面开发,使用的开发语言也越来越多样,内核和驱动开发使用C语言,应用开发使用gcc/g++/gdc等。

    1.2交叉编译

    两种开发模式:
    A.非嵌入式开发:A(类)机编写(源代码)、编译得到可执行程序,发布给A(类)机运行。
    B.嵌入式开发 :A(类)机编写(源代码)、编译得到可执行程序,发布给B(类)机运行。
    为何使用交叉编译
    嵌入式产品由于资源受限,不能直接在嵌入式产品上进行编程,所以选择在PC主机上进行源码编写和编译,最终生成在嵌入式设备上运行的程序。
    交叉编译可以用高性能机器为低性能机器开发软件(包括裸机软件、系统级和应用级软件)
    交叉编译特点:
    必须使用专用的交叉编译工具链。由于可执行程序不能本地运行调试,因此必须配合一定手段(专用调试器、JTAG调试器、USB下载、串口下载、SD启动、网络共享等)将可执行程序加载到目标嵌入式设备上运行及调试。
    gcc如何进行交叉编译?
    配置目标主机的编译工具链(如arm-linux),配置工具链的具体版本。
    根据具体的目标代码选择相应的工具链版本
    正确使用关于硬件体系结构的特殊编译选项
    大型企业嵌入式开发环境:
    嵌入式C语言编译器

    1.3编译过程

    我们通常所将的编译器实际上是指广义的编译器,包含下面四个部分:
    嵌入式C语言编译器
    整个编译过程如下面所示:
    嵌入式C语言编译器
    预处理器完成:头文件原地展开、宏定义替换、注释删除工作。
    编译器(狭义上的):完成各种语言到目标平台的会变文件的翻译工作。
    汇编器:将平台回避那文件编译成最终的二进制文件(.O文件)
    链接器:将最终的二进制文件按照连接脚本的内容,链接称为最中的可执行文件Linux中为elf文件。
    整个过程:源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

    1.4多语言混合开发

    多语言混合开发时当×××发中常见的开发方式,优势在于节省人力成本,提高开发效率。
    方式一:目标平台汇编文件的统一
    嵌入式C语言编译器
    行业案例:
    嵌入式C语言编译器
    方式二:目标平台二进制文件的统一
    嵌入式C语言编译器
    行业案例:
    嵌入式C语言编译器
    方式三:利用进程间通信进行协同
    嵌入式C语言编译器
    行业案例:
    嵌入式C语言编译器

    1.5 gcc 编译选项

    预处理指令: gcc -E file.c -o file.i
    编译指令 : gcc -S file.i -o file.s
    汇编指令 : gcc -c file.s -o file.o

    生成映射文件: gcc test.c -Wl,-Map=test.map (注意逗号后面没有空格)
    宏定义:gcc test.c -D 'TEST="PENGCHAO"' gcc test.c -D TEST=110
    获取系统头文件路径; gcc -v file.c

    获取目标的完整依赖关系:gcc -M test.c
    获取目标的部分依赖关系:gcc -MM test.c

    制定库文件及库文件的搜索路径
    -L 指令库文件搜索路径
    -l 指定库文件名
    gcc test.c -L -lfunc

    静态库生成命令:ar -rc libfunc.a func.o
    动态库生成命令:gcc func.c -o func.o -c -fPIC
    gcc -o libfunc.so func.o -shared
    nm命令也很有用,它可以用来查看一个.a文件中都有哪些符号
    ldd命令:作用是可以在一个使用了共享库的程序执行之前解析出这个程序使用了哪些共享库,并且查看这些共享库是否能被找到,能被解析(决定这个程序是否能正确执行)。
    注意:动态链接库运行时需要被加载(运行时环境在执行test程序的时候发现他动态链接了libfunc.so,于是乎会去固定目录(/user/lib)尝试加载libfunc.so,如果加载失败则会打印:error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
    解决办法:
    A.将动态库文件拷贝到系统库文件目录(不推荐)
    B.将动态库文件所在目录导出到环境变量LD_LIBRARY_PATH,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path_name

    转载于:https://blog.51cto.com/11134889/2070716

    展开全文
  • C语言编译器网址

    2020-04-21 16:00:36
    很多人要学C语言,下面提供有关C语言编译器。 DEV-C++ Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW中的...

    很多人要学C语言,下面提供有关C语言编译器。

    • DEV-C++
    • Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW中的GCC编译器、GDB调试器和 AStyle格式整理器等众多自由软件。原开发公司 Bloodshed 在开发完 4.9.9.2 后停止开发,所以现在由 Orwell 公司继续更新开发,最新版本:5.11。
    • Dev-C++ 的下载地址
    • 其它版本:sourceforge.net(只保证第一个是正确的)
    • 适用版本Windows 7(我的电脑是这个,我用的编译器也是这个)
    • Microsoft Visual Studio
    • Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。
    • VS下载地址
    • Code::Blocks
    • Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境。 Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(3.x)版。对于追求完美的C++程序员,再也不必忍受Eclipse的缓慢。
    • 下载地址
    • VC++
      
    • VC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境。VC++6.0由许多组件组成,包括编译器、调试器以及程序向导APPwizard、类向导class wizard等开发工具。这些组建通过一个名为developerstudio的组件集成为和谐的开发环境。在VC++6.0企业版的基础上集成官方的SP6升级制作而成,免序列号,安装完即可使用。

    C-Free是一款集成开发环境(IDE),支持多种编译器的专业化C/C++,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序
    下载地址

    注:不保证下载的安全性,如有损失请作者概不负责!

    展开全文
  • C语言编译器

    2017-11-09 17:46:14
    现在我们用的开发工具,多是集成好的,即IDE。 常见的IDE有Microsoft Visual Studio,Dev-C++,C++Builder,Emacs + GCC,Eclipse+CDT。IDE环境,集编辑、编译、调试于一身,还有很多相应的拓展工具,这是为了开发...
  • C语言编译器源码

    2015-08-07 12:45:09
    C语言环境编译器源,C的源码程序,可以在C的开发环境编译C语言程序,谢谢下载
  • C语言编译器_5.0_41.apk

    2019-06-14 14:52:27
    开发的一款C语言编译器,可以编译简单的C语言程序,对于C语言初学者十分友好
  • 义隆单片机C语言编译器,方便单片机开发.各种义隆单机都实用.
  • Turbo C|C语言编译器

    2014-03-03 08:08:33
    著名C语言编译器,不管是入门,还是小软件的开发,这都是个不错的选择。
  • 后来又看到”C语言编译器,通常使用C语言或C++语言开发“ 咋看上去,有点”自己生自己“的意思 和”鸡生蛋,蛋生鸡“的迷惑。 WPF本身就是Visual Studio 中提供的一种开发项目模板,怎么Visual Studio 的...
  • Windows下C语言编译器的选择(开发环境的搭建)

    万次阅读 多人点赞 2019-03-18 10:48:56
    Windows下C语言编译器的选择(开发环境的搭建) 参考连接:http://c.biancheng.net/cpp/u/c18/ 所谓搭建开发环境,也就是安装编译器或者 IDE(集成开发环境)。Windows 下的C语言 IDE 众多,多如牛毛,初学者往往不...
  • PIC单片机开发专用C语言编译器:picc8.05编译器+注册机(完全版)(编译PIC16的C语言首先工具)+PIC C语言编译器PIC-CCS完全版.
  • 简洁轻便非常好用的C语言编译器codeblocks,附带汉化包汉化及语法高亮文件,仅有100多M,适合C语言入门及专业程序开发,开源免费无需安装几个g的收费的visual studio考虑兼容及破解一系列问题。
  • java开发C语言编译器

    2017-07-30 18:56:00
    http://study.163.com/course/introduction.htm?courseId=1003169025 http://study.163.com/course/courseMain.htm?courseId=1002830012 http://blog.csdn.net/tyler_download/article/category/6097178
  • 基本的c语言编译器的实现

    万次阅读 2017-05-24 22:46:28
    基本的c语言编译器的实现项目地址张东昌的zcc编译器实验目标设计并实现一款基本的c语言编译器。从词法分析开始,逐步完成c语言文法的设计,文法分析,语法制导翻译,生成中间代码并最终生成可运行的汇编代码。并且在...
  • 嵌入式开发c语言编译器When observing modern programming languages you can generally group them into one of two categories. Compiled or interpreted. 观察现代编程语言时,通常可以将它们分为两类之一。 编译...
  • 含有yacc lex文件和一个内含的h文件。可以进行简单的c语言编译
  • 在Windows平台如何选择C语言编译器?

    千次阅读 2020-03-20 17:57:38
    这个是因人而异的,Windows 下的C语言 IDE 众多,每个人开发习惯不同,所以用哪款的都有,不过本文是从大众角度出发对C语言编译器的选择做介绍。 Visual Studio 首推大家是Visual Studio, Visual Studio(简称 VS)是...
  • AMPC是一种可产生Java Bytecode的C语言编译器,相应的可执行文件可在任意Java虚拟机(JVM)上运行。AMPC包括一个图形用户接口,可用作集成开发环境,能加速软件开发。 AMPC便于程序员使用C语言开发新程序,可在JVM上...
  • 嵌入式C语言编译器:GCC

    千次阅读 2017-06-09 09:13:18
    1 GCC相关介绍GCC与gcc有什么不同? GCC(GNU Compiler ...gcc:特指GCC中的C语言编译器 GCC VS 嵌入式 多数嵌入式操作系统都基于GCC进行源码编译 Linux、VxWorks、Android、etc。 实际开发中的应用 内核开发:gcc
  • 较早的C语言编译器。DOS环境下运行。不能产生32位的程序。 安装:直接解包到c:\下,在DOS窗口中运行c:\turboc2下的tc.exe即可 /////////// devcpp-5.1.1.0_32bit_setup: WINDOWS下运行的C语言的集成开发环境,基于...
  • ARM C语言编译器

    2012-07-24 11:52:30
    mikroC PRO FOR ARM,一款强大的适用于ARM 器件开发编译器,包含直观的IDE,编译器等。
  • 无需自己实现,直接可以调用的函数,我们都称为库函数,或是API, 本节,我们要为当前构建的虚拟机提供C语言库函数,我们要给解释器提供一种函数调用机制,这些函数无需程序自己实现,而是由我们的解释器提供的,...
  • c语言编译器 TC 2.0

    2008-12-17 10:45:57
    用于C语言开发用于C语言开发用于C语言开发用于C语言开发用于C语言开发
  • 编译器C语言代码中对数组的相关操作编译成java字节码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,244
精华内容 1,297
关键字:

c语言编译器开发

c语言 订阅