160 likes | 296 Views
Integrazione di un linguaggio accademico in un ambiente CAD industriale. Laureando: Giorgio Scorzelli Relatore: Prof. Paoluzzi. Indice. Scheme e Open Cascade. Soluzioni per l’integrazione dei linguaggi. La Foreign Function Interface come soluzione per l’integrazione.
E N D
Integrazione di un linguaggio accademico in un ambiente CAD industriale Laureando: Giorgio Scorzelli Relatore: Prof. Paoluzzi
Indice • Scheme e Open Cascade. • Soluzioni per l’integrazione dei linguaggi. • La Foreign Function Interface come soluzione per l’integrazione. • Il linguaggio C++. Logica statica e logica dinamica di invocazione. • Generazione di alcuni modelli geometrici. • Conclusioni.
Un ambiente funzionale: Scheme • Storia: • 1975 Scheme come dialetto Lisp • 1978 “Revised Report on SCHEME. A Dialect of LISP” (Guy Lewis Steele Jr. and Gerald Jay Sussman) • 1982 Corsi universitari (MIT, Yale, Indiana University) • 1998 “The revised (5) report on the algorithmic language Scheme” • Semplicità • Implementazione MzScheme (PLT, Rice University) • Integrated Development Environment (IDE): DrScheme • Multipiattaforma (wxWindows come libreria GUI)
Un ambiente di progettazione assistita: Open Cascade • Storia • 1980 Matra Datavision: Euclid • 1990 Cas.CADE (CASE + CAD) dal progetto Eureka • 1999 società servizi software: open source • Servizi geometrici: • Foundation Classes • Modeling Data • Modeling Algorithms • Visualization • Data Exchange Processor • Servizi non geometrici • Component Definition Language (CDL) • Workshop Organization Kit (WOK)
Cooperazione tra linguaggi. Linguaggi imperativi e linguaggi funzionali. Piattaforme distribuite: CORBA e DCOM • Infrastruttura per la comunicazione. • Oggetti software indipendenti: client e server. • Interface Repository (IR) per l’accesso ai servizi. Integrazione locale: Foreign Function Interfaces • Condivisione della memoria, stesso processo. • Stesse strutture dati: problema della “traduzione”. • Componente di interfaccia tra linguaggi.
Foreign Function Interface (FFI) • Storia Prima apparizione in Lisp: funzioni C come call out functions o foreign functions • Definizione: collaborazione tra codice che viene eseguito in uno spazio degli indirizzi condiviso. • Problemi: • Tecniche gestione memoria (reference counting, gc etc) • Conversione tra inside ed outside types • Fenomeno del Side effect • Differenti Error Handler • Funzioni come first class objects • Le azioni di una FFI: • Library Loading. Accesso alle librerie secondo due approcci: statico e dinamico. • Address Binding. Recupero dell’indirizzo della funzione (risoluzione dei cross references). • Input Parameters. Caricamento e conversione nello stack. Modalità di passaggio dei valori. • Output Parameters. Restituzione del valore di uscita packed per la shell.
Ciclo di produzione software C/C++. Logica statica. • Scrittura codice sorgente: header files e files dell’implementazione. Compiti del compilatore: • Allocazione regioni di memoria • Controllo correttezza argomenti. • Risoluzione collisioni. • Generazione degli object files. • Link degli object files.
Funzioni C++ in ambiente interpretato. Logica dinamica. “Compilatore” dinamico: • Conversioni implicite dinamiche • Overloading solver dinamico Files di interfaccia come strumenti per la conoscenza: • Header files C++ • Sintassi semplificata: • CORBA Interface Definition Language IDL • Component Definition LanguageCDL di Open Cascade
Soluzioni per l’integrazione Strutture Sorgenti Cpp: CPP Sorgenti CDL Front dinamiche CPP Extractor file hxx e cxx Extractor CDL del package MS Sviluppo dell' implementazione Scheme CPP Extractor Extractor Interprete Generatore del codice CPP Extractor Scheme della FFI Modalità di invocazione delle funzioni C++
Meccanismi d’uso Prototipo CDL Create(dx,dy,dz:Real) returns MakeBox from BRepPrimApi Prototipo C++ generato dal programma Cpp Extractor BRepPrimAPI_MakeBox( const Standard_Real dx, const Standard_Real dy, const Standard_Real dz); Wrapper Scheme (define (make-box x y z) (make-object BRepPrimApi_MakeBox% x y z)) Uso interattivo della make-box (make-box 1 2 3)
Esempi: Modello toroidale • Oggetti toroidali appoggiati su sfera. (define (radius z) (sqrt (- 1 (* z z)))) (define (torus-on-sphere the-list) (composite (map (lambda (z) (translate (torus (radius z) 0.05) 0.0 0.0 z)) the-list))) (torus-on-sphere (list -0.93 -0.75 -0.5 -0.25 0 0.25 0.5 0.75 +0.93)
Esempi: funzione “sombrero” • Funzione da visualizzare: (define domain (mult (make-list -1.0 1.0 20) (make-list -1.0 1.0 20))) (define codomain (apply-f myfun domain)) (define spheres (make-list-of-sphere (length codomain))) (define spheres-in-space (map translate spheres codomain))
Esempi: generazione automatica di labirinti (define (maze-builder dim filename) (let* ((v (make-list 0 (- dim 1))) (array (make-multiply v v)) (maze (make-object SchemeTest_Maze% dim dim)) (make-iter-cell (lambda (coord) (let ((x (car coord)) (y (car (cdr coord)))) (move-cell (make-single-cell (send maze Left x y) (send maze Up x y) (send maze Right x y) (send maze Down x y)) x y)))) (lis (map make-iter-cellarray)) (ret (composite lis))) (print-brep ret filename)))
Risultati e conclusioni • Integrazione su base locale del linguaggio funzionale Scheme con il linguaggio imperativo C++ • Automaticamente disponibili da Scheme circa 10.000 classi di Open Cascade • Possibilità di sviluppo interattivo di applicazioni CAD • Sito Web www.dia.uniroma3.it/~scorzell