30

真正知道如何利用动态编程语言的人与使用静态语言的人如何以不同的方式进行编程?

我熟悉关于静态与动态类型的整个辩论,但这不是我想要的。我想讨论在动态语言中实用但在静态语言中不实用的问题解决技术。

我见过的大多数用动态编程语言编写的代码与用静态编程语言编写的代码并没有太大区别。俗话说,你可以用任何语言写FORTRAN,很多人都这样做。但是有些人使用动态编程语言来解决问题,这种方式不容易转化为例如 C++。他们的一些技巧是什么?

有哪些很好的资源可以讨论如何使用动态编程语言?不是关于语言语法或 API 参考的书籍,而是关于利用动态语言功能解决问题的方法的资源。

编辑(2009 年 1 月 5 日):我很欣赏下面的答案,但它们似乎并没有解释动态语言倡导者所说的生产力的巨大提高。

4

15 回答 15

9

我喜欢苗条的回答。我确实在 Java 和 C++ 上花费了大量时间来制作 Python/Ruby 中免费的自定义数据结构。并制作专门的函数来处理这些自定义数据结构。是的,在 C++ 中,STL 非常好。是的,Java 中的泛型很好。它们有助于更快地创建自定义数据结构,但是它们仍然需要大量的思考和考虑。

然而,动态语言更容易使用还有一个更根本的原因。这是一个深刻的想法,称为鸭式打字。上面的一些评论提到了鸭子类型,但请花时间思考一下鸭子类型是什么。这是一种根本不同的看待世界的方式。与 Java 和 C++ 等语言不兼容的视图。

鸭子打字意味着您不会浪费时间来定义鸭子是什么。通过不必正式定义您的对象,您可以节省大量时间和精力。获得正确的定义很难。看看我的这篇博客文章,我在其中举了一些例子:正式定义没有你想象的那么有用

鸭子打字已被证明非常有用。XML 中的“必须忽略”原则使 XML 在 Web 上如此重要和有用。但这只是鸭子打字的一个例子。

表达鸭子打字的另一种方式是通过网络口头禅“严格发送,慷慨接受”。这也是一个非常基本的想法。

最后,你可能想回到我的一篇长博文,我解释了鸭子类型以及它与人工智能和建模等事物的关系:鸭子类型、人工智能和哲学

于 2009-04-09T04:15:45.683 回答
4

我通常发现自己利用动态编程语言的一种方法是简化和澄清语法。例如,如果我代表一个数据库,如果我可以在数据库对象上为其表动态加载属性和方法、为它们的列加载表和行等,我用于与之交互的语法会更清晰. 区别可能在于:

$row = $db->getTable('user')->getRow(27);
$row->setValue('name', 'Bob');

$row = $db->user->getRow(27);
$row->name = 'Bob';

当你做复杂的事情时,第二种形式的“视觉噪音节省”真的开始加起来。

于 2008-12-18T20:38:20.343 回答
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();

您不能在静态语言中执行此操作。动态语言可以更改对象以反映实际的运行时条件。

于 2009-02-05T20:07:47.940 回答
2

我现在不能引用这个(我的记忆力下降了),但我听说过一些类似的东西:

编程行业最接近灵丹妙药的是托管语言——让程序员不必担心内存管理的细节,让他们将更多的精力集中在解决手头的问题上。

所以,我可能会大胆猜测并说,与其说你的编程方式不同,不如说你可以将更多的大脑投入到“解决问题”而不是解决方案的实现细节上。

于 2009-10-14T15:01:07.080 回答
2

在动态语言中,我更具实验性。动态更改内容更容易,因此我可以更快地探索解决方案。

如果我知道自己想做什么,以及通常如何去做,我喜欢 C++。如果我不知道如何做我想做的事,并且可能不完全确定我想做什么,我更喜欢 Lisp。

于 2008-12-18T21:00:41.170 回答
2

它归结为我最喜欢的比率之一:我花多少时间思考解决问题,与我花多少时间思考我用来解决问题的工具。将其视为等效于 S/N 比。

使用鸭式语言(我认为这是最能帮助我提高生产力的因素),我只是能够花更多的时间思考我的问题及其解决方案(并编写专门解决这些问题的代码),我花更少的时间让语言工件保持直。

还有很多我不写的代码,包括声明,尤其是类型转换。

但这主要是让我的注意力集中在最佳位置。

于 2009-04-09T04:26:35.533 回答
2

快速迭代使程序员更快乐,而且它们的速度并不比交互式解释器快。良好的解释器开发可以同时为您提供沙盒、测试和原型设计。

但是,请注意通过排列进行编程。我个人的经验法则是,它只是因为它有效并不意味着它已经准备好,当你能解释它为什么有效时,它就已经准备好了。

于 2008-12-19T05:43:16.793 回答
2

我最大的收获是在数据库和对象(ORM)之间的映射。

如果没有类型的概念,那么将一行中的每一列分配给对象中的一个值就变得非常容易。当然,权衡是您认为存在的值类型与计算机执行的类型之间可能存在不匹配。

于 2009-01-05T20:40:58.657 回答
2

我认为最显着的差异是数据结构的选择。

在 Java 或 CI 中非常严格地定义结构或类。如果我需要添加一个属性,我会返回并更改定义。

在 Perl 中,我将只使用散列,并在编写代码时“发明”键。

于 2008-12-18T20:30:41.077 回答
1

约翰,根据您对 1/5/09 的更新编辑,您可能会发现AMOP是一本有趣的读物,而且您正在考虑更多内容。它非常以 lisp 为中心,但毕竟许多好的动态想法都是从那里开始的。因此,如果您可以享受(或克服)该方面,作者确实讨论了需要并用于执行此类操作的动态方面。这是非常强大的东西。

于 2009-04-09T04:31:47.517 回答
1

更多的库和更重要的更有用的库

我的猜测是,通常与动态语言相关的“Duck Typing”有助于显着简化代码并使编写通用代码更加容易。您不受严格的类层次结构的限制,因此能够更轻松地将来自不同库的组件组合在一起。

于 2009-01-05T20:58:51.663 回答
1

我没有具体的答案,只是一个建议:看看“ Ruby 中的设计模式”一书:它涵盖了大多数经典设计模式(à la Gamma 等人,等等)并表达了它们,相当简而言之,在 Ruby 中:)

于 2009-04-09T12:02:18.120 回答
1

阅读 Mark Jason Dominus 的“Higher Order Perl”。它只讨论了 Perl,但它确实提供了对 Perl 来说很自然的技术,而在大多数静态语言中却不那么自然。

All languages obviously have their strengths and weaknesses and dymanic vs static 

只是对语言进行分类的众多方法中的一种。我不会说动态语言作为一个整体比静态语言更好或更差。但我确实认为这本书非常擅长展示使用 Perl 解决问题的不同方法,这在大多数静态语言中会更加困难或不可能。

于 2009-11-26T01:54:49.827 回答
0

动态语言能够执行在运行时创建的代码。如果注入恶意代码,这是非常危险的。但是,如果您可以对环境进行消毒,则非常强大。

我认为 Javascript 人通过执行 JSON 文件来做到这一点。

于 2008-12-18T21:16:35.147 回答
0

对我来说是周转速度。我使用的动态语言(目前是 Python 和一点 JavaScript)都是解释型的。这意味着我可以随时尝试。如果我想看看 API 的某些部分是如何运行的,我可以在解释器上花几分钟时间。

如果我想用像 C# 这样的语言做同样的事情,我必须启动 VS,创建一个项目,然后编译它。如果我想测试我正在开发的更大软件的一部分,我可能必须编译它,这可能需要很长时间。幸运的是,在 .Net 中,我可以从 IronPython 的大项目中加载程序集,并获得一些与解释语言相同的好处(即快速测试 API 的不同部分)。

于 2009-10-14T15:15:25.780 回答