3

就像个人实验一样,为了更好地学习编程和形式语言理论等,我正在尝试编写一种语言,它基本上可以接收一堆方程并或多或少地自动或启发式地求解未知数。我试图通过用 C 编写解释器来做到这一点。

不过,所有这些都不是超级相关的......更重要的是,我在过去几天发现了函数式编程(我的意思是我阅读了维基百科的条目和一个简短的 Haskell 教程),它似乎处理非常相似我想做的事情。

我想我想知道的是,是否还有其他语言我应该研究,或者任何非功能性语言具有尝试做类似事情的库或程序,这样我可能会更好地理解我是什么出发做什么?

此外,是否有任何关于编写口译员等的好的参考资料?

谢谢。

PS 哦,我知道我可以而且应该使用 Google。我,在一边。最重要的是,我正在寻找关于什么是好的以及人们以前使用过的“第二意见”的集体。另外,我正在尝试更好地了解社区,因为我是新来的。谢谢你的耐心 :-)

4

2 回答 2

4

免责声明:我没有认真探索这个领域,但希望这篇小文章可能对您有用 - 并等待看到其他人的更多答案。

我认为一个问题有多个:

1) 方程求解器。

如果您的意思是象征性地“解决未知数” - 这是您即将开始的大量工作,恕我直言 :-) 您即将着手创建计算机代数系统

术语重写本身就是一个相当大的话题。如果你对这个级别的操作特别感兴趣,C 可能不是最容易使用的——你可能会更轻松地使用 Lisp 来完成这项任务。

值得注意的是,并不是每组方程都会有解——“仅仅”弄清楚它是否有解本身就是一项艰巨的任务。

另一方面,如果您希望以数值方式求解方程,那么可能会很有趣。

2)一般的函数式编程。

Haskell 是一种很棒的语言(尽管我仍然是它的初学者——我认为它可能是最优雅的语言之一)。OCaml 可能是另一条探索之路。然后,当然还有Scheme。如果您正在处理 Web 编程,那么具有直接实际意义的语言可能是 XSLT。

当然,您可以轻松地用 Ruby 和 Python 编写函数式样式。观察学习新语言如何改变你在“主要”语言中的编程模式是非常有趣的。所以,不管语言理论与否——你接触的语言越多越好。

3) 编写口译员等。

我怀疑考虑到问题的风格,你想做的最有趣的实际应用不是解释器,而是编译器中的优化代码。为此,我认为Dragon bookMIT 计算机语言工程课程一开始会很有用。然后,您可以获取例如TCC的副本并使用它。如果你想修改一些不那么传统的东西,看看potion - 一个非常有趣的语言实验,它使用 x86 机器代码作为它的“字节码”(因此 x86 机器上的性能非常惊人)。

这个关于 SO的问题实际上引用了上面 (3) 中的大部分链接,还有更多。

于 2009-08-10T23:05:09.830 回答
2

正如安德鲁所建议的那样,您所描述的核心被称为“计算机代数系统”,更普遍的是“术语重写系统”。阅读这两个领域应该会让你有方向感。

而且,是的,我希望您会发现函数式编程是一个非常适合的范例。也许逻辑编程也是如此。

我的预感是,您关于口译员的问题是过激行为,是Greenspun 的第十条规则的结果,即

任何足够复杂的 C 或 Fortran 程序都包含一个临时的、非正式指定的、充满错误的、缓慢的 Common Lisp 一半的实现。

您可以将“Common Lisp”替换为“一种函数式编程语言”。

换句话说,如果您选择并接受一种有意识地设计的函数式编程语言(用于您的计算机代数系统),您就不必无意识地(而且很糟糕地)创建一种语言。

在函数式语言中,我个人最喜欢的是 Haskell。对于新手来说,Haskell 的优势在于让你承认——通过静态类型——当你还在进行命令式编程时。

于 2009-08-11T17:31:30.543 回答