2010-05-23 89 views
5

我打算为我的网站添加更好的搜索功能,所以我认为我会用C编写它,并使用CGI作为访问它的手段。但是,当涉及到基于CGI的东西时,Perl似乎是最流行的语言。这是为什么?用C或机器代码编程会不会更快?为什么Perl通常用于编写CGI脚本?

有什么好处,如果有,写在脚本语言?

谢谢。

+0

可能的重复[有什么理由通过C#选择脚本语言?](http://stackoverflow.com/questions/1193912/what-are-reasons-to-choose-a-scripting-langu age-over-c) – Quentin 2010-05-23 00:31:41

+1

@David:这个问题似乎是专门针对Perl和C语言的CGI脚本。 – 2010-05-23 00:39:05

+0

虽然答案是一样的。 – Quentin 2010-05-23 08:21:15

回答

3

使用Perl的最大优势是CPAN

+4

哦,当然,*现在*这完全是关于CPAN的 - 但是回到当天,每个人都从Matt的Script Archive获得了他们的Perl CGI。 (这不是一件好事,他们后来发现)。 – Joe 2010-05-23 06:29:17

2

由于缺乏自动内存管理,字符串操作(通常是Web开发的一大部分)在C中相当痛苦且容易出错。请记住,脚本执行时间经常不是瓶颈,或者可以通过适当的缓存机制来绕过。在很多情况下,选择一种最大限度提高开发人员生产力的语言是一个不错的主意,而不是不必要地牺牲开发时间来提高性能,而这些性能会被网站用户忽视。

但是,这个一般原则并不适用于您的情况,因为搜索引擎可能会从优化的低级代码中获益。这并不意味着你必须用C语言来完成所有的事情:虽然PHP解释器已经非常慢,但是由于大多数库函数都是用C实现的,所以你可以避开它。我建议您使用您选择的高级语言编写应用程序,并且只能重新实现C中被识别为botlene的部分。

6

安全,一方面。如果你用C编写,你必须非常小心地确保你所有的字符串处理都是正确的,这样你才不会引入缓冲区溢出等等。在任何体面的脚本语言中,别人已经为你做了这些。您可能会有其他安全漏洞,但除非运行时或扩展模块中存在错误,否则不会有缓冲区溢出。这种好处不仅限于脚本语言,像Java和C#这样的编译语言也提供它,并且它可以在C++中用std::string和C获得(尽管通常更困难),并且C具有良好的字符串库。安全方面,Perl具有另一个在许多其他系统中看不到的有用特征:“污点”模式。这样可以避免盲目地将用户输入作为数据库查询,命令行等的一部分传递给其他系统。这在编写CGI脚本时非常有用,因为脚本在将未经检查的用户输入传递到shell执行。污染模式并不完美,因为未经处理的进程取决于程序员正确执行的操作,但它至少有助于捕捉错过的代码路径。

另外,在这一点上,Perl已经用于CGI脚本很长一段时间了,所以现在已经有大量的库,框架等来编写新脚本。 Plus CPAN的代码可以处理任何事情。

+1

尽管这些都是Perl的很好的特性,但我很少碰到任何选择Perl的人,因为他们。事实上,很少有人似乎甚至使用污点模式或知道什么是缓冲区(更不用说它会做什么溢出)。 – 2010-05-23 05:32:01

+1

我希望人们会考虑它只是出于这些原因 - 然而,我上个月有人给我一个shell脚本,并希望我将它公开为CGI。 (污点检查?什么是什么?) – Joe 2010-05-23 06:33:02

+0

尽管你可以用Perl CGI包装器来包装shell脚本。 – 2010-05-23 06:45:30

3

除了已经提到的答案之外,对于基本的Web应用程序而言,网络传输速度是比语言选择更常见的瓶颈。使用Perl编写Web应用程序通常比使用C编写应用程序更容易,因此运行时速度的小差异不值得创建应用程序所需的额外工作量。 C实际上有时用于计算密集型Web应用程序的某些部分。

4

好的,其余的答案给了很好的客观原因。只是为了完整性,这里是一个主观评价,给它点颜色:

我写道:

  • CGI软件在纯C(要钱,专业)。这包括创建整个CGI库(即在CGI库可用之前的那段时间)。使用CPAN我自己的
  • CGI库在Perl
  • CGI的东西在Perl。

基于这些经验,对于“看我这个很酷的技术成就”这个角度来说,纯C最让人满意。特别是在CGI品牌闪亮的时代,新的和静态的HTML是所有地方的主要内容。

由于其他答案中列出的所有客观原因,我自己的Perl CGI在技术上比C更容易。

而且CPAN的Perl项目是所提供相当不错的交付周转时间,让我集中精力构建业务逻辑,而不是管道的唯一部分。

19

回到CGI变得流行的那一天,Perl是最容易使用的语言。人们可以很快拿起“宝宝Perl”,由于该程序是一个文本文件,他们可以很容易地上传并传递它。由于Perl是作为一种系统管理语言开始的,许多服务器已经安装了它。在某些托管服务上制作CGI脚本时,Perl很可能已经在那里。不仅如此,Perl脚本在任何平台上都几乎相同,所以您在本地编写的内容很可能在另一台计算机上完全相同。

这是更快地在事物的大计划的“意外程序员”计划,因为他们有较少的学习,他们可以做一个有用的程序之前;他们可以从零开始,并在一个小时内运行一个Perl程序,即使它们仅仅是货物运输。他们不必担心编写和编译C程序所带来的所有问题,然后将其转移到另一台主机(这可能是一个不同的平台)。

Perl很快就立足了,你仍然可以看到今天的效果。如果Perl今天必须从头开始,我认为它不一定会胜过其他任何事情。 PHP肯定接管了低端,快速启动的群体(对于大多数人来说,它可能是最初的正确工具)。

它并没有伤害Perl也有很多文本处理功能。有些人谈论CPAN,但当Perl开始注意CGI编程时,这种情况几乎不存在。

但是,Perl并不像以前那样专门用于CGI编程。它仍然具有它始终存在的所有伟大事物,但是现在其他各种语言已经在功能,可用性和社区意识方面发挥了作用。

我在1994年开始编写CGI的东西,我仍然看到令人惊讶和令人难以置信的大多数框架都是如此。我真的希望我们当时有Seaside,因为你甚至从来不知道其他框架让你做的所有愚蠢的事情。如果我们都学习了Smalltalk,世界会变得多好。 :)

