- File:
-
- 1 edited
-
doc/papers/concurrency/Paper.tex (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/concurrency/Paper.tex
r1e5d0f0c ra927662 654 654 \centering 655 655 \newbox\myboxA 656 % \begin{lrbox}{\myboxA}657 % \begin{cfa}[aboveskip=0pt,belowskip=0pt]658 % `int fn1, fn2, state = 1;` // single global variables659 % int fib() {660 % int fn;661 % `switch ( state )` { // explicit execution state662 % case 1: fn = 0; fn1 = fn; state = 2; break;663 % case 2: fn = 1; fn2 = fn1; fn1 = fn; state = 3; break;664 % case 3: fn = fn1 + fn2; fn2 = fn1; fn1 = fn; break;665 % }666 % return fn;667 % }668 % int main() {669 %670 % for ( int i = 0; i < 10; i += 1 ) {671 % printf( "%d\n", fib() );672 % }673 % }674 % \end{cfa}675 % \end{lrbox}676 656 \begin{lrbox}{\myboxA} 677 657 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 678 #define FIB_INIT { 0, 1 } 679 typedef struct { int fn1, fn; } Fib; 658 `int fn1, fn2, state = 1;` // single global variables 659 int fib() { 660 int fn; 661 `switch ( state )` { // explicit execution state 662 case 1: fn = 0; fn1 = fn; state = 2; break; 663 case 2: fn = 1; fn2 = fn1; fn1 = fn; state = 3; break; 664 case 3: fn = fn1 + fn2; fn2 = fn1; fn1 = fn; break; 665 } 666 return fn; 667 } 668 int main() { 669 670 for ( int i = 0; i < 10; i += 1 ) { 671 printf( "%d\n", fib() ); 672 } 673 } 674 \end{cfa} 675 \end{lrbox} 676 677 \newbox\myboxB 678 \begin{lrbox}{\myboxB} 679 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 680 #define FIB_INIT `{ 0, 1 }` 681 typedef struct { int fn2, fn1; } Fib; 680 682 int fib( Fib * f ) { 681 683 682 int ret = f->fn1; 683 f->fn1 = f->fn; 684 f->fn = ret + f->fn; 684 int ret = f->fn2; 685 int fn = f->fn1 + f->fn2; 686 f->fn2 = f->fn1; f->fn1 = fn; 687 685 688 return ret; 686 689 } 687 688 689 690 690 int main() { 691 691 Fib f1 = FIB_INIT, f2 = FIB_INIT; 692 692 for ( int i = 0; i < 10; i += 1 ) { 693 printf( "%d %d\n", 694 fib( &f1 ), fib( &f2 ) ); 693 printf( "%d %d\n", fib( &fn1 ), fib( &f2 ) ); 695 694 } 696 695 } … … 698 697 \end{lrbox} 699 698 699 \subfloat[3 states: global variables]{\label{f:GlobalVariables}\usebox\myboxA} 700 \qquad 701 \subfloat[1 state: encapsulated variables]{\label{f:ExternalState}\usebox\myboxB} 702 \caption{C fibonacci fsm} 703 \label{f:C-fibonacci} 704 705 \bigskip 706 707 \newbox\myboxA 708 \begin{lrbox}{\myboxA} 709 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 710 `coroutine` Fib { int fn; }; 711 void main( Fib & fib ) with( fib ) { 712 fn = 0; int fn1 = fn; `suspend()`; 713 fn = 1; int fn2 = fn1; fn1 = fn; `suspend()`; 714 for () { 715 fn = fn1 + fn2; fn2 = fn1; fn1 = fn; `suspend()`; } 716 } 717 int next( Fib & fib ) with( fib ) { `resume( fib );` return fn; } 718 int main() { 719 Fib f1, f2; 720 for ( 10 ) 721 sout | next( f1 ) | next( f2 ); 722 } 723 \end{cfa} 724 \end{lrbox} 700 725 \newbox\myboxB 701 726 \begin{lrbox}{\myboxB} 702 \begin{cfa}[aboveskip=0pt,belowskip=0pt]703 `coroutine` Fib { int fn1; };704 void main( Fib & fib ) with( fib ) {705 int fn;706 [fn1, fn] = [0, 1];707 for () {708 `suspend();`709 [fn1, fn] = [fn, fn1 + fn];710 }711 }712 int ?()( Fib & fib ) with( fib ) {713 `resume( fib );` return fn1;714 }715 int main() {716 Fib f1, f2;717 for ( 10 ) {718 sout | f1() | f2();719 }720 721 722 \end{cfa}723 \end{lrbox}724 725 \newbox\myboxC726 \begin{lrbox}{\myboxC}727 727 \begin{python}[aboveskip=0pt,belowskip=0pt] 728 728 729 def Fib(): 730 731 fn1, fn = 0, 1 732 while True: 733 `yield fn1` 734 fn1, fn = fn, fn1 + fn 735 736 737 // next prewritten 738 739 740 f1 = Fib() 741 f2 = Fib() 729 def Fibonacci(): 730 fn = 0; fn1 = fn; `yield fn` # suspend 731 fn = 1; fn2 = fn1; fn1 = fn; `yield fn` 732 while True: 733 fn = fn1 + fn2; fn2 = fn1; fn1 = fn; `yield fn` 734 735 736 f1 = Fibonacci() 737 f2 = Fibonacci() 742 738 for i in range( 10 ): 743 print( next( f1 ), next( f2 ) ) 744 745 739 print( `next( f1 )`, `next( f2 )` ) # resume 746 740 747 741 \end{python} 748 742 \end{lrbox} 749 750 \subfloat[C]{\label{f:GlobalVariables}\usebox\myboxA} 751 \hspace{3pt} 752 \vrule 753 \hspace{3pt} 754 \subfloat[\CFA]{\label{f:ExternalState}\usebox\myboxB} 755 \hspace{3pt} 756 \vrule 757 \hspace{3pt} 758 \subfloat[Python]{\label{f:ExternalState}\usebox\myboxC} 759 \caption{Fibonacci Generator} 760 \label{f:C-fibonacci} 761 762 % \bigskip 763 % 764 % \newbox\myboxA 765 % \begin{lrbox}{\myboxA} 766 % \begin{cfa}[aboveskip=0pt,belowskip=0pt] 767 % `coroutine` Fib { int fn; }; 768 % void main( Fib & fib ) with( fib ) { 769 % fn = 0; int fn1 = fn; `suspend()`; 770 % fn = 1; int fn2 = fn1; fn1 = fn; `suspend()`; 771 % for () { 772 % fn = fn1 + fn2; fn2 = fn1; fn1 = fn; `suspend()`; } 773 % } 774 % int next( Fib & fib ) with( fib ) { `resume( fib );` return fn; } 775 % int main() { 776 % Fib f1, f2; 777 % for ( 10 ) 778 % sout | next( f1 ) | next( f2 ); 779 % } 780 % \end{cfa} 781 % \end{lrbox} 782 % \newbox\myboxB 783 % \begin{lrbox}{\myboxB} 784 % \begin{python}[aboveskip=0pt,belowskip=0pt] 785 % 786 % def Fibonacci(): 787 % fn = 0; fn1 = fn; `yield fn` # suspend 788 % fn = 1; fn2 = fn1; fn1 = fn; `yield fn` 789 % while True: 790 % fn = fn1 + fn2; fn2 = fn1; fn1 = fn; `yield fn` 791 % 792 % 793 % f1 = Fibonacci() 794 % f2 = Fibonacci() 795 % for i in range( 10 ): 796 % print( `next( f1 )`, `next( f2 )` ) # resume 797 % 798 % \end{python} 799 % \end{lrbox} 800 % \subfloat[\CFA]{\label{f:Coroutine3States}\usebox\myboxA} 801 % \qquad 802 % \subfloat[Python]{\label{f:Coroutine1State}\usebox\myboxB} 803 % \caption{Fibonacci input coroutine, 3 states, internal variables} 804 % \label{f:cfa-fibonacci} 743 \subfloat[\CFA]{\label{f:Coroutine3States}\usebox\myboxA} 744 \qquad 745 \subfloat[Python]{\label{f:Coroutine1State}\usebox\myboxB} 746 \caption{Fibonacci input coroutine, 3 states, internal variables} 747 \label{f:cfa-fibonacci} 805 748 \end{figure} 806 749
Note:
See TracChangeset
for help on using the changeset viewer.