【问题标题】:How do people go about creating their own programming languages? [closed]人们如何着手创建自己的编程语言? [关闭]
【发布时间】:2010-11-27 01:51:06
【问题描述】:

在大学时,我主修编译器理论和语法,因此在这方面有很好的背景(虽然很久以前)并且知道创建编译器是一项艰巨的任务,至少对于 C++ 这样的语言而言.

因此,我对似乎是由个人而不是在公司工作的大量人员创建的大量编程语言感到困惑。例如 Ruby,根据维基百科,它是由一个人创建的 - 我不知道这种语言也许它非常简单,但我的观点是那里有大量的自创语言。

那么,作为一个个体,如何创建自己的语言(这不是太简单以至于毫无用处),而不是花费一生来做这件事呢?

有没有关于这个主题的好书(不是关于编译器和一般的规范)?

【问题讨论】:

  • 这个问题听起来像Programmers.SE 会更合适。
  • 谁说它不需要让一门自创语言有用?

标签: programming-languages grammar compiler-theory


【解决方案1】:

(虽然很久以前)并且知道创建编译器是一项艰巨的任务,至少对于 C++ 这样的语言而言。

很多事情都让事情变得更容易:

  1. 计算机具有更多的 RAM 和速度。 编写早期编译器的大部分挑战是能够高效地完成此任务并使用最少的内存。这就是为什么 C 可以一次性编译的原因:当时,您可能没有足够的内存来容纳整个源文件。以前编译器编写的许多魔力是优化符号表表示并尽可能快地进行物理解析,而现在您可以通过做事变得更简单、更轻松。

  2. 基础技术变得更好。 大多数语言都有很好的易于使用的解析器库、高级数据结构(如果您已经有一个很好的哈希表实现,符号表是轻而易举的事!)和其他工具,使编译器或解释器的启动和运行更加容易。

  3. GC 无处不在。 今天创建的大多数新语言都是垃圾回收的。这使得设计语言更容易(您不必指定详细的内存语义)。同时,您可以针对一些现有的 GC 平台,如 CLR 或 JVM,这样作为语言作者,您不必编写自己的 GC。事实上,以 CLR 或 JVM 为目标通常会使您作为编译器编写者的工作更轻松:作为更高级别的平台,字节码可以满足您的需求。

  4. 大多数新语言都是动态类型的。正在创建的大多数新语言都是动态类型的。这些 更容易设计和实现。我发现语言设计中的大部分挑战是设计类型系统。同样,编译或解释静态语言更具挑战性。一切都只是一个属性包的动态语言非常容易启动和运行。

  5. 同样,计算机拥有更多的 RAM 和速度。 过去,如果您的语言想要有成功的机会,就需要编译成高效的机器代码,有效地使用内存并快速运行。否则它会非常缓慢。既然计算机速度如此之快,即使是像 Ruby 这样的慢速语言,对于许多实际用途来说仍然足够快。作为编译器编写者,您不再需要像以前那样的优化技能了。

同样值得注意的是,没有人现在正在开发一种像 C++ 一样复杂的新语言。 C++ 确实接近语言复杂性的最高端。

【讨论】:

    【解决方案2】:

    我在创建自己的语言的道路上走了一点路。我开始这样做是为了表示需求、分析和设计结构,而不是代码编译器。为此,即使是非常简单的语言也很有用。我发现能够以非常受限制的英语版本(主要是模板句子)来阅读和编写这样的结构是很有价值的。然后让语言机器可读变得很有用,所以我构建了词法分析器和解析器来使用 Lex 和 Yacc 读取语言。我已经扩展了语言及其解析器来处理扩展。

    我知道,对于像 C++ 这样广泛的语言来说,要实现强大的编译器还有很长的路要走,但这说明了走这条路的一个动机。我建议您认为简单语言毫无用处的观点是夸大其词。即使是非常有限的语言也可能有很大的用途。

    【讨论】:

      【解决方案3】:

      虽然我基本上没有制作自己的语言的经验,但我确实有大量学习新语言的经验,所以我可以建议这个 -

      编程行业是一个语言市场。语言的流行程度取决于其学习和使用的简单性、缺乏商业和法律限制、对现实生活情况的适用性、灵活性和强大功能。如果您希望您的语言有朝一日流行起来,请尝试使用这些语言。

      如果您为自己设计一种玩具语言(正如许多计算机科学家所做的那样),这是一个有趣的理论练习并且仍然非常有效,但您可能不会期望它会变得如此广泛。

      【讨论】:

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