New Scientific

Taha BEN SALAH (NOCCS, ENISo, Sousse University) Taoufik AGUILI (Sys’Com, ENIT, UTM University) Agenda

● Introduction ● Existing Scientific Programming Languages ● Presenting the new Scientific Programming Language ● Comparisons and results ● Conclusion

2 What is a scientific language

A scientific language is a programming language optimized for the use of mathematical formulas and matrices.

3 Existing Scientific Languages: DSL : Domain Specific Languages

MATLAB, Maple, FORTRAN, ALGOL, APL,J, Julia, Wolfram Language/Mathematica, and R. Non Scientific Languages used by scientists GPL: General Purpose Languages

C/++, Python, Scala, Java

4 Why a new Programming Language

● Limits of the existing Programming Languages ● Simpler syntax or More Powerful syntax ● Better portability ● Better integration ● Better performance

5 Existing Languages

Python Java/Scala/Kotlin Julia Matlab R

Type GPL GPL DSL DSL DSL

Paradigm Prototyping, Server, Big Data, Computation Scientific Statistics, Data Web, Data Distributed computation, Science Science Systems Matrices, ...

Price Free & Open Free & Open Free & Open Commercial Free & Open Source Source Source Source

Advantages Community, Community, Tools, Simplicity, Simplicity, Toolboxes Simplicity, Libraries Performance Toolboxes Libraries (Simulink)

Limitations Performance, Steep learning Small Commercial, not not appropriate tools, curve popularity, appropriate for for complex compatibility few libraries big projects, projects 6 performance Existing Languages

Python Java/Scala/Kotlin Julia Matlab R

Type Dyn Typed Static Typed Dyn Typed Dyn Typed Dyn Typed

Paradigm OO / Proc OO / Func Proc, loosely Proc - Loosely Proc - Loosely OO/Func OO OO

Compiled? Interpreted + Compiled+JIT compiled+JIT Interpreted + Interpreted compiled compiled

Toolchain REPL, Compiler+Externa Compiler Studio Studio Interpreter + Build Tools IDE

Dependencies Strong support Strong support Weak Weak Support Weak Support & Versioning Support

7 Existing Languages

Python Java/Scala/Kotlin Julia Matlab R

Parallel / Supported Strongly Supported Supported Supported Concurrent / supported Distributed support Via Libraries JOCL, JogAmp, Via Libraries Via Libraries Via Libraries CPU/GPU and JavaCL

Libraries and Large Extremely Large Small Large Large Ecosystem community community community community community

Tools support Good support Best IDEs Little support Product Studio Product Studio by Commercial IDE

Performance Bad Good Better Bad Bad performance Performance performance performance performance 8 Existing Languages

Python Java/Scala/Kotlin Julia Matlab R

Portability Bad Portability Better Portability Supported Supported Supported Win/Linux Win/Linux Win/Linux

Numeric Libraries, bad Libraries, bad Complex / Complex / Complex / Scientific integration integration Matrices Matrices Matrices Calculation

Symbolic Libraries, bad Libraries, bad Supported Supported Supported Scientific integration integration Calculation

Scientific bad worst good good average Readability

Native average average good average minimal Integration 9 Journey to a new Programming Language

● Used Matlab/Scilab/Octave in ● Moved to Scala simulations ○ Refactored the code into ○ As soon as the number of files ■ Hadruplots becomes important (100) this is ■ Hadrumaths no more manageable ■ Hadruwaves ○ Serious performance isssues ○ Written ports to the libraries in Scala ● Moved to C/C++ (blas, …) ○ Much better readability ○ Very hard to maintain too ○ Still ● Moved to Java ■ quite difficult to start a new “code” from scratch ■ ○ Rewritten all of the code in Java Scala is difficult for non initiated to programming ○ Written microwaves library researchers ■ ○ Good performance Compiling errors difficult to “understand” ■ ○ Not accepted complexity by other Limitations inherited from the Java Language ■ research colleagues Inconsistencies between Scala Collections & Java Collections 10 Hadra Language

● New programming Language ● Concise ● Introduces that obviously learns from ● Readable Elastic predecessors ● Single file project Calculation ● Focuses on Complex ● Modular & Extensible Concept : numbers, Vectors, and ● Functional and OO Numeric and Matrices ○ All constructs are Symbolic at the ● Base on the Java VM functions (for, same time (compiles to Java Byte Code) while, switch…) ● GPL as DSL ○ All functions are ● Statically Typed Objects ● Makes advantage of Unicode support

11 Hadra : Hello World

file: hello.hl file: plot.hl println(matrix(3,(i,j)->i+j)); import net.thevpc.scholar:hadrumaths; Plot.title(“sinus function”).asCurve shell: .plot(sin(X)*II(0..2π)); > hl hello.hl shell: result: > hl plot.hl [ 0 1 2 1 2 3 3 4 5 ] 12 Hadra : Literals Arrays int twelveDecimal = 12 ; int[5] tab ( i −> 2*i ) ; // [0, 2, 4, 6, 8] short sixteenBinary = 0b10000s; tab[0..2] = [15, 20, 30]; // [15, 20, 30, 6, 8] bigint twelveHexBigInt = 0xCI ; tab[2..4] = tab[4..2]; // [15, 20, 8, 6 30] bigdecimal tens = 10.2E23D; int[5] tab2(1) ; // [1, 1, 1, 1, 1] long C = 300_000_000 GHz; int[5] tab3(Math::random) ; // [0.1, 0.5, 0.2, 0.7, var μ₀ =4π*10⁻⁷ H/m; 0.1] localdate d= t"2020 −02 −01"; int[5] tab4=[1, 2, 3] ; // [1, 2, 3] Complex c= î+1; int[] tab5 = tab1 :+ tab2 :+ tab3; // concat var c2= î+1; var msg=$”the day is $d”; var json={a:1, b:’two’};

13 Hadra : Functions & Classes

fun int sqsum(int ...a) { // sqsum(1,2)=5 class Complex(double r, double i){ switch(a.length) fun double abs(){sqrt(r²+i²);} case 0: 0; case 1: a[0]; fun Complex +(Complex o) { default : a[0]²+sqsum(a[1..]);} Complex(r+o.r,i+o.i); } fun boolean palindrome(int[] a) { fun Complex +(double o) a[..$/2]==a[$..$/2];} {Complex(r+o,i);} fun Complex (double o)+ Extension function fun double Complex::norm(this a) {a.abs();} {Complex(r+o,i);} var c= î+1; } var v1=norm(c); var v2=c.norm();

14 Hadra : Matrices

Matrix m1 = Sums [0 , 0 , 0 ; 0, 1, 2 ; 0, 2, 4 ]; double v=sum(1..1000, x −> sin(x²)) ; Matrix m2 = [ 1 , 2 , 3 ;

3 , 2 , 1 ]; Scalar Products var m3 =matrix(3,(i,j)->i*j); // = m1 int[] tab1 = [a, b, c]; var m3 =matrix(3,(i,j)->i*î+j); // complex int[] tab2 = [A, B, C]; int v = tab1 ** tab2 ; // = aA+bB+cC matrix int[][] v2 = tab1 :** tab2 ; // = [a**A , a**B , a**C var m3 =symMatrix(3,(i,j)->i*î+j); b**A , b**B , b**C var v1 =vector(3,(i)->i*î); // vector of c**A , c**B , c**C complexes ]

15 Hadra : Symbolic Programming

// function declared on [0..π], zero Param m(); elsewhere Param n(); var f = sin(X) * cos(Y) * II(0..π) ; var fₙₙ = sin(m*X) * cos(n*Y) * II(0..π) // symbolic derive ; var g = derive(f , X) ; var f₀₁=fₙₙ(n->0, m->1) // symbolic integration Usingvar all_f Latex=seq(fₙₙ , n->0..3, m->0..3) var g = integrate(f , X, 0..π/2) ; // ## This is a markdown comment Title // Here is an example of using latex expressions var θ=X; var f₁=```latex \cos^2 \theta - \sin^2 \theta```; var f₂=cos(θ)²sin(θ)²; Plot.plot(f₁,f₂); 16 Hadra : Elastic Calculation

● The runtime is responsible of switching from Symbolic to Numeric (and vice versa) ● No need to explicitly sym/dblquad (as in matlab) ● Rule Based decisions ● Includes simplications/transformations to detect usual expressions ● Numeric calculation is done only when needed

var formal_scalar_product = sin(m*X) ** cos(n*Y) * II(0..π); var formal_scalar_product = sin(X) ** cos(Y) * II(0..π); var numeric_scalar_product = sin((1+X)/cos(Y)) ** cos(Y) * II(0..π); var formal_simplifiable = sin(X)² + cos(X)²;

17 Hadra Integration : Native Code (C/C++), Java / Scala

● Seamless integration with C/C++ ● Seamless integration with Java/Scala ● Uses JNA/JNA under the hoods ● Uses a specific annotation @native JFrame f(“java frame”) .{visible=true; title=”example”;}; @native("c") f+Button(“click me”); class StandardAccess { void printf(string format, object ... args); int scanf(string format, object ... args); } byte[32] bytes; StandardAccess.scanf("%s", bytes); StandardAccess.printf("%s [%s] %s %s!\n", "Your message", Native.toString(bytes), "is printed in C", "5.5.0"); 18 Hadra vs the world

Hadra Java Julia C/C++ Python Matlab

Operator overloading yes** no yes yes yes no

Superscript/Subscript yes no no no no no

Matrices / Complex hadrumaths library yes library library yes

Control structures overloading (redefine for/while) yes no no no no no

Single file project (with dependencies) yes no Comp. opt. Comp. Opt. yes Mex or javaaddpath

Paradigm func/OO OO Proc OO/Proc OO Proc, supports OO

BLAS and LAPACK hadrumaths JBLAS Seamless Library Library MEX file + Library library integration integration integration

Elastic Numeric Calculation yes no no no no no 19 3984% Performance

● Current version of Hadra generates Java sources then compiles to ByteCode (for validation purposes) 115% ● Small Performance enhancements 108% 100% due to literal optimizations ○ Regexp 65% ○ Dates ○ Primitive types ● Performance tested against ○ https://benchmarksgame-team.p ages.debian.net/benchmarksgam

e/index.html Hadra Java Julia C Python ○ Considered: the best results 20 Conciseness

● Comparing Hadra source length to Java equivalent code 88% ● Using sample code ○ #1: Sci code: using operator 67% overloading in hadrumaths 62% ○ #2: Java purely procedural ○ #3 Data classes,Typical Java code 32% ○ #4 average of all the above

Sci Proce POO Any Code dural 21 Why Hadra

1 2 3

● First OO ● Hadra builds upon ● The prefix hadru and Programming existing work and the name hadra come Language is “Small libraries in the from “Hadrumet”, Talk” Laboratory: the Phoenician name ● Hadra means “Lots ○ Hadrumaths of Sousse, the city of talk” in Tunisian ○ Hadruwaves where the authors ● It means also ○ Hadruplots are from “Interesting Thing”

22 Conclusion

● DSL / GPL Blurry boundaries Existing Sci Languages ● No clear winner

Proposed a new ● Readable, Concise, Simple Language ● Based on JVM: portable

● Under construction, Netbeans/Intellij Integ. TODO: Tooling ● Syntax Highlighting in Kate/Sublime etc.

● To be published shortly under OSS License TODO: Sources & Perf ● (now as private GITHUB repository) GRAALVM 23 Thank you [email protected] [email protected] http://github.com/thevpc

24