2010-05-23 34 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 )