2009-09-21 15 views
16

Tôi thực sự đánh giá cao mọi người có thể giải thích ngắn gọn về tôi, cách tiếp cận chung để thực hiện những thứ như MonoTouch là gì? Tôi thực sự ngạc nhiên vì nó không phải là ví dụ đầu tiên tôi thấy khi mọi người có được một số nền tảng như Java và biến nó thành một thứ như C/Objective-C. Tôi không thể tưởng tượng được những thứ như bộ sưu tập rác và những thứ đang được dịch.Cách MonoTouch hoạt động?

Xin cảm ơn trước.

EDIT: Tôi hiểu khả năng lý thuyết dịch một ngôn ngữ này sang ngôn ngữ khác. Câu hỏi của tôi là kỹ thuật hơn một chút: họ có thực hiện thời gian chạy hoàn chỉnh trong ObjC và gói nó không? (Tôi nghi ngờ nó ...) Hoặc họ chỉ dịch C# mã vào ObjC/nhị phân/etc?

Trả lời

8

Monotouch sử dụng tính năng biên dịch trước để tạo ra một tệp được biên dịch tĩnh đơn - vì vậy nó không triển khai thời gian chạy .Net trên iPhone. Monotouch sử dụng ràng buộc với các thư viện iPhone tiếp xúc với C#. Không có bản dịch nào cho Objective-C.

Về cơ bản, nó cung cấp cho bạn sự quen thuộc của làm việc trong C# và chuỗi công cụ liên quan của nó trong khi phơi bày các cuộc gọi thư viện của hệ điều hành iPhone cơ bản.

Miguel di Icaza đã giải thích điều này một chút về podcast Stackoverflow nơi anh ta là khách. link

+1

* "do đó, nó không thực hiện. Net thời gian chạy trên iPhone" * - tuyên bố này là ** sai **, hoặc, ít nhất, gây hiểu lầm. Thời gian chạy là hiện tại, trên thực tế, thời gian chạy được chứa trong "tệp được biên dịch tĩnh" mà bạn tham chiếu. – cdhowie

0

Monotouch có lẽ là một cổng Mono cho iPod.

Mono chính nó là một triển khai mã nguồn mở của thời gian chạy .NET (và một số công cụ dev) trong các môi trường * nix khác nhau.

Đây là một lực lượng lao động lớn do Miguel de Icaza dẫn đầu, người đã sớm nhận ra tầm quan trọng của .NET và thiết lập việc chuyển nó sang nền tảng mở. Rõ ràng ông đã nhận được rất nhiều sự hỗ trợ từ MicroSoft chính nó như MONO đã cho không thể chia sẻ giữa bản địa .NET và mono.

Vì vậy, câu trả lời đầu tiên là bạn cần phải là một thiên tài được tổ chức tốt, chăm chỉ.

Câu trả lời thứ hai là Comp Sciency nhiều hơn. "Turing Complete" là tập hợp các hàm tối thiểu mà hệ thống cần được coi là một máy tính có thể lập trình được. Thực tế của nó là một bộ rất nhỏ - trừ, so sánh, chi nhánh và đọc và lưu trữ.

Lý thuyết là bất kỳ hệ thống "Turing Complete" nào cũng có thể làm bất cứ điều gì mà hệ thống "Turing Complete" khác có thể thực hiện. Vì vậy, cho bất kỳ môi trường ngôn ngữ lập trình hoàn toàn hợp lý, bạn sẽ có thể mô phỏng nó bằng cách sử dụng một môi trường chương trình khác.

Có rất nhiều ví dụ về điều này xung quanh. Jpython chạy giả lập C python trong Java JVM. Hai mục yêu thích cá nhân của tôi là which runs original zX spectrum games in your browserKnuth MIX assembeler machine cả hai đều là javascript thuần túy.

+0

Cảm ơn bạn đã trả lời! Tuy nhiên, tôi biết về việc hoàn thành Turing và các công cụ liên quan đến khoa học khác, nhưng câu hỏi của tôi là kỹ thuật hơn: họ làm như thế nào? Họ chỉ thực hiện một thời gian chạy và bằng cách nào đó gói nó vào ứng dụng? Hay cái gì? – Anton

+0

Chúng bắt đầu với tiêu chuẩn, trong đó xác định những thành phần nào cần phải có mặt trong môi trường .NET và sau đó chúng triển khai các thành phần đó sao cho chúng tuân thủ tiêu chuẩn. – Eric

+0

Tôi hiểu điều đó. Nhưng một lần nữa, ứng dụng HOW MonoTouch, được viết bằng .NET, chạy trên iPhone như thế nào? Họ có một thời gian chạy ở đó? Hay họ chỉ bằng cách nào đó dịch nó thành Obj-C/Arm Asm/sao? – Anton

39

MonoTouch không phải là người dịch. Nó chỉ đơn giản là thời gian chạy Mono chạy trên iPhone, với một số thủ thuật lạ mắt để làm cho nó tương thích với các hạn chế của iPhone.

Mono "thời gian chạy" thông thường không chỉ là JIT, nó còn xử lý GC, phản chiếu, lớp I/O, luồng, ngoại lệ, vv Ngoài ra còn có các thư viện lớp. Để ứng dụng của bạn chạy trên iPhone, phần lớn trong số này phải được bao gồm trong ứng dụng. Giảm béo nó xuống trình bày một số thách thức. Ngoài ra, iPhone ngăn chặn việc tạo mã thời gian chạy JIT, chỉ chạy mã đã ký và không cho phép các thư viện động.

Điều mà MonoTouch thực hiện là sử dụng trình liên kết IL để kết hợp chỉ các phần của thư viện lớp mà mã của bạn sử dụng vào một nhị phân IL duy nhất. Sau đó, nó sử dụng trình biên dịch AOT để tạo trước tất cả mã gốc mà JIT thường tạo ra từ IL, sau đó liên kết điều này cùng với thời gian chạy JIT-ít hơn vào một nhị phân gốc có thể được ký. Cuối cùng, IL bị tước khỏi nhị phân được quản lý. chỉ để lại siêu dữ liệu.