为什么很多网络语言是解释型而不是编译型?

35

为什么像C这样的语言没有被用于Web开发?编译带来的速度提升对于重负载网站肯定是有用的,但为什么没有应用呢?

15个回答

27

另一个好处在于,在大型服务器上,执行速度并不像连接速度那样重要。大部分时间都花费在发送和接收数据上,而不是进行大量的计算。实际上,在某些需要大量计算的网络服务中,这些繁重的计算可能已经作为编译程序运行。

此外,解释性语言无需编译(在大型项目中可能需要耗费时间),因此更适合 web 解决方案的通常敏捷开发。


你需要重新编译多少次以及在此之后需要重新编译哪些依赖项,这是决定编译时间的因素。脚本语言的动态重新编译方面并不是独特的,它只是编译过程非常细粒度的实现。 - John Leidegren

25

大多数网络应用程序与数据库通信。这些应用程序中绝大部分时间都在与数据库通信。因此,对于任何给定的请求,应用程序服务器中只有极少量的处理时间,然后就会长时间等待数据库响应。由于任何请求中实际应用程序服务器代码的百分比非常小,通过使用C/C++编写代码来优化该代码只能获得微小的、可能不明显的响应时间改善。

因此,与其专注于C/C++并节省每一个CPU周期,还不如关注开发人员的生产力。开发人员非常昂贵。他们通常在脚本语言甚至Java中比在C/C++中更具生产力。

当然,也有例外情况。如果您的应用程序某些请求需要消耗大量CPU或内存,则应使用C/C++编写它们。但是,对于您应用程序的其他部分,更好的做法是关注算法、数据结构、与数据库的通信和开发人员生产力的优化,而不是关注语言的优化。


1
非常好的答案,特别是提到了异常处理。 - Android Eve

14

脚本语言相较于C语言具有以下优势:

  1. 开发速度更快
  2. 现今,所有与此问题相关的脚本语言都是实时编译的。在某些情况下,这会使它们比等效的C程序更快,因此性能就不再是一个问题。
  3. 维护成本大大降低
  4. 可以使用敏捷方法(如单元测试)进行开发,从而得到更好的代码。当然,你也可以在C语言中做到这一点,但那需要更多的工作量。
  5. 在Web开发中,你有巨大的框架可以为你完成大部分工作。
  6. 它们更容易接受改变。一个新功能可能只需要几分钟的时间就能实现。
  7. 如果出现问题,你可以登录服务器,在控制台上启动文本编辑器并修复问题,有时无需重新启动。

3
Much faster development”?我不太同意。这真的取决于“谁”。对我来说,用C ++、Java甚至C开发比使用任何脚本语言都要快得多。 - Android Eve
4
我说的是两个技能相当的开发者。当然,有经验的C++开发人员比脚本新手更快,但在BASH中启动带IO重定向的进程只需要一行代码; 在C语言中,这可能需要10到100行,这取决于你可能需要使用的库。 - Aaron Digulla

11

早期网页应用程序使用C语言 - 我曾经写过各种CGI脚本。

然而,随着时间的推移,更高效的语言(比如C#和Java,当然不仅限于这些)已被证明对于网络应用程序来说“足够高效”。请注意,C#和Java都编译为中间代码,然后JIT编译,实现“大致”原生代码性能。那么我们为什么要使用C呢?

即使传统上“真正解释”的语言(例如PHP)这些天也通常在执行时编译,就我所知。(我对PHP的了解是所有二手的。也许它一直被编译...同样我确定仍有一些网络平台始终是解释的。)


9

最初,后端代码(我想这就是你所说的)中的许多工作都是与文本相关的。他们要么直接从头构建页面,要么通过将数据库中的数据与模板组合来构建页面。

C语言并不总是适合文本处理。C字符串非常基础,虽然在C中进行文本处理当然可以执行得很快,但通常需要更长时间的开发,并且需要比一些更加方便的语言具有更深入的技能才能正确地完成。


对于“C并不总是适合文本处理”这个委婉用语点赞+1。 - MauganRa

9
很好的问题。原因基本上是由于Web的演变。将其分为以下步骤来思考:
1)在“网上”的基本文本-> 2)添加了一些“标记”到文本中-> 3)形成了“center”标记和“marquee”标记!进步了!-> 4)客户端脚本!5)->嗯...服务器端脚本!
虽然我制定这个答案有点傻,但这确实是真的。互联网,特别是“Web”,是一个惊人的进化过程。实际上,更强大的语言(和更高效的语言)的需求只是最近的事情。
此外,请看工具。我用记事本(和其他一些简单的应用程序)做PHP。当我第一次进行Web开发时,我的计算机没有足够的硬盘空间支持Visual Studio 2008:)
不过要注意:已经有“.exe”应用程序存在(我认为“SunBiz”发布了一个'exe'),而且一些编译的cgi应用程序也已经存在一段时间了,但它们数量较少。

9
值得一提的是,大多数脚本语言(如Python、Ruby等)与C语言之间的桥接非常容易,几乎可以说是微不足道的。(我刚为一个Python程序编写了一些C扩展,并对其易用性感到印象深刻。)如果一个网站/网络应用由于使用“慢速”脚本语言而存在一些瓶颈,通常可以使用更快的语言(如C语言)编写性能关键部分。事实上,像Google搜索、Facebook等大型应用程序都是这样做的——他们用脚本语言编写界面,用其他语言(如C语言)来完成重要的任务。

好的信息 - 像Google搜索、Facebook等大型应用程序一样,它们使用脚本语言编写接口,并使用其他语言(如C)来完成重要任务。+1。 - RBT

7

这主要是因为它们快速且易于随时更改。编译语言需要与服务器匹配的开发环境。使用脚本,您可以使用FTP工具直接编辑文本,然后保存。从任何计算机或操作系统类型进行此操作的能力已经多次拯救了我的生命(或者正确地说是我的网站的生命)。


7
尝试在C、Perl或PHP中进行一些字符串解析/操作,你就会知道。
顺便说一下:为什么有这么多人声称性能已经不再是问题了?对于小型主页/博客可能不是问题,但大规模的Web应用程序仍然需要调整性能(CPU/网络/内存),无论它们是用Java、PHP还是Ruby编写的。

你需要是一个相当庞大的运营机构,才能使重度代码优化得到回报 - 当另一种选择只是向集群添加另一个服务器时。如果你是谷歌或亚马逊,那么肯定,快10%的代码可以释放数千个CPU。 - slim
我的一个朋友有一个电话簿和其他短字符串的搜索引擎。他使用SSE3指令来强制比较每个核心16个字符串。在桌面上,300万个字符串可以在亚秒时间内完成,并生成带有dB适应度的结果表!这不能在PHP中完成。只能用C或者noware实现! - Guge
字符串操作和验证是Web开发中最重要的功能之一。开箱即用,更易于使用和清晰明了。您可以使用PHP开发整个服务器应用程序,然后使用/创建一些C库来实现特定的性能功能。这不是非黑即白的。 - Heroselohim

2
所以,与其专注于C/C++并节省每一个CPU周期,更有意义的是关注开发人员的生产力。开发人员非常昂贵。而且,他们在脚本语言甚至Java中的生产力通常比在C/C++中高得多。
哦,非常正确。如果使用更动态的语言可以缩短一个开发者的工作时间表,则您无需支付这一周的程序员时间,将可以为您购买一台额外的服务器。如果您喜欢许多便宜的服务器而不是少量的大型服务器,则可能甚至会购买多个服务器。
对于世界上的大多数人(即不包括Google / Amazon / eBay等),一个额外的服务器将更加弥补由语言选择可能导致的任何原始性能损失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接