
èšèã§ã¯èšãè¡šããªãã»ã©å¥åº·ãªã®ã¯ãè±candyã®æéã§ããããã¯ãåæã®ã¹ããŒãããã¯ããã³ã³ãã€ã©ã®çè«ãç 究ããæåã®æ®µéã§ãã -ç¬èªã®èšèªã§ã®å®éã®ã¢ããªã±ãŒã·ã§ã³ã èšèªã®äœæè ããã®å¯äžã®ãŠãŒã¶ãŒã§ããå¯èœæ§ããããšããæ²ããèŠéãã§ãããåµé æ§ã®åã³ãäžåããç空äžã®ã³ã³ãã€ã©ã§ããã¯ãªãã³ãæ¢ããããšã¯ã§ããŸããã ãã¡ãããèªåã®èå³ã®æºè¶³ãéèŠã§ããã ãã§ãªããããã»ã¹å šäœã®å¯äžã®åååã§ãããå Žåãäžèšã®èŠç¹ã¯å¿ ç¶çã«å®çŸãããŸãã ãããããããæ°ããèšèªãäœæããå¯äžã®çç±ã§ã¯ãªãå Žåã§ãã圌ã®äœæã®å€ç¬ãªãŠãŒã¶ãŒã«ãªãèŠèŸŒã¿ã¯ãŸã å®çŸããæ©äŒããããŸãã
ã³ã³ãã€ã©ã䜿ã£ãå°èª¬ã®ãã©ã¯ãŒãã£ã³ãã£æ代ãšç§ã®æåã®èšèªã圫å»ããåã³ã¯ãããªãåã«çµãããŸããã ç§ãã¡ã¯ç¥èãªçµå©ã®çµã«ãã£ãŠç§ã®é¢ä¿ãåæ³åãããšèšãããšãã§ããŸãïŒã³ã³ãã€ã©ãŒããããã¬ãŒãéçºããŒã«ã¯Tibboã§ã®ç§ã®äž»èŠãªä»äºã§ããããã¹ãŠã®çµæããããããŸãïŒã¯ãããªããžã§ã¯ãã®é£œåãã«ãŒãã³ã¿ã¹ã¯ã®å²åã®å¢å ãªã©ïŒã eãïŒãããã£ãŠãèªåã®ã¹ã¯ãªããããã°ã©ãã³ã°èšèªãäœæããåæ©ã¯ãèªåã®èå³ã®å¹³å¡ãªæºè¶³ãšã¯ç°ãªããŸããã
ãªãã§ããïŒ
ç§ã®å人çããã³äŒç€ŸãšããŠã®ã¢ãããŒã·ã§ã³ã®å®éçãªåŽé¢ãã§ããã ãç°¡æœã«å®åŒåãããšã次ã®ããã«èãããŸã ãæ§é ãžã®ãã€ã³ã¿ãšå®å šãªã¢ãã¬ã¹èšç®ãåããçµã¿èŸŒã¿ã¹ã¯ãªãããšã³ãžã³ãå¿ èŠã§ããã ããã¯èŠã€ãããŸããã§ããã ãããŠãCäºæã®æ§é ãå®å šãªç®è¡æŒç®ãªã©ãåãããã€ã³ã¿ãŒãåããJancyèšèªïŒãJavaãšCã®éãïŒãäœæããŸããã
ãŠããŒã¯ãªæ©èœ
- å®å šãªãã€ã³ã¿ãŒãšã¢ãã¬ã¹æŒç®ã
- ãœãŒã¹ã³ãŒããšC / C ++ã®äºææ§ã®ã¹ã¯ãªããèšèªã¬ãã«ã§åäŸã®ãªã;
- ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ïŒãªã¢ã¯ãã£ãããã°ã©ãã³ã°ïŒ-åœä»€åèšèªã§ã®æåã®å®è£ ã®1ã€ïŒã©ã€ãã©ãªã®åœ¢åŒã§ã¯ãªãïŒã
- ã¬ã¯ãµãŒ/ã¹ãã£ããŒã®çµã¿èŸŒã¿ãžã§ãã¬ãŒã¿ãŒã
èšèšåå
- Cã«äŒŒãæ§æãæã€ãªããžã§ã¯ãæåèšèªã
- ãã€ããªABIïŒapplication-binary-interfaceïŒãšC / C ++ãšã®äºææ§ã
- æ£ç¢ºãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ããèªåã¡ã¢ãªç®¡çã
- ããã¯ãšã³ããšããŠã®LLVM ã
ãã®ä»ã®éèŠãªæ©èœ
- ãšã©ãŒã³ãŒãã¢ãã«ã«å¯Ÿããæ§æç³è¡£ã®ãããªäŸå€ã
- ããããã£-æãå®å šãªå®è£ ã
- ãã«ããã£ã¹ãïŒãã«ããã£ã¹ãïŒããã³ã€ãã³ãïŒã€ãã³ãïŒïŒåŒ±ããã®ãå«ãïŒããµãã¹ã¯ã©ã€ãã解é€ããå¿ èŠã¯ãããŸããã
- å€éç¶æ¿ã
- å®æ°ã®æ£ç¢ºã;
- RAIIãã©ãã€ã ã®ãµããŒãïŒresource-acquisition-is-initializationïŒ;
- ããŒã«ã«ã¹ã¬ããã¡ã¢ãªïŒã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžïŒã
- é¢æ°ããã³ããããã£ã®éšåçãªã¢ããªã±ãŒã·ã§ã³ã
- ç¹å®ã®ç°å¢ïŒããšãã°ãç®çã®ã¯ãŒã¯ãããŒïŒã§åŒã³åºãããããšãä¿èšŒãããŠããé¢æ°ãžã®ãã€ã³ã¿ãŒãäœæããããã®ã¹ã±ãžã¥ãŒã«æŒç®åã
- ããããã©ã°ã®åæïŒããããã©ã°åæïŒ;
- Perlã®ãããªæååãã©ãŒãããã
䜿çšäŸãšæ©èœã®ããå®å šãªãªã¹ãã¯ãããã§èŠã€ããããšãã§ããŸãïŒ http : //tibbo.com/jancy/features.html
誰ãããã䜿çšã§ããŸããïŒ
ãŸããèªåçšã®èšèªãäœæããŸãããJancyã¯IOå¿è ãããžã§ã¯ãã§çµã¿èŸŒã¿ã¹ã¯ãªããèšèªãšããŠäœ¿çšãããŠããŸãã ãããããããç§ãã¡ã«ãšã£ãŠæçšã§ããããšãå€æããå Žåãç§ãã¡ã¯ãããä»ã®äººãã¡ãå©ãããããããªãããšãæ§ããã«é¡ã£ãŠããŸãã ãã®åžæã¯ãäž»ã«Jancyã®3ã€ã®åŒ·ã¿ã«åºã¥ããŠããŸããJancyã§ã¯ãç§ãã¡ã®èšèªãã¢ããã°ã«æ¯ã¹ãŠçã®å©ç¹ãæã£ãŠããŸãã
1. C / C ++ãšã®é«ãäºææ§
ããã¯ããœãŒã¹ã¬ãã«ã§ã®äºææ§ã ãã§ãªãããââã€ããªABIã®äºææ§ã«ãé©çšãããŸãã å€ãã®ãã©ã¹ããããŸãïŒããã¯ãæ¢åã®Cã©ã€ãã©ãªã®ã·ãŒã ã¬ã¹ãªæ¥ç¶ãã³ããŒããŒã¹ããšãã®åŸã®è¡šé¢çãªå€æŽã䜿çšããCããã³C ++ããã®ã³ãŒãã®ç§»æ€ïŒããã³å Žåã«ãã£ãŠã¯ãŸã£ãããªãïŒãããã³Jancyãã䜿çšããããã®C / C ++ã®æ°ããã©ã€ãã©ãªã®äœæã®å®¹æãã§ãã¹ã¯ãªãããC / C ++ã¢ããªã±ãŒã·ã§ã³ãªã©ã«Jancyãšã³ãžã³ãåã蟌ãå¹çãªã©
2. IOããã°ã©ãã³ã°ã®ããã®äŸ¿å©ãªããŒã«
ããã§ã¯ããŸãããã€ããªããã±ãŒãžã®è§£æãšçæã«çæ³çãªãã€ã³ã¿ãŒãšã¢ãã¬ã¹æŒç®ã®ãµããŒãã«ã€ããŠããããŠæ¬¡ã«ãã¬ã¯ãµãŒãžã§ãã¬ãŒã¿ãŒïŒããã³ã€ã³ã¯ãªã¡ã³ã¿ã«ãã€ãŸãIOã¹ããªãŒã ã®è§£æã«é©çšå¯èœïŒã«ã€ããŠäž»ã«è©±ããŸãæççã«ïŒã ããã«ã¯ãéšåã¢ããªã±ãŒã·ã§ã³ãšèšç»æŒç®åãå«ãŸããŸããããããçµã¿åãããŠãããšãã°ããã£ããã£ãããã³ã³ããã¹ãåŒæ°ã䜿çšããŠå®äºã«ãŒãã³ãäœæã§ããŸãã ãã®å Žåãç®çã®ã¯ãŒã¯ãããŒã§èªåçã«åŒã³åºãããŸãã
3. UIããã°ã©ãã³ã°ã®ããã®äŸ¿å©ãªããŒã«
äºã€ã®èšèïŒ ãªã¢ã¯ãã£ãããã°ã©ãã³ã° ã è¿ãå°æ¥ãèšèªã¬ãã«ãŸãã¯ããªããã»ããµãã©ã€ãã©ãªãªã©ã®æŸèæã®åœ¢ã§ã®åå¿æ§ã®ãµããŒããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒUIïŒãéçºããããã®ã·ã¹ãã ã®äžå¯æ¬ ãªéšåã«ãªããšç¢ºä¿¡ããŠããŸãã Jancyã¯ãç®±ããåºããŠããã«ããããŠå®å šã«çŽèŠ³çãªæ¹æ³ã§åå¿æ§ãæäŸããŸãã Jancyã¯ãåå¿æ§ã«å ããŠãããŸããŸãªçš®é¡ã®ããããã£ãšã€ãã³ãããµããŒãããŠãããçŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¬ãŒã ã¯ãŒã¯ã®æ§ç¯ã«ã圹ç«ã¡ãŸãã
åæã«ããã€ã³ã3ã®åªããæ©èœã«ãããããããJancyããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹éçºèšèªãšããŠäœçœ®ä»ããŠããŸããã çŸæç¹ã§ã®æ倧ã®ã¿ã¹ã¯ã¯ãäœã¬ãã«IOããã°ã©ãã³ã°çšã®ã¹ã¯ãªããèšèªã«ãªãããšã§ãã ã·ã¹ãã /ãããã¯ãŒã¯ããã°ã©ããŒ/ããã«ãŒããŒã« ã
ãããŠä»-ã¹ã©ã€ãïŒ Â©
C / C ++ãšã®ABIäºææ§
äºææ§ã¯åžžã«è¯å¥œã§ãããäºå®äžã®ã·ã¹ãã ããã°ã©ãã³ã°èšèªæšæºãšã®äºææ§ã¯éåžžã«åªããŠããŸãã
Jancyã¹ã¯ãªããã¯JITã§ã³ã³ãã€ã«ãããŠãããC / C ++ããã°ã©ã ããçŽæ¥åŒã³åºããããC / C ++é¢æ°ãçŽæ¥åŒã³åºãããããããšãã§ããŸãã ããã¯ãJancyã¹ã¯ãªãããšC ++ã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿åãšé¢æ°ãããã¿ã€ããé©åã«èšè¿°ããåŸãé¢æ°ã®åŒæ°ãšæ»ãå€ã䜿çšããŠããŒã¿ãèªç¶ã«è»¢éã§ããããã«ãªãããšãæå³ããŸãã
Jancyã¹ã¯ãªããããé¢æ°ã宣èšããŠäœ¿çšããŸãã
bool foo ( char charArg, int intArg, double doubleArg ); bar (int x) { bool result = foo ('a', x, 3.1415); // ... }
å®è£ ãC / C ++ã§èšè¿°ããŸãã
bool foo ( char charArg, int intArg, double doubelArg ) { // ... return true; }
ã¹ã¯ãªããã®JITã³ã³ãã€ã«ã®åã«æ¥ç¶ããŸãã
class MyLib: public jnc::StdLib { public: JNC_BEGIN_LIB () JNC_FUNCTION ("foo", foo) JNC_LIB (jnc::StdLib) JNC_END_LIB () }; // ... MyLib::mapFunctions (&module);
ã§ããïŒ ããªã¢ã³ãã®ãããªã³ã³ããã®ããã±ãŒãžå/ã¢ã³ããã¯ãä»®æ³ãã·ã³ã¹ã¿ãã¯ãžã®åŒæ°ã®æ瀺çãªããã·ã¥ãªã©ã¯ãããŸããã -ãã¹ãŠãçŽæ¥æ©èœããŸãã çŸåšãJancyã¯ãã¹ãŠã®äž»èŠãªåŒã³åºãã¢ãã«ïŒåŒã³åºãèŠåïŒããµããŒãããŠããŸãã
- cdeclïŒMicrosoft / gccïŒ
- stdcallïŒMicrosoft / gccïŒ
- Microsoft x64
- ã·ã¹ãã v
å察ã®æ¹å-C ++ããJancyãåŒã³åºãã®ã¯ç°¡åã§ãïŒ
typedef void Bar (int); Bar* bar = (Bar*) module.getFunctionByName ("bar")->getMachineCode (); bar (100);
ã·ã¹ãã é¢æ°ãšåçã©ã€ãã©ãªïŒdll / soïŒã®åŒã³åºãã¯ã©ãã§ããïŒ è³ªåãªãïŒ Jancyã¯ãåçã©ã€ãã©ãªãšã®ã·ãŒã ã¬ã¹ãªçµ±åãæäŸããŸãã
library User32 { int stdcall MessageBoxA ( intptr hwnd, char const thin* text, char const thin* caption, int flags ); // ... } // ... User32 user32; user32.load ("user32.dll"); user32.lib.MessageBoxA (0, "Message Text", "Message Caption", 0x00000040);
ãã®å ŽåãèŠæ±ãè¡ããããšãã«åå解決ãå®è¡ãããèŠã€ãã£ãã¢ãã¬ã¹ããã£ãã·ã¥ãããŸãïŒã¢ãžã¥ãŒã«èªäœã®æ瀺çãªããŒãçšã«èª¿æŽãããDELAYLOADãæãåºãããŸãïŒã ååã®ããŒãããã³è§£æ±ºæã®ãšã©ãŒåŠçã¯ãJancyã®æšæºã®æ¬äŒŒäŸå€ã¡ãœããã«ãã£ãŠå®è¡ãããŸãïŒè©³çŽ°ã«ã€ããŠã¯ã次ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããïŒã
ãã¡ãããååã«ããåçæ€çŽ¢ïŒGetProcAddress / dlsymïŒãå¯èœã§ã-以åã®ã¢ãããŒãã»ã©ãšã¬ã¬ã³ãã§ã¯ãããŸãããã
äŸ
typedef int cdecl Printf ( char const thin* format, ... ); jnc.Library msvcrt; msvcrt.load ("msvcrt.dll"); Printf thin* printf; unsafe { printf = (Printf thin*) msvcrt.getFunction ("printf"); } printf ("function 'printf' is found at 0x%p\n", printf);
JancyãšC / C ++éã®é«åºŠãªäºææ§ã®ãã1ã€ã®éèŠãªçµæã¯ããããªãã¯ãœãŒã¹ïŒLinuxãReact OSããŸãã¯ä»ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããªã©ïŒããã³ããŒããCã®éä¿¡ãããã³ã«ã®ããããŒã®å®çŸ©ã䜿çšã§ããããšã§ãã
enum IpProtocol: uint8_t { Icmp = 1, Tcp = 6, Udp = 17, } struct IpHdr { uint8_t m_headerLength : 4; uint8_t m_version : 4; uint8_t m_typeOfService; bigendian uint16_t m_totalLength; uint16_t m_identification; uint16_t m_flags; uint8_t m_timeToLive; IpProtocol m_protocol; bigendian uint16_t m_headerChecksum; uint32_t m_srcAddress; uint32_t m_dstAddress; }
ãšããã§ãéãã€ãé ã®æŽæ°åïŒããã°ãšã³ãã£ã¢ã³ïŒã®ãµããŒãã«æ³šæããŠãã ããã ãã¡ãããããã¯å€§èŠæš¡ãªã€ãããŒã·ã§ã³ãšã¯ã»ã©é ããã®ã§ããã説æãå€§å¹ ã«ç°¡çŽ åãããããã¯ãŒã¯ãããã³ã«ã®ããããŒãæäœããŸããããã§ã¯ããã€ãã®éé ãã©ãã«ã§ããããŸãã
ç䌌äŸå€
é説çã«ãABIãšC / C ++ãšã®äºææ§ã®çµæã®1ã€ã¯ãC ++ããã°ã©ããŒã«éŠŽæã¿ã®ããäŸå€ã¢ãã«ã®æåŠã§ããã å®éããã®ãããªäŸå€ã¯å€èšèªã³ãŒã«ã¹ã¿ãã¯ã«ã¯å®å šã«äžé©åã§ãïŒãã¡ãããC ++ã«å¯Ÿãã客芳çãªäž»åŒµã®ãªã¹ãã¯ãã®ãããªäŸå€ã«éå®ãããŸããã onlyæã®ã¿ïŒã
ãããã«ããŠããJancyã¯ãã€ããªããã¢ãã«ã䜿çšããŸãã æ»ãå€ã®ãã§ãã¯ã«åºã¥ããŠããŸãããã³ã³ãã€ã©ãŒã¯ãããæåã§è¡ãå¿ èŠããªãããŸãã æçµçã«ããã¹ãŠãC ++ãŸãã¯Javaã®äŸå€ã®ããã«èŠããŸãããåæã«ããšã©ãŒã«å¯Ÿããããã°ã©ã ã®åäœã¯ã¯ããã«ééçã§äºæž¬å¯èœã§ããå¯èœãªéãã
bool foo (int a) throws { if (a < -100 || a > 200) // invalid argument { jnc.setStringError ("detailed-description-of-error"); return false; } // ... return true; }
throws修食åã§ããŒã¯ãããé¢æ°ã®æ»ãå€ã¯ããšã©ãŒã³ãŒããšããŠæ±ãããŸãã Jancyã¯ãæšæºåã®çŽæçãªãšã©ãŒæ¡ä»¶ãåãå ¥ããŸããããŒã«åã®å Žåã¯falseããã€ã³ã¿ãŒã®å Žåã¯nullã笊å·ãªãæŽæ°ã®å Žåã¯-1ã笊å·ä»ãæŽæ°ã®å Žåã¯<0ã§ãã æ®ãã®åã¯ããŒã«å€ã«å€æãããŸãïŒãããäžå¯èœãªå Žåãã³ã³ãã€ã«ãšã©ãŒãã¹ããŒãããŸãïŒã æããã«ããã®ã¢ãã«ã§voidãè¿ãé¢æ°ã¯ãšã©ãŒãè¿ãããšã¯ã§ããŸããã
ããã«ããã®ã¢ãã«ã§ã¯ãéçºè ã¯ããããã®ã±ãŒã¹ã§ãšã©ãŒãåŠçããæ¹æ³ãèªç±ã«éžæã§ããŸãã æ»ãã³ãŒããæåã§ç¢ºèªããããšã§ãããè¡ãæ¹ã䟿å©ãªå Žåãããã°ãäŸå€ã®ã»ãã³ãã£ã¯ã¹ã䜿çšã§ããå ŽåããããŸãã Jancyã§-åãé¢æ°ãåŒã³åºããšãïŒ -ç¶æ³ã«å¿ããŠãããè¡ãããšãã§ããŸãã
bar () { foo (10); // can use exception semantics... foo (-20); catch: printf ($"error caught: $(jnc.getLastError ().m_description)\n"); // handle error } baz (int x) { bool result = try foo (x); // ...or manual error-code check if (!result) { printf ($"error: $(jnc.getLastError ().m_description)\n"); // handle error } }
ã»ãšãã©ã®èšèªã®æçµçãªæ§æã¯ãäŒçµ±çã«äŸå€ã«é¢é£ä»ããããŠããŸãã ããããJancyã§ã¯ãéçºè ã®èŠæ±ã«å¿ããŠæçµçã«ä»»æã®ãããã¯ã«è¿œå ã§ããŸãã æåŸã«ããšã©ãŒãçºçããŠããªããŠãã¯ãªãŒã³ã¢ããããå¿ èŠããããŸããïŒ
foo () { // nothing to do with exceptions here, just a 'finally' block to clean up finally: printf ("foo () finalization\n"); }
ãã¡ãããäŸå€ããŸã äºæ³ãããå Žåã«ã¯ãfinallyã³ã³ã¹ãã©ã¯ãã®ããäŒçµ±çãªäœ¿çšãèš±å¯ãããŸãã
äŸ
foo (char const* address) { try { open (address); transact (1); transact (2); transact (3); catch: addErrorToLog (jnc.getLastError ()); finally: close (); } }
å®å šãªãã€ã³ã¿ãšã¢ãã¬ã¹æŒç®
ã¹ã¯ãªããèšèªã®ã¢ãã¬ã¹æŒç®ã¯ããã¹ãŠãå®éã«éå§ããããã®ã§ãã
ãã€ã³ã¿ãŒã¯ããã®åºæã®ãã¹ãŠã®äžå®å®ããšãšãã«ãæ瀺çãŸãã¯æé»çã«ããããèšèªã®äžéšã§ãã éçºè ã䜿çšã§ãããã€ã³ã¿ãŒã®ã¿ã€ããšãããã䜿çšããæäœãå¶éããããšã«ãããèšèªãå€§å¹ ã«ä¿è·ããå®è¡äžã®äžéœåãªç¶æ³ã®åŠçãç°¡çŽ åããéçåæã䜿çšããŠã³ã³ãã€ã«æã«èª€ã£ãæäœããã£ããããããšãã§ããŸãã ããããã¢ãã¬ã¹æŒç®ãæ©èœããããã«ãªããšãåæãã³ã³ãã€ã«æ®µéã«å®å šã«ç§»è¡ããããšã¯äžå¯èœã«ãªããŸãã
æäœã®æ£ç¢ºæ§ãåžžã«ç¢ºèªã§ããããã«ãããããJancyã®ãã€ã³ã¿ãŒã¯ããã©ã«ãã§å€ªããªã£ãŠããŸãã ã¢ãã¬ã¹ã«å ããŠãããªããŒã¿ãŒãå«ãŸããŸããããã¯ãã¢ãã¬ã¹ã®èš±å®¹ç¯å²ãããŒã¿ã®ã¿ã€ããããã³æŽæ°ã®ãã¹ãã¬ãã«ïŒã¹ã³ãŒãã¬ãã«ïŒã«é¢ããæ å ±ãååŸã§ããç¹å¥ãªã¡ã¿ããŒã¿æ§é ã§ãã
Jancyã®ãã€ã³ã¿ãŒãšã¢ãã¬ã¹æŒç®ã®å®å šå ¬åŒã¯æ¬¡ã®ãšããã§ãã
- ãã€ã³ã¿ãŒãžã®éæ¥ã¢ã¯ã»ã¹ã®ç¯å²ã確èªããŸãã
- ãã€ã³ã¿ãŒãå²ãåœãŠããšãã«ãã¹ãã®ã¬ãã«ã確èªããŸãã
- ãã€ã³ã¿ãŒå²ãåœãŠã®éå æ§ãã¹ãã
ããããããã©ãŒãã³ã¹ã¯ã©ãã§ããïŒ
ãã®ã¡ã«ããºã ã¯ç¡æã§ã¯ãªããå®éã«ã¯å®è¡äžã®ç¹å®ã®ãªãŒããŒãããã«å€æãããŸãã
ããããæåã«ãæé©åãªãã®æãåçŽãªããŒãžã§ã³ã§ããç¯å²ããã§ãã¯ããããã®2ã€ã®æŽæ°æ¯èŒãŸãã¯ãã¹ãã®ã¬ãã«ããã§ãã¯ããããã®1ã€ã®æ¯èŒã¯ãç¹ã«JITã³ã³ãã€ã«ãšJancyãŸã ã¹ã¯ãªããèšèªã§ãã
第äºã«ãå°æ¥çã«ã¯ãéçåæã䜿çšããŠãã³ã³ãã€ã«æ®µéã§å€ãã®äžèŠãªãã§ãã¯ãåãé€ãããšãã§ããããã«ãªããŸãã ãããŠç¬¬äžã«ãããªããŒã¿ãŒã®ãªãå®ââå šã§ãªãïŒçŽ°ãïŒãã€ã³ã¿ãŒã¯ãããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã§æ¢ã«äœ¿çšã§ããŸã-现ããã€ã³ã¿ãŒã§ã®æäœäžã¯ãã§ãã¯ãå®è¡ãããŸããã
ããããæåã«ãæé©åãªãã®æãåçŽãªããŒãžã§ã³ã§ããç¯å²ããã§ãã¯ããããã®2ã€ã®æŽæ°æ¯èŒãŸãã¯ãã¹ãã®ã¬ãã«ããã§ãã¯ããããã®1ã€ã®æ¯èŒã¯ãç¹ã«JITã³ã³ãã€ã«ãšJancyãŸã ã¹ã¯ãªããèšèªã§ãã
第äºã«ãå°æ¥çã«ã¯ãéçåæã䜿çšããŠãã³ã³ãã€ã«æ®µéã§å€ãã®äžèŠãªãã§ãã¯ãåãé€ãããšãã§ããããã«ãªããŸãã ãããŠç¬¬äžã«ãããªããŒã¿ãŒã®ãªãå®ââå šã§ãªãïŒçŽ°ãïŒãã€ã³ã¿ãŒã¯ãããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã§æ¢ã«äœ¿çšã§ããŸã-现ããã€ã³ã¿ãŒã§ã®æäœäžã¯ãã§ãã¯ãå®è¡ãããŸããã
æå¹ãªã¢ãã¬ã¹ç¯å²ãã§ãã¯ã¯ããã€ã³ã¿ãŒãæ瀺çã«äœ¿çšããå Žåãšãã€ã³ããã¯ã¹æŒç®åã®å Žåã®äž¡æ¹ã§å®è¡ãããŸãã
foo ( char* p, size_t i ) { p += i; *p = 10; // <-- range is checked static int a [] = { 10, 20, 30 }; int x = a [i]; // <-- range is checked }
ã¹ã¿ãã¯å€æ°ãšã¹ããªãŒã å€æ°ãžã®ãã€ã³ã¿ã®å Žåããã¹ãã¬ãã«ã®ãã§ãã¯ãå¿ èŠã§ã-寿åœã®å¢çãè¶ ããŠã¢ãã¬ã¹ãæŒæŽ©ããã®ãé²ãããã ãã®ã¡ã«ããºã ã¯ãæ§é äœãžã®ãã€ã³ã¿ãŒããæ§é äœãžã®ãã€ã³ã¿ãŒãªã©ããã«ãã¬ãã«ãã€ã³ã¿ãŒã®å Žåã§ãæ©èœããŸãã
int* g_p; bar ( int** dst, int* src ) { *dst = src; // <-- scope level is checked } baz () { int x; bar (g_p, &x); // <-- runtime error: scope level mismatch }
æåŸã«ãéå æ§ãã§ãã¯ã¯ãããªããŒã¿èªäœã®ç Žå£ãé²ãããã«èšèšãããŠããŸãã 確ãã«ããã€ã³ã¿ãŒãžã®ãã€ã³ã¿ãŒãäœæããcharãžã®ãã€ã³ã¿ãŒã«æã£ãŠããŠããã€ãããšã«ãããªããŒã¿ãŒãã¬ããŒãžã§äžæžããããšã©ããªããŸããïŒ Jancyã¯ãããèš±å¯ããŸãããã³ã³ãã€ã©ãšã©ã³ã¿ã€ã ã¯ãå®å šãªå Žæã§ã®ã¿ãã£ã¹ããèš±å¯ããŸãã
詳现
Jancyã¯ããã¹ãŠã®ã¿ã€ããPODïŒplain-old-dataïŒãšéPODã®ã«ããŽãªãŒã«åé¡ããŸãã Jancyã®PODã®æŠå¿µã¯ãC ++ã®æŠå¿µãšã¯å€å°ç°ãªããŸãã ããããããã«é¢é£ããŠãæ··ä¹±ãé¿ããããã«æ°ããçšèªãèæ¡ãã䟡å€ããããŸããããæçµçã«ã¯æ°ããåæžãè¡ããªãããšã«ããŸããã ããã«ãJancyã®PODã¯ããplain-old-dataãã®æŠå¿µã®æå³ãããæ£ç¢ºã«åæ ããŠããããã«æããŸãã
Jancyã§ã¯ãPODã¯ã¡ã¿ããŒã¿ã®ãªãããŒã¿ã§ãã ãããã¯ãäœãå£ããã«ãã€ãåäœã§å®å šã«ã³ããŒããã³å€æŽã§ããŸãã ãã£ãŒã«ããç¶æ¿ïŒããã§ã¯C ++ãšã¯ç°ãªããŸãïŒããŸãã¯é åãžã®çµåãå«ãPODããŒã¿ã®éçŽãPODã«ã€ãªãããŸãã ã¡ã¿ããŒã¿ãã€ãŸãã¯ã©ã¹ãããŒã¿ãžã®å®å šãªãã€ã³ã¿ãŒãããã³ãããã®éåäœãå«ããã¹ãŠã®ãã®ã¯éPODã§ãã
Jancyã³ã³ãã€ã©ãŒã¯ããã£ã¹ãã£ã³ã°ãã¡ã¿ããŒã¿ãç Žæ£ãŸãã¯çœ®æããæ©äŒãäžããªãå Žåã«ã®ã¿ãéPODåã®ãã£ã¹ãã£ã³ã°ãèš±å¯ããŸãã ã³ã³ãã€ã«æ®µéã§ãããäžæãªç¶æ³ïŒããšãã°ãããŠã³ãã£ã¹ããšåŒã°ããååã«ãã£ã¹ãããïŒã«ã¯ãç¹å¥ãªåçãã£ã¹ãæŒç®åããããŸãã åçãã£ã¹ãæŒç®åã¯ãèŠæ±ãããåãžã®ãã€ã³ã¿ãŒãè¿ãçµã¿èŸŒã¿é¢æ°ã®åŒã³åºãã«ã³ã³ãã€ã«ãããŸãããã£ã¹ããäžå¯èœãªå Žåã¯nullãè¿ããŸãã
ããšãã°ãäºãã«ãã£ã¹ããããã¹ãã¿ã€ããæºåããŸãã
ããã§ãAãBãCã¯PODã§ãïŒC ++ã§ã¯æåŸã®ã¿ã€ãã¯PODã§ã¯ãããŸããïŒãDã¯PODã§ã¯ãããŸããã ãã®ã¿ã€ãã«ã¯ãm_sãã€ã³ã¿ãŒæ€èšŒã®åœ¢åŒã®ã¡ã¿ããŒã¿ãå«ãŸããŸãã 次ã«ãå¯èœãªãã£ã¹ãæäœãæ€èšããŸãã
芪ã¿ã€ããžã®ãã£ã¹ãïŒã¢ãããã£ã¹ãïŒã¯åžžã«èš±å¯ãããPODãŸãã¯éPODã®ããããã«æ瀺çãªãã£ã¹ãæŒç®åãå¿ èŠãšããŸããã
PODã¿ã€ãã¯ããã£ã¹ãæŒç®åã䜿çšããŠäºãã«ä»»æã«ãã£ã¹ãã§ããŸãã
PODåããéPODåãžã®ãã£ã¹ãã¯ãçµæã®å®æ°ãã€ã³ã¿ãŒã®å Žåã«ã®ã¿èš±å¯ãããŸãã
åçãã£ã¹ãæŒç®åã䜿çšããŠãåã¿ã€ããžã®ãã£ã¹ãïŒããŠã³ãã£ã¹ãïŒãå¯èœã§ãã
åçãªãã£ã¹ãã¯ããã€ã³ã¿ãŒã«å«ãŸããããªããŒã¿ãŒããããã£ãŠåæ å ±ã®ãããã§å¯èœã§ãã åçãªãã£ã¹ãã«å ããŠãJancyã¯åçãªãµã€ãºå€æŽæäœãæäŸããŸããããã¯åãããªããŒã¿ãŒããã¢ã¯ã»ã¹å¯èœã§ã-ããã¯ãã€ã³ã¿ãŒã®å®å šæ§ãšã¯é¢ä¿ãããŸããããç¹å®ã®ç¶æ³ã§ã¯éåžžã«äŸ¿å©ã§ãã
Jancyã§ã¯ãPODã¯ã¡ã¿ããŒã¿ã®ãªãããŒã¿ã§ãã ãããã¯ãäœãå£ããã«ãã€ãåäœã§å®å šã«ã³ããŒããã³å€æŽã§ããŸãã ãã£ãŒã«ããç¶æ¿ïŒããã§ã¯C ++ãšã¯ç°ãªããŸãïŒããŸãã¯é åãžã®çµåãå«ãPODããŒã¿ã®éçŽãPODã«ã€ãªãããŸãã ã¡ã¿ããŒã¿ãã€ãŸãã¯ã©ã¹ãããŒã¿ãžã®å®å šãªãã€ã³ã¿ãŒãããã³ãããã®éåäœãå«ããã¹ãŠã®ãã®ã¯éPODã§ãã
Jancyã³ã³ãã€ã©ãŒã¯ããã£ã¹ãã£ã³ã°ãã¡ã¿ããŒã¿ãç Žæ£ãŸãã¯çœ®æããæ©äŒãäžããªãå Žåã«ã®ã¿ãéPODåã®ãã£ã¹ãã£ã³ã°ãèš±å¯ããŸãã ã³ã³ãã€ã«æ®µéã§ãããäžæãªç¶æ³ïŒããšãã°ãããŠã³ãã£ã¹ããšåŒã°ããååã«ãã£ã¹ãããïŒã«ã¯ãç¹å¥ãªåçãã£ã¹ãæŒç®åããããŸãã åçãã£ã¹ãæŒç®åã¯ãèŠæ±ãããåãžã®ãã€ã³ã¿ãŒãè¿ãçµã¿èŸŒã¿é¢æ°ã®åŒã³åºãã«ã³ã³ãã€ã«ãããŸãããã£ã¹ããäžå¯èœãªå Žåã¯nullãè¿ããŸãã
ããšãã°ãäºãã«ãã£ã¹ããããã¹ãã¿ã€ããæºåããŸãã
struct A { int m_a; } struct B { int m_b; } struct C: A, B { int m_c; } struct D: C { char const* m_s; }
ããã§ãAãBãCã¯PODã§ãïŒC ++ã§ã¯æåŸã®ã¿ã€ãã¯PODã§ã¯ãããŸããïŒãDã¯PODã§ã¯ãããŸããã ãã®ã¿ã€ãã«ã¯ãm_sãã€ã³ã¿ãŒæ€èšŒã®åœ¢åŒã®ã¡ã¿ããŒã¿ãå«ãŸããŸãã 次ã«ãå¯èœãªãã£ã¹ãæäœãæ€èšããŸãã
芪ã¿ã€ããžã®ãã£ã¹ãïŒã¢ãããã£ã¹ãïŒã¯åžžã«èš±å¯ãããPODãŸãã¯éPODã®ããããã«æ瀺çãªãã£ã¹ãæŒç®åãå¿ èŠãšããŸããã
foo (D* d) { C* c = d; A* a = ; }
PODã¿ã€ãã¯ããã£ã¹ãæŒç®åã䜿çšããŠäºãã«ä»»æã«ãã£ã¹ãã§ããŸãã
bar (B* b) { char* p = (char*) b; C* c = (C*) b; // <-- unlike C++ no pointer shift }
PODåããéPODåãžã®ãã£ã¹ãã¯ãçµæã®å®æ°ãã€ã³ã¿ãŒã®å Žåã«ã®ã¿èš±å¯ãããŸãã
foo (D* d) { char* p = (char*) d; <-- error char const* p2 = (char const*) d; // OK }
åçãã£ã¹ãæŒç®åã䜿çšããŠãåã¿ã€ããžã®ãã£ã¹ãïŒããŠã³ãã£ã¹ãïŒãå¯èœã§ãã
bar (B* b) { D* d = dynamic (D*) b; A* a = dynamic (A*) b; // not a downcast, but still OK }
åçãªãã£ã¹ãã¯ããã€ã³ã¿ãŒã«å«ãŸããããªããŒã¿ãŒããããã£ãŠåæ å ±ã®ãããã§å¯èœã§ãã åçãªãã£ã¹ãã«å ããŠãJancyã¯åçãªãµã€ãºå€æŽæäœãæäŸããŸããããã¯åãããªããŒã¿ãŒããã¢ã¯ã»ã¹å¯èœã§ã-ããã¯ãã€ã³ã¿ãŒã®å®å šæ§ãšã¯é¢ä¿ãããŸããããç¹å®ã®ç¶æ³ã§ã¯éåžžã«äŸ¿å©ã§ãã
foo (int* p) { size_t size = dynamic sizeof (*p); size_t count = dynamic countof (*p); } //... bar () { int a [100]; foo (a); }
芪æãªãhabrovchanieãç§ãã¡ã®ãªã³ã©ã€ã³ã³ã³ãã€ã©ãè©ŠããŠã¿ãŠãå®éã«ãã¹ãŠãã©ã®ããã«æ©èœãããããã¹ãããŠãã ããïŒèªãã§ãã ããïŒã³ã³ãã€ã©ã§ããã³ããããã€ã³ã¿ãåãããµã³ãã«ã¹ã¯ãªãããè©ŠããŸãããïŒ
Jancyãã€ã³ã¿ãŒã®è©³çŽ°ã«ã€ããŠã¯ã http ïŒ//tibbo.com/jancy/features/pointers.htmlãã芧ãã ããã
èªåæ©èœ
å®å šãªãã€ã³ã¿ãšã¢ãã¬ã¹æŒç®ã¯ããã€ããªããã±ãŒãžã®è§£æãšçæã«æé©ã§ãã
dissectEthernet (void const* p) { io.EthernetHdr const* hdr = (io.EthernetHdr const*) p; switch (hdr.m_type) { case io.EthernetType.Ip: dissectIp (hdr + 1); break; case io.EthernetType.Ip6: dissectIp6 (hdr + 1); break; case io.EthernetType.Arp: dissectArp (hdr + 1); break; // ... } }
ããããå¥ã®ã¯ã©ã¹ã®ãããã³ã«ããããŸãããã€ããªããããŒã«äŸåããã代ããã«äœããã®çš®é¡ã®èŠæ±/å¿çèšèªã䜿çšãããããã³ã«ã§ãã ãã®å ŽåãIOãããŒã®åæã®ããã«ããã®èšèªã®ããŒãµãŒãäœæããå¿ èŠããããŸãã åæã«ãäºåã®ããŒã¿ãããã¡ãªã³ã°ã«æ³šæããå¿ èŠããããŸããå€ãã®å Žåããã©ã³ã¹ããŒããã¡ãã»ãŒãžãåå²ããŠéä¿¡ããã®ã§ã¯ãªããå šäœãéä¿¡ãããšããä¿èšŒã¯ãããŸããã
ãã®ã¿ã¹ã¯ã¯IOããã°ã©ãã³ã°ã§ã¯äžè¬çã§ãããããJancyã¯ããã解決ããçµã¿èŸŒã¿ããŒã«ãæäŸããŠããŸãã Jancyã®èªåæ©èœã¯ãããŒãµãŒãäœæããæåã®æãæ¥åžžçãªæ®µéïŒã¬ã¯ãµãŒ/ã¹ãã£ããŒã®äœæïŒã容æã«ããããã«èšèšãããŠããŸãã ããã¯ã Lex ã Flex ã Ragelãªã©ã®æåãªLexerãžã§ãã¬ãŒã¿ã®åçã§åäœããŸãïŒ
jnc.AutomatonResult automaton scanRx (jnc.Recognizer* recognizer) { %% "getOption" createToken (Token.GetOption); %% "setOption" createToken (Token.SetOption); %% "exit" createToken (Token.Exit); %% [_\w][_\w\d]* createToken (Token.Identifier, recognizer.m_lexeme); // ... }
ãªãŒãããã³é¢æ°å ã«ã¯ãèªèå¯èœãªããŒã¯ã³ã®ãªã¹ããæ£èŠè¡šçŸã®åœ¢åŒã§èšè¿°ãããŠããŸãã åããŒã¯ã³ã®èª¬æã®åŸãå ¥åã¹ããªãŒã ã§æ€åºããããšãã«å®è¡ããå¿ èŠãããã³ãŒããããã¯ãç¶ããŸãã ãã®ãããã³å šäœãããŒãã«DFAã«ã³ã³ãã€ã«ããããã®ç¶æ ã¯å€éšjnc.Recognizerãªããžã§ã¯ãã«ä¿åãããŸãïŒãã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã¯èªèãšã³ãžã³ã®åŒæ°ã§æž¡ãããŸãïŒã æœåšçãªããŒã¯ã³ã®ã·ã³ãã«ããã®äžã«èç©ãããæé»çã«èªåé¢æ°ãåŒã³åºããŠãç¶æ éã®å¿ èŠãªé·ç§»ãå®è¡ããŸãã
ãªãŒãããã³é¢æ°ãšãã®å¶åŸ¡ãªããžã§ã¯ãèªèæ©èœã®å šäœãã¬ã¯ãµãŒã§ãã åæã«ããã®ã¬ã¯ãµãŒã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ã«ãªããŸããã€ãŸããéšåçã«å°çããã¡ãã»ãŒãžã解æã§ããŸãã
jnc.Recognizer recognizer (scanRx); // create recognizer object try { recognizer.write ("ge"); recognizer.write ("tOp"); recognizer.write ("tion"); recognizer.eof (); // notify recognizer about eof (this can trigger actions or errors) catch: // handle recognition error }
Ragelã®å Žåãšåæ§ã«ãç°ãªãèªåæ©èœãåãæ¿ããããšãã§ããŸããããã«ãããç¹ã«ç¶æ³äŸåããŒã¯ãŒããäœæã§ããŸãïŒãŸãã¯ãå¥ã®èšãæ¹ããããšãå€èšèªå ¥åã解æã§ããŸãïŒã
äŸ
jnc.AutomatonResult automaton scanGlobal (jnc.Recognizer* recognizer) { %% '#' recognizer.m_automatonFunc = scanPreprocessor; // switch to pp-specific keywords // ... } jnc.AutomatonResult automaton scanPreprocessor (jnc.Recognizer* recognizer) { %% "if" createToken (Token.If); %% "ifdef" createToken (Token.Ifdef); // ... %% '\n' recognizer.m_automatonFunc = scanGlobal; // switch back }
ãªãŒããã¿ã¯äžæ¹ã§æ©èœããä»æ¹ã§ã¯ã¢ãã¬ã¹æŒç®ãåããå®å šãªãã€ã³ã¿ã«ãããããããã¿ã€ãã®ãããã³ã«ããã³IOã¹ããªãŒã ãç°¡åã«è§£æã§ããŸãã
ãããã«
çŸæç¹ã§ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒUIïŒã®ããã°ã©ãã³ã°ã¯Jancyã®äž»ãªç®çã§ã¯ãªããšããäºå®ã«ãããããããJancyã䜿çšãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ãžã®ã¢ãããŒããå®èšŒããããšèããŠããŸãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã§éå§ã ããã«ã€ããŠã®è©±ã¯ã次ã®èšäºã§èª¬æããŸãã
ãããŸã§ã®éã ã©ã€ãã³ã³ãã€ã©ã®ãã¢ããŒãžã§Jancyèšèªã®å¯èœæ§ïŒãã®èšäºãä»ã®å€ãã®èšäºã§èª¬æïŒãè©ŠããŠã¿ãŠãã ããã ãŸããJancy JITã³ã³ãã€ã©ã©ã€ãã©ãªãšãã®äœ¿çšäŸãããŠã³ããŒãããã«ããããã³ãã¬ã€ããããšãã§ããŸãããããã¯ãã¹ãŠã ããŠã³ããŒãããŒãžã§å ¥æã§ããŸãã