2015-03-22 15 views
5

Vì lý do bảo mật, tôi có thể không thể mô tả chi tiết điểm pin nhưng đây là kịch bản.Làm cách nào để bắt đầu viết trình thu thập thông tin? Thậm chí có thể không?

Các thiết bị khác nhau có ứng dụng phát trực tuyến có các ngôn ngữ khác nhau với các apis khác nhau, mặc dù chúng hoàn thành tương tự. Vì vậy, khi bạn muốn viết một ứng dụng trực tuyến cho một nền tảng, bạn phải bắt đầu từ đầu trong khi sao chép cùng một ứng dụng cho nền tảng khác, đó là viết logic dư thừa. Tôi muốn thiết kế một transpiler, có mã trong một ngôn ngữ, và tạo mã cho tất cả các ngôn ngữ bản địa, loại 1 đến nhiều, nhưng không chắc chắn làm thế nào để bắt đầu, và không thể tìm thấy đủ tài liệu tham khảo trên internet. Thậm chí có khả thi để làm điều đó không? các ngôn ngữ đích bao gồm các biến thể của javascript và chủ yếu là java.

+0

Bạn viết trình chuyển đổi bằng cách tạo trình phân tích cú pháp cho ngôn ngữ nguồn, tạo cây cú pháp và sau đó chuyển đổi thành mã bằng ngôn ngữ đích. Tùy thuộc vào nhiệm vụ của bạn, nó có thể dễ dàng hơn để viết một trình chuyển đổi, nhưng chỉ đơn giản là sử dụng tạo mã dựa trên mẫu để tạo mã cho nhiều nền tảng. – yole

+0

Xin chào, bạn có thể vui lòng cung cấp liên kết đến ví dụ hoạt động của nó cho một số ngôn ngữ không? –

+0

[CoffeeScript] (http://coffeescript.org/) là trình biên dịch tạo JavaScript. Kiểm tra nguồn chú thích của nó; điều này khá dễ hiểu. – yole

Trả lời

2

Bạn có thể muốn xem (hoặc thậm chí tham gia) một dự án trình biên dịch nguồn mở như Haxe. Nó đã có thể biên dịch từ mã nguồn Haxe sang Java, JavaScript, C#, C++, NekoVM, Flash và Python (thử nghiệm).Thông tin

thêm:

4

Một cách để làm điều này là sử dụng cơ sở hạ tầng được thiết kế để xây dựng người dịch.

Nhiều người nghĩ điều này có nghĩa là "trình tạo trình phân tích cú pháp"; điều đó thật ngây thơ. Một dịch giả tốt phải phân tích ngôn ngữ, chắc chắn, nhưng bản dịch cũng cần theo dõi ý nghĩa của các biểu tượng, xác minh rằng những gì được cho là không vô nghĩa, tạo và tối ưu hóa mã. Bạn cần nhiều máy móc hơn chỉ là một trình phân tích cú pháp (trình tạo) để làm điều này tốt. Xem Life After Parsing.

DMS Software Reengineering Toolkit là bộ công cụ để xây dựng các trình phân tích và dịch giả chương trình, bao gồm chỉ một phần tử là trình tạo trình phân tích cú pháp rất mạnh.

DMS cũng bao gồm program transformation engine, cho phép một người viết các quy tắc dịch về ngôn ngữ đang được dịch, if you see this, transform it to that. Viết các quy tắc dịch trực tiếp bằng cú pháp bề mặt của các ngôn ngữ yêu thích giúp chúng dễ dàng viết, kiểm tra, gỡ lỗi và bảo trì hơn.

Điều đó nói rằng, viết như một dịch giả không phải là một nhiệm vụ dễ dàng; bạn phải liệt kê toàn bộ các cấu trúc cú pháp với ngữ nghĩa ngụ ý, và tìm ra cách ánh xạ tới một sự kết hợp cú pháp ngôn ngữ đích cộng với các thư viện phụ mà bạn có thể tùy chỉnh xây dựng ở phía đích. Điều này mất nhiều tháng, số nhiều, ngay cả đối với các chuyên gia, mỗi phiên dịch.

DMS bất khả tri về ngôn ngữ lập trình nào có liên quan. Bạn phải định nghĩa các ngôn ngữ mà bạn quan tâm; nó có một định nghĩa lớn về ngôn ngữ (hữu ích như các nguồn hoặc các mục tiêu, sự lựa chọn của bạn) cho các ngôn ngữ chuẩn như Java và JavaScript. Ổn định có sẵn này giúp rút ngắn chu kỳ phát triển, nhưng nó không phải là chi phí chủ yếu.

Có một chén thánh xây dựng một "phiên dịch phổ quát" trong đó người ta viết một bộ quy tắc và mọi thứ đều là đào sau đó. Ý tưởng đó là một tưởng tượng. Nó là giá trị hiểu rằng một bộ quy tắc dịch từ ngôn ngữ A đến B, không thực sự hữu ích cho việc dịch ngôn ngữ C sang D, bởi vì các quy tắc kết hợp kiến ​​thức về cú pháp cụ thể và ngữ nghĩa ngụ ý. Tuy nhiên, nếu bạn sẽ xây dựng nhiều "transpilers", làm nó trên một nền tảng chung là một chiến thắng to lớn về đường cong học tập và khả năng bảo trì lâu dài.

Sử dụng các công cụ như DMS, người ta có thể viết extremely accurate translators..

+2

Đó là một sự xấu hổ mà SO là như vậy deletionist. Chủ đề này đã được giải quyết gần đây, sau đó bị xóa, tại http://stackoverflow.com/questions/28968161/transcompiling-to-another-language/28970385#28970385, nếu SO sẽ hiển thị cho bạn trang. –

+0

Chủ đề này đã được phục hồi, may mắn thay. :) –

+0

Tốt. Bây giờ chúng ta nên làm cho nó không được tiết lộ (SOers, nếu bạn thích câu trả lời khác, bỏ phiếu để "tiết lộ nó"). –

1

Vâng, đây là có thể, và trình biên dịch thường được viết theo cách này.

Ý tưởng chung là tạo ra một "ngôn ngữ trung gian", sau đó viết một vài dịch một chiều:

C#   => intermediate 
    JavaScript => intermediate 

    intermediate => C# 
    intermediate => JavaScript 

Đưa đầu ra từ một, vào hôm sau, bạn có thể dịch từ một ngôn ngữ khác:

C#   => intermediate => JavaScript 
    JavaScript => intermediate => C# 

Rất tiếc, mã được tạo có thể sẽ không thân thiện với con người.

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