动态语言的好处是什么?

2014-12-31 10:20:51 +08:00
 wangxiaoxiao
维基百科上这样介绍动态语言
它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
以python为例,由于只写过简单的脚本,一直体会不到动态语言这种“运行改变结构”的强大特性,因此求大神介绍一下开发中,哪些地方会用到“运行时可以改变其结构”?
10647 次点击
所在节点    Python
25 条回复
jseanj
2014-12-31 13:32:51 +08:00
膜拜超菊苣
nine
2015-01-01 02:54:10 +08:00
python不太了解,以下特性不知道在java里有没有

-------------------------
php中
1 变量的变量
$foo()
(new $bar)->$boobar()
根据的变量的值来运行某个函数/方法,这些是动态的,

2 __call($method_name , $params)

如果有一堆 “find_by_字段名” 的方法,
都是要生成 select * from table_name where 字段名 = '$params'的语句,嫌麻烦怎么办

可以在类里定义 __call($foo , $params) {
正则提取$foo , 如果含有 "find_by_(.*)" ,那么根据正则匹配的字符,执行语句
}

(具体用法其实很多,好久没写了,一时想不起来。这个用法从架构设计上,我其实觉得不怎么智慧)

注意,事实上这里并没有生成真正的method

--------------------------

而“运行时改变其结构”,还是要看ruby了

1 ruby元编程最最最最核心的、经典的“打开类”
class Foo
def bar
puts 'bar'
end
end

class Foo
def foobar
puts 'foobar'
end
end

这样写不会报错,不是重复定义类,而是把类打开了,重新给类追加了一个方法(也可以是覆盖)。
(用法,可以根据input的不同,选择添加动态添给类加哪些方法。)

所以也可以在任何位置,修改任何库的的方法。
你觉得哪个库不好用,require 之后,立刻在你的代码里“打开类”,并修改其内部实现,以完成你的需求(这称之为 monkey patch)
monkey patch很强大,也很容易造成混乱,是把双刃剑,也是ruby最“动态”的地方之一。

重要的一点,是你可以修改任何核心库的内部实现(把runtime搞挂是很easy的事,这个有点类似于js的prototype。“prototype.js”库也是rails团队做的,得名与对prototype的patch,其实是用ruby的思维方式写js,其实不是很好,所以也边缘化了)


2 instance_eval() 类似“打开类”,但是可以方便的把外部的变量带进去,并访问内部属性(ruby的实例属性都是私有的,没有public)

3 block 代码块
method不但可以传入参数,还可以传入一段代码 do end 之间的代码
而method运行时,内部的x, y , z 变量可以在传入的代码中运行。

object.foo(params1 , params2) do |x , y ,z |
#x = x + 1
#y = x + z
end

4 代码块可以保存在Proc对象里,用以延迟执行

5 用send() 给method发消息
用于动态调用方法 类似php里的 ${foo}()


6 method_missing() 类似php 的__call()
没有生成真正的method

7 define_method() 动态定义方法
功能类似method_missing()
但是定义的位置和时机更灵活
而且这里生成的是真正的method

比如有一个二维hash,里面的键值都不一样,可以根据里面的键值,来生成对象,并动态定义他们的method
wangxiaoxiao
2015-01-01 11:03:09 +08:00
@nine 赞回复,虽然看的不是很懂:D
java中也有反射可以根据某个类型来生成一个对象或者运行某个方法~
nine
2015-01-01 11:58:49 +08:00
@wangxiaoxiao 最核心的应该是“打开类”了
《Ruby元编程》第一章讲的就是这个,当时看到的时候表示惊呆了。
程序在运行的过程中,class都有可能被改的面目全非,这在其他语言里是不可思议的。这也就是你说的“运行改变结构”。

-------------------
维基百科上这样介绍动态语言
它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
a528518960
2019-02-28 15:34:17 +08:00
我就是用 python 来做了一个运行起来,不用停,不用重启,可以直接改变逻辑代码的程序,不知道这个算不算是运行时改变结构

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/158111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX