我知道 C(或者为什么不是 C++)是这样做的自然选择,但出于个人原因,我想在 Java 中尝试它。
我想要实现的:
|
>
>>
- 一些内置插件,如
echo
和if
我正在考虑使用 ProcessBuilder、PipedInputStream、PipedOutputStream 等来实现我的目标。
你认为这在不依赖 JNI 的情况下是可能的吗?
我应该使用像 antlr 这样的工具来帮助我学习语法,还是你认为它对于我需要的东西来说是多余的?
还有什么建议、材料吗?
对的,这是可能的。事实上,它已经在 JNode 中完成了。JNode 包含一个名为“bjorne”的外壳,它或多或少是完整的,或多或少是 POSIX 兼容的。
问题在于,当前形式的“bjorne”运行在 JNode 操作系统上/下执行的命令,而不是在 Linux 或 Windows 平台上。因此,用于启动命令的“接口”不依赖于 fork/exec 或Process
,就像经典 JVM 上的实现所需要的那样。但这就是练习的重点……
如果你自己实现这个,Antlr 不会有太大帮助,因为基本的 shell 语法是上下文相关的。此外,实现 POSIX 的“难点”在于获得正确的引用和扩展,以及处理子shell、重定向等。
http://www.beanshell.org/已经存在多年,并在许多 IDE 的调试器中用于评估表达式。
| > >>
这是可能的,尤其是对于像和之类的简单要求for
。但是,如果没有本机代码,您将无法实现某些功能,例如 exec。您可以使用JShell作为起点。不过,要使其与当前的 JDK 和库一起编译,还有一些工作要做。
唯一真正的挑战是输入的实际解析,特别是如果你想模拟例如 bash,因为我肯定会使用 Antlr 来构建语法和相关代码。我认为使用 Antlr 并不过分,因为它有助于提供正确的解析并让您更轻松地实现实际的 shell 函数,因为它会删除您必须编写的大部分代码。有些领域可能需要JNI,但我认为除了一些特殊情况外,它不会是非常重要的代码部分。
我会看看其他的 shell 实现,我也知道有一些大学课程涵盖了操作系统,它们的任务与此类似。