# Multiplataforma

En informática, se denomina multiplataforma a un atributo conferido a programas informáticos o métodos y conceptos de computación que son implementados, y operan internamente en múltiples plataformas informáticas. El software multiplataforma puede dividirse en dos grandes tipos o clases: uno requiere una compilación individual para cada plataforma que le da soporte, y el otro se puede ejecutar directamente en cualquier plataforma, sin preparación especial, por ejemplo, el software escrito en un lenguaje interpretado o bytecode precompilado portable, para los cuales los intérpretes o paquetes en tiempo de ejecución son componentes comunes o estándar de todas las plataformas.
Por ejemplo, una aplicación multiplataforma puede ejecutarse sin problema alguno, tanto en Microsoft Windows en la arquitectura x86, como en Linux en la arquitectura x86 y Mac OS X, ya sea en el PowerPC o sistemas Apple Macintosh basados en x86. En general, una aplicación multiplataforma se puede ejecutar tanto en todas las plataformas existentes o como mínimo dos plataformas.

## Plataformas

Una plataforma es una combinación de hardware y software utilizado para ejecutar aplicaciones de software. Una plataforma puede describirse simplemente como un sistema operativo o arquitectura de ordenador, o podría ser la combinación de ambos. Alguno ejemplos de plataforma común son Microsoft Windows (que se ejecuta en la arquitectura x86), Android (que se ejecuta en la arquitectura ARM), Linux/Unix, Mac OS X.
Una aplicación se puede escribir en dependencia de las características de una determinada plataforma, ya sea el hardware, sistema operativo o máquina virtual en que se ejecuta. La plataforma Java es una máquina virtual de la plataforma que se ejecuta en sistemas operativos y tipos de hardware, y es una plataforma de software común para escribir (programar).

### Plataformas de hardware

Una plataforma de hardware puede referirse a la arquitectura del ordenador o la arquitectura del procesador. Por ejemplo, los CPUs x86 y x86-64 constituyen una de las más comunes arquitecturas de computadoras en uso en los ordenadores de propósito general. Estas máquinas suelen ejecutar una versión de Microsoft Windows, aunque también se puede ejecutar otro sistemas operativos, tales como Linux, OpenBSD, NetBSD, Mac OS X yFreeBSD.
Una arquitectura ARM es común en los teléfonos inteligentes y Tablet PC, que corren Windows, Android, iOS y otros sistemas operativos móviles.

### Plataformas de software

Las plataformas de software puede ser un sistema operativo o entorno de programación, aunque más comúnmente se trata de una combinación de ambos. Una notable excepción a esto es Java, que utiliza un sistema operativo independiente de la máquina virtual para cada código compilado, conocido en el mundo de Java como bytecode. Ejemplos de plataformas de software incluyen:
* Android (sistema operativo) para teléfonos inteligentes y Tablet PC
* AmigaOS (m68k), AmigaOS 4 (PowerPC), AROS (x86, PowerPC, m68k), MorphOS (PowerPC)
* BSD, muy multiplataforma (ver NetBSD, por ejemplo)
* Java
* Linux (x86, x86-64, PowerPC, y otras arquitecturas)
* iOS (ARM)
* Mac OS X (x86, x86-64)
* Microsoft Windows (x86, x86-64, ARM)
* DOS sistemas de tipo en el x86: MS-DOS, IBM PC-DOS, DR-DOS, FreeDOS, etc.
* OS/2, eComStation
* Solaris (SPARC, x86, x86-64)
* La CLI, también conocido por los nombres de aplicación .NET Framework (de Microsoft) y Mono (de Novell)

#### Plataforma Java

