就像个人实验一样,为了尝试更好地学习编程和形式语言理论等,我正在尝试编写一种基本上采用一系列方程式并且或多或少地自动解决未知数的语言或启发式。我试图通过在C中编写一个解释器来做到这一点。
所有这些都不是超级相关的,但更重要的是,我在最近几天发现了函数式编程(我的意思是我读了维基百科的条目和简短的Haskell教程)并且它似乎交易与我想做的事情非常相似。
我想我想知道的是,我是否应该研究其他任何语言,或者任何非功能性语言都有尝试做类似事情的库或程序,以便我可以更好地理解什么我打算这么做?
另外,有没有很好的参考资料来编写口译员等?
感谢。
P.S。哦,我知道我可以而且应该使用谷歌。我是站在一边的。最重要的是,我正在寻找一个集体的“第二意见”,因为它有什么好处,以及人们以前用过的东西。此外,我正在尝试更好地了解社区,因为我是新来的。感谢您的耐心: - )
答案 0 :(得分:4)
免责声明:我没有认真探索这个领域,但希望这篇小文章可能对你有用 - 并等待其他人看到更多答案。
我认为其中有多个问题:
1)方程求解器。
如果你的意思是“象征性地解决未知问题” - 这是你即将开始的一大堆工作,恕我直言:-)你即将着手创建一个computer algebra system。
Term rewriting本身就是一个相当大的话题。如果你对这个级别的操作特别感兴趣,C可能不是最容易使用的 - 你可能会更轻松地使用Lisp执行该任务。
值得注意的是,并非每一套方程式都能找到解决方案 - 并且“只是”找出它是否确实有解决方案的事实本身就是一项艰巨的任务。
另一方面,如果你注意以数字方式求解方程式,那么像this这样的东西可能会很有趣。
2)一般的功能编程。
Haskell是一种很棒的语言(尽管我还是一个非常初学者 - 我认为它可能是最优雅的语言之一)。 OCaml可能是另一条探索之路。然后,当然有Scheme。如果您正在处理Web编程,那么具有直接实际意义的语言可能是XSLT。
当然,您可以轻松地在Ruby和Python中编写功能样式。观察学习新语言如何以“主要”语言整体改变您的编程模式是非常有趣的。那么,语言理论与否 - 你接触的语言越多越好。
3)编写口译员等
我怀疑,鉴于问题的味道,你想要做的最有趣的实际应用不是解释器,而是编译器中的优化代码。为此 - Dragon book和MIT computer language engineering course在我看来很有用。然后你可以抓住,例如TCC的副本并使用它。如果你想修补一些不那么传统的东西,请看看potion - 一个非常有趣的语言实验,它将x86机器代码作为它的“字节码”(因此在x86机器上的性能非常惊人)。
This question on SO实际上引用了上面(3)中的大部分链接,还有更多链接。
答案 1 :(得分:2)
正如安德鲁所说,你所描述的内容被称为“计算机algegra系统”,更普遍的是“术语重写系统”。阅读这两个方面应该让你有所了解。
而且,是的,我希望你会发现函数式编程是一个非常适合的范例。也许是逻辑编程。
我的预感是,你关于口译员的问题是从Greenspun's Tenth Rule跳出来的,结果是
任何足够复杂的C或Fortran程序都包含一个临时的,非正式指定的,错误缠身的,一半Common Lisp的慢速实现。
您可以将“Common Lisp”替换为“函数式编程语言”。
换句话说,如果你选择并拥抱一个有意识设计的函数式编程语言(对于你的计算机代数系统),你就不必无意识地创建一个(并且非常糟糕)。
我个人最喜欢的功能语言是Haskell。对于新手来说,Haskell的优势在于,当你仍在进行编程时,你会承认 - 通过静态输入。