Category: Translation Keywords: Parrot Dan Sugalski
2004/8/17 20% unfinished.2004/8/18 5% unfinished, with bloves.
Parrot in a Nutshell
By Dan Sugalski, dan@sidhe.org
什么是 Parrot
- perl 6 的解释器
- 一个多语言的虚拟机(VM)
- 一个不能控制(快成真)的愚人节玩笑
Parrot 的官方说法
- 用于支持 perl 6
- 建造更快的 perl
- 建造更清洁的 perl
Parrot 的非官方说法
- 普通快速的解释器引擎
- Mono 人的苦恼
- python 使用者的真正苦恼
- 试图接管世界
Parrot 的指导目标
速度
- 越快越好
- 慢的解释器是无用的
- 几乎不可能再快了
- Parrot 自动调整到最大速度
易维护性
- 努力让某些事件不可见
- 努力执行一种代码标准
- 开源工程(Open Source projects) 只有少数资源处于设计中
- 几乎不能再更易维护了
- 对于实际已完成的工程,维护总要消耗很多资源
长寿
- 软件良好运行的时间总是超出你所想的
- 设计时考虑长期的易扩展性总能推迟不可避免的重写
- 如果你以后还会要看这个代码,那么最好现在就确信我们能看清它
易扩展性
- 每个人都想用 C 增加点什么
- 永远是还是不够快
- 有很多外部库是值得一用的
- 一个良好的扩充机制是件非常棒的事
- 一个糟糕的机制真让人受罪
强适应性
- 通解比特解有更多的长期潜能
- 人们总是做些你意料不到的事
- 如果现在就考虑强适应性,那以后花费的时间就少了
- 即使现在花费的时间多一点也是值得的
多语言接受力
支持 perl
- Perl 6 是所有开始的理由
- Perl 拥有所有常见动态语言中最复杂的语义(semantics)
- 随着语言发展,Perl 解释器的执行是主要的苦恼
支持常见的动态语言
- 例如包括 Ruby 和 Python
- 在编译时会出现某种不确定的语言
- 实际上很琐碎,只需要大约考虑下
nice 目标
- 如果我们能表达所有语义,这能让语言设计者更容易些
- 许多人现在将 C 或 GCC 做为目标
- 对于许多语言来说,Impedance 失谐会更低
天生能玩 Zork
- 是的,我没说错
- parrot -b:zmachine zork.dat
- 比起正确地操作 Java, Python, or .NET 的字节码还要更难
- 如果我们能正确操作这个,那么我们能操作任何人的字节码
- 另外它真的非常 cool
解释器要素
- 许多软件能运行其他软件
- 软件中的 CPU
- 通常意义的强适应性
- 通常意义上的慢
- Easy to write for
- Easy to write
- 容易移植
软件中的 CPU
- 在虚拟机(VM)中有一个“V”
- 编译器作者能将解释器当成 CPU 芯片的一种形态
- 允许并且使“核心”动作更容易定制
- 有时候软件能当成硬件
- 但是更多时候是不能
通常意义的强适应性
- 当核心功能性已在软件中后,他们就可变了
- 一般来说,软件比硬件对适应性的限制要少
- 对大多数人来说,考虑软件比硬件更简单
- 更改的边际成本更低
通常意义上的慢
- 在用户的程序和硬件运行它之间有一间接层
- 非常容易有 impedance 失谐问题
- 也非常容易让速度逐渐消失
Easy to write for
- 很容易掩盖困难部分
- 解释器应该能用“我能被简单地使用”来描述自己
- 你应该将它作为你的目标,如果不是,那你就做错了什么事情
Easy to write
- 解释器是纯语义(semantics)的,而语义是容易表达的
- 但是定义语义要花费长一点的时间
- 一个简单的解释器能在一星期内装配起来
- (但是 parrot 离“简单”还远呢)
- 不管是不是很复杂,只需要一个 SMOP
容易移植
- 一般来说,表达的语义大多数都是平台无关的
- 这意味着特定平台的东西是独立的
- 平台特有但未执行的东西能被仿效
- 通常来说,真正需要对付的代码只有一小部分
Parrot 的核心概念
基于寄存器
- 32 each 整数/Integer, 字符串/String, 浮点数/Float, 和 PMC(Parrot Magic Cookie的缩写)
- 对于解释器来说,寄存器是一种命名了的临时的位置(slot)
- 它以硬件的 CPUs 为模型
- 一般来说,它比单纯的基于堆栈的模型更有效
语言无关
- 用人的感觉
- 我们不强迫用户非得使用 ASCII, Unicode, Latin-1, 或 EBCDIC
- 不管数据的编码如何,引擎都有相应的处理工具
- 这对于大部分是本地语言的文本处理很重要
高标准
- 多线程,闭包,continuations, aggregate operations, multimethod dispatch all core elements
- 不将困难的事物归入库
- 使编译器作者更容易
- 对于解释器执行来说,二进制(Bit)远大于烦恼
内省的
- 代码能检查解释器的当前状态
- 大多数,如果说不是全部,核心数据结构都是可获得的
- 包括堆栈入口,符号表,词汇变量
- 变量 arenas, 内存池和解释器数据也一样
易变的
- 代码能被创建 on the fly
- 库能被自动加载
- 操作码(Opcodes)能被重定义 on the fly
- 运行时,基础变量方法都可覆盖
多线程
- 多线程是 Parrot 的一个核心要素
- 多线程编译器是个有趣的任务
- “有趣(interesting)” 的另一个不愉快的含义
- 从一开始就要把它设计进去
With Continuations
- Really odd Lisp thing
- 有几分像控制流程的闭包
- 参考:意外处理/exceptions是一种简单的扩建物/continuation
- 它们将毁坏你的大脑
- 即使你的大脑已经死了,但是,它们能让你做些及其聪明的事