From 1ffc88f530b71d735cd0e85e97f608645a945b1b Mon Sep 17 00:00:00 2001 From: Simon Kellet Date: Sat, 7 Mar 2026 16:31:25 +0000 Subject: [PATCH] git ignore: --- .gitignore | 3 + cm | Bin 471680 -> 510304 bytes main.odin | 2 +- parse.odin | 22 -- test/.DS_Store | Bin 0 -> 8196 bytes test/website/.DS_Store | Bin 8196 -> 10244 bytes test/website/HTML/.DS_Store | Bin 0 -> 10244 bytes test/website/HTML/A5Week1.html | 279 ++++++++++++++++++++++++++ test/website/HTML/A5Week2.html | 228 +++++++++++++++++++++ test/website/HTML/A5Week3.html | 155 ++++++++++++++ test/website/HTML/A5Week4.html | 187 +++++++++++++++++ test/website/HTML/A5Week5.html | 4 + test/website/HTML/A5Week8.html | 1 + test/website/HTML/css/style.css | 2 +- test/website/HTML/inner/inner_test.md | 3 + test/website/MARKDOWN/.DS_Store | Bin 0 -> 8196 bytes test/website/MARKDOWN/A5Week1.md | 65 ++++-- test/website/MARKDOWN/A5Week2.md | 40 ++-- test/website/MARKDOWN/A5Week3.md | 80 +++----- test/website/MARKDOWN/A5Week4.md | 53 +++-- test/website/MARKDOWN/A5Week8.md | 1 - 21 files changed, 990 insertions(+), 135 deletions(-) create mode 100644 .gitignore create mode 100644 test/.DS_Store create mode 100644 test/website/HTML/.DS_Store create mode 100644 test/website/HTML/A5Week1.html create mode 100644 test/website/HTML/A5Week2.html create mode 100644 test/website/HTML/A5Week3.html create mode 100644 test/website/HTML/A5Week4.html create mode 100644 test/website/HTML/A5Week5.html create mode 100644 test/website/HTML/A5Week8.html create mode 100644 test/website/HTML/inner/inner_test.md create mode 100644 test/website/MARKDOWN/.DS_Store diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bbf44ab --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +cm +.DS_Store +./test/* diff --git a/cm b/cm index 0ad249f873e8c057fa5f8f235a5aeb440be99ca3..c1f44fdbe55a6dfb843353d9989d8b380776775a 100755 GIT binary patch delta 118615 zcmb4s34BdQ`~R7lljJ5r5LpOW1X++EBqGR7f)GoHt)-=v*3z^TEv@vGloq8W*Huqj zEiLbBYm3slO&3yoDWY0hT5cBHB*a=AE%|@voO`dd@9+Qr{Qf?lgGuI3eVZWW1gAC~xmSG|fN|{fg0yvcb?cRkd~y0ZmGr1k6UeQew>! zsm+|VCX=fc_^ER*j}U8#2oEqFGCK8lw#u@gPaAoLSR1S1eCQ!-7j+0X9ktF=GYb?i zLjvdj3d-`|6W<%1r35Z1WKCB^DKzxsrQGF;lHe@gUt9byuMo6*nDJkf&b!)pvX^4%>~Agbh-rMiZTTnO*Sk-DJ^kIPT{qwV z-TI|Rck#>j+ZXQa0N=nyt8>|J_Dg*Jt?&#v=sz?cpt~ zn&)mG7f5y;E&Y+T<9+LB=Z|b)>!Khz1_hntdKBU$g-EmZH7MwkNsik)IgSS>;Ia%Hv~f!InZZd; z50tw@yLB1-#Ql8JCcB@amH8{0&2C~t1s^+%wlrZ0^mGF@pRXK7)eYDdesvhV*N~0# z-2Ae#qWjDApdp*U2ali$jaZhKPP?y{ZAT;aGn1ulCX|*nW~~_Sq$AtK-x@|!o3eiD zufy01`Y@3NQ)yE+f}b2l?flvLFul_Uz81$=MO!4G$nlC+G1jbAjyG$6Br&S-XKBK# z2c!6Atd{}Z#78&dB559&u>xkSgc*+ldPy@tpHGHXo3Sc`p$~j%cK{0zbI^P`0L^cr zIV6zvGMbzC(D*OBg`I_H|HrU?82;>yb5#5g(6W+XPNhDgr`KRG^eIN*ZeP)j=ho3`A2HRaOfxD&q;uTQ z?~h@|EhS?7sk-?dC;pn&Y}5Vx0E&N3ZC-G3wo-fvo+_z0W}Azv;P2J&`x#$8QL{e+j&Q8LlN}t;$Q@SU{d_3TXD_YfPSbjKYj0OS| zQ>I_=TGOJT0)4|Z%IL|qA|&K~{>V*#O&hTZ8gpt+h2|PVb4_ULi!7kv!f2)VV!YEn z(3TyHI7UN*&{#DzRs$w3gE7g_l>#s_6O7EpH4|;nNX=~gLL=1>vI;_0LC7jUd5>Rc z){!cbqn}Y$T!BI^Lm@Q~xElOcfrcaAJXNzpvNA|^6_V9Lva67+7LwT^S=ne1hA@}2 z6|H=rS*yqf0))zHjITiU&YO;CC3F7<07X0>y6$DmiW$r!JWY*n)l?4y-s_tEw| zQkatguCHlS-b9SyCmyHXO-1jAeIlKGqR=N2eWLnk^ByhCsX*}f;4ZCgDkiu&@%0DM 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�UpLUjwEmc0yW3128i7}c9XD1RY@Tr?6WK3OOp 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ℑU2`l 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 delta 88732 zcma%k30zdw`}dr4&oHB?s0b)KD99o%AiKZ-uDIiZJ1XU#mX?;J;F4OFGF|nQnx>Yy zq>_}QS&CY@D{8ryEG`4CsioJA_j~T08TkGF@B9C}em)cDJm=ZZbJqLZTj{5M`8T`^ zK5Sg9*Zs%8V!e4)61~{ie7SSul4g1xLF?P%KloSDOpYYUu6?{T@cBU+7E? zCGmF+d0T5NXrMKs&WqRUedGtkzwz$5TB9{yYur6o4y3U{2USA82Gteo<%u-8g$>-$ zCLLg%WWx}DobdCLPttJLh6ikH-_e>;*AyybOl~E)H8MGA0!&)F&Ln3_DNXE9qaEs` zlel@U-b*f){2S}KYD8Uat-7xALn)bd?J7sIUR2jpp3A!A<=Yq++mKKf|MGWgb)mUk zdjV;WriP*byw9jk7iFt|HrGjKLL)%BrsDUblgjK7~w z-?2lVq|;EgLO@$|q+QuOQF^l@9bj)i-Vs!<3Fw`U^oAXJp%V>Y{sQ`<6aCc=J=~cF zv5F)>A9SYe?9i5706i|CeY()TcIY<(x>Z0+y3p4ezRcaf86Ih}ER8ICnR{RpZ`zo) zh*<>Hb;`k{Qjh#3wfqmtUbgbzDEryUcTsL`D_8QVjcJ$x_yxuTZTN=9G@9i@Rm;`J z^bbOblclH$ed21#IEaehFH~1D-^9$$9d*k}C6i*Tlb=~G8N3W2`>!3M&1WaEOG8~%^#9__S%x#xwu+P;qs0 zR?O~4p)|4udy}0NrQb#A2T|%8gwkiC^ivS)Ax)1X+&P$;S+)Ru8O%bYZU7w*W#p|Mdc zzY+=XO;3PdM6x3qI4G7Mj{? zr85}+BgSxXXS>FA;`rh&0RJe!-*(ZutiTu)$9Y$PX9)1_uIv|0jnp`^wZdHq5o+9W zSIR2}DiyZ|I@IU@Y|B^O*jH*i6d1e3@!s9R;ZUyU?b421K1H8I@nvX0N>FF@QYb2q!#6e6 zZ2^u9hLZJ$u#v2eKzMTqE7lNB#`D;rKsenH{00qW-`1$*JRI;Lfb&+v*;RpFV!Ra3 zT}A-hOn}>tKpeEI24`co#t)N2JU^Wcgw2>^Ef2EU$3$8YN_gHV79qS{VyuieTOT!6 ztisz*8Y|_GGL?!anGSEa6?60NqYyuKd22_5-9HV$u6Q&nP}Nh#WW5IXLIHpGHPQ7d zew_sFHwJJw0XL0tz}qG8TVny=P#FQF68Ma1fbSPVKAQ%(@JgZa=LEC$wu|PK`z}iP?cPeo{oXZR0XqNv9d=Q} z{u9`TTofaL4-W(T5U>x|U_TJE+war0J}WemL~fY@nL7md;tV^uT_WH6F2Iuo`0BfM z@c2Z&|2=>s1i17)c2yJkNut@>+@@elh-?m#Eo(&H5%b>lnd~Byp28=^xmr9F8n-3# zh3|u1u0YuIKAd(;OdRjeVw;4g3XF)*@Yz^RZu)?(&uq3#17o<{o(;NkF$31iW7mO? z(&Idhae)zmyEk8`53uEGK6;cbWWZQ7mlaAa1F(?IV?G+MJ&8OU751x`Ec55F5)J%E zBF~x+@InE8cfK|q6c`m)I<3C4NH}*!eWiR_Po-i;Pe)gD71(coz<$@5e3Hm}F94G| z0{rFzIKclO7}8@QD;AC`fCJ1{slGP57{E>fJ3|e-&xAMHFM?lgQ5a(UkkwN|xxfey zczp!U?!d5g_z1HeYYP;9eK8Cy@gd7R*6o#$ zwu%+Dti<|XxwW%m-O*XOak#Tm`KXR!eNsm$ebh}Ud(ur&wJ~?#S*yWeA^Pq}wvI94K4TPZrA>?bU z5-Ru)fHwl{rGhuYGf|*h@eO9AXv|HPl5fN`w$6j_ew$geM)P+EzH~Ea;$MPQ;byyp zfFz!~1>jdN0A9TXtlaOQ^!8S}?l3O#TOceE2*bVw!p7Suwcn;86pE?;`8FW<0>R?F zot>aUAmGvbej(s*H3WLY?^v7z-1|HDFt?Eq^BsHB0lxhmupxblLN*Jk6U4Z>~Cu{3q5?%x*q0N2sqU#U3RfhmIxBd+q^(EGn-~Njzl_bE`KO^G%vgZ%*(>^T<7HxAAW* zgLz^p^#74fqBWlEr_(%{rBlkXOiF1#?ElB*XXeoS%tiG<{QXbZK!A6F=)4&}qnCOK z@amsgsqrF~%1^~|Ie#B(B^jMj{1q#rW%mJWkPV?A3I);Pqb!;=0FmXFqwHHf-&8^B z@o}fgGTO?WzdB9U(BED8ni6d3%Py0J2BVm++>-f}D>%BnRR^+`T_HW_sC-_2g+%fr z*GVDGisdtJkl$L^a4}0m`x(%Fnn{^EH$SsE;^2nlw57@j^4D&Xkq)lMZ<1zgg#cS` zk~i76C|QQxBEtylmZAbhn)Rn_MBZIG=BMMD7W0CBl&i z79Uov2XgUa(uztk{N7`d$AA5oWYgZ&JopKY(RSS2CvbX+!2R+G`Ih#m=DnVhU`O+m zXNbFkr^JZ$1vsmpk`|7(!%smvOOW1qO4`%)QQZAG_8Y?$VsPMOKL>rj0+03=hy@Bs zSpxu#tF~o3^?7kd9wD$6ohW$wO1H??IfkM4UA@DQRsHXBZ_hg4@X7+4Xv(Fq#8! z!PrfV$v%Iu6aQDb@>Uw%exlL2@xJHT)}|2g!1$KVY)#ZD)L4o%Kqy87zcl_ifCbQCdsJ?cY zE$|DjupVr;D3xAeILJV% zr`%vtzG8%DkJbkb|I*G;Xb6s~hP60u790^2F?KwmVYp5^zqWy7XjKM@Yi*Xa(j;g8 zfO?#Kz_Vph2hR=?{YfX!^w~w9=;TP>?X(Y(%Y8>UeUBAA?UmfwZ!~Qx$y@v~v}k^Z z6g~I*Lk;ahBPtgHd3Wk}7?Nw!I+<{L)dHs3D{}aj#=EfVO?XlaEnfC-rPT zi;q4=gR|Gd8>JqYe6b@bcSUDJnf8=Q#9Zp4Q$9nR6;ZhmZHP=ovMI(u8Lzam{aO;_i(x<<`8y?V&MFSt(+R1 z2-4E#P~V_aenOiS!MaszQ?Ks?Zc#O_3a2rwbP~qu$g|YV65ooZ(?C_HFQAi`4x1Zg~NXrN9X&Wkfq`>%vf$xn$kIZ<=|B9h!9Y9MgfN@VPmt$!#5e^Wj zW~&T^I24l62R`|k6&SX+o>+Y2=?FEEQGzA=HO(Q?A85@?lBwZKT~nys!- z6+Kmk9;|ERRf+VJCNs1y-`|0{)rDV6a&$)XNdy0@1N9A73Acd|{c}Vd^Lj%C^pWT* z6}Q-E{>i`tljt!`%}U^6{2L9x#rQ`UDdn;7pMlp+rjdqJ@DIqZ!_$+g8nrl_I`g&3 z)Qx5t_^xCcL-#!6_mXKZjoaXQs>5tX(u>D` zO1to@pJFk5Aj(6@CGn?UJu9y88PPR9D3;AT%jj!-w@jO`0wJtKrsG(KD0NsyeJ_vH!oa9efT>9)=j`b`#uY`k-71t3B;Lyyqpf}QU|b?xt%dgh`CtGK95!P z%*$N5S;TIcGdc`IP;87V5VK-YC`By8kA(rIy5^J-f>v9JA1$Zv(Bc2`2`gwC+xi+r z7OtQ#sPDggJEy%^79hJmql*adxRN#`P5Bp}(>VUgO4^SudcrTSq8YSRH4j@whw?96 zBm=Lf*Eiv-SJOT;{RzLfnsz2u9{mL!o=47DZJLS6L1-pMS0yy7f`(Pt0#vrd53_w$ zOOv9zuA5TolAl!SoS#(X2RKGmCHk=n{dgNA>kdZP9l&n`UWGocM2MC;7blgu6ekgV zev*#lCsn80Jd@7Oys#|)f;tm2jjvmSps^Bc;z$Ety#_IKk8=05v^8Dyuch-^dX~^X zblh_to%$bGq#NJ7j>gjK|5(b`(F=sX>`o0UHqfSg(O0wwS-`(rPn%dOze0R@sodK& zFk5rc4Va_LFjph&3v!C78Fk18M$$B5dZP+|Nrs0@f&DK@GSqq$1HXL1j z^O;xtuM;#}@{g7W*w+<-D$$*}7P#T@NiqfG!4?r6%Q5>;qSd0U%tktr^d<;+{#Z z>}kex9hG03@wKREtj>VdL>sFqU^Nk}rkIq;U^U&&>d$8UmV>&o8F#L<^Zln8Z&S(I zX+nr6A6vXY^p-Yh1_R71h~KmaPEE9SHx*SMyfkM2ORp*J^t@~HeJJr_u|tY zuq3V0&5K(eumG(x+>2j(z?N&3Szz?H=8FR3hhBW`-*&X+Ui|Ri>^%osmxr~`CO)*I zZT8~wL(P8$#-m>R_(L{8qxr{+w|r#RppiG9_=t7WT710u-bXA|bYFq7oi`RZNf{@0 zWU&&q%<0%Nrz>k-RPz|7MnZux)tk3`Y-cqbtRCBSdC!|KeT?fRmDL<)JKe4kf1IH)qr~}RQsl5f9x<6$;Qmb3leBx76*{G(^AvxYw2hhKPR z7dgj=`#rbQe&NHj9F;$O_|oTgcl_hS4>?+z`SRzEN;h8~^}^0zjxV3+sC@0qH@sj$ zn$TZ;`RNz-K7jSkFIj+8e6yOjd1;Ry_;JTeyXJ7k{g3!JX8@QMw`i{+G&``QHU77v7ng@!h#FDO*A`4-$ zQq5Inqx|?-qK|hC6o_a%`mCm*i0IpCV&3rMw~0R0`9-BoyZ8KfEY;U&mreCHL*Tuo zXpypSRP!RLf6uNnkCOE9S_R&lCfV`7_Tw8QeNV0B2S5Hq(s!coR`O(~ch`Vt{P<9& z_t7fEpXV{VV0aKSpBw*)>Fa6D0sj0n)BkL%cyd_}RbE`L<`%uaCv9|}J2~msJ6d-* z>3t-*qMDy}(jTSYSounWKH1TF&7g1BBn_>V;U>k}1`Een(;o4xowqRRJ4&t4lIN`V zhCeoHN9ZMGM4sb4Wbx4E)XlA6qD~eqnR1soA6+B(_6KRy}>H1AlEj zeNb~Zfsb`?lRiH)gy`bMmhJjhoFuW0Q{w{Nc&na1LTUk1JnHNJ*2qJ>xJv_l5}RI* zy-A-2`iqi)ml)S!32Lk#tW~h+Ep=3|=-qczu;}%6wWFPB#&SlwKj*juo=O>tDP zx}9#Ke?wzUJbAjC{&TH@)vdx!A1~IO0`Bjw_twDB945LskM5VBxdG;FzgEq2-1R+M z3Opmu`*ny(sl;ADuZO>$cZ|P|@o*h`1l1ByUvNiMe0Z(e^2A;LA<>w^@P$qFvkb?? zuIg_O?%YftL=&&`$Y%Pp8U|J?XHQ_LT)KJjrJnjxT4lJG<%y?$xQ!E*tD)Zd;aby& zUVOi|9dEgprKOKPwFYmBZ!NrYzIMFLUOdrH|DE7ai1o_y$WPx)B`P#x!Ez1I&(WH& zV66(!f2dV_ye;8@dSb(C=gp&P4hw{mL{(j_7*Hnc`fumXdJLKB?j5W zVrhC5q~D{pY{SA3taVYL5ld6cmike2YbpPzrGB7>A)=|JK1oXWtD3hA(f_GIF?^jv z^_#T{7L>iA`nR-7nYSe>%;x+;Bk&G|>jyYk`L#j^#a^!FDXsKhXi!Wk6|J;!UueAK zZTTibZzgolUp%3WzO_I>&-+-Ww9$W}dZ56FRY_{6S%XvvAHKJpW=(-{fR80NQXfI+ z7k~0CQTj0&^>`nPM|*uY8#UIYvC(z{tV=Cp>=mp_w_-Fi3XE8nvSan{XdJLEU2#;f zE@j2pTd*#jb5yW+^p4kmta^-;h*`eeYzg;|h#en+_%GUm7-v zCj9`~|1v*i0#_A?_34pGzfP-QeOi?Y_uFZ+)9e+{Hctob=1Y8Lx}7%3kFQPFr?M}9 z$CmJVy1pZwb%}>{)bG+5U`@K!QU3)Ey~G!ELIp$_^LqHpKy5-Tf$?0q919LWz=lc zhb|V!89UO2pFpWE;jeze$<_{>@iTybp5|+QrvEyCDF>+=FWg5P(q*SD2lvs&s*$Rs zEBk@p@w9~&1GkO^p>Rkj98!sczm1l6 z`3)LvKFKHlM$i7I?YJ4Ro0)YONUxvdvkz0XYYK%cp$ncv9i~Rw>m5w^Uy5y28VGX*JjBa0BYB+ap#> z+5BhM`5G>)dWvF8e}XOuAm#uZR8*Yr!_6yedy>^sgLu65BmPrGP6f;Mp# zWYOBR%PQdRx6#-cNoQ%_y4Mjh^L4J~n`ilmv$%{_?JDMT&(h4g@E>jo8<~GP$^SY_ z-Pv3);0<3&O?ks}^!w1pLJs(rreN14>C7Q8H5He$VSs-rX-5-rX?uv@Jx3?9&=gP) z`<-?mKUhBhowgyyV^6F3iDW=a{-Ci8=}IlQ^Le_NVqVyFo@V%djdt-!+NjsP1wZyz z@3@?CmsQ8~-sY#=_W}*3#ZP%>@%PK8e6sj!dCFIazx*lRC;o1K%5Pqvz34CAJmwxPjCUTKNWq1=Q2n6>`T<0{`!QkxI}&Nr1ytQv?U(#{dtL| zkOb~?na(rK5kci2Y%W8(vrrCJN2{^fB~?+|LW0egZEfQaA);+#b+tz++7|)NOE1%o zb;}XCX}X4Hw-Vm^3SB`;_^dzaSl;R?^$%Pm7K7+u+@T* zE^3mT#$|2_j4jbj7@?ih63yDnq#QZA>V`ih0;=`eU%lMBhfeG7J&V)$oYNes!ps z;%44|hS$A=e%`=C@6axE-cdgF4joNDJJ@al&!9zQ-V z;01TOPZMl5wB=py(@>gF%%|R`L+HR_e(FAEOdE4P^Z^?G+0Pd|Kx3m~OZfvDM(OfH zmIjaLJwo2)FCXLi#^Zzh=07yD@%4k4B5*vhU%&l%kca(?2Mr&gZ!^p-c=f-uonT#P zRNC>_Cp1W_bc^IUj>_kee5s>yG?MRiRFp`5%TbAl;;v8a4Bm<2DUQnKC|qXPTkb}2 z?x;kx=Z74X58Ctlj>_Hk+)J_3L`U;33hk+BJ*qihrP#IpE}EZnpdE#;_ZfEdkERS+jn#J*KN2M=Pg&mbo;<&|8 zIU2_+92F&wyS%V-OGQqSqhgNdV;vPGp35)j*IF-xCh(M(cA8NMe4?XrG=XzRB|4EG zdP(DHqks9Umw2wDcIS7Ame^PH11bWz&?p9yGsOjL8X_T0IfTh22LoyGiRG821ScKt z7%`4KiKLFBLLo3REV>-*?NT_4G81t8d1uxr7C4tQZ-&CH*!mFu-}19wT8n&$M|^}q3a00O;R_6sZ{35KG}7`t%zysEw;Lo+T3Ux6Gf2nk z!laTMQ&aOFNBA0}7W6-U(4`=&iNf95;uNP%QH|D%qSN7w(%2iBEZ z(-lAS1$CueY)oTJpeASOOS0Wk<}4*r<`jy7Gi7@_ zwj^r1&fDDVAop~Wme>^aHp|6)r<>G|wsYkMcj*n1$=`98TGECG_!@UjKHSBZ1WWG8x9%Vq zu~Ac>Ci?02h=oBs8ZMQXxqO$6m#tmBX!5J!b$OSiJXq>X=?4-I3zas~f&2K`Q0Z0R zII(+(5NRC}QaNz*7@n>iY=#xcwtM*DJN_^XZ_st3JThFGO+PmBur`ukyR3BOIu^Pc zdFhISg(N9Pk-lgED}%ViOjqW5YS}!=-*MUsa>sl)=HXA4-%dnA$9h3 z@Q`(mhvk9Z`I(2XCpllp*GEV(G-)rt93j1;2MzpkYpECAZV;-38EmwCXd6sKBMU7v z+ekwQ3qg*ZqZw2w*og_1j{mxR}2_B;B3N3+M zr4fVoHkRdH0bo&netb482{XNjyWvivU2S&NO(++gx zLZVm~rox#|cZsRx=~c^+Uea7b`F6`+y(LQM>3?~7A8E39W|`Snn#}gigN48JmHY|) z`hn$UrnHjKO;$d)zto?n4UpEe`XW!tIzVdAVgpd}A1K9Rz*>e5l!n9nkMMk%d~A8S znBF8og~oPNeSUvL%-@(|?9cBvh)FTOx!JT^jIJd#i2vM(8F`XB9>?b|p$+2>VIbg* z8U_2@silUso~r%-8#7Z2v!7sgWC``<4H__a>65KUqiNW;=t#qpgqF1x8+=d8_!ZJL zyCjYWsaPegtEnwsCv`F!G7!ZXXuGgk8g5{tk#K8?`wp|IZ&wlC2ax82r<_N` z1IBM)&o|g;ZNS6CLOx`tw2L0uU};<=t(O|RZNO%D8g|gl)0Fb?G^No7%Wu2T|H0r= zVjPadB3G)66NyD0R4H}E3h9xi%!PzBU65JXZdtKMx=9;vSce`opwY%>zetOv#y_q3&(_^*EMZ5a22$h4U)UOoH2x31uw)#UwzI~+ ztp3l2;?=xvi8Q3~W;@&_=j+vcdWq!Q_zM9SirN@`zS^>}MA}(LbPFCFGE4SlX_kR~ zkK{;8X_*Mp6Wl^8Bp2H05IJK{m=KXJ(hO-q|WVQ)OI2a$4uMOq=XVvJmAO1 z$K;=_<6r#HIIGSok=tfP8%~hwHeNg!5Ij{L0tVhzZ0*%{$gtv|W(7Z^V)`^tB^J!_ z3njY0t31|vR!VilAm~#ask5c}5U+bfTEX8ujnvm?$EvyeaXbWPGudU#RJ>jZdzbAM zr9~wyOg`1a!0(=6W7#qR8gv%BCn{3vX5>CtkZy)MyuC6X(T#4@M5SVu?M~g;^|hEM zzU_fTo)g_EUhNWU*xTg)r7aC@7SLU!{-D84dXU+APNyXsT)>9!0@mMiCT0E_pncVw zj#MoyH2xaIoilORtpAB6IFn}9K=bG`^> ziv?zd%%SsH5K5N9IrI);n|A^D3)TqKB8CnMhKZfd{ByC)hTT;$dMwI6qRO~d==ecc6nY6QIiKIvA? z@8B4G8=JB!u_?oVutMWoXe-UZ;xSgI+{=NsV@=Avp*rPmHtIuB&qlo;>RCGVZ3FSv z!JY1~pf`f7J8lAcgI~H%sqCUtuBRhew+p5XqI>J6VJ$`KC~4*DTrSkWY*n4^&Ryi^MlK+r^cxuE4`Zr9D#xZY7GoOy;bFQ#~J zewpjT?~f(T@@|gR?YV^+T0I)!p=>33xeC2}8_vH2Bk#hm_u$`qSKza2_+0@EJ%0BZ z{-Ve4oP+N!py!XnXQ%Nyj=n(8R-VRRu_B~6#fy!vu~E$>?NaQ5Y)@F7mCCh1+JN5$ zJ~@pB=Y<(;^M9`BP{3!X9q_mH!dlNwRJ(Y)fshnSjaY{6fcfpUPWe5n>Xv``iN=WWI|Haa3uc@ z!)$DjJ=&g3R2BX^5<4Hg(pBuAJoMNPc0xX9CuJU{p`83W=8m{_FT0kyr!*(n(H*zv zA}zYzudaLM!Yk;qGM>7p93J@r@F(qpq)nndGG0t5g~B1(kv_D?EO~Zhj03b6py*lh zS|#W})$mC^;q0js7-99vBzsz|M>F zp}*wHYvMZlsuq0_g^V@iDT$=rrIJ#p9_6Vq(wpwAX|@Sz81${RcEtI@pz8)TvTEnFd0q~SI5G$r?Sd2UjT?pu?5 z=zBBeV@a7cREKO-SOLlpf$DIY((`pWAvw(9r-{h{bYiZ&Bsqo^Y=*^0lE-P}C*iPp zRI!S)%0iIO1Np)<#rV41E5+AAJ}o7HhUUsEQes#yL0*#behqoLjl2uU(?Q-PO*!zI zJi!#~Am=6@y6-)CmuaW##n}jG%v)t`OnbyF@9(p9a&Bs<>rnx34mjEb{2<_#)F4et zM0@lqF2vMc#f8}7RP<`9GW<39S?XMYf=Ajw$st;*;#i>M0A*~d68)OIGA&T_7@m$} z81};(f}+Q=2v!;F__InKdgw6%VQSIg4>28$1CXY#%E5&CL`yrAbs>OM|x-D^yW>d^1Nd?-;i;cniV4c`xi@3T|I;SYCNb0BH7nBWT)aur>l3zc1a`Y$_HHK6>g`%T7nQC;ODu1ha=YH%@}AzVbkYd< zRPWYw9sSZ22sR_;^Hn8a_=vI3mq~ z>6{%v{in*UvulXO5P37ZA$6WA&&>{WU~bJ0rOl=lozHGesOLzzYGeYnjFf{%{b;Bw zHuH_bujmapXO@r6~myNFTW!%?HI z3&ut|#zq&DvSX;c^R+-t6wv+VddmO2)<&zR2Fc;CCu!w5LGqN>e-)}CvnoPP9208j zhH@xWoj9hiqkO1V*=uYKd|IvY@ml5P<7_yPojdNp|ElT-L*yajgEdh=UpQW&i9_VM z6Vh13I&{vF3BzdPA#(7F<-} z5tCZe4q5V&Nki!GQ{<{i1L@+ya@rds=(NG|`Zsn-Bd6))p_7wn{mJsm$uSOUmo9Gd zoyqlR#ANx||kz!KX43c+F4Ho@}gs&j^+Eh2K4Cg(c`nr@gRacZV%?)oL2?XJ;w|(gM zZxpS0JB`qsEV=xhG4y1AIb-@{8j&UcIK3BbmL=Dn(TnP{Dgb~ zJ0ctkL%}-h-2l-?g(5Wa-VJqd-|?;w-91r0_3mYM1gV}y-@ezXM)b9r*j!91dNmWG zyAD!CNB2`jHy)&lex-@7f+Dj9(vJtojc2cL`62WFPqa&(5A~lQx6V7yvXCh$fBRnB zqPYBqHt~PQ$i3&dHJ=MRO5yS{xLZu*x6n1E65O6+QdAd;n46=HGI%RkKBtunMA>hy z3RlY$Yn3hbGJGM;tHJ3#?^iL;78qZm=O&_?#kODydJZRxiYX@LbU)p)Ti8NaCEXSg zB37I<#IaL6n1U{FWx)>wJv;t_0S6zqMmc##NAxH3{+{IL%`Fh<_; zag_tK>JuM2YmEHkCzolRu|+GEY|%$r@m)XT4-kC_3!@m9hlx^lI8`YgwE_PuUIvc4(%>CUOj|%>@H7UeN$5+ z2_J`&;VcfevPqfKQ=ag}t{VL&qG<}65SzVv7R9V-OxPzG;QVGsshRxx+6@L(zix4| z%a{11MPHcN_R9|J>2MU@{IWkQyM)4#FGHHDXoDfER&<>ajmCB3G#;bk0vuUmddMi%8zsZL^>jk`qoBM0P&2jR?%@ORlVQpr@NhvSd*hw&i0sOYpt3WgHtV3WK)xarz}&w=6ST-oAA%tLzO}`)}JjgiiUk z8C{YsfAsAFhft4gKI}nH;KgmT;lYp7wuLf}EC9dUX44p&JOXgH80`Mr$Fax@D15xV zmFADl@JAFwAa+C`c2ojHW6Ab7O~`lX+a00oEkW90$2b;x9)(Ri;zW#;825m*Lc(xQ z$8b+q{^~0KyQ4Eb(N#_^jL|Ue0;32Rcypn=C|%jpRo?f5hrF(EEo&*lrQ>%U9ri8# zt{Lq-Lf-P7YG0udPL18^!#4E*-k_bTeT7EYC+`eprw0I7yi>KW&Ao zA_%9XVFaWpOS;H0KP1qTG4j+OROf=%m6wZ!fR?u_yKKEZ_UF zmRF90%V}^qZc^%Z7JXjScP~CvaX3vLy>F%_OiX}qOa&ZM4#)U)k{|9HUDH$nBk;Vd zydqU0o#YAoKcatil>glyNe86KVa1(kdYU}7__rE-9I?f*S{$zzb(DJ@m_Xm?DF1js z)d`=yLQmlcSAk<&IgW2bI?7H5cN$=wCgAQX1_cxZyC|aLA<0OP5Fg zdR}Y#uW7eyy4>rxAL$n+x$fcQ8jM<#6ib&!99}_3oA|wEB)ll#NRhgVAmDN)zJ*vD@~3$X0v<%Fdo5#Cothrs*;!{&pkGqdZo$q_)MCgBF{d)o@S-U zfhX38comDHdj1n)N*nK9A(=y>@yWjFS$(JkBCM0zdS`v@|bh`=)fd7 z`1cjGZIZn2_si_Xx8Sz=kE;fi0=FM|=iO*bO3{k*6t4paE~Db*wHKPvyUFs87dq3V z{xZEdT5Cb)PrMjFKj|+oxj5GW^0*X0NB5T#F4cez0TkO`zIkc318d^t09qe}muo<- zR|057KRM<~4QMYwd-}D?U z%BLOV;Idv0?A$UR`axfLWm&QVbge9iev&CWl_xia!%B>^z#tq9@L*azY+g4E9v)VX z7kF$7U|zWo?bugdQ|{{k9V%}}eKX~M%jeRUedU=IBOEQ)DuQTLAKB@88a>)q&bU68 zZt5$ay1vqZFy%%NUC>8faU+es-dDbSqoyVIW)My9Bd@=iMg#lGH*ZdM&@gbi3B;>I*=Y|F0Zi0&>PL=Q`TMdRjj%AexT)>!#$RcGPE661&PL9OxIFrldR?emlli7#@xM~Q|rO85!k z-3H+uo~ks7mwoRCvYjTltKQUb-XuegD^X*SX;TH-u_QF2sF$ngp0N^F_yVDDdP(JAHFI+tPVYj z^2SGNYOrf<1AmQ`hdhq-RT+ty0(+kNjo)y5+_9F&M#jqb{)wa)+RK6e_M(T{%Txc|q9Ka;fO_6qned z$R}y4+Y8lM0Y0jLkILbrJu&h}Pm}#rw}4C>hATa=PI+nTlnQ?@LB93$3pz7KUZBjZ zk&pu}W5FfIqzsHHa({*o5WF5GS3UpDpi+I1AX{Gaq${IkrW<%lBT5p-$2A z!0H%HA+bnp1r|2?<=E&yYA>&^9>G$ZR`cbInCcC}*1Ig+q&#y2pbt5r5s4YHRtGI@ z&m#$$OrNyl>j~*aE86jggq&p!!G#~8&XxAk8x=(NTP*6Fw|9v#X_n zf!w3Cv<-h%hpeHy+gR4rB^iXhE)o*oY=|#tk$S|H4r#;P>ycx$WgA{zk0evM9S^Ke zGUzFPKDjTVs&$T-)Q<0~Pc~|8!WqsOk1iOG&Z$aLJ3g}k*{)ySTDR;EKF1m9 z`Kd0XAD!8nuW%ugH5$=3=b-cjD1FYP{Lz+sHY7+^Yt2_SgbrV~<(C^mhf+Tt+^Dt= zwU+1EZG{dV{F6rHHa!r*XErAL+&77pXB)!(ITWgfLeG)Z)t2{ig-51D@Pn>!-+%}n z)`TpeQ4xG+6SC9WDMGibT59y4NA1(8iql&3UcMW_=a@z5CpXfcC5uuMchbjGl_boV z21zp@X+3qBRWg@?UpKvElS$C8yR(CRzXzB@HViK{RyMJlTM>K_vDnqev zUWK-`@XIQbQrMbrZ%S5bZNksB?4J+1W@HJy9xnDLJECAL~)|<38Y=ILq`nI(gd`P^Wo(|<{ zf#^5rSE4>NiGsngFgPkz32ViF3nahM_d_j9nv+1)z!G(`I}Rgkd(kc7{I?b)hV^l& zMmi>GuW=Her>!+3ei)9FO)`Q70m<@h5WxpN9!;|x3nrrp?be#N4k1HmWNXVuA!I5( zR}#Trg#xfIf)5EJnRIgm-yVkgrxCnvIO?+^_=s@S$3*ZS!^v6ESI`PB*#OnQf$AHy zzS&qMfa^Z^9Io3P zL5|P{DVDjd32yb>QY_oskRc6N{W>tDUNU0F0P$jr$H%4-ADR(wS&&BR;tew!l&1sw zD$cSioh%`~D)c0LgAuh!Trs&2bySJbHLp1z-3cG$vr}eu24$}}KD{#;;s9O{z}9h= ze>;;OZS3^;UMzwtL|me*)v19c0&G*D+GNA{VK*Y@6Zn{JfnH%e&iwT+?*%$CmS6I4jEh83mKl= ze*k%GZ`A}1Z_g73;^T(@A;{F8Zy!iz+krKLJlgZjEb@w)0)-$?K4}p7p4JQGe+?$n z`PD)AOyi#cqOy-}3*c*pkRR!6weHQQ4<*m+{P>Jvu;#Z&zG4`e9&D4WUOTIg4sq>l zPbNr9o}+%Ja&07!98Qka;D-Ot$Bd&>G~Ap>9yo$zI)vqpfUr)HmX#xjC!te4`L1j- zkOtSYG#H5}($Mf}^wXp81;~T`V!jwfIKjVUfRfV}ZzbCauk_WolkT;t<}R7~cFmcmK2CW$^g7SYj1|UAj#SqZ+H*XA5B)F?eOM9KRjI%4|tQt2Ys+` z7+z?%Lp_EA8VG30aJ(CDhkhfVuUb`GP7l|=u9~E>NX!QKb6kYwWaFzAcH~t8ItR#y zvh{VT_%dTt%R5)uP`&Fo;p6YxsmaPJ_IpXZq746o1v#vmJD0PbH5ks~YkW`?7!%8Z z@m5&1MFs}Rdog7nvX%%knd+WF9-eypFLv3BbSC9Ph7Yd6@Tx9E`3U40bCS(f>DcRa z!Co&N_t+^&)ULG=!B@w&h#Ot?H9LGctCZs>=OzKBq01MVXv2t7g8)pH~?RpWObSyi`@$aG7mR90Z_Y@UZ_2fF-E zt=BZmE1N^RYv^u~?Fv{ZL0M$aHqx@EZb17=v|F(N)Ip|F2--vSfL#Hz3-}2SoWtMK zxZxKs8|FZ{Yixz{rB%ejx6}?+{Y1 z!Kj6ZO^JnRjM0ug+7^t=svSD5Ti!`AbK@@N?Ouj#7}0rE7hv-hdne+WQh)%=2tlQ94N->G+=aMUumKs>>+R^UOzjhUYg zosV6Fc#;IwL^|X^xB(wNQB)HEzmB+`Z)$8Vl?>*J=FB`8?Qe*@X7NA4$)WLTk9J31 zg-CtqVjD(t@WMzsw6n=b(`4jrDV3<2ipO8E*@uzlnbLy_qP>q2MFfH zI^FlGvd$vROo~|ZMO`ST3QmC#%*nW7Rp;g-F`u5bdj0h9$h`v(jgOu^6lrW$%+-}C z`0dX_<^K^jB5kk=VN(^WQmuC>EyWH!)Wnay7pl!%y9n7SJ0L_`rM8WqN2D zkGwBUr7>^vjrXPVMs;54DVgQZKJ(^ZK9CswKdgNVSe3>0_w4=dcW;o38X##PJnWfAfj z=W_L^@KKD{ssn!cT{3w+%7lnAdr)Q*+OidG*%WgjJA&VQ#+V!^dpbD(#3);SeP{mS z8KZL`!aN?f3dyhP+BP3wXZiSy(aX9qou4~nyzda2ePr~QdiX0e<^cWsJeM>h3oyHLR8AD9J1e@-^q+zD7NYVY5bnYrzh9?M57)JiP^YQW> zx)HOc1b3Zc#yZ)R?K$}d(meoYq2f>onF-ht7tPgk=QUj^A3qTTEQkp)P)Ln^6&p@X zLAjlX1KaVNg7VvA_MF;@-v-EC4;p+|U8$de`zWX4Lg^IDDyFzUmL7aR*%3dqidsj3 zH{iJddSJt4kps8NfjqR01}_FSYPc2mj>`8w9)}mub8S_S zA;wTyP<{w1ta^eifN^g`V8xH^(Y{;-4`@=}{Z)-a+`xJRHLC_fs1gck|6HU(T3bA+ zc?ANYoM<|DPN34`pjShw#z7jCpS23>801Hpkb}uB%Dh_HD^FO_a^Gzv>u7Iw;aGq4 zlBgK1_CcX2KNYHg(<2_I;L~?Np`T&@amYUf`=3G!uAs;KL0=gh^K5U#$@st(7KbiL7@ey=W84YU3RGyy~XNhw3;49X=U+URzo}%zvXy)?9aZ0!zpMQN6V** zMmc07h&IAdG;}jr=u}t8LitwXg8Y_K3&)xK+wGPvQ=Y&&7yF8`JII&8!~%SmUw-s< z^trqbT)a+;Du;<79Ew1Bs+`snu*^r8S!6$pGJMsSwhk@5+OpLoR3_i>$R{LQmKo!F zTN3 z##+&yf13iH_>#V<79R_L`D;tt693tjX;xZc=J_nJ@!4}MpG#z^jgOkEk$fBPn68n3 z*!Uj}$Tl1QBtz%CY2%ybY2-Z{e>77gpW678EXz?T`WqV`mTmdQz8w*F_EO$qJ~ouT z58=u4Et!(xgstR<`Ib)|wv$kc7e8hh-8qHMCC}jLwI>|71MfCmjk)c@#!%euiP=BJ zRnq2hONi+ZOi;Z46R1}p(ABX-BhdAS1_Zj6EY&&h*-BPDX_;r(u+Le`ZObfCRAGgv za4&B2-hV5$pK+@<9^pKWMex0y__$@3cO|#~@}}JD!My?8>ur);0+BG<-MdswSc;$aX=2~Rl)}dtWT5QZv?(gd?;~Ja) zD4t-&ldV;c;@;`b(%x&^m)!fjCD~%T?%R4^a_|L9sl`@~wsB8^>?wTr4Lx-n*Li=! zb>8E+&Kn_bL*E@%a;yORK$3mv2FqBgNU|>n`zo+6A9-P;OWqx8hLyay!P3u0x)Kxr zauZHAe+%K~Hd#j629Ke$+}A8=B}JPpQ?Z@Fc>T+kE)C2bi!Gh_=q(nf^_~!Z_ZCz; zGK9ZaZ0W}{ zqEO|BZBS)ZNQw0o%ew}N$Rh>+`6{TH?f9uzp$h$B zxMJw_0X~mWjNLl4AbFQ;fnb6{eXWnRC0%Z|&S_f$HU1?u5V_DGnAf~v@wc{VS8@*5 zK&{saHI8DPya@|$x|4Y;X2eaHbGG7T8olIKDdOAkfp1~UM)C5{5^OOS)g|~sgcjAh)Y2*JXi(!*995w)dn^l5bME^B zmKa@XiMQH*xdpve^tL6&F_wn(QIr4nHjEtFrX*yq<$a4S9{D9l_F2+|(en8CcP&FD zE6lt6UFbT}$zOTb@(gug9v{9R^$SVJp0yv@e$J97_gmh#K6iS7FMsbI;~ts)k)20O zGlH!%p5ix5GjOLT)&9Ai#}RSzQ~aR@;x~4_frulY;%_w&kJ|YUL>%}OKi5F~6Egn} zVi(B#yO!ze;BiE31DOrPP7b~SL|-fJKaL4tL&A8_y=EBy_uq}U&O(#!csu%Rn43;+ zu(Z=Rz%nt}y7hY^cxe{rA9j5ll<3oA@+>&$!>X=q{(h5eeQuEEn*N)^=EkPqlI8A9Z6O7?j*Ih`qMOCy=t17`N z;UHEO8)7b4EWXPpAdk08G@@*ys6b4jamaeJsA?&6#n$;)>Hw%zh3)gBPz#O6{zv=# zzjuPFS6byqIpux$$KYA?%B^>teB3PKaT)^^KHYuzXS0m%);s+8xmm{K2I9mNyhEU` zAD^3IWHu0gN&%EmuYvd|5er-KjZKMP z6Y=R*yuK+B&u#|uv9k@QHM14JceXLILB^)pV86Q+|9G}Bqk%Xm4a9-qOfv>H5T7Gr zhgSUUG`yolxAnU;<9cfkKi+1J@qjfVm}ky023oCtC0phg6AW@|yb2s{h83r9YpgiM zGcH(d!m7n1%i8Dv(4nNmJe(Yo$YS(1zaz_NZ++IcBst6Y5YO35Duy9^U?P0r4){Q@ ze3a;%qh#ECV~nLs0~2<+jz)l~BQBR>IkO3SIdna=z`!1vu@*FBI2W={`?O& zijOjRh{wR)(TX_A1Ecjb`GX!~ZUYe?N{Y1hwsY$ukYD7FF}QIX34-M#_JaH^*kT)b-Z*y z_&aGp+*%`oceh!ytY6sp3pQ(KD^5q=wpm}dVwFAD1ir?`pCP!?#$O|tYvcbit!e>n z>CO$iHGx(+xZKd4&$e4%Z9pO%)(<+EHrfh6(55W`oIC1Q(_Aoky~EnUju|wMc{n}^ zGBV<1{gu3)cy%Ej4Zzd8xM|zO$ueMS{gvXLyKdobA8Sajqy6%uf@D5q=J|~1nI9F5 z(?{?{w3qZK$np6cAMo_C{)v|iT;ZbizJYwduQhmBVH888#%!c2Q;Yt+f}XPRNp zZEN4!&mRpziz|GdxAIjp%;1}YA)nS28{4W3`r;GxDMFxZs*@k_^}v1)_(-ov;F~Y= zV>8Sb+x!z-u1)JZVC4_YFhlvanPzMEel2(pwmq@06-9#YL1U*t!F%v(6f9>+fx9Fh zuFhaf5i6{*v_8NJOYL)Ac$fH~z#W<|0DL&jFDH38^{36KqqoIe*iC#eE(hL%=r(0*Az0CxhM{cb#7)ER3$gOPviKHw#^L)F~}ht25}EQs^qNl4{~U zUlSiJ^&|L5@n3*vUgEFMG9T|WzP_GU?L>5+i8mQwN!jow1IU@i?@Tdg8#Xj*Z;Bb& zLp3VDW|i6zS_OB-a0F0uT1cY__-_xI z!L2U0mc8!Zh6m0zBdm8}lVY|R+~F6Z$HiQ@1i^YpSs~=9I{v_Hv&+y=b%kqSOKKCg zJLoMi!kwYtS5)2+b73a<$d;#pr`OeUe#B{O&sQF>IC$l3)8CK0PAJ|U=Ub>a>K!VG zhK-|wI8*$Ra0ncu1bqg4G6^c4YvKU}1Gt)HP^iFs(kBz zoP0>S+1DM5QSWSnjWKJ)S0WwKB;BD&x^t6smnP}!nxw5w()K3lR!!1@P13z$+>I6Y zYmzarN&1E+>6@CQZ*Gzv*(5!tNqSt9^n@nq$vW*u>+jYG()Tt=KhPvSqe(isN&3Mi z>A6kPnN89UHAz1r(@Y;$#(3VlW;CyP)QsfC3(Qyf)EqOm(?4=Wh#e%^j)! zeA=hxppwFQ=6VYs>@l4s_djAzw*+cY0y=r*asML2JbUT!-1FOQpNd5qf(D0$R_ z*H4#x{HeL!%71j5p-yJ88aC7J@bPWs=N}N*ntwje9KwfX;eGM7{PRWTu#$s|%p3=w z^SJ5Z;mgf$@+Y_D&b9cqk8_PVlozf+9iFx3G#<^(7(#t`A;(`VhsQ_*Tkx1xra5;K17Ysf6$X=d=!m%%Y~2k6ne&3Nu9Bn_9?eR$p` zprSxU5tzfaqP%N2Bu#q*sj5PhjV{Jt)oY;TYzA%J5~vsZGK%HB3R=obpw(`IJfQe1 zMMljgROBp#yj+skSX~1qTRt&+`%Yz<^XF!#&Pn1G^WZ&a-Zt9>Pf1IinZ%|p$ViI2eQt7k+?cfVglw6A zr`v49|N6jm2HcsjU`A3@x2b}bHpBV+ zeP(d`5px$bX~2~9gt*vr*dZx1e^OiSI)q-&*kfk3PMDpP$nHsY5R?l=Et-kO=2p2_Pz#;6yu=k4WY zhlo29GU7%hrKO2(ZPI|-q57<(On%QHv$HKNb;eBTCH05Qt~?Iy^%;{!hDAUPI)o4y z^R78Od_)>7mXMvE87HcOA!p7;AH-3Q@%nen(BMYvp~=W%!p%fT?(;TQo>Sp%sFwlHX5U`;#=p=pTkDa&rHZB*;gO=@pjo& zv3t$wtsBdX$jnSwz#~62JM&vVG$Vo(vUZv2z{~B;9&)0jo-@gi z{kZQ6voB9yVcv%Q$cCfYEE&1N>=JzEh{<=1o_NoM{v)ox2Q3@iZ%!g}an}kngpXZm zjxd1p+?5bl_OQ9SWYp7Ug~jG#H@W!km1g0643`=i3&*b&exp@g1Tn`m<^+hv&xK!% zB(Z3~4Ezf5i)U7+%VIrmXDkKm^s8tu+Q3q{<&fFd?ZXaQD4WETV#AX}F2r(?#3lOT zOph@m4Xum;%xTToLckS(y8%6sV2Ajy>lix={2*YMg&AXe$nu4NLxGp~l5)d)GZqiL zU4NOM)}OgqE(jGM6afw&$XGStXk1|Tu`Y;$`&8`jj=-D zHMNYD14jRjg)!jNKVT_4>T&-G4Usqmm;yNc95e*<{|g!dR$f4bfH`&W0tYktTmnB} z3Sc&1(PhTg0agQ|`;71_vf`nDRlrw}|Da2Y0eyUsZ&+9~V71M{(g5A@COrU-769U~ z?gKmsJO!sgHGriK3v>FSi?C%d6mX%hg~bDo#cMEf0b~7e`#RuYe+#PwJPin6H41R2 zUld@q)52l_i-RmI2QZ_Jg%tvp0+zL6ZX>EKD)2|&1fv4L9ibMM4Oj+GBBzXMkDDxj zr*yP1eE!;q4M$4?nBj^*O912XV9+$cYQP-8B0TW34lt%0%EO6Q1C|0W?2Yn(OZtEw zh%V|+`EF(nk47SzSyuoKM}}(vS_s%}AX*5R3s?kr8n7HNb`UHBD6Sj0m~}L+A2?g1 z0>EfM`m#YR;B>$Yz*4|Gz`?j>pct?aumbQrV67X8SX^RpI$>hKXuw#EnOMLTfEj?h zZ$yg#cMOBc027Bp0l@gbp~cG1C|4hoqz&3&H|2ai>{gqKENe_6lMnBV_`dh z7XVfO_L*j3=K(YBvoKdXw0ydSjRnlO9}NPmeEG426LLsko)0DkaycsbyX^OAlT&;z_3?#?L$+y__==yM7A#mu_y3M>QMX|b}f z4(LL_p@4}7CI!IFb}P#Tbf-D2tO$vHt?;E3z~VqFI}aG&8na4AW_UuaY%E|Awu&+U z%kV+cb%3M0TZPjd1S|ty+QZ6l<-{mMymp48;$El_FuN}*1Uv%h0UX~C<~K%Y+VjR95`4QLx=WzztU+$04I9|nl7NEr^n#0OXixEgm| zmILPA0^|6S)`ftvL{A2eW8Ew(TLFB@gTT?ELx9D=V`syXfQJBWE`;(l$N?M*NE7q6gGASxW2Wo6S*FeV2$3WhC!X=|<4ZXRe3dY|Q}5O7}+6eqrI z;EP0q09}ANyU=xj)qBu&fE91!`yZ6Q7ku%|TE5SU`4@r@y#s=iS!)SGf$8r8;z$HM zhyoskSHFiY0?yu-{8516T`(scglPdw0pkH{0X=}>AD~MBhhrDE9B>I>4Pg04R@SX6 zobqF?=2*MK6 zP60+UYbBry^o*a;Qb3>6s1PvwH&h5%3Rnaf^#}SMFb%L4@bCqc&tukZm*9lg!8ZU& zUM=8I;9>5|@MAqdkRFqpG9DoilgP{4IF4HgfGi{H!xn3jry zfZfszRslFZ$6)6HYXHOgApbG63~=F6v<$HJc{B_#b_)~)jCuq00GkTfOT5#}BcwGC-f9HdX^z4(J?!VRj=b1S}Ya3IWd!M}>fc zZ-!j>R_raPnDCJ{jDH-ZqipOn2zjF+U?3D20|9_V;~)UAZ~_DXR!y|ABEafNHdX<+ zdNNuH7(La-!Un+-fD~8`-eqIsfoI$eg#n%SNczxefEZQTfO(*2Pq(3d5XRnbV~0Sf zPO!1_fVH#G^1{8Eh30vwHmMz^l%UG>#=5B zWMff)XSdi`EZ~Z*PzZ2(5iAI}aF-h zS@!|v0-suLWBUMCA3{06n17+%5b%EmJ~XHXa42xk_b3lobrj_Qqke_rfII$#qJRva z(#1IvoX2LeC_s;CvRFWy-DDXA9VXiWxErtnupDO{B0{z@*?HixfP@zShTVv94HyGh z>SwZez-WJyueGn5+n} zAQTk?o&~H0ObIhtO&eGQr;*OK%;04|n&C#?lNWi9db6jI_Vh(QrQW>JI(!AMKWg^l z)BiMmjIb3KdE6!QdR}l8SmMTuJmRbw>3e$P#Vd3y;rTXuXse=462*o1cm3=k+;bMp zm$qEw%g>tKeY*( zs@+;%KDZryEQ}3)^CBPB$==-gJK$O!+yg`ZG!|V8WNcg6WsuS(c z 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

J}U6(2p?GfBfr5% z6+WHe(*-_V;iD#m@Vmj6?(l(iVxkV8p77}fpWg7%fX}ai{BM!@{|63X>p%eiSKzRo zK&HXxY_Veqr=(cy{X3T>rx?ipc!p%2>{Aq{%e8}EG#B2HKQzUDk^|%!(cB!@6uyoOVeQ(zBD z$zHDIddW7d;{xR1!7JI@wOrR?)%Bd4pwG_-T>jg$EVBL^xM{NHbgoPBqI7P$TyaDO z*Fm8E)6aiB9F)pn0w8Bpsd{oZe}qBhLH~#R-*M=5lWC{&HIT?B_FUZ`H>yuu-1k=VBgL?Mql&$YhnaMXMCuDqS% zyc3B_&%~ErI&##y`qWk7p8ne_BMJ{m9pWzpZ}(gm5}03T*dn{1UsGe8xTU61GI+77 zp6!#8%U>+^O*A}qxz@h+?#j`6RqF*^8%}9wE4p19eSO(Oz1Rsiuad1kWiNWH7#pGD zQhIN~G1v4rCS+>3atC+iVMG4#{TAzG8KO_b=a(*Q3wYUW%G|3bR*o+Ve7IR@!!Z5B zInsiQD{|LqP4H|E(&%H{HTcWdQ_h>6T-|*a?R#KgU@M#PUj51UUcP-VCKft<{QhI3 z`IGeZJ|1hm(k2$%oA@+xOuWjrtkL_swMhY zm{HjHKb9IM`sd`0lXg8V?fydH&X&*R8yjQ?oYfLaH7pB~kBvBTW4vLg8M>0slYMO&?e9TOK^5!vDvGF!NJhVe`kj7dLMH{4nH# zN{`Ps&X&fPz3ehya$G51_kh}$@@&@umyTa{XuPRh@1}m8&!arI$JHLQT)8uMwY2T3 z`%hbZuxZEi3#mfQBZ?kLear^$3_A8D_TZY!yWcDbo--qN=Ci%Z1>PQRev_Z|Jnj@S zl5^?(W~;RA)|3C7D;*Q~~vsXS{xte+N zRQ#oVZ$ekSt6$a0CVJmE4!O)PQ zh23^|NlQeNKd!%YT=~?w&w8<%21O5(dTdvEZ}8cvXi{|SpUT5RZwzZ~d%Nl8mDUHL zS*!96dd=UmU9+Fp`hK3n&;MB2F)KWv^5{#g?86;;&E4+wp-E-#oxC|6yBt=!Y*6L0 zV1LDV*AeG72kaSm#QScw;lLa_gTAAx^Oig7tX$f0dA~rrCsLaz^S}?K2VFl6iU0Vu zX6Cf1RS!mz1oO8yuDnj)pE#=14#y2f8$WM;@#ISKeO)_A+kr3J66c?5J^SO~Y`JeO zno|oq@3(SVIpe{)t)~Yi-I`hVcBt;1t!=5_H_jY%&rSQrzAa?f%k{0ph<4^BpY^rN zOFB+JxXRAx?WYgisy~dB3Z?S1m)h#O?k{{YS1Edi@7U(m`HD4vbkOL0)!+K%iDR*g z4I^GmDQRvi-Z*QUZ`2U0E#htJ@9d5Cb}HOV41T|Sk24B7X}AAJNNcC=qC?A#KTqm> zG3fb`HMS2+eV;0Ky%XHHM0wBTG|`F2r2}@Gzi3RjRWRe7X1?o?odIU$4{cxFl&U41 zzt$S^d-fyc6=7fYXI+~*=(TLEwW@RT^4$+c4810vI<0>}hyFKW7me?|@ZQT0UIjO- zotJj}tNPYuotPe<-F7>!LIUm{&RQtO0;;mA*FkMFS8n_^~0M+bauZWx;f6M&-}pF>_H^5 zTweZWZpoMHQb(`C57wXll;7%heQS?K&UOB=>$Y>H12>dT_uR5LXodNv2x+KW@czMV zZpRNTsV|$fw1dNuMfKYrCI2>Yaix6tnky;IX4efYhBqFG-C!hf+HH8*Xk&MuihJpD zD}=?dxzf*Lm4lUI&UIg^p6$}@3tq)a=_l3&W63YMXE3Dy30KZvXYGUIMO_No0hBJ!|%QH1ynp4j)a`z!zHe7iPknM` zwqX9nMS9b+dc@ALyY}ZAFXe+r)OK%p;D4)XeoB`Co*$QPy?J+jk$RsEpKg6xpnp#~ z;7WDW-M8;PSx)W~s&QMvU~Aps@{fzmTA~*ZZ#!w58ecu!Rkb>&RpM#c+rG?6=|Z&K zm_N=Q@G(@`e8J9NVjSS2mHc>B<%h?M8a&;$^v+)6eqxqhYSNhF8;13YyU;T+d5lBd z+!f1PZ<^hY+qdP~gdf*LQLha4%>8wQEi-fk!Qz*i?>Y}QE9KtU9nb4NFZJ!pf-fifH3oSd9v3g^)Vg(~>L8;@ zZeMFhJvp11cm4f`!;5WCAMP;5Y(nXpUMrjWEgJ6Bta0>67q16z)yL@P%%57QX=mRw zX}xmd-anLd6Qzq*>_}`KtGI4VsZFiR8TstbN6z#!Gk&tQb!1~ui?pj@&(*ix#~nMI+^yVAOz&H{aQ@HRVopAuRw%b^d7-UJty5mKR>N;P*H@9I z=7L@2-5nkeampDM9ar;SAxy2({>I^PLr*z)+SE?gjC`$q>{^{vHr@0_vclk3_ti)K zuK8xl&W6~N{g;@1zNxEyZOix&YdPIoXCF<&q`E#)4Xc$*Pc4pplqh-<;H}X)@9bWa zle^PQzUCN~U!SJFd#lT{8L#qRBy>*DWzjV#QxoVl_ZwAuUiLPf266fbWms=mw`^w>wJ-Va~P1bTftT=kXnS%0e z0b?dTylJDAb1Y=A&4R+F0Z%i#+E%C+fBgLQ#hJzF)~}A8*x=ZzD=}_}sS4E$8>4P> zu3(nc(DUP0IqVVj*Rx*hWU$M;IAYh<9~Z;NBp1)D>2ET8XU7!j$jd$KM!NdXERNrTa-JwDV4W9Q5fbX zF{vE&KyrA1!3zj_U zbonPw*^p+*?P1$Czgxca%lnjwllQmU$TnC@Uq(Efza`{hx8EN2yt5{0skDzmKzdbE zb3=j6Q%$qp3#}yG+~&I*JM}kuCx71bPv4{SlRYiN=jT7$P;^ybYdvTA#q7Ug=YLwC zqpi49VzPI{aILhHJxWu}H2rV+FH;J<`(E8`zc^OMKy|vP&-bQ-H5|ls&oqa882mkAw%nxTGbw%hYD`|zv$nSN@jjaY8&BPwX>q5LYj!M2;C1s;p{O4YOSDro~(__ozh;J!7(p}s(R~k6Hr!oEXX|1FfeQ&Fx z`=;Obw8V~+o91viwqJbf#$>e{7p5CNzAG2IY_DpUvIgrwd+Cn@wYy2bduNLBuPp4_ zJjh6^VX^rg51Z3hIxMmFSQ~miyWS%5M7Z^ljUPQ`7<#v5M5Rx z{`O;g*PC6FznmF2U1?`b;pLewgC=VgdRN}>nLTRG?=zNON_bQ1o6~cPeD4!h3d1z+ zI)?Po8$4=vQ=y-!^AoGk?&D4Fe-r#^K{F1KUdmeu8o^_z-ahdc2=PfO}Bbp=E zJ9S~3w%5FsTlakr-Frf!a_3V2FZa9LO6;YldF1~3AC2`NrggZwxYN6-&9zRBTfYzc zVR!%9k<>1MGmlxF*>2#$b@a%0EB2oleCv;XYPqTwf2_IV+-hnQzVe;nqdCs6d>v2D z*pbjya7BhV*y) z(Du1GJ>M&jdt@*?&d-Yr{9yUnYt_AAJMrEz6~2=Lr%9D^%(l_S []u8 { return nil } - -/* -parse_file_md_to_html :: proc( - filename: string, - allocator: runtime.Allocator, -) -> ( - parsed: cstring, - err: os.Error, -) { - str: []u8 - str = os.read_entire_file_from_path(filename, allocator) or_return - - root := cm.parse_document(raw_data(str), len(str), cm.DEFAULT_OPTIONS) - defer cm.node_free(root) - - html := cm.render_html(root, cm.DEFAULT_OPTIONS) - defer cm.free(html) - - return html, nil -} -*/ - parse_file_md_to_html :: proc( filename: string, allocator: runtime.Allocator, diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..23b06df9e5d0883a406da8640c5c929e6b74b29f GIT binary patch literal 8196 zcmeHMTWl0n7(U;$v@_JPQ=m{-p$p5U!4gWjm{P@MTU1)K$o8@==rX%A(h1Xr|=1HF8+!w7;9z`IE!2dD=e1C}3!(}p*(?SMY2W7z( zfMhjQ2Z_pb4+w1Hp-hHyTFAhZ#uT>)gr*3u7!c;v9_QUjCPO(bq%da?<_zJ?2yZ9| zW+%IN(48SEWRyn{h$1jM0{re?%gW4TIp$q?e|K}#aw<1&Tb|$6_7$Y6>UlM_luyqSjtvYBWro$EjFoqtwDqW&)#^R+ zdN-+i3ucMD9m>0Qam?|uT0>s9^F>?t&7HQ*J5yb~moK=sz1Q_D-*TPdthRs~^^J4Q z8#D_Z$&7DK_?6MG>Yo|$+=AZ~%#hWzqG#?iX#%TccGEQ8h(6IDnkJHMA{ffa`ljWp z*52B-b^DI4yLw*SfUW0DTU6bqcF0<# z5|xeW9kP}d$u7h4-9q5?p5|C=m=CqnFiazKI(C07Eo)zpjb=F|izq!3kzQ+%^h@bI0{=lD7jZ`l!m6k~{X|=RQS|_zgozm^nE@@E8N~6-4 za7C(+Z@GpTR&t_s>_}Zk zqyTUQvsZE`2t0GD&f$g>pq#{(dcdDvZP2?19cdj6ng-Ta94a2D> zUwhDBWIwTA*-fc0Qr-66K~;dyob|xA0OZx&f^n&iqG&lz7C*&Df~srE<^ji3aEt) z>SsW^lrA{7>l~sU6+&EXbUkZTVsTCU{=aMP@Bi1c3(?x52t*P1mk~g9ce*=8gUq#s z@trYF&p~>4;{B$D3`{5sHcyhlb)4koKMbiHr>@*48OmuPsfN;j{vqI+{lbpU|LFX` IanJw10ikPxCIA2c literal 0 HcmV?d00001 diff --git a/test/website/.DS_Store b/test/website/.DS_Store index 9bfbf2cf788dd93d9da43954290a9c2960dcc2db..e9f31436269756754e880d6044ae189107713a9b 100644 GIT binary patch literal 10244 zcmeHMd2Ae48GpZL$DV0+lW`oUadtP}*mdeUHg+8+)GC1`+dLn#*8tvW@0xp7G#WRbP8*D=(55g#>Khp;7-q4vLJsJjYpEn zxaiGyhFs%jz|DZ00XG9~2HXt1#xg*fEe=iSw|lr5a5La$AU6Y|J_P9$HsshjWo7B0 zi`)W`U0Cnay+KoiPtdU;$IdBBBXmHyl2xv7wirkwMFx88W+}L#PTzyS&_s*TOHNkUD4Rqhw)G#}%Yb6zR z&AsEN6R<+f;~ok!*-hI3a5Kb!$DIb^hUz z;nA_OP&66OOeScgC>oAOGc?(3 ziO2h_J4|~te5T(#lNR^FF`7!oT`eL&KwXGL>$V&mFetRq6p7#Or#d zgtI+prfjmhesTTgVC7A3*m=v|mV=!~d*_X!4aJ@k&-FvomTg7i=D>^Fv8Bnx_XbN|1?3uuyy6y zxXa@oh=(I)+=%JQt!a{0dvdzwAVo?|bv|9~S88j4VgGTek})Swo-u^-(yiXI%p z2u$3LQqGdP2@cn98tJMmuJg%9B#d;*`ur|<=Q1z*G0@eO<%Kfn+1Bm4qS;rI9h zp2nZ?FZ>(NbIv#N626I-@gU#Ecko7jh^> zc}{WR53Itxz~PR=on75WUJuNBe7)e>#*$6fZ{D_jNByp*eXR?aR3OgcHkS>O0*iTonxL^!sAgAqDmCJcu|_qkJk=Vp#wbwD+CZH~JTgLwKkp~t@89b27>rmde^Ptkphny>t|I6kV^6U^ zvcItB*^5{U10}eDfW8aOIDjq!yMTHx#&8@bFpeP2!g-Iq$l zlZjI_NAzo?qAjeKbrGF=*bqDVl8Rb*6%|!~6%}<^RJqE!Y%oV*+gIedcb#uwaARDyJZ91`YQE`wXzA|5>rsY-<jZ0MNl~s1-bPUnR6$Z* zZ}c{aqL8glsvj4RMIN8hqbanHnE_jmqbhi@6URq1N>wFieZaQ3AS2 z%f<-__B26VEFRyEcM{ys6W~9957P4S!}th3jnCk-67(1GRk?`#79PNN@LfENNAMH; z6hFhy@hb`b7o5*FSHQiJmM#PL5>3tK!?mv{19{3jD82z4SpEP1ujn1Fvzq}o1F!82 zAiuq@y_J4rcGJG}=Zc~or1K=5;t=!Zl$9=Yk#(J{{2WgW@j1SVPBGW{%pvbXPT!oe i(w*i=ce2;$p8;3r%iFbDtGN4rcmMx?d{JM#|Nk%g0HwPC delta 149 zcmZn(XmOBWU|?W$DortDU;r^WfEYvza8E20o2aKK$_$bR@);Oh82lN+8T@jJ%bYhB zPGg_gz`L29gN1{UdGY~i@y&vQdCZd!OB-!oDYBYr^8&ea#)%C^f*{>MAi)hJTtTL8 fEd0(qnO`N418645E{4hRJX1G67A<6i>d^-PVRs-r diff --git a/test/website/HTML/.DS_Store b/test/website/HTML/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..609049f124409d353fcad65673fce0bb3b1f4a9d GIT binary patch literal 10244 zcmeHMU2GIp6uxI#=!_j@N?U$s?ZOIyQfw)OPzkVYm){nO-Ii{DXqnv^+Oe}U>(16G=mQW)=Wgyj z_nv#s+&O2zGiUA{LI^Zw)K!E82_ZaIN+l7STNFA^>rI98I1eKQ)F*Z-Zdh>~orT5?v1im~}y}qq~$Vi&j5qA6FJpu^5_xy4c2c9j4 zoo!-g5e4yhirI46vxOHPDi*~@9`cTz-+o)YlmWy*c zv%0Ov4Xq=mtIlATVkb0H)y;u!bgk*=`*kfXlt7ixZYoJ_Z2p3UrE);7m`aP6LVPR} z*PqVl&VjMglG)Ot#j@C|qOChEm0nGiPV#~~vvjd6_t2T9w1%z9^Det`g)Fw)=m|;j z1gmRAv3&^td&w44JsxqwQ2f(#@=nSV#Xe$V(S^o)3j98RA0Yzzdy;fA98PABVy;m3Rn)6Pz5Vt zEo_1o*afYy8@fP){V)J2$UqK;;Q%}b&%;r80gk~d@H)H+Z^7H}K70(Hz^CvTd;wp> zH*g-lgDda@{0LX!SNIeDf@>Vdm2u_V9Ik>3a*MbXTphQS+s^IanzzimBcNoY2#+`Qt$eo@d?gHDkZ`;w_vhzWRyGyfZq?MJ=nLBUM(iJsp>Nhst zKqQ0kIBN4_!3}^3VdDmX3y?|Rr6`mGkBY&mVzL7xM;qp85KBc&IwUUPF><6CY`9FU z1YQC*STAl6Fe;_OF&SaM=}}RX2*#*; zOOe199wSS-i;%xau8^O|Z{!-e4#glrIXs3iUjyr5Gc+UADbU-X2YR6o`ayxGUnnK-!bT*nc4a*!r4&}}uIx+F5k@Rg7X3J#T1Fz_cxsQ)368oXW7nv~Psr^@te3Yf`3dj7w8>hJ&4&oREmz6Yj}2cR$# zjWnXc^u_;Hg`TwsvF^i43zZvX)K$S|!iNAH(Bt@JSgEXcB;xkN9&eOUR~=

CSCU9A5 Week 1

+

Read Chapters 1 and 2 of Clean Code

+
+

You get the drift. Indeed, the ratio of time spent reading vs. writing is well over 10:1. We are constantly reading old code as part of the effort to write new code. Because this ratio is so high, we want the reading of code to be easy, even if it makes the writing harder. Of course there’s no way to write code without reading it, so making it easy to read actually makes it easier to write.

+
+

Class names

+
+

Classes and objects should have noun or noun phrase names like Customer, WikiPage, Account, and AddressParser. Avoid words like Manager, Processor, Data, or Info in the name of a class. A class name should not be a verb.

+
+

Method names

+
+

Methods should have verb or verb phrase names like postPayment, deletePage, or save. Accessors, mutators, and predicates should be named for their value and prefixed with get, set, and is according to the javabean standard.

+
+
string name = employee.getName();
+customer.setName("mike");
+if (paycheck.isPosted())...
+
+
+

When constructors are overloaded, use static factory methods with names that describe the arguments. For example,

+
+
Complex fulcrumPoint = Complex.FromRealNumber(23.0);  
+
+
+

is generally better than

+
+
Complex fulcrumPoint = new Complex(23.0);  
+
+
+

Consider enforcing their use by making the corresponding constructors private.

+
+

Note: Listings 2-1 and his solution in 2-2 make me cringe

+

Its too long! Random methods with very long names makes it hard to read on screens like IDE's. You also end up jumping around the code, back and forth and trying to figure out what method returns what and where the next bit of code goes. There is also the issue of creating entire methods for one case of something happening. You could easily split the decision making within the one method with better coding. You can check if there is more and 0 counts and then handle what happens there. We already have access to all the variables we need passed as parameters, why split this off into many methods. I hate it.

+

Extended BNF (EBNF)

+
    +
  • We can use * to make things appear 0-to-many times by wrapping then in brackets
  • +
+
N ::== a | (b | c)*
+
+

This can be read as "N may consist of a or alternatively a series of characters comprising zero to many b or c". A valid syntax matching this rule would include:

+
    +
  • "a"
  • +
  • an empty string (the * helps with this as its 0 to many)
  • +
  • "b"
  • +
  • "c"
  • +
  • "bc"
  • +
  • "cb"
  • +
  • "cbcbcbc"
  • +
  • or "ccccccb"
  • +
+

Example

+

We have a simple programming language that allows the user to write arithmetic sums for some existing variables a, b, c, d, or e. We can use +, -, /, * and () on the variables too.

+
Expression              ::== primary-Expression (Operator primary-Expression)*
+primary-Expression      ::== Identifier
+                            | (Expression)
+Idenifier               ::== a | b | c | d | e
+Operator                ::== + | - | / | *
+
+

For example:

+
a + (b * c)
+
+

Here you can view the Java specifications as well as Pythons! Go has a very good break down of its grammar, with lots of documentation!

+

Triangle

+

Features of Triangle

+
    +
  • +

    Three primitive types of variables:

    +
      +
    • Boolean (i.e. true or false)
    • +
    • Char (a single character; same as the Java char type)
    • +
    • Integer (values between -32767 and 32767)
    • +
    +
  • +
  • +

    Two types of composite variable:

    +
      +
    • Records (a bit like dictionaries in python)
    • +
    • Arrays
    • +
    +
  • +
  • +

    There are no strings or floating point types built-in

    +
  • +
  • +

    Let blocks are used to declare local constants, variables, procedures and functions (see repl.tri and factorials.ri below)

    +
  • +
  • +

    The only conditional command is if and the only loop command is while

    +
  • +
  • +

    if commands look like this:

    +
      +
    • if x < y then dostuff else dootherstuff
    • +
    • the “else” is needed, but can just be followed by ; (do nothing)
    • +
    +
  • +
  • +

    while commands look like this:

    +
      +
    • while x < y do dostuff
    • +
    +
  • +
  • +

    begin and end signify a block of commands; the same as {} in Java or indentation in Python

    +
  • +
  • +

    Assignment of a value to a variable is done using the := operator like this

    +
      +
    • a := 10
    • +
    • +
    +
  • +
  • +

    We can also bind values within declarations by using ~

    +
  • +
  • +

    put() and get(), and similarly named functions, are used to write and read from the console

    +
  • +
+

Examples of Triangle (.tri)

+
#hi.tri
+begin
+    put('H'); put('i'); put('!')
+end
+
+

Output: Hi!

+
#while.tri
+let
+    var a : Integer
+in
+begin
+    a := 0;
+    while a < 5 do
+    begin
+        put('a');
+        a := a + 1;
+    end
+end
+
+

Output: aaaaa

+
#str.tri
+let
+    type Str ~ array 10 of Char;
+    
+    func replicate (c: Char): Str ~
+        [c,c,c,c,c,c,c,c,c,c];
+        
+  var s: Str
+in
+
+begin
+    s := replicate('*');
+    put (s[0]); put(s[9]); puteol()
+end
+
+

Output: **

+

AST Examples

+

See OneNote folder (Year\ 3/AST/) for the answers

+

Syntactic Analysis

+

Let's have a look at Java's syntax

+
int myNumber = 55;
+
+

Kindis the category (Identifier, Integer etc) +Spelling is the actual text used in the code

+

Let's break it down into tokens:

+
    +
  • int - of kind Identifier(name of type) (spelling "int")
  • +
  • myNumber - of kind Identifier(name of variable) (spelling "myNumber")
  • +
  • = - of kind Becomes (spelling "=")
  • +
  • 55 of kind Integer Literal (spelling "55")
  • +
  • ; of kind Semicolon (spelling ";")
  • +
+

Below is the same example in Triangle:

+
let
+    var myNumber : Integer
+in 
+    myNumber := 55
+
+

Let's break it down into tokens again:

+
    +
  • let, :, var, in of kind let, :, var, in (spelling "let, :, var, in ")
  • +
  • := of kind Becomes (spelling "Becomes")
  • +
  • myNumber of kind Identifier (spelling "myNumber")
  • +
  • Integer of kind Identifier (spelling "Integer")
  • +
  • 55 of kind Integer Literal (spelling "55")
  • +
+

Scanning a string into tokens

+

The basic ideas is that we have a loop implemented using recursion that gobbles up characters from the text until they match a known template for a token.

+
myNumber := 55+ 10
+^
+
+

Our starting point is char 'm', so we assume that we are working along a Identifier. We continue working our way through to the end of the word (until we hit a space). At this stage, it is impossible to know if we are working with either method names, string literals or anything of that nature.

+
myNumber := 55+ 10
+~~~~~~~~^
+
+

We now check that string with a list of reserved words (such as if, end, while). If it was, say for example, if, the kind of this token will be set to If. We don't match any known reserved words so this token is labelled as an Identifier with the spelling "myNumber".

+
myNumber := 55+ 10
+~~~~~~~~~^
+
+

We now keep moving along the spaces until we hit something other than a space. We've hit a colon. There are two types of colon in Triangle, one for separating a variable type from its name or a colon-equals (Becomes token). Let's take the next character as we will know what to do with it after this.

+
myNumber := 55+ 10
+~~~~~~~~~~^
+
+

It is an colon equals sign. That tells us that the token is Becomes with the spelling ":="

+
myNumber := 55+ 10
+~~~~~~~~~~~~^
+
+

We hit a 5. Triangle can only support Integer types (handy!) so we know that we can carry along this number until we hit something that isn't a number (to get the full context of the Integer). In this case, we move along until we hit a space!

+
myNumber := 55+ 10
+~~~~~~~~~~~~~~^
+
+

We've hit something that isn't a digit! This means that this token is of kind Integer Literal and has the spelling "55".

+
myNumber := 55+ 10
+~~~~~~~~~~~~~~^
+
+

The next character is a plus. Operators can start with this character so we keep taking characters until reaching something that's not an operator. The next character is a space

+
myNumber := 55+ 10
+~~~~~~~~~~~~~~~~~~^
+
+

We hit another Integer (10!) and reach the EOL (end of line). Most methods use recursion to keep reading until we reach the end of a line of a end of file.

+

Syntactic Analysis: Parsing into an AST

+

Let's create a theoretical language, Micro-English. Here is the EBNF:

+
Sentence    ::== Subject Verb Object .
+Subject     ::== I | a Noun | the Noun
+Object      ::== Me | a Noun | the Noun 
+Noun        ::== cat | mat | rat
+Verb        ::== like | is | see | sees
+(terminals are english lowercase words, e.g. like, the, etc)
+
+

Bottom Up

+
   Noun
+    |
+the cat sees a rat.
+
+
Subject
+ ____
+ | Noun
+ |  |
+the cat sees a rat.
+
+
  S
+ ____
+ |  N   Verb
+ |  |    |
+the cat sees a rat.
+
+
  S
+ ____
+ |  N    V      N
+ |  |    |      |
+the cat sees a rat.
+
+
  S          Obj
+ ____        ____
+ |  N    V   |  N
+ |  |    |   |  |
+the cat sees a rat.
+
+
     Sentence
+___________________
+  |      |    |   |
+  S      |   Obj  |
+ ____    |   ____ |
+ |  N    V   |  N |
+ |  |    |   |  | |
+the cat sees a rat.
+
+
+

Key definitions for compilers

+
    +
  • +

    Syntactic analysis: scanning and parsing, which takes the text of the source code and transforms it into an abstract syntax tree

    +
  • +
  • +

    Contextual analysis: checks things like variable types and scope, and creates the connections within the AST so we can later look up declarations for named identifiers like variables, constants and function.

    +
  • +
  • +

    Code generation: generates the output code, which might be machine code, another high-level language, or an intermediate language (as it the case with Java bytecode). Might also include optimisations of the code.

    +
  • +
diff --git a/test/website/HTML/A5Week2.html b/test/website/HTML/A5Week2.html new file mode 100644 index 0000000..87c9949 --- /dev/null +++ b/test/website/HTML/A5Week2.html @@ -0,0 +1,228 @@ +

CSCU9A5 Week 2

+

TODO

+
+

Read Chapter 3 of Clean Code

+
+

Contextual Analysis

+
public class Example{
+    private int count;
+    
+    public int doStuff(int[] values){
+        int count = 0;
+        ...
+    }
+}
+
+

Here there is two variables with the name count. How does the compiler know which is which?

+

Identification Tables

+

We could walk back up the abstract syntax tree to figure out what needs to go where in memory (size, type etc.). That would work but, it's slow. (Think back to Tree Walks).

+

The ID table might contain a list of these attributes or just a pointer to the place as to where the identifier was declared.

+

Declarations are functions, class in Java or even int etc.

+

A block is any part of the program that limits the scope of the declaration in Java.

+

Each declaration has a scope.

+

Monolithic Block Structure

+

A programming language exhibits a monolithic block structure if there is only one block:

+
    +
  • All declarations are global in scope
  • +
  • No identifier may be declared more than once
  • +
  • For every reference to an identifier, i, there must be a corresponding declaration of i.
  • +
+
program
+    D
+begin
+    C
+end
+
+

One block for the whole program. The ID table may look like this:

+

| Identity | Attribute | +|----------|-----------| +| b | (1) | +| n | (2) | +| c | (3) |

+
program
+(1) integer b = 10
+(2) integer n
+(3) char c 
+begin
+...
+n = n * b
+...
+write c
+...
+end
+
+

Flat Block Structure

+

Several overlapping blocks, local and global scopes.

+

Nested Block Structure

+

Most programming languages fall into this structure (Java, C and Python).

+

Many scope levels, declarations can be global (scope level 1, outer most scope) in scope or local in scope.

+

Example:

+
let
+    (1) var a : Integer
+    (2) var b : Boolean
+in
+    begin
+        ....
+        let
+            (3) var b : Integer
+            (4) var c : Boolean 
+        in
+        begin
+            ....
+            let
+                (5) var d : Integer
+            in
+            ....
+        end
+    let
+        (6) var d : Boolean
+        (7) var e : Integer
+    in
+    ....
+end
+
+

| Level | Identity | Attribute | +|-------|----------|-----------| +| 1 | a | (1) | +| 1 | b | (2) | +| 2 | b | (3) | +| 2 | c | (4) | +| 3 | d | (5) | +| 2 | d | (6) | +| 2 | e | (7) |

+

What do we need to store instead of the identifiers?

+

Type Checking

+

This is a key feature in a statically typed language like Triangle or Java. This helps programmers not make mistakes (assigning a string to an int). This type checking happens at compile time.

+

The picture is much more complex for dynamically typed languages such as JavaScript or Go!

+

Runtime Organisation: Data Representation

+
+

Principles to follow with data representation:

+
+
+

(1) nonconfusion: different values of a given type should have different representations

+
+
+

(2) uniqueness: each value should always have the same representation.

+
+

All values of a given type should occupy the same amount of space, this being that an int will have a storage size of 8 bytes, a boolean value having only 1 byte and a char only having 1 byte too.

+

The compiler then can efficiently work out where to map the values in memory as it knows all the space needed.

+

Should values be represented directly or indirectly?

+

If a variable is directly represented, it simply maps to a binary representation of the variables value somewhere in heap memory.

+
| Address | Value |
+|---------|-------|  
+| 0       | ?     | int x = 130
+| 1       | ?     |    | (direct binary repr.)
+| 2       | 130   |<---|
+| 4       | ?     |
+| ...     | ...   |
+
+

If a value is indirectly, the variable maps to a handle, a pointer to a storage area where the binary representation of that variable exists (most likely in a heap memory area).

+
| Address | Value |
+|---------|-------|  
+| 0       | ?     | Object x = new Object()
+| 1       | ?     |    | (indirect binary repr.)
+| 2       | 160   |<---| (160 is an addr. in memory)
+| 4       | ?     |
+| ...     | ...   |
+| 160     |Object |
+| 161     |  data |
+| 162     |  here |
+| 163     |etc... |
+
+

Indirect representation is necessary for variable whose values vary in size by a large amount e.g. dynamic arrays or objects. (Think malloc() in C).

+

Primate Types

+

Primate types are stored directly, as this is more efficient than managing a pointer and the allocation of space in heap memory.

+

Integer, Boolean and Char types are supported directly by the target machine with corresponding operations like add, multiply etc.

+

Composite Types

+

Composite types are types which can be simplified into collections of primitive types.

+

Record

+

Record: A collection of variables of fields, each of which has an identifier.

+
    +
  • Records in Triangle
  • +
  • Structs in C, Go etc.
  • +
  • Java Class with only public variables (closest anyway...)
  • +
+

Simplest way to store this in memory is to store the variables consecutively in memory (like in a row).

+
type Date = record
+        y : Integer
+        m : Integer
+        d : Integer
+        end;
+
+type Details = record
+        manager : Boolean
+        joined  : Date
+        dep     : Char
+        end;
+
+

This could be stored in memory like so:

+
var person : Details
+
+| Address | Value |
+|---------|-------|
+| 1       | ??    |
+| 2       | true  | <-- person.manager
+| 2       | 1992  | <---  person.joined.y ]
+| 4       | 3     | <---  person.joined.m ]> person.joined
+| 5       | 1     | <---  person.joined.d ]
+| 6       | 'c'   | <-- person.dep
+| 7       | ??    |
+
+
+

Array

+

Array: consists of several elements which are all of the same type. Each element is referenced by an index (often an integer), there is a one-to-one relationship between indexes and array elements. Arrays start at 0 (some terrible languages don't)

+

We are talking about static arrays (defined at compile time to a fixed size) but some languages support dynamic arrays whereby the length can vary at runtime.

+

For dynamic arrays, we need a handle for the array where it points to the beginning and the end addresses somewhere else in the memory.

+

Static arrays could look like this:

+
| Address | Value |
+|---------|-------|
+| 1       | ??    |
+| 2       | ??    |
+| 3       | ??    |
+| 4       | 'h'   |  a[0]
+| 5       | 'e'   |  a[1]
+| 6       | 'l'   |  a[2]
+| 7       | 'l'   |  a[3]
+| 8       | 'o'   |  a[4]
+| 9       | '!'   |  a[5]
+| 10      | ??    |
+| 11      | ??    |
+| ...     | ...   |
+
+

Accessing the elements of this array requires an extra computation at runtime compared to accessing a single variable or a record field.

+

Expression Evaluation

+

To summarise, broadly there are two approaches to storing temporary values: registers and stack. Registers are fixed locations that can be referenced directly, but this means a tricky process of choosing which registers to hold which values. Stacks grow and shrink to accommodate new values, but lead to simpler evaluation of expressions.

+
+

Summary of Key Concepts

+
    +
  • +

    Identification Table: associates identifiers with a list of attributes, or the original declaration

    +
  • +
  • +

    Declaration: something like a function declaration in python, class declaration in Java, or a variable declaration like “int a;” in Java

    +
  • +
  • +

    Scope: each declaration has a scope, which is the portion of the program that the declaration takes effect.

    +
  • +
  • +

    Block: any part of the program that limits the scope of a declaration (e.g. curly brackets in Java, indentation in Python) In Triangle, scope is determined by the let...in... Command.

    +
  • +
  • +

    Block structure: there are three types of block structure: monolithic, flat, and nested

    +
  • +
  • +

    Non-confusion: different values of a given type should have different representations

    +
  • +
  • +

    Uniqueness: each value should always have the same representation.

    +
  • +
+

Two issues to remember in practice:

+
    +
  • +

    All values of a given type should occupy the same amount of space

    +
  • +
  • +

    Should values be represented directly or indirectly? If all values of a given type occupy the same space (that is, the same number of bits or bytes), it is possible for the compiler to plan the allocation of space efficiently simply by knowing the type of each variable.

    +
  • +
diff --git a/test/website/HTML/A5Week3.html b/test/website/HTML/A5Week3.html new file mode 100644 index 0000000..bfc7af2 --- /dev/null +++ b/test/website/HTML/A5Week3.html @@ -0,0 +1,155 @@ +

CSCU9A5 Week 3

+

By the end of this week you should have the ability to:

+
    +
  • Explain the differences between static, stack, and heap storage allocation
  • +
  • Describe the purpose of frames in a stack
  • +
  • Explain why garbage collection is needed and describe an approach to carrying it out
  • +
  • Describe what a template is in the context of code generation, and give simple examples
  • +
  • Implement simple additions to the visitor pattern within a compiler
  • +
  • Reflect on the value of where and when good commenting is needed
  • +
+

Runtime Organisation: Static Storage Allocation

+

Memory is basically like a very long list with each element having an address and a value.

+

If we have a variable that might change in size, and indirect representation is used - a pointer. This mean that the variable can occupy a fixed size space in memory because it just points to the address of where the data is really stored (usually in the heap).

+

Stack storage allocation

+
+

Stacks are last-in-first-out data structures: think of a stack of paper where you can only add or remove from the top. Stacks are an effective way to store local variables throughout the lifetime of a program.

+
+

Stack Storage Allocation:

+
    +
  • Variables are stored in frames; each frame contains the local variables for a routine
  • +
  • Global variables are stored at the base of the stack
  • +
  • Link data at the start of each frame contains: +
      +
    • Static link (reference to the start of the frame of the routine containing the current one)
    • +
    • Dynamic link (reference to the start of the frame for the previously active routine)
    • +
    • Return address (reference to the code instruction to jump back to when the routine is finished)
    • +
    +
  • +
  • When a routine is called, a new frame is pushed onto the stack; when it returns, the frame is removed
  • +
  • Arguments are placed on the stack immediately before a routine is called
  • +
  • When a routine returns, its arguments and frame are replaced by a return value on the stack
  • +
+

Example of Routines and returns

+
let
+    var g: Integer;
+    func F(m: Integer, n: Integer): Integer ~
+        m * n
+        
+in
+    begin
+        getint(var g)
+        putint(F(g, g+1))
+    end
+
+
PUSH    1
+LOADA   0[SB]
+CALL    getint
+LOAD    0[SB]
+LOAD    0[SB]
+PUSH    1
+CALL    add
+CALL(SB) F
+CALL    putint
+POP
+HALT
+
+F:
+    LOAD    -2[LB]
+    LOAD    -1[LB]
+    CALL    mult
+    RETURN(1) 2
+
+

Heap Storage Allocation and Garbage Collection

+
+

Heap storage allocation is another way to organise memory, and is good for indirect storage of variables.

+
+

A heap variable is allocated by a special command called an allocator in Java. This is whenever you use the keyword new and in C it is malloc(). These return a pointer to the variable in the heap. They exist in memory until it is unallocated (via free() in C or automatically in Java).

+

Heap is placed in opposite to the stack:

+
[   Stack   ] <-SB
+[   a       ]
+[   b       ]
+[   ......  ] <-ST
+[           ]
+[   8       ] <-HT
+[   H       ]
+[           ]
+[    Heap   ] <-HB
+
+

Heap Storage Allocation:

+
    +
  • Heaps can indirectly store more complex data structures
  • +
  • Heap variables are added to the heap when they are created
  • +
  • They are either removed by explicit deallocation, or automatically by a garbage collector
  • +
  • Gaps appear in the heap over time; these can be managed by: +
      +
    • Trying to match new variables to the closest size of available gap
    • +
    • Merging gaps when variables are deallocated
    • +
    • Compacting the heap periodically
    • +
    +
  • +
  • Garbage is when a variable is inaccessible, because no pointers to it remain in the program
  • +
  • Explicit deallocation can lead to garbage or dangling pointers
  • +
  • Automatic deallocation runs periodically, deallocating inaccessible variables
  • +
  • Instances variables for objects have a pointer to a class object that defines what methods are applicable to them
  • +
+

Code Generation: Code Selection

+

Code Selection is the process of choosing the specific machine code instructions that are needed to represent a high high-level code structure. Code Templates are used for this purpose, though it is complicated by dealing with special cases.

+

Storage Allocation is the process of deciding the addresses for each variable in the program. This is why we have spent some time discussing stack and heap memory.

+

We have parsed the program to an AST and applied contextual analysis to that AST to ensure that all the types are valid! We are now ready to generate the target code for our program.

+
n := n + 1
+
+
LOAD    n
+LOAD    1
+ADD     
+STORE   n
+
+

Adding one to a variable is very common thing to do. We can instead use this instruction

+
LOAD    n
+SUCC
+STORE   n
+
+

SUCC, means successor instruction to increase the value on the top of the stack by one. This uses 3 instructions instead of 4, meaning it is around 25% faster.

+

The Triangle Abstract Machine

+

The Triangle Abstract Machine (TAM) is a virtual machine designed as the target for our case study compiler. It is also implemented in Java, and you have a copy of it by virtue of cloning the Triangle-Tools project. TAM has the following features:

+
    +
  • +

    Its memory is organised to have a stack at the low-address end and a heap at the high address end. Low level operations are provided for adding and removing data in these

    +
  • +
  • +

    Call and return instructions for routines handle frames automatically; return automatically replaces the arguments in the stack with a result from the functions return.

    +
  • +
  • +

    The only registers are dedicated to specific purposes as we’ve described. SB, ST, HB and HT to locate the stack and heap; LB points to the topmost frame on the stack, and so on. These are updated automatically by the instructions that add or remove things from memory

    +
  • +
  • +

    Several routines such as ADD, MULT, and NOT are provided for basic arithmetic and logic operations. There are also routines for reading and writing text on the console.

    +
  • +
+

A full description of TAM is given in the extracts from Programming Language Processors in Java given in the Canvas Reading List. You don’t need to become familiar with this but the text is there to serve as reference material and you will likely want to refer to it when reading and extending the compiler.

+

From Programming Language Processors in Java: Compilers and Interpreters by Watt, D.A

+

Yarr link be here! +https://www.cin.ufpe.br/~jml/programming-language-processors-in-java-compilers-and-interpreters.9780130257864.25356.pdf

+
    +
  • Both stack and heap can expand and contrast. Storage exhaustion arises when ST and HT attempt to cross over.
  • +
+

Layout of a TAM frame

+
    +
  • A static link points to an underlying frame associated with teh routine that textually encloses R in the source program
  • +
  • The dynamic link points to the frame immediately underlying this one in the stack.
  • +
  • The return address is the address of the instruction immediately following the call instruction that activated R.
  • +
+

2023-09-28_42

+

TAM instruction format

+

All TAM instructions have a common format.

+
    +
  • op: the operation code [4bits]
  • +
  • r: a register number [4bits]
  • +
  • n: the size of the operand. [8bits]
  • +
  • d: address displacement (possibly negative) [16bit signed]
  • +
+
[  op  ][  r  ][    n    ][         d       ]
+ 4 bits  4 bits   8 bits         16 bits 
+
+

TAM instructions

+

2023-09-28_55

diff --git a/test/website/HTML/A5Week4.html b/test/website/HTML/A5Week4.html new file mode 100644 index 0000000..23e1679 --- /dev/null +++ b/test/website/HTML/A5Week4.html @@ -0,0 +1,187 @@ +

CSCU9A5 Week 4

+

Read: Chapter 5 of Clean Code

+
+

Variable declarations: Martin suggests that declarations should be as close to the usage of the variables as possible. Others feel they should all be at the top, or at least together somewhere. What's your opinion?

+
+

When it comes to variables within a program - it's important to remember 'scope'. We need to make it clear what scope the variables are in.

+

If we are declaring variables at the top of the program (not in a main but the very top) - this is what I would consider global variables. These will be used throughout the entire program and therefore be rather important e.g. A Window object. This variable will be altered through the program.

+

We've talked about global variables - let's talk about local ones.

+

I would say there are two types of local variables. One's within a methods usages and ones within loops.

+

Method usage local are the ones you would declare at the start of a function. These could be used to calculate a sum and then be returned. There is no need to put the variable else where. Now I believe you should use the variable right after declaring it in this situation.

+

Sometimes it's helpful to declare all the variables at the start - this helps give context to what the function will be doing and possibly what it is returning without the need of comments. I find this helpful for functions that handle complex maths equations.

+

The variables used within loops should come before the loops start; this gives me as a programmer better control on the scope and also context. An example could be line number, character position and file name before a for loop. I know that these three variables will be used in this for loop for keeping track of where we are in the loop.

+
+

Do you have any of your own formatting rules you follow (even if only sometimes?)

+
+

I try and reduce the amount of nesting I do - this falls under refactoring. I also like to still use {} around one line if functions too.

+

Code Generation: Algorithm

+

The Visitor Pattern is used to generate the necessary low level instructions.

+

The algorithm we are using follows the visitor pattern. We can already see this in the visualisation of the AST.

+

We specifically write visitNode methods to view the tree.

+

The Visitor pattern walks the AST calling emit() methods to generate machine code instructions as it goes. Lookups into the AST are used to decide things like the value of literals or specific operators to use.

+

Backpatching is used when we need to make forward jumps when we need them (look at visitIf command).

+

Code Generation: Resource Allocation

+
let
+    const b ~ 10;
+    var i : Integer
+in
+    i := i * b
+
+

b is bound to 10 and i is bound to an address large enough to hold an integer.

+

When b is called in the program - it should be translated to a 10 by the compiler. Each time i is used, it should be translated to a memory address.

+

In this example, the address for i is 4. The machine code could look like this:

+
LOAD    4[SB]
+LOADL   10
+CALL    mult    
+STORE   4[SB]
+
+

In any declaration, identifiers can be bound to values or addresses, and these might be known or unknown at compile time. So at any declaration, there is one of four possible known values:

+
    +
  • +

    Known Value: This is a constant declaration, e.g. b in the above program. It was bound to a literal value of 10.

    +
  • +
  • +

    Unknown Value: This is a constant expression where the right-side needs to be evaluated at runtime e.g. const b ~ a + 5 or a parameter received by a routine.

    +
  • +
  • +

    Known Address: This is a known address that is allocated and bound to a variable declaration e.g. i in the example above.

    +
  • +
  • +

    Unknown Address: This is an address bound to a variable parameter in a routine.

    +
  • +
  • +

    The specific machine codes to read and write variables and constants are wrapped up in objects that are attached to the relevant declaration nodes in the AST

    +
  • +
  • +

    These codes include either the literal value (in the case of constants bound to literals) or the necessary steps to work out the right address

    +
  • +
  • +

    Each time we have a declaration, we need to generate the instructions to increase the size of the current frame; when that declaration drops out of scope, the frame is decreased in size again by “popping” elements off the stack

    +
  • +
+

Within the Triangle Compiler

+

Known Value

+
...
+public KnownValue(int size, int value){ ... }
+...
+public void encodeFetch(Emitter ...){
+ emitter.emit(OpCode.LOADL, 0, value)
+}
+...
+
+

A Known value (KnownValue.java) is simple. Size is the amount of memory taken up by this value and Value is the value itself. encodeFetch loads the literal value onto the stack (0).

+

Unknown Value

+
...
+public UnknownValue(int size, int level, int displacement){ ... }
+...
+public void encodeFetch(Emitter ...){
+ if (vname.indexed){
+  emitter.emit(OpCode.LOADA ...
+  emitter.emit(OpCode.CALL ...
+  emitter.emit(OpCode.LOADI ...
+ } else {
+  emitter.emit(OpCode.LOAD ...
+ }
+}
+...
+
+

An Unknown Value is made up of two parts - level and displacement. Level is how nested the routine that contained this declaration. Displacement is where the entity is located relative to the base of the frame (i.e. how many words is from the start if the frame it is).

+

We can use the frame as the displacement; that's the top of the stack.

+

Code Generation: Procedures and Functions

+

How do we handle procedures and functions? These both translate to low level routines. A routine is a series of instructions and the template might look something like this:

+
elaborate [proc I () ~ C] =
+    JUMP g
+e:  execute c
+    RETURN (0) 0
+h: 
+
+
    +
  • Routines are also treated as entities, and entities to track their addresses and generate necessary low level code to run them are stored in the AST much the same as for variables
  • +
+

Compiler Optimisations

+

Compiler optimisation can happen in a few places:

+
    +
  • +

    Having a step before the code generation whereby the AST is manipulated or manipulating intermediate code if that is being generated.

    +
  • +
  • +

    At the point where code is being generated - we can use processor specific instructions can be used/exploited.

    +
  • +
  • +

    Common Sub-expression Elimination: attempts to reduce calculations that are repeated. (This only works when the code is simple).

    +
  • +
  • +

    Constant Propagation: At some point in a program - a variable might always have the same value. An algorithm to trace the flow of constant variables through the programme can be run to determine where this is guaranteed to be the case. The reference to the variable can be replaced by a literal value - reducing the need for fetches from memory.

    +
  • +
  • +

    Hoisting: If part of a computation in a loop is independent of the values that change inside the loop, it can be moved outside the loop - meaning that it is only calculated once e.g:

    +
  • +
+
while(j < k) {
+    a[j] := b + c;
+    j++;
+}
+
+

In this example: b and c can be moved outside the loop so they are only computed once. We could turn the above code into this:

+
if (j < k){
+    tmp = b + c;
+    while (j < k){
+        a[j] := tmp;
+        j++;
+    }
+}
+
+
    +
  • Loop unrolling: Reducing the amount of checks a program's loop (such as a for loop) will need. We can use some methods to half the checks or even completely remove the checks - this will result in a larger compiled program with less overhead.
  • +
  • Function Inlining: Lifts the body of the code and places it directly to where the function was called.
  • +
+

Optional reading: More examples are mentioned in the book Introduction to Compiler Design (Mogensen) cited in the module home page; also here https://compileroptimizations.com

+

Interpreters and Native Code, JIT

+

Python is an interpreted language, meaning that the instructions called are done in real time - this creates more slow-down when running the program compared to a compiled language like C.

+

Java is in the middle. Javac generates bytecode which is targeted at a virtual machine. This is then interpreted, so there is still some overhead involved when running with Java.

+

Our toy language compiles into a Tam file. This is that intermediate language similar to bytecode in Java.

+
    +
  • Interpreters for high level languages still scan and parse to generate an AST, and then visit that tree’s nodes to execute the program
  • +
  • Interpreters for low level or intermediate languages iterate over the instructions one-by-one, matching the fetch-execute cycle
  • +
  • In order of performance (approximately!): compiled native code is fastest, then intermediate code, the interpreted high level code
  • +
+

Just-in-time compilation, HotSpot, and GI

+

JIT (Just-in-Time) compilation was introduced to help speed up Java's slow interpreted bytecode. Java's compiler doesn't do much optimisation itself, the idea of JIT is to offload certain expensive CPU executions into native machine code. Only parts of the program are complied in this way rather than the whole thing (most of it wont be ran often enough to make it worthwhile.).

+

The process of targeting this extra compilation step is where the HotSpot (Oracles implementation of Java gets it name) - the targeted code is where the program runs hot.

+

Simply put, there's a count of the number of times each method, loop and numerous other structures are executed. If that number would reach a particular threshold, that relevant block of code is compiled natively on the machine!

+

JIT will also monitor branches of code and do the heavy work of lifting the never executed blocks of code from the compilation process off.

+ +

When and Where to Optimise Your Code

+

We must not prematurely optimise! We should write straight forward clean code. We don't want to write hard-to-read code; slows down development, introduce bugs that are hard to track and make maintenance so much harder.

+
log.log(Level.FINE, "..." + calcX() ... + calcY() ... );
+
+

This simple line has to be compiled and the method calls have to be computed i.e moving values on and off the stack and tracing ourselves around the program calls. If there is an error, log only reports levels higher than FINE so all that computation is wasted! We can rewrite this to:

+
if(log.isLoaggable(Level.FINE)){_
+ log.log(Level.FINE, "..." + calcX() ... + calcY() ... );
+}
+
+

This is much more efficient.

+

Sometimes we want to swap values around. We could do it like this:

+
temp = a
+a = b
+b = temp
+
+

This can be done better though. Maybe we can remove the temp variable. Let's have a look at the XOR binary function.

+

XOR works like this:

+

| ----- | - | +| 0 + 0 | 0 | +| 0 + 1 | 1 | +| 1 + 0 | 1 | +| 1 + 0 | 0 |

+

Turns out, if we use XOR in a variable three times - it swaps!

+

2023-10-02_35

+

Unfortunately, it turns out that in practise, at best this will perform the same as using a temporary variable. On many modern CPU's, copies between registers are extremely fast. Some provide low-level instructions to swap variables anyway.

+

In summary:

+
    +
  • Write clear, logical code
  • +
  • Make good design choices by selecting the right data types, the appropriate data structures and algorithms for the task at hand
  • +
  • “clever” tricks can get in the way of the compiler doing its job, and make the code harder to read and debug
  • +
  • Save the fancy optimisations until you’ve profiled the code and identified bottlenecks
  • +
diff --git a/test/website/HTML/A5Week5.html b/test/website/HTML/A5Week5.html new file mode 100644 index 0000000..bc24663 --- /dev/null +++ b/test/website/HTML/A5Week5.html @@ -0,0 +1,4 @@ +

CSCU9A5 Week 5

+

Debugging Code

+

Hello there

+

This is sync test!

diff --git a/test/website/HTML/A5Week8.html b/test/website/HTML/A5Week8.html new file mode 100644 index 0000000..6ff8db2 --- /dev/null +++ b/test/website/HTML/A5Week8.html @@ -0,0 +1 @@ +

CSCU9A5 Week 8

diff --git a/test/website/HTML/css/style.css b/test/website/HTML/css/style.css index cfcb1bc..a5b10e7 100755 --- a/test/website/HTML/css/style.css +++ b/test/website/HTML/css/style.css @@ -5,7 +5,7 @@ body { padding: 20px; background-color: #1e1e2e; - color: #cdd6f4; + color: #cdd6f4; font-family: "Roboto Mono"; font-size: 14px; line-height: 22px; diff --git a/test/website/HTML/inner/inner_test.md b/test/website/HTML/inner/inner_test.md new file mode 100644 index 0000000..89ecf4e --- /dev/null +++ b/test/website/HTML/inner/inner_test.md @@ -0,0 +1,3 @@ +# This should be in a dir + +if not, something has gone wrong diff --git a/test/website/MARKDOWN/.DS_Store b/test/website/MARKDOWN/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6030e327bbef1e2571067fdb2157f19cca5be657 GIT binary patch literal 8196 zcmeHMU2GIp6uxI#V8)Izr7aYgr3))WO0lIBLM6bqU4C0Ac3Zmrp=EYwXvfaZtUI&2 z1#E15;75!P#zg#mQKK;iqXvAD1VqJ0LmCpo15sj(i6$mKC@<)_b7x7nb@fStI=7j7 z?mg$8d*^<0zPWp*gb--WsOt!+CWP>KQ7M&S^(Tee={2ixo<=|k=ub#Gp0iVN!-~%u z>nnT&d<1+1d<1+1d<51y6FA<>chag^5hCMmSr2Fc?%1r@K zmZI7%*v34-^$B`1?8!+cU00lwWe?!Ff|p_db4PoS4o4aG8LCi)i#FEF+UN(NdmJj6?&LyCRjk1>r7E+`+%0VQ3}G@`PIRds~=sz zX-mtFJ^Q+*r1Aw7VwJe4H>=xv+|YV*y6TMfDRx3LRoxuv$7f zq}z5e4uu<-p)zmxBt0B!NF#}m4swW$kqL5~oFQ+L_sJ#l8M#cZk{jd}`GNdG?vUSs zgA(AO92P?jtcF^sgSD^`wm}E%gHG5FeW1Z%7=aXIAP3`c1fGEta0;G<)9@m^0sE zb9=aUu7m60hPV;V;4*9vT%NE)g?r0yAbYfNo)TG_ z$3}<5l{~UXn!~z}h_yWOMw-jIYXkK>GF9T-uGko85|EEl3G1#6Y!Y}0SZA}iML=ds zrBgD7{C2_^>q5jYA@!2~=FCo%9(!*lRFyaZ?9Wq1|dg10gF--Y)u^v}V0 z_yjJ(CAbWqdnCAy6!;!~o)OmjW`y;O11D)kBHnj#zV8L+LjBn*Ero%fwA8;DksAH0 zLn|9in}%hM;H-J772eY9UI|lG)BJyX@$dh$9es_DfRDg`1_3CIL?f-ZonkKznrjE~ zI)oQ3blfD9t_xOfI*!s!$5Gz>hat9uIF$N?JvqrFYOvh%4*~b|x3_=(`{zH+tM9+_ F{|~X))BOMd literal 0 HcmV?d00001 diff --git a/test/website/MARKDOWN/A5Week1.md b/test/website/MARKDOWN/A5Week1.md index 7749b98..1cb5f47 100644 --- a/test/website/MARKDOWN/A5Week1.md +++ b/test/website/MARKDOWN/A5Week1.md @@ -1,38 +1,51 @@ # CSCU9A5 Week 1 ## Read Chapters 1 and 2 of Clean Code +> > You get the drift. Indeed, the ratio of time spent reading vs. writing is well over 10:1. We are constantly reading old code as part of the effort to write new code. Because this ratio is so high, we want the reading of code to be easy, even if it makes the writing harder. Of course there’s no way to write code without reading it, so making it easy to read actually makes it easier to write. ### Class names +> > Classes and objects should have noun or noun phrase names like Customer, WikiPage, Account, and AddressParser. Avoid words like Manager, Processor, Data, or Info in the name of a class. A class name should not be a verb. ### Method names +> > Methods should have verb or verb phrase names like postPayment, deletePage, or save. Accessors, mutators, and predicates should be named for their value and prefixed with get, set, and is according to the javabean standard. + ```java string name = employee.getName(); customer.setName("mike"); if (paycheck.isPosted())... ``` + > When constructors are overloaded, use static factory methods with names that describe the arguments. For example, + ```java Complex fulcrumPoint = Complex.FromRealNumber(23.0); ``` + > is generally better than + ```java Complex fulcrumPoint = new Complex(23.0); ``` + > Consider enforcing their use by making the corresponding constructors private. ### Note: Listings 2-1 and his solution in 2-2 make me cringe + Its too long! Random methods with very long names makes it hard to read on screens like IDE's. You also end up jumping around the code, back and forth and trying to figure out what method returns what and where the next bit of code goes. There is also the issue of creating entire methods for one case of something happening. You could easily split the decision making within the one method with better coding. You can check if there is more and 0 counts and then handle what happens there. We already have access to all the variables we need passed as parameters, why split this off into many methods. I hate it. ## Extended BNF (EBNF) + * We can use * to make things **appear 0-to-many times** by wrapping then in brackets ```text N ::== a | (b | c)* ``` + This can be read as **"N may consist of a or alternatively a series of characters comprising zero to many b or c"**. A valid syntax matching this rule would include: + * "a" * an empty string (the * helps with this as its 0 to many) * "b" @@ -43,7 +56,9 @@ This can be read as **"N may consist of a or alternatively a series of character * or "ccccccb" ## Example + We have a simple programming language that allows the user to write arithmetic sums for some existing variables **a, b, c, d, or e**. We can use +, -, /, * and () on the variables too. + ```text Expression ::== primary-Expression (Operator primary-Expression)* primary-Expression ::== Identifier @@ -51,7 +66,9 @@ primary-Expression ::== Identifier Idenifier ::== a | b | c | d | e Operator ::== + | - | / | * ``` + For example: + ```text a + (b * c) ``` @@ -60,16 +77,16 @@ Here you can view the [Java](https://docs.oracle.com/javase/specs/jls/se18/html/ ## Triangle -## Features of Triangle: +## Features of Triangle * Three primitive types of variables: - * Boolean (i.e. true or false) - * Char (a single character; same as the Java char type) - * Integer (values between -32767 and 32767) + * Boolean (i.e. true or false) + * Char (a single character; same as the Java char type) + * Integer (values between -32767 and 32767) * Two types of composite variable: - * Records (a bit like dictionaries in python) - * Arrays + * Records (a bit like dictionaries in python) + * Arrays * There are no strings or floating point types built-in @@ -78,28 +95,30 @@ Here you can view the [Java](https://docs.oracle.com/javase/specs/jls/se18/html/ * The only conditional command is **if** and the only loop command is **while** * **if** commands look like this: - * if x < y then *dostuff* else *dootherstuff* - * the “else” is needed, but can just be followed by ; (do nothing) + * if x < y then *dostuff* else *dootherstuff* + * the “else” is needed, but can just be followed by ; (do nothing) * **while** commands look like this: - * while x < y do *dostuff* + * while x < y do *dostuff* * **begin** and **end** signify a block of commands; the same as {} in Java or indentation in Python * Assignment of a value to a variable is done using the := operator like this - * a := 10 - * + * a := 10 + * * We can also bind values within declarations by using **~** - + * **put()** and **get()**, and similarly named functions, are used to write and read from the console ### Examples of Triangle (.tri) + ``` #hi.tri begin put('H'); put('i'); put('!') end ``` + Output: **Hi!** ``` @@ -116,6 +135,7 @@ begin end end ``` + Output: **aaaaa** ``` @@ -134,13 +154,14 @@ begin put (s[0]); put(s[9]); puteol() end ``` + Output: ** ## AST Examples ***See OneNote folder (Year\ 3/AST/) for the answers*** -## Syntactic Analysis +## Syntactic Analysis Let's have a look at Java's syntax @@ -148,10 +169,11 @@ Let's have a look at Java's syntax int myNumber = 55; ``` -**Kind*** is the category (Identifier, Integer etc) +**Kind***is the category (Identifier, Integer etc) **Spelling*** is the actual text used in the code -Let's break it down into tokens: +Let's break it down into tokens: + * **int** - of kind Identifier(name of type) (spelling "int") * **myNumber** - of kind Identifier(name of variable) (spelling "myNumber") * **=** - of kind Becomes (spelling "=") @@ -168,7 +190,8 @@ in ``` Let's break it down into tokens again: -* **let, :, var, in** of kind let, :, var, in (spelling "let, :, var, in ") + +* **let, :, var, in** of kind let, :, var, in (spelling "let, :, var, in ") * **:=** of kind Becomes (spelling "Becomes") * **myNumber** of kind Identifier (spelling "myNumber") * **Integer** of kind Identifier (spelling "Integer") @@ -182,6 +205,7 @@ The basic ideas is that we have a loop implemented using recursion that gobbles myNumber := 55+ 10 ^ ``` + Our starting point is char 'm', so we assume that we are working along a Identifier. We continue working our way through to the end of the word (until we hit a space). At this stage, it is impossible to know if we are working with either method names, string literals or anything of that nature. ``` @@ -224,7 +248,8 @@ myNumber := 55+ 10 ~~~~~~~~~~~~~~^ ``` -The next character is a plus. Operators can start with this character so we keep taking characters until reaching something that's not an operator. The next character is a space +The next character is a plus. Operators can start with this character so we keep taking characters until reaching something that's not an operator. The next character is a space + ``` myNumber := 55+ 10 ~~~~~~~~~~~~~~~~~~^ @@ -252,6 +277,7 @@ Verb ::== like | is | see | sees | the cat sees a rat. ``` + ``` Subject ____ @@ -259,6 +285,7 @@ Subject | | the cat sees a rat. ``` + ``` S ____ @@ -266,6 +293,7 @@ the cat sees a rat. | | | the cat sees a rat. ``` + ``` S ____ @@ -273,6 +301,7 @@ the cat sees a rat. | | | | the cat sees a rat. ``` + ``` S Obj ____ ____ @@ -280,6 +309,7 @@ the cat sees a rat. | | | | | the cat sees a rat. ``` + ``` Sentence ___________________ @@ -294,6 +324,7 @@ the cat sees a rat. --- ### Key definitions for compilers + * **Syntactic analysis**: scanning and parsing, which takes the text of the source code and transforms it into an abstract syntax tree * **Contextual analysis**: checks things like variable types and scope, and creates the connections within the AST so we can later look up declarations for named identifiers like variables, constants and function. diff --git a/test/website/MARKDOWN/A5Week2.md b/test/website/MARKDOWN/A5Week2.md index beb78ee..3f940c8 100644 --- a/test/website/MARKDOWN/A5Week2.md +++ b/test/website/MARKDOWN/A5Week2.md @@ -1,4 +1,4 @@ -# CSCU9A5 Week 2 +# CSCU9A5 Week 2 TODO > Read Chapter 3 of Clean Code @@ -22,20 +22,21 @@ Here there is two variables with the name **count**. How does the compiler know We could walk back up the abstract syntax tree to figure out what needs to go where in memory (size, type etc.). That would work but, it's slow. (Think back to Tree Walks). -The ID table might contain a list of these *attributes* or just a *pointer* to the place as to where the identifier was declared. +The ID table might contain a list of these *attributes* or just a *pointer* to the place as to where the identifier was declared. -Declarations are functions, class in Java or even int etc. +Declarations are functions, class in Java or even int etc. A *block* is any part of the program that limits the scope of the declaration in Java. -Each declaration has a **scope**. +Each declaration has a **scope**. ### Monolithic Block Structure A programming language exhibits a monolithic block structure if there is only one block: + * All declarations are **global in scope** * No identifier may be declared more than once -* For every reference to an identifier, *i*, there must be a corresponding declaration of *i*. +* For every reference to an identifier, *i*, there must be a corresponding declaration of *i*. ```code program @@ -51,7 +52,7 @@ One block for the **whole** program. The ID table may look like this: |----------|-----------| | b | (1) | | n | (2) | -| c | (3) | +| c | (3) | ```code program @@ -69,15 +70,16 @@ end ### Flat Block Structure -Several overlapping blocks, local and global scopes. +Several overlapping blocks, local and global scopes. ### Nested Block Structure Most programming languages fall into this structure (Java, C and Python). -Many scope levels, declarations can be global (scope level 1, outer most scope) in scope or local in scope. +Many scope levels, declarations can be global (scope level 1, outer most scope) in scope or local in scope. Example: + ```code let (1) var a : Integer @@ -116,7 +118,7 @@ end What do we need to store instead of the identifiers? -## Type Checking +## Type Checking This is a key feature in a **statically** typed language like Triangle or Java. This helps programmers not make mistakes (assigning a string to an int). This type checking happens at compile time. @@ -134,7 +136,7 @@ All values of a given type should occupy the same amount of space, this being th The compiler then can efficiently work out where to map the values in memory as it knows all the space needed. -Should values be represented directly or indirectly? +Should values be represented directly or indirectly? If a variable is directly represented, it simply maps to a binary representation of the variables value somewhere in heap memory. @@ -150,7 +152,6 @@ If a variable is directly represented, it simply maps to a binary representation If a value is indirectly, the variable maps to a **handle**, a pointer to a storage area where the binary representation of that variable exists (most likely in a heap memory area). - ```text | Address | Value | |---------|-------| @@ -179,12 +180,13 @@ Composite types are types which can be simplified into collections of primitive ### Record -**Record**: A collection of variables of fields, each of which has an identifier. +**Record**: A collection of variables of fields, each of which has an identifier. + * Records in Triangle * Structs in C, Go etc. * Java Class with only public variables (closest anyway...) -Simplest way to store this in memory is to store the variables consecutively in memory (like in a row). +Simplest way to store this in memory is to store the variables consecutively in memory (like in a row). ```code type Date = record @@ -201,6 +203,7 @@ type Details = record ``` This could be stored in memory like so: + ```text var person : Details @@ -216,7 +219,6 @@ var person : Details ``` - ### Array **Array**: consists of several elements which are all of the same type. Each element is referenced by an index (often an integer), there is a one-to-one relationship between indexes and array elements. Arrays start at 0 (some terrible languages don't) @@ -251,7 +253,9 @@ Accessing the elements of this array requires an extra computation at runtime co To summarise, broadly there are two approaches to storing temporary values: registers and stack. Registers are fixed locations that can be referenced directly, but this means a tricky process of choosing which registers to hold which values. Stacks grow and shrink to accommodate new values, but lead to simpler evaluation of expressions. --- + ## Summary of Key Concepts + * Identification Table: associates identifiers with a list of attributes, or the original declaration * Declaration: something like a function declaration in python, class declaration in Java, or a variable declaration like “int a;” in Java @@ -261,13 +265,13 @@ To summarise, broadly there are two approaches to storing temporary values: regi * Block: any part of the program that limits the scope of a declaration (e.g. curly brackets in Java, indentation in Python) In Triangle, scope is determined by the let...in... Command. * Block structure: there are three types of block structure: monolithic, flat, and nested - + * Non-confusion: different values of a given type should have different representations * Uniqueness: each value should always have the same representation. - + Two issues to remember in practice: - + * All values of a given type should occupy the same amount of space - + * Should values be represented directly or indirectly? If all values of a given type occupy the same space (that is, the same number of bits or bytes), it is possible for the compiler to plan the allocation of space efficiently simply by knowing the type of each variable. diff --git a/test/website/MARKDOWN/A5Week3.md b/test/website/MARKDOWN/A5Week3.md index cbf02d1..95b4af4 100644 --- a/test/website/MARKDOWN/A5Week3.md +++ b/test/website/MARKDOWN/A5Week3.md @@ -9,27 +9,30 @@ By the end of this week you should have the ability to: * **Implement** simple additions to the visitor pattern within a compiler * **Reflect** on the value of where and when good commenting is needed -## Runtime Organisation: Static Storage Allocation +## Runtime Organisation: Static Storage Allocation + Memory is basically like a very long list with each element having an address and a value. If we have a variable that might change in size, and indirect representation is used - a pointer. This mean that the variable can occupy a fixed size space in memory because it just *points* to the address of where the data is really stored (usually in the **heap**). -### Stack storage allocation +### Stack storage allocation > Stacks are last-in-first-out data structures: think of a stack of paper where you can only add or remove from the top. Stacks are an effective way to store local variables throughout the lifetime of a program. ***Stack Storage Allocation:*** + * Variables are stored in frames; each frame contains the local variables for a routine * Global variables are stored at the base of the stack * Link data at the start of each frame contains: - * Static link (reference to the start of the frame of the routine containing the current one) - * Dynamic link (reference to the start of the frame for the previously active routine) - * Return address (reference to the code instruction to jump back to when the routine is finished) + * Static link (reference to the start of the frame of the routine containing the current one) + * Dynamic link (reference to the start of the frame for the previously active routine) + * Return address (reference to the code instruction to jump back to when the routine is finished) * When a routine is called, a new frame is pushed onto the stack; when it returns, the frame is removed * Arguments are placed on the stack immediately before a routine is called * When a routine returns, its arguments and frame are replaced by a return value on the stack Example of Routines and returns + ```text let var g: Integer; @@ -42,6 +45,7 @@ in putint(F(g, g+1)) end ``` + ```asm PUSH 1 LOADA 0[SB] @@ -64,9 +68,9 @@ F: ### Heap Storage Allocation and Garbage Collection -> Heap storage allocation is another way to organise memory, and is good for indirect storage of variables. +> Heap storage allocation is another way to organise memory, and is good for indirect storage of variables. -A heap variable is allocated by a special command called an allocator in Java. This is whenever you use the keyword *new* and in C it is *malloc()*. These return a pointer to the variable in the heap. They exist in memory until it is unallocated (via *free()* in C or automatically in Java). +A heap variable is allocated by a special command called an allocator in Java. This is whenever you use the keyword *new* and in C it is *malloc()*. These return a pointer to the variable in the heap. They exist in memory until it is unallocated (via *free()* in C or automatically in Java). Heap is placed in opposite to the stack: @@ -83,13 +87,14 @@ Heap is placed in opposite to the stack: ``` ***Heap Storage Allocation:*** + * Heaps can indirectly store more complex data structures * Heap variables are added to the heap when they are created * They are either removed by explicit deallocation, or automatically by a garbage collector * Gaps appear in the heap over time; these can be managed by: - * Trying to match new variables to the closest size of available gap - * Merging gaps when variables are deallocated - * Compacting the heap periodically + * Trying to match new variables to the closest size of available gap + * Merging gaps when variables are deallocated + * Compacting the heap periodically * Garbage is when a variable is inaccessible, because no pointers to it remain in the program * Explicit deallocation can lead to garbage or dangling pointers * Automatic deallocation runs periodically, deallocating inaccessible variables @@ -128,38 +133,39 @@ SUCC, means successor instruction to increase the value on the top of the stack The Triangle Abstract Machine (TAM) is a virtual machine designed as the target for our case study compiler. It is also implemented in Java, and you have a copy of it by virtue of cloning the Triangle-Tools project. TAM has the following features: -- Its memory is organised to have a stack at the low-address end and a heap at the high address end. Low level operations are provided for adding and removing data in these +* Its memory is organised to have a stack at the low-address end and a heap at the high address end. Low level operations are provided for adding and removing data in these -- Call and return instructions for routines handle frames automatically; **return** automatically replaces the arguments in the stack with a result from the functions return. +* Call and return instructions for routines handle frames automatically; **return** automatically replaces the arguments in the stack with a result from the functions return. -- The only registers are dedicated to specific purposes as we’ve described. SB, ST, HB and HT to locate the stack and heap; LB points to the topmost frame on the stack, and so on. These are updated automatically by the instructions that add or remove things from memory +* The only registers are dedicated to specific purposes as we’ve described. SB, ST, HB and HT to locate the stack and heap; LB points to the topmost frame on the stack, and so on. These are updated automatically by the instructions that add or remove things from memory -- Several routines such as ADD, MULT, and NOT are provided for basic arithmetic and logic operations. There are also routines for reading and writing text on the console. +* Several routines such as ADD, MULT, and NOT are provided for basic arithmetic and logic operations. There are also routines for reading and writing text on the console. A full description of TAM is given in the extracts from Programming Language Processors in Java given in the Canvas Reading List. You don’t need to become familiar with this but the text is there to serve as reference material and you will likely want to refer to it when reading and extending the compiler. -### From Programming Language Processors in Java: Compilers and Interpreters by Watt, D.A. +### From Programming Language Processors in Java: Compilers and Interpreters by Watt, D.A Yarr link be here! -- Both stack and heap can expand and contrast. Storage exhaustion arises when ST and HT attempt to cross over. +* Both stack and heap can expand and contrast. Storage exhaustion arises when ST and HT attempt to cross over. #### Layout of a TAM frame -- A *static link* points to an underlying frame associated with teh routine that textually encloses R in the source program -- The *dynamic link* points to the frame immediately underlying this one in the stack. -- The *return address* is the address of the instruction immediately following the call instruction that activated R. +* A *static link* points to an underlying frame associated with teh routine that textually encloses R in the source program +* The *dynamic link* points to the frame immediately underlying this one in the stack. +* The *return address* is the address of the instruction immediately following the call instruction that activated R. -![2023-09-28_42](../media/2023-09-28_42.png) +![2023-09-28_42](../media/2023-09-28_42.png) -#### TAM instruction format +#### TAM instruction format -All TAM instructions have a common format. -- *op*: the operation code [4bits] -- *r*: a register number [4bits] -- *n*: the size of the operand. [8bits] -- *d*: address displacement (possibly negative) [16bit *signed*] +All TAM instructions have a common format. + +* *op*: the operation code [4bits] +* *r*: a register number [4bits] +* *n*: the size of the operand. [8bits] +* *d*: address displacement (possibly negative) [16bit *signed*] ```text [ op ][ r ][ n ][ d ] @@ -169,25 +175,3 @@ All TAM instructions have a common format. #### TAM instructions ![2023-09-28_55](../media/2023-09-28_55.png) - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/website/MARKDOWN/A5Week4.md b/test/website/MARKDOWN/A5Week4.md index b71fade..966b332 100644 --- a/test/website/MARKDOWN/A5Week4.md +++ b/test/website/MARKDOWN/A5Week4.md @@ -1,6 +1,5 @@ # CSCU9A5 Week 4 - ## Read: Chapter 5 of Clean Code > Variable declarations: Martin suggests that declarations should be as close to the usage of the variables as possible. Others feel they should all be at the top, or at least together somewhere. What's your opinion? @@ -17,7 +16,7 @@ Method usage **local** are the ones you would declare at the start of a function Sometimes it's helpful to declare all the variables at the start - this helps give context to what the function will be doing and possibly what it is returning without the need of comments. I find this helpful for functions that handle complex maths equations. -The variables used within loops should come before the loops start; this gives me as a programmer better control on the scope and also context. An example could be line number, character position and file name before a for loop. I know that these three variables will be used in this for loop for keeping track of where we are in the loop. +The variables used within loops should come before the loops start; this gives me as a programmer better control on the scope and also context. An example could be line number, character position and file name before a for loop. I know that these three variables will be used in this for loop for keeping track of where we are in the loop. > Do you have any of your own formatting rules you follow (even if only sometimes?) @@ -29,9 +28,9 @@ The **Visitor Pattern** is used to generate the necessary low level instructions The algorithm we are using follows the **visitor pattern**. We can already see this in the visualisation of the AST. -We specifically write *visitNode* methods to view the tree. +We specifically write *visitNode* methods to view the tree. -The Visitor pattern walks the AST calling **emit()** methods to generate machine code instructions as it goes. Lookups into the AST are used to decide things like the value of literals or specific operators to use. +The Visitor pattern walks the AST calling **emit()** methods to generate machine code instructions as it goes. Lookups into the AST are used to decide things like the value of literals or specific operators to use. Backpatching is used when we need to make forward jumps when we need them (look at visitIf command). @@ -45,9 +44,9 @@ in i := i * b ``` -**b** is bound to 10 and **i** is bound to an address large enough to hold an integer. +**b** is bound to 10 and **i** is bound to an address large enough to hold an integer. -When **b** is called in the program - it should be translated to a 10 by the compiler. Each time **i** is used, it should be translated to a memory address. +When **b** is called in the program - it should be translated to a 10 by the compiler. Each time **i** is used, it should be translated to a memory address. In this example, the address for **i** is **4**. The machine code could look like this: @@ -69,7 +68,7 @@ In any declaration, identifiers can be bound to values or addresses, and these m * These codes include either the literal value (in the case of constants bound to literals) or the necessary steps to work out the right address * Each time we have a declaration, we need to generate the instructions to increase the size of the current frame; when that declaration drops out of scope, the frame is decreased in size again by “popping” elements off the stack -### Within the Triangle Compiler... +### Within the Triangle Compiler #### Known Value @@ -78,7 +77,7 @@ In any declaration, identifiers can be bound to values or addresses, and these m public KnownValue(int size, int value){ ... } ... public void encodeFetch(Emitter ...){ - emitter.emit(OpCode.LOADL, 0, value) + emitter.emit(OpCode.LOADL, 0, value) } ... ``` @@ -92,13 +91,13 @@ A **Known value** (*KnownValue.java*) is simple. *Size* is the amount of memory public UnknownValue(int size, int level, int displacement){ ... } ... public void encodeFetch(Emitter ...){ - if (vname.indexed){ - emitter.emit(OpCode.LOADA ... - emitter.emit(OpCode.CALL ... - emitter.emit(OpCode.LOADI ... - } else { - emitter.emit(OpCode.LOAD ... - } + if (vname.indexed){ + emitter.emit(OpCode.LOADA ... + emitter.emit(OpCode.CALL ... + emitter.emit(OpCode.LOADI ... + } else { + emitter.emit(OpCode.LOAD ... + } } ... ``` @@ -107,7 +106,6 @@ An **Unknown Value** is made up of two parts - level and displacement. Level is We can use the *frame* as the displacement; that's the top of the stack. - ## Code Generation: Procedures and Functions How do we handle procedures and functions? These both translate to low level routines. A routine is a series of instructions and the template might look something like this: @@ -125,13 +123,14 @@ h: ## Compiler Optimisations Compiler optimisation can happen in a few places: + * Having a step before the code generation whereby the AST is manipulated or manipulating intermediate code if that is being generated. * At the point where code is being generated - we can use processor specific instructions can be used/exploited. * **Common Sub-expression Elimination**: attempts to reduce calculations that are repeated. (This only works when the code is simple). -* **Constant Propagation**: At some point in a program - a variable might always have the same value. An algorithm to trace the flow of constant variables through the programme can be run to determine where this is guaranteed to be the case. The reference to the variable can be replaced by a literal value - reducing the need for fetches from memory. -* **Hoisting**: If part of a computation in a loop is independent of the values that change inside the loop, it can be moved *outside* the loop - meaning that it is only calculated **once** e.g: - +* **Constant Propagation**: At some point in a program - a variable might always have the same value. An algorithm to trace the flow of constant variables through the programme can be run to determine where this is guaranteed to be the case. The reference to the variable can be replaced by a literal value - reducing the need for fetches from memory. +* **Hoisting**: If part of a computation in a loop is independent of the values that change inside the loop, it can be moved *outside* the loop - meaning that it is only calculated **once** e.g: + ```code while(j < k) { a[j] := b + c; @@ -154,13 +153,13 @@ if (j < k){ * **Loop unrolling**: Reducing the amount of checks a program's loop (such as a *for* loop) will need. We can use some methods to half the checks or even completely remove the checks - this will result in a larger compiled program with less overhead. * **Function Inlining**: Lifts the body of the code and places it directly to where the function was called. -**Optional reading: More examples are mentioned in the book Introduction to Compiler Design (Mogensen) cited in the module home page; also here https://compileroptimizations.com** +**Optional reading: More examples are mentioned in the book Introduction to Compiler Design (Mogensen) cited in the module home page; also here ** ## Interpreters and Native Code, JIT -Python is an interpreted language, meaning that the instructions called are done in real time - this creates more slow-down when running the program compared to a compiled language like C. +Python is an interpreted language, meaning that the instructions called are done in real time - this creates more slow-down when running the program compared to a compiled language like C. -Java is in the middle. Javac generates *bytecode* which is targeted at a *virtual machine*. This is then interpreted, so there is still some overhead involved when running with Java. +Java is in the middle. Javac generates *bytecode* which is targeted at a *virtual machine*. This is then interpreted, so there is still some overhead involved when running with Java. Our toy language compiles into a Tam file. This is that intermediate language similar to *bytecode* in Java. @@ -174,15 +173,15 @@ JIT (Just-in-Time) compilation was introduced to help speed up Java's slow inter The process of targeting this extra compilation step is where the HotSpot (Oracles implementation of Java gets it name) - the targeted code is where the program runs hot. -Simply put, there's a count of the number of times each method, loop and numerous other structures are executed. If that number would reach a particular threshold, that relevant block of code is compiled natively on the machine! +Simply put, there's a count of the number of times each method, loop and numerous other structures are executed. If that number would reach a particular threshold, that relevant block of code is compiled natively on the machine! -JIT will also monitor branches of code and do the heavy work of lifting the *never executed* blocks of code from the compilation process off. +JIT will also monitor branches of code and do the heavy work of lifting the *never executed* blocks of code from the compilation process off. -* Search-based software engineering and genetic improvement of software is an active area of research that targets improvements to code that trades off possibly reduced functionality in return for greatly improved performance. Read more about it in this review paper: http://www0.cs.ucl.ac.uk/staff/J.Petke/papers/Petke_2017_TEVC.pdfLinks to an external site. or in these slides: http://geneticimprovementofsoftware.com/slides/PPSN2020_GItutorial.pdf +* Search-based software engineering and genetic improvement of software is an active area of research that targets improvements to code that trades off possibly reduced functionality in return for greatly improved performance. Read more about it in this review paper: to an external site. or in these slides: ## When and Where to Optimise Your Code -We must not prematurely optimise! We should write straight forward clean code. We don't want to write hard-to-read code; slows down development, introduce bugs that are hard to track and make maintenance so much harder. +We must not prematurely optimise! We should write straight forward clean code. We don't want to write hard-to-read code; slows down development, introduce bugs that are hard to track and make maintenance so much harder. ```java log.log(Level.FINE, "..." + calcX() ... + calcY() ... ); @@ -192,7 +191,7 @@ This simple line has to be compiled and the method calls have to be computed i.e ```java if(log.isLoaggable(Level.FINE)){_ - log.log(Level.FINE, "..." + calcX() ... + calcY() ... ); + log.log(Level.FINE, "..." + calcX() ... + calcY() ... ); } ``` diff --git a/test/website/MARKDOWN/A5Week8.md b/test/website/MARKDOWN/A5Week8.md index 8db8aa3..71eaa07 100644 --- a/test/website/MARKDOWN/A5Week8.md +++ b/test/website/MARKDOWN/A5Week8.md @@ -1,2 +1 @@ # CSCU9A5 Week 8 -