Como ya se ha señalado, la plataforma Java es una excepción a la regla general de que un sistema operativo es una plataforma de software. El lenguaje Java requiere de una máquina virtual, o un "CPU virtual" en el que se ejecuta todo el código que se escribe en el lenguaje. Esto permite que el mismo ejecutable binario pueda ejecutarse en todos los sistemas, apoyado por el software Java, a través del uso de una máquina virtual Java (JVM). Los ejecutables de Java no se ejecutan de forma nativa en el sistema operativo, es decir, ni Windows ni Linux ejecutan programas Java directamente.
Aunque el código Java no se ejecuta de forma nativa, la JVM es plenamente capaz de proporcionar servicios relacionados con el sistema operativo, como la entrada y salida de disco y el acceso a la red, si cuenta con los privilegios adecuados. La JVM permite a los usuarios decidir el nivel de protección adecuado, según una lista de control de acceso. Por ejemplo, el acceso a disco y de red está habilitado normalmente para aplicaciones de escritorio, pero no para applets basados en el navegador. Java Native Interface (JNI) también se puede utilizar para permitir el acceso a funciones específicas de los sistemas operativos, aunque sacrificando la portabilidad.
En la actualidad, los programas Java pueden ejecutarse en Microsoft Windows, Mac OS X, Linux y sistemas operativos Solaris. Para aplicaciones móviles, los plugins de los navegadores se utilizan en dispositivos basados en Windows y Mac, Android tiene soporte incorporado para Java.

## Implementación

Para que el software pueda ser considerado multiplataforma, debe ser capaz de funcionar en más de una arquitectura de ordenador o sistema operativo. Desarrollar un software multiplataforma puede ser una tarea ardua, ya que los diferentes sistemas operativos tienen diferentes interfaces de programación de aplicaciones (API).
El hecho de que un determinado sistema operativo se pueda ejecutar en diferentes arquitecturas de computadora no quiere decir que el software escrito para ese sistema operativo automáticamente funcione en todas las arquitecturas que soporta el sistema operativo. Esto también significa que solo porque un programa se escriba en un lenguaje de programación popular como C o C++, no tiene por qué funcionar en todos los sistemas operativos que soporten la programación de dicho lenguaje o incluso en el mismo sistema operativo en una arquitectura diferente.

### Aplicaciones web

Las aplicaciones web se suelen considerar multiplataforma, ya que en principio son accesibles desde cualquier navegador web, siendo este la plataforma en cuestión, y cualquier sistema operativo. Las aplicaciones web emplean generalmente una arquitectura cliente-servidor, y pueden variar enormemente en complejidad y funcionalidad. Esto hace que pueda ser difícil conciliar las necesidades funcionales con las necesidades de compatibilidad.
Las aplicaciones web más básicas llevan a cabo la mayor parte o incluso la totalidad del procesamiento en un servidor web sin estado, y transfieren el resultado al navegador web del cliente. Toda la interacción del usuario con la aplicación consta de simples intercambios de peticiones de datos y respuestas del servidor. Estas aplicaciones fueron la norma en las fases iniciales del desarrollo de aplicaciones para la World Wide Web, y siguen un modelo sencillo de transacciones, idéntico al que se usa para servir páginas web estáticas. Hoy en día, siguen siendo relativamente habituales, especialmente cuando se prioriza la compatibilidad entre plataformas y la simplicidad sobre las funcionalidades avanzadas.
Algunos ejemplos destacados de aplicaciones web avanzadas son la interfaz web de Gmail y Google Maps. Estas aplicaciones dependen habitualmente de funcionalidades que se encuentran solo en versiones recientes de los principales navegadores web, como Ajax, JavaScript, HTML dinámico, SVG, y otros componentes de las aplicaciones enriquecidas de Internet.

#### Estrategias de diseño

A causa de la dificultad de conciliar la compatibilidad entre plataformas y el uso de funcionalidades avanzadas, han surgido numerosas alternativas de diseño de aplicaciones web. Muchos sistemas de software utilizan una arquitectura en capas donde el código dependiente de la plataforma está restringido a las capas superior e inferior.

##### Degradación grácil

La degradación grácil intenta proporcionar la misma funcionalidad o al menos una similar para todos los usuarios y plataformas, sacrificando algo de esa funcionalidad a un "mínimo común denominator" compatible con navegadores más limitados en prestaciones. Por ejemplo, un usuario que intenta usar un navegador limitado para acceder a Gmail puede notar que Gmail cambia al "modo básico", con una funcionalidad reducida pero aún útil.

