¿Cómo se determina exactamente la portabilidad de un lenguaje como C? He aprendido que los compiladores son específicos de ISA. Si esto es cierto, ¿cómo es C portátil? ¿O es que solo el código fuente escrito en C es portátil pero no los ejecutables? ¿No son los ISA ejecutables específicos para ejemplos de aplicaciones para x86 separadas de las aplicaciones para Apple (suponiendo que Apple use el microprocesador Motorola / PowerPC)?
10
No es solo específico de ISA. Por ejemplo, usted pregunta:
Sí, lo son, aunque Apple usa hardware x86. Los binarios C son específicos de la arquitectura y el sistema operativo.
fuente
Exactamente. Necesita recompilar su programa C en cada plataforma. Los compiladores de C generan código de máquina que es portátil solo en un grado muy limitado, entre máquinas de la misma arquitectura de procesador / memoria y SO. Es por eso que ve diferentes distribuciones binarias de aplicaciones multiplataforma (por ejemplo, navegadores), como "Linux 64-bit Intel" o "Mac OS X 32-bit PowerPC" (OK, la última es solo una ilustración, sé que Apple cambió a Intel hace unos años :-).
fuente
La mayor parte de la pregunta ha sido respondida, pero me gustaría agregar que la durabilidad es otra cosa que debe tener en cuenta.
Por ejemplo, JAVA puede escribirse una vez y ejecutarse en cualquier plataforma donde esté la VM (hoy, se llama "Runtime Environment"). Pero otra ventaja es que puede ejecutar el código Java 1.1 desde 1995 en su máquina 2011. Lo que no es posible si su código se compiló en i386 e intenta ejecutarlo en su arquitectura AMD64.
También obtienes las mejoras de la máquina virtual.
Entonces, diría que, en general, pasaría de los lenguajes menos portátiles a los más portátiles que tendría: ensamblador, lenguaje compilado de bajo nivel como C, luego C ++, luego lenguajes interpretados o los que se ejecutan dentro de una máquina virtual.
No soy realmente un defensor de Java, al menos no por el idioma ni la comunidad, por ejemplo, pero es el camino a seguir si buscas portabilidad y la menor pérdida de rendimiento en comparación con C.
fuente
Buenas respuestas sobre escribir una vez compilar en cualquier lugar.
A la gente le gusta pensar en C como un lenguaje portátil debido a su popularidad y la alta probabilidad de que un compilador de C esté disponible para futuras plataformas de destino. Otro factor es la biblioteca estándar que ayuda con las tareas de programación comunes de forma independiente de la plataforma.
Entonces diría que la portabilidad de un idioma está determinada por:
Siendo realistas, aunque casi cualquier aplicación C compleja requerirá algo de trabajo para pasar a una nueva plataforma debido a las dependencias del hardware o del sistema operativo. Ese proceso se conoce como portabilidad.
fuente
"Portabilidad" tiene múltiples significados. Con respecto a C, significa lo siguiente:
Se han implementado compiladores para C para una amplia variedad de plataformas de hardware y sistemas operativos, lo que fue un gran negocio a principios de los años 70;
Existe un estándar universalmente acordado para el lenguaje en sí, en lugar de que cada implementación del compilador reconozca una variante ligeramente diferente del lenguaje (de nuevo, un gran problema cuando se diseñó C por primera vez, ya que había múltiples variantes de lenguajes como Pascal y BASIC que no fueron universalmente reconocidos);
Debido a este estándar, el código conforme producirá el mismo comportamiento cuando se compila en diferentes plataformas.
El código fuente es portátil, pero se debe generar un nuevo binario para cada destino.
Tenga en cuenta, sin embargo, que la fuente C rara vez es portátil "trivialmente"; la mayoría de las aplicaciones requieren que vaya más allá de lo que define el estándar de idioma, utilizando extensiones que son exclusivas de una plataforma en particular, por lo que en la práctica el código fuente no es 100% portátil.
Tenga en cuenta, sin embargo, que C deja bastante a la implementación. Los tamaños exactos de varios tipos de datos, el comportamiento en caso de desbordamiento, etc., dependen de la implementación; el estándar proporciona los requisitos mínimos que debe cumplir una implementación, pero la implementación es libre de ir más allá de esos límites.
fuente
Sea lo que sea ISA, C no es específico de ISA. Supongo que no se refiere a la ranura ahora obsoleta para las tarjetas de extensión de PC.
Hay compiladores de C que cumplen con los estándares para muchas plataformas, y siempre que use características de lenguaje completamente definidas en su código fuente, debería poder compilarlo en cualquier compilador de C para cualquier plataforma.
Sin embargo, uno de los problemas es que el estándar C deja mucho comportamiento de las características, ya sea como implementación definida o como comportamiento indefinido. Esto se hace para que el lenguaje C sea más útil en general para la programación de bajo nivel, evitando casos en los que un comportamiento definido con precisión no coincida con lo que el hardware admite en alguna plataforma. Sin embargo, hace que sea un poco más difícil escribir programas portátiles.
Además, a diferencia de algunos lenguajes, C no viene con una gran biblioteca del tipo que proporcionan Java o C #. Puede obtener bibliotecas muy portátiles para hacer casi cualquier cosa, pero debe hacer un trabajo para construirlas y lograr que funcionen juntas.
C tiene una biblioteca estándar, por supuesto, pero su alcance es relativamente limitado en comparación con Java, C #, Python, etc.
fuente