What have you found for these years?

2008-05-07

Ruby 程式壓縮...

不要問我為什麼半夜心血來潮搞這個...
dependency 是 ruby2ruby,
ruby2ruby 的 dependency 是 ParseTree,
ParseTree 的 dependency 是 RubyInline
(其實還很蠢地 dependent on hoe, 不重要就不提了(雖然還是提了))

#!/usr/bin/env ruby

require 'zlib'
require 'rubygems'
require 'ruby2ruby'

class Ruby2Ruby
def indent s # 壓縮當然不要排版!
s.to_s
end
end

puts <<-END
require 'zlib'
eval(Zlib::Inflate.inflate('
#{[Zlib::Deflate.deflate(Ruby2Ruby.translate($stdin.read))].pack('m')}'.unpack('m')[0]))
END

隨便找了一個程式試,壓縮率約 51%

godfat ~/p/ludy> ruby rgz.rb < unit.rb > unit2.rb
godfat ~/p/ludy> ls -l
[...]
-rw-r--r--@ 1 godfat godfat 278 May 7 03:44 rgz.rb
-rw-r--r--@ 1 godfat godfat 1407 Apr 9 17:34 unit.rb
-rw-r--r--@ 1 godfat godfat 722 May 7 03:47 unit2.rb

試壓 ruby2ruby 更好,23172 壓到 6460, 約 27%

壓出來的程式就長這樣:

require 'zlib'
eval(Zlib::Inflate.inflate('
eJyNU81u3CAQvvMUyL3YSYOSSDl01Y3cW18gp9VqxeLxGokFCjhR0vTdM4Dt
dbxbtQcDnpnvm3+huPf0SctAeAhu54A34MqV5kf4Sld8L5UMEnyV1VwI8N6g
gTBGNeZFo1Fn8TjaijTQUolUkiv5BmXkqEgdL7qm8SL1RIiS35T+IfVIhIK6
s/E8xvOWgG4So9kHLvUuI1/L4caA8oMhFhwiPKh25mAz6qPjLeqH/8QbP5FS
/zFIF+kl0upiTQJ3Bwg7JX3IKWeBL6+yqJ4ZoNt4kRgbE8pomNLi1qpX8oU2
hmoTOqkPk6rXf1FaZwKIAM1/lPpzmj+BK/p9ynYBNzZgh31vMc2iQ9MCyaIQ
yeK1CDplkyrEsFc3a5oINisFz6C29IresYeKOdMjKtnOKsKAiw5b/x7eaWDY
8Otz+H2FgzFzMo3IdQ5nM03f9qxml2A357B/hnUhq2VYx4vBz3LPLZPPPMDn
Scr1juqDaVoexySuINPwUhZZhB3ID5aWYnin1bi7HVWL1YhNThw5Grp+RFuc
2NOKPdL7b1VFHPzqpYOysBb92B6Ht9hDaxzQofvWltlHVhMugjT6FMhpzfK8
bNm4BXNYWfA24HIOpJmE5UYtPWR7LJtZmI+dXQI+AE53nsY=
'.unpack('m')[0]))

基本上應該是可以直接跑,完全等價。不過我剛剛試了另一個會有路徑問題,
這點可能是 parse tree 搞的鬼... 要怎麼做才能完全正確我就懶得試了。
總之... zlib 不錯。

另外,ruby2ruby 有 bug...

Ruby2Ruby.translate '[1,2,3, *a]'
出來會是:
'1, 2, 3, *a'
外層的 [] 被吃掉了...
有空去 bug report 一下好了

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0