30 October 2004
This post may be outdated due to it was written on 2004. The links may be broken. The code may be not working anymore. Leave comments if needed.
2004/8/17 20% unfinished.
2004/8/18 5% unfinished, with bloves.

Parrot in a Nutshell

By Dan Sugalski, [email protected]

英文/Engligh, 英文PDF下载

什么是 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

  • 在虚拟机(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
  • 它们毁坏你的大脑
  • 即使你的大脑已经死了,但是,它们能让你做些及其聪明的事


blog comments powered by Disqus