精华内容
下载资源
问答
  • 动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。  编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧...
  • 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种编程语言的可执行程序. 现代软件对于编译器的需求远甚从前, 究其原因很简单: 作为中间层, 编译器是构建更高层抽象的基础设施. 编译器意欲将人类可阅读的...
  • 早前看到过一句话 "Visual Studio 2010的界面使用WPF开发的“ ...WPF本身就是Visual Studio 中提供的一种开发项目模板,怎么Visual Studio 的界面用它开发的?现有的Visual Studio 还是先有的WPF?

    早前看到过一句话 "Visual Studio 2010的界面是使用WPF开发的“

    后来又看到”C语言的编译器,通常使用C语言或C++语言开发“


    咋看上去,有点”自己生自己“的意思 和”鸡生蛋,蛋生鸡“的迷惑。

    WPF本身就是Visual Studio 中提供的一种开发项目模板,怎么Visual Studio 的界面是用它开发的?是现有的Visual Studio 还是先有的WPF?

     C语言编译器就是用来编译C语言的,如果C语言编译器也是C开发的,那么是先有C还是先有C编译器?没有C哪来的C编译器?没有C编译器又怎么去编译C?好绕人也!


    仔细想了想,理了理思路,总算是想到了一个能让自己满意的解答。其实”C语言编译器是用C语言开发“这句话的正确理解应该是这样的一个过程:

    1. 首先使用汇编语言编写出一个C语言编译器 I.exe(也就是早起的C编译器);

    2. 有了 I.exe 之后,就可以用 I.exe 来编写C代码,得到一个程序 II.exe 

    3. II.exe的功能就可以是读取文本(即C语言源代码),根据文本的生成相应的汇编代码。

    4. 这里的 II.exe 其实就是”用C语言开发的C语言编译器



    展开全文
  • AMPC是一种可产生Java Bytecode的C语言编译器,相应的可执行文件可在任意Java虚拟机(JVM)上运行。AMPC包括一个图形用户接口,可用作集成开发环境,能加速软件开发。 AMPC便于程序员使用C语言开发新程序,可在JVM上...
  • 英文出处:Wilfred Hughes:Baby Steps to a C Compiler动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。编译器通常被看作是十分复杂的工程。事实上,编写一个产品...

    英文出处:Wilfred Hughes:Baby Steps to a C Compiler


    动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。

    编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。

    秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去。这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提到的办法。不过这个办法确实可行。你只需要按照这篇论文中的第一步来操作,就可以得到一个真正可用的编译器!当然,它只能编译程序语言中的非常小的子集,但是它确实是一个真实可用的编译器。你可以随意的扩展这个编译器,然后从中学到更多更深的知识。

    受到这篇文章的鼓舞,我就写了一个C编译器。从某种意义上来说这比写一个scheme的编译器要困难一些(因为你必须去解析C那复杂的语法),但是在某些方面又很便利(你不需要去处理运行时类型)。要写这样一个编译器,你只需要从你那个可用的最小的编译器开始。

    对于我写的编译器来说,我把它叫 babyc,我选了这段代码来作为我需要运行的第一个程序:

    int main() {
        return 2;
    }
    没有变量,没有函数调用,没有额外的依赖,甚至连if语句,循环语句都没有,一切看起来是那么简单。

    我们首先需要解析这段代码。我们将使用 Flex 和 Bison 来做到这点。这里有怎么用的例子可以参考,幸好我们的语法是如此简单,下面就是词法分析器:

    "{" { return '{'; }
    "}" { return '}'; }
    "(" { return '('; }
    ")" { return ')'; }
    ";" { return ';'; }
    [0-9]+ { return NUMBER; }
    "return" { return RETURN; }
    "int" { return TYPE; }
    "main" { return IDENTIFIER; }
    这里是语法分析器:

    function:
    	TYPE IDENTIFIER '(' ')' '{' expression '}'
    	;
        
    expression:
    	RETURN NUMBER ';'
    	;
    最终,我们需要生成一些汇编代码。我们将使用32位的X86汇编,因为它非常的通用而且可以很容易的运行在你的机器上。这里有X86汇编的相关网站

    下面就是我们需要生成的汇编代码:

    .text
            .global _start # Tell the loader we want to start at _start.
    
    _start:
            movl    $2,%ebx # The argument to our system call.
            movl    $1,%eax # The system call number of sys_exit is 1.
            int     $0x80 # Send an interrupt
    然后加上上面的词法语法分析代码,把这段汇编代码写进一个文件里。恭喜你!你已经是一个编译器的编写者了!

    Babyc 就是这样诞生的,你可以在这里看到它最开始的样子

    当然,如果汇编代码没办法运行也是枉然。让我们来用编译器生成我们所希望的真正的汇编代码。

    # Here's the file we want to compile.
    $ cat return_two.c
    #include <stdio.h>
    
    int main() {
        return 2;
    }
    
    # Run the compiler with this file.
    $ ./babyc return_two.c
    Written out.s.
    
    # Check the output looks sensible.
    $ cat out.s
    .text
        .global _start
    
    _start:
        movl    $2, %ebx
        movl    $1, %eax
        int     $0x80
    非常棒!接着让我们来真正的运行一下编译之后代码来确保它能得到我们所想的结果。

    # Assemble the file. We explicitly assemble as 32-bit
    # to avoid confusion on x86_64 machines.
    $ as out.s -o out.o --32
    
    # Link the file, again specifying 32-bit.
    $ ld -m elf_i386 -s -o out out.o
    
    # Run it!
    $ ./out
    
    # What was the return code?
    $ echo $?
    2 # Woohoo!
    我们踏出了第一步,接下去怎么做就全看你了。你可以按照那篇文章所指导的全部做一遍,然后制作一个更加复杂的编译器。你需要去写一个更加精巧的语法树来生成汇编代码。接下去的几步分别是:(1)允许返回任意的值(比如,return 3; 一些可执行代码);(2)添加对“非”的支持(比如,return ~1; 一些可执行代码)。每一个额外的特性都可以教你关于C语言的更多知识,编译器到底是怎么执行的,以及世界上其他编写编译器的人是如何想的。

    这是构建 babyc 的方法。Babyc 现在已经拥有了if语句,循环,变量以及最基础的数据结构。欢迎你来check out它的代码,但是我希望看完我的文章你能够自己动手写一个。

    不要害怕底层的一些事情。这是一个非常奇妙的世界。



    关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.


    展开全文
  • 什么是编译器:  CPU只认识几百个二进制形式的指令,C语言对CPU而言简直就是天书。C语言是用固定的词汇与格式组织起来,简单直观,程序员容易识别和...编译器有很多,不同平台下有不同类型的编译器。  Windows...

    什么是编译器

      CPU只认识几百个二进制形式的指令,C语言对CPU而言简直就是天书。C语言是用固定的词汇与格式组织起来,简单直观,程序员容易识别和理解。

      这时候就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,就是可执行的程序.exe。

      这个工具是特殊的软件,叫做编译器(Compiler)。

     

    编译器有很多种,不同平台下有不同类型的编译器。  

    Windows 下常用的是微软开发的 cl.exe,它被集成在 Visual Studio 或 Visual C++ 中,一般不单独使用;

    Linux 下常用的是 GUN 组织开发的 GCC,很多 Linux 发行版都自带 GCC;

    Mac 下常用的是 LLVM/Clang(以前是 GCC,后来由于 GCC 的不配合才改为 LLVM/Clang)。
    你的代码语法正确与否,编译器说了才算,我们学习C语言,从某种意义上说就是学习如何使用编译器,让编译器生成可执行程序(例如 Windows 下的 .exe 程序)。

    编译器可以100%保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,便于你的更改。

     

    编译器会遵循C语言的标准(语法规则);

    C语言的标准有很多版本:C90、C99、C11等;

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    选择合适的IDE

      IDE(Integrated Development Environment)集成开发环境;

      实际开发中,除了编译器是必须的工具,我们往往还需要很多其他辅助软件,例如编辑器调试器文件管理等,这些工具通常被打包在一起,统一发布和安装。

     

    Windows下使用

    Visual C++ 6.0  : 一款很古老的微软开发的IDE,历史太久远很多平台已经不支持了。

    Visual Studio(简称VS):是Visual C++ 6.0的升级版,也是实际开发中会用到的工具,缺点就是太大了,安装不方便。

    Dev C++:免费开源的C/C++ IDE,小巧安装卸载方便,学习成本低,缺点是调试能力弱。

    Linux下使用:GCC

    Mac OS X 下使用: Xcode

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    参考链接

    C语言编译器和IDE的选择:https://blog.csdn.net/moyouyou123/article/details/81142334

    转载于:https://www.cnblogs.com/grooovvve/p/9810321.html

    展开全文
  • 动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。 编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧...

    【转载】此文是转载,方便以后读与学习。

    原文链接:http://blog.jobbole.com/77305/

    动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。

    编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。

    秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去。这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提到的办法。不过这个办法确实可行。你只需要按照这篇论文中的第一步来操作,就可以得到一个真正可用的编译器!当然,它只能编译程序语言中的非常小的子集,但是它确实是一个真实可用的编译器。你可以随意的扩展这个编译器,然后从中学到更多更深的知识。

    受到这篇文章的鼓舞,我就写了一个C编译器。从某种意义上来说这比写一个scheme的编译器要困难一些(因为你必须去解析C那复杂的语法),但是在某些方面又很便利(你不需要去处理运行时类型)。要写这样一个编译器,你只需要从你那个可用的最小的编译器开始。

    对于我写的编译器来说,我把它叫 babyc,我选了这段代码来作为我需要运行的第一个程序:

    没有变量,没有函数调用,没有额外的依赖,甚至连if语句,循环语句都没有,一切看起来是那么简单。

    我们首先需要解析这段代码。我们将使用 Flex 和 Bison 来做到这点。这里有怎么用的例子可以参考,幸好我们的语法是如此简单,下面就是词法分析器:

    最终,我们需要生成一些汇编代码。我们将使用32位的X86汇编,因为它非常的通用而且可以很容易的运行在你的机器上。这里有X86汇编的相关网站

    下面就是我们需要生成的汇编代码:

    然后加上上面的词法语法分析代码,把这段汇编代码写进一个文件里。恭喜你!你已经是一个编译器的编写者了!

    Babyc 就是这样诞生的,你可以在这里看到它最开始的样子

    当然,如果汇编代码没办法运行也是枉然。让我们来用编译器生成我们所希望的真正的汇编代码。

    # Here's the file we want to compile.
    $ cat return_two.c
    #include <stdio.h>
     
    int main() {
        return 2;
    }
     
    # Run the compiler with this file.
    $ ./babyc return_two.c
    Written out.s.
     
    # Check the output looks sensible.
    $ cat out.s
    .text
        .global _start
     
    _start:
        movl    $2, %ebx
        movl    $1, %eax
        int     $0x80

     

    非常棒!接着让我们来真正的运行一下编译之后代码来确保它能得到我们所想的结果。

    我们踏出了第一步,接下去怎么做就全看你了。你可以按照那篇文章所指导的全部做一遍,然后制作一个更加复杂的编译器。你需要去写一个更加精巧的语法树来生成汇编代码。接下去的几步分别是:(1)允许返回任意的值(比如,return 3; 一些可执行代码);(2)添加对“非”的支持(比如,return ~1; 一些可执行代码)。每一个额外的特性都可以教你关于C语言的更多知识,编译器到底是怎么执行的,以及世界上其他编写编译器的人是如何想的。

    这是构建 babyc 的方法。Babyc 现在已经拥有了if语句,循环,变量以及最基础的数据结构。欢迎你来check out它的代码,但是我希望看完我的文章你能够自己动手写一个。

    不要害怕底层的一些事情。这是一个非常奇妙的世界。

    转载于:https://www.cnblogs.com/gamel/p/7048947.html

    展开全文
  • 动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。 编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧...
  • 编程语言有很多,主要分为三大类,分别机器语言、汇编语言、高级语言。计算机只能理解识别二进制代码,也就是...C语言可以这样比喻,一门非常强大的内功心法,学会它可以做到法通万法。这也它至今不衰的原...
  • 我现在用的编译器是vc++ 6.0在win7上会出现兼容问题,但可以忽略。我下半期准备换电脑按装win8系统,你知道有哪编译器适合win8系统的吗?我不是计算机有关专业的学生,都是在在自学。初次接触c语言,从书上看到的...
  •  Linux 系统中最重要的软件开发工具 gcc,在 Linux 系统中,c89、cc 和 gcc 这些命令基本上都指向系统的C语言编译器,通常GNU C编译器,或都简称 gcc。在 UNIX 系统中,C 语言编译器称为 cc。实际上,gcc 能够...
  • C 语言编译器的设计和实现 LOGO 目录 1 背景及意义 2 3 ...高级程序设计语言而编译技术室计算机语言发 展的支柱也计算机科学中发展最迅速最成熟 的个分支他集中体现了计算机发展的成果与精 华 其核心思想就是把同
  • C语言的集成开发环境有很多,尤其 Windows 下,多如牛毛,初学者往往不知道该如何选择,本节我们就针对 Windows、Linux和 Mac OS 三大平台进行讲解。 Windows 下如何选择 IDE? Windows 下的 IDE 多如牛毛,...
  • 程序由statement组成的,其实我们要的就是一种判断Staement开始和结束的方式: 如果能判断开始和结束,以及Expression开始和结束。也许应该这样设计语言 ,   BEGIN:IFSTATEMENT BEGIN:EXPRESSION
  • 简介继上节8说到利用手动构建的语法树解析下面的c语言代码: a = 1 ... print(sum)而一个编译器不应该依赖用户去手动构建对应语言的语法树,我们需要的是一种支持自动构建语法树的策略。本节将要说明的就是如何利用
  • Matlab本身不带c语言编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种。 如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。。需要注意的,较低...
  • 它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。如果源语言是像FORTRAN,PASCAL,或C那样的高级语言,目标...
  • 静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件...这静态链接库的个弊端。动态链接库有两加载方式:隐式加载和显示加载。隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存。隐...
  • C语言的集成开发环境有很多,尤其 Windows 下,多如牛毛,初学者往往不知道该如何选择,本节我们就针对 Windows、Linux和 Mac OS 三大平台进行讲解。Windows 下如何选择 IDE?Windows 下的 IDE 多如牛毛,常见的...
  • 1) 源文件(Source File) 在开发软件的过程中,我们需要将编写好的代码(Code)保存到个文件中,这样代码才不会丢失,才能够被编译器找到,才能最终变成可执行文件。...C语言源文件的后缀.c; C+...
  • csp练题记录(C语言编译器dev c++)201812-1小明上学 文章目录、题目描述二、思路分析三、代码四、反思总结 、题目描述 二、思路分析 由于道题,没啥难度,关键在于阅读理解,感觉题目叙述的有点绕...
  • C语言是一种面向过程的语言,面向过程是指,将实现一个逻辑功能的代码集中到一起,每次需要使用的时候,再调用这些代码集合,这种代码集合就是函数。写C语言其实就是写一个个函数,因此对函数实现的语法解析是C语言...
  • 第一部分: 引言 编译器是计算机不可或缺的一部分,因为有了编译器,计算机才能读懂人类...该Simpletron含有一个累加器(一种特殊的寄存器),在进行算术运算时,运算结果都存在累加器中。在simpletron中所有的信息都是按
  • 注释对程序的某个功能或者某行代码的解释说明,它只在C语言源文件中有效,在编译时会被编译器忽略。C语言中的注释有两类型,具体如下。1、单行注释单行注释通常用于对程序中的某行代码进行解释,用“∥”符号...

空空如也

空空如也

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

c语言编译器是一种

c语言 订阅