谁能解释一下究竟是什么解释器。
那么安全口译员是什么意思呢?
我是 TCL 的新手,我总是对这些词感到困惑。
计算机无法理解文本alert("Hello, world!")
或if (x == 5) return;
. 它们是组成语言的一部分,因此您需要一些真正的可执行计算机代码来编译文本(将其转换为真正的可执行计算机代码)或解释它(读取并即时运行适当的计算机指令代表脚本)。
例如,运行 Perl 脚本的一种方法是将其名称作为参数传递给perl
程序,该程序会将文本解释为 Perl 脚本并为您“运行”它。解释器不一定是整个程序。大多数 JavaScript 解释器只是 Web 浏览器的一部分,IRC 机器人程序 eggdrop 有一个 Tcl 解释器作为它的一部分,等等。
在 Tcl 中,您可以运行多个独立的脚本,每个脚本都由所谓的解释器运行。您可以使用命令创建它们interp
,并且可以使它们安全。一个安全的解释器不会运行任何危险的命令,例如创建、打开或删除文件,因此可以让人们通过网页在您的计算机上运行 Tcl 脚本。
解释器为您运行脚本。您可以将执行代码称为解释器,或者将该代码的实际字节称为解释器,或者如果程序仅包含解释器而不包含更多,例如perl
or tclsh
,我想您也可以将该程序称为解释器。
执行摘要:
安全解释器是运行 Tcl 脚本的上下文,它受到限制,因此这些脚本可以造成的损害非常有限。
通常,Tcl 解释器是运行 Tcl 脚本的上下文。你知道 Tcl 使用全局变量的方式并且有一大堆全局命令和过程吗?就解释器上下文而言,它们都是全局的。过程中的所有其他上下文都不受它们的影响。这已经是相当多的孤立了。
但是 Tcl 更进一步,它允许解释器创建子解释器(有时称为“奴隶”,尽管我不太喜欢这个词)。然后,父解释器(也称为“主解释器”)可以将特殊的额外命令(跨解释器别名)插入子解释器以允许通信;孩子只是用它想要传递的任何参数调用一个特定的命令,而父母决定如何处理它(如果有的话)并返回它想要给出的结果。这太棒了,因为它允许您公开一个 API,而无需提供任何有关其实现方式的提示,也无法突破;没有后门。儿童口译员只能看到父母希望他们看到的那些父母的部分。
安全解释器建立在此之上,因为安全解释器是一个以特殊方式创建的子解释器(通过将-safe
选项传递给interp create
),它关闭并隐藏了许多默认的 Tcl 命令。子解释器不能open
归档、创建socket
s、source
脚本、load
扩展代码或exec
程序。(还有一些其他的事情会受到影响,但它们是主要的。)如果父母想要以有限的方式公开该功能,它可以通过别名来实现(并且,对于做open
and socket
,转移访问 I 的能力/O 通道)。Tcl 提供了一些支持,可以在此之上执行额外的代码配置文件——安全的基本配置文件——它增强了允许孩子做的事情package require
父母可以使用的包裹,而不会以其他方式暴露任何危险;是否要在安全的解释器中工作取决于包(许多用 C 编写的包可能不会,而 Tcl 包可能只有在它们有被隔离的命令时才能工作)。
不过有一些限制。特别是,安全解释器仍然可以通过消耗过多的 CPU 或内存来进行本地拒绝服务攻击。在 8.5中有一些处理 CPU 问题的机制。然而,内存更加尴尬,因为 Tcl 不使用拥有的解释器标记内存分配——这会变得混乱!使用真正严格的时间限制可以减轻很多麻烦。
Tcl 的安全解释器功能基于安全 tcl(这是一个非常古老的页面,顺便说一句;具有历史意义),但没有一些更时髦的位。特别是,编写策略配置文件通常很难做到,但以完全特定于应用程序的方式要容易得多。