西西河

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

共:💬62 🌺30 新:
分页树展主题 · 全看首页 上页
/ 5
下页 末页
                • 家园 lambda演算也是上下文无关的文法

                  已经包含在我说的100种里。我说的那一种正是可计算函数,和可判定性问题加起来就是现在计算机理论的基础。你说和图灵机等价,一点也不错。说起来当初学lisp的时候就觉得这种编程太有意思了,就是括号嵌套看着头晕,随便写个小程序就是一堆的括号。据说做人工智能就得用它。

                  我觉得,作为兴趣爱好就去搞个啥语言的,不太现实。只要不够严密和完整,就没有可用性,您说是吧?

          • 家园 有道理。做工程得避免NIH

            就是所谓的“Not Invented Here”。不能为了创造而创造。

    • 家园 嘿嘿

      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++ How to Program, Fifth Edition

      By H. M. Deitel - Deitel & Associates, Inc., P. J. Deitel - Deitel & Associates, Inc.

      习题8-18, 8-19, 和 21-16。在第1043页上有一个Special Section: Building Your Own Compiler。

      看一下也许对你会有所启发。

    • 家园 老农就是一票友

      又想玩出点东西来,挺难。

      • 家园 跟我差不多...

        我对计算机的一些东西也是半通不通,希望哪位河友能多提供一些知识...

    • 家园 这个问题俺20年前读大学时就问过编译原理的辅导老师,

      当时的老师很不高兴,很不耐烦,好像这是个一加一等于二的问题一样,俺也不好意思再问下去了。很多年以后,俺知道这个问题的真正答案后才知道,有多少好苗子被中国的老师毁灭了:)

      你的问题相当于问:俺没有任何软件甚至评估板之类,只有一本来自INTEL

      的芯片手册和一片芯片,但是俺有高级的关于现代系统的一切知识,如何开始写软件甚至构造一个OS造出今天的计算机来?

      这个过程是无限漫长的,但每一步并不困难。首先,俺可以根据INTEL的手册,只用HARDWARE搭出一个系统来。这个过程大和于大学里计算机原理课的LAB课内容差不多,就是在CPU周围给它搭上外围电路和eprom以及RAM,然后俺通过按各种开关写出第一个汇编器!!!一旦这个东东可以被保存在EPROM中,我们就生出了第一只鸡,剩下的就是鸡生蛋再蛋生鸡的过程了。

      实际过程中,那些外围电路可能有软件,但不考虑效率的话,实际上都可以用硬件来代替。一切的软硬件都不过是关于某种时序和逻辑!这里的关键是你按过的开关的顺序一定要能被保存下来反复使用并实现同样的功能!没有这条任何软件系统都不可能成功。

      问这个问题的同学都深刻地触及了冯洛伊曼计算机的本质。他们实际上在开始思考大师们七八十年前或百余年前(如果从巴贝奇算起的话)思考过并解决了的问题。可惜的是问这种问题的人在中国一般是遭到某种半通不通的工匠们的嘲笑!

    • 家园 怎么鸡生蛋蛋生鸡的

      起初只有机器语言,机器语言当然不需要编译器。后来有了汇编语言,汇编转化为机器语言只是一个一对一(或一对二三)的简单对应,第一个汇编编译器自然可以不困难地用机器码一行一行地堆起来。事实上,我们甚至只需要实现一小部分机器码,以足够实现字符的读取与转换就可以了。现在我们有了原始汇编编译器,所有的后续开发(如理解所有机器代码的汇编编译器,再如Debugger等编译工具)就可以用已实现的汇编实现。好了我们现在有了完整的汇编编译器,那么今后的高级语言的实现就可以基于汇编编程。现在我们来试着造一个C语言编译器。我们知道这不容易。那么我们先造个简单的,先实现IF...THEN, GOTO, +/-,=。哈一天考定,不就六个TOKEN吗。别急!这是C语言吗。那那FOR,WHILE,乘除,函数,指针,等等呢?不错,这不是完整的C,可是用它们所有的程序都能实现。我们实际创造了一个C的自洽的最小子集的编辑器。下一步我们进一步释放我们的野心,我们用这六个TOKEN的语言实现更多功能的编译器。如果我们步子迈得大,我们可一步实现整个C语言,可我建议你多分几步,因为每一步新实现的功能的运用可以大大简化下一步的实现。我不知道C的发明者用了几步,但是三步看来应当是不错的选择。注意,即使所有的功能都实现了,它还不是一个最终的编译器,因为他没有考虑到效率(编译器本身的运行效率,还有编译出代码的效率)。但可喜的是,从此我们可以用C语言编写我们高效的产生代码的C编辑器。一但这个高级的编译器写好,并用前一个编辑器产生了可执行程序后,我们再用它编译它的C源代码,我们又可以得到自身运行效率高的C编译器可执行文件。

      说到这里,鸡生蛋蛋生鸡的过程就告一段落了。与生物界的过程相似,虽然鸡生了蛋然后蛋又生了鸡,可是每一步的蛋和鸡都比上一步有改进,在生物学里那叫“进化”,在这里计算机科学家们叫“自拔靴”(bootstrap)方法。

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


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

Copyright © cchere 西西河