2

可能的重复:
对动态语言的热爱有什么用

我已经读过这个,但我不明白。

制作自己的解释器有什么用。此外,它表示平台独立性。毕竟,平台独立性受到解释器可以运行的所有平台的限制。所以,我看不出有什么优势。

另外,我什至不知道动态类型的一种很好的用途。我觉得没用。当然,我错了,因为那里有很多动态类型的语言。

有人可以帮我吗?谢谢。

4

6 回答 6

2

动态语言对于简单的事情非常方便。假设您想编写一个在两个文件之间进行区分的小程序。在 python 中,你要做的是:

file1 = open(<filename>)
file1.read()
file1.split('\n')
#same for file2
for line in file1:
    if line not in file2:
         print line

所以file1将从FD开始。然后它变成一个字符串。最后是一份清单。相同的 9 代码程序在 java 上将占用至少两倍的行数。

当您想编写非常大的程序并在团队中工作时,麻烦就开始了。在 java 中管理 API 和接口要容易得多。

于 2009-10-31T11:58:02.750 回答
1

制作自己的解释器有什么用。此外,它表示平台独立性。毕竟,平台独立性受到解释器可以运行的所有平台的限制。所以,我看不出有什么优势。

好吧,您使用已经存在的语言编写解释器。因此,如果您选择在多种平台(例如 Python)上运行的一个,那么在任何这些平台上,有人可以获取您的解释器并使用它。因此,例如,如果您在 Windows 上编写解释器,我可以在 Linux 上运行相同的解释器,它会继续工作。

但是,如果您编写了一个编译器,那么您自己就必须为每个平台编写代码生成器。因此,例如,如果您编写了编译器以使其在 Windows 上运行良好,那么当我尝试在 Linux 上运行它时,它会为 Windows 而不是 Linux 生成代码,所以它不会工作。你需要做一些额外的工作,为 Linux 添加一个代码生成器,然后我才能使用它。

另外,我什至不知道动态类型的一种很好的用途。我觉得没用。当然,我错了,因为那里有很多动态类型的语言。

我认为动态语言流行有两个原因。

首先,它们更容易编写。类型系统需要额外的工作才能正确。

其次,由于动态语言用户不需要了解(静态)类型系统,许多人发现动态语言更易于使用。这么多人喜欢他们。

此外,类型语言背后的理论在过去十年中确实得到了改进。它们更加灵活和强大。因此,较旧的类型化语言不太灵活,而且类型化语言通常仍以僵化着称。

于 2009-10-31T14:48:51.610 回答
0

对我来说,它的快速原型设计。尽管这些天我一直在深入研究“严肃”的 Python,但我主要是用它来敲定我后来用 C 重写的概念。我相信是 Minix 的作者宣扬了大多数 C 程序通常作为 shell 脚本诞生(没有双关语)。

我将 PHP 用于 Web 应用程序,以及与数据库进行严肃业务的原型设计服务,一旦我有一个我满意的概念,这些服务也会在 C 中重新完成。

正如我所说,我开始更加信任 Python(以及我使用它的技能),所以一些在 Python 中诞生的东西将保持这种状态。但这对我来说是偶然的,我只是简单地提到它,以免惹恼 Python 爱好者 :)

另一点是,这真的取决于语言。动态类型语言提供了一个非常诱人的快速开发承诺,这对于许多需要启动和运行复杂的基于 Web 的应用程序的人来说至关重要。

除了少数例外,如果我要写一些绝对是任务关键的东西,我会选择 C ​​或 C++,尤其是在时间/时机至关重要的地方。

于 2009-10-31T12:00:56.190 回答
0

编写解释器比编写编译器更容易。(通常)要编写的代码更少。

要以一种语言执行程序,您需要 (1) 阅读源代码,以便可以以某种内部格式(通常是树)来表示它,并且您需要 (2) 一个运行时系统。无论您使用编译器还是解释器,都需要这些东西。

如果您为您的语言编写解释器,则添加实际执行步骤相当容易。如果您只是执行程序的树表示,则不需要太多代码。(但它比其他方法慢得多。)

对于编译器,您需要(通常)翻译成完全不同的语言,并且(通常)还需要插入用于管理程序流和资源的基础设施。这是更多的工作。

于 2009-10-31T12:10:34.783 回答
0

交互式外壳是解释语言的一个优点。这允许在编写代码时对其进行评估和测试。“只写一些代码”比使用期望您编写整个程序然后先编译它的语言要快得多。在代码行上,差异可能不是很大,但开发过程不同。

您不必在解释和编译之间进行选择。一些语言既有解释实现也有编译实现,例如 Python/Jython/IronPython。这允许解释器的开发优势以及虚拟机 (JRE/CLR) 的性能和可移植性优势。

于 2009-10-31T12:18:57.437 回答
0

wikipedia 谈论的优势是语言实现者的优势,而不是语言用户的优势。对于语言用户来说,最重要的缺点是解释代码的执行速度较慢。一个优点是代码可以立即执行:您不必等待编译完成。如果您有一个快速且增量的编译器(例如 Lisp 编译器、F# 交互式),这并不是一个真正的优势。编译然后执行比解释运行超过几毫秒的代码要快。如果您的代码花费的时间少于此时间,那么无论哪种方式都感觉很即时。

完全有可能在编译语言中拥有动态类型、REPL、动态范围、评估和自动内存管理。例如,C# 具有动态类型和自动内存管理,F# 和 OCaml 具有 REPL、自动内存管理,而 Lisp 具有上述所有功能。

于 2009-10-31T12:41:40.930 回答