# Presentation: 926205

## Tamara Dahlgren, Tom Epperly, Scott Kohn, & Gary KumfertCenter for Applied Scientific Computing

- Tutorial

## Audience Calibration

**What is a component?**
**Who writes code?**
**Who uses code?**
**What languages used?**
**What platforms used?**
**# 3****rd**** party libraries your code uses?**
**# apps uses your libraries?**

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## Problem Motivation

**Code Reuse is Hard.**
**Scientific Code Reuse is Harder!**
**Barriers to Reuse...**
**Language Interoperability**
**Semantics**
**Software Portability**
**Lack of Standards**
**More...**

## What I mean by 	“Language Interoperability”

**Simulation Framework**
**(C)**

**Solver Library**
**(C++)**

**Numerical Routines**
**(f77)**

**Scripting Driver**
**(Python)**

**Visualization System**
**(Java)**

## Current Language Interoperability

**Native**
**cfortran.h**
**SWIG**
**JNI**
**Siloon**
**Chasm**
**Platform ****Dependent**

**C**

**C++**

**f77**

**f90**

**Python**

**Java**

## Babel Enabled Language Interoperability

**C**

**C++**

**f77**

**f90**

**Python**

**Java**

**Babel Enabled ****Language Interoperability**

## Babel Enabled Language Interoperability

**C**

**C++**

**f77**

**f90**

**Python**

**Java**

**Babel Enabled ****Language Interoperability**

**What’s in version 0.6?**

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## Developer Writes Interface

**SIDL: Scientific Interface Definition Language**
**Similar to CORBA/COM IDLs...**
**Language/Platform Independent**
**...but tuned for scientific apps**
**complex numbers**
**dynamic, multidimensional arrays**

**SIDL interface****description**

## version MySolverLib 0.1.0;

**version MySolverLib 0.1.0;**
**import ESI; **
**package MySolverLib { **
**  ****interface MatrixGenerator { ... } **
**  ****class OptionDatabase {**
**    ****void getOption( in string name, ****	****	****	****	****out string val );**
**  ****}**
**  ****class Vector implements-all ESI.Vector {**
**    ****void setOptions( in OptionDatabase db );    **
**  ****}****	**
**  ****abstract class Bizarre **
**	****implements MatrixGenerator {**
**	****abstract int foo();    **
**     ****void setData( in array<dcomplex,2> a );**
**  ****}**
**}**

## Babel Generates Glue Code

**SIDL interface****description**

**parser**

**analyzer**

**backend**

**C++**

**F77**

**F90**

**Python**

**machine****configuration****database**

**XML repository****interface****description**

**C**

**XML**

**Matlab?**

**Java**

## Babel ProvidesUniform Object Model

**C**

**C++**

**f77**

**f90**

**Python**

**Java**

**Babel Provides****Uniform Object Model**

**Universal Base Classes**
**Virtual Method Dispatch**
**Exception Handling**
**Reference Counting**

**...It all happens here!**

## Babel Provides a FirewallBetween Use and Implementation  

- Application

- Impls

**SIDL interface****description**

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## SIDL as a text-based design tool

**Express only the public API**
**Prevents discussion drift into implementation details**
**Amenable to email debates**
**Easier to learn than UML**

## The SIDL Grammar

**Packages & Versions**
**Interfaces & Classes**
**Inheritance Model**
**Methods**
**Polymorphism Modifiers**
**Intrinsic Data Types**
**Parameter Modes**
**Gotchas**

## Packages

**Use SIDL packages to prevent symbol conflicts**
**packages in Java**
**namespaces in C++**
**prefixes in C / Fortran****(e.g.   mpi_send()  ) **
**must have version number**
**lowercase symbols recommended**
**Can be nested**
**Versioning applies only to outermost package**
**Currently not reentrant by design**

