2010-07-10 40 views
6

Tôi đã tìm kiếm một số tài liệu về phát triển lập trình đa nền tảng và tôi không tìm thấy điều gì đó thực sự tốt.Làm thế nào để viết một chương trình đa nền tảng?

Tôi không tìm kiếm Máy ảo cho nền tảng đa nền tảng như Java.

Có sách hoặc tài liệu nào về điều này không?

+2

Làm thế nào để bạn xác định nền tảng? Ví dụ, các chương trình ANSI C có thể được biên dịch trên nhiều nền tảng. –

+3

Chương trình của bạn cần những tính năng gì? Bạn muốn hỗ trợ nền tảng nào? Nếu bạn dựa vào các tính năng được chỉ định trong POSIX, chương trình của bạn sẽ được di chuyển tới nhiều hợp nhất, nhưng có thể không biên dịch trên Windows - ít nhất, nó có thể sẽ không trừ khi bạn dựa vào tập hợp con của POSIX mà cửa sổ hỗ trợ. Một cách khác để làm cho chương trình của bạn di động là dựa vào một lớp trừu tượng có nhiệm vụ chăm sóc các nền tảng cụ thể cho bạn, như mạng và các tiện ích luồng của Qt. Vấn đề với cách tiếp cận đó là chương trình của bạn sẽ tốt nhất là di động với các hệ thống được hỗ trợ bởi lớp trừu tượng của bạn. – George

+0

Ví dụ: một chương trình sử dụng ổ cắm. Nó có các triển khai khác nhau trong Linux hoặc Windows. – rigon

Trả lời

4

@Staffan và những người khác đã đưa ra lời khuyên sterling, vì vậy tôi sẽ không cung cấp một giải pháp - chỉ đề xuất một cách tiếp cận.

Có nhiều giải pháp khả thi và tôi sẽ nói rằng quyết định chính là liệu bạn có muốn có GUI hay không. Nếu không, bạn có thể đi với C. Với một GUI, đi với Java (mà bạn không muốn), hoặc sử dụng NetBEans như IDE của bạn với Qt cho các widget.

Nhưng bất cứ điều gì bạn làm, tôi nghĩ điều quan trọng nhất là phát hiện pronlems tiềm năng càng sớm càng tốt. Nếu bạn sử dụng C, bạn có thể sử dụng Splint hoặc các công cụ phân tích mã tĩnh khác mà họ sẽ cảnh báo về các vấn đề về tính di động. Tương tự, việc bật mức độ cảnh báo trình biên dịch của bạn lên mức tối đa sẽ giúp ích.

Thiết lập hệ thống tích hợp liên tục như Hudson để xây dựng mọi thứ thường xuyên và đảm bảo rằng bạn có nhiều thử nghiệm đơn vị tự động (sử dụng CppUnit hoặc tương tự) và sử dụng cùng một thử nghiệm trên mỗi nền tảng.

Có thể xem xét Posix hoặc chỉ sử dụng Ansi C hoặc một số ngôn ngữ tuân thủ tiêu chuẩn khác.

Cách bạn thiết lập CI phụ thuộc vào số lượng mục tiêu tiềm năng bạn có. Có lẽ bạn cần phải chạy mỗi trên một PC sepearte hoặc trong một máy ảo sparate. Nếu bạn chọn C hoặc C++ bạn có thể hạnh phúc với việc sử dụng GCC dưới Cygwin trong Windows và C/C++ của sự lựa chọn của bạn

Xem thêm (cần tư vấn về một miễn phí tốt?):

http://www.hookatooka.com/wpc/

và, tất nhiên, http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-sg&q=portable+code

1

Không sử dụng máy ảo bạn gặp phải luôn luôn cùng một vấn đề: nhiều tính năng mà bạn có thể sử dụng trên hệ điều hành là dành riêng cho hệ điều hành đó.