##### Separación de la funcionalidad

La separación de las funcionalidades intenta omitir sin más los subconjuntos de la funcionalidad que no se pueden materializar en determinados navegadores o sistemas operativos, sin dejar de ofrecer una aplicación "completa" para el usuario.

##### Bases de código múltiples

Las aplicaciones con varias bases de código presentan versiones diferentes de una misma aplicación en función del cliente específico en uso. Esta estrategia es la forma más compleja y costosa de cumplir con la capacidad multiplataforma, ya que incluso las diferentes versiones de un mismo navegador (dentro del mismo sistema operativo) puede diferir considerablemente entre sí. Esto se complica aún más atendiendo al soporte de complementos que pueden o no estar presentes en una instalación dada de una versión particular de un navegador web.

##### Bibliotecas de terceros

Las bibliotecas de terceros intentan simplificar la capacidad multiplataforma "escondiendo" las complejidades de la diferenciación entre clientes detrás de una sola API unificada.

#### Estrategias de pruebas

Un aspecto complicado del diseño de las aplicaciones web multiplataforma es la necesidad de pruebas de software. Además de las complicaciones mencionadas anteriormente, existe la restricción adicional de que algunos navegadores web no permiten la instalación de diferentes versiones del mismo navegador en el mismo sistema operativo. A veces se utilizan técnicas como la virtualización completa como solución alternativa para este problema.

### Aplicaciones tradicionales

Aunque las aplicaciones web están gozando de una creciente popularidad, muchos usuarios siguen utilizando software tradicional de aplicación que no se basa en una arquitectura cliente/servidor web. La distinción entre las aplicaciones "tradicionales" y las aplicaciones "web" no es siempre inequívoca, sin embargo, ya que las aplicaciones tienen características, métodos de instalación y arquitecturas muy diferentes, y algunas de ellas pueden superponerse y presentarse de maneras que difuminan la distinción. Sin embargo, esta distinción simplificada es una generalización común y útil.

#### Software binario

Tradicionalmente en la informática moderna, el software de aplicación se ha distribuido a los usuarios finales en forma de imágenes binarias, que se almacenan en ejecutables, un tipo específico de archivo binario. Estos ejecutables solo con compatibles con el sistema operativo y la arquitectura para los que fueron construidos, lo que significa que crear un "ejecutable multiplataforma" sería una enorme tarea, y por lo general no se hace.
Para el software que se distribuye en forma de ejecutable binario, como el software escrito en C o C++, el programador debe construir el software para cada sistema operativo y arquitectura. Por ejemplo, Mozilla Firefox, un navegador web de código abierto, está disponible para Microsoft Windows, Mac OS X (tanto PowerPC como x86 a través de algo que Apple llama un «binario universal»), y Linux en distintas arquitecturas. Las tres plataformas (en este caso, Windows, Mac OS X y Linux) son distribuciones ejecutables independientes, si bien proceden del mismo código fuente.
En el contexto del software binario, los programas multiplataforma están escritos en el código fuente y posteriormente "traducidos" a cada sistema en el que se ejecuta a través de la compilación en distintas plataformas. Además, el software se puede portar a otra arquitectura o a otro sistema operativo para que el programa ahonde en su carácter multiplataforma. Por ejemplo, un programa como Firefox, que ya se ejecuta en Windows en la familia x86, se puede modificar y reprogramar para ejecutarse también en Linux en x86 (y potencialmente en otras arquitecturas).
Como alternativa a la portabilidad, la virtualización multiplaforma permite que las aplicaciones compiladas para una CPU y un sistema operativo se ejecute en un sistema con otra CPU o con otro sistema operativo, sin modificar el código fuente ni los binarios. Por ejemplo, el software Rosetta de Apple, que está integrado en las computadoras Macintosh basados en Intel, ejecuta las aplicaciones compiladas para la anterior generación de equipos Mac que utilizaban la CPU PowerPC. Otro ejemplo es PowerVM Lx86 de IBM, que permite la ejecución sin modificación de aplicaciones Linux/x86 en el sistema operativo Linux/Power.

