【问题标题】:Can statically compiled languages replace scripting language?静态编译语言可以替代脚本语言吗?
【发布时间】:2010-11-18 01:14:46
【问题描述】:

假设你可以得到一个动态解释器;静态编译语言可以替代脚本语言吗?我从来没有完全理解why anyone would use a scripting language? 我在 PC 上谈论,而不是需要简单解释器的受限系统。我看到了一些 python 安装脚本,并看到了类似的 python 和 C# 解决问题的方法。那么为什么要使用脚本语言呢?

注意:对于 C#,有些事情困扰着我,我不是在问为什么不使用 C#。我在问为什么要使用脚本语言?我发现静态编译语言更容易调试,而且通常更容易编写代码。

【问题讨论】:

    标签: scripting static-language


    【解决方案1】:

    如今,编译和解释之间几乎没有区别。看看解释语言是如何执行的——第一步是将脚本转换成某种内部可执行形式,比如可以通过更简单的指令集执行的字节码。这本质上是编译成虚拟机格式。这正是现代编译语言所做的。而且,当编译语言部署在服务器端 Web 应用程序中时,它们甚至可以即时从源代码重新编译。所以在编译/执行技术方面几乎没有区别。

    唯一的区别在于指令集的细节,特别是类型系统。脚本语言通常(但不总是)是动态类型的。但是许多大型应用程序也是用动态类型语言编写的。同样,这里没有明显的区别。

    我个人认为静态类型远非“额外不必要的努力”(正如人们经常描述的那样)实际上是一个巨大的生产力助推器,这使得在第一次尝试时更容易正确地编写简短的 sn-ps,这要归功于智能感知/自动完成。为了强调这一点,看看微软是如何改进 jQuery 库的,只需向它添加静态类型信息(在特殊格式的 cmets 中),这样我们就可以在 IDE 中进行智能感知。

    与此同时,静态语言(包括 C# 和 Java)正在引入更多动态类型功能。

    所以我认为这些类别最终会合并,区分毫无意义。

    【讨论】:

    • C# 和 java 没有带来任何动态类型功能。从某种意义上说,Scala 支持一种鸭子类型,您不必创建一个用作类型的接口,而是说您希望拥有一个具有特定名称和类型的方法的类。确实,您可以通过仅传递顶级基础对象并在运行时检查内容来模拟静态类型语言上的动态类型,但您不能通过让解释器强制正确使用类型来反其道而行之.
    • 也许您想了解 C# 4.0。 (Java 7 中的 JVM 也将具有字节码中的动态方法调用指令,非常适合在 JVM 之上构建动态语言)。同样在我的实际答案中,我给出了将静态类型添加到 jQuery 中的示例,jQuery 是一种 JavaScript 库(一种动态语言)。
    • 静态类型没有添加到jQuery中,你说它是特殊格式的cmets,不会影响jQuery的运行时或编译时行为,只是静态分析。这是静态注释而不是静态类型。
    【解决方案2】:

    维基百科说脚本语言是一种控制其他软件的语言。您可以使用 C# 来做到这一点,但 Powershell 等真正的脚本语言是专门为此设计的。

    我倾向于认为脚本语言比 C# 更具“交互性”。使用脚本语言,您可以编写一两行代码,执行它并立即查看结果。这在 C# 中并不容易,您必须将代码放在控制台应用程序中,或者从单元测试中触发它,或者将其输入到没有智能感知的即时窗口中。

    这种快速的写入、执行周期允许使用脚本语言对完整的“脚本”进行快速原型设计,因为它可以为您提供每行代码的即时反馈。

    【讨论】:

    • C# 与脚本语言占用的行数不是差不多吗?当我移植我的一个 python 脚本时,实际的函数体几乎是相同数量的行。 (这取决于我是否想用(语句())填充一行)
    • @acidzombie24:如果不计算类结构、属性等的开销,那么是的,C# 使用的代码行数大致相同。
    • 这是一个很好的表达方式。编写类的定义与仅使用它。顺便说一句,现在(2010 年)我在即时窗口中看到了智能感知(使用 VS、C#。我假设 C++ 和其他 vs 语言也这样做)。 -edit- 和 +1
    【解决方案3】:

    当人们对各自的阵营充满热情时,这类问题往往会引发激烈的争吵。

    在过去的计算机时代,Unix 命令行工具和控制台 shell 提供了丰富的脚本环境,可以在其中完成各种处理。您不需要成为任何特定语言的专家程序员,并且可以使用管道结构将各种程序(其他人编写的)串在一起(双关语)来处理您的数据,这些数据主要是文本而不是二进制相关的。对批处理命令文件进行更改既快速又容易。在 Windows 的情况下,您不需要编辑、编译与外部静态或共享库/DLLS 链接的源文件。

    脚本通常没有的一件事是速度。您不会在脚本中编写设备驱动器和实时互联网交易 AI 系统。但是,如果您每天对通过电子邮件或 ftp 收到的某些数据运行一次脚本,您通常不会关心它需要多长时间,因为它无论如何都可以在后台运行。

    回到现在,水变得浑浊。一些脚本环境提供了一种加速工具,它们将读取您的脚本并几乎在模块中编译和链接,就像普通的 C++ 或 VB 程序可能用于加速目的一样。但这非常不确定,不能依赖。

    那么你如何选择走哪条路线。开始使用脚本执行任务。如果它运行得太慢或者您必须每 5 分钟执行一次操作,那么您的部分脚本可能会受益于用传统语言编写的部分,或者整个内容都可以用一种语言编写。

    喜欢任何涉猎和学习的东西

    【讨论】:

    • +1:除了真正的“计算机旧时代”早于 Unix 之外,事情要痛苦得多!
    • 是的。那些日子里,你把一叠打孔卡片放到一个小窗口里,然后潜伏在自动售货机附近,直到你的“奔跑”完成并打印出宽幅折叠纸。
    【解决方案4】:

    每个都用于不同的目的。用脚本语言编写的程序通常不是独立的;它们通常充当“胶水代码”或(正如罗伯特哈维提到的)自动化任务。您经常会发现嵌入在应用程序中的脚本语言解释器(参见 Blender 中的 Python;GIMP 中的 Guile、Perl 和 Python;无数不同浏览器中的 JS;无数游戏中的 Lua)。另一方面,编译语言用于生成自包含的应用程序。脚本大多是跨平台的;编译的应用程序通常不是。

    请注意,脚本语言不一定使用交互式解释器(例如 Perl),解释语言不一定用于脚本(例如使用 PyGame 制作的游戏)。另请注意,语言本身并没有使它们被解释或编译。您可以使用C# interpreterRuby compiler。有许多 Lisp 系统同时提供解释器和编译器。

    【讨论】:

      【解决方案5】:

      我将我的 shell (bash) 称为脚本语言,但我没有看到已编译的替代版本。

      我喜欢使用 scala,它是一种静态类型语言,带有类似解释器的 REPL 接口,由于类型干扰,它看起来很像脚本语言;看看这里:http://www.simplyscala.com/

      但它并不意味着像shell那样成为其他程序之间的粘合剂,所以对于那些很容易用手和眼睛验证的小作业,只需几行代码,我更喜欢使用shell .从一个目录跳转到另一个目录在 shell 中很舒服,提示符显示我在哪里。

      【讨论】:

      • 我并不是真的在谈论这个。当人们用脚本语言编写应用程序而不是做诸如移动文件、一次对列表进行排序等事情时,我想得更多。无论如何 +1 链接和推理
      【解决方案6】:

      在我们开始之前,我认为我从来没有遇到过不尝试就“获得”脚本语言的静态语言用户,包括我自己。这是一种不同的体验。

      所以没有。基本上,您可以向静态语言添加功能,使它们表面上看起来像脚本语言(如简单类型推断),但它不一样:

      1. 许多脚本语言用户讨厌静态语言。他们感到受限制。脚本语言通常非常擅长不妨碍用户,而静态语言为了速度/正确性而牺牲了这一点。

      2. Duck 类型不会出现在静态语言中。

      3. 脚本语言用户不喜欢类型注释。确实不可能为脚本语言提供类型推断系统,而现在一些语言中出现的简单类型推断仅适用于静态类型。

      4. 像猴子补丁这样的技术(在我看来这是一个非常糟糕的主意)在 Ruby 中无处不在,并且允许非常强大的技术,这些技术也不会很快在静态语言中可用。

      这并不是说尚未设计的语言无法以相对静态的方式处理脚本语言功能,但相对于根深蒂固的 Python/PHP/ 而言,它很难变得流行Perl/Ruby/Javascript 集。 Factor 是最接近的东西,AFAICT。

      将会发生的情况是,脚本语言的实现将通过使用 JIT 变得更快。

      【讨论】:

        【解决方案7】:

        螺丝刀可以代替锤子吗?不,因为您只是不将它们用于相同的目的。如果两者都存在,而且如果有这么多人使用其中之一,那一定是有原因的……

        相同的答案:

        • 类继承与原型;
        • 势在必行 vs oo;
        • 静态与动态类型;
        • 强类型与弱类型;
        • 手动内存管理与 GC;
        • C# 与 Java;
        • 蓝色与红色;
        • 男人对女人;
        • 蝙蝠侠 vs 超人(但我确实认为超人会赢……等等,有氪石……哦,伙计,我不知道……)

        等等……

        【讨论】:

          【解决方案8】:

          因为它是一种高级语言,编写起来更短,而且它不需要编译周期,这也使事情变得更短。

          【讨论】:

          • 见过 haXe 或 C# 编译器的速度吗?对于脚本大小的项目,它的速度非常快。运行时速度更快的好处。
          【解决方案9】:

          我在问为什么要使用脚本 语言?我发现静态编译 语言更容易调试和 通常更容易编码。

          因为我发现没有显式编译运行周期的松散类型动态语言更容易调试并且通常更容易编码。

          【讨论】:

          • 也许你应该试试scala,然后:simplyscala.com 没有明显的compile-run-cycle,但是在后台有。
          猜你喜欢
          • 1970-01-01
          • 2012-09-17
          • 2011-08-20
          • 1970-01-01
          • 2011-01-13
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2010-12-24
          相关资源
          最近更新 更多