確ãã«èšãããšãã§ããŸãïŒPythonã¯çæ³çãªããã°ã©ãã³ã°èšèªã§ã¯ãããŸããã ç§ã®æèŠã§ã¯ãäž»ãªåé¡ã¯éèš³è ã®ç¹åŸŽã«èµ·å ããèšèªèªäœãšã¯ã»ãšãã©é¢ä¿ããããŸããããéèš³è ã®ããããã¹ãŠã®ãã¥ã¢ã³ã¹ã¯åŸã ã«èšèªèªäœã®äžéšãšãªãããããã£ãŠãããã¯éåžžã«éèŠã§ãã
å¥åŠãªéèš³è ïŒã¹ãããïŒãšäŒè©±ãå§ããèšèªã¢ãŒããã¯ãã£ã®æå€§ã®èª€ãã§äŒè©±ãçµããããããšæããŸãã å®éããã®äžé£ã®æçš¿ã¯ãã€ã³ã¿ãŒããªã¿ãŒã¢ãŒããã¯ãã£ã«çµã¿èŸŒãŸãããœãªã¥ãŒã·ã§ã³ãšãã€ã³ã¿ãŒããªã¿ãŒãšèšèªèªäœã®äž¡æ¹ã«å¯Ÿãã圱é¿ã®èª¿æ»ã§ãã ãã®ãããªèšäºã¯ãèšèªã®äžè¬çãªèšèšã®èгç¹ãããåã«Pythonã®æ¹åã«é¢ããèããè¿°ã¹ããããã¯ããã«è峿·±ããã®ã«ãªããšæããŸãã
èšèªãšå®è£
ãã®ã»ã¯ã·ã§ã³ã¯ãèšäºå šäœãæžããåŸã«è¿œå ãããŸããã ç§ã®æèŠã§ã¯ãäžéšã®éçºè ã¯ãèšèªãšããŠã®Pythonãšã€ã³ã¿ãŒããªã¿ãŒãšããŠã®CPythonã®é¢ä¿ã®äºå®ãèŠèœãšãããããã¯äºãã«ç¬ç«ããŠãããšä¿¡ããŠããŸãã ã¯ããèšèªã®ä»æ§ã¯ãããŸãããå€ãã®å Žåãã€ã³ã¿ãŒããªã¿ãŒã®äœæ¥ã説æããããããã€ãã®ç¹ã«ã€ããŠåã«é»ã£ãŠããŸãããã®ã¢ãããŒãã§ã¯ãã€ã³ã¿ãŒããªã¿ãŒã®ã€ã³ããªã¡ã³ããŒã·ã§ã³ã®æé»çãªè©³çްãèšèªã®ã¢ãŒããã¯ãã£ãŒã«çŽæ¥åœ±é¿ããä»ã®Pythonã€ã³ããªã¡ã³ããŒã·ã§ã³ã«ããã€ãã®ããšãæ¡çšãããããšãããããŸãã ããšãã°ãPyPyã¯ã¹ãããã«ã€ããŠã¯äœãç¥ããŸãããïŒç§ã®ç¥ãéãïŒãã¹ãããããã®äžéšã§ãããã®ããã«åäœããããšã匷å¶ãããŸãã
ã¹ããã
ç§ã®æèŠã§ã¯ãèšèªã®æå€§ã®åé¡ã®1ã€ã¯ã°ãããã¹ãããã·ã¹ãã ã§ãã __slots__ã³ã³ã¹ãã©ã¯ãã«ã€ããŠã§ã¯ãªããç¹å¥ãªã¡ãœããã®å éšåã¹ããããæå³ããŸãã ãããã®ã¹ãããã¯ãèšèªã®ãæ©èœãã§ãããå€ãã®äººãèŠèœãšããã¡ã§ããã»ãšãã©ã®äººããããåŠçããå¿ èŠããªãããã§ãã ããã«ãã¹ãããã®ååšãã®ãã®ãPythonèšèªã®æå€§ã®åé¡ã§ããã¹ããããšã¯äœã§ããïŒ ããã¯ãã€ã³ã¿ãŒããªã¿ãŒã®å éšå®è£ ã®å¯äœçšã§ãã ãã¹ãŠã®Pythonããã°ã©ããŒã¯ã __ add__ãªã©ã®ãããžãã¯ã¡ãœãããã«ã€ããŠç¥ã£ãŠããŸã ããããã®ã¡ãœããã¯ãååãå²ãŸããŠãã2ã€ã®ã¢ã³ããŒã¹ã³ã¢ã§å§ãŸãã2ã€ã®ã¢ã³ããŒã¹ã³ã¢ã§çµãããŸãã åéçºè ã¯ãã³ãŒãã«a + bãèšè¿°ãããšãã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠé¢æ°a .__ add __ïŒbïŒãåŒã³åºãããããšãç¥ã£ãŠããŸãã
æ®å¿µãªãããããã¯çå®ã§ã¯ãããŸããã
å®éãPythonã¯ãã®ããã«ã¯æ©èœããŸããã Pythonã¯å éšçã«ã¯ãã®ããã«åäœããŸããïŒå°ãªããšãçŸåšã®ããŒãžã§ã³ã§ã¯ïŒã ã€ã³ã¿ãŒããªã¿ãŒã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
- ãªããžã§ã¯ããäœæããããšãã€ã³ã¿ãŒããªã¿ãŒã¯ãã¹ãŠã®ã¯ã©ã¹èšè¿°åãèŠã€ãã __add__ãªã©ã®éæ³ã®ã¡ãœãããæ¢ããŸãã
- æ€åºãããåç¹æ®ã¡ãœããã«ã€ããŠãã€ã³ã¿ãŒããªã¿ãŒã¯èšè¿°åãªã³ã¯ããªããžã§ã¯ãã®ç¹å¥ã«å²ãåœãŠãããã¹ãããã«é 眮ããŸããããšãã°ãããžãã¯ã¡ãœãã__add__ã¯ã tp_as_number-> nb_addããã³tp_as_sequence-> sq_concatã® 2ã€ã®å éšã¹ãããã«é¢é£ä»ããããŸãã
- ã€ã³ã¿ãŒããªã¿ãŒãa + bãå®è¡ããå Žåã TYPE_OFïŒaïŒ-> tp_as_number-> nb_addïŒaãbïŒã®ãããªãã®ãåŒã³åºããŸãïŒå®éã __ add__ã¡ãœããã«ã¯è€æ°ã®ã¹ããããããããããã¹ãŠãããè€éã«ãªããŸãïŒã
æäœa + bã¯ã ã¿ã€ãïŒaïŒ.__ add __ïŒaãbïŒã®ãããªãã®ã§ãªããã°ãªããŸããããã¹ãããã®æäœããèŠãããã«ãããã¯å®å šã«çå®ã§ã¯ãããŸããã ã¡ã¿ã¯ã©ã¹ã¡ãœãã__getattribute__ããªãŒããŒã©ã€ãããç¬èªã®__add__ã¡ãœãããå®è£ ããããšãããšããããèªåã§ç°¡åã«ç¢ºèªã§ããŸãããã®ã¡ãœããã¯åŒã³åºãããªãããšã«æ°ä»ãã§ãããã
ç§ã®æèŠã§ã¯ãã¹ãããã·ã¹ãã ã¯åçŽã«ã°ãããŠããŸãã ããã¯ãäžéšã®ã¿ã€ãã®ããŒã¿ïŒæŽæ°ãªã©ïŒãæäœããããã®æé©åã§ãããä»ã®ãªããžã§ã¯ãã«ã¯ãŸã£ããæå³ããããŸããã
ãããå®èšŒããããã«ããã®ãããªç¡æå³ãªã¯ã©ã¹ïŒ x.py ïŒãäœæããŸããã
class A(object): def __add__(self, other): return 42
__add__ã¡ãœãããåå®çŸ©ãããããã€ã³ã¿ãŒããªã¿ãŒã¯ãããã¹ãããã«é 眮ããŸãã ãããããããã©ããããéããã確èªããŸãããã æäœa + bãå®è¡ãããšããã¹ãããã·ã¹ãã ã䜿çšããŸãããããã¡ã€ãªã³ã°ã®çµæã¯æ¬¡ã®ãšããã§ãã
$ python3 -mtimeit -s 'from x import A; a = A(); b = A()' 'a + b' 1000000 loops, best of 3: 0.256 usec per loop
æäœa .__ add __ïŒbïŒãå®è¡ãããšãã¹ãããã·ã¹ãã ã¯äœ¿çšãããã代ããã«ã€ã³ã¿ãŒããªã¿ãŒã¯ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã®ãã£ã¯ã·ã§ããªïŒäœãèŠã€ãããªãå ŽæïŒãããã«ãç®çã®ã¡ãœãããèŠã€ããã¯ã©ã¹èªäœã®ãã£ã¯ã·ã§ããªã«ãªããŸãã æž¬å®å€ã¯æ¬¡ã®ããã«ãªããŸãã
$ python3 -mtimeit -s 'from x import A; a = A(); b = A()' 'a.__add__(b)' 10000000 loops, best of 3: 0.158 usec per loop
ä¿¡ããããŸããïŒ ã¹ãããã䜿çšããªããªãã·ã§ã³ã¯ãã¹ãããã䜿çšãããªãã·ã§ã³ãããé«éã§ããã éæ³ïŒ ç§ã¯ãã®æ¯ãèãã®çç±ãå®å šã«ã¯ç¢ºä¿¡ããŠããŸããããããã¯é·ãéãéåžžã«é·ãéç¶ããŠããŸãã å®éãå€ãã¿ã€ãã¯ã©ã¹ïŒã¹ãããããªãïŒã¯ãæ°ããã¿ã€ãã¯ã©ã¹ãããã¯ããã«é«éã«æ©èœããããå€ãã®æ©èœãåããŠããŸããã
ããå€ãã®æ©èœãå¿ èŠã§ããïŒ ã¯ããå€ãã¿ã€ãã®ã¯ã©ã¹ã¯ãããè¡ãããšãã§ããããïŒPython 2.7ïŒïŒ
>>> original = 42 >>> class FooProxy: ... def __getattr__(self, x): ... return getattr(original, x) ... >>> proxy = FooProxy() >>> proxy 42 >>> 1 + proxy 43 >>> proxy + 1 43
仿¥ãPython 2ãããè€éãªåã·ã¹ãã ãæã£ãŠããã«ãããããããéžæè¢ãå°ãªããªã£ãŠããŸãã äžèšã®ã³ãŒãã¯ãæ°ããã¿ã€ãã®ã¯ã©ã¹ã䜿çšããŠå®è¡ã§ããŸããã å®éãå€ãåã¯ã©ã¹ãã©ãã»ã©è»œéã§ãã£ãããèæ ®ãããšãããã«æªåããŸãã
>>> import sys >>> class OldStyleClass: ... pass ... >>> class NewStyleClass(object): ... pass ... >>> sys.getsizeof(OldStyleClass) 104 >>> sys.getsizeof(NewStyleClass) 904
ã¹ãããã·ã¹ãã ã¯ã©ãããæ¥ãã®ã§ããïŒ
äžèšã®ãã¹ãŠã¯ãã¹ããããã©ãããæ¥ãããšããåé¡ãæèµ·ããŸãã ç§ãç¥ãéããããã¯é·ãäŒçµ±ã§ããã Pythonã€ã³ã¿ãŒããªã¿ãŒãæåã«äœæããããšããçµã¿èŸŒã¿åïŒããšãã°ãæååïŒã¯ã°ããŒãã«ãªéçæ§é ãšããŠå®è£ ãããŠããããããªããžã§ã¯ãã«å¿ èŠãªãããã®ãã¹ãŠã®ç¹å¥ãªã¡ãœãããå«ããå¿ èŠããããŸããã ããã¯ã __ add__ã¡ãœããèªäœãçŸããåã§ãã ã 1990å¹Žã®æãå€ãããŒãžã§ã³ã®PythonãèŠããšããã®æç¹ã§ãªããžã§ã¯ããã©ã®ããã«å®è£ ãããŠããããããããŸããããã§ãããšãã°ãæŽæ°ã¯ã©ã®ããã«èŠããŸãããïŒ
static number_methods int_as_number = { intadd, /*tp_add*/ intsub, /*tp_subtract*/ intmul, /*tp_multiply*/ intdiv, /*tp_divide*/ intrem, /*tp_remainder*/ intpow, /*tp_power*/ intneg, /*tp_negate*/ intpos, /*tp_plus*/ }; typeobject Inttype = { OB_HEAD_INIT(&Typetype) 0, "int", sizeof(intobject), 0, free, /*tp_dealloc*/ intprint, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ intcompare, /*tp_compare*/ intrepr, /*tp_repr*/ &int_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ };
ã芧ã®ãšãããPythonã®æåã®ããŒãžã§ã³ã§ãã tp_as_numberã¡ãœããã¯ãã§ã«ååšããŠããŸããã æ®å¿µãªãããå€ãããŒãžã§ã³ã®PythonïŒç¹ã«ãã€ã³ã¿ãŒããªã¿ãŒïŒã¯ãªããžããªã®æå·ã«ãã倱ãããããããªããžã§ã¯ããã©ã®ããã«å®è£ ãããŠãããã確èªããããã«ãå°ãæ°ããããŒãžã§ã³ãèŠãŠã¿ãŸãããã ããã¯ã1993幎ã®é¢æ°è¿œå ã³ãŒãã®å€èгã§ãã
static object * add(v, w) object *v, *w; { if (v->ob_type->tp_as_sequence != NULL) return (*v->ob_type->tp_as_sequence->sq_concat)(v, w); else if (v->ob_type->tp_as_number != NULL) { object *x; if (coerce(&v, &w) != 0) return NULL; x = (*v->ob_type->tp_as_number->nb_add)(v, w); DECREF(v); DECREF(w); return x; } err_setstr(TypeError, "bad operand type(s) for +"); return NULL; }
ããã§ã __ add__ãä»ã®äººã¯ãã€çãŸããŸãããïŒ ããŒãžã§ã³1.1ã§ç»å ŽãããšæããŸãã OS X 10.9ã§Python 1.1ãã³ã³ãã€ã«ã§ããŸããã
$ ./python -v Python 1.1 (Aug 16 2014) Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam
ãã¡ããããã®ããŒãžã§ã³ã¯å®å®ããŠãããããã¹ãŠãæ£åžžã«æ©èœããããã§ã¯ãããŸããããåœæã®Pythonã®ã¢ã€ãã¢ãåŸãããšãã§ããŸãã ããšãã°ãCãšPythonã§ã®ãªããžã§ã¯ãã®å®è£ ã«ã¯å€§ããªéãããããŸããã
$ ./python test.py Traceback (innermost last): File "test.py", line 1, in ? print dir(1 + 1) TypeError: dir() argument must have __dict__ attribute
ãã®çµæãæŽæ°ãªã©ã®çµã¿èŸŒã¿åã®ã€ã³ããã¹ãã¯ã·ã§ã³ããªãã£ãããšãããããŸãã å®éã __ add__ã¡ãœããã¯ã«ã¹ã¿ã ã¯ã©ã¹ã§ã®ã¿ãµããŒããããŠããŸããã
>>> (1).__add__(2) Traceback (innermost last): File "<stdin>", line 1, in ? TypeError: attribute-less object
ãããã仿¥Pythonã§åŸãã¬ã¬ã·ãŒã§ãã Pythonãªããžã§ã¯ãã®ã¢ãŒããã¯ãã£ã®åºæ¬ååã¯å€æŽãããŠããŸããããé·å¹Žã«ããã£ãŠãå€ãã®æ¹è¯ã倿Žããªãã¡ã¯ã¿ãªã³ã°ãè¡ãããŠããŸããã
ã¢ãã³PyObject
仿¥ãå€ãã®äººããCã§å®è£ ãããPythonã®çµã¿èŸŒã¿ããŒã¿åãšPythonã§å®è£ ãããçŽç²ãªãªããžã§ã¯ãã®éãã¯éèŠã§ã¯ãªããšãã䞻匵ã«ç°è«ãå±ããã§ãããã Python 2.7ã§ã¯ããã®éãã¯ã __ repr__ã¡ãœããã Pythonã§å®è£ ãããåã®å¯Ÿå¿ããã¯ã©ã¹ã¯ã©ã¹ã«ãã£ãŠæäŸããããããã£ãŠãCã§å®è£ ãããçµã¿èŸŒã¿ãªããžã§ã¯ãã®åã§æäŸããããšããäºå®ã§ç¹ã«é¡èã§ããå®éããã®éãã¯ãªããžã§ã¯ãã®é 眮ã瀺ããŸãïŒéçã«ïŒ typeã®å Žå ïŒãŸãã¯ããŒãå ã§åçã«ïŒ classã®å Žå ïŒã å®éã«ã¯ããã®éãã¯äœã®éããããããããPython 3ã§ã¯å®å šã«æ¶ããŸããã ç¹å¥ãªã¡ãœããã¯ã¹ãããã«é 眮ããããã®éãåæ§ã§ãã Pythonã¯ã©ã¹ãšCã¯ã©ã¹ã®éãã¯ãããªãããã§ãããã ããéãã¯ãŸã ãããéåžžã«é¡èã§ãã ãããçè§£ããŸãããã
ãåãã®ãšãããPythonã®ã¯ã©ã¹ã¯ããªãŒãã³ãã§ãã ããã¯ãã¯ã©ã¹å®£èšãå®äºããåŸã§ãããããããèŠããããããã«æ ŒçŽãããŠããå 容ã衚瀺ããã¡ãœããã远å ãŸãã¯åé€ã§ããããšãæå³ããŸãã ãã ããçµã¿èŸŒã¿ã®ã€ã³ã¿ãŒããªã¿ãŒã¯ã©ã¹ã«ã¯ãã®ãããªæè»æ§ã¯ãããŸããã ãªããã
ããšãã°ã dictãªããžã§ã¯ãã«æ°ããã¡ãœããã远å ããããã®æè¡çãªå¶éã¯ãããŸããã ã€ã³ã¿ãŒããªã¿ãŒããããèš±å¯ããŠããªãçç±ã¯ãéçºè ã®å¥å šæ§ãšã¯ã»ãšãã©é¢ä¿ããããŸãããäºå®ã¯ãçµã¿èŸŒã¿ããŒã¿åãããŒãäžã«ãªãããã§ãã ãã®ã°ããŒãã«ãªæå³ãçè§£ããã«ã¯ããŸãPythonãã€ã³ã¿ãŒããªã¿ãŒãå®è¡ããæ¹æ³ãçè§£ããå¿ èŠããããŸãã
ãããŒéèš³
Pythonã§ã€ã³ã¿ãŒããªã¿ãŒãå®è¡ããã®ã¯éåžžã«é«äŸ¡ãªããã»ã¹ã§ãã å®è¡å¯èœãã¡ã€ã«ãå®è¡ãããšããã¹ãŠãããå°ãã ãå€ãã®ããšãã§ããè€éãªã¡ã«ããºã ãã¢ã¯ãã£ãã«ããŸãã ãšããããçµã¿èŸŒã¿ããŒã¿åãã¢ãžã¥ãŒã«ã€ã³ããŒãã¡ã«ããºã ãåæåãããããã€ãã®å¿ èŠãªã¢ãžã¥ãŒã«ãã€ã³ããŒãããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§äœæ¥ãå®è¡ãããä¿¡å·ãšã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒã§äœæ¥ãæ§æããã€ã³ã¿ãŒããªã¿ãŒã®å éšç¶æ ãã»ããã¢ãããããŸãã ãããŠãããããã¹ãŠã®ããã»ã¹ãçµäºããåŸã«ã®ã¿ãã€ã³ã¿ãŒããªã¿ãŒãã³ãŒããéå§ããäœæ¥ãå®äºããŸãã ãã®ãããPythonã¯25幎éåããŠããŸããæ¬äŒŒã³ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã
/* */ bootstrap() /* , */ initialize() rv = run_code() finalize() /* */ shutdown()
åé¡ã¯ãã€ã³ã¿ãŒããªã¿ãŒã«ã¯èšå€§ãªæ°ã®ã°ããŒãã«ãªããžã§ã¯ãããããå®éã«ã¯ã€ã³ã¿ãŒããªã¿ãŒã1ã€ããããšã§ãã ããã«è¯ãããšã«ãã¢ãŒããã¯ãã£ã®èгç¹ããã¯ãã€ã³ã¿ããªã¿ãåæåããæ¬¡ã®ããã«å®è¡ããå¿ èŠããããŸããã
interpreter *iptr = make_interpreter(); interpreter_run_code(iptr): finalize_interpreter(iptr);
ããããä»ã®åçããã°ã©ãã³ã°èšèªãããšãã°LuaãJavaScriptãªã©ã®ä»çµã¿ã§ãã äž»ãªæ©èœã¯ã2ã€ã®ã€ã³ã¿ãŒããªã¿ãŒã䜿çšã§ããããšã§ããããã¯æ°ããæŠå¿µã§ãã
誰ãè€æ°ã®éèš³ãå¿ èŠãšããã§ããããïŒ ã³ã£ããããã§ãããããPythonã®å Žåã§ããããå¿ èŠã§ããå°ãªããšããããã¯æçšã§ãã æ¢åã®äŸã®äžã§ã mod_pythonäžã®Webã¢ããªã±ãŒã·ã§ã³ãªã©ãçµã¿èŸŒã¿Pythonã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã«ååãä»ããããšãã§ããŸã-ãããã¯å¿ ãéé¢ãããç°å¢ã§å®è¡ããå¿ èŠããããŸãã ã¯ããPythonã«ã¯ãµãã€ã³ã¿ãŒããªã¿ãŒããããŸããããµãã€ã³ã¿ãŒããªã¿ãŒã¯ã¡ã€ã³ã€ã³ã¿ãŒããªã¿ãŒå ã§æ©èœããŸããããã¯ãPythonã®å éšç¶æ ã«å€ããé¢é£ä»ããããŠããããã§ãã Pythonã®å éšç¶æ ãæäœããããã®æå€§ã®ã³ãŒãã¯ãåæã«æãç©è°ãããããŠããã°ããŒãã«ã€ã³ã¿ãŒããªã¿ãŒããã¯ïŒGILïŒã§ãã Pythonã¯ãã¹ãŠã®ãµãã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠå ±æãããèšå€§ãªéã®ããŒã¿ããããããåäžã®ã€ã³ã¿ãŒããªã¿ãŒã®æŠå¿µã§æ©èœããŸãã ããããã¹ãŠã¯ããã®ããŒã¿ãžã®å¯äžã®ã¢ã¯ã»ã¹ã®ããã«ããã¯ïŒããã¯ïŒãå¿ èŠãšããããããã®ããã¯ã¯ã€ã³ã¿ãŒããªã¿ãŒã«å®è£ ãããŠããŸãã ã©ã®ãããªããŒã¿ã«ã€ããŠè©±ããŠããã®ã§ããããïŒ
äžèšã®ã³ãŒããèŠããšããããã®å·šå€§ãªæ§é ããã¹ãŠã°ããŒãã«å€æ°ãšããŠå®£èšãããŠããããšãããããŸãã å®éãã€ã³ã¿ãŒããªã¿ãŒã¯ãã¯ãOB_HEAD_INITïŒïŒTypetypeïŒã䜿çšããŠãããã®æ§é ãçŽæ¥Pythonã³ãŒãã§äœ¿çšããŸããããã«ããããããã®æ§é ã«å¿ èŠãªããããŒãã€ã³ã¿ãŒããªã¿ãŒã§åäœããããã«èšå®ãããŸãã ããšãã°ããªããžã§ã¯ããžã®ãªã³ã¯ã®æ°ã®ã«ãŠã³ãããããŸãã
ä»ãããªãã¯ãã¹ãŠãèµ·ãã£ãŠããå ŽæãèŠãŸããïŒ ãããã®ãªããžã§ã¯ãã¯ããã¹ãŠã®ãµãã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠå ±æãããŸãã ããã§ãPythonã³ãŒãã§ãããã®ãªããžã§ã¯ãã®ããããã倿Žã§ããããšãæ³åããŠãã ããã2ã€ã®å®å šã«ç¬ç«ãããçžäºã«æ¥ç¶ãããŠããªãPythonããã°ã©ã ã¯ãäœããã€ã³ãããŠã¯ãªãããçžäºã®ç¶æ ã«åœ±é¿ãäžããããšãã§ããŸãã ããšãã°ãFacebookã®ã¿ãã®JavaScriptã³ãŒããçµã¿èŸŒã¿ã®é åãªããžã§ã¯ãã®å®è£ ã倿ŽããGoogleã®ã¿ãã§ãããã®å€æŽãããã«æ©èœãå§ãããšæ³åããŠãã ããã
ããã¯1990幎ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã§ãããçŸåšã®ããŒãžã§ã³ã®èšèªã«åœ±é¿ãäžãç¶ããŠããŸãã
äžæ¹ãå¯å€ããŒã¿åã®åé¡ã¯ä»ã®ããã°ã©ãã³ã°èšèªã§ãããç¥ãããŠãããããçµã¿èŸŒã¿åå šäœã®äžå€æ§ã¯Pythonéçºè ã³ãã¥ããã£ãã奜æçã«åãåãããŸããã
ãã ãããã1ã€ãããŸãã
VTableãšã¯äœã§ããïŒ
ãã®ãããPythonã§ã¯ãçµã¿èŸŒã¿ïŒCã§å®è£ ïŒããŒã¿åã¯ã»ãšãã©äžå€ã§ãã 圌ãã¯ä»ã«ã©ã®ããã«éããŸããïŒ ãã1ã€ã®éãã¯ãPythonã¯ã©ã¹ã®ããªãŒãã³æ§ãã§ãã Pythonããã°ã©ãã³ã°èšèªã§å®è£ ãããã¯ã©ã¹ã¡ãœããã¯ãä»®æ³ãã§ããC++ã®ãããªä»®æ³ã¡ãœããã®ãå®éã®ãããŒãã«ã¯ãªãããã¹ãŠã®ã¡ãœããã¯ãæ€çŽ¢ã¢ã«ãŽãªãºã ã䜿çšããŠéžæãè¡ãããã¯ã©ã¹ã®èŸæžã«æ ŒçŽãããŸãã çµæã¯æããã§ãããªããžã§ã¯ãããç¶æ¿ããŠãã®ã¡ãœãããåå®çŸ©ãããšãå¥ã®ã¡ãœãããããã»ã¹å ã§åŒã³åºãããããã鿥çã«åœ±é¿ãåããå¯èœæ§ããããŸãã䜿ãããã颿°ãå«ãã³ã¬ã¯ã·ã§ã³ãè¯ãäŸã§ãã ãããã£ãŠãPythonã®èŸæžã«ã¯ããªããžã§ã¯ããååŸããããã®2ã€ã®ã¡ãœããã __getitem __ïŒïŒãšgetïŒïŒããããŸãã Pythonã§ã¯ã©ã¹ãäœæãããšããéåžžã1ã€ã®ã¡ãœãããå¥ã®ã¡ãœããã«å®è£ ããããšãã°getïŒkeyïŒé¢æ°ããself .__ getitem __ïŒkeyïŒãè¿ããŸãã
ã€ã³ã¿ãŒããªã¿ãŒã«å®è£ ãããåã®å Žåããã¹ãŠãç°ãªããŸãã ãã®çç±ããã¹ããããšèŸæžã®éãã§ãã ã€ã³ã¿ãŒããªã¿ãŒã§ãã£ã¯ã·ã§ããªãŒãäœæããæ¢åã®ã³ãŒããåå©çšããããšãæ¡ä»¶ã®1ã€ã§ããããã getãã__getitem__ãåŒã³åºããšããŸã ã ããªãã¯äœãããŸããïŒ
Cã®Pythonã¡ãœããã¯ç¹å®ã®ã·ã°ããã£ãæã€åãªã颿°ã§ããããããæåã®åé¡ã§ãã 颿°ã®äž»ãªã¿ã¹ã¯ã¯ãPythonã³ãŒãã®ãã©ã¡ãŒã¿ãŒãåŠçããã¬ãã«Cã§äœ¿çšã§ãããã®ã«å€æããããšã§ããå°ãªããšããã¿ãã«ãŸãã¯PythonèŸæžïŒargsããã³kwargsïŒããã®é¢æ°åŒã³åºãã®åŒæ°ãããŒã«ã«å€æ°ã«å€æããå¿ èŠããããŸãã éåžžã圌ãã¯ãããè¡ããŸãïŒæåã«ã dict__getitem__ã¯åŒæ°ãè§£æããæ¬¡ã«dict_do_getitemãçŸåšã®ãã©ã¡ãŒã¿ãŒã§åŒã³åºãããŸãã äœãèµ·ãã£ãŠããã®ãããããŸããïŒ dict__getitem__ãšdict_getã¯ã©ã¡ããå éšéç颿°ã§ããdict_getãåŒã³åºããŸãããããã«ã€ããŠã¯äœãã§ããŸããã
ãã®å¶éãåé¿ããè¯ãæ¹æ³ã¯ãããŸããããã®çç±ã¯ã¹ãããã·ã¹ãã ã§ãã ã€ã³ã¿ãŒããªã¿ãŒãvtableãä»ããŠåŒã³åºããè¡ãéåžžã®æ¹æ³ã¯ãªãããã®çç±ã¯GILã§ãã èŸæžïŒdictïŒã¯ãã¢ãããã¯æäœã䜿çšããŠAPIãä»ããŠãå€ã®äžçããšéä¿¡ããvtableãä»ããŠãã®ãããªåŒã³åºããçºçãããšãããã¯å®å šã«æå³ã倱ããŸãã ãªãã§ïŒ ã¯ãããã®ãããªåŒã³åºãã¯Pythonã¬ãã«ã«å°éããªãå¯èœæ§ããããGILãä»ããŠåŠçãããªããããããã«å€§ããªåé¡ã«ã€ãªãããŸãã
èŸæžããç¶æ¿ãããã¯ã©ã¹ã§ãé å»¶ã€ã³ããŒããå®è¡ãããå éšdict_get颿°ããªãŒããŒã©ã€ãããèŠçãæ³åããŠãã ããã ããªãã¯çªãããã¹ãŠã®ä¿èšŒãæšãŠãŸãã ããããããäžåºŠãããããããããã£ãšåã«ããã¹ãã ã£ãã®ã§ããããïŒ
ãããã«
è¿å¹ŽãPythonèšèªãè€éã«ããåŸåãæããã«ãªã£ãŠããŸãã ç§ã¯å察ãèŠããã§ãããã®ã€ã³ã¿ãŒããªã¿ãŒã®å éšã¢ãŒããã¯ãã£ã¯ãJavaScriptã§ã®åäœãšåæ§ã«ãããŒã«ã«ããŒã¹ããŒã¿åã®ç¬ç«ãããµãã€ã³ã¿ãŒããªã¿ãŒã«åºã¥ããŠããå¿ èŠããããŸãã ããã«ãããã¡ãã»ãŒãžã³ã°ã«åºã¥ãåã蟌ã¿ãšãã«ãã¹ã¬ããåã®æãåºãå¯èœæ§ãéãããŸãã ããã»ããµã¯ãã¯ãé«éã§ã¯ãªããªããŸãã
vtableããŒã«ã®ã¹ããããšèŸæžã®ä»£ããã«ãèŸæžã詊ããŠã¿ãŸãããã Objective-Cèšèªã¯ã¡ãã»ãŒãžã³ã°ã«å®å šã«åºã¥ããŠãããããã¯ãã®é床ã«ãããŠæ±ºå®çãªåœ¹å²ãæãããŸããObjective-Cã§ã®åŒã³åºãã®åŠçã¯Pythonãããã¯ããã«éãããšãããããŸãã æååã¯Pythonã®å éšåã§ãããšããäºå®ã«ãããæååããã°ããæ¯èŒã§ããŸãã ææ¡ãããã¢ãããŒããæªåããããšã¯ãªããšç¢ºä¿¡ããŠãããããã«ããå éšåã®äœæ¥ãé ããªã£ããšããŠããæé©åã容æãªã¯ããã«ã·ã³ãã«ãªã¢ãŒããã¯ãã£ã«ãªãã¯ãã§ãã
PythonãœãŒã¹ã³ãŒãã調ã¹ãŠãã¹ãããã·ã¹ãã ãæ©èœããããã«å¿ èŠãªè¿œå ã³ãŒãã®éã確èªããå¿ èŠããããŸããä¿¡ããããªãã»ã©ã§ãã ããã¯æªãèãã ãšç¢ºä¿¡ããŠãããç§ãã¡ã¯ãã£ãšåã«ãããæŸæ£ãã¹ãã ã£ãã äœæè ã¯CPythonãšã®äºææ§ã¢ãŒãã§ã€ã³ã¿ãŒããªã¿ãŒãåäœãããããã«éªéã«ãªããªããšç¢ºä¿¡ããŠããã®ã§ãã¹ããããæåŠããããšã¯PyPyã«ãå©çããããããŸãã
Dreadatourã翻蚳ããããã¹ãã¯ïŒ usernameïŒ ãèªã¿ãŸããã