Điều này bởi vì không ai không bao giờ quan tâm nghiêm túc đến việc xác định chỉ là một cách để làm những điều tương tự, chủ yếu là vì DirectX10 chẳng hạn là một lợi thế so với các hệ điều hành khác. Tôi có thể nói rằng khá dễ dàng để viết một ứng dụng đa nền tảng có thể chạy trên MacosX và Linux chỉ vì bạn có thể tận dụng nhiều thứ có thể chạy trên cả hai máy (suy nghĩ về X11 hoặc GTK) và cả hai đều có Unix dưới mui xe. Thông thường với một số nỗ lực bạn có thể quản lý để làm cho các chương trình của bạn làm việc cũng trong Windows (có thể với MinGW hoặc Cygwin) cũng nếu tính tương thích của một số tính năng bị thiếu. Ngoài ra, các hệ điều hành khác nhau có cách triển khai khác nhau một cách hiệu quả cho cùng một thứ (suy nghĩ về ổ cắm, hệ thống io, đồ họa, âm thanh, v.v.) vì vậy không thể viết chỉ một phiên bản hoạt động ở mọi nơi: bạn buộc phải viết phiên bản khác nhau cho bất kỳ hệ điều hành nào mà bạn định phát hành chương trình của mình.

Câu trả lời ngắn gọn là: không, bạn không thể không có ngôn ngữ VM trừ khi bạn hạn chế khả năng của chương trình thành một tập hợp các tính năng phổ biến nhỏ.

(tôi giả sử chúng ta đang nói về C/C++ chỉ vì ngôn ngữ thường khác được quản lý bởi chỉ một nhóm người từng là chăm sóc về việc phát hành nó càng nhiều cross-platform càng tốt)

tôi không thực sự thấy bất kỳ điểm xấu thực sự dựa trên một máy ảo. Máy tính ngày nay có thể chạy máy ảo mà không có vấn đề tốc độ lớn. Sau đó, có một cái gì đó quan tâm đến việc đặt một lớp trừu tượng giữa bạn và hệ điều hành sẽ cho phép bạn làm những điều nâng cao bằng cách chỉ biết một cách để làm điều đó .. Tôi nghĩ rằng một sự cân bằng tốc độ của một cái gì đó như Java được chấp nhận rộng rãi. những gì bạn sẽ phải làm khi cố gắng viết một ứng dụng đa nền tảng phức tạp.

Chỉ là một thực tế: Tôi thực sự bị đau khi cố gắng chuyển một máy ảo mà tôi đã viết từ Unix (Linux/OSX) sang Windows vì chức năng freopen .. không may Windows quản lý luồng theo cách khác so với các hệ điều hành khác MinGW thiếu chức năng đó và tôi phải tìm cách giải quyết vấn đề đó ..

+1

@ Jack - điều đó không hoàn toàn đúng. Sử dụng trình biên dịch có điều kiện trong C hoặc C++, bạn có thể viết một chương trình sẽ sử dụng các tính năng dành riêng cho hệ điều hành và đơn giản biên dịch khác nhau trên mỗi nền tảng. Tất nhiên trong trường hợp đó, nỗ lực gần như giống như viết hai ứng dụng. –

+2

Có, nhưng đó không phải là viết một ứng dụng đa nền tảng. Đó là viết hai ứng dụng khác nhau dựa trên một số thành phần được chia sẻ (đa nền tảng) không sử dụng các tính năng nâng cao. Biên dịch có điều kiện là một cách để biên dịch trên nhiều nền tảng mà không cần phải có một chương trình đa nền tảng thực (vì khi bạn nói quá nỗ lực gần như bằng cách viết 2 ứng dụng) – Jack

+0

Có rất nhiều chương trình mã nguồn mở biên dịch trên Windows và Unix khác nhau Các hệ điều hành, ví dụ, do đó, bằng cách sử dụng autoconf, ví dụ, bạn có thể có môi trường thích ứng để nó có thể biên dịch trên chỉ là về bất kỳ sự kết hợp OS/phần cứng nào. –

