Haskell DSL ( ) IT 2012. 3. 23 ( ) @
4 ( )IT (C++/Java/Obj-C/Haskell/OCaml, /Web ) / SE ( ) ( ) 2012 3 ( ) (π /CCS/CSP) ( ) 2
( )IT /FX 6 ( ) Coq 3
OCaml Scala SML# 2012/3/25( )14:00-1-109 SML# ( ) http://tinyurl.com/smlnagoya ( k-imai@itpl.co.jp ) 4
( )IT ( ) /FX http://www.itpl.co.jp/ 5
6
cf. MA(N,X) = 1 N N 1 i=0 R (X i) (N=5) (N=20) (N=90) 7
6, 9 Java Applet Windows (C++) Adobe Flash (ActionSctipt) Web (JavaScript/HTML5) (docomo, SoftBank(Java)/ AU(BREW)) iphone (Objective-C) Android (Java) f 8
/ Windows docomo Windows 8 9
( ) C e.g. lib*.a/.so, *.dll, JNI (Java Native Interface) NG : Java Applet,, Flash, Java e.g. Python / Jython, Ruby / JRuby NG : Flash, JavaScript, 10
DSL Haskell/Tek DSL C, Java ( ) TeX ( ) Haskell DSL (embedded DSL) Haskell ( ) 11
DSL Haskell/Tek TeX Haskell/Tek C Java C Java iphone Android JavaScript 12
Haskell/Tek MA(N,X) = 1 N N 1 i=0 R (X i) Haskell/Tek: i n i-(n-1) i (close) ma n i = sum_close (i-(n-1)) i candles / tofloat n n C float accum0 = 0.0F; for (int i0 = i - iparam[0] + 1; i0 <= i; i0++) { accum0 = accum0 + i_get(candles, i0).close; } i_put(series[0], i, accum0 / (float) iparam[0]); 13
2: Haskell/Tek: N 1 (R (X i) AV G { R (X),,R (X N + 1) }) 2 ( i=0 σ(n,x) = N ( ) = ( )+ ( ) Bol(K, N, X) = MA(N,X)+Kσ(N,X) sum_iter i j f = Σ (x is i to j) f(x) sigma_i n ma i = sqrt_ (sum_iter (i - n + 1) i dist) / tofloat n where dist i = pow2_ (close_at i - ma) i n σ(n,i) bol (n,a,b) i = let_ "ma" (MA.ma n i) $ \ma -> let_ "sigma" (sigma_i n ma i) $ \sigma -> tup5 (ma + b*sigma, ma + a*sigma, ma, ma - a*sigma, ma - b*sigma) (5 ) 14
C float accum0 = 0.0F; for (int i0 = i - iparam[0] + 1; i0 <= i; i0++) { accum0 = accum0 + i_get(candles, i0).close; } float ma = accum0 / (float) iparam[0]; float accum1 = 0.0F; for (int i1 = i - iparam[0] + 1; i1 <= i; i1++) { float x = i_get(candles, i1).close - ma; } accum1 = accum1 + x * x; float sigma = sqrt(accum1 / (float) iparam[0]); i_put(series[0], i + 0, ma + fparam[1] * sigma); i_put(series[1], i + 0, ma + fparam[0] * sigma); i_put(series[2], i + 0, ma); i_put(series[3], i + 0, ma - fparam[0] * sigma); i_put(series[4], i + 0, ma - fparam[1] * sigma); σ 15
Haskell/Tek ( ) C bol (n,a,b) i = let_ "ma" (MA.ma n i) $ \ma -> let_ "sigma" (sigma_i n ma i) $ \sigma -> tup5 (ma + b*sigma, ma + a*sigma, ma, ma - a*sigma, ma - b*sigma) float accum0 = 0.0F; ( ) ( ) for (int i0 = i - iparam[0] + 1; i0 <= i; i0++) { accum0 = accum0 + i_get(candles, i0).close; } float ma = accum0 / (float) iparam[0]; float accum1 = 0.0F; for (int i1 = i - iparam[0] + 1; i1 <= i; i1++) { float x = i_get(candles, i1).close - ma; 16 accum1 = accum1 + x * x;
14 RSI DMI RCI ROC MACD %R 17
15... Haskell/Tek C (ios ) 7... 1... Haskell/Tek Java (Android ) 18
Haskell 1758 ( 777, C 981 ) C 2077 Java 2257 19
Haskell/Tek
Haskell 1. / C, Java, JavaScript,... (Java C ) Language.C.Quote(*1) 2. EDSL (*1) language-c-quote: http://hackage.haskell.org/package/language-c-quote 21
Language.C.Quote Haskell Haskell C C Haskell do.. (bodyexp, bodystmts) <-... C tell [C.BlockStm [cstm for(int $id:counter=$f ; $id:counter<=$t ; $id:counter ++) { $items:bodystmts $items:(makeassigns initvars bodyexp) } ] ]; 22
EDSL Haskell/Tek C/Java Haskell C Java Haskell/Tek Haskell (.exe ) C -- ma n i = sum_close (i-(n-1)) i candles / tofloat n -- C main = printccode ma -- main = printjavacode ma -- Java -- main = randomrun ma -- Java 23
EDSL ( 1) EDSL Tek ( ) printccode CLanguage Haskell/Tek Tek (EDSL ) printjavacode JavaLanguage randomrun HaskellRunner 24
EDSL ( 2): Kiselyov (*2) ( ) gen Haskell/Tek gen ( Lang l) gen gen CLanguage JavaLanguage HaskellRunner (*2) Finally Tagless, Partially EvaluatedTagless Staged Interpreters for Simpler Typed Languages, Journal of Functional Programming 19(5):509-543, 2009 25
DSL
DSL (1) LexiFi(*3) LexiFi OCaml DSL 1 DSL (*3)http://www.lexifi.com/ 27 LexiFi Web ( )
DSL (2) Paraiso Paraiso (*4) DSL CUDA+MPI, OpenMP C (*4)http://paraiso-lang.org/wiki/index.php/Main_Page 28
C Java Haskell DSL C EDSL 29
GUI DSL DSL Coq 30