2009-03-22 17 views
41

Cosa si intende per IDL? L'ho cercato su google e ho scoperto che è l'acronimo di Interface Definition Language, che viene utilizzato per la definizione dell'interfaccia per i componenti. Ma, in pratica, qual è lo scopo di IDL? Microsoft lo usa?Che cos'è IDL?

+0

vedere anche http://en.wikipedia.org/wiki/Interface_description_language per IDL ... – Thufir

risposta

57

Un linguaggio di definizione dell'interfaccia (IDL) viene utilizzato per configurare le comunicazioni tra client e server nelle chiamate di procedura remota (RPC). Ci sono state molte varianti di questo come Sun RPC, ONC RPC, DCE RPC e così via.

In pratica, si utilizza un IDL per specificare l'interfaccia tra client e server in modo che il meccanismo RPC possa creare gli stub di codice richiesti per chiamare le funzioni attraverso la rete.

RPC deve creare funzioni di stub per il client e un server, utilizzando le informazioni IDL. E 'molto simile ad un prototipo di funzione in C, ma il risultato finale è un po' diverso, come ad esempio:

+----------------+ 
| Client   | 
| +----------+ | +---------------+ 
| | main | | | Server  | 
| |----------| | | +----------+ | 
| | stub_cli |------->| stub_svr | | 
| +----------+ | | |----------| | 
+----------------+ | | function | | 
        | +----------+ | 
        +---------------+ 

In questo esempio, invece di chiamare function nello stesso programma, main chiama una funzione client stub (con lo stesso prototipo come function) che è responsabile per il confezionamento delle informazioni e il trasferimento attraverso un altro processo. Può essere la stessa macchina o una macchina diversa, non importa - uno dei vantaggi di RPC è di poter spostare i server a volontà.

Nel server, c'è un processo di "ascoltatore" che riceverà tali informazioni e lo passerà al server. Lo stub del server riceve le informazioni, lo decomprime e lo passa alla funzione reale.

La funzione reale allora fa quello che deve e ritorna al server stub che può confezionare il backup delle informazioni di ritorno (sia il codice di ritorno e le eventuali [out] o [in,out] variabili) e passare di nuovo allo stub client.

Lo stub del client quindi lo decomprime e lo restituisce a main.

I dettagli effettivi possono differire leggermente ma questa spiegazione dovrebbe essere sufficiente per una panoramica concettuale.

L'attuale IDL può sembrare:

[uuid(f9f6be21-fd32-5577-8f2d-0800132bd567), 
    version(0), 
    endpoint("ncadg_ip_udp:[1234]", "dds:[19]")] 
interface function_iface { 
    [idempotent] void function(
     [in] int handle, 
     [out] int *status 
    ); 
} 

Tutta quella roba in alto è fondamentalmente informazioni di rete, la carne di esso è all'interno della sezione interfaccia in cui sono mostrati i prototipi. Ciò consente al compilatore IDL di creare le funzioni x stub e x server per la compilazione e il collegamento con il codice client e server per far funzionare RPC.

Microsoft utilizza IDL (penso che abbiano un compilatore MIDL) per la roba di COM. Ho anche utilizzato prodotti di terze parti con sistemi operativi MS, sia DCE che ONC RPC.

+2

Hanno un compilatore MIDL. Si chiama midlc. Har har. – sblom

+8

midlc in contrapposizione a C#? :-) Solo i musicisti capiranno questo umorismo, zoppo com'è. – paxdiablo

1

È un linguaggio che è stato utilizzato nell'era COM per definire interfacce in modo (apparentemente) neutro rispetto alla lingua.

10

C'è anche Interactive Data Language che ho avuto un impiego utilizzando per analisi di dati scientifici, ma forse dal contesto è chiaro per voi che non è ciò che questo IDL rappresenta.

1

Definisce l'interfaccia da utilizzare per la comunicazione con un servizio esposto in un'altra applicazione.

Se si utilizza SOAP, si conoscerà WSDL. Il WSDL è un'altra forma di IDL.IDL di solito si riferisce a Microsoft COM o CORBA IDL.

5