0

Không có máy ảo Java nào hoạt động trên các nền tảng khác nhau. Java có các máy ảo khác nhau chạy trên các nền tảng khác nhau để cho một chương trình Java chạy trên mỗi nền tảng. Nó là loại của một lớp mà làm cho các chương trình Java có thể chạy ở khắp mọi nơi.

Ví dụ một chương trình C có thể chạy trên cả hai cửa sổ và linux nhưng nó phải được biên dịch với trình biên dịch tương ứng của hệ điều hành mà bạn chạy ứng dụng.

Nhưng trong java, bạn không cần phải làm như vậy. Bạn chỉ cần biên dịch mã nguồn và có thể phân phối các tệp đã biên dịch sẵn sàng để được thực hiện trên bất kỳ nền tảng nào.

7

Tôi muốn nói rằng đây boils xuống:

  • Không sử dụng phi tiêu chuẩn "thư viện chuẩn" tính năng, nơi phi tiêu chuẩn phụ thuộc vào những gì nền tảng mà bạn nhắm mục tiêu (hệ thống ví dụ POSIX tương thích). Ví dụ: nếu bạn sử dụng C, không sử dụng popen() nếu bạn muốn ứng dụng của mình chạy trên các hệ thống không phải POSIX.
  • Đảm bảo bạn xử lý chính xác vị trí cuối cùng cần thiết, ví dụ: khi bạn truyền dữ liệu qua mạng sang một máy tính khác có thể sử dụng một thứ tự byte khác.
  • Chỉ viết mã tuân thủ, ví dụ: không phụ thuộc vào các tính năng cụ thể của GCC/VC/name-your-compiler.

Trên một mức độ thực tế hơn lời khuyên của tôi là:

  • Sử dụng đa nền tảng thư viện mà trừu tượng các chức năng phi tiêu chuẩn bạn cần, hoặc viết mã của bạn để xử lý tất cả các nền tảng mà bạn nhắm mục tiêu.
  • Và, liên quan đến điểm trên, tránh xa các phụ thuộc nền tảng không chéo. Ví dụ. sử dụng OpenGL thay vì Direct3D và Qt/Gtk/bất kỳ thứ gì thay vì bộ công cụ tiện ích con của nền tảng của bạn.

EDIT: Có nhiều thứ cần suy nghĩ, như không giả định rằng / được sử dụng làm dấu phân cách đường dẫn hoặc đưa ra giả định không hợp lệ về ký tự nào được phép trong tên tệp.

0

Nếu bạn chọn một ngôn ngữ kịch bản hiện đại (Tcl và Python là hai ví dụ đơn giản) bạn có thể viết các chương trình chạy gần như giống nhau trên tất cả các nền tảng. Chắc chắn, bạn sẽ phải thực hiện các khoản trợ cấp nhỏ cho một nền tảng này hoặc nền tảng khác, nhưng điều đó khá dễ thực hiện. Hãy xem những ngôn ngữ đó để lấy cảm hứng.

Bạn sẽ không tạo ra photoshop tiếp theo hoặc người bắn súng đầu tiên với những ngôn ngữ này, nhưng đối với phần lớn các tác vụ lập trình phổ biến, chúng khá phù hợp.

Nếu bạn muốn một cái gì đó cụ thể, hãy nhìn vào http://tkdocs.com nơi trưng bày các Tk toolkit chạy trên nhiều nền tảng và với nhiều ngôn ngữ (Tcl, Ruby, Perl, Python)

+0

Thực ra bạn có thể chỉnh sửa Photoshop tiếp theo trong phần lớn Python và một số phần mở rộng di động C cho hiệu suất, khoảng 80% Adobe Lightroom và tất cả các plug-in của nó được viết bằng Lua. Và Google có phiên bản Quake chạy trong JavaScript @ 30+ fps. –

2