#### Scripts y lenguajes interpretados

Un script se puede considerar multiplataforma si su intérprete está disponible en múltiples plataformas y la secuencia de comandos solo utiliza los servicios proporcionados por el lenguaje. Es decir, un script escrito en Python para un sistema «Unix-like» probablemente se ejecutará con pocos cambios o ninguno en Windows, ya que Python también se ejecuta en Windows, hay más de una implementación de Python que ejecutará los mismos scripts (por ejemplo, IronPython para .NET). Lo mismo ocurre con muchos de los lenguajes de scripting de código abierto disponibles.
A diferencia de los binarios ejecutables, el script puede utilizar el mismo en todos los equipos que tienen el software para interpretar la secuencia de comandos. Esto se debe a que las secuencias de comandos se almacenan generalmente en un texto sin formato en un archivo de texto. Puede haber algunos problemas, sin embargo, como el tipo de carácter de línea nueva que se encuentra entre las líneas. Generalmente, sin embargo, el trabajo poco o nada tiene que hacer para que un script escrito para un sistema, ejecute en otro.
Un shell de Unix en el que comúnmente se ejecutan en Linux y otros modernos sistemas Unix, así como en Windows a través de Cygwin POSIX (capa de compatibilidad).
Algunos lenguajes de programación multiplataforma populares son:
* Bash: Una shell de Unix presente habitualmente en Linux y otros sistemas modernos Unix-like, así como en Windows mediante la capa de compatibilidad POSIX de Cygwin, Git para Windows o el Subsistema de Windows para Linux.
* Perl: Creado en 1987 y utilizado para programación CGI y pequeñas tareas de administración de sistemas, entre otros.
* PHP: Utilizado principalmente en aplicaciones web.
* Python: Un lenguaje centrado en el desarrollo rápido de aplicaciones y la facilidad de uso por encima de la eficiencia en tiempo de ejecución
* Ruby: Lenguaje orientado a objetos que pretende ser fácil de leer. También se puede utilizar en la web a través de Ruby on Rails.
* Tcl: Lenguaje de programación dinámica adecuado para el desarrollo de aplicaciones web y de escritorio, redes, administración, pruebas y más.

### Videojuegos

El término «multiplataforma» también puede aplicarse a los videojuegos liberados para múltiples plataformas, como las distintas consolas de videojuegos, ordenadores y dispositivos móviles. Algunos ejemplos de juegos de video multiplataforma son Phantasy Star Online, Tomb Raider: Legend y Minecraft. Cada uno de ellos ha sido lanzado en una variedad de plataformas de juego, como la Wii, PlayStation 3, Xbox 360, computadoras personales (PC) y dispositivos móviles.
Las características de un sistema particular puede prolongar el tiempo necesario para implementar un videojuego en múltiples plataformas. Así, un videojuego puede lanzarse primero para algunas plataformas y posteriormente para las demás. Por lo general, esta situación se produce cuando se lanza un nuevo sistema de juego, para que los desarrolladores de videojuegos se familiaricen con el hardware y el software asociado con la nueva consola.
Algunos juegos no pueden ser multiplataforma debido a los acuerdos de licencia entre los desarrolladores y fabricantes de videojuegos de consola que limitan el desarrollo de un juego para una consola en particular. Por ejemplo, Disney podría crear un juego con la intención de lanzarlo para las últimas videoconsolas de Nintendo y Sony. En caso que lo licenciara primero con Sony, podría tener un acuerdo de exclusividad con Sony por un tiempo o de forma indefinida.
Varios desarrolladores han puesto en marcha los medios para que se pueda jugar a videojuegos en línea entre diferentes plataformas. Tanto Epic Games como Microsoft y Valve Software disponen de la tecnología que permite a los jugadores de Xbox 360 y PlayStation 3 jugar con los jugadores de PC, dejando a los consumidores la decisión de qué plataforma utilizar. El primer juego en permitir este nivel de interactividad entre el PC y las videoconsolas fue Quake 3.

