[25465] 2016-09-08_用Python实现Python解释器

文档创建者:s7ckTeam
浏览次数:0
最后更新:2025-01-19
2016-09-08_用Python实现Python解释器   P y t h o n     P y t h o n     q i n g y u n h a   L i n u x   2 0 1 6 - 0 9 - 0 8 B y t e r u n   P y t h o n     B y t e r u n B y t e r u n     P y t h o n   便   3     B y t e r u n       P y t h o n     3 .   V i r t u a l M a c h i n e I n t e p r t e r F r a m e F r a m e F u n c t i o n F u n c t i o n F r a m e B l o c k V i r t u a l M a c h i n e V i r t u a l M a c h i n e V i r t u a l M a c h i n e r u n _ c o d e 1 .   c l a s s   V i r t u a l M a c h i n e E r r o r ( E x c e p t i o n ) : 2 .           p a s s 4 .   c l a s s   V i r t u a l M a c h i n e ( o b j e c t ) :
1 0 .   1 6 .     P y t h o n   5 .           d e f   _ _ i n i t _ _ ( s e l f ) : 6 .                   s e l f . f r a m e s   =   [ ]       #   T h e   c a l l   s t a c k   o f   f r a m e s . 7 .                   s e l f . f r a m e   =   N o n e     #   T h e   c u r r e n t   f r a m e . 8 .                   s e l f . r e t u r n _ v a l u e   =   N o n e 9 .                   s e l f . l a s t _ e x c e p t i o n   =   N o n e 1 1 .           d e f   r u n _ c o d e ( s e l f ,   c o d e ,   g l o b a l _ n a m e s = N o n e ,   l o c a l _ n a m e s = N o n e ) : 1 2 .                   " " "   A n   e n t r y   p o i n t   t o   e x e c u t e   c o d e   u s i n g   t h e   v i r t u a l   m a c h i n e . " " " 1 3 .                   f r a m e   =   s e l f . m a k e _ f r a m e ( c o d e ,   g l o b a l _ n a m e s = g l o b a l _ n a m e s ,   1 4 .                                                                   l o c a l _ n a m e s = l o c a l _ n a m e s ) 1 5 .                   s e l f . r u n _ f r a m e ( f r a m e ) F r a m e F r a m e 1 .   c l a s s   F r a m e ( o b j e c t ) : 2 .           d e f   _ _ i n i t _ _ ( s e l f ,   c o d e _ o b j ,   g l o b a l _ n a m e s ,   l o c a l _ n a m e s ,   p r e v _ f r a m e ) : 3 .                   s e l f . c o d e _ o b j   =   c o d e _ o b j 4 .                   s e l f . g l o b a l _ n a m e s   =   g l o b a l _ n a m e s 5 .                   s e l f . l o c a l _ n a m e s   =   l o c a l _ n a m e s 6 .                   s e l f . p r e v _ f r a m e   =   p r e v _ f r a m e 7 .                   s e l f . s t a c k   =   [ ] 8 .                   i f   p r e v _ f r a m e : 9 .                           s e l f . b u i l t i n _ n a m e s   =   p r e v _ f r a m e . b u i l t i n _ n a m e s 1 0 .                   e l s e : 1 1 .                           s e l f . b u i l t i n _ n a m e s   =   l o c a l _ n a m e s [ ' _ _ b u i l t i n s _ _ ' ]
1 4 .     3   3 .   2 1 .   1 2 .                           i f   h a s a t t r ( s e l f . b u i l t i n _ n a m e s ,   ' _ _ d i c t _ _ ' ) : 1 3 .                                   s e l f . b u i l t i n _ n a m e s   =   s e l f . b u i l t i n _ n a m e s . _ _ d i c t _ _ 1 5 .                   s e l f . l a s t _ i n s t r u c t i o n   =   0 1 6 .                   s e l f . b l o c k _ s t a c k   =   [ ] r u n _ f r a m e 1 .   c l a s s   V i r t u a l M a c h i n e ( o b j e c t ) : 2 .           [ . . .     . . . ] 4 .           #   F r a m e   m a n i p u l a t i o n 5 .           d e f   m a k e _ f r a m e ( s e l f ,   c o d e ,   c a l l a r g s = { } ,   g l o b a l _ n a m e s = N o n e ,   l o c a l _ n a m e s = N o n e ) : 6 .                   i f   g l o b a l _ n a m e s   i s   n o t   N o n e   a n d   l o c a l _ n a m e s   i s   n o t   N o n e : 7 .                           l o c a l _ n a m e s   =   g l o b a l _ n a m e s 8 .                   e l i f   s e l f . f r a m e s : 9 .                           g l o b a l _ n a m e s   =   s e l f . f r a m e . g l o b a l _ n a m e s 1 0 .                           l o c a l _ n a m e s   =   { } 1 1 .                   e l s e : 1 2 .                           g l o b a l _ n a m e s   =   l o c a l _ n a m e s   =   { 1 3 .                                   ' _ _ b u i l t i n s _ _ ' :   _ _ b u i l t i n s _ _ , 1 4 .                                   ' _ _ n a m e _ _ ' :   ' _ _ m a i n _ _ ' , 1 5 .                                   ' _ _ d o c _ _ ' :   N o n e , 1 6 .                                   ' _ _ p a c k a g e _ _ ' :   N o n e , 1 7 .                           } 1 8 .                   l o c a l _ n a m e s . u p d a t e ( c a l l a r g s ) 1 9 .                   f r a m e   =   F r a m e ( c o d e ,   g l o b a l _ n a m e s ,   l o c a l _ n a m e s ,   s e l f . f r a m e ) 2 0 .                   r e t u r n   f r a m e
2 5 .   3 2 .               2 2 .           d e f   p u s h _ f r a m e ( s e l f ,   f r a m e ) : 2 3 .                   s e l f . f r a m e s . a p p e n d ( f r a m e ) 2 4 .                   s e l f . f r a m e   =   f r a m e 2 6 .           d e f   p o p _ f r a m e ( s e l f ) : 2 7 .                   s e l f . f r a m e s . p o p ( ) 2 8 .                   i f   s e l f . f r a m e s : 2 9 .                           s e l f . f r a m e   =   s e l f . f r a m e s [ - 1 ] 3 0 .                   e l s e : 3 1 .                           s e l f . f r a m e   =   N o n e 3 3 .           d e f   r u n _ f r a m e ( s e l f ) : 3 4 .                   p a s s 3 5 .                   #   w e ' l l   c o m e   b a c k   t o   t h i s   s h o r t l y F u n c t i o n F u n c t i o n _ _ c a l l _ _ F r a m e 1 .   c l a s s   F u n c t i o n ( o b j e c t ) : 2 .           " " " 3 .           C r e a t e   a   r e a l i s t i c   f u n c t i o n   o b j e c t ,   d e f i n i n g   t h e   t h i n g s   t h e   i n t e r p r e t e r   e x p e c t s . 4 .           " " " 5 .           _ _ s l o t s _ _   =   [ 6 .                   ' f u n c _ c o d e ' ,   ' f u n c _ n a m e ' ,   ' f u n c _ d e f a u l t s ' ,   ' f u n c _ g l o b a l s ' , 7 .                   ' f u n c _ l o c a l s ' ,   ' f u n c _ d i c t ' ,   ' f u n c _ c l o s u r e ' , 8 .                   ' _ _ n a m e _ _ ' ,   ' _ _ d i c t _ _ ' ,   ' _ _ d o c _ _ ' , 9 .                   ' _ v m ' ,   ' _ f u n c ' ,
1 1 .   2 3 .   3 1 .   1 0 .           ] 1 2 .           d e f   _ _ i n i t _ _ ( s e l f ,   n a m e ,   c o d e ,   g l o b s ,   d e f a u l t s ,   c l o s u r e ,   v m ) : 1 3 .                   " " " Y o u   d o n ' t   n e e d   t o   f o l l o w   t h i s   c l o s e l y   t o   u n d e r s t a n d   t h e   i n t e r p r e t e r . " " " 1 4 .                   s e l f . _ v m   =   v m 1 5 .                   s e l f . f u n c _ c o d e   =   c o d e 1 6 .                   s e l f . f u n c _ n a m e   =   s e l f . _ _ n a m e _ _   =   n a m e   o r   c o d e . c o _ n a m e 1 7 .                   s e l f . f u n c _ d e f a u l t s   =   t u p l e ( d e f a u l t s ) 1 8 .                   s e l f . f u n c _ g l o b a l s   =   g l o b s 1 9 .                   s e l f . f u n c _ l o c a l s   =   s e l f . _ v m . f r a m e . f _ l o c a l s 2 0 .                   s e l f . _ _ d i c t _ _   =   { } 2 1 .                   s e l f . f u n c _ c l o s u r e   =   c l o s u r e 2 2 .                   s e l f . _ _ d o c _ _   =   c o d e . c o _ c o n s t s [ 0 ]   i f   c o d e . c o _ c o n s t s   e l s e   N o n e 2 4 .                   #   S o m e t i m e s ,   w e   n e e d   a   r e a l   P y t h o n   f u n c t i o n .     T h i s   i s   f o r   t h a t . 2 5 .                   k w   =   { 2 6 .                           ' a r g d e f s ' :   s e l f . f u n c _ d e f a u l t s , 2 7 .                   } 2 8 .                   i f   c l o s u r e : 2 9 .                           k w [ ' c l o s u r e ' ]   =   t u p l e ( m a k e _ c e l l ( 0 )   f o r   _   i n   c l o s u r e ) 3 0 .                   s e l f . _ f u n c   =   t y p e s . F u n c t i o n T y p e ( c o d e ,   g l o b s ,   * * k w ) 3 2 .           d e f   _ _ c a l l _ _ ( s e l f ,   * a r g s ,   * * k w a r g s ) : 3 3 .                   " " " W h e n   c a l l i n g   a   F u n c t i o n ,   m a k e   a   n e w   f r a m e   a n d   r u n   i t . " " " 3 4 .                   c a l l a r g s   =   i n s p e c t . g e t c a l l a r g s ( s e l f . _ f u n c ,   * a r g s ,   * * k w a r g s ) 3 5 .                   #   U s e   c a l l a r g s   t o   p r o v i d e   a   m a p p i n g   o f   a r g u m e n t s :   v a l u e s   t o   p a s s   i n t o   t h e   n e w   3 6 .                   #   f r a m e . 3 7 .                   f r a m e   =   s e l f . _ v m . m a k e _ f r a m e ( 3 8 .                           s e l f . f u n c _ c o d e ,   c a l l a r g s ,   s e l f . f u n c _ g l o b a l s ,   { } 3 9 .                   ) 4 0 .                   r e t u r n   s e l f . _ v m . r u n _ f r a m e ( f r a m e )
4 1 .   3 .   7 .   1 0 .   1 3 .   4 0 .                   r e t u r n   s e l f . _ v m . r u n _ f r a m e ( f r a m e ) 4 2 .   d e f   m a k e _ c e l l ( v a l u e ) : 4 3 .           " " " C r e a t e   a   r e a l   P y t h o n   c l o s u r e   a n d   g r a b   a   c e l l . " " " 4 4 .           #   T h a n k s   t o   A l e x   G a y n o r   f o r   h e l p   w i t h   t h i s   b i t   o f   t w i s t i n e s s . 4 5 .           f n   =   ( l a m b d a   x :   l a m b d a :   x ) ( v a l u e ) 4 6 .           r e t u r n   f n . _ _ c l o s u r e _ _ [ 0 ] V i r t u a l M a c h i n e P O P _ T O P L O A D _ F A S T 1 .   c l a s s   V i r t u a l M a c h i n e ( o b j e c t ) : 2 .           [ . . .     . . . ] 4 .           #   D a t a   s t a c k   m a n i p u l a t i o n 5 .           d e f   t o p ( s e l f ) : 6 .                   r e t u r n   s e l f . f r a m e . s t a c k [ - 1 ] 8 .           d e f   p o p ( s e l f ) : 9 .                   r e t u r n   s e l f . f r a m e . s t a c k . p o p ( ) 1 1 .           d e f   p u s h ( s e l f ,   * v a l s ) : 1 2 .                   s e l f . f r a m e . s t a c k . e x t e n d ( v a l s ) 1 4 .           d e f   p o p n ( s e l f ,   n ) : 1 5 .                   " " " P o p   a   n u m b e r   o f   v a l u e s   f r o m   t h e   v a l u e   s t a c k . 1 6 .                   A   l i s t   o f   ` n `   v a l u e s   i s   r e t u r n e d ,   t h e   d e e p e s t   v a l u e   f i r s t . 1 7 .                   " " " 1 8 .                   i f   n :
  3   9   3 .   1 8 .                   i f   n : 1 9 .                           r e t   =   s e l f . f r a m e . s t a c k [ - n : ] 2 0 .                           s e l f . f r a m e . s t a c k [ - n : ]   =   [ ] 2 1 .                           r e t u r n   r e t 2 2 .                   e l s e : 2 3 .                           r e t u r n   [ ] p a r s e _ b y t e _ a n d _ a r g s l a s t _ i n s t r u c t i o n P O P _ J U M P _ I F _ F A L S E B U I L D _ L I S T L O A D _ C O N S T d i s d i s . h a s n a m e L O A D _ N A M E I M P O R T _ N A M E L O A D _ G L O B A L 1 .   c l a s s   V i r t u a l M a c h i n e ( o b j e c t ) : 2 .           [ . . .     . . . ] 4 .           d e f   p a r s e _ b y t e _ a n d _ a r g s ( s e l f ) : 5 .                   f   =   s e l f . f r a m e 6 .                   o p o f f s e t   =   f . l a s t _ i n s t r u c t i o n 7 .                   b y t e C o d e   =   f . c o d e _ o b j . c o _ c o d e [ o p o f f s e t ]
