对 pypy 的简单试验,惊叹其优化的智能!
2007年3月30日星期五
2007年3月27日星期二
[有趣]Invasion Of The Dynamic Language Weenies
Invasion Of The Dynamic Language Weenies 这文章很是耐人寻味,嘿嘿 ;-)
2007年3月18日星期日
2007年3月17日星期六
字典与动态语言
字典(或者叫哈希表、关联数组..)与动态语言的渊源可谓极深。动态语言之所以动态,归根结底是因为把对变量的求值放在了运行时完成而非静态语言的编译时确定。动态语言程序中众多的不同层次的名字空间(或者说作用范围)其实就是一个个的字典,变量名为 key,对象为 value。 而对变量求值的过程就是对所在名字空间查找的过程,根据变量名,找出相应的对象,有时候在局部名字空间中没找到,还可能会自动跑到外部名字空间或是全局名字空间去找。 对于支持 OO 的动态语言,对对象的实现其实也都是字典,属性名为 key,属性值为 value ,属性的获取也就变成了对字典的查找。有时子类中找不到还会到父类中去找,这也就是动态语言对继承的实现。 javascript 的 prototype 可能是动态语言实现继承最直接最简洁的方式了。python 为 OO 加了几个新语法,新概念,还有对多重继承的支持,不过本质上其实还差不多。 字典的核心地位在 lua、javascript 中表现得最为明显,在 javascript 中字典和 object 其实就是同义词;在 python 中其实也不难找到字典的身影:locals()、globals()、还有(几乎)所有对象都有的 __dict__ 属性;ruby 这样的语言中这一点会藏得深一些。 【以下为个人感受】 字典是动态语言的灵魂,要使用好动态语言首先肯定是要认清这一点的,不过在实际软件开发中像 lua 一样直面字典编程未免太简陋了一些,javascript 稍微好点,python 完美,而 ruby 过了。
2007年3月12日星期一
pypy 介绍
前面写过篇介绍 pypy 的文章了,不过感觉有些东西还说得不够清楚也不够准确。 pypy 分为两部分:一个 python 的实现 和 一个编译器。 pypy 这名字说的就是这第一部分:用python实现的python。但其实这么说并不准确,准确得说应该是用 rpython 实现的 python ,rpython 是 python 的一个子集,不过不要搞混了,虽然 rpython 不是完整的 python ,但用 rpython 写的这个 python 实现却是可以解释完整的 python 语言。 那为什么要用 rpython 来写这个 python 实现呢,这其实就涉及到了 pypy 的第二部分:编译器。 这是一个编译 rpython 的编译器,或者说这个编译器有一个 rpython 的前端,目前也只有这么一个前端,不过它的后端却是不少,也就是说这个编译器支持许多的目标语言,比较重要的有:c, cli, javascript ... 而当我们把这两部分合起来看的时候,就能够发现 pypy 最重大的意义所在,当我们用这个编译器来编译这个用 rpython 写的 python 实现,我们能够得到什么呢?一个 c 写的 python 实现,一个用 .net 写的 python 实现(不过目前的 cli 后端还不能用来编译这个 python 实现) ... 我想这个介绍应该是比较简要了,pypy 的这两个大部分中都包含有许多有趣的内容,等玩得多些了再来介绍吧。 [update] 刚看到 pypy 0.99 发布的声明,其中说到编译后的解释器性能 twice the speed of the 0.9 release, overall 2-3 slower than CPython 。并且: It is now possible to translate the PyPy interpreter to run on the .NET platform . the JavaScript backend has evolved to a point where it can be used to write AJAX web applications with it. WOW!
2007年3月9日星期五
pythonic cherrypy
刚才看到这个页面:http://tools.cherrypy.org/wiki/InteractiveInterpreter,发现 cherrypy 还可以这样做,真是有点意思,正如作者所说: We think it showcases the pythonic nature of CherryPy. 不过那个视频使用的是cherrypy以前的版本,cherrypy3稍有不同,以下是我使用 cherrypy3 在 ipython 上实验的结果:
Python 2.4.4 Stackless 3.1b3 060516 (#71, Jan 27 2007, 21:48:58) [MSC v.1310 32 bit (Intel)] Type "copyright", "credits" or "license" for more information. IPython 0.7.3 -- An enhanced Interactive Python. ? -> Introduction to IPython's features. %magic -> Information about IPython's 'magic' % functions. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]: import cherrypy In [2]: cherrypy.config.update({ ...: 'autoreload.on':False, ...: 'server.log_to_screen':False ...: }) In [3]: class Hello(object): ...: @cherrypy.expose ...: def index(self): ...: return 'hello world!' ...: @cherrypy.expose ...: def test(self): ...: yield 'test1' ...: yield 'test2' ...: In [4]: hello = Hello() In [5]: cherrypy.tree.mount(hello, '/') Out[5]: <cherrypy._cptree.Application object at 0x00E2C0F0> In [6]: cherrypy.engine.start(blocking=False) CherryPy Checker: The Application mounted at '' has an empty config. In [7]: cherrypy.server.quickstart() [09/Mar/2007:21:01:40] HTTP Serving HTTP on http://0.0.0.0:8080/ # 注释:此时可以访问 http://localhost:8080/ 和 http://localhost:8080/test 了。 In [8]: def test2(self): ...: return 'test2' ...: In [9]: Hello.test2 = cherrypy.expose(test2) # 注释:此时可以访问 http://localhost:8080/test2 了!真是方便那!
Profile
- 黄毅
- 深圳, 广州, China
- I Love Python !
Recent Posts
Recent Comments
Tags
- 设计模式 (1)
- ajax (3)
- allegra (1)
- cherrypy (1)
- compiler (1)
- continuation (2)
- descriptor (1)
- django (17)
- dotnet (1)
- framework (2)
- functional (1)
- genshi (1)
- gtk (1)
- haskell (1)
- inkscape (1)
- IronPython (2)
- javascript (1)
- libevent (1)
- mako (1)
- metaclass (4)
- mochikit (1)
- network (1)
- newforms (1)
- orm (1)
- others (18)
- paste (1)
- PEAK (1)
- pickle (1)
- ply (1)
- pocoo (1)
- pypy (3)
- python (38)
- python3000 (3)
- rails (2)
- REST (3)
- sqlalchemy (3)
- stackless (3)
- turbogears (1)
- tutorial (1)
- vim (1)
- web (11)
- wsgi (1)