@
hepin1989 我当然知道 Java 也可以实现 Coroutine 的效果,而且说实话 Coroutine 其实就是个闭包而已嘛。别说Java 会演进增强,这些库迟早或是现在会有的。你给大家普及了这个库,我也是第一次看到。
但是,我从来就没有说过 Java 不能实现 Coroutine 的效果,我也一直不否认 Java 能写出 Coroutine 效果的库。
我一直强调的事情是,Java 是一个很不好的语言,这门语言的设计以及其规范鼓励的写代码的方式,不是解决问题的正确方式或者是最好的方式。
既然我们已经在 Coroutine 这个问题上短兵交接,那么我们也不妨就这个话题继续下去,看看:
1. 原生支持 Coroutine 的语言是怎样解决某一类问题的
2. C++可以写出怎样的库解决上述问题的
3. Java 可以写出怎样库解决上述问题
要解决的问题是:
一个 DFA 模块或者类,初始化的时候输入一系列规则,运行的时候逐个输入字符,并且可以随时查询已经 parse 出来了哪些终结符,正在 parse 的符号串可能是什么类型的终结符。
1. python
class DFA: object
def __init__(self, rules):
pass
def input(self, ch):
# 在计算过程中用到的变量
status = calc_status()
yield type, status
使用:
DFA dfa_engine = DFA(rules)
while(not EOF):
type, status = dfa_engine.input(ch)
2. C++ 没有原生的 yield,但是,最起码, C++ 可以混编 ASM 保存函数栈以及寄存器内容,来实现 yield 的效果,具体实现看 boost::context。 更不用说 boost::coroutine 这个库了。
class DFA
{
public:
static void *caller_context_;
static void *input_context_;
// ... other members
public:
std::tuple<Type, Status> input(const char ch) {
// 需要 yield 的变量保存在一个 std::tuple<Type, status> 的指针中
void *yield_cont = ...;
jump_fcontext(&input_context, caller_context_...);
}
// other functions...
}
使用:
DFA dfa_engine(rules);
DFA::caller_context_ = make_fcontext(&parse ...)
DFA::input_context_ = make_fcontext(std::bind(DFA::input) ...)
void parse(..) {
while (!EOF)
{
yield_cont = jump_fcontext(&caller_context, input_context_);
}
可以看到,形式上,大概是跟 Python 的是差不多的。
3. Java 的,谁打算试试,请大家教我,我反正是好久没用 Java 了。
看这个例子并不是说,Java 的能不能做到 Coroutine 的效果,而是看:
实现的形式是不是足够 保持 问。题。的。原。型。