3

我知道 C(或者为什么不是 C++)是这样做的自然选择,但出于个人原因,我想在 Java 中尝试它。

我想要实现的:

  • |
  • >
  • >>
  • 一些内置插件,如echoif

我正在考虑使用 ProcessBuilder、PipedInputStream、PipedOutputStream 等来实现我的目标。

你认为这在不依赖 JNI 的情况下是可能的吗?

我应该使用像 antlr 这样的工具来帮助我学习语法,还是你认为它对于我需要的东西来说是多余的?

还有什么建议、材料吗?

4

5 回答 5

1

对的,这是可能的。事实上,它已经在 J​​Node 中完成了。JNode 包含一个名为“bjorne”的外壳,它或多或少是完整的,或多或少是 POSIX 兼容的。

问题在于,当前形式的“bjorne”运行在 JNode 操作系统上/下执行的命令,而不是在 Linux 或 Windows 平台上。因此,用于启动命令的“接口”不依赖于 fork/exec 或Process,就像经典 JVM 上的实现所需要的那样。但这就是练习的重点……


如果你自己实现这个,Antlr 不会有太大帮助,因为基本的 shell 语法是上下文相关的。此外,实现 POSIX 的“难点”在于获得正确的引用和扩展,以及处理子shell、重定向等。

于 2012-07-08T07:55:04.927 回答
1

http://www.beanshell.org/已经存在多年,并在许多 IDE 的调试器中用于评估表达式。

于 2012-07-08T08:01:03.183 回答
1

| > >>这是可能的,尤其是对于像和之类的简单要求for。但是,如果没有本机代码,您将无法实现某些功能,例如 exec。您可以使用JShell作为起点。不过,要使其与当前的 JDK 和库一起编译,还有一些工作要做。

于 2012-07-10T05:52:35.603 回答
1

这将是一个重复的练习,但如果你只是为了这样做而这样做,如果你想复制一个控制台,你应该从控制台处理部分的jline开始。jline处理所有本内容,因此您无需处理任何 JNI。jline与 OSX、Linux 和 Windows 同等地工作。

ANTLR 不会对做这么简单的事情有任何好处,但是像JSAP这样的命令行解析器会很有用。

jline 和 JSAP 将为您提供构建功能 shell 和命令行解析shell 支持的“命令”所需的一切。

于 2012-07-08T07:28:44.810 回答
1

唯一真正的挑战是输入的实际解析,特别是如果你想模拟例如 bash,因为我肯定会使用 Antlr 来构建语法和相关代码。我认为使用 Antlr 并不过分,因为它有助于提供正确的解析并让您更轻松地实现实际的 shell 函数,因为它会删除您必须编写的大部分代码。有些领域可能需要JNI,但我认为除了一些特殊情况外,它不会是非常重要的代码部分。

我会看看其他的 shell 实现,我也知道有一些大学课程涵盖了操作系统,它们的任务与此类似。

于 2012-07-08T07:28:54.943 回答