Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    invocare un linguaggio in un altro.

    Stavo leggendo il recente metodo di comunicazione tra browser (http://www.webrtc.org/architecture) che ha un'API editata in C++ ma invocata nell'HTML5 tramite JavaScript. Quali meccanismi fornisce un linguaggio per invocare linguaggi esterni?
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

  2. #2
    L'argomento è piuttosto ampio, in linea di massima ci sono tre sistemi fondamentali:
    • nel caso in questione, ad occhio la API esposta a JavaScript è inglobata più o meno direttamente all'interno del programma principale, il che significa che si può intervenire direttamente a livello di interprete (che mi aspetto fornisca delle API interne per agganciare oggetti/funzioni JavaScript a codice C++); in altre parole, dato che l'interprete è scritto in C++ può richiamare facilmente altro codice C++ che sia conforme alle sue API (in realtà la questione è leggermente complicata dal fatto che di norma per JavaScript si fa uso di JIT e non di interpreti "normali", ma il concetto è quello; esistono tool come SWIG cercano di astrarre le differenze tra le varie API di estensione degli interpreti, consentendo di usare la stessa libreria C/C++ da più linguaggi interpretati;
    • un'altra possibilità è che l'interprete del linguaggio consenta la possibilità di effettuare chiamate "generiche" ad altri linguaggi attraverso una API indipendente dal linguaggio; penso per esempio a Python con il modulo ctypes, che consente di chiamare funzioni esportate con interfaccia "standard della piattaforma" (tipicamente quello che viene fuori dall'esportazione in moduli dinamici di funzioni C) costruendo al volo lo stack frame necessario per la chiamata alla funzione, o anche a VBScript che consente di istanziare e richiamare oggetti COM tramite le funzionalità di late binding che questo mette a disposizione;
    • infine, spesso il metodo più semplice è comunicare tramite socket/pipe/altri meccanismi di trasmissione dati "a stream"; esistono numerosi sistemi di RPC (Remote Procedure Call) che standardizzano un qualche formato di marshalling dei dati relativi ad una chiamata (funzione da chiamare, argomenti, valore restituito) e/o di definizione delle interfacce (per generare automaticamente classi/moduli proxy tra i vari linguaggi); metodi di questo genere sono in genere meno legati al singolo linguaggio/piattaforma e hanno il vantaggio di essere facilmente remotizzabili, ma sono meno performanti (specie se si usano formati demenziali come XML per la serializzazione); vedi CORBA, WebRPC, SOAP, per certi versi REST, DBus, e molti altri.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    wow!!! Spiegazione migliore non poteva esserci. Mi hai aperto un mondo e te ne ringrazio molto.
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

  4. #4
    Occhio all'ABI soprattutto per linguaggi compilati come il C++ e che non hanno un ABI standard.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.