Portabilidad de lenguaje C

10

¿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)?

KawaiKx
fuente

Respuestas:

27

¿Es que solo el código fuente escrito en C es portátil, no los ejecutables?

Correcto. Algunas personas lo llaman escribir una vez, compilar en todas partes.

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere .

La otra alternativa es escribir una vez, ejecutar en todas partes. Java es un buen ejemplo de esto.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

Y a pesar de que puede lograr una portabilidad multiplataforma parcial, nunca debe esperar que su código se ejecute en todas partes sin modificaciones.

adolfojp
fuente
El código fuente de C no es portátil para diferentes compiladores o ISA u OS sin un montón de travesuras extra-linguales. Cosas simples como el tamaño y la alineación de los tipos estándar no son estándar en C, por lo que portar software que intercambiará datos con otras instancias de sí mismo puede ser bastante desafiante. Consulte GNU Autoconf / Automake para ver un ejemplo (posiblemente ofuscado) de los aros que los programadores de C saltarán para obtener portabilidad.
Tim Williscroft
3
@TimWilliscroft: los problemas de portabilidad generalmente son causados ​​por bibliotecas no estándar y malas prácticas de programación; y no son causadas por C o sus bibliotecas estándar. Un ejemplo simple sería utilizar una extensión GCC no estándar o no serializar / deserializar correctamente los datos para IO.
Brendan
6

No es solo específico de ISA. Por ejemplo, usted pregunta:

las aplicaciones para x86 son independientes de las aplicaciones para apple?

Sí, lo son, aunque Apple usa hardware x86. Los binarios C son específicos de la arquitectura y el sistema operativo.

vartec
fuente
1
@ Steven314: Tu comentario es una tangente. No tiene nada que ver con si el hardware es estándar o no, y todo tiene que ver con el hecho de que OS X tiene un formato binario diferente (Mach-O) que el de, por ejemplo, Linux (generalmente ELF).
mipadi
@Steve: EFI vs BIOS solo es importante para el arranque y el sistema operativo interno; La arquitectura de hardware, que es el conjunto de instrucciones de la CPU, es la misma, porque es la misma CPU.
vartec
Comentarios eliminados, principalmente porque nunca debería haber incluido lo de Mac en primer lugar. Mi mención de ABI (Application Binary Interface) y las convenciones de llamadas aún puede ser relevante (un tercer elemento para agregar a "arquitectura y sistema operativo"). No son relevantes para el hardware, excepto en que los ABI tienden a estar diseñados para arquitecturas particulares (por ejemplo, registros disponibles), pero son relevantes para la portabilidad binaria. Este no es un problema de formato de archivo: ELF se usa en Windows y Linux (por gcc), pero probablemente no pueda tomar un archivo objeto de uno a otro.
Steve314
@vartec, usted dijo que los binarios C también son específicos del sistema operativo, ¿es porque O / S en sí es específico de ISA, por lo tanto, los binarios C se vuelven O / S específicos indirectamente?
KawaiKx
@Saurabh: todos los ejecutables nativos son específicos del sistema operativo, porque el sistema operativo especifica el formato del archivo. Además, una biblioteca estándar de C debe implementar muchas funciones llamando al sistema operativo, por lo que incluso si el formato de archivo estuviera estandarizado, el código en sí no podría ejecutarse en otro sistema operativo. Esto es estándar para los lenguajes que compilan en código nativo, a diferencia de algunos códigos de máquinas virtuales como JVM (Java Virtual Machine). Es posible compilar C para una máquina virtual, pero nunca lo hice, que yo sepa. LLVM se acerca más, pero está pensado como un back-end del compilador, no como un entorno de compilación una vez que se ejecuta en cualquier lugar.
Steve314
5

¿Es que solo el código fuente escrito en C es portátil, no los ejecutables?

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 :-).

Péter Török
fuente
3

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.

tiktak
fuente
3

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:

  1. Nivel de estandarización.
  2. Disponibilidad de compiladores para diferentes plataformas / arquitecturas.
  3. Profundidad y amplitud de las bibliotecas portátiles.

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.

Guy Sirton
fuente
3

"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.

John Bode
fuente
0

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.

Steve314
fuente
44
ISA = arquitectura del conjunto de instrucciones, también conocida como arquitectura de hardware
vartec