Acaba de descargar una actualización repleta de funciones a su aplicación de código abierto favorita. Todo está funcionando bien, y lo usas en tus otros dispositivos, así que es hora de implementarlo también.
Excepto que su nueva y brillante computadora portátil Linux no es compatible con su paquete de instalación de Windows. ¿Qué hay de tu tableta Android? iPhone? PS4? ¿Por qué no puedes tomar esa pieza de software y usarla donde quieras? Exploremos algunas barreras diferentes al sueño de "comprar una vez, correr a cualquier parte".
Desarrollo de software y arquitectura de SO
Comprender por qué el software no funciona en todos los sistemas operativos requiere un poco (solo un poco, lo prometo) conocimiento de cómo se hace el software.
El proceso de desarrollo de software
En un flujo de desarrollo de software muy básico para escritorio, servidor y móvil (es decir, no programación web vs. desarrollo web: ¿cuál es la diferencia? Programación vs. desarrollo web: ¿cuál es la diferencia? Podría pensar que programadores de aplicaciones y desarrolladores web hacen el mismo trabajo, pero eso está lejos de la verdad. Estas son las diferencias clave entre programadores y desarrolladores web. Lea más), un programador:
- Escriba algún código en uno o más archivos.
- Compila el código en algo que la computadora puede ejecutar.
- Pruebe para asegurarse de que el programa funcione como se espera.
- Empaque y distribuya / implemente el software.
Es una combinación del primer y el segundo paso que nos concierne aquí. El proceso de compilación de software, o convertirlo de código en uno y ceros que una computadora entiende (lenguaje de máquina) es complejo. No vamos a entrar en él con gran detalle, pero es útil entender a un alto nivel lo que sucede.
Arquitectura del sistema operativo
Un punto importante para entender es que un sistema operativo no es una sola entidad. Por el contrario, está compuesto de capas de software.
Núcleos del sistema operativo
El kernel de un sistema operativo es responsable de comunicarse con el hardware de la computadora. El software comunica sus comandos al núcleo, que a su vez emite comandos al hardware para, por ejemplo, leer un archivo del disco duro o dibujar una ventana en la pantalla. Básicamente, coordina toda la información (ya sea datos almacenados, cálculos o entradas del usuario) entre el hardware y varias piezas de software. El núcleo pone toda esta funcionalidad disponible para el software a través de llamadas al sistema .
El núcleo de cada sistema operativo implementará las llamadas al sistema de manera diferente, en términos de cuáles están disponibles, cómo se llaman o qué opciones toman. Como resultado, el software necesita tener en cuenta las llamadas al sistema compatibles con el kernel de cada sistema operativo al que se dirige. La llamada al sistema que utiliza para enviar datos a la GPU en Linux puede tener un nombre diferente, una lista de información que necesita proporcionar o ambas en Windows. Esa llamada exacta puede que ni siquiera esté allí.
Bibliotecas del sistema
En muchos casos, el software no llama directamente al kernel. En cambio, llama a las bibliotecas del sistema o colecciones de funciones básicas. Las bibliotecas existen para que (por ejemplo) todos y cada uno de los programas que guardan archivos en el disco duro no necesiten escribir una función para hacerlo. En cambio, simplemente se vincula a una biblioteca del sistema y utiliza una función existente. La biblioteca GLibC para Linux es un excelente ejemplo, como son los archivos .DLL en la API de Win32 o los contenidos del directorio / System / Library de Mac Cómo acceder a la carpeta de la biblioteca OS X y por qué es útil Cómo acceder a la biblioteca OS X Carpeta y por qué es útil La mayoría de las carpetas de la Biblioteca OS X son las mejores, pero es útil conocer su camino dentro y alrededor de la Biblioteca del usuario. Lee mas .
Las bibliotecas del sistema actúan como un tipo de intérprete entre las aplicaciones y el kernel para las tareas de rutina. Las aplicaciones realizan llamadas de función a estas bibliotecas, que manejan muchos de los detalles de bajo nivel. También pueden realizar llamadas al kernel por conveniencia. Como habrás adivinado, esto significa que estas librerías están escritas para un núcleo particular y, por lo tanto, no se pueden usar en todos los sistemas operativos con kernels diferentes.
Encabezados de ejecución del sistema operativo
El último obstáculo para el software universal es el formato de archivos ejecutables para los sistemas operativos. Un sistema operativo espera que los archivos que ejecuta sigan un formato de archivo binario particular Todo lo que necesita saber sobre formatos de archivo y sus propiedades Todo lo que necesita saber sobre formatos de archivo y sus propiedades Usamos la palabra archivo intercambiablemente: música, imagen, hoja de cálculo, presentación de diapositivas, y así. Pero, ¿qué hace que un archivo sea un "archivo"? Probemos y comprendamos esta parte fundamental de la informática. Lee mas . Por ejemplo, los archivos ejecutables y de formato enlazable (ELF) que se ejecutan en sistemas operativos como Linux y FreeBSD deben especificar ciertas propiedades del archivo en ciertos bytes, como se muestra en la imagen siguiente.
La interfaz binaria de aplicación (ABI) que se muestra capaz es de particular importancia. Una combinación de las llamadas disponibles desde el procesador, el kernel y las bibliotecas del sistema, una ABI es similar a una interfaz de programación de aplicaciones (API) ya que define cómo dos programas se comunican entre sí. Pero la API es algo utilizado por los programadores (humanos) en el código fuente para indicar que dos piezas de software deberían comunicarse entre sí. El ABI es lo que realmente les permite hacerlo una vez que el software se compila y ejecuta. Cada sistema operativo implementa un ABI particular, que puede o no cambiar entre las versiones de ese mismo sistema operativo.
En general, los sistemas operativos implementan su propio ABI, determinado por una combinación del tipo de procesador, el kernel y cualquier biblioteca de sistema estándar. Pero a veces un sistema operativo implementará más de uno. FreeBSD tiene soporte para binarios de Linux, por ejemplo, porque proporciona un ABI de Linux como complemento del kernel de FreeBSD (en lugar del kernel de Linux). Esto es diferente de los programas de virtualización ¿Qué es una máquina virtual? ¿Qué es una máquina virtual? Las máquinas virtuales le permiten ejecutar otros sistemas operativos dentro de su sistema operativo actual, pero ¿por qué eso es importante? ¿Cuáles son los pros y los contras? Lea más, como VMWare o VirtualBox, que usan software para simular una máquina completa (hardware y todo). Como resultado, este tipo de compatibilidad ABI es más rápido, pero requiere mucho más esfuerzo de mantenimiento. Por eso es raro, aunque Microsoft vio recientemente el valor de Ubuntu ahora está disponible en la tienda Windows. Ubuntu ahora está disponible en la tienda Windows. Windows Insiders ahora puede descargar e instalar Ubuntu en Windows 10. Esto une a Linux y Windows en una unión impía. pocos imaginaban que vivirían el tiempo suficiente para presenciarlo. Lea más al hacerlo.
Excepción: software interpretado
En base a lo anterior, hemos aprendido que los desarrolladores escriben software para uno, y solo uno, tipo de sistema de destino. Excepto cuando no lo hacen Hay muchas aplicaciones que puede descargar y ejecutar en una Mac, luego copiar y ejecutar en Windows, y tal vez incluso copiar de nuevo y ejecutar en Linux sin problemas. ¿Cómo es esto posible?
¿Estaba mintiendo hasta ahora?
Resulta que hay una categoría de software que se ve en la superficie como que simplemente "se ejecuta en todas partes". Puede descargarlo y ejecutarlo en cualquier plataforma compatible, la palabra clave es "compatible". De hecho, está descargando el código fuente para la aplicación, mientras que otra aplicación (el intérprete ) está ejecutando el código fuente directamente en tiempo real. Esto es algo así como una simplificación excesiva, así que veamos exactamente cómo funciona esto con un par de idiomas.
Java
Cuando se lanzó por primera vez Java, su promesa fue (literalmente) "escribir una vez, ejecutar en cualquier lugar". La idea era crear aplicaciones mediante el uso de funciones de Java para guardar archivos, hacer cálculos o crear una ventana de aplicación. Luego, un Java Runtime Enviornment (JRE) para cada plataforma de computadora compatible ejecutaría el código y lo traduciría a las funciones nativas del sistema operativo. El truco para Java, entonces, es que no se ejecuta "directamente" en el sistema operativo. Se ejecuta en una parte del JRE llamada Java Virtual Machine y eso es lo que se ejecuta en el sistema operativo.
Al insertar esta capa de software adicional entre la aplicación y el sistema operativo, Java le permite concentrarse en un conjunto de funciones que es igual en todos los sistemas operativos. Le dice a Java lo que quiere hacer, y deja que la JVM de su sistema se preocupe por cómo hacerlo. La siguiente imagen muestra esto en acción, donde Java Desktop Application Framework de JIDE Software muestra la misma aplicación para Mac (arriba), Windows (centro-izquierda), "Java puro" (centro-derecha) y Linux (abajo).
Los programas Java no se "compilan" precisamente en tiempo real. Más bien, el compilador de Java los convertirá en "bytecode". Puede pensar en bytecode como un programa a medio hacer. Cuando el desarrollador lanza la aplicación, se compila todo lo que puede sin saber en qué sistema operativo se ejecutará. Cuando realmente lo ejecute, la JVM lo "horneará el resto del camino" para que se ajuste a las funciones particulares del sistema operativo host.
Pitón
Un lenguaje popular interpretado es Python 5 Razones por las que la programación de Python no es inútil 5 Razones por las que la programación de Python no es inútil Python: o te encanta o lo odias. Incluso puedes balancearte de un extremo a otro como un péndulo. De todos modos, Python es un lenguaje difícil de ser ambivalente. Lee mas . Cuando ejecuta una secuencia de comandos de Python, el intérprete de Python traducirá el código en instrucciones para el sistema operativo. También puede funcionar de manera similar a Java: cuando "importas" código desde fuera de tu aplicación, se compila para bytecode la primera vez que se ejecuta. Luego, el intérprete sabrá si, en las ejecuciones posteriores, el código original ha cambiado, y en ese momento volverá a compilarlo en un nuevo bytecode.
Un buen subproducto de esta ejecución "a petición" es que puede usar el intérprete para desarrollar sus scripts de forma interactiva. Simplemente escribiendo "python" en la línea de comando, iniciará el intérprete y podrá ejecutar el código y ver los resultados de inmediato.
Esto significa que los desarrolladores pueden jugar y modificar cosas "en vivo". Luego, una vez que una línea de código hace lo que quieren, cópiela y péguelo en un archivo de script (que es mucho más eficiente que el ciclo de "compilación-código-compilación"). los programadores de lenguaje no interpretados tienen que hacer).
Incluso cuando el software es el mismo, es probable que no
Desafortunadamente para los usuarios, la industria de la tecnología no ha desarrollado un formato verdaderamente "universal". Y puede que nunca lo haga. La introducción de estos tipos de estándares a menudo da como resultado una solución de "mínimo denominador común", con concesiones en aras de obtener la aprobación de todos.
¿Qué piensas? ¿Prefiere tener un software universalmente compatible, incluso si significa que no es tan bueno? ¿O está bien con el sistema operativo que está utilizando y no tiene interés en las aplicaciones de otras plataformas? Háganos saber a continuación en los comentarios!
Créditos de las imágenes: Masterchief_Productions / Shutterstock