西西河

主题:【原创】语言编译器等请教 -- 中国农民

共:💬62 🌺30 新:
分页树展主题 · 全看首页 上页
/ 5
下页 末页
  • 家园 【原创】语言编译器等请教

    高级语言编完程后需要编译器等工具把变成机器语言,才能由CPU执行,比如JAVA语言编完程后需要JAVA Editor将起转换成机器语言。这个编译器是由什么语言做出来的?怎么做?能否请方家尽可能详细地介绍一下?多谢了。

    • 家园 任何语言都可以做编译器。

      编译器的功能就是把高级语言翻译成机器语言,机器语言就是01的组合,在计算机上就是控制电子元器件的高电平低电平,所以说计算机能识别机器语言,也只能识别这些。

      编译器就是一名翻译,不管你说阿拉伯语,英语,德语还是鸟语,翻译统统地翻译成汉语,这样不懂外语的中国人就听懂了。翻译不管是哪个国家的,会哪种语言的,只要懂汉语和这些外语就行了。所以说翻译器用什么语言来做都可以。

      负责的程序都是由简单的语法、语句构成,编译器只要把这些简单的语句对应成01序列就可以了。

    • 家园 假如由C做C++的编译器

      那么谁做C的编译器呢?C本身也需要编译成汇编语言的吧?效率呢?

      • 家园 IMHO

        Sorry first since I cannot input Chinese in my office machine:( It's something like when you install GCC on your linux box (like 3 ~ 5 years ago), you have to install a bootstrap gcc first, then use that to compile your real gcc compiler (or the latest gcc compiler). And then after that, you can compile your C/C++ program using the "real" gcc compiler.

        So at the beginning, there is only machine code, then the assembly language (you can use assembler to generate machine code). The first assembler had to be programmed using machine code. But after that, programmers can create better assemblers using the very first assembler. Then it comes to the so called "advanced programming language" era, some guys used the assembler (along with some machine code when necessary) to create a first compiler for an advanced programming language. After the first compiler works, programmers then could use that first compiler to create a better compiler. Just like now you can use yacc/lex to create a compiler/interpreter for some of your own languages:)

        Just like the "Tao".....:D

        • IMHO
          家园 能否再详细点?

          C的编译器是什么语言?汇编吗?汇编和机器码老农是懂的,学微机原理的时候学过的。

          • 家园 不好意思最近比较忙,没有下河

            简单的说,C的编译器也可以是用C来写的啊。当然了,第一个C的编译器(最最最最。。。。最原始的一个当然是用汇编来搞了,原因呢?很简单,还没有东西可以编译C的程序啊)有了第一个C的编译器之后,就没有必要(注意,是没有必要,而不是不能)再继续完全使用汇编了。

            这个过程就有点儿想工业革命似的--工业革命之前,人类要手工制作机器;工业革命之后,人类可以用机器自动制造机器。没有原始的C编译器之前,汇编语言和机器语言是程序员仅有的选择。当第一个C的编译器出来之后,程序员就可以写C程序了,就可以用C语言来写编译器了。再后来,更高级的语言出来了,就像小孩子搭积木一样,程序员可以用最基本的东西搭出非常复杂的东西;比如说用C来写一个C++的编译器。

            国内中科大有一个教材《编译原理》就是介绍编译器的基本原理和理论基础的。我们学这门课的时候的课程项目就是如何实现一个类PL/1(一种很想Pascal)语言的编译器和执行器。

            再多嘴说两句,编译其实就是一个翻译的过程,比如说:a = 0; a = a +1; 翻译成汇编大概就是这个样子:byte a;set a 0; add a 1;(伪的不能再伪的伪汇编)。编译器的职责就是读一个高级语言程序的文本,然后将它翻译成相应的汇编或机器代码。想通了这一点,剩下的就是需要一些编译原理里面如何做词法分析,语法分析之类的东西了。这些都是有标准算法的,看看相应的教材应该会有帮助:)

            • 家园 你的伪代码

              byte a;set a 0; add a 1;(伪的不能再伪的伪汇编)。
              好像也不太伪吧?

              机器语言最初又是谁制造出来的呢?

              • 家园 You can google the inventor, but

                哈哈,这个可就说来话长了。最早的能称的上是计算设备的东西不外乎用手摇,打了孔的卡片,机械开关之类的东西来告诉计算机(或者说计算设备)0和1的信息。比如说,我们可以约定打了孔是1,不打孔是0。那么,我就可以用一个打了孔的纸带给这个计算设备输入一连串的0和1序列。这个代表着我的意图(比如说计算1+1)的0和1的序列就是一个最原始的机器语言的程序了。后来一点儿呢,大家觉得这种方式写程序太辛苦了,就开始想偷懒了(要不说懒人推动技术的进步呢)。就有人用这种0和1的序列来写一些工具来简化程序员的工作量 -- 就好象有了第一个C语言编译器之后,人们就不太会完全使用纯汇编或者是机器语言写东西了 -- 历史都是这样重复着自己阿;)

        • IMHO
          家园 Try this for inputing Chinese

          http://www.sevenforks.com/ime/notepad.html

          I use this link in my office to input Chinese, it runs perfect.

    • 家园 还可以想想cross-compilation

      这个问题想想挺好玩的,比如还可以想想,C语言写的java的编译器,java写的C的编译器等等。不过真的玩起来,发现前人已经把路都铺好了,就变的十分无趣了。

      • 家园 那为什么不自己创造一门语言呢?

        按照您的说法,做什么行业都是很无趣的?

        • 家园 创造一种编程语言没那么容易

          你要是想做个面向对象的语言,你不会比java,c++做的更好,你如果想做个不仅面向对象,而且还支持动态特性的语言不会比python,ruby更好,就算你做个汇编语言,也还是得支持现有的体系架构,那就不会比这些体系下原生的汇编语言更好。

          唯一有点意思的可能是做个针对某个应用的脚本语言,那用yacc和lex也就够了。

          • 家园 其实这些我也知道,但是如果都这样,那做什么意思才有意思呢?

            这是一个严峻的话题。

            • 家园 有意思的多了

              不一定就要创造一种语言。一方面现在研究主要都不是针对基本的程序开发,而是搞框架和模型,用来对付大型和复杂的应用;另一方面也是现有计算机理论的缺陷造成语言本身的有限的表达能力。编程语言在过去30年已经发明了很多,说有100种那也是我保守了。但这100多种说到底也就是一种,只要理论没有突破就不会有真正意义上的新语言。

              • 家园 理论突破不是兴趣爱好者可以做的事情

                您说,我们这些人到底还能干些什么?

                此外,这100种语言并不是等于一种。知道图灵机吧,但是与图灵机等价的还有lambda-calcul,这就是ocaml语言的理论基础,其实很有意思,但是没有流行起来,但是微软下一代语言F#很大程度上就是参考了ocaml

分页树展主题 · 全看首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河