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: 1. Library Loading. Accesso alle librerie secondo due approcci: statico e dinamico. 2. Address Binding. Recupero dell’indirizzo della funzione (risoluzione dei cross references). 3. Input Parameters. Caricamento e conversione nello stack. Modalità di passaggio dei valori. 4. Output Parameters. Restituzione del valore di uscita packed per la shell. Ciclo di produzione software C/C++. Logica statica. 1. Scrittura codice sorgente: header files e files dell’implementazione. Compiti del compilatore: Allocazione regioni di memoria Controllo correttezza argomenti. Risoluzione collisioni. 2. Generazione degli object files. 3. 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 Language CDL di Open Cascade Soluzioni per l’integrazione Sorgenti CDL CDL Front Strutture dinamiche del package MS Sorgenti Cpp: file hxx e cxx CPP CPP Extractor Extractor Sviluppo dell' implementazione Scheme CPP Extractor Extractor Generatore del codice della FFI Interprete CPP Extractor Scheme Modalità di invocazione delle funzioni C++ invocazione da shell operazione di mapping esecuzione funzione libreria operazione di unmapping controllo alla shell 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: animazione Esempi: funzione “sombrero” • Funzione da visualizzare: sin( x 2 y 2 ) (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-cell array)) (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 Ocas Core Team