ããã§ã1ã€ã®åœä»€ã ãã§ãªãããã¡ã€ã«å šäœããã³ãŒãããæ¹æ³ãããããŸããã
readMyFile = withBinaryFile "bin4.obf" ReadMode $ \ h -> do <br>
len <- hFileSize h<br>
buf <- mallocBytes $ fromInteger len<br>
hGetBuf h buf $ fromInteger len<br>
return (len, buf)<br>
ããã¯åºæ¬çã«ãã¡ã€ã«ã§æ©èœãããããå¿
é ã®èŠçŽ ã§ãã withBinaryFileã¯ãã¡ã€ã«ãéããæå®ãããããŠãŒã¶ãŒãé¢æ°ãå®è¡ããŠãã³ãã«ãæž¡ãããã¡ã€ã«ãéããŠããŠãŒã¶ãŒé¢æ°ãè¿ãããã®ãè¿ããŸãã ããã§ã¯ã$èšå·ã®åŸã«ã1ã€ã®ãã©ã¡ãŒã¿ãŒhïŒãã³ãã«ããïŒãæã€ããŠãŒã¶ãŒå®çŸ©ãé¢æ°ãèšè¿°ããŸããã ãã®é¢æ°ã¯ããã¡ã€ã«ãµã€ãºãåãåãããããã¡ãå²ãåœãŠããããã¡ã«èªã¿åãããããã¡èªäœãšãã®é·ãïŒãã€ãåäœïŒãè¿ããŸãã ããã§ã®ããŠãŒã¶ãŒé¢æ°ãã«ã¯ååããªãã次ã®ããã«å§ãŸãããšã«æ³šæããŠãã ããã\h -> function_body --
次ã¯ããããã¡ããåœä»€ãšããŒã¿ã¯ãŒããååŸããæ©èœã§ãã ãããã¡ãžã®çŸåšã®ãã€ã³ã¿ïŒå¿ èŠãªãã€ãæ°ã ãã·ããæžã¿ïŒãããã«æž¡ãããåœä»€ã€ã³ããã¯ã¹ãæž¡ãããŸãã ä»æ§ãããå¥æ°-å¥æ°ã€ã³ããã¯ã¹ãèŠããŠããããªãã³ãŒããšããŒã¿ã¯ãŒããããã§ãã ã€ãŸããåœä»€ã¯ãŒããã€ãããå§ãŸãã次ã«8çªç®ããå§ãŸããããŒã¿ã¯ãŒãïŒæµ®åïŒããããã4çªç®ããå§ãŸãããŒãããå§ãŸããŸãã
instruction :: Ptr a -> Int -> IO (Word32,Double)<br>
instruction ptr i = do <br>
let (iaddr,daddr) = if i `mod` 2 /= O then ( O , 4 ) else ( 8 , O ) -- instruction/data <br>
instr <- peek (plusPtr ptr iaddr) :: IO Word32 -- <br>
dta <- peek (plusPtr ptr daddr) :: IO Double -- <br>
return (instr, dta)<br>
æäœããäžåçã«ãæ°åŠçã«èãããããšã«æ³šæããŠãã ããïŒ "/ ="ã次ã«ããããã¡ãŒå šäœã§ããµã€ã¯ã«ããå®è¡ãããã¢ã®ãªã¹ãïŒæ瀺ãäžããããŸãïŒãè¿ããŸãã
ast = mapM ( \ i -> instruction (plusPtr buf $ i * 12 ) i) [ O .. nframes - 1 ]<br>
ããã§ã¯å€ãã®ããšãèµ·ãããŸãã ãŸãããããé¢æ°ãªã©ïŒç¹ã«ãmapMïŒã¯æ¬¡ã®ããã«æ©èœããŸãããªã¹ãã®1ã€ã®èŠçŽ ãå€æããããŠãŒã¶ãŒé¢æ°ããæäŸããããªã¹ãèªäœãããã«æž¡ãããŸãã次ã«ãmapã¯ãã®ãŠãŒã¶ãŒé¢æ°ãããããã«é©çšããŸããªã¹ãã®èŠçŽ ã§ããããã®é¢æ°ã®å€ããæ°ãããªã¹ãã圢æããŸãã ãããã«ãŒãã¯å
éšã®ã©ããã«ãããŸãïŒè©³çŽ°ã¯èª¬æããŸããïŒãlet q = map (\h -> h * 2) [1,2,3,4,5]
[2,4,6,8,10]ãè¿ããŸããããã¯å žåçãªäŸã§ãã å ¥åã®åé¡ã«ã¯ã€ã³ããã¯ã¹ãããïŒãŒãããæåŸãŸã§ïŒãåºåã«ã¯åã€ã³ããã¯ã¹ã§ãåœä»€ãé¢æ°ãåŒã³åºããçµæã®ãªã¹ãããããŸãã ããã«ç解ããã®ã¯é£ããããšããããŸããããã®æãæ¥ãŸãã-pythonãšrubyã¯ãã®æ¹åã«é²ãã§ãããããããšå ±ã«å¥ã®èšèªçŸ€ïŒãã¡ãããããã«ãªãèšèªããïŒãåããŠããŸãã
ast = mapM ( \ i -> instruction (plusPtr buf $ i * 12 ) i) [ O .. nframes - 1 ]<br>
mapMã«æ»ããšãæž¡ãããé¢æ°ã«ã¯ã2çªç®ã®åŒæ°ãšããŠ0ã1ãªã©ãé ã«æž¡ãããåœä»€åŒã³åºããå«ãŸããŸããæåã®åŒæ°ãšããŠãå埩ããšã«12ãã€ãã®ãªãã»ãããæã€ãããã¡ãŒãæž¡ãããŸãïŒ1ãªãã³ãŒã+ 1ããŒã¿ã¯ãŒã= 12ãã€ãïŒã plusPtrã¯ãæå®ããããã€ãæ°ããé¢ããæ°ãããã€ã³ã¿ãŒã圢æããŸãã
ããããµã€ã¯ã«å šäœã§ãã ãã®çµæãããã©ããããªãã³ãŒãã®ãªã¹ãããããŸãïŒãã©ããã¯ãä»æ§ã«åŸã£ãŠ1察1ã«å€æãããããïŒã
[(Add 0 77 66, 0.0), (Sub 1 0 102, 0.0), ...]
ã€ãŸããã»ã«77ãš66ãè¿œå ããçµæã0ã«ããŸãã次ã«ãã»ã«0ã®å 容ããã»ã«102ã®å 容ãæžç®ããçµæã1 ...ã«çœ®ããŸââãã ãããç§ãã¡ã®ã³ãŒãã§ãã ãããŠãããã«ããŒã¿ããããŸãïŒã»ã«0ã§0.0ãæåã®0.0ãªã©ã
ãã®æç¹ã§ãã¢ã»ã³ãã©ãŒã§ãã£ãŠããã©ã®èšèªã§ãäžå®å šãªã³ãŒããåæ¢ããŠçæã§ããŸãïŒçµå±ãã¿ã¹ã¯ä»æ§ããã®æäœã¯ããã«è¿ãïŒã ãããè¡ãã«ã¯ãåãã©ããæäœã®æååïŒç®çã®èšèªïŒã«ç¿»èš³ãè¿œå ããã«ãŒãã§ã³ãŒããæäŸããå¿ èŠããããŸãã ããããããã¯éèªçã«å®è¡ãããããããã£ãããšéå±ã«ãªããŸãã
ãªãé ãã®ã§ããïŒ 1åã ã䜿çšãããããã€ãã®çµæã®ã¡ã¢ãªãžã®æžã蟌ã¿æäœããããå®éã«ã¯ãã¬ãžã¹ã¿ãŸãã¯ã¹ã¿ãã¯ã®ã©ããã«ä¿åãããããšããããŸãïŒC / Haskell / Javaã³ã³ãã€ã©ãªã©ããããã®è©³çŽ°ãå®è¡ããŸãïŒ ASTã代衚ãããHaskellãã¯ãäœã§ãããšããŠæ©èœããŸãïŒã ãŸãããããã¿ããšã«æ§é ãã£ãŒã«ãã«ã¬ã³ãŒããçæããå Žåãããããã€ã³ãã³ããªãäœæããã³ã³ãã€ã©ã¯ãããŸããããã¡ã¢ãªã«ã¯1ã€ã®ã¬ã³ãŒããããããŸããã
ãããã£ãŠããã¡ã¢ãªãã»ã«ãã©ã®ã«ããŽãªã«åé¡ãããããåæããŸãã
1ïŒå®æ°ïŒèªã¿åãå°çšãæžã蟌ã¿äžå¯
2ïŒå®ã¡ã¢ãªãŒïŒæžã蟌ã¿ã®åã«èªã¿åããèªã¿åããããé ãæžã蟌ã¿ãŸã
3ïŒäžæå€æ°ïŒæžã蟌ã¿ã次ã«è€æ°ã®èªã¿åã
4ïŒã¯ã³ã¿ã€ã å€æ°ïŒæžã蟌ã¿ã次ã«èªã¿åãã ã«ãã³ä»ãã®åŒã«å ¥ããŸãã
誰ãã¡ã¢ãªã»ã«ãèªã¿æžãããããç解ããã«ã¯ã次ã®ã»ã¯ã·ã§ã³ã§ååœä»€ã®åäœã説æããå¿ èŠããããŸãïŒäžéšã®åœä»€ã¯ã¡ã¢ãªã®ã¿ãèªã¿åãïŒã¡ã¢ãªããããŒããžã®åºåïŒãä»ã®åœä»€ã¯æžã蟌ã¿ã®ã¿ïŒããŒãããã¡ã¢ãªãžïŒãã»ãšãã©ã®èªã¿åããšæžã蟌ã¿ïŒç®è¡ãæ¡ä»¶ä»ãïŒã
ååœä»€ã®åäœ-èªã¿åããã®ïŒæ¶è²»ãããã®ïŒã«ã€ããŠèª¬æããŸãã
consumesData (Add _ r1 r2) = [r1,r2]<br>
consumesData (Sub _ r1 r2) = [r1,r2]<br>
consumesData (Mul _ r1 r2) = [r1,r2]<br>
consumesData (Div _ r1 r2) = [r1,r2]<br>
consumesData (Output r1 r2) = [r2]<br>
consumesData (If _ condr1 _ r1 r2) = [condr1,r1,r2]<br>
consumesData (Sqrt _ r2) = [r2]<br>
consumesData (Copy _ r2) = [r2]<br>
consumesData _ = []<br>
åŸè
ã®å Žåãäžç·ã¯ãæ®ããã¹ãŠããæå³ããæåã®å Žåã¯ãåŒæ°ã®ã³ã³ã¹ãã©ã¯ã¿ã®ãã®å Žæã«ãããã®ã«èå³ããªãããšãæå³ããŸãã ã芧ã®ãšãããããã§ããã¿ãŒã³ãããã³ã°ã䜿çšãããŠããŸããåæ§ã«ãåæäœã®èšè¿°ïŒçæïŒã«é¢ããåäœã説æããŸãã
producesData (Add addr _ _) = [addr]<br>
producesData (Sub addr _ _) = [addr]<br>
producesData (Mul addr _ _) = [addr]<br>
producesData (Div addr _ _ ) = [addr]<br>
producesData (If _ _ addr _ _) = [addr]<br>
producesData (Input addr _) = [addr]<br>
producesData (Copy addr _) = [addr]<br>
producesData (Sqrt addr _ ) = [addr]<br>
producesData _ = []<br>
ããŒãã«é¢ããŠååœä»€ãäœãè¡ãã-èªã¿èŸŒãããŒãã説æããŸããreadsPort (Input _ port) = [port]<br>
readsPort _ = []<br>
ãããŠãèšé²ã¯åœŒå¥³ãæžããããŒãã§ãïŒwritesPort (Output r1 _) = [r1]<br>
writesPort _ = []<br>
ããã«ãèšé²ãçãããããã«ïŒèè
ã®çïŒcmap = concatMap<br>
concatMapã¯äœãããŸããïŒ mapãšåãã§ãããconcatãå®è¡ããŸãã Concatã¯ããªã¹ãã1ã¬ãã«æ¥çããŸããã å°ããªäŸïŒconcat [ "hello" , "africa" ] = "helloafrica" <br>
concat [[ 1 , 2 , 3 , 4 ],[ 5 , 6 , 7 , 8 ]] = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]<br>
concat [[]] = []<br>
<br>
map ( \ i -> [ 1 .. i]) [ 1 .. 5 ] = [[ 1 ],[ 1 , 2 ],[ 1 , 2 , 3 ],[ 1 , 2 , 3 , 4 ],[ 1 , 2 , 3 , 4 , 5 ]]<br>
concatMap ( \ i -> [ 1 .. i]) [ 1 .. 5 ] = [ 1 , 1 , 2 , 1 , 2 , 3 , 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 , 5 ]<br>
ä»ãæãæãããæ倧ã®äœåïŒ
produceCode ast dta = <br>
let <br>
inports = cmap readsPort ast :: [Int]<br>
outports = cmap writesPort ast :: [Int]<br>
readPort / writesportãåãªãã³ãŒãã«é©çšãããã¹ãŠã®ãªã¹ãã1ã€ã®ãªã¹ãã«é£çµããŸãã ãããã£ãŠãäžè¬çã«å
¥åããŒããšåºåããŒãã®ãªã¹ããååŸããŸããã-- consumes,produces,outputs to port [(memory/port ref,op address)] lookup tables <br>
consumes = cmap ( \ (d,a) -> consumesData d `zip` [a,a .. ] ) (ast `zip` [ O.. ]) :: [(Int,Int)]<br>
produces = cmap ( \ (d,a) -> producesData d `zip` [a,a .. ] ) (ast `zip` [ O.. ])<br>
outputsPort = cmap ( \ (d,a) -> writesPort d `zip` [a,a .. ] ) (ast `zip` [ O.. ])<br>
ããã§ã¯ã次ã®è³ªåãããããšãã§ããããã€ãã®ã«ãã¯ã¢ããããŒãã«ïŒãªãã¡ã¬ã³ã¹ããã¯ïŒïŒãäœæããŸãããæå®ããã¢ãã¬ã¹ã«æžã蟌ãåœä»€ã¯ã©ã®ã¢ãã¬ã¹ã«ãããŸããïŒ ïŒäžè¬çã«ã質åã¯æãã§ãããããã£ãŠãã¿ã¹ã¯ã®å®çŸ©ã«ããããã®åœä»€ã¯ã¢ãã¬ã¹Nã«ãããŸãããç§ã¯ä»ãããå®çŸããŸããïŒ
æå®ãããã»ã«ãèªã¿åãåœä»€ã®ã¢ãã¬ã¹ã¯äœã§ããïŒ
æå®ãããããŒãã«æžã蟌ãåœä»€ã¯ã©ã®ã¢ãã¬ã¹ã§ããïŒ
Haskellã§ã¯ãããªããã£ãã«ãã¯ã¢ããããŒãã«ã¯ãã¢ïŒããŒãå€ïŒã®ãªã¹ãã§ãã ããã«ã¯ãæå®ãããããŒã®ãã¹ãŠã®å€ãæ€çŽ¢ããŠãªã¹ããè¿ãé¢æ°ããããŸãã ããã«ãããŸãïŒ
-- op address that reads/writes given mem/port <br>
reads m = map snd $ filter ((m == ) . fst) consumes :: [Int]<br>
writes m = map snd $ filter ((m == ) . fst) (produces) :: [Int]<br>
outputs m = map snd $ filter ((m == ) . fst) outputsPort :: [Int]<br>
ãããã¯ãæå®ãããã¡ã¢ãªäœçœ®ãèªã¿åãããæå®ãããããŒãã«æžã蟌ãããŸãã¯æžã蟌ãã¢ãã¬ã¹ã®ãªã¹ããåã«è¿ããŸãã ä»çµã¿ïŒreads m = map snd $ filter ((m == ) . fst) consumes^M<br>
æåéãã2çªç®ã®èŠçŽ ãååŸããæåã«æå®ãããmã«çããæåã®èŠçŽ ãæ¶è²»è
ãã£ã¬ã¯ããªïŒä»¥åã«èšç®ïŒããé€å€ããŸãã ã©ã®ããã«æ©èœããŸããïŒãã£ã«ã¿ãŒé¢æ°ã¯ãããŠãŒã¶ãŒé¢æ°ãïŒïŒm ==ïŒãfstïŒãšãªã¹ããå ¥åãšããŠåãåããŸãã ãªã¹ãããåé ç®ã®å ¥åã«ã«ã¹ã¿ã é¢æ°ãæž¡ãããTrueãŸãã¯Falseãè¿ãããŸãã ãã®ãªã¹ããããçµæã«å¿ããŠãèŠçŽ ãçµæã®ãªã¹ãã«å«ãŸãããã©ããã決ãŸããŸãã ãããã£ãŠãå°ããªãªã¹ããæ®ã£ãŠããŸãã ãã®ãªã¹ãã¯ãmapé¢æ°ã®2çªç®ã®åŒæ°ã§ãïŒã$ãæŒç®åã«ã€ããŠã¯åã«èª¬æãããšããïŒã 次ã«ããããã¯sndé¢æ°ããªã¹ãã®åèŠçŽ ã«é©çšããçµæã®ãªã¹ãã圢æããŸãã
æ€èšãããŠããªããã®ã snd / fsté¢æ°ã¯ããã¢ã®2çªç®ãŸãã¯1çªç®ã®èŠçŽ ãããããè¿ããŸããã€ãŸãããã¢ã®å解ã«é¢äžããç°¡åã«èšãã°ã2çªç®ãŸãã¯1çªç®ã®èŠçŽ ãåã¿ãŸãã
fst (1,2) = 1
snd (1,2) = 2
fst ("Hello", 2+2) = "Hello"
snd ("Hello", 2+2) = 4
ãããŠä»ãHaskellã®èå³æ·±ãç¹ã®1ã€ã¯ãé¢æ°ã®æ§æã§ãã äŸãèããŠã¿ãŸãããïŒ
fx = sin (cos (sqrt (x))), - :
fx = sin $ cos $ sqrt x
ããã§ãè³ãåãããŠããxããåžžã«æ©èœã®èæœãåšãééããããšã確èªããŸããæåã«sqrtã次ã«cosã次ã«çœªã§ãã 確ãã«ãé¢æ°fxã®ã°ã©ããäœæããããšã¯å¯èœã§ãããã°ã©ããäœæããããšãå¯èœã§ããããããããã®3ã€ã®é¢æ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ã·ãŒã±ã³ã¹ã¯åãçµæãäžãã1ã€ã®é¢æ°ã«å¯Ÿå¿ãããããæ°åŠè ã ããå¥ã®ååãä»ããŸããã§ãã!!! æ£åŒãªæèãæã€äººã ãèš±ããŠãã ããã
ããã§ãæž¡ãããé¢æ°ãããããããHaskellé¢æ°ããããšããŸããäŸãã°
plot :: (Double -> Double) -> Double -> Double -> IO() ( IO () void, : plot Double Double, Double ( ), void)
plot sin 0 6.28 -- sin 0 6.28
plot cos 0 3.14 -- , , .
ããã§ãsiné¢æ°ãŸãã¯cosé¢æ°ããã®ãŸãŸæž¡ãããšãããããŸããåŒæ°ã¯ãã°ã©ãã®äœæäžã«äœæããã人ã«æž¡ãããŸãã ååãçºæãããŠããªãæ©èœã®å®å šãªèæœãåšãã©ã®ããã«æž¡ãããšãã§ããŸããïŒ
ãã®ãããªèæœãåšã説æããç·æ¥ã®å¿ èŠæ§ããããŸãã ãããã£ãŠïŒ
fun1 = sin -- 1
fun2 = sin . cos . sqrt -- , -
次ã«ãäžå®å šãªã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã ããã«ãããšãã°çŽ¯ä¹æ³ãªã©ã®2ã€ã®åŒæ°ãåãé¢æ°ããããŸãã
pow 2 3 = 8 --
pow2:
pow2 = pow 2
å¿ èŠãª2ã€ã®åŒæ°ã®ãã¡1ã€ã®åŒæ°ã ããæž¡ããŸããããã ããç§ãã¡ãæ¢ããŠscããŸããã§ããïŒ pow2é¢æ°ã®ã¿ã€ãã¯äœã§ããïŒ éåžžã«ç°¡åã§ãã圌女ã¯å¥ã®DoubleåŒæ°ãå¿ èŠãšãããããè¿œå ãããã®åŒæ°ã§powé¢æ°ãåŒã³åºããŸãã2ã€ã¯æ¢ã«ååšããŸãïŒ
pow2 4 = 16
Haskellã®ã¿ã€ããèšè¿°ããè¡šèšã倩äºããåããããã®ã§ã¯ãªãããšãããããŸãããæãèŠãŠãã ããïŒpow :: Double -> Double -> Double -- double, double, double
pow2 :: Double -> Double -- double, double
ãŸããpow2ã¯powé¢æ°ã«1ã€ã®åŒæ°ãæå®ããããšã§ååŸãããããã1ã€ã®åŒæ°ãpowã«è¿œå ãããšæ°ããé¢æ°ãäœæããããšçµè«ä»ããããšãã§ããŸãïŒ
pow :: Double -> (Double -> Double) -- .
ãããã£ãŠãå¿ èŠã«å¿ããŠæ¬åŒ§ãå³åŽã«è¿œå ã§ããŸãããæå³ã¯åãã§ãã ãŸãããããããç¶ããŸãã
pow 2 3 =ïŒpow 2ïŒ3ãã€ãŸããæåã«é¢æ°ãçæããŠãããæ¬ èœããŠããåŒæ°ãè¿œå ããŸãïŒé¢æ°ãããªãã«ã«é©çšããŸãïŒã
çŸã«æ»ããŸãããã
reads m = map snd $ filter ((m == ) . fst) consumes<br>
ãã£ã«ã¿ã«ã¯é¢æ°ããããŸãïŒïŒm ==ïŒã fstã ããã§ã¯ããã€ã³ãïŒçµæïŒãšéšåçãªé©çšã芳å¯ããŸãïŒm ==ã ããã¯m ==ã§ããããã¯ãå
¥åã§1ã€ã®åŒæ°ãåãåããçå·ã®å³åŽã«ä»£å
¥ããé¢æ°ã§ãã m ==é¢æ°ã¯ãåŒæ°ãmãšæ¯èŒããçµæãè¿ããŸãã mã5ã®å ŽåãïŒïŒm ==ïŒ5ïŒã¯Trueãè¿ããŸããä»ãç§ãã¡ã¯ãã¹ãŠãå³ããå·Šã«èªã¿ãŸãïŒèæœãåšãããããããå«ããã®ãæåã«fsté¢æ°ã«éããïŒãåãã®ããã«ããã¢ããæåã®èŠçŽ ãæœåºããŸãïŒã次ã«ãã®å€ãm ==ã«éãããŸããããŒã«å€ãè¿ããŸãã ãããã£ãŠãã«ããã«ïŒaãbïŒãèæœãåšã«å ¥ããããŒã«å€ãåºãŠããŸããããã¯ãã®mã«çããã§ããããïŒ
ããã§ãæžã蟌ã¿ãŸãã¯èªã¿åããããã»ã«ãžã®ãã¹ãŠã®åç §ãéžæããå¿ èŠããããŸãããã®ããã次ã®ããšããå§ããŸãã
-- all memory references (including temporaries etc - from plain program) <br>
alldata = nub $ sort $ cmap consumesData ast ++ (map recast $ cmap producesData ast) :: [Int]<br>
ããã§ïŒå³ããå·Šã«èªã¿ãŸãïŒãcmapproducesDataAstastãã¯ããã¹ãŠã®æžã蟌ã¿å¯èœãªã»ã«ã®ãªã¹ããã¢ãã¬ã¹ã®ãã©ãããªã¹ãã®åœ¢åŒã§è¿ããŸããåæ§ã«ãconsumsDataã§çºçããŸãã ã åºæ¬çã«ãnubã«ã¯ãœãŒãããããªã¹ãã¯å¿
èŠãããŸããããããã¯ä»¥åã¯ç¥ããŸããã§ãããnub [1,2,1] = [1,2]
nub [2,1,2] = [2,1]
-- constants <br>
constants = filter ( \ m -> O == (length $ writes m)) alldata :: [Int]<br>
ãããŠã次ã®ããšãèµ·ãããŸããã誰ãæžã蟌ããªããã¹ãŠã®ã¢ãã¬ã¹ããã¹ãŠã®ããŒã¿ããéžæããŸããã ãããŠããããã¯ãããããã®ã¿èªã¿åããããããããããå®æ°ã§ãã ããã«ãªã¹ãããããŸãã-- all persistent (optimized memory) <br>
persistents = filter ( \ m -> (head $ reads m) <= (head $ writes m)) (alldata \\ constants) :: [Int]<br>
ãããŠãããã§ã¯ãç¹°ãè¿ãã®éã«æã
ä¿åããããã¹ãŠã®å€æ°ãéžæããŸããã ãããè¡ãã«ã¯ããã¹ãŠã®ããŒã¿ãååŸããããããå®æ°ãæžç®ãïŒæäœ\\-ãªã¹ãã®éãïŒã誰ãæåã«èªã¿åãã誰ãæåã«æžã蟌ãããèŠã€ããŸããã ããªãã圌ããæžãå Žæã®åã§èªããªãã圌ãã¯ããã«äœãããããšä¿¡ããŠããŸãïŒ ååããæ®ããŸããïŒ ãããã£ãŠããã®æ¹æ³ã§ããã©ãã¯ããã¯ã¹ã®ã¡ã¢ãªã§ããå Žæã®ãªã¹ããäœæããèªã¿åãããã³æžã蟌ã¿ã«äœ¿çšã§ããããã«ããŸããã-- temporaries which are reused parts of expressions <br>
lets = filter ( \ m -> 1 < (length $ reads m)) (alldata \\ constants) \\ persistents :: [Int]<br>
ããã§ãæ®ãã®ããŒã¿ããïŒãã¹ãŠã®ããŒã¿ãããããŸã§ã«ç¥ã£ãŠãããã¹ãŠãå·®ãåŒããããïŒãè€æ°åèªã¿åãããã»ã«ãèŠã€ãããŸããã ããã¯æ°žç¶çãªããŒã¿ã§ã¯ãªãããïŒé€å€ïŒãæåã«èšç®ãããŠããæ°å䜿çšãããã®ã¯ããããäžæå€æ°ã§ãã äžæå€æ°ã¯åãå埩å
ã§äœ¿çšãããŸããããã以å€ã§ã¯å¿
èŠãããŸããã-- expressions to inline (variables that are used 1 time) <br>
onerefs = filter ( \ m -> (length $ reads m) == 1 && (length $ writes m) == 1 ) <br>
((alldata \\ constants) \\ persistents) :: [Int]<br>
ãããŠãããã§ã¯ãäžåºŠæžã蟌ãŸããŠãã1åèªã¿åãããå€æ°ãèšç®ããŸããã ãããã«ã€ããŠã¯ãäœãéå§ãããè§æ¬åŒ§ã§å²ãŸããåŒãããããã圢æãããŸãã ãã©ãã¯ããã¯ã¹ã®äœæè
ã¯ããã®ãããªã¯ã©ã¹ã®å€æ°ãå¿
èŠãšããŠããŸããããªããªãããããã®ã¯ã©ã¹ã«ã¯äœã¬ãã«ã®èšèªããããé«ã¬ãã«ã®çµæã§ã¯ããã»ããµã®ã¬ãžã¹ã¿ã«äœãã§ããããã§ããããããã³ã³ãã€ã©ã¯ç§ãã¡ã®ç¥ããªããšããã§ãããåŠçããŸãã次ã«ãããªãŒæäœïŒæäœäžã«èªã¿åãããã¢ãã¬ã¹ã®ã¿ãæžã蟌ãŸããïŒãããããªãŒã®ãããªãªãã³ãŒããã€ãŸãæ¥å°ŸèŸExpãæã€ãã®ã«ç§»åããå¿ èŠããããŸã-ãããã¯ç¬èªã®çš®é¡ãžã®ãªã³ã¯ãå«ã¿ãããªãŒã圢æããŸãã ãããè¡ãããã«ãã¢ãã¬ã¹å šäœã§ããªãŒå šäœãçæããé¢æ°ãèšè¿°ããŸãã ååž°çã«ãªããŸãã å®æ°ãååšããã¢ãã¬ã¹ã圌女ã«äžããã°ãããã¹ãããšã¯ããŸããªãããã§ãã ãããŠãä»ã®2ã€ã®ã»ã«ãè¿œå ããçµæãæžã蟌ãŸããã¢ãã¬ã¹ã圌女ã«äžãããšãä»ã®2ã€ã®Opãè¿œå ããOpãçæããå¿ èŠãããããããã¯ããã«å®æ°ã§ããããçªç¶ä¹ç®ã®çµæããããŸã...
-- geherates reference to the expression identified by given address, <br>
-- this excludes address where to store it, only value is obtained <br>
ref :: DestAddr -> Op<br>
ref a <br>
| elem a constants = Const (dta !! a)<br>
| elem a onerefs = geneval a<br>
| elem a lets = ReadVarExp a<br>
| elem a persistents = ReadExp a<br>
| otherwise = trace "oops1" $ undefined<br>
ããã«ãå
¥åãã©ã¡ãŒã¿ãŒã«ããã€ãã®åææ¡ä»¶ãéããããrefé¢æ°ããããŸãããã®ãããªæ¡ä»¶ã®æ§æã¯ã瞊æ£ãæ¡ä»¶ãçå·ãé¢æ°ã®æ¬äœã§ãæ¡ä»¶ãçã®å Žåã«æºããããŸãã if ... elseif ... elseif ... else ... endifã®ãããªå€§ããªãã®ã§ãã ãã¬ãŒã¹ "oops" $ undefinedã§èª¬æããæåŸã®ãšã©ãŒ-ãšã©ãŒãåºåãïŒãã¬ãŒã¹ïŒãããã°ã©ã ãåæ¢ããŸãïŒæªå®çŸ©ïŒãå ¥åã¢ãã¬ã¹ãå®æ°ã«å±ããŠããå Žåãå®æ°ãžã®ã¢ã¯ã»ã¹ãçæããŸãïŒå®æ°ãè¡šãOpã®ã¿ïŒã Constã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã«ãã£ãŠæ±ºå®ãããå®æ°ã¯ãåã«æå®ãããã¢ãã¬ã¹ã®ã¡ã¢ãªå€ã§ãã dtaã¯ãã¹ãŠã®ã¡ã¢ãªã»ã«ãé çªã«å«ããªã¹ãã§ãdfa !! aã¯ãªã¹ãã®açªç®ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ã§ãã
å ¥åã¢ãã¬ã¹ãonerefsã«å±ããŠããå ŽåïŒã¡ã¢ãªã1åæžã蟌ãŸãã次ã«1åèªã¿åãããïŒãä»ã®2ã€ã®opã§ããªãŒããŒãã圢æããå¿ èŠããããŸãïŒæ¬åŒ§ã䜿çšããæäœïŒã GenevalãåŒã³åºããïŒä»¥äžã§èª¬æããŸãïŒãåçŽãªOpïŒ2ã€ã®ã¡ã¢ãªã»ã«ãè¿œå ããçµæã3çªç®ã«é 眮ïŒããçæãããŸãïŒä»ã®2ã€ã®Opãè¿œå ãã_in general_ãè¿ããŸãïŒ
åæ§ã«ãäžæå€æ°ïŒäžåºŠæžã蟌ãŸããå€ããèªã¿åãããŸãïŒã®èªã¿åããããã³å ¥åããŒãã®èªã¿åãçšã
genevalé¢æ°èªäœã«ã€ããŠã¯åŸã§èª¬æããŸããããã¿ãŒã³ãããã³ã°ã䜿çšããŸãã åä¿¡ããã¢ãã¬ã¹ãããïŒãªã¹ãastããïŒãã©ããOpãéžæããããªãŒã«å€æããŸãã å¥åŠãªããšã«ããã®é¢æ°ã¯äžèšã®ããã«refãåŒã³åºããããé¢æ°ã¯çžäºã«ååž°çã§ãã
-- turns plain code in tree code, converting memory refs to ops via "ref" <br>
geneval a = e $ ast !! a<br>
e (Add addr r1 r2) = AddExp (ref r1) (ref r2)<br>
e (Sub addr r1 r2) = SubExp (ref r1) (ref r2)<br>
e (Mul addr r1 r2) = MulExp (ref r1) (ref r2)<br>
e (Div addr r1 r2) = DivExp (ref r1) (ref r2)<br>
e (If cmdop cmdr addr r1 r2) = IfExp cmdop (ref cmdr) (ref r1) (ref r2)<br>
e (Input addr r1) = ReadPortExp r1<br>
e (Sqrt addr r1) = SqrtExp (ref r1)<br>
e (Copy addr r1) = ref r1<br>
e x = trace (show x) $ undefined<br>
Op Copyã¯ãçµæãå
ã®ã¢ãã¬ã¹ã«æž¡ãããšãæå³ããŸãã Add / Sub / Mul / Divã³ãã³ã-ãã©ããããããªãŒãžã®éèªçãªå€æã å
¥åã¯ããŒãããèªã¿åãããã«å€æãããŸãã äžæå€æ°ãŸãã¯å®æ°å€æ°ããã®èªã¿åãã¯ãäžèšã§refã«å€æãããŸãã次ã«ãäžä»£ãæžããŸã
retval = "module Vm where \n data VMState = VMState { " ++ <br>
(intercalate "," $ <br>
map (( "m" ++ ) . show) persistents ++ <br>
map (( "o" ++ ) . show) outports<br>
) ++ "::Double } \n " ++ <br>
ããã«ãããæ§é èªäœã®èª¬æãå«ãããŒããçæãããŸããã ããã§ãæããã«ãïŒ++ïŒã¯ãªã¹ãïŒæååïŒãæ¥çããæŒç®åã§ãããã€ã³ã¿ãŒã«ã¬ãŒãã¯è€æ°ã®ãªã¹ããæ¥çããæå®ããããªã¹ããšäº€äºã«äžŠã¹ãŸãïŒèªã¿ãŸãïŒåºåãã³ã³ããæ¿å ¥ããŸãïŒãæ§é ã«ã¯ããã¬ãã£ãã¯ã¹mïŒã¡ã¢ãªïŒãšoã®æ¥é èŸãä»ããåºåããŒã-åºåããŒãã æåŸã«ãDoubleåãæå®ããæ¹è¡ãå¿ããªãã§ãã ããã
Doubleåã§ã¯ãªãã!! Doubleåãæå®ãããšãã¬ã€ãžãŒãã£ãŒã«ãã§ã¯ãªãã¬ã€ãžãŒãã£ãŒã«ããæã€æ§é ã«ãªããŸãã ãã®ç 究ã§ã¯ããã¹ãŠã®åºåããŒããèšç®ãããšãé床ã®å·®ã20å以äžã§ããããšã瀺ãããŠããŸãïŒåã®æçš¿ãåç §ïŒã ããŠãå³å¯æ§æ³šéïŒæå笊ïŒã眮ãæãããã©ããã¯èªè 次第ã§ãã ããã¹ãŠã®åºåããŒãããšèšã£ãã®ã¯ãªãã§ããïŒ é 延èšç®ã§ã¯ãNåç®ã®å埩åŸã«ãã®æ§é ã®å€ãååŸããããšãã°ãå¿ èŠãªããŒãã1ã€ã ãèŠæ±ã§ããããã§ãã ä»äºã®å€§ããªåç·ãéãå§ããäžæåæ¢åŸãèšç®ãããå€ãæ¥ãŸãïŒããšãã°ã
putStrLn $ "o10=" ++ (show $ o10 vmlast)
ãã®åŸã次ã®ããã«ãªããŸããão10 =ããã³ã³ãœãŒã«ã«æžã蟌ãŸãããã®åŸäžæåæ¢ããå€ã衚瀺ãããŸãã åãputStrLnãå床æžã蟌ããšãé 延ã¯ãããªããªããŸãã èšç®ãããå€ã åŸã§o11ãæžãããã«äŸé Œãããšãé 延ã¯åã³å€§ãããªããŸããão10ãšo11ã«ã¯o10ã«ã€ããŠãã§ã«å®å šã«èšç®ãããŠããão11ã«ã€ããŠã¯èæ ®ãããªãå¯èœæ§ãé«ããããããããããã»ã©å€§ãããªãã§ãããã
"initState = VMState {" ++ <br>
(intercalate "," $ <br>
map ( \ a -> "m" ++ (show a) ++ "=" ++ (show $ dta !! (recast a))) persistents ++ <br>
map (( ++ "=O" ) . ( "o" ++ ) . show) outports<br>
) ++ "} \n " ++ <br>
ããã§ããã©ãã¯ããã¯ã¹ã®ç¶æ
ã®åæå€ãäœæããé¢æ°ãçæãããŸããã ãã¹ãŠã®ã¡ã¢ãªã¯ãé©åãªå ŽæïŒdtaïŒã«ãã£ããã€ããªã®å€ã§åæåãããŸãã ãã¹ãŠã®åºåããŒãã¯ãŒãã«åæåãããŸãã Haskellã§ã¯ãæ§é ã®å¿
é ã®åæåãå¿
èŠã§ãã"nextState x (" ++ (intercalate "," $ map (( "i" ++ ) . show) inports) ++ ")= \n let \n " ++ <br>
cmap ( \ a -> " t" ++ show a ++ "=(" ++ (ast2haskell "x" $ geneval a) ++ ") :: Double \n " ) lets ++ <br>
" in x { \n " ++ <br>
intercalate ", \n " (<br>
map ( \ a -> " m" ++ show a ++ "=" ++ (ast2haskell "x" $ geneval a)) persistents ++ <br>
map ( \ a -> " o" ++ show a ++ "=" ++ (ast2haskell "x" $ geneval $ head $ outputs a)) outports )<br>
++ "} \n " ;<br>
ããã§ã¯ãæãããªã¥ãŒã ã®ããéšåãçæãããŸãã ãŸããå
¥åãã©ã¡ãŒã¿ãŒã®ã¿ãã«ã次ã®ãããªåœ¢åŒã§åœ¢æãããŸãïŒïŒi10ãi11ãi60000ïŒããã®åŸããletããå
¥ãããã¹ãŠã®äžæïŒéæ°žç¶ïŒå€æ°ããã¬ãã£ãã¯ã¹ãtãã§å
¥åãããŸãã 次ã«ãåã¡ã³ããŒã®åŒãèšè¿°ãããæ°ããæ§é ã圢æãããŸãïŒx {m20 = expr1ãm25 = expr2 ...ão10 = exprN}ã åæåtããã³mã®åŒã¯ããtNNãããiNNããããã³ãmNN xããæããŸããåŸè
ã¯ãåã®å埩ã®ã¡ã¢ãªå€ãæå³ããŸããin retval -- .
ãšã³ãã£ã³ã°ãç¶ããŸã