Nếu bạn không sử dụng một "mã một lần, chạy mọi nơi" môi trường phát triển (hay nói cách khác, một số mã của bạn phải được tùy biến cho mỗi nền tảng được nhắm mục tiêu), sau đó đảm bảo bạn thực sự cần chương trình của mình để chạy trên nhiều nền tảng.

Tôi biết một chương trình được biên dịch thành hai phiên bản, một cho Mac và một cho Windows. Mặc dù hầu hết mã giống hệt nhau cho một trong hai nền tảng, một phần cụ thể cho máy chủ lưu trữ O/S và các sửa đổi và thử nghiệm thường xuyên cần thiết duy nhất cho hai môi trường. Doanh số bán hàng là 98% Windows, 2% Mac, nhưng hai phiên bản cơ bản yêu cầu thiết kế/lập trình/kiểm tra/tài liệu thời gian bằng nhau. Các chủ sở hữu đã quyết định rằng thay vì cho một nửa của mỗi $ của thời gian lập trình trong tương lai cho phiên bản Mac cho chỉ có một trở lại 2%, họ chỉ đơn giản là đóng hộp phiên bản đó. Vấn đề đa nền tảng của họ ngay lập tức biến mất, và năng suất của các lập trình viên của họ về cơ bản tăng gấp đôi (mà hài lòng với các khách hàng Windows).

2

Tôi đã yêu cầu một cuốn sách nhưng không ai gọi nó.

Tôi tìm thấy một cuốn sách có tên "Phát triển nền tảng trong C++: Xây dựng các ứng dụng Mac OS X, Linux và Windows".

Có đi một liên kết cho Amazon và mô tả cho người quan tâm:

http://www.amazon.com/exec/obidos/tg/detail/-/032124642X/

 
    Cross-Platform Development in C++ is the definitive guide to developing 
    portable C/C++ application code that will run natively on Windows, 
    Macintosh, and Linux/Unix platforms without compromising functionality, 
    usability, or quality. 

    Long-time Mozilla and Netscape developer Syd Logan systematically 
    addresses all the technical and management challenges associated with 
    software portability from planning and design through coding, testing, 
    and deployment. Drawing on his extensive experience with cross-platform 
    development, Logan thoroughly covers issues ranging from the use of 
    native APIs to the latest strategies for portable GUI development. Along 
    the way, he demonstrates how to achieve feature parity while avoiding 
    the problems inherent to traditional cross-platform development 
    approaches. 

    This book will be an indispensable resource for every software 
    professional and technical manager who is building new cross-platform 
    software, porting existing C/C++ software, or planning software that may 
    someday require cross-platform support. 

    Build Cross-Platform Applications without Compromise 

    Throughout the book, Logan illuminates his techniques with realistic 
    scenarios and extensive, downloadable code examples, including a 
    complete cross-platform GUI toolkit based on Mozilla's XUL that you can 
    download, modify, and learn from. Coverage includes 
    - Policies and procedures used by Netscape, enabling them to ship Web 
    browsers to millions of users on Windows, Mac OS, and Linux 
    - Delivering functionality and interfaces that are consistent on all 
    platforms 
    - Understanding key similarities and differences among leading 
    platform-specific GUI APIs, including Win32/.NET, Cocoa, and Gtk+ 
    - Determining when and when not to use native IDEs and how to limit 
    their impact on portability 
    - Leveraging standards-based APIs, including POSIX and STL 
    - Avoiding hidden portability pitfalls associated with floating point, 
    char types, data serialization, and types in C++ 
    - Utilizing platform abstraction libraries such as the Netscape 
    Portable Runtime (NSPR) 
    - Establishing an effective cross-platform bug reporting and tracking 
    system 
    - Creating builds for multiple platforms and detecting build failures 
    across platforms when they occur 
    - Understanding the native runtime environment and its impact on 
    installation 
    - Utilizing wxWidgets to create multi-platform GUI applications from a 
    single code base 
    - Thoroughly testing application portability 
    - Understanding cross-platform GUI toolkit design with Trixul 
Các vấn đề liên quan