IDL è l'acronimo di Interface Definition Language di cui esistono diverse varianti a seconda del fornitore o del gruppo standard che ha definito la lingua. L'obiettivo di un IDL è descrivere l'interfaccia per alcuni servizi in modo che i clienti che desiderano utilizzare il servizio sappiano quali metodi e proprietà, l'interfaccia, fornisce il servizio. IDL viene normalmente utilizzato con interfacce binarie e il file di linguaggio IDL descrive i tipi di dati utilizzati nell'interfaccia binaria.

Esistono diversi standard per i componenti binari, in genere COTS or Commercial Off The Shelf e il modo in cui un client comunica con il componente binario può variare anche se per tradizione viene utilizzata una versione di Remote Procedure Call or RPC. Due di questi standard sono Microsoft Common Object Model or COM standard e Common Object Request Broker or CORBA standard. Esistono altri standard per componenti come Firefox plugins o plug-in per altre applicazioni come Visual Studio, tuttavia questi non utilizzano necessariamente una qualche forma di Interface Description Language utilizzando invece una sorta di Software Development Kit o SDK con interfacce standardizzate e ben note a un API.

Ciò che IDL consente è un maggiore grado di flessibilità nella possibilità di creare componenti che offrono servizi di vario genere che, a causa della loro natura binaria, possono essere utilizzati con una varietà di linguaggi di programmazione e una varietà di ambienti diversi.

Microsoft utilizza un dialetto di IDL con oggetti COM e IDL Microsoft non è lo stesso di IDL CORBA anche se esistono delle somiglianze poiché condividono le radici della lingua comune. Il file IDL contiene la descrizione delle interfacce supportate da un oggetto COM. COM consente la creazione di servizi In Process (può utilizzare RPC o chiamate DLL dirette) o Out of Process (utilizza RPC). L'idea alla base di COM è che il client deve solo conoscere l'identificatore per il componente e l'interfaccia per poterlo utilizzare. Il client richiede l'oggetto COM quindi richiede un oggetto classe dalla factory dell'oggetto COM che supporta l'interfaccia che il client desidera utilizzare e quindi utilizza l'oggetto COM attraverso tale interfaccia.

Microsoft fornisce il compilatore MIDL che elabora un file IDL per generare la libreria dei tipi, fornendo informazioni agli utenti dell'oggetto COM sull'interfaccia e gli stub necessari per il marshalling dei dati nell'interfaccia tra client e servizio.

Il marshalling dei dati significa fondamentalmente che lo stub prende i dati forniti dal client, lo impacchetta e lo invia al servizio che esegue un'azione e restituisce i dati. Questo invio e ricezione di dati può avvenire tramite alcuni servizi RPC o tramite chiamate dirette alla funzione DLL. La risposta del servizio viene tradotta in un modulo adatto al cliente e quindi fornito al cliente. In pratica, la funzionalità di marshalling è uno adapter (see the adapter design pattern) o bridge (see the bridge design pattern) tra il client e il servizio.

Visual Studio, la mia esperienza è con C++, contiene un numero di procedure guidate che possono essere utilizzate per generare un esempio in modo da poter giocare con questo. Se sei interessato puoi creare uno spazio di lavoro e poi nello spazio di lavoro puoi creare un progetto ATL per generare un controllo e quindi un semplice progetto di dialogo MFC per testarlo. L'utilizzo di ATL per il controllo COM nasconde alcuni dettagli che è possibile esaminare in seguito e il semplice progetto di dialogo MFC fornisce un modo semplice per creare un contenitore. È inoltre possibile utilizzare lo strumento Contenitore di test di controllo ActiveX, disponibile in Visual Studio, per eseguire test preliminari e vedere come funzionano i metodi e le proprietà.

Esistono anche numerosi progetti di esempio su siti Web come codeproject.com. Ad esempio, qui è one using C to expose all the ugly plumbing behind COM e qui è one using C++ without ATL.

1

IDL è di vitale importanza in 2 casi. 1. Per creare DLL proxy/stub per server exe. 2. Per creare una libreria dei tipi per i server di automazione.

C'è ottimo articolo per basi di IDL a link

Per studiare IDL, è meglio leggere propri file header IDL di compilatori che sono dati comprendono sottodirectory del pacchetto di VC++.

+0

Sebbene ciò possa teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. – Rizier123

Problemi correlati