2 8 .     C P y t h o n     s w i t c h     1 5 0 0     P y t h o n 8 .                   f . l a s t _ i n s t r u c t i o n   + =   1 9 .                   b y t e _ n a m e   =   d i s . o p n a m e [ b y t e C o d e ] 1 0 .                   i f   b y t e C o d e   > =   d i s . H A V E _ A R G U M E N T : 1 1 .                           #   i n d e x   i n t o   t h e   b y t e c o d e 1 2 .                           a r g   =   f . c o d e _ o b j . c o _ c o d e [ f . l a s t _ i n s t r u c t i o n : f . l a s t _ i n s t r u c t i o n + 2 ]     1 3 .                           f . l a s t _ i n s t r u c t i o n   + =   2       #   a d v a n c e   t h e   i n s t r u c t i o n   p o i n t e r 1 4 .                           a r g _ v a l   =   a r g [ 0 ]   +   ( a r g [ 1 ]   *   2 5 6 ) 1 5 .                           i f   b y t e C o d e   i n   d i s . h a s c o n s t :       #   L o o k   u p   a   c o n s t a n t 1 6 .                                   a r g   =   f . c o d e _ o b j . c o _ c o n s t s [ a r g _ v a l ] 1 7 .                           e l i f   b y t e C o d e   i n   d i s . h a s n a m e :     #   L o o k   u p   a   n a m e 1 8 .                                   a r g   =   f . c o d e _ o b j . c o _ n a m e s [ a r g _ v a l ] 1 9 .                           e l i f   b y t e C o d e   i n   d i s . h a s l o c a l :   #   L o o k   u p   a   l o c a l   n a m e 2 0 .                                   a r g   =   f . c o d e _ o b j . c o _ v a r n a m e s [ a r g _ v a l ] 2 1 .                           e l i f   b y t e C o d e   i n   d i s . h a s j r e l :     #   C a l c u l a t e   a   r e l a t i v e   j u m p 2 2 .                                   a r g   =   f . l a s t _ i n s t r u c t i o n   +   a r g _ v a l 2 3 .                           e l s e : 2 4 .                                   a r g   =   a r g _ v a l 2 5 .                           a r g u m e n t   =   [ a r g ] 2 6 .                   e l s e : 2 7 .                           a r g u m e n t   =   [ ] 2 9 .                   r e t u r n   b y t e _ n a m e ,   a r g u m e n t d i s p a t c h g e t a t t r F O O _ B A R b y t e _ F O O _ B A R N o n e
, 3 .   7 .   w h y w h y 1 .   c l a s s   V i r t u a l M a c h i n e ( o b j e c t ) : 2 .           [ . . .     . . . ] 4 .           d e f   d i s p a t c h ( s e l f ,   b y t e _ n a m e ,   a r g u m e n t ) : 5 .                   " " "   D i s p a t c h   b y   b y t e n a m e   t o   t h e   c o r r e s p o n d i n g   m e t h o d s . 6 .                   E x c e p t i o n s   a r e   c a u g h t   a n d   s e t   o n   t h e   v i r t u a l   m a c h i n e . " " " 8 .                   #   W h e n   l a t e r   u n w i n d i n g   t h e   b l o c k   s t a c k , 9 .                   #   w e   n e e d   t o   k e e p   t r a c k   o f   w h y   w e   a r e   d o i n g   i t . 1 0 .                   w h y   =   N o n e 1 1 .                   t r y : 1 2 .                           b y t e c o d e _ f n   =   g e t a t t r ( s e l f ,   ' b y t e _ % s '   %   b y t e _ n a m e ,   N o n e ) 1 3 .                           i f   b y t e c o d e _ f n   i s   N o n e : 1 4 .                                   i f   b y t e _ n a m e . s t a r t s w i t h ( ' U N A R Y _ ' ) : 1 5 .                                           s e l f . u n a r y O p e r a t o r ( b y t e _ n a m e [ 6 : ] ) 1 6 .                                   e l i f   b y t e _ n a m e . s t a r t s w i t h ( ' B I N A R Y _ ' ) : 1 7 .                                           s e l f . b i n a r y O p e r a t o r ( b y t e _ n a m e [ 7 : ] ) 1 8 .                                   e l s e : 1 9 .                                           r a i s e   V i r t u a l M a c h i n e E r r o r ( 2 0 .                                                   " u n s u p p o r t e d   b y t e c o d e   t y p e :   % s "   %   b y t e _ n a m e 2 1 .                                           ) 2 2 .                           e l s e : 2 3 .                                   w h y   =   b y t e c o d e _ f n ( * a r g u m e n t ) 2 4 .                   e x c e p t : 2 5 .                           #   d e a l   w i t h   e x c e p t i o n s   e n c o u n t e r e d   w h i l e   e x e c u t i n g   t h e   o p . 2 6 .                           s e l f . l a s t _ e x c e p t i o n   =   s y s . e x c _ i n f o ( ) [ : 2 ]   +   ( N o n e , )                         w h y   =   ' e x c e p t i o n '
2 8 .   3 0 .   3 8 .   4 0 .   4 4 .   4 7 .   4 9 .   5 5 .   2 7 .                           w h y   =   ' e x c e p t i o n ' 2 9 .                   r e t u r n   w h y 3 1 .           d e f   r u n _ f r a m e ( s e l f ,   f r a m e ) : 3 2 .                   " " " R u n   a   f r a m e   u n t i l   i t   r e t u r n s   ( s o m e h o w ) . 3 3 .                   E x c e p t i o n s   a r e   r a i s e d ,   t h e   r e t u r n   v a l u e   i s   r e t u r n e d . 3 4 .                   " " " 3 5 .                   s e l f . p u s h _ f r a m e ( f r a m e ) 3 6 .                   w h i l e   T r u e : 3 7 .                           b y t e _ n a m e ,   a r g u m e n t s   =   s e l f . p a r s e _ b y t e _ a n d _ a r g s ( ) 3 9 .                           w h y   =   s e l f . d i s p a t c h ( b y t e _ n a m e ,   a r g u m e n t s ) 4 1 .                           #   D e a l   w i t h   a n y   b l o c k   m a n a g e m e n t   w e   n e e d   t o   d o 4 2 .                           w h i l e   w h y   a n d   f r a m e . b l o c k _ s t a c k : 4 3 .                                   w h y   =   s e l f . m a n a g e _ b l o c k _ s t a c k ( w h y ) 4 5 .                           i f   w h y : 4 6 .                                   b r e a k 4 8 .                   s e l f . p o p _ f r a m e ( ) 5 0 .                   i f   w h y   = =   ' e x c e p t i o n ' : 5 1 .                           e x c ,   v a l ,   t b   =   s e l f . l a s t _ e x c e p t i o n 5 2 .                           e   =   e x c ( v a l ) 5 3 .                           e . _ _ t r a c e b a c k _ _   =   t b 5 4 .                           r a i s e   e 5 6 .                   r e t u r n   s e l f . r e t u r n _ v a l u e
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则