2009-07-11 30 views

Trả lời

16

perlcc mà "dịch" Perl để C.

Nó không thực sự là một Perl để biên dịch C; đầu ra của nó chỉ đơn giản là một gói của trình thông dịch Perl và bytecode được phân tích cú pháp của chương trình của bạn.

+2

perlcc và các mô-đun B :: tương ứng được duy trì riêng biệt trên CPAN bởi Reini Urban. –

+0

Cả hai 'B :: C' và' B :: CC' dường như bị hỏng tại thời điểm này. –

9

Câu trả lời sẽ khá "Không". Perl là một ngôn ngữ cực kỳ năng động. C là ngôn ngữ cho các kiểu dữ liệu có kích thước tĩnh. Bất kỳ bản dịch nào của Perl đến C có thể sẽ khá nhiều "thực hiện cuộc gọi chương trình con này để mô phỏng Perl làm gì" nhiều lần. Và có rất ít điểm trong việc xây dựng một dịch giả như vậy, vì nó không thể thực thi Perl nhanh hơn nhiều so với Perl.

+0

Vâng, Perl có các loại dữ liệu cố định, không phải là nhiều loại dữ liệu. Vấn đề là Perl là năng động. Nó có thể biên dịch khác nhau tùy thuộc vào bất kỳ số lượng các yếu tố, và có thể thay đổi cách trình biên dịch hoạt động cho mã nguồn sắp tới. –

26

Câu trả lời chính tắc cho điều này là MJD's "Why Not Translate Perl to C?".

+3

+1, tận hưởng huy hiệu chuyên gia Perl vàng của bạn. :) –

+0

-1, bài đăng blog cũ của MJD là từ năm 2001 và đã lỗi thời. Bạn sẽ không nhận được sự khác biệt với các chức năng xử lý chuỗi và các chuỗi khác, nhưng bạn sẽ thu được nhiều tiết kiệm bộ nhớ, thời gian khởi động, thời gian hủy và cũng có thời gian chạy cho int, float và esp. xử lý mảng, như MJD đã chỉ ra ở cuối bài đăng của anh ấy. Xem ví dụ http://blogs.perl.org/users/rurban/2012/10/optimizing-compiler-benchmarks-part-3.html để có điểm chuẩn nhanh hơn 6 lần với B :: CC được biên dịch perl. – rurban

+0

Thành thật mà nói tôi đã sống lại rằng những điều sau đây được nêu trong một bình luận, vì tôi biết rất khó nuốt. Sự thật khó khăn ... Perl là chậm như địa ngục, nhưng để công bằng vì vậy hầu hết các thông dịch viên, ngoại trừ lua. Bài đăng đó gây hiểu lầm và trả lời câu hỏi rất hẹp. Nếu bạn đã làm mọi điều không hiệu quả Perl của bạn hiện đang làm, nó vẫn sẽ được biên dịch cực kỳ chậm. Bây giờ nếu bạn bằng cách nào đó viết lại bằng tay ý nghĩa của những gì mã Perl của bạn hoàn thành, trong C/C++/OCAML/GO ... tất cả chúng ta đều biết rằng nó thực thi theo cấp số nhân nhanh hơn – TechZilla

0

Trình biến đổi được gọi là lập trình và quá trình chuyển đổi lập trình. Nghiêm túc, ngôn ngữ thích hợp của perl là rất lớn và mạnh mẽ, rằng bất cứ ai cố gắng viết một công cụ chuyển đổi sẽ nhìn xuống một nhiệm vụ suốt đời. Ngoài ra, hiệu quả trong cải thiện hiệu suất có thể không phải là một thứ tự độ lớn, vậy tại sao phải bận tâm?

2

Tôi đã viết một chương trình khá lớn trong Perl tạo PDF dựa trên các truy vấn HTML và cơ sở dữ liệu mà hầu như hoạt động như một trình duyệt. Tổng khối lượng mã nguồn là hơn 1MB. Các chương trình đánh giá HTML, tạo truy vấn SQL và truy xuất dữ liệu, tìm kiếm hình ảnh trên đĩa hoặc tải xuống từ máy chủ HTTP, xây dựng cấu trúc tài liệu, thực hiện tất cả tính toán bố cục và cuối cùng, tạo ra tệp PDF.

Tôi phải tìm hiểu cách tăng tốc hoạt động theo một số cách. Dựa trên đó tôi nói rằng Perl là khá nhanh, và nhiều nhiệm vụ hoàn thành nhanh chóng và thành công trong Perl mất một thời gian dài trong C, và thậm chí cả C++.

Có 2 cách để làm cho việc tiêu thụ chậm hoặc bộ nhớ của Perl: một số lượng lớn cấu trúc dữ liệu phức tạp - chúng cần rất nhiều bộ nhớ - và một số lượng lớn các phép tính. Có, tính toán thực sự là rất chậm trong Perl. Một thuật ngữ đơn giản như

$a = $b * $c 

