Diferencia entre API y ABI


Soy nuevo en la programación del sistema linux y me encontré con API y ABI mientras leía Programación del sistema Linux .

Definición de API:

Una API define las interfaces mediante las cuales una pieza de software se comunica con otro a nivel de fuente.

Definición de ABI:

Mientras que una API define una fuente interfaz, un ABI define el interfaz binaria de bajo nivel entre dos o más piezas de software on a arquitectura particular. Define cómo interactúa una aplicación con cómo interactúa una aplicación con el núcleo, y cómo un la aplicación interactúa con las bibliotecas.

¿Cómo puede un programa comunicarse a nivel de fuente? ¿Qué es un nivel de fuente? ¿Está relacionado con el código fuente? ¿O la fuente de la biblioteca se incluye en el programa principal ?

La única diferencia que conozco es que API es utilizada principalmente por programadores y ABI es utilizada principalmente por compilación.

 145
Author: Cole Johnson, 2010-09-24

7 answers

La API es lo que usan los humanos. Escribimos código fuente. Cuando escribimos un programa y queremos usar alguna función de biblioteca escribimos código como:

 long howManyDecibels = 123L;
 int ok = livenMyHills( howManyDecibels);

Y necesitábamos saber que hay un método livenMyHills(), que toma un parámetro entero largo. Como interfaz de programación, todo se expresa en código fuente. El compilador convierte esto en instrucciones ejecutables que se ajustan a la implementación de este lenguaje en este sistema operativo en particular. Y en este caso dar lugar a un nivel bajo operaciones en una unidad de audio. Tan particulares bits y bytes se chorros en algún hardware. Así que en tiempo de ejecución hay un montón de acción de nivel binario pasando que no solemos ver.

 37
Author: djna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-27 05:30:27

API: Interfaz del Programa de Aplicación

Este es el conjunto de tipos/variables/funciones públicas que expone desde su aplicación/biblioteca.

En C/C++ esto es lo que expones en los archivos de encabezado que envías con la aplicación.

ABI: Interfaz Binaria de la aplicación

Así es como el compilador construye una aplicación.
Define cosas (pero no se limita a):

  • Cómo se pasan los parámetros a las funciones (registros/pila).
  • Oms limpia los parámetros de la pila (caller / callee).
  • Donde se coloca el valor de retorno para return.
  • Cómo se propagan las excepciones.
 244
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 17:07:53

En su mayoría me encuentro con estos términos en el sentido de un cambio incompatible con API o un cambio incompatible con ABI.

Un cambio de API es esencialmente donde el código que se habría compilado con la versión anterior ya no funcionará. Esto puede suceder porque agregaste un argumento a una función o cambiaste el nombre de algo accesible fuera de tu código local. Cada vez que cambias un encabezado, y te obliga a cambiar algo en un .c/.archivo cpp, has hecho un cambio de API.

An El cambio ABI es cuando el código que ya ha sido compilado contra la versión 1 ya no funcionará con la versión 2 de una base de código (generalmente una biblioteca). Esto es generalmente más complicado de realizar un seguimiento que el cambio incompatible con API, ya que algo tan simple como agregar un método virtual a una clase puede ser incompatible con ABI.

He encontrado dos recursos extremadamente útiles para averiguar qué es la compatibilidad ABI y cómo preservarla:

 37
Author: jkerian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-12 04:19:55

Estas son mis explicaciones laicas:

  • api-piensa en los archivos include. proporcionan interfaz de programación
  • abi - think kernel module. cuando se ejecuta en algún núcleo, tienen que acordar cómo comunicarse sin incluir archivos, es decir, como interfaz binaria de bajo nivel
 16
Author: Anycorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-24 05:28:43

Permítanme dar un ejemplo específico de cómo ABI y API difieren en Java.

Un cambio incompatible con ABI es si cambio un método A#m() de tomar un String como argumento a String... argumento. Esto es no es compatible con ABI porque tienes que recompilar el código que está llamando a eso, pero es compatible con API ya que puedes resolverlo recompilando sin ningún cambio de código en el llamante.

Aquí está el ejemplo deletreado. Tengo mi biblioteca Java con clase A

// Version 1.0.0
public class A {
    public void m(String string) {
        System.out.println(string);
    }
}

Y tengo una clase que usa esta biblioteca

public class Main {
    public static void main(String[] args) {
        (new A()).m("string");
    }
}

Ahora, el autor de la biblioteca compiló su clase A, yo compilé mi clase Main y todo está funcionando muy bien. Imagine una nueva versión de A comes

// Version 2.0.0
public class A {
    public void m(String... string) {
        System.out.println(string[0]);
    }
}

Si simplemente tomo la nueva clase compilada A y la dejo junto con la clase compilada previamente Main, obtengo una excepción al intentar invocar el método

Exception in thread "main" java.lang.NoSuchMethodError: A.m(Ljava/lang/String;)V
        at Main.main(Main.java:5)

Si recompilo Main, esto está arreglado y todo está funcionando de nuevo.

 4
Author: user7610,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 16:13:35

(A pplication B inary I nterface) Una especificación para una plataforma de hardware específica combinada con el sistema operativo. Es un paso más allá de la API ( A pplication P rogram I nterface), que define las llamadas de la aplicación al sistema operativo. El ABI define la API más el lenguaje de máquina para una familia de CPU en particular. Una API no garantiza la compatibilidad en tiempo de ejecución, pero una ABI sí, porque define el lenguaje de la máquina, o tiempo de ejecución, formato.

introduzca la descripción de la imagen aquí

Cortesía

 3
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-05 02:57:43

Su programa (código fuente) se puede compilar con módulos que proporcionan una API adecuada.

Su programa (binario) puede ejecutarse en plataformas que proporcionan ABI adecuado.

La API restringe las definiciones de tipos, las definiciones de funciones, las macros y, a veces, las variables globales que una biblioteca debe exponer.

ABI restringe lo que una "plataforma" debe proporcionar para que su programa se ejecute. Me gusta considerarlo en 3 niveles:

  • Nivel de procesador - el conjunto de instrucciones, el calling convention

  • Nivel del núcleo - la convención de llamadas al sistema, la convención especial de rutas de archivo (por ejemplo, los archivos /proc y /sys en Linux), etc.

  • Nivel del sistema operativo: el formato del objeto , las bibliotecas de tiempo de ejecución, etc.

Considere un compilador cruzado llamado arm-linux-gnueabi-gcc. "arm" indica la arquitectura del procesador, "linux" indica el núcleo, " gnu " indica que sus programas de destino usan libc de GNU como biblioteca de tiempo de ejecución, diferente de arm-linux-androideabi-gcc que usan libc de Android aplicación.

 1
Author: ZhouZhuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-21 07:01:32