#### Juego entre distintas plataformas

Varios desarrolladores han implementado medios para jugar en línea mientras utilizan diferentes plataformas. Psyonix, Epic Games, Microsoft y Valve poseen tecnología que permite a los jugadores de Xbox 360 y PlayStation 3 jugar con jugadores de PC, dejando la decisión de qué plataforma usar a los consumidores. El primer juego que permitió este nivel de interactividad entre los juegos de PC y consola fue Quake 3.
Algunos ejemplos de videojuegos que incluyen juego en línea multiplataforma son Fortnite: Battle Royale, Rocket League, Final Fantasy XIV, Street Fighter V, Killer Instinct, Paragon y Fable Fortune, y Minecraft con su actualización Better Together para Windows 10, ediciones VR, Pocket Edition y Xbox One.

## Programación multiplataforma

La programación multiplataforma es la práctica de la forma activa de la escritura de software que funciona en más de una plataforma.

### Métodos de programación multiplataforma

Hay diferentes maneras de abordar el problema de escribir una aplicación multiplataforma. Una de ellos es simplemente crear varias versiones del mismo programa en diferentes árboles de código fuente, es decir, la versión de Windows de un programa puede tener un conjunto de archivos de código fuente y la versión de Macintosh podría tener otro, mientras que un software libre con sistema Unix-like podría tener otro. Si bien este es un enfoque simple para el problema, tiene el potencial de ser mucho más caro en costos de desarrollo, tiempo de desarrollo, o ambos, sobre todo para las entidades corporativas. La idea detrás de esto es crear más de dos programas diferentes que tienen la capacidad de comportarse de manera similar entre sí. También es posible que este medio de desarrollo de una aplicación multiplataforma dará lugar a más problemas de detección y corrección de errores, porque las distintas versiones provendrían de programadores diferentes, y tendrán potencialmente errores diferentes en cada versión. Cuanto menor sea el equipo de programación, más rápido tiende a ser el proceso de corrección de errores.
Otro enfoque que se utiliza es depender de un software preexistente que oculta las diferencias entre la plataforma, denominado capa de abstracción, que aísla la aplicación de la plataforma, de tal manera que el programa en sí mismo no sabe sobre qué plataforma se está ejecutando. Se podría decir que estas aplicaciones son independientes de la plataforma o agnósticas respecto a la plataforma. Los programas que se ejecutan en la máquina virtual de Java (JVM) se construyen de esta manera.
Algunas aplicaciones mezclan diversos métodos de programación multiplataforma para crear la aplicación final. Un ejemplo de esto es el navegador web Firefox, que utiliza la abstracción para construir algunos de los componentes de nivel inferior, subestructuras separadas de código para implementar las características específicas de la plataforma (como la interfaz gráfica de usuario), y la aplicación de más de un lenguaje interpretado para contribuir a facilitar la portabilidad. Firefox implementa XUL, CSS y JavaScript para extender las capacidades del navegador, además de plugins al estilo del clásico navegador Netscape. Gran parte del propio navegador también está escrito en XUL, CSS y JavaScript.

### Bibliotecas y entornos de programación multiplataforma

