1
knightzorro 2014-12-31 10:25:36 +08:00
受到的限制少啊,更容易表意。douban有个牛逼的工程师用python写了个dpark, python版本的spark, 处理大数据的效率比hadoop高很多。总共代码不到2万行的样子。
你说的“新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化”, 这个有时候被当作一个feature, 用来patch原有代码的行为,使用得当能让编程的时候思维非常流畅。 |
2
14 2014-12-31 10:32:44 +08:00 via Android
Angular.js的实现方式就是用toString()把函数源代码导入成字符串然后再解析函数
|
3
tini8 2014-12-31 10:36:12 +08:00
思维不受束缚,可以任意发挥,把更多的精力放在产品本身上。java入门的程序员很难理解动态语言的优点,看见过很多java程序员把python和ruby的代码写的跟java似的,心痛
|
4
axe 2014-12-31 10:39:00 +08:00
|
5
cancan 2014-12-31 10:42:03 +08:00
膜拜xiaoxiao巨巨
|
6
cszjutstar 2014-12-31 10:42:27 +08:00
膜拜超巨巨
|
7
yasonyyx 2014-12-31 10:44:19 +08:00
膜拜超巨巨
|
8
msg7086 2014-12-31 10:57:09 +08:00
本来想说些什么,结果看到楼上两楼,顿时吓得躲到角落里去了。
|
9
levn 2014-12-31 11:00:46 +08:00
一般说的应该是指“动态类型语言”,相对于“静态类型语言”
其实它就像是一种类型信息上的延迟绑定 |
10
zts1993 2014-12-31 11:02:50 +08:00
F5即可见,,这是用PHP的唯一理由,弥补了没有静态检查的缺憾。2333333
|
12
wangxiaoxiao OP |
13
ffffwh 2014-12-31 11:39:58 +08:00 via Android
原始的lambda calculus是图灵完全的。
加上类型限制,simple typed lambda calculus就要引入额外的递归操作符。 可见类型对表达能力的限制。 |
14
laoyuan 2014-12-31 12:15:16 +08:00
以PHP为例,我朴素的认为 $$x 和 $x() 都算是动态吧,变量名和函数名可以是变量
|
15
kmvan 2014-12-31 12:19:35 +08:00
@laoyuan 以PHP为例,我朴素的认为 $$x 和 $x() 都算是动态吧,变量名和函数名可以是变量
没错,PHP中 $$x 这种变量叫“可变变量”,非常实用的技巧。 |
16
spacewander 2014-12-31 12:24:07 +08:00
@wangxiaoxiao 有空可以看一下《Ruby元编程》。虽然是讲Ruby的,但是用Python或者Javascript也可以实现。
|
17
spacewander 2014-12-31 12:27:09 +08:00
|
18
laoyuan 2014-12-31 13:08:26 +08:00
@kmvan
PHP 如果不使用 eval 运行动态生成的函数(安全起见),是不是只有把字符串存一个 php 文件然后include? |
19
pertersonvv 2014-12-31 13:12:23 +08:00
弱类型,动态绑定?
|
20
kmvan 2014-12-31 13:31:56 +08:00
@laoyuan PHP 如果不使用 eval 运行动态生成的函数(安全起见),是不是只有把字符串存一个 php 文件然后include?
不一定啊,你可以把字符串存成 txt 文件,然后再include也行。或者存成 exe 文件也能解析。 |
21
jseanj 2014-12-31 13:32:51 +08:00
膜拜超菊苣
|
22
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 |
23
wangxiaoxiao OP @nine 赞回复,虽然看的不是很懂:D
java中也有反射可以根据某个类型来生成一个对象或者运行某个方法~ |
24
nine 2015-01-01 11:58:49 +08:00
@wangxiaoxiao 最核心的应该是“打开类”了
《Ruby元编程》第一章讲的就是这个,当时看到的时候表示惊呆了。 程序在运行的过程中,class都有可能被改的面目全非,这在其他语言里是不可思议的。这也就是你说的“运行改变结构”。 ------------------- 维基百科上这样介绍动态语言 它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化 |
25
a528518960 2019-02-28 15:34:17 +08:00
我就是用 python 来做了一个运行起来,不用停,不用重启,可以直接改变逻辑代码的程序,不知道这个算不算是运行时改变结构
|