ããããAlex CorradoãAndrea Gaitãããã³Zoltan Vargã®ä»äºã®ãããã§ãããã¯ããã«å€ãããŸãã
èŠããã«ãæ°ãããã¯ãããžãŒã«ãããCïŒ/ã
- CïŒãŸãã¯ãã®ä»ã®.NETèšèªã®C ++ã¯ã©ã¹ãç°¡åãã€ééçã«äœ¿çšãã
- CããC ++ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãïŒ
- CïŒã³ãŒãããC ++ã¯ã©ã¹ã¡ãœãããåŒã³åºã
- CïŒã³ãŒãããã€ã³ã©ã€ã³C ++ã¡ãœãããåŒã³åºããŸãïŒã©ã€ãã©ãªã-fkeep-inline-functionsãã©ã°ã§ã³ã³ãã€ã«ãããŠããå ŽåããŸãã¯å®è£ ã§è¿œå ã®ã©ã€ãã©ãªãã³ã³ãã€ã«ããå ŽåïŒ
- CããC ++ã¯ã©ã¹ãç¶æ¿ããïŒ
- CïŒã¡ãœããã§C ++ã¯ã©ã¹ä»®æ³ã¡ãœããããªãŒããŒã©ã€ããã
- ãã®ãããªæ··åC ++ / CïŒã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãCïŒããã³C ++ã³ãŒãã®äž¡æ¹ã§äœ¿çšãã
CXXIïŒ ãããTransl ãïŒãã»ã¯ã·ãŒããšèªã¿ãŸãïŒã¯ãMonoãšC ++ã³ãŒãã®çžäºäœçšãæ¹åããããã«ãGoogleã®Summer of Codeã®åŸæŽã®äžã§2ãæéäœæ¥ããçµæã§ãã
代æ¿æ¡
Monoã«ã¯ãäž»ã«ECMAæšæºããç¶æ¿ãããã.NET以å€ã®èšèªã®ã³ãŒããšããåãããããã®ã¡ã«ããºã ãããã€ãçšæãããŠããããšãæãåºããŠãã ããã ãããã®ã¡ã«ããºã ã¯æ¬¡ã®ãšããã§ãã
- ãããŒãžã³ãŒãïŒCïŒïŒãã¢ã³ãããŒãžã©ã€ãã©ãªããé¢æ°ãåŒã³åºãããããã®ã©ã€ãã©ãªã®ã³ãŒãããããŒãžã³ãŒãã«ã³ãŒã«ããã¯ã§ããããã«ãããåæ¹åãã©ãããã©ãŒã åŒã³åºãïŒP /åŒã³åºãïŒãã¯ãããžã
- COM Interopã«ãããMonoã§å®è¡ãããŠããã³ãŒãã¯ããã®ã³ãŒããããã€ãã®COMèŠåã«æºæ ããŠããéããã¢ã³ãããŒãžãCãŸãã¯C ++ã³ãŒããééçã«åŒã³åºãããšãã§ããŸãïŒãããã®èŠåã¯éåžžã«ç°¡åã§ãïŒæšæºvtableããŒã¯ã¢ãããAddãReleaseããã³QueryInterfaceã¡ãœããã®å®è£ ã MonoãšCOMã©ã€ãã©ãªã®éã§ããŒã·ã£ãªã³ã°ã§ããæšæºã®ã¿ã€ãã»ããïŒã
- åŒã³åºããååããããã®äžè¬çãªæè¡ ãããã«ããããªããžã§ã¯ãã®ã¡ãœãããžã®åŒã³åºããååããããã«ãããã©ãåŠçããããç¬ç«ããŠç解ããããšãã§ããŸãã
ããããCïŒã§C ++ãªããžã§ã¯ãã䜿çšããå Žåããã®éžæã¯ããŸãæåŸ ã§ããŸããã ããšãã°ãCïŒãã次ã®C ++ã¯ã©ã¹ã䜿çšãããšããŸãã
class MessageLogger { public: MessageLogger (const char *domain); void LogMessage (const char *msg); }
ãã®ã¯ã©ã¹ãCïŒã³ãŒãã«æäŸãã1ã€ã®æ¹æ³ã¯ãCOMãªããžã§ã¯ãã§ã©ããããããšã§ãã ããã¯äžéšã®é«ã¬ãã«ãªããžã§ã¯ãã§æ©èœããå ŽåããããŸãããã©ããã³ã°ããã»ã¹ã¯éåžžã«é¢åã§æ¥åžžçãªäœæ¥ã§ãã ãã®é¢çœããªãã¢ã¯ãã£ããã£ãããã«ã©ã®ããã«èŠããããèŠãããšãã§ããŸã ã
ãã1ã€ã®ãªãã·ã§ã³ã¯ãP / Invokeãä»ããŠåŒã³åºãããšãã§ããã¢ããã¿ãŒããªãããããããšã§ãã äžèšã®ã¯ã©ã¹ã®å Žåããããã¯æ¬¡ã®ããã«ãªããŸãã
/* bridge.cpp, bridge.so */ MessageLogger *Construct_MessageLogger (const char *msg) { return new MessageLogger (msg); } void LogMessage (MessageLogger *logger, const char *msg) { logger->LogMessage (msg); }
CïŒã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
class MessageLogger { IntPtr handle; [DllImport ("bridge")] extern static IntPtr Construct_MessageLogger (string msg); public MessageLogger (string msg) { handle = Construct_MessageLogger (msg); } [DllImport ("bridge")] extern static void LogMessage (IntPtr handle, string msg); public void LogMessage (string msg) { LogMessage (handle, msg); } }
ãã®ãããªã©ãããŒãã³ã³ãã€ã«ããã®ã«30å座ã£ãŠãã©ã€ãã©ãªã®äœæè ãã³ã³ãã€ã©ãC ++ãCïŒã®äœæè ã殺ãããã®èŽåœçã§äžå®å šãªäžçãå®å šã«ç Žå£ãããã®ã§ãã
PhyreEngineïŒã¯ãSonyã®PhyreEngineã®.NET C ++ APIãã€ã³ãã£ã³ã°ã§ãã ã³ãŒããæžãããã»ã¹ã¯éåžžã«éå±ã§ããããã®ãããã²ããŸãããŠã³ãŒããžã§ãã¬ãŒã¿ãŒã®ãããªããšãããŸããã
ããã«ãäžèšã®ã¡ãœããã§ã¯ãC ++ã³ãŒãã§C ++ã¯ã©ã¹ã¡ãœããããªãŒããŒã©ã€ãããããšã¯ã§ããŸããã ããæ£ç¢ºã«ã¯ããããè¡ãããšãã§ããŸãããããã«ã¯å€ãã®ç¹æ®ãªã±ãŒã¹ãšå€ãã®ã³ãŒã«ããã¯åŒã³åºããèæ ®ããŠã倧éã®ã³ãŒããæåã§èšè¿°ããå¿ èŠããããŸãã ãã€ã³ãã£ã³ã°ã¯ããã«ã»ãšãã©ãµããŒããããªããªããŸãïŒPhyreEngineã®ãã€ã³ããŒãäœæãããšãã«ãã®åé¡ã«ééããŸããïŒã
äžèšã®è©Šç·Žã¯ãCXXIã®äœæãä¿ããŸããã
ä»çµã¿
C ++ã¯ã©ã¹ãžã®ã¢ã¯ã»ã¹ã¯è€éãªåé¡ã§ãã CXXIã§å€§ããªåœ¹å²ãæããC ++ã³ãŒãã®å®è£ ã®æ©èœã«ã€ããŠç°¡åã«èª¬æããŸãã
- ãªããžã§ã¯ãã¬ã€ã¢ãŠãïŒã¡ã¢ãªå ã®ãªããžã§ã¯ãã®ãã€ããªè¡šçŸã¯ããã©ãããã©ãŒã ã«ãã£ãŠç°ãªãå ŽåããããŸãã
- VTableããŒã¯ã¢ããïŒã³ã³ãã€ã©ãã¡ãœããã®ã¢ãã¬ã¹ã決å®ããããã«äœ¿çšããä»®æ³ã¡ãœããã®å®è£ ãžã®ãã€ã³ã¿ãŒã®ãªã¹ãã¯ãã¯ã©ã¹ãšãã®èŠªã®ä»®æ³ã¡ãœããã«äŸåããŸãã
- è£ é£Ÿå ïŒvtableã«å«ãŸããŠããªãéä»®æ³ã¡ãœããã ã³ã³ãã€ã©ã¯ãéåžžã®ãCãé¢æ°ãçæããŸãããã®é¢æ°ã®ååã¯ãæ»ãå€ã®åãšåŒæ°ã®åã«åºã¥ããŠèšç®ãããŸãã è£ é£Ÿã¹ããŒã ã¯ã³ã³ãã€ã©ãŒã«äŸåããŸãã
ããšãã°ã次ã®ã¯ã©ã¹ããããŸãã
class Widget { public: void SetVisible (bool visible); virtual void Layout (); virtual void Draw (); }; class Label : public Widget { public: void SetText (const char *text); const char *GetText (); };
ãããã®ã¡ãœããã¡ãœããã®C ++ã³ã³ãã€ã©ã¯ã次ã®ååãçæããŸãïŒapprox.per .: GCCãIntel C ++ Compiler for Linuxãªã©ã®æå³ã®ã³ã³ãã€ã©ãã¹ã¿ãžãªã¯æ¬¡ã®ãããªèªã¿åãäžå¯èœãªãã®ãçæããŸããïŒH @@ YAXH @ Z; GCCã®å Žåãc +ãŠãŒãã£ãªãã£ã䜿çšã§ããŸã+ filtïŒïŒ
__ZN6Widget10SetVisibleEb
__ZN6Widget6LayoutEv
__ZN6Widget4DrawEv
__ZN5Label7SetTextEPKc
__ZN5Label7GetTextEv
ããã«ã³ãŒãããããŸã
Label *l = new Label (); l->SetText ("foo"); l->Draw ();
次ã®ãããªãã®ã«ã³ã³ãã€ã«ãããŸãïŒCã³ãŒããšããŠè¡šãããŸãïŒã
Label *l = (Label *) malloc (sizeof (Label)); ZN5LabelC1Ev (l); // Label _ZN5Label7SetTextEPKc (l, "foo"); // Draw (l->vtable [METHOD_PTR_SIZE*2])();
CXXIããã®ãããªããšããµããŒãããããã«ã¯ãvtableå ã®ã¡ãœããã®æ£ç¢ºãªäœçœ®ãåã¡ãœãããå®è£ ãããŠããå Žæãšæ¹æ³ãããã³è£ 食åã§ãããã«å°éããæ¹æ³ãç¥ãå¿ èŠããããŸãã
以äžã®å³ã¯ãC ++ã©ã€ãã©ãªãCïŒããã³ãã®ä»ã®.NETèšèªã§ã©ã®ããã«å©çšå¯èœã«ãªããã瀺ããŠããŸãã
å®éãC ++ã³ãŒãã¯2åã³ã³ãã€ã«ãããŸãã C ++ã³ã³ãã€ã©ã¯ã¢ã³ãããŒãžã©ã€ãã©ãªãçæããCXXIããŒã«ãããã¯ãã€ã³ããŒãçæããŸãã
äžè¬çã«ãCXXIã«å¿ èŠãªã®ã¯C ++ã³ãŒãã®ããããŒãã¡ã€ã«ã®ã¿ã§ãCïŒã§äœ¿çšããããã«ã©ããããå¿ èŠãããã®ã¯ããããŒãã¡ã€ã«ã®ã¿ã§ãã ãã®ãããç¬èªã®ã©ã€ãã©ãªãšããããŒãã¡ã€ã«ãããªãå Žåã§ããCXXIã¯ãã€ã³ããŒãçæã§ããŸãã
CXXIããŒã«ãããã¯ãCïŒããã³ãã®ä»ã®.NETèšèªããå®å šã«äœ¿çšã§ããéåžžã®.NETã©ã€ãã©ãªïŒ ãããTransl ãïŒããã¯MSILãå«ã¿ãã¢ã³ãããŒãžã³ãŒãã®ã¿ãå«ãPre-Donetsã©ã€ãã©ãªã§ãïŒãäœæããŸãã ãã®ã©ã€ãã©ãªã¯ã次ã®ããããã£ãæã€CïŒã¯ã©ã¹ãå ¬éããŸãã
- CïŒã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯å¯Ÿå¿ããC ++ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
- ãããã®ã¯ã©ã¹ã¯ä»ã®CïŒã¯ã©ã¹ã®åºæ¬ãšãªãããšãã§ããä»®æ³ãšããŠããŒã¯ããããã¹ãŠã®ã¡ãœããã¯CïŒã³ãŒãã§ãªãŒããŒã©ã€ãã§ããŸãã
- C ++ã¯ã©ã¹ã®å€éç¶æ¿ããµããŒããããŠããŸããçæãããCïŒã¯ã©ã¹ã¯ãããŸããŸãªC ++åºæ¬ã¯ã©ã¹ã«ã¢ã¯ã»ã¹ã§ããã¿ã€ãå€ææŒç®åã®ã»ãããå®è£ ããŸãã
- ãªãŒããŒã©ã€ããããã¡ãœããã¯ãCïŒbaseããŒã¯ãŒãã䜿çšããŠC ++ããŒã¹ã¯ã©ã¹ã¡ãœãããåŒã³åºãããšãã§ããŸãã
- å€éç¶æ¿ã®å Žåãå«ããä»®æ³ã¯ã©ã¹ã¡ãœããããªãŒããŒã©ã€ãã§ããŸãã
- ä»ã®äººããã§ã«äœæããC ++ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå Žåã«åããŠãIntPtrãåãå ¥ããã³ã³ã¹ãã©ã¯ã¿ãŒããããŸãã
CXXIãã€ãã©ã€ã³ã¯ãå³ã®å³ã«ç€ºã3ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã
GCC-XMLã³ã³ãã€ã©ã¯ãC ++ã³ãŒãã解æããããããå¿ èŠãªæ å ±ãæœåºããããã«äœ¿çšãããŸãã çæãããXMLã¯ãCXXIãŠãŒãã£ãªãã£ã«ãã£ãŠåŠçãããC ++ã®ã¯ã©ã¹ãžã®å®éã®ããªããžãå«ãCïŒã®éšåã¯ã©ã¹ã®ã»ãããçæãããŸã
次ã«ãè¿œå ããè¿œå ã³ãŒãïŒããšãã°ãAPIãæ¹åããããã®ãªãŒããŒããŒããããããã€ãã®ã¡ãœãããToStringã®å®è£ ãéåæã¡ãœãããªã©ïŒãšçµã¿åããããŸãã
åºåã¯ããã€ãã£ãã©ã€ãã©ãªã§åäœãã.NETã¢ã»ã³ããªã§ãã
ãã®ã¢ã»ã³ããªã«ã¯ãã¡ã¢ãªå ã®ãªããžã§ã¯ããããŒã¯ããããã®ããããå«ãŸããŠããªãããšã«æ³šæããŠãã ããã 代ããã«ãCXXIãã€ã³ãã¯ãABIãå®è¡ããããšãã«äœ¿çšãããå€æã«ãŒã«ãšå¯Ÿå¿ããå€æã«ãŒã«ã«åºã¥ããŠããã決å®ããŸãã ãããã£ãŠããã€ã³ããŒãã³ã³ãã€ã«ããå¿ èŠãããã®ã¯äžåºŠã ãã§ãããããç°ãªããã©ãããã©ãŒã ã§éãã«äœ¿çšããŸãã
äŸ
GitHubãããžã§ã¯ãã³ãŒãã«ã¯ãããŸããŸãªãã¹ããšå€æ°ã®ãµã³ãã«ãå«ãŸããŠããŸãã ãããã®1ã€ã¯ãQtãžã®æå°éã®ãã€ã³ãã£ã³ã°ã§ãã
ä»ã«å®è£ ãããã®
æ®å¿µãªãããCXXIãããžã§ã¯ãã¯ãŸã å®æããŠããŸããããããã¯.NETãšC ++ã§ã®ã³ãŒãã®çžäºäœçšãæ確ã«æ¹åããããã®ååãªæºåã§ãã
çŸåšãCXXIã¯ã©ã³ã¿ã€ã ã§ãã¹ãŠã®äœæ¥ãå®è¡ããå¿ èŠã«å¿ããŠSystem.Reflection.Emitãä»ããŠã¢ããã¿ãŒãçæããŸããããã«ãããC ++ã©ã€ãã©ãªã³ã³ãã€ã©ã§äœ¿çšãããABIãåçã«æ±ºå®ã§ããŸãã
ãŸããéçã³ã³ãã€ã«ã®ãµããŒããè¿œå ããŸããããã«ãããPS3ããã³iPhoneã®CïŒã©ã€ã¿ãŒã§ãã®ãã¯ãããžãŒã䜿çšã§ããããã«ãªããŸãã
CXXIã¯çŸåšãABI GCCããµããŒãããŠãããABI MSVCãæåã«ãµããŒãããŠããŸãã ä»ã®ã³ã³ãã€ã©ã®ABIãµããŒãã®å®è£ ãšMSVCãµããŒãã®å®äºãæ¯æŽãããŠããã ããŸãã
çŸåšãCXXIã¯ãããã«ãã£ãŠäœæããããªããžã§ã¯ãã®åé€ã®ã¿ããµããŒãããŠããŸãã ä»ã®ãã¹ãŠã®ãªããžã§ã¯ãã¯ãã¢ã³ãããŒãžã³ãŒãã®äžçã«å±ãããšèŠãªãããŸãã ãã®ãããªãªããžã§ã¯ãã®åé€æŒç®åã®ãµããŒãã圹ç«ã¡ãŸãã
ãŸãããã€ãã©ã€ã³ãšã©ã³ã¿ã€ã APIãããé©åã«ææžåãããã€ã³ããŒèªäœãæ¹åããããšèããŠããŸãã
翻蚳è ãã
ãã®æ¹æ³ã¯ãC ++ / CLIã§å€§éã®ã°ã«ãŒã³ãŒããæžãã®ãšæ¯ã¹ãŠæå©ã§ããããã§ã¯ãã¹ãŠã®äœæ¥ãããªãã®ããã«è¡ããããã¹ãŠãã¯ãã¹ãã©ãããã©ãŒã ã«ãªããŸãã ãŸããC ++ã§ã¯ã©ã¹ã¡ãœãããããã¯ããåæ§ã®æ¹æ³ã«ã€ããŠã®èšäºããã®å¹Žã«ããã«ç»å ŽããŸããããå€ãã¯æäœæ¥ã§è¡ãããŸãããã泚ç®ã«å€ããŸãã ããããèè ã«ãããšããªã³ã¶ãã©ã€ã©ãããŒã®äœ¿çšã¯ãCOMçžäºéçšïŒMSããã®ã©ã³ã¿ã€ã ïŒããã1.5åé«éã§ããããšãå€æããŸããã
ããããã ããã¯èšäºã«ã¯åæ ãããŠããŸããããgithubã®ãã¹ãã±ãŒã¹ããå€æãããšãC ++ãªããžã§ã¯ãã®ãã£ãŒã«ããåç §ã§ããŸãã
ã©ã®ããã䜿ããããã§ããïŒ çè«çã«ã¯ãä»»æã®ãã©ã¹libã䜿çšããŠããã®ããã®ãã€ã³ããŒãçæã§ããŸãïŒWindowsã®å ŽåãCygwinã§ã³ã³ãã€ã«ããå¿ èŠããããŸãïŒã ãããŠããªããžã§ã¯ãã®æ°ããäœæãããã€ã³ã¹ã¿ã³ã¹ãè¿ãã¡ãœããããªãå Žåã¯æ£åžžã«æ©èœããŸãããçŸæç¹ã§ã¯åé€ã§ããŸããããQtã§ã¯QObjectã«deleteLaterïŒïŒã¹ãããããããåé¡ã¯ãªãã¯ãã§ãã å®éã«ã¯ãIrrlichtã®ãã€ã³ããŒãçæããããšããŠäžè¬çãªãã®ãèœã¡ãGCCXMLã¯std :: tr1ããäœãããã¹ã¿ãŒããããšãªãOGREã«èœã¡ãŸããã äžè¬çã«ãGCCXMLã«ãã£ãŠæŽæ°ãããããšã¯ãã£ãã«ãªãã®ã§ãclangãåªå ããŠGCCXMLãæŸæ£ãã䟡å€ããããŸãããçµå±ã®ãšãããæ£ããåäœããŸãã ããããäŸã®äžã«ã¯ããã€ãã®QtGuiã¯ã©ã¹çšã®åäœãã€ã³ããŒããããŸãïŒäžå®å šã§ããããŸã§ã«ãã¹ãŠã®ã¡ã¿æ å ±ãšã·ã°ãã«ã¹ãããã§QObjectã€ã³ãã©ã¹ãã©ã¯ãã£ãè¡ã£ã人ã¯ããŸããïŒã