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
Scarica

Soluzioni per l`integrazione