【发布时间】:2020-01-10 08:36:24
【问题描述】:
我正在学习 Tcl,现在我被 tcl 命令阻塞了 interp
我读到这个命令是用来创建和操作解释器的,但是什么是解释器,什么时候使用?
【问题讨论】:
标签: tcl
我正在学习 Tcl,现在我被 tcl 命令阻塞了 interp
我读到这个命令是用来创建和操作解释器的,但是什么是解释器,什么时候使用?
【问题讨论】:
标签: tcl
Tcl 解释器是执行上下文。每个解释器都有自己的命名空间、命令和全局变量;它们不共享任何东西(除了一些东西,例如当前工作目录,它们是进程全局的)。解释器被创建为普通解释器(具有完整的内置 Tcl 命令集)或 安全 解释器,其中不会暴露任何可能对外部世界产生不利影响的命令。
一般来说,解释器是相互隔离的(以至于隔离是一种安全特性),但可以做一些跨越它们的事情:主要是父解释器可以告诉其中一个它的子解释器为其评估脚本并返回结果,并且父解释器可以将 alias 命令 放在子中,当调用时,将调用父传递的(指定的)命令父母。这样做的结果是,您可以将父子关系视为有点像操作系统内核和用户进程之间的关系,而别名命令就像系统调用一样。 (这不是一个完美的类比,所以不要想太多。)
set foo [interp create -safe]
proc sayhelloto {who} {
puts "Hello, $who!"
}
interp alias $foo hello {} sayhelloto
interp eval $foo {
hello "World"
hello "ThaDome23"
exec echo rm -rf evilstuff
}
# Hello, World!
# Hello, ThaDome23!
# error: no such command 'exec'
因此,只要您需要独立的执行上下文,就可以使用额外的解释器。它们是重量级的,所以你不想太频繁地创建它们,但它们比其他进程便宜得多。
最后,每个解释器都绑定到创建它的线程。不同的线程总是使用独立的interp。
【讨论】: