¿C tiene un ABI estándar?

8 minutos de lectura

avatar de usuario
fredodesbordamiento

De una discusión en algún otro lugar:

C ++ no tiene ABI estándar (interfaz binaria de aplicación)

Pero C tampoco, ¿verdad?

En cualquier plataforma dada, prácticamente lo hace. No sería útil como lingua franca para la comunicación entre lenguas si careciera de una.

¿Cuál es su opinión sobre esto?

  • ABI? ¿Quiere decir API “Interfaz de programación de aplicaciones”?

    – duffymo

    20 de diciembre de 2010 a las 11:06

  • Creo que OP significa interfaz binaria de aplicación

    – dorón

    20 de diciembre de 2010 a las 11:07

  • No, ABI como en la interfaz binaria de la aplicación.

    – Simona

    20 de diciembre de 2010 a las 11:09

  • Creo que @FredOverflow significa interfaz binaria de aplicación ABI en.wikipedia.org/wiki/Application_binary_interface

    –Manuel Salvadores

    20 de diciembre de 2010 a las 11:09

  • Creo que “en cualquier plataforma dada” es un poco prolijo, presumiblemente por accidente. Casi podría definir “plataforma” en el sentido de “usar la misma C ABI en todo”. Específicamente, cualquier formato definido para código cargado dinámicamente debe definir una ABI para llamadas a través de límites ejecutables. Que ABI ciertamente necesita admitir C para tener un uso práctico (suponiendo que las personas vayan a escribir ejecutables en C o C ++), y puede que también soporta C++, si tienes suerte. Si es compatible con C pero no con C++, escribe C++ con extern "C" en todo lo que publique y/o utilice el mismo compilador para los ejecutables vinculados.

    –Steve Jessop

    20 de diciembre de 2010 a las 11:48

C no define ABI. De hecho, hace todo lo posible para evitar definir una ABI. Aquellas personas, que como yo, que han pasado la mayor parte de su vida de programación programando en C en arquitecturas de 16/32/64 bits con bytes de 8 bits, aritmética de complemento a 2 y espacios de direcciones planas, por lo general se sorprenderán bastante al leer el enrevesado lenguaje de el estándar C actual.

Por ejemplo, lea las cosas sobre los punteros. El estándar no dice nada tan simple como “un puntero es una dirección” porque eso sería hacer una suposición sobre la ABI. En particular, permite que los punteros estén en diferentes espacios de direcciones y tengan un ancho variable.

Una ABI es una asignación del modelo de ejecución del lenguaje a una combinación particular de máquina/sistema operativo/compilador. No tiene sentido definir uno en la especificación del lenguaje porque corre el riesgo de excluir las implementaciones de C en algunas arquitecturas.

  • “[…] por lo general, se sorprenderá bastante al leer el lenguaje enrevesado del estándar C actual.”: ¿desde qué versión del estándar? Sobre los punteros, nunca he comprobado si ISO C lo permitía o no, pero sé que existían los llamados modelos de memoria pequeña, grande y mediana (la mediana era algo mixta) que eran famosos en la época de los 16 bits. DOS (muchas veces ejecutándose en una máquina de 32 bits); Ya no se garantizaba que los punteros tuvieran el mismo tamaño todo el tiempo.

    – Hibou57

    18/04/2013 a las 16:37


  • @ Hibou57 en el momento en que escribí la respuesta, el estándar C actual era C99. Dudo que haya cambiado mucho en C11. Los modelos de memoria pequeña, grande y mediana no formaban parte de C, sino de la mayoría de las implementaciones de C en la arquitectura 8086.

    – JeremyP

    24 de febrero de 2014 a las 14:06

  • @curiousguy Bueno, podría ser un índice en una matriz o podría ser un identificador que redirige a través de una tabla de direcciones o podría ser un segmento y un desplazamiento o podría tener un descriptor etiquetado. El estándar C en ninguna parte dice que tiene que ser una dirección.

    – JeremyP

    1 de enero de 2020 a las 20:15

  • @curiousguy Si va a decir que cualquier cosa que se pueda decodificar en una dirección es una dirección, entonces todo es una dirección excepto un literal. Dejas la palabra prácticamente sin sentido.

    – JeremyP

    1 de enero de 2020 a las 20:29

  • @curiousguy ¿Por qué no?

    – JeremyP

    6 de enero de 2020 a las 16:20

C no tiene ABI estándar en principio, pero en la práctica, esto rara vez importa: usted hace lo que hace su proveedor de sistema operativo.

Tome las convenciones de llamadas en Windows x86, por ejemplo: La API de Windows usa la llamada convención de llamadas ‘estándar’ (stdcall). Por lo tanto, cualquier compilador que desee interactuar con el sistema operativo debe implementarlo. Sin embargo, stdcall no es compatible con todas las funciones del lenguaje C90 (por ejemplo, llamar a funciones sin prototipos, funciones variadas). Como Microsoft proporcionó un compilador de C, fue necesaria una segunda convención de llamada, llamada convención de llamada ‘C’ (cdecl). La mayoría de los compiladores de C en Windows usan esto como su convención de llamada predeterminada y, por lo tanto, son interoperables.

En principio, lo mismo podría haber sucedido con C++, pero como la ABI de C++ (incluida la convención de llamadas) es necesariamente mucho más elaborada, los proveedores de compiladores no acordaron una sola ABI, pero aún podrían interoperar recurriendo a extern "C".

  • Esto es correcto pero no lo suficientemente claro. No se trata tanto de que los proveedores no se pongan de acuerdo entre ellos sobre un ABI común (eso podría ser resuelto por un comité de estandarización). Se trata más bien de que el mismo proveedor no está de acuerdo consigo mismo en diferentes momentos debido a que no siempre predice los desarrollos futuros.

    –Patrick Fromberg

    5 sep 2019 a las 13:35

avatar de usuario
Adrián Cox

El ABI para C es específico de la plataforma: cubre problemas como la asignación de registros y las convenciones de llamadas, que obviamente son específicas de un procesador en particular. Aquí hay unos ejemplos:

x86 ha tenido muchas convenciones de llamadas, qué extensiones en Windows declaran cuál se usa. Las ABI de la plataforma para Linux incorporado también han cambiado con el tiempo, lo que genera un espacio de usuario incompatible. Ver algo de historia de la Puerto ARM Linux aquíque muestra los problemas en la transición a una ABI más nueva.

  • Seguí adelante y eliminé el enlace roto.

    – jasonleonhard

    3 de febrero de 2021 a las 1:30

avatar de usuario
Un programador

Una ABI, incluso para C, tiene partes que son bastante independientes de la plataforma, partes que dependen del procesador (qué registros deben guardarse, cuáles se usan para pasar parámetros,…) y partes que dependen del sistema operativo (más o menos los mismos factores que para el procesador, ya que algunas opciones no son impuestas por la arquitectura sino que son el resultado de compensaciones, además de que algunos sistemas operativos tienen una noción de excepción independiente del idioma y, por lo tanto, un compilador para cualquier idioma tiene que generar lo correcto para manejar esos, el manejo de subprocesos también puede imponer cosas en la ABI: si un registro apunta a TLS, no puede usarlo para lo que desea).

En teoría, cada compilador puede tener su propia ABI. Pero, por lo general, para un par de procesadores/SO, el proveedor del sistema operativo corrige la ABI, que a menudo también proporciona un compilador C y bibliotecas comunes que usan esa ABI y los competidores prefieren ser compatibles. (No me sorprendería si hay excepciones para algunos sistemas operativos para los que C no es un lenguaje de programación principal).

Pero el proveedor del sistema operativo puede cambiar la ABI por una razón u otra (las nuevas versiones de los procesadores pueden tener características que desee usar en la ABI, por ejemplo, algunos han pedido una ABI de 32 bits para x86_64 que permita usar todos los registros) . Durante la fase de migración, que puede durar mucho tiempo, es posible que deba manejar dos ABI.

Aunque se han realizado varios intentos para definir una sola ABI para una arquitectura determinada en múltiples sistemas operativos (particularmente para i386 en sistemas Unix), los esfuerzos no han tenido tanto éxito. En cambio, los sistemas operativos tienden a definir sus propias ABI…

citando… Programación del sistema Linux página 4.

avatar de usuario
Chawathe Vipul S

C tampoco, ¿verdad?
Derecha

En cualquier plataforma dada bastante lo hace. No sería útil como lingua franca para la comunicación entre lenguas si careciera de una.
bastante podría referirse a los valores predeterminados específicos de la arquitectura elegidos por los proveedores de compiladores de C que se adaptan a otros lenguajes. Entonces, si el compilador ARM C de Keil usará el ordenamiento de parámetros little endian de izquierda a derecha y se apilará para pasar argumentos y algún registro predeterminado para el valor de retorno, entonces el “C” externo de otros compiladores asumirá la compatibilidad con dicho esquema.

Si bien dicho acuerdo puede considerarse parte de ABI, a diferencia del contexto de ejecución administrada, como el entorno limitado del navegador JVM, esto está lejos de ser un ABI estándar completo por sí mismo.

avatar de usuario
dorón

C no tiene un ABI estándar. Esto se ilustra fácilmente con todas las convenciones de llamadas (cdecl, fastcall y stdcall) que se utilizan. Cada uno es un ABI diferente.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad