SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
CPython 3.2
                  eval
                  Shinya Kawanaka (@mayahjp)

Sunday, March 27, 2011
•           :          (Shinya Kawanaka)

             •               : mayah (or MAYAH)

             • twitter: @mayahjp
             • Python:                            (     )




Sunday, March 27, 2011
• CPython   eval

                  •




Sunday, March 27, 2011
eval

                                   Γ⊦e→f
                         Γ ⊦ e1 → v1, ..., Γ ⊦ en → vn
                              Γ ⊦ f(v1, ..., vn) → v
                                Γ ⊦ e(e1, ..., en) → v


                            (            )




Sunday, March 27, 2011
AST



             •                       AST
                         eval



             • ……           Python




Sunday, March 27, 2011
Python
                  → ALMOST YES
             • ceval.c
                                     PyEval_EvalCode              co     code (AST)
                  globals        locals

                     PyObject *
                     PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
                     {
                       return PyEval_EvalCodeEx(co,
                                  globals, locals,
                                  (PyObject **)NULL, 0,
                                  (PyObject **)NULL, 0,
                                  (PyObject **)NULL, 0,
                                  NULL, NULL);
                     }


Sunday, March 27, 2011
AST

             • AST
                  • PyEvalCode                              PyCodeObject
                         AST

             •

                  • PyObject

                  •            PyObject

             •

                  • PyEvalCode        PyObject*   globals   locals
                                                  map




Sunday, March 27, 2011
AST / PyCodeObject (code.h)
             • PyCodeObject             code.h

                  • opcode
                          ...                     PyObject
                typedef struct {
                   PyObject_HEAD
                   ... <snip /> ...
                   PyObject *co_code;	 	      /* instruction opcodes */
                   PyObject *co_consts;	 	    /* list (constants used) */
                   PyObject *co_names;	 	     /* list of strings (names used) */
                   PyObject *co_varnames;	    /* tuple of strings (local variable names) */
                   PyObject *co_freevars;		   /* tuple of strings (free variable names) */
                   PyObject *co_cellvars; 	   /* tuple of strings (cell variable names) */
                   ... <snip /> ...
                } PyCodeObject;
Sunday, March 27, 2011
opcode (opcode.h)
             • opcode.h        opcode

                  •        define


             #define MAKE_CLOSURE 134 /* same as MAKE_FUNCTION */
             #define LOAD_CLOSURE 135 /* Load free variable from closure */
             #define LOAD_DEREF   136 /* Load and dereference from closure cell */
             #define STORE_DEREF 137 /* Store into cell */
             #define DELETE_DEREF 138 /* Delete closure cell */




Sunday, March 27, 2011
opcode
                                   grep
             •

                  •          →

             •           ceval.c          eval   switch
                  case



             •                      AST



Sunday, March 27, 2011
AST
             • PyCodeObject
                  • co_code     opcode

                  • co_consts            AST



             • AST




Sunday, March 27, 2011
PyObject (object.h)
             • GC

             • ob_type          PyObject

             typedef struct _object {
                ... <snip /> ...
                Py_ssize_t ob_refcnt;
                struct _typeobject *ob_type;
             } PyObject;

             typedef struct {
                PyObject ob_base;
                Py_ssize_t ob_size; /* Number of items in variable part */
             } PyVarObject;


Sunday, March 27, 2011
_typeobject (object.h)
             •

                  •


             typedef struct _typeobject {
                PyObject_VAR_HEAD
                ... <snip /> ...
                destructor tp_dealloc;
                printfunc tp_print;
                getattrfunc tp_getattr;
                setattrfunc tp_setattr;
                void *tp_reserved; /* formerly known as tp_compare */
                reprfunc tp_repr;


Sunday, March 27, 2011
•

                  • _typeobject (PyTypeObject)      tp_dict

                  •                  PyObject

             •                        primitive
                         primitive       PyObject

                  •                     int



Sunday, March 27, 2011
PyLongObject (longobject.h)
             •                     Py             Object
                                               PyIntObject

                  • → grep

                  •                PyLongObject

                         • 64bit        long                 ...




Sunday, March 27, 2011
PyLongObject (contd.)
             • _longobject

                  •

                  • digit      (      ) uint32

                         • 64bit

             struct _longobject {
             	   PyObject_VAR_HEAD
             	   digit ob_digit[1];
             };



Sunday, March 27, 2011
• PyObject

                  •                          PyObject

                  •

             •                primitive
                  primitive       PyObject

                  • PyLongObject


Sunday, March 27, 2011
...
             •             map

             • PyObject                 dict



                  •              eval

                  • eval




Sunday, March 27, 2011
•           eval



             •




Sunday, March 27, 2011
PyEval_EvalCodeEx (ceval.c)
             •

                  •         +α (PyFrameObject)      (PyFrame_New())

                  •

                  • PyFrameObject        PyEval_EvalFrameEx

                         • PyEval_EvalFrameEx        AST       eval




Sunday, March 27, 2011
PyFrameObject (frameobject.h)
             •



             typedef struct _frame {
                PyObject_VAR_HEAD
                struct _frame *f_back;	 /* previous frame, or NULL */
                PyCodeObject *f_code;	       /* code segment */
                PyObject *f_builtins;	 /* builtin symbol table (PyDictObject) */
                PyObject *f_globals;	 /* global symbol table (PyDictObject) */
                PyObject *f_locals;		   /* local symbol table (any mapping) */
                PyObject **f_valuestack;	 /* points after the last local */
                ....
             }


Sunday, March 27, 2011
PyFrame_New (frameobject.c)
             •

                  •

             •

                  •                 code

                  •

                  •        malloc



Sunday, March 27, 2011
•                              (              )

                  •                   local          kw (keyword)




             • SETLOCAL                                             OK

                         for (i = 0; i < n; i++) {
                            x = args[i];
                            Py_INCREF(x);
                            SETLOCAL(i, x);
                         }

Sunday, March 27, 2011
PyEval_EvalCodeEx (contd.)
             •

                  •      PyEval_EvalFrameEx

             •                        goto fail

                  •      fail     __del__



                  •                         C stack



Sunday, March 27, 2011
PyEval_EvalCode

             • pythonrun.c            run_mod()

                  • AST                     eval

             static PyObject * run_mod(mod_ty mod, const char *filename, PyObject
             *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena)
             {
                PyCodeObject *co;
                PyObject *v;
                co = PyAST_Compile(mod, filename, flags, arena);
                if (co == NULL) return NULL;
                v = PyEval_EvalCode((PyObject*)co, globals, locals);
                Py_DECREF(co);
                return v;
             }


Sunday, March 27, 2011
fast_function (ceval.c)
             • eval

                  •


                  • eval   call_function



             •



Sunday, March 27, 2011
PyEval_EvalFrameEx (ceval.c)
             •

             •

                 register int opcode;       /* Current opcode */
                 register int oparg;      /* Current opcode argument, if any */
                 register enum why_code why; /* Reason for block stack unwind */
                 register int err;     /* Error status -- nonzero if error */
                 register PyObject *x;       /* Result object -- NULL if error */
                 register PyObject *v;       /* Temporary objects popped off stack */
                 register PyObject *w;
                 register PyObject *u;
                 register PyObject *t;


Sunday, March 27, 2011
PyEval_EvalFrameEx (contd.)
             •                                             Main
                  switch on opcode



             •                           operation   x   NULL
                              err    0       why     WHY_NOT


                  operation




Sunday, March 27, 2011
PyEval_EvalFrameEx (contd.)
             •                           NOP (No operation)
                         TARGET(NOP)
                           FAST_DISPATCH();

             •

             #define TARGET(op) 
               case op:

             #define DISPATCH() continue

             #define FAST_DISPATCH() goto fast_next_opcode




Sunday, March 27, 2011
PyEval_EvalFrameEx (contd.)
             • NOP                  LOAD_CONST (                 )
                         x = GETITEM(consts, oparg);
                         Py_INCREF(x);
                         PUSH(x);
                         FAST_DISPATCH();


             •                           PUSH(x)             stack machine


             #define BASIC_PUSH(v) (*stack_pointer++ = (v))
             #define PUSH(v)       BASIC_PUSH(v)




Sunday, March 27, 2011
stack machine
             •               stack machine                       (BINARY_ADD)   2
                  operands                       POP → POP → PUSH

             •→
                         TARGET(BINARY_ADD)	 	        	   // only main
                           w = POP();
                           v = TOP();
                           x = PyNumber_Add(v, w);
                           Py_DECREF(v);
                           Py_DECREF(w);
                           SET_TOP(x);
                           if (x != NULL) DISPATCH();
                           break;


Sunday, March 27, 2011
• stack machine


                  • if

                         •   if         compare & branch

                  •

             • python             AST   compile




Sunday, March 27, 2011
JUMP_IF_TRUE [FALSE]
                  (_OR_POP)
             • stack machine                                                             jump



                  • JUMP_IF_TRUE [FALSE] (_OR_POP)
                         TARGET(POP_JUMP_IF_TRUE)
                           w = POP();
                           if (w == Py_False) {
                               Py_DECREF(w);
                               FAST_DISPATCH();
                           }
                           if (w == Py_True) {
                               Py_DECREF(w);
                               JUMPTO(oparg);   // this will set the next instruction!
                               FAST_DISPATCH();

Sunday, March 27, 2011
JUMPTO
             • first_instr        code

                  • offset
             #define JUMPTO(x)       (next_instr = first_instr + (x))


             • first_instr
                 first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code);


                  • co_code


Sunday, March 27, 2011
CALL_FUNCTION
             •               stack pointer                        call_function



                         TARGET(CALL_FUNCTION) {
                           PyObject **sp;
                           PCALL(PCALL_ALL); 	 	      	   // for profiling
                           sp = stack_pointer;
                           x = call_function(&sp, oparg);
                           stack_pointer = sp;
                           PUSH(x);
                           if (x != NULL) DISPATCH();
                           break;
                         }




Sunday, March 27, 2011
call_function
             • oparg

                  •      16bit
                                   (
             static PyObject *
             call_function(PyObject ***pp_stack, int oparg)
             {
                int na = oparg & 0xff;
                int nk = (oparg>>8) & 0xff;
                int n = na + 2 * nk;
                PyObject **pfunc = (*pp_stack) - n - 1;
                PyObject *func = *pfunc;
                PyObject *x, *w;



Sunday, March 27, 2011
call_function (contd.)
             •

                  • CPyFunction


                         PyObject *callargs;
                         callargs = load_args(pp_stack, na);
                         READ_TIMESTAMP(*pintr0);
                         C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
                         READ_TIMESTAMP(*pintr1);
                         Py_XDECREF(callargs);




Sunday, March 27, 2011
TIME UP
             •




Sunday, March 27, 2011

Contenu connexe

Similaire à CPython 3.2 eval deep dive

僕の考えるAPT開発の常識
僕の考えるAPT開発の常識僕の考えるAPT開発の常識
僕の考えるAPT開発の常識Masahiro Wakame
 
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版僕の考えるAPT開発の常識 ぐだ生 2011/04/09版
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版Masahiro Wakame
 
みゆっき☆Think#7 「本気で学ぶJavascript」
みゆっき☆Think#7 「本気で学ぶJavascript」みゆっき☆Think#7 「本気で学ぶJavascript」
みゆっき☆Think#7 「本気で学ぶJavascript」techtalkdwango
 
第7回みゆっき☆Think 本気で学ぶ JavaScript
第7回みゆっき☆Think 本気で学ぶ JavaScript第7回みゆっき☆Think 本気で学ぶ JavaScript
第7回みゆっき☆Think 本気で学ぶ JavaScriptTakuya Fujimura
 
2011 july-nyc-gtug-go
2011 july-nyc-gtug-go2011 july-nyc-gtug-go
2011 july-nyc-gtug-goikailan
 
State of GeoTools 2012
State of GeoTools 2012State of GeoTools 2012
State of GeoTools 2012Jody Garnett
 
Introduction to Objective - C
Introduction to Objective - CIntroduction to Objective - C
Introduction to Objective - CJussi Pohjolainen
 
JSLent: give it up for JavaScript
JSLent: give it up for JavaScriptJSLent: give it up for JavaScript
JSLent: give it up for JavaScriptBigBlueHat
 
Value objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progressValue objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progressBrendan Eich
 
ObjectBox - The new Mobile Database
ObjectBox - The new Mobile DatabaseObjectBox - The new Mobile Database
ObjectBox - The new Mobile Databasegreenrobot
 
Funddamentals of data structures
Funddamentals of data structuresFunddamentals of data structures
Funddamentals of data structuresGlobalidiots
 

Similaire à CPython 3.2 eval deep dive (15)

僕の考えるAPT開発の常識
僕の考えるAPT開発の常識僕の考えるAPT開発の常識
僕の考えるAPT開発の常識
 
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版僕の考えるAPT開発の常識 ぐだ生 2011/04/09版
僕の考えるAPT開発の常識 ぐだ生 2011/04/09版
 
みゆっき☆Think#7 「本気で学ぶJavascript」
みゆっき☆Think#7 「本気で学ぶJavascript」みゆっき☆Think#7 「本気で学ぶJavascript」
みゆっき☆Think#7 「本気で学ぶJavascript」
 
第7回みゆっき☆Think 本気で学ぶ JavaScript
第7回みゆっき☆Think 本気で学ぶ JavaScript第7回みゆっき☆Think 本気で学ぶ JavaScript
第7回みゆっき☆Think 本気で学ぶ JavaScript
 
2011 july-nyc-gtug-go
2011 july-nyc-gtug-go2011 july-nyc-gtug-go
2011 july-nyc-gtug-go
 
Iphone course 1
Iphone course 1Iphone course 1
Iphone course 1
 
State of GeoTools 2012
State of GeoTools 2012State of GeoTools 2012
State of GeoTools 2012
 
Introduction to Objective - C
Introduction to Objective - CIntroduction to Objective - C
Introduction to Objective - C
 
C_STL_2.pptx
C_STL_2.pptxC_STL_2.pptx
C_STL_2.pptx
 
JSLent: give it up for JavaScript
JSLent: give it up for JavaScriptJSLent: give it up for JavaScript
JSLent: give it up for JavaScript
 
Oop
OopOop
Oop
 
Value objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progressValue objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progress
 
About Python
About PythonAbout Python
About Python
 
ObjectBox - The new Mobile Database
ObjectBox - The new Mobile DatabaseObjectBox - The new Mobile Database
ObjectBox - The new Mobile Database
 
Funddamentals of data structures
Funddamentals of data structuresFunddamentals of data structures
Funddamentals of data structures
 

Dernier

Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 

Dernier (20)

Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 

CPython 3.2 eval deep dive

  • 1. CPython 3.2 eval Shinya Kawanaka (@mayahjp) Sunday, March 27, 2011
  • 2. : (Shinya Kawanaka) • : mayah (or MAYAH) • twitter: @mayahjp • Python: ( ) Sunday, March 27, 2011
  • 3. • CPython eval • Sunday, March 27, 2011
  • 4. eval Γ⊦e→f Γ ⊦ e1 → v1, ..., Γ ⊦ en → vn Γ ⊦ f(v1, ..., vn) → v Γ ⊦ e(e1, ..., en) → v ( ) Sunday, March 27, 2011
  • 5. AST • AST eval • …… Python Sunday, March 27, 2011
  • 6. Python → ALMOST YES • ceval.c PyEval_EvalCode co code (AST) globals locals PyObject * PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) { return PyEval_EvalCodeEx(co, globals, locals, (PyObject **)NULL, 0, (PyObject **)NULL, 0, (PyObject **)NULL, 0, NULL, NULL); } Sunday, March 27, 2011
  • 7. AST • AST • PyEvalCode PyCodeObject AST • • PyObject • PyObject • • PyEvalCode PyObject* globals locals map Sunday, March 27, 2011
  • 8. AST / PyCodeObject (code.h) • PyCodeObject code.h • opcode ... PyObject typedef struct { PyObject_HEAD ... <snip /> ... PyObject *co_code; /* instruction opcodes */ PyObject *co_consts; /* list (constants used) */ PyObject *co_names; /* list of strings (names used) */ PyObject *co_varnames; /* tuple of strings (local variable names) */ PyObject *co_freevars; /* tuple of strings (free variable names) */ PyObject *co_cellvars; /* tuple of strings (cell variable names) */ ... <snip /> ... } PyCodeObject; Sunday, March 27, 2011
  • 9. opcode (opcode.h) • opcode.h opcode • define #define MAKE_CLOSURE 134 /* same as MAKE_FUNCTION */ #define LOAD_CLOSURE 135 /* Load free variable from closure */ #define LOAD_DEREF 136 /* Load and dereference from closure cell */ #define STORE_DEREF 137 /* Store into cell */ #define DELETE_DEREF 138 /* Delete closure cell */ Sunday, March 27, 2011
  • 10. opcode grep • • → • ceval.c eval switch case • AST Sunday, March 27, 2011
  • 11. AST • PyCodeObject • co_code opcode • co_consts AST • AST Sunday, March 27, 2011
  • 12. PyObject (object.h) • GC • ob_type PyObject typedef struct _object { ... <snip /> ... Py_ssize_t ob_refcnt; struct _typeobject *ob_type; } PyObject; typedef struct { PyObject ob_base; Py_ssize_t ob_size; /* Number of items in variable part */ } PyVarObject; Sunday, March 27, 2011
  • 13. _typeobject (object.h) • • typedef struct _typeobject { PyObject_VAR_HEAD ... <snip /> ... destructor tp_dealloc; printfunc tp_print; getattrfunc tp_getattr; setattrfunc tp_setattr; void *tp_reserved; /* formerly known as tp_compare */ reprfunc tp_repr; Sunday, March 27, 2011
  • 14. • _typeobject (PyTypeObject) tp_dict • PyObject • primitive primitive PyObject • int Sunday, March 27, 2011
  • 15. PyLongObject (longobject.h) • Py Object PyIntObject • → grep • PyLongObject • 64bit long ... Sunday, March 27, 2011
  • 16. PyLongObject (contd.) • _longobject • • digit ( ) uint32 • 64bit struct _longobject { PyObject_VAR_HEAD digit ob_digit[1]; }; Sunday, March 27, 2011
  • 17. • PyObject • PyObject • • primitive primitive PyObject • PyLongObject Sunday, March 27, 2011
  • 18. ... • map • PyObject dict • eval • eval Sunday, March 27, 2011
  • 19. eval • Sunday, March 27, 2011
  • 20. PyEval_EvalCodeEx (ceval.c) • • +α (PyFrameObject) (PyFrame_New()) • • PyFrameObject PyEval_EvalFrameEx • PyEval_EvalFrameEx AST eval Sunday, March 27, 2011
  • 21. PyFrameObject (frameobject.h) • typedef struct _frame { PyObject_VAR_HEAD struct _frame *f_back; /* previous frame, or NULL */ PyCodeObject *f_code; /* code segment */ PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ PyObject *f_globals; /* global symbol table (PyDictObject) */ PyObject *f_locals; /* local symbol table (any mapping) */ PyObject **f_valuestack; /* points after the last local */ .... } Sunday, March 27, 2011
  • 22. PyFrame_New (frameobject.c) • • • • code • • malloc Sunday, March 27, 2011
  • 23. ( ) • local kw (keyword) • SETLOCAL OK for (i = 0; i < n; i++) { x = args[i]; Py_INCREF(x); SETLOCAL(i, x); } Sunday, March 27, 2011
  • 24. PyEval_EvalCodeEx (contd.) • • PyEval_EvalFrameEx • goto fail • fail __del__ • C stack Sunday, March 27, 2011
  • 25. PyEval_EvalCode • pythonrun.c run_mod() • AST eval static PyObject * run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { PyCodeObject *co; PyObject *v; co = PyAST_Compile(mod, filename, flags, arena); if (co == NULL) return NULL; v = PyEval_EvalCode((PyObject*)co, globals, locals); Py_DECREF(co); return v; } Sunday, March 27, 2011
  • 26. fast_function (ceval.c) • eval • • eval call_function • Sunday, March 27, 2011
  • 27. PyEval_EvalFrameEx (ceval.c) • • register int opcode; /* Current opcode */ register int oparg; /* Current opcode argument, if any */ register enum why_code why; /* Reason for block stack unwind */ register int err; /* Error status -- nonzero if error */ register PyObject *x; /* Result object -- NULL if error */ register PyObject *v; /* Temporary objects popped off stack */ register PyObject *w; register PyObject *u; register PyObject *t; Sunday, March 27, 2011
  • 28. PyEval_EvalFrameEx (contd.) • Main switch on opcode • operation x NULL err 0 why WHY_NOT operation Sunday, March 27, 2011
  • 29. PyEval_EvalFrameEx (contd.) • NOP (No operation) TARGET(NOP) FAST_DISPATCH(); • #define TARGET(op) case op: #define DISPATCH() continue #define FAST_DISPATCH() goto fast_next_opcode Sunday, March 27, 2011
  • 30. PyEval_EvalFrameEx (contd.) • NOP LOAD_CONST ( ) x = GETITEM(consts, oparg); Py_INCREF(x); PUSH(x); FAST_DISPATCH(); • PUSH(x) stack machine #define BASIC_PUSH(v) (*stack_pointer++ = (v)) #define PUSH(v) BASIC_PUSH(v) Sunday, March 27, 2011
  • 31. stack machine • stack machine (BINARY_ADD) 2 operands POP → POP → PUSH •→ TARGET(BINARY_ADD) // only main w = POP(); v = TOP(); x = PyNumber_Add(v, w); Py_DECREF(v); Py_DECREF(w); SET_TOP(x); if (x != NULL) DISPATCH(); break; Sunday, March 27, 2011
  • 32. • stack machine • if • if compare & branch • • python AST compile Sunday, March 27, 2011
  • 33. JUMP_IF_TRUE [FALSE] (_OR_POP) • stack machine jump • JUMP_IF_TRUE [FALSE] (_OR_POP) TARGET(POP_JUMP_IF_TRUE) w = POP(); if (w == Py_False) { Py_DECREF(w); FAST_DISPATCH(); } if (w == Py_True) { Py_DECREF(w); JUMPTO(oparg); // this will set the next instruction! FAST_DISPATCH(); Sunday, March 27, 2011
  • 34. JUMPTO • first_instr code • offset #define JUMPTO(x) (next_instr = first_instr + (x)) • first_instr first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code); • co_code Sunday, March 27, 2011
  • 35. CALL_FUNCTION • stack pointer call_function TARGET(CALL_FUNCTION) { PyObject **sp; PCALL(PCALL_ALL); // for profiling sp = stack_pointer; x = call_function(&sp, oparg); stack_pointer = sp; PUSH(x); if (x != NULL) DISPATCH(); break; } Sunday, March 27, 2011
  • 36. call_function • oparg • 16bit ( static PyObject * call_function(PyObject ***pp_stack, int oparg) { int na = oparg & 0xff; int nk = (oparg>>8) & 0xff; int n = na + 2 * nk; PyObject **pfunc = (*pp_stack) - n - 1; PyObject *func = *pfunc; PyObject *x, *w; Sunday, March 27, 2011
  • 37. call_function (contd.) • • CPyFunction PyObject *callargs; callargs = load_args(pp_stack, na); READ_TIMESTAMP(*pintr0); C_TRACE(x, PyCFunction_Call(func,callargs,NULL)); READ_TIMESTAMP(*pintr1); Py_XDECREF(callargs); Sunday, March 27, 2011
  • 38. TIME UP • Sunday, March 27, 2011