【问题标题】:Why is Perl commonly used for writing CGI scripts?为什么 Perl 常用于编写 CGI 脚本?
【发布时间】:2010-05-23 00:29:51
【问题描述】:

我计划为我的站点添加一个更好的搜索功能,所以我想我会用 C 语言编写它并使用 CGI 作为访问它的一种方式。但就基于 CGI 的东西而言,Perl 似乎是最流行的语言。这是为什么?用 C 或机器代码编程不是更快吗?

用脚本语言编写它有什么好处(如果有的话)?

谢谢。

【问题讨论】:

标签: perl search performance cgi


【解决方案1】:

在 CGI 变得流行的那一天,Perl 是最容易使用的语言。人们可以很快学会“baby Perl”,而且由于程序是一个文本文件,他们可以很容易地上传它并传递它。自从 Perl 开始作为一种系统管理语言以来,许多服务器已经安装了它。当需要在一些托管服务上制作 CGI 脚本时,Perl 很可能已经在那里了。不仅如此,Perl 脚本在任何平台上都几乎相同,因此您在本地编写的内容很可能在不同的机器上完全一样。

为“偶然的程序员”在大计划中编程更快,因为他们在编写有用的程序之前需要学习的东西更少;他们可以白手起家,一个小时内就可以运行一个 Perl 程序,即使他们只是在推销它。他们不必担心编写和编译 C 程序,然后将其转移到另一台主机(可能是不同的平台)所带来的所有事情。

Perl 很快站稳了脚跟,今天你仍然可以看到它的影响。如果 Perl 今天必须从头开始,我认为它不一定会胜过其他任何事情。 PHP 无疑已经占据了低端、快速启动的人群(对于他们中的大多数人来说,一开始它可能是正确的工具)。

Perl 有很多文本处理特性也没有什么坏处。有些人谈论 CPAN,但当 Perl 开始在 CGI 编程中受到关注时,它几乎不存在。

然而,Perl 对于 CGI 编程已经不像以前那么特别了。它仍然拥有它一直以来的所有伟大功能,但现在各种其他语言在功能、可用性和社区意识方面都赶上了。

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

【讨论】:

    【解决方案2】:

    安全,一方面。如果你用 C 语言编写,你必须非常小心,以确保你所有的字符串处理都是正确的,这样你就不会引入缓冲区溢出等。在任何体面的脚本语言中,其他人已经为你做了。您可能会有其他安全漏洞,但除非运行时或扩展模块中存在错误,否则您不会出现缓冲区溢出。这种好处不仅限于脚本语言; Java 和 C# 等编译语言也提供了它,并且可以在 C++ 中使用 std::string 和 C 中的良好字符串库获得它(尽管通常更困难)。

    在安全方面,Perl 有另一个在许多其他系统中没有的有用特性:“污点”模式。这可以防止您将用户输入作为数据库查询、命令行等的一部分盲目地传递给其他系统。这在编写 CGI 脚本时是一个极好的好处,因为您的脚本在将未经检查的用户输入传递给 shell 之前会彻底死掉。执行。污点模式并不完美,因为去污过程取决于程序员正确地做事,但它至少有助于捕捉你错过的代码路径。

    此外,在这一点上,Perl 已被用于 CGI 脚本编写很长时间,因此已经存在大量库、框架等,以使编写新脚本更容易。此外,CPAN 有代码可以做任何事情。

    【讨论】:

    • 虽然这些都是 Perl 的好特性,但我很少遇到因为这些特性而选择 Perl 的人。事实上,似乎很少有人使用污染模式或知道缓冲区是什么(更不用说溢出会做什么了)。
    • 我希望人们仅仅因为这些原因而考虑它——然而,上个月我有人给了我一个 shell 脚本并希望我将它公开为一个 CGI。 (污点检查?什么是什么?)
    • 您可以使用 Perl CGI 包装器来包装 shell 脚本。
    • 哦,相信我,我做到了……但这是一个更大项目的一部分,他们不会将我的许多 shell 脚本替换为“官方”版本……(不是全部都是 CGI ......但是文件中有一些 FTP 并且在没有验证的情况下盲目使用输入)......至少他们接受了我的更改,检查以确保在继续下一步之前完成 shell 命令,并且引用了所有参数(但我不知道如何确保 shell 中的参数中没有引号,所以它仍然是垃圾代码)
    【解决方案3】:

    好的,其余的答案给出了很好的客观理由。只是为了完整起见,这里是一个主观评价,给它一些颜色:

    我写道:

    • 纯 C 语言的 CGI 软件(为了钱,专业)。这包括创建整个 CGI 库(那是在 CGI 库可用之前的日子)。
    • 我自己在 Perl 中的 CGI 库
    • 使用 CPAN 的 Perl 中的 CGI 内容。

    基于这些经验,就“看看我做出的这个很酷的技术成就”的角度而言,纯C的最满意。尤其是在 CGI 焕然一新、静态 HTML 是无处不在的主要内容的时代。

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

    CPAN Perl 项目是唯一提供相当不错的交付周转时间的项目,让我可以专注于构建业务逻辑而不是管道。

    【讨论】:

      【解决方案4】:

      使用 Perl 的最大优势是CPAN

      【讨论】:

      • 哦,当然,现在都是关于 CPAN 的——但是在过去,每个人都从 Matt 的 Script Archive 中获得了他们的 Perl CGI。 (这不是一件好事,他们后来发现了)。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        字符串操作,通常是 Web 开发的很大一部分,在 C 语言中相当痛苦且容易出错,部分原因是缺乏自动内存管理。请记住,脚本执行时间通常不是瓶颈,也可以通过适当的缓存机制来规避。在许多情况下,最好选择一种能够最大限度地提高开发人员生产力的语言,而不是不必要地牺牲开发时间来获得网站用户不会注意到的性能提升。

        但是,此一般原则并不完全适用于您的情况,因为搜索引擎可能会从优化的低级代码中受益。但是,这并不意味着您必须在 C 中完成所有操作:众所周知,PHP 解释器的速度非常慢,但是由于大多数库函数都是用 C 实现的,因此您可以摆脱它。我建议使用您选择的高级语言编写应用程序,并且只使用 C 重新实现已被识别为瓶颈的部分。

        【讨论】:

          【解决方案7】:

          我认为使用脚本语言的好处是,大多数人使用高级动态语言比使用 C 语言效率更高。

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

          【讨论】:

            【解决方案8】:

            在 Web 早期发明 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)非常慢。

            【讨论】:

            • 从技术上讲,您的最后一段有点不确定——虽然我确信了解 CGI 是一种界面,而不是一种语言,您的写作使其他人很容易误解和混淆这两个术语。此外,由于重复的进程启动开销,缓慢是延迟。 CGI 的速度问题已通过两种主要方式得到解决:将动态语言解释器嵌入网络服务器(Apache + mod_php、mod_ruby 或 mod_perl)以及使用 FastCGI 或 SpeedyCGI 等 CGI 加速器。此外,PHP 脚本可以(并且正在)与 CGI 一起使用以提供 Web 内容。
            • PHP 经常作为 CGI 在托管服务提供商上运行
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-16
            • 2011-01-31
            • 1970-01-01
            • 1970-01-01
            • 2012-03-10
            相关资源
            最近更新 更多