firstname lastname cern ph-sft ch-1211 geneva 23 sftweb.cern.ch root.cern.ch cling – past, present...
Post on 20-Jan-2016
226 Views
Preview:
TRANSCRIPT
Firstname LastnameCERN PH-SFT
CH-1211 Geneva 23sftweb.cern.ch
root.cern.ch
Cling – Past, Present and FutureCling – Past, Present and Future
V. Vassilev, P. Canal, A. Naumann, P. RussoV. Vassilev, P. Canal, A. Naumann, P. Russo
CERN, PH-SFT & FermiLabCERN, PH-SFT & FermiLab
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Role of C++ Interpreter in ROOT
o Load/Store C++ objectsoRuntime Dynamism
• TFile::Open(“http://...”)• gDirectory->Get(“hist”)• python runReco.py
o Fast Prototyping
2
Limited C++ language support for reflection and type introspection.
ROOT
CINT
Reflection
TPluginManager
IO
...
PyR
OO
T
Type Info
TClass
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
LLVM Toolchain As an Alternative
o LLVM Core “The LLVM Project is a collection of modular and reusable compiler and toolchain technologies...”
• More than 120 active contributorsApple, ARM, Google, Qualcomm, QuIC, NVidia, AMD and more
• ~250 commits/weekoClang
“The goal of the Clang project is to create a new C, C++, Objective C and Objective C++ front-end for the LLVM compiler.“
• More than 100 active contributorsApple, ARM, AMD and more
• ~150 commits/week
3
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
In The Meanwhile: LLVM
4
LLVM and Clang “The LLVM Project is a collection of modular and reusable compiler and
toolchain technologies...”
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Cling's Dual Personality
oAn interpreter – looks like an interpreter and behaves like an interpreterCling follows the read-evaluate-print-loop (repl) concept.
oMore than interpreter – built on top of compiler libraries (Clang and LLVM)Contains interpreter parts and compiler parts. More of an interactive compiler or an interactive compiler interface for clang.
5
No need to compile Cling/ROOT with Clang/LLVM or having clang installed on the OS
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Cling Is Better Than CINT
o Full C++ support incl. C++11o Stable and informative intermediate representations of the
sourceoBeing developed with the vision to be used in multithreaded
environment (an interpreter object per thread)
6
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Full C++ Support
o Templates and STL are not an issue
7
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Full C++ Support
oNatural path to the new standards C++11/C++*
8
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Full C++ Support
oNatural path to the new standards C++11/C++*
9
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Full C++ Support
o Boost is not a dream
10
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Diagnostics
oColumn numbers and caret diagnosticsCaretDiagnostics.C:4:13: warning: '.*' specified field precision is missing a matching 'int' argumentprintf("%.*d"); ~~^~
oRange highlightingRangeHighlight.C:14:39: error: invalid operands to binary expression ('int' and 'A')return y + func(y ? ((SomeA.X + 40) + SomeA) / 42 + SomeA.X : SomeA.X); ~~~~~~~~~~~~ ^ ~~~~~~
12
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Diagnostics
13
o Pointer vs Referencesinput_line_410:2:6: error: member reference type 'TNamed' is not a pointernRef->GetName();~~~~^
input_line_413:2:7: error: member reference type 'TNamed *' is a pointer; maybe you meant to use '->’?nPtr1.GetName();~~~~^ ->
o Fix-it hintsFixItHints.C:7:27: warning: use of GNU old-style field designator extensionstruct point origin = { x: 0.0, y: 0.0 }; ^~ .x = FixItHints.C:12:3: error: use of undeclared identifier 'floot'; did you mean 'float’? floot p; ^~~~ float
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Diagnostics
o AmbiguitiesAmbiguities.C:20:30: error: return type of virtual function 'Clone' is not covariant with the return type of the function it overrides (ambiguous conversion from derived class 'TeachingAssistant' to base class 'Person': class TeachingAssistant -> class Student -> class Person class TeachingAssistant -> class Teacher -> class Person)virtual TeachingAssistant* Clone() const; ^Ambiguities.C:7:19: note: overridden virtual function is herevirtual Person* Clone() const; ^
o Templatesinput_line_401:2:2:error: use of class template LorentzVector requires template arguments LorentzVector v; ^Math/GenVector/LorentzVectorfwd.h:28:39: note: template is declared here template<class CoordSystem> class LorentzVector; ~~~~~~~~~~~~~~~~~~~~~~~~ ^
14
Personvirtual void
Clone()
Personvirtual void
Clone()
TeachingAssistantvirtual void Clone()TeachingAssistantvirtual void Clone()
StudentStudent TeacherTeacher
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Diagnostics
15
o Macro expansionsMacroExpansionInformation.C:14:7: error: invalid operands to binary expression ('int' and 'A’) X = MAX(X, *SomeA); ^~~~~~~~~~~~~~MacroExpansionInformation.C:5:24: note: expanded from macro 'MAX’#define MAX(A, B) ((A) > (B) ? (A) : (B)) ~~~ ^ ~~~
o Template instantiationsinput_line_395:2:18: error: no matching constructor for initialization of 'PtEtaPhiEVector' (aka 'LorentzVector<PtEtaPhiE4D<double> >’)PtEtaPhiEVector v2( "v1.Rho()", v1.Eta(), v1.Phi(), v1.E() ); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~Math/GenVector/LorentzVector.h:77:8: note: candidate constructor not viable: no known conversion from 'const char [9]' to 'const Scalar’ (aka 'const double') for 1st argumentLorentzVector(const Scalar & a,^Math/GenVector/LorentzVector.h:88:17: note: candidate constructor template not viable: requires single argument 'v', but 4 arguments were provided explicit LorentzVector(const LorentzVector<Coords> & v ) : ^
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 201316
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Data Flow
17
Machine Code (x86, Alpha, ...)
①
⑦
Compilation Engine (clang)
Compilation Engine (clang)
Transformation Engine
Transformation Engine
⑤②③④⑥ClingCling
⑧①, ② –Text③, ④, ⑤, ⑥ – Abstract Syntax Tree⑦ - LLVM Bit Code⑧ -Target Machine Code
LLVM Execution
Engine
LLVM Execution
Engine
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Compilation Engine
18
Clang ParserClang Parser
Clang Code Generator
Clang Code Generator
LLVM Execution
Engine
LLVM Execution
Engine
Transformation Engine
Transformation Engine
ClingCling
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Transformation Engine
o TransactionCling represents the incremental input as a set of AST nodes.
o Transaction TransformersCling enables each transaction to be further customized by other clients by implementing a transaction transformer.
o Interpreter CallbacksImplements callbacks for the “interesting” events.
19
ClingCling Transformation Engine
Transformation Engine
Transaction
TransactionTransaction
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 201320
LLVM EE-s have complete target info Thus calling into compiled libraries is not an issue.
No boundary interpreted/compiled world Possible to derive from compiled classes, proper calculation of offsets and so on.
Machine Code (x86, Alpha, ...)
Compiled libs(.so)
��
LLILLI LLVMJIT
LLVMJIT MCJITMCJIT
Execution Engine
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Challenges
o Incompatible concepts like compilation and interpretationMany tasks that are trivial for an interpreter become a nightmare for a compiler.
oMake C++ usable at the promptIncorporate the experience we have with CINT. First step: adopt the successful usability extensions from CINT.
21
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Extending C++ Language
22
[root]$ sin(12);void wrapper() { sin(12);}
[root]$ [root]$
int i = 12;sin(i);
void wrapper1() { int i = 12;}
void wrapper2() { sin(i);} ?
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Extending C++ Language
23
[root]$ [root]$
void wrapper1() { int i = 12; printf("%d\n",i);}
void wrapper2() { printf("%f\n", sin(i));}
int i = 12;
int i = 12; printf("%d\n",i);printf("%f\n",sin(i));
oWrap the inputo Look for declarationso Extract the declarations one level up, as global declarations
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Streaming Execution Results
24
[root]$ [root]$
int i = 12(int) 12sin(i)(double) -5.365729e-01
[root]$
[root]$
std::string s = “Hello”(std::string) @0x7fff65ae783cc_str: “Hello”enum e { e1 = 12, e2 = 13, e3 = 13}; e1(enum e) (e::e1) : (int) 12
[root]$ HelloWorld(void (void)) Function @0x108880030 at /tmp/HelloWorld.h:2:void HelloWorld() { printf("HelloWorld!\n");}
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Error Recovery
o Filled input-by-input (aka Transaction)o Incorrect inputs must be discarded as a whole
25
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Implicit auto keyword
26
i = 5; f = new TNamed(“a”, ”b”)
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Late Binding
27
if (cond) {
TFile* F = 0;
if (is_day_of_month_even())
F = TFile::Open("even.root");
else
F = TFile::Open("odd.root");
hist->Draw();
}
hist->Draw();
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Late Binding
28
if (cond) {
TFile* F = 0;
if (is_day_of_month_even())
F = TFile::Open("even.root");
else
F = TFile::Open("odd.root");
gCling->EvaluateT<void>("hist->Draw()", ...);
}
hist->Draw();
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Code Unloading
29
[root]$ [root]$ [root]$ [root]$ [root]$ [root]$ [root]$ [root]$
.L Calculator.hCalculator calc;calc.Add(3, 1)(int) 2 //WTF!?*.L Calculator.hCalculator calc;calc.Add(3, 1)(int) 4 //
// Calculator.hclass Calculator { int Add(int a, int b) { return a + b; }...};
// Calculator.hclass Calculator { int Add(int a, int b) { return a - b; }...};
* What's That Function
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Future Plans
oMigrate to MCJIT• Object file emitted to memory• Runtime dynamic linker
oWindows 64 Supporto Tools
• Automatic Differentiation
30
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
o See Tomas Gahr’s demo later at the workshop
Thank you!
31
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Backup slides
32
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Pre-Compiled Headers/Modules
Carefully crafted data structures designed to improve translator's performance:oReduce lexical, syntax and semantic analysisoLoaded “lazily” on demand
33
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
Pre-Compiled Headers/Modules
Design advantages:oLoading is significantly faster than re-parsingoMinimize the cost of readingoRead times don't depend on sizeoCost of generating isn't large
34
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 201335
PCH PCM
sftweb.cern.chroot.cern.ch vvassilev/ROOT Users Workshop 11-14
March 2013
PCH vs PCM
oWhere we should get it from? Who knows more about types than the translator?
36
CINT
Reflection
Type Info
Not very descriptive
GCCXML
Reflex
top related