可能的重复:
对动态语言的热爱有什么用
我已经读过这个,但我不明白。
制作自己的解释器有什么用。此外,它表示平台独立性。毕竟,平台独立性受到解释器可以运行的所有平台的限制。所以,我看不出有什么优势。
另外,我什至不知道动态类型的一种很好的用途。我觉得没用。当然,我错了,因为那里有很多动态类型的语言。
有人可以帮我吗?谢谢。
可能的重复:
对动态语言的热爱有什么用
我已经读过这个,但我不明白。
制作自己的解释器有什么用。此外,它表示平台独立性。毕竟,平台独立性受到解释器可以运行的所有平台的限制。所以,我看不出有什么优势。
另外,我什至不知道动态类型的一种很好的用途。我觉得没用。当然,我错了,因为那里有很多动态类型的语言。
有人可以帮我吗?谢谢。
动态语言对于简单的事情非常方便。假设您想编写一个在两个文件之间进行区分的小程序。在 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 和接口要容易得多。
制作自己的解释器有什么用。此外,它表示平台独立性。毕竟,平台独立性受到解释器可以运行的所有平台的限制。所以,我看不出有什么优势。
好吧,您使用已经存在的语言编写解释器。因此,如果您选择在多种平台(例如 Python)上运行的一个,那么在任何这些平台上,有人可以获取您的解释器并使用它。因此,例如,如果您在 Windows 上编写解释器,我可以在 Linux 上运行相同的解释器,它会继续工作。
但是,如果您编写了一个编译器,那么您自己就必须为每个平台编写代码生成器。因此,例如,如果您编写了编译器以使其在 Windows 上运行良好,那么当我尝试在 Linux 上运行它时,它会为 Windows 而不是 Linux 生成代码,所以它不会工作。你需要做一些额外的工作,为 Linux 添加一个代码生成器,然后我才能使用它。
另外,我什至不知道动态类型的一种很好的用途。我觉得没用。当然,我错了,因为那里有很多动态类型的语言。
我认为动态语言流行有两个原因。
首先,它们更容易编写。类型系统需要额外的工作才能正确。
其次,由于动态语言用户不需要了解(静态)类型系统,许多人发现动态语言更易于使用。这么多人喜欢他们。
此外,类型语言背后的理论在过去十年中确实得到了改进。它们更加灵活和强大。因此,较旧的类型化语言不太灵活,而且类型化语言通常仍以僵化着称。
对我来说,它的快速原型设计。尽管这些天我一直在深入研究“严肃”的 Python,但我主要是用它来敲定我后来用 C 重写的概念。我相信是 Minix 的作者宣扬了大多数 C 程序通常作为 shell 脚本诞生(没有双关语)。
我将 PHP 用于 Web 应用程序,以及与数据库进行严肃业务的原型设计服务,一旦我有一个我满意的概念,这些服务也会在 C 中重新完成。
正如我所说,我开始更加信任 Python(以及我使用它的技能),所以一些在 Python 中诞生的东西将保持这种状态。但这对我来说是偶然的,我只是简单地提到它,以免惹恼 Python 爱好者 :)
另一点是,这真的取决于语言。动态类型语言提供了一个非常诱人的快速开发承诺,这对于许多需要启动和运行复杂的基于 Web 的应用程序的人来说至关重要。
除了少数例外,如果我要写一些绝对是任务关键的东西,我会选择 C 或 C++,尤其是在时间/时机至关重要的地方。
编写解释器比编写编译器更容易。(通常)要编写的代码更少。
要以一种语言执行程序,您需要 (1) 阅读源代码,以便可以以某种内部格式(通常是树)来表示它,并且您需要 (2) 一个运行时系统。无论您使用编译器还是解释器,都需要这些东西。
如果您为您的语言编写解释器,则添加实际执行步骤相当容易。如果您只是执行程序的树表示,则不需要太多代码。(但它会比其他方法慢得多。)
对于编译器,您需要(通常)翻译成完全不同的语言,并且(通常)还需要插入用于管理程序流和资源的基础设施。这是更多的工作。
交互式外壳是解释语言的一个优点。这允许在编写代码时对其进行评估和测试。“只写一些代码”比使用期望您编写整个程序然后先编译它的语言要快得多。在代码行上,差异可能不是很大,但开发过程不同。
您不必在解释和编译之间进行选择。一些语言既有解释实现也有编译实现,例如 Python/Jython/IronPython。这允许解释器的开发优势以及虚拟机 (JRE/CLR) 的性能和可移植性优势。
wikipedia 谈论的优势是语言实现者的优势,而不是语言用户的优势。对于语言用户来说,最重要的缺点是解释代码的执行速度较慢。一个优点是代码可以立即执行:您不必等待编译完成。如果您有一个快速且增量的编译器(例如 Lisp 编译器、F# 交互式),这并不是一个真正的优势。编译然后执行比解释运行超过几毫秒的代码要快。如果您的代码花费的时间少于此时间,那么无论哪种方式都感觉很即时。
完全有可能在编译语言中拥有动态类型、REPL、动态范围、评估和自动内存管理。例如,C# 具有动态类型和自动内存管理,F# 和 OCaml 具有 REPL、自动内存管理,而 Lisp 具有上述所有功能。