Hay una serie de herramientas que están disponibles para ayudar a facilitar el proceso de programación multiplataforma:
* Cairo: Una biblioteca de software libre que se utiliza para proporcionar una API basada en gráficos vectoriales e independiente del dispositivo. Está diseñado para proporcionar primitivas para dibujos bidimensionales mediante una serie de backends diferentes. Cairo está escrito en C y tiene conectores para muchos lenguajes de programación.
* Eclipse: Entorno de desarrollo multiplataforma de código abierto. Implementado en Java con una arquitectura configurable que soporta muchas herramientas para desarrollo de software. Cuenta con complementos para varios lenguajes, como Java y C++.
* FLTK: Otro código abierto multiplataforma. Kit de herramientas, pero más ligero, ya que se limita a la GUI.
* GTK+: Una biblioteca de widgets de fuente abierta widget para sistemas Unix-like con X11 y Microsoft Windows.
* Qt: Una estructura de aplicaciones y biblioteca de widgets para sistemas Unix con X11, Microsoft Windows, Mac OS X y otros sistemas, disponible en código abierto así como con licencias propietarias.
* Simple DirectMedia Layer: Una biblioteca multimedia multiplataforma de código abierto, escrita en C que proporciona acceso de nivel bajo y alto a los gráficos, de entrada, audio, etc.
* Smartface Platform: Una herramienta multiplataforma para Windows que se usa para crear aplicaciones móviles para J2ME, Symbian S60, Blackberry y Android, usando herramientas de arrastrar y soltar y edición de acciones.
* Tcl/Tk
* Ultimate++: es un marco de desarrollo rápido de aplicaciones multiplataforma de C++ centrado en la productividad de los programadores. Incluye un conjunto de bibliotecas de usuario (GUI, SQL, etc.) y un entorno de desarrollo integrado. Es compatible con sistemas operativos Windows y Unix-like. U++ compite con lenguajes de scripting populares preservando características de C/C++ de tiempo de ejecución. Tiene su propio entorno de desarrollo integrado, TheIDE.
* wxWidgets: una biblioteca de widgets de fuente abierta que es también un marco de aplicaciones. Se ejecuta en sistemas Unix-like con X11, Microsoft Windows y Mac OS X.
* XPower++: es un IDE multiplataforma para Windows, Linux, Mac OS X y sistemas operativos móviles.

## Desafíos para el desarrollo multiplataforma

El desarrollo multiplataforma comporta algunos desafíos. Algunos de estos se enumeran a continuación:
* Las pruebas en aplicaciones multiplataforma pueden ser un proceso mucho más complicado, ya que las diferentes plataformas pueden exhibir comportamientos ligeramente diferentes o errores sutiles. Este problema ha llevado a algunos desarrolladores a ridiculizar el desarrollo multiplataforma con la expresión «Se escribe una vez, se depura en todas partes» (Write Once, Debug Everywhere), a la sazón una parodia del eslogan de Sun «Se escribe una vez, se ejecuta en todas partes» (Write Once, Run Everywhere).
* Los desarrolladores a menudo se tienen que limitar a utilizar el menor subconjunto de características que están disponibles en todas las plataformas. Esto puede afectar al rendimiento de la aplicación o impedir el uso por parte de los desarrolladores de las características más avanzadas que permite la plataforma.
* Las diferentes plataformas a menudo tienen diferentes convenciones de interfaz de usuario a las cuales las aplicaciones multiplataforma no siempre se acomodan. Por ejemplo, las aplicaciones desarrolladas para Mac OS X y GNOME sitúan el botón más importante en la parte derecha de la ventana o del cuadro de diálogo, mientras que Microsoft Windows y KDE tienen la convención opuesta. Aunque muchas de estas diferencias son sutiles, una aplicación multiplataforma que no se ajusta adecuadamente a estos convenios puede resultar tosca o poco intuitiva para el usuario. Cuando se trabaja con rapidez o bajo presión, estos conflictos entre convenciones pueden dar lugar a la pérdida de datos, por ejemplo, si un cuadro de diálogo pide confirmar si el usuario desea guardar o descartar los cambios realizados en un archivo.
* Los lenguajes de secuencias de comandos y las máquinas virtuales deben traducirse a código ejecutable nativo cada vez que se ejecuta la aplicación, imponiendo una penalización en el rendimiento. Esta penalización se puede mitigar mediante técnicas avanzadas como la compilación en tiempo de ejecución, pero incluso con estas técnicas es inevitable que se produzca algo de sobrecarga computacional.
* Las diferentes plataformas requieren el uso de formatos de paquetes nativos tales como RPM y MSI. Los instaladores multiplataforma como InstallAnywhere, JExpress, InstallBuilder e IzPack abordan esta necesidad.
* Los entornos de ejecución multiplataforma pueden sufrir fallos de seguridad multiplataforma, creando un ambiente fértil para el malware multiplataforma.