2010-07-10 8 views
6

Busqué algo de literatura sobre desarrollo de programación multiplataforma y no encontré algo realmente bueno.¿Cómo escribir un programa multiplataforma?

No estoy buscando una máquina virtual para plataformas cruzadas como lo hace Java.

¿Hay algún libro o literatura sobre esto?

+2

¿Cómo se define multiplataforma? Por ejemplo, los programas ANSI C se pueden compilar en muchas plataformas. –

+3

¿Qué tipo de características necesita su programa? ¿Qué plataformas quieres apoyar? Si confía en las características especificadas en POSIX, su programa será portátil para muchos equipos, pero puede no compilarse en Windows; al menos, probablemente no lo haga a menos que dependa del subconjunto de POSIX que admite Windows. Otra forma de hacer que su programa sea portátil es confiar en una capa de abstracción que se encargue de las cosas específicas de la plataforma, como la red de Qt y las funciones de subprocesos. El problema con este enfoque es que su programa, en el mejor de los casos, será portátil para los sistemas admitidos por su capa de abstracción. – George

+0

Por ejemplo, un programa que usa un socket. Tiene diferentes implementaciones en Linux o Windows. – rigon

Respuesta

4

@Staffan y otros han dado consejos de ley, así que no voy a ofrecer una solución, solo sugiero un enfoque.

Hay muchas soluciones posibles y yo diría que una decisión importante es si desea o no una GUI. Si no, probablemente pueda ir con C. Con una GUI, vaya con Java (que no quiere), o use NetBEans como su IDE con Qt para los widgets.

Pero hagas lo que hagas, creo que lo más importante es detectar los pronlems potenciales tan pronto como sea posible. Si usa C, puede usar Splint u otras herramientas de análisis de código estático que advertirán sobre problemas de portabilidad. Del mismo modo, convertir los niveles de advertencia del compilador al máximo debería ayudar.

Configure un sistema de integración continua como Hudson para compilar todo regularmente y asegúrese de tener muchas pruebas de unidades automáticas (usando CppUnit o similar) y use la misma prueba en cada plataforma, con las pruebas apuntando a problemas de portabilidad.

Quizás considere Posix o solo use Ansi C o algún otro lenguaje que cumpla con los estándares.

La manera de configurar el CI depende de la cantidad de objetivos potenciales que tenga. Tal vez necesite ejecutar cada uno en una PC sepearte o en una máquina virtual separada. Si eligió C o C++ que puede ser feliz con el uso de GCC bajo Cygwin en Windows y/C++ compilador de C de su elección

Ver también (se necesita consejo sobre un buen uno libre?):

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

y, por supuesto, http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-sg&q=portable+code

1

Sin utilizar una máquina virtual siempre se encuentra con el mismo problema: muchas características que puede utilizar en un sistema operativo son específicas para ese sistema operativo.

Esto porque nunca a nadie le importó seriamente definir solo una manera de hacer las mismas cosas, principalmente porque tener DirectX10, por ejemplo, es una ventaja sobre otros sistemas operativos.

Diría que es bastante fácil escribir una aplicación multiplataforma capaz de ejecutarse en MacosX y Linux solo porque puede aprovechar muchas cosas que pueden ejecutarse en ambas máquinas (piense en X11 o GTK) y ambos tienen Unix bajo el capó. Por lo general, con un poco de esfuerzo puede lograr que sus programas funcionen también bajo Windows (tal vez con MinGW o Cygwin) también si falta la compatibilidad de algunas características.

Además, los diferentes sistemas operativos tienen implementaciones efectivamente diferentes para las mismas cosas (piense en sockets, sistema, gráficos, audio, etc.) por lo que es imposible escribir solo una versión que funcione en todas partes: se le obliga a escribir versión diferente para cualquier sistema operativo para el que planea lanzar su programa.

La respuesta breve es: no, no se puede hacer sin un lenguaje VM a menos que restrinja las capacidades de su programa a un conjunto pequeño de funciones comunes.

(estoy asumiendo que estamos hablando de C/C++ sólo porque por lo general otros idiomas son manejados por un solo grupo de personas cada uno, que se encarga sobre la liberación de él tanto multiplataforma como sea posible)

I realmente no veo ningún punto realmente malo al confiar en una máquina virtual. La computadora hoy en día puede ejecutar máquinas virtuales sin grandes problemas de velocidad. Luego, tener algo que le importe al colocar una capa de abstracción entre usted y el sistema operativo le permitirá hacer cosas avanzadas simplemente conociendo una forma de hacerlo ... Creo que una compensación de velocidad de algo como Java es ampliamente aceptable ... simplemente lo hicieron qué tendrías que hacer cuando intentes escribir una aplicación multiplataforma compleja.

Solo un hecho: realmente me dolió cuando traté de portar una máquina virtual que escribí desde Unix (Linux/OSX) a Windows debido a la función freopen ... desafortunadamente Windows maneja las transmisiones de una manera diferente en comparación con otros sistemas operativos MinGW carecía de esa función y tuve que encontrar una forma de evitar ese problema.

+1