- version foo 1.0; package foo {   // ... };

- package gov {   package llnl {     package babel {        // ...     };  };};

## Interfaces and Classes

**ObjectiveC and Java Inheritance Model**
**Interfaces**
**pure abstract base classes in C++**
**define calling sequence only**
**provide no implementation**
**cannot be instantiated**
**can inherit (“extend”) other interfaces**
**Classes**
**inherit (“extend”) from at most one class****(including its implementation)**
**may inherit (“implement”) multiple interfaces**

## Interfaces and Classes (Example)

- version my 1.12;
- // import their;
- package my {
-   interface Foo extends their.Foo { };
-   class CFoo implements Foo { };
-   class Bar extends CFoo implements their.Bar { };
-   class Baz extends CFoo implements their.Bar,                                    their.Baz { };
- };

- version their 1.0;package their {   interface Foo {/* .. */};  interface Bar {/* .. */};  interface Baz  {/* .. */};};

## Inheritance Model

**Interfaces form contracts between implementor and user.**
**Default Inheritance: **
**reference counting**
**dynamic casting**
**introspection**
**reflection**

## Abstract Class– Partially Implemented Class

**interface Foo { **
**   ****int doThis( in int i );**
**   ****int doThat( in int i );**
**} **
**class Bar implements Foo { **
**   ****int doThis( in int i );**
**}; **
**class Grille implements Foo { **
**   ****int doThis( in int i );**
**   ****int doThat( in int i );**
**};**

**interface Foo { **
**   ****int doThis( in int i );**
**   ****int doThat( in int i );**
**} **
**abstract**** class Bar implements Foo { **
**   ****int doThis( in int i );**
**}; **
**class Grille implements Foo { **
**   ****int doThis( in int i );**
**   ****int doThat( in int i );**
**};**

**interface Foo { **
**   ****int doThis( in int i );**
**   ****int doThat( in int i );**
**} **
**abstract**** class Bar implements Foo { **
**   ****int doThis( in int i );**
**}; **
**class Grille ****implements-all**** Foo { **
**   ****// int doThis( in int i );**
**   ****// int doThat( in int i );**
**};**

## Methods (a.k.a. “member functions”)

**Belong to both Interfaces and Classes**
**SIDL has no sense of method “access” specifiers**
**(e.g.  private, protected, public)**
**All methods in SIDL are public**
**Makes sense for an “Interface Definition Language”**
**In practice, can make package and private methods.**
**In classes only, methods can also be **
**static -- independent of an instance**
**final -- not overridden by derived classes**
**No Method Overloading Yet.**

## Method Modifiers

**static**
**avoid OOP altogether: ****make one class full of static methods.**** **
**final**
**prevent function from being overridden**
**In C++**
**methods are final by default**
**must be declared “virtual” to be overridden**

- class Math {   static double sin( in double x );  static double cos( in double x );};

## Intrinsic Data Types

**Standard Types**
**bool**
**char**
**int**
**long**
**float**
**double**
**fcomplex**
**dcomplex**

**Advanced Types**
**string**
**enum**
**object (interface or class)**
**array< Type, Dimension >**
**opaque**
**NOTES:**
**Mapped to different types in different languages **
**No General Template Mechanism**** **

## Parameter Modes

**Unique to IDLs**
**Each parameter in a method call has a mode declared**
**in**
**out**
**inout**
**Intent:  **
**Communication optimization for distributed components**
**Copy minimization when copy is unavoidable**
**Benefit:  **
**Easy to understand intent when reading **

## Parameter Modes II

**“****in”**
**pass by value semantics (not const!)**
**“****out”**
**pass by reference semantics**
**no initialization required**
**information returned**
**“****inout”**
**pass by reference semantics**
**initialization required**
**new information returned **
**instance may be destroyed and replaced**

## Parameter Modes III

- package util { // SIDL FILE  class String {     static void reverse( inout string );  };};

- #include <stdio.h>#include “util_String.h”int main () {   char * hi = “Hello.”;   util_String_reverse( &hi ) ;  printf(“%s\n”, hi );
- }

## Parameter Modes IV

- package util { // SIDL FILE  class String {     static void appendReverse(inout string);  };};

- #include <stdio.h>#include “util_String.h”int main () {   char * hi = “Hello.”;   util_String_appendReverse( &hi ) ;  printf(“%s\n”, hi );
- }

## Parameter Modes V

- package util { // SIDL FILE  class String {     static void appendReverse(inout string);  };};

- #include <stdio.h>#include <string.h>#include “util_String.h”int main () {   char * hi = strdup( “Hello.” );   util_String_appendReverse( &hi ) ;  printf(“%s\n”, hi );   free( hi );}

## Babel Preserves DocComments

- // This is a comment
- /* This is a Comment Too */
- /** This is a DocComment for the package */package Hello {
-   /**   * This class has one method   */   class World {
-     /** result = “hello” + name */    string getMsg( in string name );   };};

## SIDL Gotchas

**Case Sensitive**
**SIDL is **
**F77 is not **
**Reserved Words: **
**union of C, C++, Fortran**
**C++ has 90+ reserved words! **
**Forbidden Method Names**
**same as class name (reserved in C++)**
**Built-in method names start with “_” to avoid collisions with user defined names.**

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## Getting The Software

**Grab tarball**
_**[http://www.llnl.gov/CASC/components/software.html](http://www.llnl.gov/CASC/components/software.html)**_
**Current release: babel-0.6.3.tar.gz**
**Typical build/install  (using VPATH)**
**gtar zxvf babel-0.6.3.tar.gz**
**cd babel-0.6.3-build/**
**../babel-0.6.3/configure --prefix=${HOME}/babel**
**gmake all check install**
**Platforms Tested Nightly:**
**Linux ( GNU, KCC)**
**Solaris ( GNU )**

## The Babel Compiler – 	commandline options

**Choose exactly one of the following:****--help****	****	****	****Display more info****--version****	****	****	****Babel Version****--parse-check****	****	****Parse SIDL, no output****--xml**** ****	****	****	****Generate XML ****--client=[lang]****  ****	****User of Babel Object****--server=[lang]****  ****	****Developer of Babel Object**
**Other Options****--output-directory=[dir]****	****Default = .****--repository-path=[path]****	****Semicolon separated URLs ****--generate-subdirs****	**

## Babel from a developer’s POV  

- Application

- Impls

**SIDL interface****description**

## hello.sidl

- /** This is a DocComment for the package */version hello 1.0;
- package hello {
-   class World {     void setName( in string name );
-     /** result = “Hello ” + name + “!”*/    string getMsg( );   };};

## Adding the Implementation

- string
- hello::World_impl::getMsg ()
- throw ()
- {
-   // DO-NOT-DELETE splicer.begin(hello.World.getMsg)
-   // insert implementation here
-   // DO-NOT-DELETE splicer.end(hello.World.getMsg)
- }

- namespace hello {
- class World_impl {
-   private:
-     // DO-NOT-DELETE splicer.begin(hello.World._implementation)
-     // Put additional implementation details here...
-     // DO-NOT-DELETE splicer.end(hello.World._implementation)

## Adding the Implementation

- string
- hello::World_impl::getMsg ()
- throw ()
- {
-   // DO-NOT-DELETE splicer.begin(hello.World.getMsg)
-   **string msg(“Hello “);**
**  ****return msg + d_name + “!”;**
-   // DO-NOT-DELETE splicer.end(hello.World.getMsg)
- }

- namespace hello {
- class World_impl {
-   private:
-     // DO-NOT-DELETE splicer.begin(hello.World._implementation)
**    ****string d_name;**
-     // DO-NOT-DELETE splicer.end(hello.World._implementation)

## Babel Generates LOTS of Code!!!

| hello.sidl  | 9 |
| --- | --- |
| Hand added Implementation  | 4 |
| Generated C/C++ code (wc –l *) | 4,107 |

## Methods Beginning with “_”

**method names cannot start with “_” in SIDL**
**Babel uses leading underscores for internal stuff**
**e.g.  IOR-level methods  “_create()”**
**e.g.  binding specific methods “PKG::CLASS::_get_ior()”**
**Note:  Things that look like a double underscore****	****e.g.  hello_World__create() ****is really normal convention with internal method**

## Babel from a user’s POV  

- Application

- Stubs

- libfoo.so

**SIDL interface****description**

## A driver in C

- #include <stdio.h>
- #include "hello.h"
- int main(int argc, char ** argv ) {
-   hello_World hw;
-   char * msg;
-   hw = hello_World__create();
-   hello_World_setName( hw, argv[1] );
-   msg = hello_World_getMsg( hw );
-   fprintf(stdout, "%s", msg );
-   free( msg );
-   hello_World_deleteReference( hw );
- }

## A driver in Python

- import hello.World
- if __name__ = ‘__main__’:
-   h = hello.World.World()
-   h.setName( ‘Gary’ )
-   print h.getMsg()

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## Common Problems

**$CLASSPATH not set **
**compilers not found  ($CC, $CXX, $F77)**
**Python or NumPy not installed**
**Server-side Python requires libpython.so****(Not in standard distributions)**
**LD_LIBRARY_PATH issues with shared libraries**
**C++ and shared libraries**

## Achilles’ Heel

**Babel Generates Correct Code**
**It does nothing about correct compilation**

## How Much Language Interoperability Have We Achieved?

**bool**
**char**
**int **
**long**
**float **
**double**
**fcomplex**
**dcomplex**
**string**
**opaque**

**Extended Types**
**Objects**
**enumerations**
**arrays of basic types**
**arrays of objects**
**(arrays are multidimensional, no arrays of arrays) **

**Modes**
**in**
**out**
**inout**
**return value**

**OO Method Dispatch**
**regular**
**final**
**static**
**interfaces**
**classes**

**Exception Handling**

**For All Combinations of Languages**
**C****	****	****	****	****C**
**C++****	****	****	****	****C++**
**F77****	****	****	****	****F77**
**Python****	****	****	****Python**
**Java**

**How Much Language Interoperability Have We Achieved?**

**5200+ test cases**

**per platform**

**per compiler set**

## Babel Test History: 

**sun-sparc-solaris2.7-gcc2.95.x**

## Babel Development Tools

**development platforms**
**sun-sparc-solaris2.7**
**intelx86-redhat-linux**
**cygwin**
**Compilers**
**Python 2.1**
**Sun jdk-1.3**
**gcc 2.95.x**
**sunpro 5.0**
**KCC**

**Build Tools**
**make**
**autoconf**
**automake**
**libtool**
**Testing**
**in-house tool**
**Bug-Tracking**
**in-house/bugzilla mods**

## Outline

**Problem Motivation**
**Babel Solution Strategy**
**SIDL**
**Using Babel**
**Outstanding Problems**
**Future R&D**

## Platform Independence

**Encourage Locality for Maximum Performance**
**Connect to separate process space**
**to avoid symbol conflicts at link time**
**Connect to separate machine**
**to utilize special hardware**
**to use platform specific code****(Babel doesn’t get Windows apps to run on UNIX!)**
**To distribute work**

## Same Process Space Components

- Application

- Stubs

- Skels

- IORs

- Impls

## Out of Process Components

- Application

- Stubs

- IPC

- IORs

- Skels

- IORs

- Impls

- IPC

## Remote Components

- Internet

**Remote Components**

- Application

- Stubs

- Marshaler

- IORs

- Line Protocol

- Line Protocol

- Unmarshaler

- Skels

- IORs

- Impls

## Parallel Components: MxN Communication

## Problem Motivation

**Code Reuse is Hard.**
**Scientific Code Reuse is Harder!**
**Barriers to Reuse...**
**Language Interoperability**
**Semantics**
**Software Portability**
**Lack of Standards**
**More...**

- Tammy Dahlgren’s PhD Thesis

## Problem Motivation

**Code Reuse is Hard.**
**Scientific Code Reuse is Harder!**
**Barriers to Reuse...**
**Language Interoperability**
**Semantics**
**Software Portability**
**Lack of Standards**
**More...**

- Whitepaper

## How do I find out more???

**Website****	**_**[http://www.llnl.gov/CASC/components](http://www.llnl.gov/CASC/components)**_
**User’s Guide**
**Download Code**
**Email Reflectors ****(subscribe via majordomo@lists.llnl.gov)**
_**[babel-users@llnl.gov](mailto:babel-users@llnl.gov)**_
_**[babel-announce@llnl.gov](mailto:babel-announce@llnl.gov)**_** **
**Email the team**
_**[components@llnl.](mailto:components@llnl.gov)**__**[gov](mailto:components@llnl.gov)**_

## The End

## Business Component Frameworks

**CORBA**
**Language Independent**
**Wide Industry Acceptance**
**Primarily Remoting Architecture**
**COM**
**Language Independent**
**Most Established **
**In Process Optimization**
**Network Transparent**

**Enterprise Java Beans (EJB)**
**Platform Independent**
**Runs wherever Java does**

## Business Component Frameworks

**CORBA**
**Language Independent**
**Wide Industry Acceptance**
**Primarily Remoting Architecture**
**Huge Standard**
**No In-Process Optimization **
**COM**
**Language Independent**
**Most Established **
**In Process Optimization**
**Network Transparent**
**not Microsoft Transparent**
**Relies on sophisticated development tools**

**Enterprise Java Beans (EJB)**
**Platform Independent**
**Runs wherever Java does**
**Language Specific**
**Potentially highest overhead**
**All The Above**
**No Complex Intrinsic Datatype**
**No Dynamic Multidimensional Arrays**
**No Fortran77/90/95 bindings**
**No Parallel Components**

**Science**

## Key to Babel’s Interoperability...

- Human Compatible

- Web Compatible

- Compiler Compatible

## UCRL-VG-142097 REV1