khá tốn thời gian trong Perl, nhưng rất nhanh trong bất kỳ ngôn ngữ được biên dịch nào. Các toán hạng ở đây thậm chí có thể là số nguyên, không phải là các biến số dấu chấm động - nó chậm. Tôi đoán đây là lý do tại sao Perl có điểm khá tệ trong cuộc thi đấu tranh luân lưu ngôn ngữ [http://shootout.alioth.debian.org/] (Trò chơi điểm chuẩn ngôn ngữ máy tính).

Tôi đã tìm thấy chương trình khá lớn của mình - nó sử dụng nhiều lõi Perl và các mô-đun CPAN bổ sung cũng như để bắt đầu nhanh chóng, mặc dù được intepreted.

Nó hoạt động rất tốt ... cho đến khi tính toán kích thước văn bản và tọa độ bố cục. Thats rất tốn thời gian. Sau khi nói điều này, tôi đã viết các chương trình thử nghiệm Perl nhỏ chỉ làm hàng triệu phép tính số học và thấy chúng rất chậm.

Bên cạnh đó, tôi đang sử dụng và phương pháp tiếp cận hướng đối tượng để mô hình hóa từng phần tử bố cục. Mỗi đối tượng được biểu diễn bằng một băm - đó là ít nhất khoảng 10kBytes cho mỗi đối tượng. Nếu có một lượng lớn dữ liệu cần in, mức tiêu thụ bộ nhớ của một số 100MByte không phải là điều bất thường đối với chương trình đó.Vì vậy, tôi vẫn có một lý do chính đáng để di chuyển phần tính toán bố cục sang C, sử dụng các cấu trúc mà bây giờ tôi có băm với các khóa cố định và có số học C số nguyên mà bây giờ Perl thực hiện một công việc chậm.

Nhưng mọi thứ khác đã được thực hiện và kiểm tra nhanh chóng và chạy quá nhanh đến mức tôi không thấy bất kỳ lý do gì để thay đổi. Tôi cũng tìm thấy mã Perl thuận tiện hơn nhiều để viết và kiểm tra hơn mã C. Và rất nhiều mô-đun CPAN cung cấp các giải pháp bạn không phải tự mình làm việc. Nhiều người trong số họ được kiểm tra và ghi chép đầy đủ.

Sau khi dichion khá lenghty này tôi kết luận: nếu nó là một máy chủ hoặc chương trình dòng lệnh, hãy xem xét Perl. Nhưng nếu chương trình này có để xây dựng các cấu trúc dữ liệu khổng lồ hoặc rất nhiều arithmetics, hãy xem xét một cái gì đó nhanh hơn. Đôi khi, nó có thể là một chương trình Perl với một mô-đun được viết bằng C.

+0

* "nhiều tác vụ hoàn thành nhanh chóng và thành công trong Perl mất một thời gian dài trong C, và thậm chí cả C++." * Bạn có chắc chắn về điều đó không? Hãy nhớ rằng, Perl được viết bằng C, vì vậy bất cứ điều gì mà Perl đang làm đã được thực hiện trong C :-) – psmears

1

Có các trình dịch Perl đến C, nhưng không có phần nào là hoàn hảo. Lý tưởng nhất là bạn muốn một dịch giả vừa chính xác vừa thanh lịch. Than ôi, bạn không thể có cả hai, mã Perl đơn giản không phải là mã C đơn giản tương đương, do đó bạn phải có bản dịch không chính xác 100% hoặc phức tạp như chính Perl. Điều này đã khiến một số người tin rằng bạn không nên cố gắng dịch Perl. Nó sẽ chính xác hơn khi nói rằng bạn cần phải rõ ràng những gì bạn muốn đạt được từ bản dịch, và không mong đợi phép lạ.

100% Đúng là dễ dàng: nếu tập lệnh Perl của bạn là myperl.pl thì chương trình C void main(){system("perl myperl.pl")} sẽ thực hiện chính xác những gì myperl.pl sẽ thực hiện; điều này là khá vô nghĩa mặc dù. Trình biên dịch perlcc phức tạp hơn một chút, nhưng dường như vẫn không mang lại nhiều lợi ích. Tôi đã không nhận thấy perlcc là bất kỳ nhanh hơn so với đồng bằng Perl. Ngoài ra, trong khi mã Perl có thể nổi tiếng là khó đọc, tôi thích print "Hello World\n" đến dòng 700 dài monstrosity rằng perlcc dịch nó thành. Tôi đã không nhìn thấy các chương trình này sản xuất bất cứ điều gì mà có thể vượt qua một đánh giá mã cũng như viết mã C thanh lịch. OTOH, nếu bạn muốn trình biên dịch vì bạn không muốn phân phối mã nguồn của mình theo cách không bị làm phiền, thì perlcc có thể làm việc kỳ diệu.

RPerl có thể đạt được tốc độ tăng nhưng rất hạn chế về những gì dịch có thể dịch.

Ví dụ về một dịch giả "thanh lịch nhưng không chính xác" tầm thường, xem nguyên mẫu perl2c++.pl. Điều này hoạt động bằng cách thay thế (một vài) tiêu chuẩn Perl-isms với C++ - isms. C++ đã được chọn vì nó là một ngôn ngữ cấp cao như Perl, nhưng vẫn chia sẻ cùng một đặc tính trần kim loại của C.

Trong trường hợp máy phát số giả ngẫu nhiên LCG LCG.pl, đầu ra của perl2c++.pl là sạch và ngắn gọn mã C++ chạy nhanh hơn hàng chục lần so với Perl ban đầu và không phụ thuộc vào bất kỳ thư viện Perl nào. Nó có thể được mở rộng để tìm kiếm tất cả các câu trả lời tiêu chuẩn cho "Làm thế nào để làm X trên Perl", và thay thế nó bằng "Làm thế nào để làm X trong C + +". Sau đó, nó có thể dịch thành công nhiều kịch bản Perl đơn giản nhưng thực tế, và giúp một người dịch phần mềm Perl không tầm thường thành mã C++ thanh lịch. Điều này sẽ hữu ích nhất nếu bạn thấy mình viết phần mềm số trong Perl mà lẽ ra phải được viết bằng C++ ngay từ đầu.

Đối với phần mềm mà Perl rất phù hợp, nhưng bạn chỉ muốn đi nhanh hơn một chút, cách tiếp cận JIT được JavaScript sử dụng (và cuối cùng là Perl 6) hứa hẹn hơn.

Các vấn đề liên quan