http://shinh.skr.jp/koneta/rubycpp.tgz
ããªãã¸ãæ¸ããã« Ruby ãã C++ ã触ãå®é¨ããã£ã¦ããã¨ã¨ãã¦ã¯ã .so ã dlopen ã㦠dlinfo ãã¦å 容ã libbfd ã§èªãã§ã libiberty ã§ããã³ã°ã«ãã¦ä¿æããã§ Ruby ãã new ã¨ã method_missing ãå¼ã°ããã¨é©å½ã«ã³ã³ã¹ãã©ã¯ã¿ã ã®ã¡ã½ããã ã®ã libffi ã§å¼ã¶ã
Ruby å´ã³ã¼ã
#!/usr/bin/env ruby require 'rubycpp' BankAccount = Cplusplus::declare_class("bankaccount", "BankAccount", 4) b = BankAccount.new(100) b.deposit(300) p b.dollars
C++ å´ã³ã¼ã
#include <stdio.h> #include "bankaccount.h" BankAccount::BankAccount(int d) { dollars_ = d; } int BankAccount::dollars() { return dollars_; } void BankAccount::set_dollars(int d) { dollars_ = d; } void BankAccount::deposit(int d) { dollars_ += d; } void BankAccount::withdraw(int d) { dollars_ -= d; }
å®è¡çµæ
400
ã¨ã¾ãåãã¦ããã ãã©ãè²ã ãã¡ãããããã以ä¸ããã°ã£ã¦ãã©ããã¦ã解決ã§ããªãåé¡ã¨ãã¦ã¯ã
- g++ ã§ã¯è¿ãå¤ã®æ å ±ããã³ã°ã«ãããã·ã³ãã«ã«ç¡ã (ããã¼ãªãããç¾ç¶ int 決ãæã¡)
- ç¶æ¿é¢ä¿ããã§ãã¯ã§ããªã
- ã¤ã³ã©ã¤ã³é¢æ°ãå½ç¶å¼ã¹ãªã
- ã¯ã©ã¹ã®ãµã¤ãºãããããªã (ããã¼ãªããã弿°ã§æ¸¡ãã¦ãã)
ãã£ã±æä»£ã¯ D ãªããããªãããä¸ã®äºã¤ã¯ç°å¢ä¾åãªãã±ãªãæåã®äºã¤ã¯ã§ããããããªããã¨æããã©ããã¨ä»¥ä¸ã¯ããæ°å¤±ãããããã£ã¦ããªãåé¡ã
- ãªã¼ãã¼ãã¼ãã解決ãã¦ããªã
- ä¸ã¤ã® .so ããä¸ã¤ã®ã¯ã©ã¹ããæ¾ããªã
- C++ çã«ã¯åºæ¬å㪠std::string ã«æãåºã¦ãªã
- ãã¶ã Linux ã®ã¿
- ã¡ã¢ãªè§£æ¾ãã¦ãªããªã©ãå ¨ä½çã«é©å½
ãããã£ã± Io ãã D å¼ã¼ãã D ã§ããã©ããªã®ã¯ GC ã®å¦çã ãã ã¨æãããã¶ããã¤ãã§ã« D ã§ã©ããªå ´åã§ã大ä¸å¤«ãª .dll ã®ä½ãæ¹ã¨ããèãã¦ããã¨ããã£ã¦ã¿ãã¨è¯ãã¨æã£ãã
ã©ãã§ããããã©ãã¡ã½ãããå¼ã¶æã¯ç¬¬ä¸å¼æ°ããªãã¸ã§ã¯ãã«ãã¦æ®ããä¸åãã¤ãããâ¦ã¨ãã¯å¸¸èããã¯ã¨ãã¦ãã³ã³ã¹ãã©ã¯ã¿ã¯ void (*) (void*, ...) åã®é¢æ°ã§ new ã§ç¢ºä¿ããã¡ã¢ãªã第ä¸å¼æ°ã«ã¤ã£ããã
void* p = _Znwj(4); // void* _Znwj(int size); (è¦ããã« new) void (*ctor) (void*) = fp; // fp ã¯ã³ã³ã¹ãã©ã¯ã¿ã®é¢æ°ãã¤ã³ã¿ã¨ã㦠ctor(p);
ãªã©ã¨ã