V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wangxiaoxiao
V2EX  ›  Python

动态语言的好处是什么?

  •  
  •   wangxiaoxiao · 2014-12-31 10:20:51 +08:00 · 10619 次点击
    这是一个创建于 3597 天前的主题,其中的信息可能已经有所发展或是发生改变。
    维基百科上这样介绍动态语言
    它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
    以python为例,由于只写过简单的脚本,一直体会不到动态语言这种“运行改变结构”的强大特性,因此求大神介绍一下开发中,哪些地方会用到“运行时可以改变其结构”?
    25 条回复    2019-02-28 15:34:17 +08:00
    knightzorro
        1
    knightzorro  
       2014-12-31 10:25:36 +08:00
    受到的限制少啊,更容易表意。douban有个牛逼的工程师用python写了个dpark, python版本的spark, 处理大数据的效率比hadoop高很多。总共代码不到2万行的样子。

    你说的“新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化”, 这个有时候被当作一个feature, 用来patch原有代码的行为,使用得当能让编程的时候思维非常流畅。
    14
        2
    14  
       2014-12-31 10:32:44 +08:00 via Android
    Angular.js的实现方式就是用toString()把函数源代码导入成字符串然后再解析函数
    tini8
        3
    tini8  
       2014-12-31 10:36:12 +08:00
    思维不受束缚,可以任意发挥,把更多的精力放在产品本身上。java入门的程序员很难理解动态语言的优点,看见过很多java程序员把python和ruby的代码写的跟java似的,心痛
    axe
        4
    axe  
       2014-12-31 10:39:00 +08:00
    @knightzorro 可以上具体的代码举个例子吗?

    不是很理解的说
    cancan
        5
    cancan  
       2014-12-31 10:42:03 +08:00
    膜拜xiaoxiao巨巨
    cszjutstar
        6
    cszjutstar  
       2014-12-31 10:42:27 +08:00
    膜拜超巨巨
    yasonyyx
        7
    yasonyyx  
       2014-12-31 10:44:19 +08:00
    膜拜超巨巨
    msg7086
        8
    msg7086  
       2014-12-31 10:57:09 +08:00
    本来想说些什么,结果看到楼上两楼,顿时吓得躲到角落里去了。
    levn
        9
    levn  
       2014-12-31 11:00:46 +08:00
    一般说的应该是指“动态类型语言”,相对于“静态类型语言”

    其实它就像是一种类型信息上的延迟绑定
    zts1993
        10
    zts1993  
       2014-12-31 11:02:50 +08:00
    F5即可见,,这是用PHP的唯一理由,弥补了没有静态检查的缺憾。2333333
    fooevr
        11
    fooevr  
       2014-12-31 11:03:51 +08:00
    @tini8 思维不受束缚之后带来的问题恐怕难让你把精力放在产品本身上,之后一个版本的产品除外。
    wangxiaoxiao
        12
    wangxiaoxiao  
    OP
       2014-12-31 11:26:28 +08:00
    @cancan 求不要黑~菜菜的~

    @levn 动态类型的确写起来比较爽,但是我想问的是“运行时可以改变其结构”,这一点开发的时候怎么用到呢?
    ffffwh
        13
    ffffwh  
       2014-12-31 11:39:58 +08:00 via Android
    原始的lambda calculus是图灵完全的。
    加上类型限制,simple typed lambda calculus就要引入额外的递归操作符。
    可见类型对表达能力的限制。
    laoyuan
        14
    laoyuan  
       2014-12-31 12:15:16 +08:00
    以PHP为例,我朴素的认为 $$x 和 $x() 都算是动态吧,变量名和函数名可以是变量
    kmvan
        15
    kmvan  
       2014-12-31 12:19:35 +08:00
    @laoyuan 以PHP为例,我朴素的认为 $$x 和 $x() 都算是动态吧,变量名和函数名可以是变量
    没错,PHP中 $$x 这种变量叫“可变变量”,非常实用的技巧。
    spacewander
        16
    spacewander  
       2014-12-31 12:24:07 +08:00
    @wangxiaoxiao 有空可以看一下《Ruby元编程》。虽然是讲Ruby的,但是用Python或者Javascript也可以实现。
    spacewander
        17
    spacewander  
       2014-12-31 12:27:09 +08:00
    用Python实现了一个动态添加方法的例子,虽然没有结合什么业务逻辑
    LZ可以看一下:
    http://paste.ubuntu.com/9649012/
    laoyuan
        18
    laoyuan  
       2014-12-31 13:08:26 +08:00
    @kmvan
    PHP 如果不使用 eval 运行动态生成的函数(安全起见),是不是只有把字符串存一个 php 文件然后include?
    pertersonvv
        19
    pertersonvv  
       2014-12-31 13:12:23 +08:00
    弱类型,动态绑定?
    kmvan
        20
    kmvan  
       2014-12-31 13:31:56 +08:00
    @laoyuan PHP 如果不使用 eval 运行动态生成的函数(安全起见),是不是只有把字符串存一个 php 文件然后include?
    不一定啊,你可以把字符串存成 txt 文件,然后再include也行。或者存成 exe 文件也能解析。
    jseanj
        21
    jseanj  
       2014-12-31 13:32:51 +08:00
    膜拜超菊苣
    nine
        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
    wangxiaoxiao
        23
    wangxiaoxiao  
    OP
       2015-01-01 11:03:09 +08:00
    @nine 赞回复,虽然看的不是很懂:D
    java中也有反射可以根据某个类型来生成一个对象或者运行某个方法~
    nine
        24
    nine  
       2015-01-01 11:58:49 +08:00
    @wangxiaoxiao 最核心的应该是“打开类”了
    《Ruby元编程》第一章讲的就是这个,当时看到的时候表示惊呆了。
    程序在运行的过程中,class都有可能被改的面目全非,这在其他语言里是不可思议的。这也就是你说的“运行改变结构”。

    -------------------
    维基百科上这样介绍动态语言
    它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化
    a528518960
        25
    a528518960  
       2019-02-28 15:34:17 +08:00
    我就是用 python 来做了一个运行起来,不用停,不用重启,可以直接改变逻辑代码的程序,不知道这个算不算是运行时改变结构
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:00 · PVG 05:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.