主题:【原创】语言编译器等请教 -- 中国农民
The Tao gave birth to machine language. Machine language gave birth to the
assembler.
道生机器语言,机器语言生汇编嚣。
The assembler gave birth to the compiler. Now there are ten thousand
languages.
汇编器生编译器,最后产生上万种高级语言。
Each language has its purpose, however humble. Each language expresses the
Yin and Yang of software. Each language has its place within the Tao.
不论多么的微不足道,每种语言都有它自己的目的,每种语言都表达了软件的阴阳两极。
每种语言都各得其道。
But do not program in COBOL if you can avoid it.
但是尽量不要用COBOL语言。
这个问题想想挺好玩的,比如还可以想想,C语言写的java的编译器,java写的C的编译器等等。不过真的玩起来,发现前人已经把路都铺好了,就变的十分无趣了。
按照您的说法,做什么行业都是很无趣的?
你要是想做个面向对象的语言,你不会比java,c++做的更好,你如果想做个不仅面向对象,而且还支持动态特性的语言不会比python,ruby更好,就算你做个汇编语言,也还是得支持现有的体系架构,那就不会比这些体系下原生的汇编语言更好。
唯一有点意思的可能是做个针对某个应用的脚本语言,那用yacc和lex也就够了。
就是所谓的“Not Invented Here”。不能为了创造而创造。
这是一个严峻的话题。
不一定就要创造一种语言。一方面现在研究主要都不是针对基本的程序开发,而是搞框架和模型,用来对付大型和复杂的应用;另一方面也是现有计算机理论的缺陷造成语言本身的有限的表达能力。编程语言在过去30年已经发明了很多,说有100种那也是我保守了。但这100多种说到底也就是一种,只要理论没有突破就不会有真正意义上的新语言。
您说,我们这些人到底还能干些什么?
此外,这100种语言并不是等于一种。知道图灵机吧,但是与图灵机等价的还有lambda-calcul,这就是ocaml语言的理论基础,其实很有意思,但是没有流行起来,但是微软下一代语言F#很大程度上就是参考了ocaml
已经包含在我说的100种里。我说的那一种正是可计算函数,和可判定性问题加起来就是现在计算机理论的基础。你说和图灵机等价,一点也不错。说起来当初学lisp的时候就觉得这种编程太有意思了,就是括号嵌套看着头晕,随便写个小程序就是一堆的括号。据说做人工智能就得用它。
我觉得,作为兴趣爱好就去搞个啥语言的,不太现实。只要不够严密和完整,就没有可用性,您说是吧?
那么谁做C的编译器呢?C本身也需要编译成汇编语言的吧?效率呢?
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
http://www.sevenforks.com/ime/notepad.html
I use this link in my office to input Chinese, it runs perfect.
C的编译器是什么语言?汇编吗?汇编和机器码老农是懂的,学微机原理的时候学过的。
编译器的功能就是把高级语言翻译成机器语言,机器语言就是01的组合,在计算机上就是控制电子元器件的高电平低电平,所以说计算机能识别机器语言,也只能识别这些。
编译器就是一名翻译,不管你说阿拉伯语,英语,德语还是鸟语,翻译统统地翻译成汉语,这样不懂外语的中国人就听懂了。翻译不管是哪个国家的,会哪种语言的,只要懂汉语和这些外语就行了。所以说翻译器用什么语言来做都可以。
负责的程序都是由简单的语法、语句构成,编译器只要把这些简单的语句对应成01序列就可以了。
简单的说,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;(伪的不能再伪的伪汇编)。编译器的职责就是读一个高级语言程序的文本,然后将它翻译成相应的汇编或机器代码。想通了这一点,剩下的就是需要一些编译原理里面如何做词法分析,语法分析之类的东西了。这些都是有标准算法的,看看相应的教材应该会有帮助:)