【问题标题】:create my own programming language [duplicate]创建我自己的编程语言[重复]
【发布时间】:2011-04-09 09:51:39
【问题描述】:

可能的重复:
References Needed for Implementing an Interpreter in C/C++
How to create a language these days?
Learning to write a compiler

我知道一些 c++,非常擅长 php,擅长 css html,擅长 javascript。所以我在想 c++ 是如何创建的,我的意思是计算机如何理解代码的含义?它是如何阅读的……那么我是否可以创建自己的语言以及如何创建?

【问题讨论】:

标签: c++ compiler-construction programming-languages interpreter


【解决方案1】:

如果您对编译器设计感兴趣(“计算机如何理解代码的含义”),我强烈推荐Dragon Book。我在大学时使用它,甚至自己创建了编程语言。

【讨论】:

  • 我不认为我会向 13 岁的孩子推荐龙书。
  • @mmyers,如果他已经了解了一些C++并且非常擅长php...他可能拥有理解Dragon book所需的技能和知识。如果没有别的,这将有助于教他他还需要知道/学习的其他内容首先。
  • @mmyers 仅仅因为他 13 岁,编写编译器并不容易。
【解决方案2】:

“我时不时地想设计一个程序 语言,但我只是躺下直到它消失。”——L.彼得 德语

编辑(对于那些渴望上下文的人):

"[L. Peter Deutsch] also wrote the PDP-1 Lisp 1.5 implementation, Basic PDP-1 LISP, 'while still in short pants' between the age of 12-15 years old."

【讨论】:

  • +1 提倡常识,避免受虐狂... =)(编辑以添加引用来源的链接:books.google.com/…)跨度>
  • 13 岁时,我正在使用 Signetics 2650 汇编语言调试一个汇编程序。在我学习了代数之后,这个项目变得更容易了。大学 Compiler Theory & Design 课程结束后,我现在完全理解了。
  • 考虑到 OP 的上下文,这不是一个好的答案。曾经自己创建了系统大部分部分的简单版本真是太好了。这是更好地了解所涉及的内容的最佳方式,并让您更好地判断系统内部的工作方式,因此当您遇到奇怪的错误时,您更有可能知道可能导致它的原因。重新发明计算机的某些部分(作为一种学习练习)使您成为更好的程序员。
【解决方案3】:

如果您想了解计算机如何理解代码,您可能需要学习一些汇编语言。它是一种低级语言,可以让您更好地了解真正执行的简单指令。您还应该能够了解如何实现更高级别的结构,例如只有条件跳转的循环。

要获得更低层次的理解,您需要学习电子学。数字逻辑向您展示了如何使用电子“门”并实现通用 CPU,该 CPU 可以理解从汇编语言代码生成的机器代码。

对于非常低级的东西,您可以学习材料科学,它可以教您如何真正使门在原子级别上工作。

你听起来像个足智多谋的人。您将需要根据您的理解水平寻找有关这些主题的书籍和/或网站,并专注于您最感兴趣的内容。计算机科学或计算机工程专业的学士学位需要对所有这一切有相当全面的了解,但对于像你这样有积极性的人来说,很多事情是完全可以理解的。

【讨论】:

  • 虽然这些都是值得学习的好东西,但首先这些东西对于编写编译器来说似乎都不是必需的。如果使用 LLVM 或类似技术,则甚至不需要第一个。
  • 问题中没有指定'high-level'
  • 另外他还说“你可能想要”。不是他有。
  • “编译器”未在问题中指定。他说他想创造一种新的语言。在设计一门新语言时,机器代码编译器通常不是第一个实现。
  • 我支持汇编程序部分:这是你需要去有一个好主意的最低限度。不过,使用哪个汇编器并不重要。您只需要了解堆栈/堆、程序计数器等寄存器以及大多数汇编程序具有的典型指令(条件、流控制、调用函数所涉及的内容)。理想情况下,从一个教学汇编程序开始,或者像摩托罗拉 68000 汇编程序这样干净简单的汇编程序,如果您可以创建一个简单的汇编程序,它可以递归调用函数、使用条件和循环,并且可能会进行像 printf() 这样的系统调用,那么您足够了解。
【解决方案4】:

是的,您可以创建自己的语言。看看编译器编译器。或者如果你敢的话,可以提供一些脚本语言的源代码。一些有用的工具是 yacc、bison 和 lexx。

其他人都提到了龙书。我们在大学时代使用了一本我认为叫做《编译器理论与实践》的书。

不必学习汇编程序来编写语言。例如,Javascript 在称为解释器的东西中运行,解释器是执行 javascript 文件的应用程序。在这种情况下,解释器通常内置在浏览器中。

最简单的启动程序语言可能是编写一个简单的基于文本的计算器。即获取一个文本文件,运行它并执行计算。你可以很容易地用 C++ 编写它。

我的大学项目的第一语言是 BNF 中定义的语言。然后,我们必须编写一个解析器,将其解析为内存中的树结构,然后解析为所谓的 3 地址代码(类似于汇编程序)。您可以很容易地将 3 地址代码转换为真正的汇编程序或为此编写解释器。

【讨论】:

  • +1 用于开始编写计算器。但是,我会尝试阅读 Dragon Book 之类的内容并使用 Bison 或 ANTLR 等编译器编译器。
  • 同意,编写一个简单的表达式解析器和解释器是一个很好的第一步,但可能无法回答 OP 关于 C++ 如何工作、计算机如何运行代码的问题。不确定我是否同意编译器编译器/解析器生成器(在这种学习东西如何工作的特殊情况下)。可能值得先编写自己的标记器和解析器,以了解这些工具为您做了什么。
