2012-01-09 36 views
14

Công cụ nào để sử dụng để chuyển đổi mã nguồn C thành mã nguồn Go?Công cụ để chuyển đổi (dịch) C thành Go?

Ví dụ, nếu mã C chứa:

struct Node { 
    struct Node *left, *right; 
    void  *data; 
}; 

char charAt(char *s, int i) { 
    return s[i]; 
} 

mã Go tương ứng được tạo ra bởi công cụ này nên là:

type Node struct { 
    left, right *Node 
    data  interface{} 
} 

func charAt(s string, i int) byte { 
    return s[i] 
} 

Công cụ này không cần phải được hoàn hảo. Nó là OK nếu một số phần của mã Go được tạo ra cần phải được sửa chữa bằng tay.

+1

Tôi đã không nhìn thấy một công cụ phù hợp với yêu cầu của bạn, và điều này nghe có vẻ giống như một yêu cầu để có một văn bản bạn, có thể không thực sự phù hợp với trang web này. –

+0

@JoachimIsaksson Đã tồn tại các câu hỏi như "C tới Java" hoặc "C tới Perl". Câu hỏi này không khác. –

+0

Tại sao bạn hỏi? Việc kết hợp mã C & Go có đơn giản hơn không? (GCC 4.7 có một giao diện người dùng không hoàn hảo, vì vậy đôi khi có thể) –

Trả lời

4

Tôi đoán không có công cụ chuyển đổi mã nguồn (C sang Go) nào tồn tại ngày hôm nay. Bạn có thể xem xét để làm cho công cụ chuyển đổi của riêng bạn. Câu hỏi trở thành: liệu nó có xứng đáng không, và làm thế nào để làm điều đó?

Nó có thể không đáng để thử, bởi vì Go và C có thể bằng cách nào đó tương thích với nhau. Ví dụ: nếu bạn sử dụng GCC 4.6 (hoặc sẽ được phát hành 4.7, tức là ảnh chụp nhanh mới nhất), bạn có thể liên kết C & Nhập mã cùng nhau, với một số sự cẩn thận.

Tất nhiên, như thường lệ, điều ác là trong các chi tiết.

Nếu bạn muốn chuyển đổi, bạn có muốn mã Go có thể đọc được và có thể chỉnh sửa được không (do đó nhiệm vụ khó khăn hơn, vì bạn muốn giữ cấu trúc của mã và bạn cũng muốn giữ các nhận xét)? Trong trường hợp đó, bạn có thể cần trình phân tích cú pháp C của riêng bạn (và đó là một nhiệm vụ khó khăn).

Nếu bạn không quan tâm đến khả năng đọc của mã Go được tạo, bạn có thể mở rộng trình biên dịch hiện có để thực hiện công việc. Ví dụ, GCC có thể mở rộng các plugin hoặc thông qua các phần mở rộng MELT, và bạn có thể tùy chỉnh GCC (với MELT, hoặc C của riêng bạn cho GCC) để chuyển đổi biểu diễn Gimple (biểu diễn chính bên trong cho các lệnh bên trong GCC) thành mã Go không đọc được. Điều này bằng cách nào đó đơn giản hơn (nhưng vẫn yêu cầu nhiều hơn một tuần làm việc).

Tất nhiên, chuyển giao diện, kênh và thậm chí quản lý bộ nhớ (bộ nhớ thu thập rác) không có đối sánh C chuẩn.

1

Theo như tôi biết, công cụ đó không tồn tại (chưa). Vì vậy, bạn buộc phải chuyển đổi mã C thành Go bằng tay.

Tôi không biết mã C phức tạp như thế nào bạn muốn chuyển đổi, nhưng bạn có thể lưu ý rằng Go có cách làm đặc biệt "đặc biệt". Giống như cách sử dụng interfaceschannels.

2

Tôi gần như chắc chắn rằng không có công cụ như vậy, nhưng IMHO trong mọi ngôn ngữ thì tốt để viết theo "kiểu mã hóa" của riêng nó.

Hãy nhớ rằng chúng ta đã yêu bao nhiêu thủ thuật tiền xử lý C và công việc nghệ thuật thực sự với con trỏ? Hãy nhớ rằng phải mất bao nhiêu sự quan tâm để xử lý malloc/miễn phí hoặc với chủ đề? Đi là khác nhau. Bạn không có bộ tiền xử lý, nhưng bạn có các bao đóng, đối tượng với các phương thức, giao diện, bộ thu gom rác, lát cắt, goroutines và nhiều tính năng đẹp khác.

Vì vậy, tại sao phải chuyển đổi mã thay vì viết lại mã theo cách tốt hơn và sạch hơn?

Tất nhiên, tôi hy vọng bạn không có một dòng 1000K mã trong C mà bạn phải cổng to Go :)

14

rsc tạo github.com/rsc/c2go để chuyển đổi c dựa Go biên dịch vào Go.

Như một ví dụ bên ngoài, akavel dường như được cố gắng sử dụng nó để tạo ra một lua Go dựa trên: github.com/akavel/goluago/

github.com/xyproto/c2go là một dự án khác, nhưng nó đã không được xúc động trong một thời gian ngắn.

+0

Nhưng làm thế nào bạn sẽ sử dụng c2go để dịch một chương trình test.c sang một chương trình test.go? – Dac0d3r

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