2008-09-25 30 views
8

Tôi muốn dịch một số mã C sang mã Python hoặc bytecode. Mã C được đề cập là những gì tôi gọi là thuật toán thuần túy: nền tảng độc lập, không có I/O, chỉ là các thuật toán và cấu trúc dữ liệu trong bộ nhớ.Dịch thuật toán C sang Python

Ví dụ sẽ là thư viện biểu thức chính quy. Công cụ dịch sẽ xử lý mã nguồn thư viện và tạo ra một mô-đun Python tương đương về chức năng có thể chạy trong môi trường sandboxed.

Bạn có thể giới thiệu phương pháp, công cụ và kỹ thuật cụ thể nào?


Lưu ý: Python C mở rộng hoặc ctypes là không phải là một lựa chọn vì môi trường là sandboxed.

Lưu ý khác: có vẻ như có C-to-Java-bytecode compiler, thậm chí chúng còn biên dịch libjpeg thành Java. Là bytecode Java + VM quá khác nhau từ CPython bytecode + VM?

Trả lời

0

Tại sao không giữ mã C và creating a Python C module có thể được nhập vào môi trường Python đang chạy?

+0

Tiện ích mở rộng Python C không phải là một tùy chọn vì môi trường được sandboxed. Tôi đã cập nhật câu hỏi để phản ánh điều đó. – Constantin

0

Trước tiên, tôi sẽ xem xét gói thư viện C hiện có với tính tốt lành Pythonic để cung cấp API dưới dạng mô-đun python. Tôi nhìn vào swig, ctypes, pyrex, và bất cứ điều gì khác là ra khỏi đó những ngày này. Bản thân thư viện C sẽ không thay đổi. Lưu công việc.

Nhưng nếu tôi thực sự phải viết mã Python gốc dựa trên C, thì không có công cụ nào tôi muốn sử dụng, chỉ là bộ não của tôi. C cho phép quá nhiều thủ đoạn hài hước với con trỏ, những thứ thông minh với các macro, v.v ... mà tôi chưa bao giờ tin tưởng một công cụ tự động ngay cả khi ai đó đã chỉ ra một cho tôi.

Tôi đã đề cập Pyrex - đây là ngôn ngữ tương tự như C nhưng cũng theo định hướng Python. Tôi đã không làm nhiều với nó, nhưng nó có thể được dễ dàng hơn bằng cách viết python tinh khiết, cho rằng bạn đang bắt đầu với C như một hướng dẫn.

Chuyển đổi từ nhiều ngôn ngữ hạn chế hơn như IDL (các ngôn ngữ dữ liệu mà các nhà khoa học muốn sử dụng, không phải IDL khác) là khó, đòi hỏi nỗ lực thủ công và tinh thần. C? Hãy quên nó đi, không phải cho đến khi người dân UFO cung cấp cho chúng tôi những công cụ phần mềm ưa thích của họ, đó là hàng nghìn năm trước tình trạng của chúng ta!

+0

"Macro ma thuật" không phải là một vấn đề cơ bản, nó được loại bỏ bởi một quá trình tiền xử lý đơn. – Constantin

12

Thật sự là không có cách nào để dịch máy móc C sang Python một cách máy móc và có ý nghĩa mà không phải chịu một hình phạt hiệu suất điên rồ. Như chúng ta đều biết Python không ở bất kỳ nơi nào gần tốc độ C (với các trình biên dịch và trình biên dịch hiện tại) nhưng tệ hơn là C là tốt (bit-fiddling, toán số nguyên, thủ thuật với các khối bộ nhớ) Python rất chậm, và những gì Python là tốt tại bạn không thể diễn tả trong C trực tiếp. Một bản dịch trực tiếp do đó sẽ không hiệu quả, đến mức vô lý.

Việc nhiều, tiếp cận tốt hơn nhiều nói chung thực sự là để giữ cho C C, và bọc nó trong một mô-đun mở rộng Python (sử dụng SWIG, Pyrex, hoặc writing a wrapper manually) hoặc gọi thư viện C trực tiếp sử dụng ctypes. Tất cả các lợi ích (và nhược điểm) của C đối với những gì đã là C hoặc bạn thêm vào sau, và tất cả sự tiện lợi (và nhược điểm) của Python đối với bất kỳ mã nào bằng Python.

Điều đó sẽ không thỏa mãn nhu cầu 'sandboxing' của bạn, nhưng bạn nên nhận ra rằng bạn không thể sandbox Python đặc biệt tốt; phải mất rất nhiều nỗ lực và sửa đổi của CPython, và nếu bạn quên một lỗ nhỏ ở đâu đó thì nhà tù của bạn bị hỏng.Nếu bạn muốn sandbox Python, bạn nên bắt đầu bằng cách sandboxing toàn bộ quá trình, và sau đó phần mở rộng C có thể nhận được sandboxed quá.