【解决方案5】:

是的!这绝对是可能的。其他人都提到了龙书,但网上也有很多资料。例如,llvm 有一个关于实现编程语言的教程:http://llvm.org/docs/tutorial/

【讨论】:

  • 呃,我已经专业地为小型领域特定语言编写了几个编译器,最近我做了我的第一个 LLVM 项目,发现学习曲线非常陡峭。当然,对于学生来说,最好是制作一种非常小的玩具语言并编写自己的简单递归下降编译器和字节码解释器,而不是尝试理解使用 LLVM 所需的所有工业级编译器概念。
  • @Larry Gritz:取决于您是否对编写编译器或设计语言感兴趣。如果您与生成 llvm 程序集相抗衡,我认为这可能非常简单(一旦您生成了 AST),但这并不意味着您不应该阅读一本好书。
【解决方案6】:

我真的推荐Programming Language Pragmatics。这是一本很棒的书,它带你从一门语言的本质到编译器的工作原理和创建你自己的语言。它比《龙之书》更易于理解,并在深入了解之前解释了事物的工作原理。

【讨论】:

    【解决方案7】:

    这是可能的。您应该了解编译器和/或解释器:它们的用途和制作方式。

    【讨论】:

      【解决方案8】:

      开始学习 ASM 并阅读字节码的工作原理,你可能会有机会 :)

      【讨论】:

      • 大多数编译器都是用自己的语言编写的 [en.wikipedia.org/wiki/Bootstrapping_(compilers)]。类似地,PHP 解释器主要是用 C 语言编写的——几乎没有任何程序集。
      • 错了,你可以用任何其他语言为任何语言编写编译器。我的意思是在大学的练习中,我们使用 java 创建了 lisp,然后使用了lips 创建了 java。当然,这是非常精确的语法,并不是非常聪明。
      • @Frank:@Parris:我不认为 Marc 的意思是编译器应该用汇编语言编写,而是应该编译为汇编语言。或者,也许他只是在回答问题的一部分,即“计算机如何理解代码的含义?”。
      • @sepp2k 有很多编译器不能“编译成汇编”。 javac,任何解释语言...
      • 汇编程序不必是实现语言也不必是输出格式。但是,了解汇编程序意味着您拥有字节码或解释器必须在后台提供的功能的基本模型,特别是对于实现递归函数调用。就是说,请随意糊弄自己。创建自己的语言,使用 std::map 来保存变量,然后发现递归不起作用是一种很好的学习体验。
      【解决方案9】:

      如果你知道 C ——听起来你知道——拿一本用过的这本古书: http://www.amazon.com/Craft-Take-Charge-Programming-Book-Disk/dp/0078818826

      其中有一章作者用 C 语言创建了一个“C”解释器。它不像 Dragon 的书那样在学术上很严肃,但我记得它非常简单,非常实用且易于理解,而且因为你'才刚刚开始,这将是对语言“语法”和“标记化”程序的想法的精彩介绍。

      这将是您开始的理想场所。此外,二手副本的价格为 0.01 美元,比 Dragon Book 便宜。 ;)

      【讨论】:

        【解决方案10】:

        从创建解析器开始。阅读 EBNF 语法。这将回答您关于计算机如何读取代码的问题。这是一个非常高级的话题,所以不要对自己期望太高,但要玩得开心。我为此使用的一些资源是 bison、flex 和 PLY。

        【讨论】:

          【解决方案11】:

          是的!对编译器感兴趣是我对专业 CS 的兴趣(以前我一直在走上 EE 的道路,只是在大学里才正式转行),这是学习大量计算机科学主题的好方法。你还年轻一点(我开始玩解析器和解释器的时候还在上高中),但现在有更多信息触手可及。

          从小处着手:设计你能想到的最小的语言——从一个允许变量赋值和替换的简单数学计算器开始。当您喜欢冒险时,请尝试添加“if”或循环。忘记像 lex 和 yacc 这样的神秘工具,尝试手动编写一个简单的递归下降解析器,也许可以转换为简单的字节码并为它编写一个解释器(避免理解特定机器的汇编、寄存器分配等所有困难部分)。通过这个项目,您将学到很多东西。

          和其他人一样,我推荐龙书(1986 年版,坦白说我不喜欢新书)。

          我会为你的其他项目补充一点,我建议使用 C 或 C++,抛弃 PHP,不是因为我是语言偏执狂,而是因为我认为克服 C/C++ 中的困难会教给你一个更多关于底层机器架构和编译器问题的信息。

          (注意:如果您是专业人士,建议不要创建新语言。这几乎不是正确的解决方案。但作为一个学习和探索的项目,这太棒了。)

          【讨论】:

            【解决方案12】:

            如果您想对该主题(计算基础知识)进行真正概括(但写得非常好)的介绍,我强烈推荐 Charles Petzold 的一本书代码。他解释了一些您感兴趣的主题,您可以从那里决定自己想要创建什么。

            【讨论】:

              【解决方案13】:

              看看这本书, The Elements of Computing Systems: Building a Modern Computer from First Principles 它带您逐步了解设计计算机语言、编译器、虚拟机、汇编器和计算机的几个方面。我认为这可以帮助您回答一些问题。

              【讨论】:

                猜你喜欢
                • 2010-09-26
                • 2014-11-17
                • 1970-01-01
                • 2013-02-25
                • 2011-04-18
                • 2020-02-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多