@Jack - eso no es del todo cierto. Usando la compilación condicional en C o C++, puede escribir un programa que usará funciones específicas del sistema operativo y simplemente compilar de manera diferente en cada plataforma. Por supuesto, en ese caso, el esfuerzo puede ser casi lo mismo que escribir dos aplicaciones. –

+2

Sí, pero eso no está escribiendo una aplicación multiplataforma. Eso es escribir dos aplicaciones diferentes que se basan en algunos componentes compartidos (multiplataforma) que no usan funciones avanzadas. La compilación condicional es una forma de compilar en muchas plataformas sin tener un programa real multiplataforma (ya que como usted también declara el esfuerzo es casi tanto como escribir 2 aplicaciones) – Jack

+0

Hay muchos programas de código abierto que compilan en Windows y varios Unix Sistemas operativos, por ejemplo, entonces, al usar autoconf, por ejemplo, puede hacer que el entorno se adapte para que pueda compilarse en casi cualquier combinación de sistema operativo/hardware. –

0

No existe una determinada máquina virtual de Java que funcione en diferentes plataformas. Java tiene diferentes máquinas virtuales que se ejecutan en diferentes plataformas para que un programa Java se ejecute en cada plataforma. Es una especie de capa que hace que los programas Java puedan ejecutarse en cualquier lugar.

Por ejemplo, un programa C puede ejecutarse tanto en Windows como en Linux, pero debe compilarse con el compilador correspondiente del SO en el que ejecuta la aplicación.

Pero en Java, no necesita hacerlo. Simplemente compila el origen y puede distribuir los archivos compilados que están listos para ejecutarse en cualquier plataforma.

7

diría que esto se reduce a:

  • No utilizar características no estándar "Standard Library", donde no estándar depende de lo que usted apunta plataformas (sistemas compatibles con POSIX, por ejemplo). Por ejemplo, si usa C, no use popen() si desea que su aplicación se ejecute en sistemas que no sean POSIX.
  • Asegúrate de manejar la endiadad correctamente donde debe estar, p. cuando transmite datos a través de la red a otra computadora posiblemente usando un orden de bytes diferente.
  • Escribir solo el código compatible, p. no dependa de las características específicas de GCC/VC/name-your-compiler.

En un nivel más práctico que mi consejo es:

  • bibliotecas de la plataforma Uso transversales que abstraer la funcionalidad no estándar que necesita, o escribir el código para manejar todas las plataformas que oriente.
  • Y, relacionado con el punto anterior, aléjese de las dependencias que no sean de plataforma cruzada. P.ej. use OpenGL en lugar de Direct3D, y Qt/Gtk/whatever en lugar de sus herramientas nativas para widgets de plataforma.

EDIT: Hay más cosas en que pensar, como no asumir que / se utiliza como separador de ruta, o hacer suposiciones no válidas sobre los que se permiten caracteres en nombres de archivo.

0

Si elige un lenguaje de scripting moderno (Tcl y Python son dos ejemplos valiosos) puede escribir programas que se ejecutan de manera casi idéntica en todas las plataformas. Claro, tendrás que hacer pequeñas asignaciones para una plataforma u otra, pero eso es bastante fácil de hacer. Eche un vistazo a esos idiomas para obtener algo de inspiración.

No creará el próximo photoshop o shooter en primera persona con estos idiomas, pero para la gran mayoría de las tareas de programación comunes estos son bastante adecuados.

Si quieres algo concreto, echar un vistazo a http://tkdocs.com que muestra el conjunto de herramientas de funcionamiento Tk en múltiples plataformas y con múltiples idiomas (Tcl, Ruby, Perl, Python)

+0

En realidad, puede corregir el siguiente Photoshop en su mayoría Python y algunas extensiones portátiles C para el rendimiento, aproximadamente el 80% de Adobe Lightroom y todos sus complementos están escritos en Lua. Y Google tiene una versión de Quake ejecutándose en JavaScript @ 30+ fps. –

2

Si no utiliza un "código una vez, ejecutar en cualquier lugar" entorno de desarrollo (en otras palabras, algunos de su código tiene que ser personalizado para cada plataforma en la mira), entonces asegúrese de que realmente necesita que su programa se ejecute en múltiples plataformas.

Conozco un programa que se compiló en dos versiones, una para Mac y otra para Windows. Aunque la mayoría del código era idéntico para cualquiera de las plataformas, una parte era específica para las O/S del host, y las modificaciones y pruebas frecuentemente necesarias son únicas para los dos entornos. Las ventas fueron 98% Windows, 2% Mac, sin embargo, las dos versiones requerían esencialmente el mismo diseño/programación/prueba/tiempo de documentación. Los propietarios decidieron que en lugar de dar la mitad de cada $ de programador futuro a la versión de Mac por solo un 2% de devolución, simplemente enlataban esa versión. Sus problemas multiplataforma desaparecieron inmediatamente, y la productividad de sus programadores se duplicó (lo cual agradó a los clientes de Windows).

2

Pedí un libro, pero nadie lo mencionó.

Encontré un libro llamado "Desarrollo multiplataforma en C++: creación de aplicaciones Mac OS X, Linux y Windows".

Hay va un enlace para Amazon y una descripción para que estén interesados:

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 
Cuestiones relacionadas