静态编译的语言可以替换脚本语言吗?

时间:2009-08-09 04:59:31

标签: scripting static-language

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

注意:有些事情让我烦恼C#,我不是在问为什么不用C#代替。我在问为什么要使用脚本语言?我发现静态编译语言更容易调试,并且通常更容易编码。

9 个答案:

答案 0 :(得分:5)

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

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

就我个人而言,我认为静态打字远非“额外不必要的努力”(因为它经常被描述)实际上是一个巨大的生产力助推器,使得在第一次尝试时正确编写短片段变得更加容易,这要归功于intellisense / autocompletion 。为了强调这一点,看看微软如何通过向它添加静态类型信息(在特殊格式的注释中)来改进jQuery库,这样我们就可以在IDE中进行智能感知。

与此同时,静态语言(包括C#和Java)带来了更多动态的打字功能。

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

答案 1 :(得分:3)

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

我倾向于用比C#更“互动”的术语来思考脚本语言。使用脚本语言,您可以编写一行或两行代码,执行它并立即查看结果。在C#中,这不是那么容易,你必须将你的代码放在一个控制台应用程序中,或者从一个单元测试中激活它,或者在你没有智能感知的立即窗口中输入它。

写入,执行的快速循环允许使用脚本语言快速原型化完整的“脚本”,因为它可以为您提供每行代码的即时反馈。

答案 2 :(得分:3)

这种问题经常引发火焰战争,因为人们对各自的阵营充满热情。

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

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

回到现在,水变得泥泞。一些脚本环境提供了一种加速工具,他们会读取你的脚本,几乎在模块中编译和链接,正常的C ++或VB程序可能用于速度目的。但这非常不可靠,不能依赖。

那么你如何选择去哪条路线呢?使用脚本开始执行任务。如果它运行得太慢或者你不得不每5分钟做一次,那么你的部分脚本可能会受到用传统语言编写的部分的好处,或者整个部分都可以用一种语言编写。

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

我会将我的shell(bash)称为脚本语言,并且我没有看到已编译的替换提交。

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

但它并不意味着它是shell之类的其他程序之间的粘合剂,因此对于可以通过手工和眼睛轻松验证的小作业,这只是几行代码,我更喜欢使用shell 。从一个目录跳到另一个目录在shell中是很舒服的,其中提示显示了我的位置。

答案 5 :(得分:1)

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

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

  1. 许多脚本语言用户讨厌静态语言。他们感到受限制。脚本语言通常非常善于不以用户的方式进入,这在静态语言中为了速度/正确性而牺牲。

  2. 鸭子打字不会以静态语言显示。

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

  4. 像猴子修补这样的技术(我认为这是一个非常糟糕的主意)在Ruby中很普遍,并且允许使用非常强大的技术,这些技术在静态语言中也不会很快就可用。

    < / LI>

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

    通过使用JIT,脚本语言实现会变得更快。

答案 6 :(得分:1)

螺丝刀可以更换锤子吗?不,因为你不是为了同一目的而使用它们。如果两者都存在,并且如果这么多人使用其中任何一个,那么必定有理由......

相同的anwser:

  • class inheritance vs prototype;
  • 命令与oo;
  • 静态与动态类型;
  • 强烈对弱的打字;
  • 手动内存管理与GC;
  • C#vs Java;
  • 蓝色vs红色;
  • 男人vs女人;
  • 蝙蝠侠与超人(但我认为超人会胜利......等等,有氪星石......噢,伙计,我不知道......)

等...

答案 7 :(得分:0)

因为它是一种更高级别的语言,所以它写得更短,并且它不需要编译周期,这也使事情更短。

答案 8 :(得分:0)

  

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

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