-2

当时CGI是在网络初期发明了回来,这是唯一的办法做任何形式的Web请求,如响应形式提交或点击图像映射的动态处理的。Web服务器软件本身只能提供静态内容,因此需要外部程序来处理交互式内容。

第一个网站管理员可能也是系统管理员,他们经常精通Perl。我记得第一个NCSA httpd服务器带有用Perl,C和shell编写的示例CGI程序。 shell脚本很快就被丢弃了,因为它们不安全,并且不适用于真正简短的CGI程序以外的任何其他应用程序。 C程序运行良好,但Perl更方便。

我的猜测是Perl的起飞作为事实上的标准语言与CGI使用有以下几个原因:

  • 系统管理员都熟悉它。
  • 快速,安全的库变得广泛可用; CGI.pm模块随Perl发布。
  • Perl提供了一个很好的速度和易于开发之间的妥协。

没有理由为什么要使用Perl;任何可以使用Unix环境变量的语言都是合适的。这就是说,CGI已经不受青睐,因为它相对于运行在Web服务器地址空间中的语言(如PHP)非常慢。

+4

从技术上说,你的最后一段有点不确定 - 虽然我确信*你明白CGI是一个接口而**不是**语言,你的写作很容易让别人误解和混淆这两个术语。而且,由于反复的启动开销,缓慢是等待时间。CGI的速度问题主要有两种方式:将动态语言解释器嵌入到网络服务器(Apache + mod_php,mod_ruby或mod_perl)中,并使用CGI加速器(如FastCGI或SpeedyCGI)。此外,PHP脚本可以(并且)与CGI一起使用来提供网页内容。 – daotoad 2010-05-23 06:39:43

+1

PHP经常作为主机提供商的CGI运行 – 2010-05-23 07:58:39

0

我认为受益于使用脚本语言,是最都更富有成效使用更高级别的动态语言比使用C.

很多人似乎担心速度,但实际上它通常很好......如果它确实成为问题,那么大多数脚本语言都有一个扩展机制,您可以在C中编写模块,并仍然在更高级的脚本语言中使用它们(如Perl中的XS或python中的c-api )