2009-07-11 89 views

回答

16

perlcc其 「翻譯」 Perl來C.

這不是一個真正的Perl的C編譯器;它的輸出只不過是你的程序的Perl解釋器和解析字節碼的一束。

+2

perlcc和相應的B :: modules由Reini Urban單獨維護在CPAN上。 – 2009-07-12 08:03:12

+0

此時`B :: C`和`B :: CC`似乎都被打破了。 – 2018-02-09 21:44:48

9

答案將會非常「不」。 Perl是一種非常動態的語言。 C是靜態大小數據類型的語言。 Perl到C的任何翻譯都可能非常「重複地執行這個子例程調用來模擬Perl做什麼」。構建這樣一個翻譯器的意義不大,因爲它不可能比Perl更快地執行Perl。

+0

那麼,Perl有固定的數據類型,只是沒有那麼多。問題是Perl是動態的。它可以根據任意數量的因素進行不同的編譯,並且這可能會改變編譯器如何爲即將到來的源代碼工作。 – 2009-07-13 21:39:07

0

該轉換器被稱爲編程器,並且轉換過程編程。說真的,perl的語言本身非常龐大而強大,任何試圖編寫轉換器的人都會看不起終身任務。此外,績效改善的效果可能不是一個數量級,那爲什麼要麻煩呢?

2

我在Perl中編寫了一個非常大的程序,它基於HTML和數據庫查詢創建PDF,這些查詢實際上像瀏覽器一樣。總源代碼量超過1MB。程序評估HTML,創建SQL查詢和檢索數據,在磁盤上搜索圖像或從HTTP服務器下載圖像,構建文檔結構,進行所有佈局計算,並最終生成PDF。

我不得不找出如何以多種方式加速操作。基於這一點,我聲明Perl非常快,並且許多任務在Perl中快速成功地完成需要很長時間,甚至C++甚至C++。

有兩種方法可以讓Perl緩慢或消耗內存:大量複雜的數據結構 - 它們需要大量的內存 - 以及大量的計算。是的,Perl的計算確實很慢。一個簡單的術語,如

$a = $b * $c 

在Perl中非常耗時,但在任何編譯語言中都很快。這裏的操作數甚至可以是整數,而不是浮點變量 - 它很慢。我想這就是爲什麼在語言比賽比賽中Perl得分很差的原因[http://shootout.alioth.debian.org/](計算機語言基準遊戲)。

我發現我的漂亮的大型程序 - 它使用了很多Perl核心和附加的CPAN模塊 - 儘管被解釋了,但它可以快速啓動。

它的表現非常好......直到它涉及文本大小和佈局座標的計算。這非常耗時。說完這些之後,我寫了一些小的Perl測試程序,只是做了數百萬次的算術運算,發現它們非常慢。

此外,我使用和麪向對象的方法來模擬每個佈局元素。每個對象都由一個散列表示 - 每個對象至少約10kBytes。如果要打印的數據量很大,那麼對於該程序而言,幾百兆字節的內存消耗並不少見。

所以,我還是有一個很好的理由來移動部分計算佈局C,使用結構,我現在有固定鍵散列的且具有c-整數運算現在在哪裏perl做一個緩慢的工作。

但是其他一切都很快完成和測試,運行速度如此之快以至於我看不到任何更改的理由。我還發現Perl代碼比C代碼更方便編寫和測試。許多CPAN模塊提供的解決方案不一定要自己解決。其中許多都經過了充分的測試和記錄。

此相當lenghty dicussion後,我的結論是:如果是爲服務器或命令行程序,Perl的考慮。但是如果這個程序需要建立龐大的數據結構或者大量的算術運算,那麼就要更快地考慮一下。有時,它可能是一個用C編寫模塊的Perl程序。

1

有Perl到C的譯員,但沒有一個是完美的。理想情況下,你需要一個既正確又優雅的翻譯器。唉,你不能同時擁有這兩種簡單的Perl代碼,它不是簡單的C代碼,所以你必須有一個不是100%正確的翻譯,或者像Perl本身一樣複雜。這導致一些人相信你不應該嘗試翻譯Perl。更準確地說,你需要清楚你想從翻譯中獲得什麼,而不要期待奇蹟。

100%正確很簡單:如果您的Perl腳本是myperl.pl,那麼C程序void main(){system("perl myperl.pl")}將完全符合myperl.pl的要求;但這是毫無意義的。 perlcc編譯器稍微複雜一些,但似乎沒有多大好處。我沒有注意到perlcc比普通的Perl更快。另外,儘管Perl代碼可能非常難以閱讀,但我更喜歡print "Hello World\n"perlcc轉換成700行的怪物。我還沒有看到這些程序產生任何可以通過代碼審查以及編寫優雅C代碼的東西。 OTOH,如果你想要一個編譯器,因爲你不想以非混淆的方式分發你的源代碼,那麼perlcc可能會創造奇蹟。

RPerl可以實現速度提升,但它可以轉化是非常有限的。

爲小事「優雅但不正確」翻譯的例子,請參閱原型perl2c++.pl。這可以通過用C++替換(一些)標準的Perl-isms來實現。選擇C++是因爲它是像Perl這樣的高級語言,但仍共享與C相同的裸露金屬風格。在簡單LCG僞隨機數生成器LCG.pl的情況下,perl2c++.pl的輸出是乾淨的和簡潔的C++代碼,其運行速度比原始Perl快幾十倍,並且不依賴任何Perl庫。它可以擴展爲查找「如何在Perl上執行X」的所有標準答案,並將其替換爲「如何在C++中執行X」。然後,它可以成功翻譯許多簡單但真實世界的Perl腳本,並幫助人們將不重要的Perl軟件轉換爲優雅的C++代碼。如果你發現自己用Perl編寫數字軟件,而這本應該是用C++編寫的,那麼這將是最有用的。

對於適合Perl的軟件,但您只想更快一點,JavaScript(最終是Perl 6)使用的JIT方法更具有前景。