真正懂得如何利用动态编程语言的人如何以与使用静态语言工作的人不同的方式处理编程?
我对静态与动态类型的整个争论很熟悉,但这不是我所得到的。我想讨论在动态语言中实用但在静态语言中不实用的问题解决技术。
我在动态编程语言中编写的大部分代码与用静态编程语言编写的代码差别不大。俗话说,你可以用任何语言写FORTRAN,很多人都这样做。但有些人使用动态编程语言以一种不易转换为C ++的方式解决问题。他们的一些技术是什么?
讨论如何使用动态编程语言的一些好资源是什么?不是关于语言语法或API参考的书籍,而是关于利用动态语言功能的问题解决方法的资源。
编辑(2009年1月5日):我很欣赏下面的答案,但它们似乎并没有说明动态语言倡导者所说的他们所经历的生产力的巨大提升。
答案 0 :(得分:9)
我喜欢苗条的回答。我在Java和C ++中花费了大量时间来制作Python / Ruby中免费的自定义数据结构。并制作专门的函数来处理这些自定义数据结构。是的,在C ++中,STL非常好。是的,Java中的泛型很好。它们有助于更快地创建自定义数据结构,但它们仍需要大量的思考和考虑。
然而,动态语言更容易使用有一个更基本的原因。这是一个深刻的想法,被称为鸭子打字。上面的一些评论涉及鸭子打字,但请花时间思考鸭子打字是什么。这是观察世界的根本不同的方式。与Java和C ++等语言不兼容的视图。
鸭子打字意味着你没有浪费时间来定义鸭子是什么。通过不必正式定义对象,您可以节省大量时间和精力。正确定义很难。看一下我的博客文章,我举例说明:Formal definitions are less useful than you think鸭子打字已证明非常有用。 "Must Ignore" principle in XML使XML在Web上如此重要和有用。但这只是鸭子打字的一个例子。
表达鸭子打字的另一种方式是通过网络口头禅“严格按照你所发送的内容,慷慨接受你所接受的”。这也是一个非常基本的想法。
最后,你可能想回到我的一篇长篇博文,在那里我解释鸭子打字以及它与AI和建模之类的关系:Duck Typing, Artificial Intelligence and Philosophy
答案 1 :(得分:4)
我通常发现自己利用动态编程语言的一种方法是简化和澄清语法。例如,如果我代表一个数据库,那么我用来与它进行交互的语法可以更加清晰,如果我可以在数据库对象上为其表,列的表和行动态加载属性和方法,等等。差异可能在:
之间$row = $db->getTable('user')->getRow(27);
$row->setValue('name', 'Bob');
和
$row = $db->user->getRow(27);
$row->name = 'Bob';
当你做复杂的事情时,第二种形式的“视觉噪音节省”真的开始增加。
答案 2 :(得分:3)
动态语言可以在运行时更改对象,您可以添加方法,属性......
动态语言魔术的一个很好的例子是这个Groovy代码片段,它只用两行代码调用web服务上的方法:
def proxy = new SoapClient("http://localhost:6980/MathServiceInterface?wsdl");
def result = proxy.add(1.0, 2.0);
这是另一个从XML中提取数据的Groovy代码段:
def contacts = new XmlParser().parseText("<contacts><name>Bahaa Zaid</name></contacts>");
def myName = contacts.name[0].text();
您不能在静态语言中执行此操作。动态语言可以更改对象以反映实际的运行时条件。
答案 3 :(得分:2)
我认为数据结构选择中最显着的差异。
在Java或C中,我非常严格地定义结构或类。如果我需要添加属性,我会返回并更改定义。
在Perl中,我只使用哈希,并在编码时使用“发明”键。
答案 4 :(得分:2)
在动态语言中,我更具实验性。随时更改内容更容易,因此我可以更快地探索解决方案。
如果我知道我想做什么,以及一般如何做,我喜欢C ++。如果我不知道如何做我想做的事情,并且可能不完全确定我想做什么,我更喜欢Lisp。
答案 5 :(得分:2)
快速迭代使程序员更快乐,而且他们的速度并不比交互式解释器快。良好的口译服务可以同时为您提供沙箱,测试和原型设计。
但要注意通过排列进行编程。我个人的经验法则是,它只是因为它起作用并不意味着它已经准备就绪,当你可以解释为什么它已经准备好了。
答案 6 :(得分:2)
我最大的收获是数据库和对象(ORM)之间的映射。
如果没有类型的概念,则很容易说将一行中的每一列分配给对象中的值。当然,权衡的是,您认为存在的价值类型与计算机的类型之间可能存在不匹配。
答案 7 :(得分:2)
归结为我最喜欢的一个比例:我花了多少时间考虑解决问题,花了多少时间考虑我用来解决问题的工具。可以认为它等同于S / N比率。
使用鸭子打字语言(我认为这是最能帮助我提高工作效率的因素),我可以花更多时间思考我的问题及其解决方案(并编写具体解决这些问题的代码),而且我花更少的时间来保持语言文物。
然后有很多我不写的代码,涉及声明,尤其是类型转换。
但它主要是把我的注意力集中在最佳位置。
答案 8 :(得分:2)
我现在不能引用这个(我的记忆让我失望),但我听到了以下内容:
最接近编程行业的是银弹 托管语言 - 让程序员不必担心 内存管理的细节,让他们集中精力 解决手头的问题。
所以,我可能冒昧地猜测,并不是说你用以不同的方式编程,而是你可以将更多的大脑用于“解决问题”,而不是解决方案的实施细节。
答案 9 :(得分:1)
更多库和更重要的更多可用库。
我的猜测是,通常与动态语言相关联的“Duck Typing”有助于显着简化代码,并使编写通用代码变得更加容易。您不受严格的类层次结构约束,因此能够更容易地组合来自不同库的组件。
答案 10 :(得分:1)
John,根据您对1/5/09的更新编辑,您可能会发现AMOP一个有趣的读物,以及您正在考虑的更多内容。它是以lisp为中心的,但毕竟许多好的动态想法始于那里。因此,如果您可以欣赏(或过去)这一方面,作者会讨论所需的动态方面并用于做这样的事情。这是非常强大的东西。
答案 11 :(得分:1)
我没有具体的答案,只是一个建议:看一下“Design patterns in Ruby”这本书:它涵盖了大多数经典设计模式(例如Gamma等人等)和在Ruby中非常简洁地表达它们:)
答案 12 :(得分:1)
阅读Mark Jason Dominus的“高阶Perl”。它只讨论了Perl,但它确实提供了Perl自然的技术,这些技术在大多数静态语言中都不太自然。
All languages obviously have their strengths and weaknesses and dymanic vs static
只是分类语言的众多方法之一。我不认为动态语言作为一个整体比静态语言更好或更差。但我确实认为这本书是 非常善于展示使用Perl处理问题的不同方法 在大多数静态语言中很难或不可能。
答案 13 :(得分:0)
动态语言能够执行在运行时创建的代码。如果注入恶意代码,这将非常危险。但如果你能消毒环境,那就非常强大。
我认为Javascript人员通过执行JSON文件来实现这一点。
答案 14 :(得分:0)
对我来说,这是转机速度。我使用的动态语言(目前是Python和一些JavaScript)被解释。这意味着我可以即时尝试。如果我想看看API的某些行为如何,我可以在解释器上劈开几分钟。
如果我想用C#这样的语言做同样的事情,我必须启动VS,制作一个项目,然后编译它。如果我想测试我正在研究的更大软件的一部分,我可能需要编译它,这可能需要很长时间。幸运的是,在.Net中,我可以从IronPython中的大项目中加载程序集,并获得解释语言的一些相同的好处(即快速测试API的不同部分)。