ããã°ã©ãã³ã°è¨èªã®æé©åã®ããããã«ã¤ãã¦
ããã°ã©ãã³ã°è¨èªã®é«ç´åã¯ãã¦ãã¦ããã°ã©ã ãè¤éåãæé©åãé»å®³ãã¦ãã¾ãã¾ãã
rowlã®éçºã§ã¯ãã®ãã¬ã¼ããªãã«ã¤ãã¦ç¥çµè³ªã«ãªããã¨æã£ã¦ãã¾ãã
æé©åã®åºæ¬
æé©åã«ã¯å½ä»¤æ°åæ¸ã»ä¸¦ååã»ãã¤ãã©ã¤ã³æé©åã»ã¬ã¸ã¹ã¿å²ãå½ã¦ã»ã¹ã±ã¸ã¥ã¼ãªã³ã°ã»ãã£ãã·ã¥æé©åã»ã»ã»ã¨ãã¾ãã¾ãªå¯¾è±¡ã»ææ³ãåå¨ãã¾ããããããã«ãå ±éããäºã¯
å ã®ããã°ã©ã ãããè¯ããã®ã«å¤å½¢ãã
ã¨ããäºã§ããã®éã«éè¦ãªã®ã¯
ããã°ã©ã ã®æå³ãå¤ãã¦ã¯ãªããªã
ã¨ããæé©åã®åºæ¬ååã§ããããã°ã©ã ã®æå³ãå¤ããªãçºã«ã¯ããã°ã©ã ã®è§£æãå¿ è¦ã§ããã®çºã®ææ³ã¯å¤§ããåããã¨
- ããã¼è§£æ
- å解æ
ã§ããæé©åãããããè¨èªã¨ã¯ãããã精度ããè¡ãäºãåºæ¥ãè¨èªã¨è¨ãäºãã§ãã¾ãã
ã¾ããHaskellã®æ§ãªåç
§ééæ§ãå®ç§ã«ä¿ããã¦ããè¨èªã§ã¯ãããã®è§£æããããã¨ãªãããã°ã©ã ã®å¤å½¢ãå¯è½ã§ãã
å解æã¯æ°å¦çè«ã¨ãã¦ã¯å¤ãã§ãããç¾å®ã®ã³ã³ãã¤ã©ã§æé©åã®çºã«ä½¿ç¨ããã¦ããä¾ã¯å°ãªãã§ããã¾ãå解æã§ããã¼è§£æã®ä»äºãã«ãã¼ãããã¨ã¯ä»ã®ã¨ããã§ãã¾ãããããã§ããã¼è§£æã«åºã¥ãæé©åã«æ³¨ç®ãã¾ãã
ããã¼è§£æ
ããã¼è§£æã¯
- å¶å¾¡ããã¼è§£æ
- ãã¼ã¿ããã¼è§£æ
ã®äºã¤ã«åãããã¦ããã¼ã¿ããã¼è§£æããæ´¾çãã¦ã¨ã¤ãªã¢ã¹è§£æãªã©ãããã¾ãã
å¶å¾¡ããã¼è§£æ
å¶å¾¡ããã¼è§£æã§ã¯ããã°ã©ã ã®å
¥ãå£ããåºå£ã¾ã§ã©ã®ãããªçµè·¯ã§å¦çãé²ãã§ãããã解æãã¾ãã
å¶å¾¡ããã¼ã«ã¯
- åºæ¬ãããã¯å ããã¼
- éä¸ã«åå²ããªãä¸ç´ç·ã®ããã¼
- ãããã¯éããã¼
- ifæãwhileæãªã©ã§ã®ã¸ã£ã³ãã«ããããã¼
- é¢æ°éããã¼
- é¢æ°å¼ã³åºãã«ããããã¼
ã®ï¼ã¤ããããä¸è¬ã«å¾è ãæ±ããã¨ããç¨è§£æãé£ãããªãã¾ãã
ãã¼ã¿ããã¼è§£æ
åºæ¬çã«ã©ãã§å®ç¾©ãããå¤æ°ãã©ãã§ä½¿ç¨ãããããæ¸ãæãããããã¨ãã解æã§ãã
å¶å¾¡ããã¼è§£æã®çµæã«åºã¥ãã¦ãã¼ã¿ããã¼æ¹ç¨å¼ã¨ãããã®ãç«ã¦ã¦ããã解ããã¨ã«ããè¡ãã¾ãã
ãã¤ã³ã¿ãåå¨ããè¨èªã§ã¯ã¨ã¤ãªã¢ã¹è§£æãå¿
è¦ã«ãªãã¾ãããã¨ã¤ãªã¢ã¹è§£æã¯ä¸è¬ã«è¨ç®éãé«ãé£ããã§ãã
æé©åææ³ã®å¤ãããã¼ã¿ããã¼è§£æã®çµæãå©ç¨ãã¾ããå®æ°ç³ã¿è¾¼ã¿ã»å ±éé¨åå¼é¤å»ã»é¨ååé·æ§é¤å»ã»ã«ã¼ãå¤æã»ã»ã»ã»ã»ã
æé©åã®é»å®³è¦å
åçé¢æ°å¼ã³åºã
å®è¡æã¾ã§ã©ãã«ã¸ã£ã³ããããããããªãã®ã§ãããã¼è§£æã¯ä¸å¯è½ã§ããå¾ã£ã¦åçé¢æ°ã³ã¼ã«ãè·¨ãã æé©åã¯ã»ã¼ä¸å¯è½ã§ãã
åçè¨èªã¯åºæ¬çã«å
¨ã¦ã®é¢æ°ãåçæç¸ãªã®ã§ããã¼è§£æã¯ã¾ãä¸å¯è½ã§ãå¤ãã®æé©åãå®è£
ã§ãã¾ããã
é¢æ°åè¨èªã®é«éé¢æ°ã»ç¶ç¶ã»ã¯ãã¼ã¸ã£ããªãã¸ã§ã¯ãæåè¨èªã®ä»®æ³é¢æ°ãåçã§ãããéçæç¸ã®é¢æ°ãããã¾ãã®ã§æé©åã®ããããã¯éçã¨åçã®å²åã«ä¾ãã¾ãã
åçæç¸ã®åé¡ã¯å®è¡ææé©å(ããããJIT)ã«ãã解決ã§ããå¯è½æ§ãããã¾ããããããå®è¡æã«ã¯å¤æ°åã»é¢æ°åãå¶å¾¡æ§é ã«é¢ããæ
å ±ã失ããã¦ãããæé©åã«ã¯æéããããã¨ããå£ãããã®ã§ãã©ããã¦ãæé©åã®å¹æã¯ä¸ãã£ã¦ãã¾ãã¾ãã
ä¾å¤æ©æ§
ä¾å¤çºçã¨ã¯ã¤ã¾ãã¸ã£ã³ãã§ãã®ã§ãä¾å¤ãçºçããå¯è½æ§ã®ããå
¨ã¦ã®å¼ã§åºæ¬ãããã¯ãåæããã¾ããããã«ä¾å¤çºçç®æããã©ãã«é£ã¶ã®ãåãããªãå ´åãã»ã¨ãã©ã§ããé«ç´ãªè¨èªã§ã¯é
åã®ç¯å²ãã§ãã¯ã»nullãã§ãã¯ã»åãã§ãã¯ãªã©ããããã
ãã§ä¾å¤ãéåºãã¾ãã®ã§ãæé©åã大ããé»å®³ããã¾ãã
ããããä¾å¤ã¯
- é¢æ°ã³ã¼ã«ã¨éã£ã¦æ»ã£ã¦ããªã
- ãã£ãã«ä¾å¤ã¯çºçããªã
ã¨ããç¹å¾´ãããã®ã§ãä¾å¤ä¾å解æãè±æé©åãªã©ãå©ç¨ããæé©åãå¯è½ã§ãã
ãã¤ã³ã¿æ¼ç®
ã»ã¼C/C++è¨èªç¹æã®åé¡ã§ããã¡ã¢ãªã¯ä¸æ¬¡å
ã§ãã®ã§ãã¤ã³ã¿ãä»ãã¦ãã¡ã¢ãªç©ºéå
¨ä½ã«ã¢ã¯ã»ã¹ããäºãã§ãã¾ãã
ã¤ã¾ãããã¤ã³ã¿å¤æ°ã¯åççã«ãã¼ãä¸ã®ãã¼ã¿ã ãã§ãªãã¹ã¿ãã¯ä¸ã®ãã¼ã¿ã«ã¤ãã¦ãããã¨ãããããã¼ã¿ã¨ã¨ã¤ãªã¢ã¹ãã¾ãã
ã¾ãããã¤ã³ã¿ã¯ãªãã¸ã§ã¯ã(ç¹ã«é
å)ã®éä¸ãæãäºãã§ãã¾ãããã¦ãC/C++è¨èªã§ã¯é¢æ°å¼æ°ã«é
åã渡ãã¨ããã¯ãã¤ã³ã¿ã¨ãã¦æ±ããã¾ããããããã¨
void f(double a[], double b[]) { .... }
ã¨ãã£ãé¢æ°ã§å®ã¯a,bã®ã¡ã¢ãªé åãéè¤ãã¦ããå¯è½æ§ããããããããããæ¤æ»ããäºãã§ãã¾ãã(ããé
åã®éä¸ããã¤ã³ã¿ãæããªããªãã°ãa == bãã©ãããå®è¡æã«ãã§ãã¯ãããã¨ãå¯è½)ã
ãã®çºã«C/C++ã«ã¯restrictæ示åãããã¾ããã¾ããããã¯CããFortranã®æ¹ãæé©åãå¹ããããã¨è¨ãããçç±ã®ä¸ã¤ã§ãã
ããã¯ã¹å
æ´æ°ã»æµ®åå°æ°ç¹æ°ã»é
åãªã©ã®ãã¼ã¿ããã¼ãä¸ã«ç½®ãäºã§ããããã¯ã¹ååãã¼ã¿ãåãæ±ãçºã«ã¯ãã¤ã³ã¿ã»åç
§åã®å¤æ°ãå¿
è¦ã«ãªãã¾ãããããããã¨ã¨ã¤ãªã¢ã·ã³ã°ãçºçãã¾ãã
é«ç´è¨èªã®å¤ãã¯ããã©ã«ãã§ããã¯ã¹åããããã¼ã¿ãæ±ãã¾ããããã¨ãã¨ã¤ãªã¢ã¹è§£æãå¿
è¦ã«ãªãæé©åæ§è½ãä¸ããã¾ãã
ãã ãã¨ã¤ãªã¢ã¹è§£æã¯åæ
å ±ãå©ç¨ãã¦ç²¾åº¦åä¸ãããäºãã§ãã¾ãã®ã§ãéçåä»ãè¨èªãæå©ã§ãã
FFI
å¤é¨é¢æ°ã³ã¼ã«ã®äºã§ãä¾ãã°æ¡å¼µã©ã¤ãã©ãªã®å®ç¾ãªã©ã«ä½¿ç¨ããã¾ãã
ä»ã®è¨èªã§æ¸ãããæ¡å¼µã©ã¤ãã©ãªã¯å¦çç³»ã«ã¨ã£ã¦ãã©ãã¯ããã¯ã¹ã§ããããã§ä½ãè¡ããããåãããªãã®ã§ãå¤é¨é¢æ°ã³ã¼ã«ãè·¨ãã æé©åãã§ããªããªãã¾ãã
ã¦ã¼ã¶ãèªç±ã«æ¡å¼µã©ã¤ãã©ãªãæ¸ãããããªè¨èªã§ã¯ãå°æ¥ã®æé©åãé»å®³ããªãããã«æ¡å¼µã©ã¤ãã©ãªè¨è¨ã«æ³¨æããªããã°ãªãã¾ããã
å帰é¢æ°
ããã°ã©ã ã®å®è¡æéã®8å²ã¯ä¸é¨ã®ã«ã¼ãã®å®è¡æéã§ããã¨ããè¨ããã¾ããå¾ã£ã¦ãã«ã¼ãã®æé©åã¯éè¦ã§ãã
ã«ã¼ãæé©åã®åºæ¬å¯¾è±¡ã¯do-allåã«ã¼ãã§ãã
for (i = 0; i < n; i++) { .... }
do-allåã«ã¼ãã¯å¤æ°iãå«ãå¼ã«å¯¾ãã¦ã·ã³ããªãã¯ãªè§£æãå¯è½ã§ããããã«ããã¢ã¯ã»ã¹ãã¿ã¼ã³ã解æãã¦ãã£ãã·ã¥æé©åãã«ã¼ãä¾åæ¤æ»ããã¦ä¸¦ååãªã©ã®é«åº¦ãªæé©åãå¯è½ã«ãªãã¾ãã
ããããé¢æ°åè¨èªã§ã¯ã«ã¼ããå帰é¢æ°ã§æ¸ãäºãæ¨å¥¨ããæåãããã¾ããå帰é¢æ°ã¯do-allåã«ã¼ãããã表ç¾è½åãè±ãã§ãã代ããã«ãä¸ã®æ§ãªã·ã³ããªãã¯ãªè§£æã¯å°é£ã§ããå帰é¢æ°ã®ã«ã¼ãæ§é ã解æãã¦æé©åããææ³ã§å¤§ããæåãã¦ããææ³ã¯ããã¾ããã
å帰é¢æ°ã®æé©åã§ã¯æ«å°¾å帰æé©åãæåã§ãããããã¯å帰å¼ã³åºããwhileã«ã¼ãã«ããã ãã§ãããdo-allã«ã¼ãã«ããç©ã§ã¯ããã¾ãããå¾ã£ã¦ããã以ä¸ã®æé©åã¯ãã¯ãé£ããã§ãã
æé©åã«æå©ãªè¨èªç¹å¾´
éãèãã¾ãã
éçåä»ã
ããã°ã©ã ã«ã¤ãã¦å¤ãã®äºãåããåããã¾ããããåçåä»ãã«æ¯ã¹æé©åããããã§ãããã¼ã¿ããã¼è§£æã®ç²¾åº¦åä¸ã»éããã¯ã¹åã»åçæç¸ã®é¤å»ã»ã»ã»ãªã©ã
åçåä»ãã®è¨èªã§ãåæ
å ±ã®ã¢ããã¼ã·ã§ã³(LISPãPythonãªã©ã§ãµãã¼ã)ã«ããé«éåãããã¨ãå¯è½ã§ãã
åç §ééæ§
å®å
¨ã«åç
§ééæ§ãªè¨èªã§ã¯ããã¼è§£æã®å¿
è¦æ§ããªããªãã¾ãããã ããHaskellãè¦ãã°ãããããã«å®å
¨ãªåç
§ééæ§ã®ç²å¾ã®çºã®ä»çµã¿ã¯ãªã¼ããããã大ããäºãèæ
®ããå¿
è¦ãããã¨æãã¾ãã
å®å
¨ãªåç
§ééæ§ããªãã¦ããååæé©åã®å½¹ã«ç«ã¡ã¾ããC/C++ã®constãªã©ã®æ示åãåæ§ã§ãã
ã¨ããã§ãåç §ééæ§ãããã¨èªåã¡ã¢åã¨ããæé©åãåºæ¥ãããã¾ãããå®é¨çãªå®è£ ã¯ãããã®ã®å®å ¨ã«èªååãããã¨ã¯é£ããã§ããä¾ãã°è¯ãGHCã¯èªåã¡ã¢åãã£ã¦ãããããªããã¨ããè°è«ãè¦ããã¾ãããã£ã¦ã¾ãããHaskellã§ã¯å ±éé¨åå¼ã®é¤å»ãå¤ããè¦ãã¨ã¡ã¢åã«è¦ããäºãããã¾ãã
åãåããããã¾ã§ãå¾ã§è¿½è¨ããããããã¾ããã