0

Bất kỳ bản dịch tự động nào cũng sẽ bị ảnh hưởng vì không sử dụng sức mạnh của Python. Mã thủ tục loại C sẽ chạy rất chậm nếu được dịch trực tiếp sang Python, bạn sẽ cần phải cấu hình và thay thế toàn bộ các phần bằng nhiều mã được tối ưu hóa bằng Python hơn.

3

Cách nhanh nhất (về nỗ lực lập trình viên, không hiệu quả) có lẽ sẽ liên quan đến việc sử dụng một trình biên dịch hiện có để biên dịch C đến một cái gì đó đơn giản (ví dụ LLVM) và một trong hai:

  • giải thích rằng trong Python (cắt cổ hiệu suất phạt)
  • dịch đó để Python (hình phạt hiệu suất rất lớn)
  • dịch đó để Python bytecode (hình phạt hiệu suất lớn)

Trà nslating C để Python trực tiếp là có thể (và có thể mang lại mã nhanh hơn các phương pháp trên), nhưng về cơ bản bạn đang viết một trình biên dịch C phụ trợ, đó là một nhiệm vụ rất lớn.

Chỉnh sửa, suy nghĩ: Một cách thậm chí còn nhanh hơn và bẩn hơn là thực hiện phân tích cú pháp cho mã C, chuyển đổi thành cấu trúc dữ liệu Python và diễn giải bằng Python.

+0

Tôi đã nghĩ về LLVM, nhưng không nghĩ đến việc giải thích nó. Điểm tốt. – Constantin

+0

Vâng, có thể diễn giải cây phân tích cú pháp C trực tiếp trong Python sẽ dễ dàng hơn - được thêm vào trong bản chỉnh sửa. –

-1

Bạn luôn có thể biên dịch mã C và tải trong thư viện bằng cách sử dụng ctypes trong python.

+0

Đó không phải là tôi đã downvoted bạn, nhưng tôi có thể hiểu tại sao - hãy chú ý đến câu hỏi.Môi trường đích là hộp cát và chỉ chấp nhận các mô-đun Python thuần túy. – Constantin

+0

đã đồng ý .. lỗi của tôi. –

0

Tôi muốn sử dụng công cụ để trích xuất một gói uml từ mã C, sau đó sử dụng nó để tạo mã python.

Từ này squ squ, tôi bắt đầu để thoát khỏi các cấu trúc C-style không cần thiết và sau đó tôi sẽ điền vào các phương pháp với mã python.

Tôi nghĩ rằng đó sẽ là cách an toàn hơn nhưng hiệu quả nhất.

+0

Bạn sẽ sử dụng công cụ nào và bạn sẽ tạo sơ đồ UML nào? Sơ đồ lớp tĩnh? : -S – Constantin

+0

POWER AMC sẽ thực hiện công việc nhưng khá tốn kém. Và có, tôi không nghĩ rằng bất kỳ người nào khác rằng sơ đồ lớp tĩnh có thể được trả lại hiệu quả đủ bởi một quá trình tự động. Vì vậy, bạn sẽ phải dịch logic lớp từ C sang Python. Nhưng nó vẫn dễ dàng hơn nhiều khi làm mọi thứ từ đầu. –

1

Viết thông dịch viên C bằng Python thuần túy? ;-)

+0

Hey, Thomas, đó là dự án tiếp theo của bạn, có cơ hội nào không? :) – Constantin

+0

Nếu tôi phải viết một con thú như vậy, tất nhiên tôi sẽ sử dụng Python. Nhưng tôi không phải ... – theller

4

sử dụng thụt lề (1) và ctopy (1) ... để tăng thêm tốc độ kiểm tra tín dụng trên pypy ... để sử dụng tín dụng thưởng pyastra để tạo mã lắp ráp.

Bất kể ngôn ngữ nào, bạn sẽ luôn phải hy sinh việc lưu trữ kết quả đầu ra của các cấu trúc và chức năng khác nhau giữa không gian thời gian chạy (CPU) hoặc bộ nhớ (RAM).

Kiểm tra loạt đá luân lưu ngôn ngữ tuyệt vời nếu bạn muốn nhìn thấy những gì tôi đang nói về một trong hai cách này là quá nhiều comp khoa học viễn tưởng xem nhẹ ...

Dưới đây là một ví dụ, muốn sử dụng điểm toán học nổi mà không sử dụng nổi số điểm?

x * 1,000,000 = a 
y * 1,000,000 = b 
a {function} b = result 
result/1,000,000 = z 

Đừng bị sa lầy, sử dụng toán học thượng cổ nếu bạn phải.