OberonCore https://forum.oberoncore.ru/ |
|
Компилятор, реализация SET-операций https://forum.oberoncore.ru/viewtopic.php?f=131&t=3411 |
Страница 1 из 2 |
Автор: | Евгений Темиргалеев [ Вторник, 19 Апрель, 2011 17:05 ] |
Заголовок сообщения: | Компилятор, реализация SET-операций |
У Вирта (заметка про SET --- http://oberoncore.ru/library/wirth_sets) используется только логический сдвиг влево. В ARM он даёт нуль, если величина сдвига >= размера регистра N. Теоретически всё выходит гладко. Итого {n} = {} для n >= N. Логично, типа не влезает. Проверка на включение n IN x даст ложь для n >= N. В интеле (ББ) сдвиги делаются по MOD N. Т.е. сдвиг на 33 = сдвиг на 1. Оминк для вычисления {n} вообще использует циклический (?) сдвиг вместо логического. Получаем жопу вида {n}={1} при n = 33. Проверка принадлежности n IN x делается спец. инструкцией BT (INSTRUCTION SET REFERENCE, A-M, с. 104/ http://www.intel.com/products/processor/manuals/). Если цель проверки — регистр (n IN {n}), то номер бита берётся по MOD N. Получаем истину n IN {n}, n = 33, {n}={1}. Если память (n IN x[0]) — то номер бита берётся по MOD N, а адрес слова — базовый + n DIV N. Здесь получается некорректное чтение памяти. Результат зависит от того, что будет в следующих словах. Код: MODULE PrivSet; IMPORT Log; PROCEDURE Test*; VAR x: ARRAY 3 OF SET; n: INTEGER; BEGIN n := 33; Log.Set({n}); Log.Ln; Log.Bool(n IN {n}); Log.Ln; Log.Bool(n IN {1}); Log.Ln; x[0] := {n}; Log.Set(x[0]); Log.Ln; x[1] := {}; Log.Bool(n IN x[0]); Log.Ln; x[1] := {1}; Log.Bool(n IN x[0]); Log.Ln; n := 65; x[2] := {}; Log.Bool(n IN x[0]); Log.Ln; x[2] := {1}; Log.Bool(n IN x[0]); Log.Ln; END Test; END PrivSet. Код: {1}
$TRUE $TRUE {1} $FALSE $TRUE $FALSE $TRUE |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 03:09 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Текущая реализация компилятора: VAR n: INTEGER; n := 33; n IN {1} = TRUE or range error if enabled VAR s: ARRAY 2 OF SET; s[0] := {}; s[1] := {1}; n IN s[0] = TRUE (* обращение идёт к s[1] *) or range error if enabled Хотелось бы исправить прежде всего реализацию (n IN s) до математического поведения при отключённых проверах границ, т.е. n IN s = FALSE, ~(0 <= n <= 31) чтобы иметь возможность писать чисто x IN {3, 5, 7} (см. http://oberoncore.ru/library/wirth_sets) вместо (0 <= x) & (x <= 31) & (x IN {3, 5, 7}) а заодно исключить некорректное обращение к памяти (n IN s[0]). Второй момент --- вычисление SET-значений, но он менее критичен. У меня есть варианты решения, но недостаточно знаний, чтобы выразить его в терминах кодогенерации компилятора ББ. Надо разбираться, а это не быстро. Товарищи, кто уже в теме, поглядите. Сложно ли это внедрить? n IN s = (n <= 31) * (n MOD 32 IN s) s IS reg MOV ECX, n CMP ECX, 31 SETBE AL (*MOV EDX, s *) (*AND ECX, 31 *) BT EDX, ECX (* CF = ECX MOD 32 IN EDX *) SETB AH AND AL, AH MOVB result, AL n IN s = (n <= 31) * (n MOD 32 IN s) s IS mem MOV ECX, n CMP ECX, 31 SETBE AL AND ECX, 31 BT s, ECX SETB AH AND AL, AH MOVB result, AL Код: StdCoder.Decode ..,, ..zm0...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX 7.2.s,6FN,,k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O NbXmb.2.Imfk2E3j0,6.,U08J99SdfJHPNjvQCJuGKfaqmY6MwdONl1QCh0708T,U..w.YafU. 2U18J99SqorGqmQCbWBxhYFWUl1UnNHEWUmr.6.wqdk5kLb0,6.,U,Yo9U00.bnUGLu8ro8quG rmCLWKqtE0E.ELU.EBU.U,2.I3l6w1.0E65.2.c8fP3d8mBE,5TeEdKLqKKtCLLCJuIepZBGom Crl0ks,ktuGdKLqKa2V.Iy1U.2.q9S.C80E.QE.sQRtIQeoBjghg2hgn7.X5.u0n9PU.Iy5.,. 60cKE.cU.UiAco,.2.7.,..Y22U,U.2.2YXK9FR81EnXE,wnjl.k.E.0.C.2.grPL.9AS3E,5T WKKvCorqqq4KrGqm8rtumdYgK,6.XDF9fR.ELO3U.Iy1.,UIU.U4.,k8EAk.8Mtr.0E.6C6.c4 E.yD2.eG..2UE0u.AU.U.Ux0EtD,2.0G.6.c,E.g0o26.Mj..2.000.O.2.f.1,,6.Mj..2.00 0.O.2.f.d.,.q9..,UUU.U4.,k8.2.Mj..2.000.O.2.f.E.Ux0.E.666.c,E.g0g02U.UQQd0 s4Rd.8ssDJuGKaaKriqtuGe4KtSqmGLWKqtC4U.kAU.E6E.M.F.5uPR9R99Sd9.3cUZT1E.c9E .c4E.szE.e0c.6YU.Ume.iFL..YddphfZcZRC.0.J0,6.242.4EIkdGLmm2CbH3hjxiIBgmxAW mHKnWGHOOHOOHWCIW0nUWnQ4HWSmIIU2U0.Z3Umr06.I26.2,2..3M.c.,.Z3.U.EZU.EME.M. kd....kW8HO0nQ0HMKoVSmIIUF.EN,.6.I26.2,2..3M.E.EN,.6.A52U.EME.M.kd....Uoga kIapwaq2abA35cUZT1E.sAE.c4E.szE.eWwpr,c.6YU76.8.0EN,.6.I26.2,2..3M.E.EN,.6 .I76.242.4.Q8....kV0HWOnQanNSmIQUAU0.Z3.U.EFU.E2E..IU,U.2.Y1Q1k8U.EFU.E2E. .M.,.,.ZJ,.o06.YB2.I86.4EZko8nMCrwCrV4Kqmqtumb0rmuKISGoGLu0LRymLOqr8ruqKLy KlKKtyKrCqr8rmuGtKrLOroKaoxhkBhXpZk3hkxbahblQaloYohbnYalAabA33MBE.EN,.2U.E 9U.E2E..676,3gwP.0.N,,.p.0..JFAE.6.VQ.k,UCU3Ikmj,6.oN2U.EBU.U,2.I3.0ES9.o. cU,6.4E3E.y3,M.FH.2UbBU.M,B.G74E3Ur7.2B2UtV,.,Mt1.xzzzzzS40EzVQU3o.6g3U3o. MWM.1.,6AM.U0G.4EoE.4o.M.1U.6AM.1.W20.Y1Q1k8U.kNU.kAU.M.X.fNFd7B6FMEE.Kk6E .0.m,..,UOD.6.W.0..36.gU56.g5czEAE.uDQ0.A2.212Uy1h,,.Q5.I6.o..Q5.2C2Uy1tF. 2Uy1L..X.9.o2czEL.E5.ER.k5.kD.k5.kD.k5.E,,k7.E8E.uDw..Q1.Q,.o0.Y22Uy1f2,.Q 0...h..l.,czk3.E9.EGE.uDQ0.Y3gU0.16.czkR3..h.0.m,..,Un.,UN.,k.4,K1kW81nFM6 .9M26.,.t..U.E9U.E2E..M.,U4Ikmj,2U.kNU.EBU.U,.JFyA.,U.2GkjD.B.SyG8Ua5V0cU. ,UW.,UN.,k.4,K1Uog4Z,0k18Mtr.0E.sA2.,UO.,.16.c8.2Uw0aU.c,,.D5.E.0.D,0.F.,. U,U4gs0E1Ub1.6.,Un.,UN.,k.4,K1.506.D61c,,.D5.E.0..2,2..BMm2.pzzzzzi,yT,WGJ qE,GomOrV6QH9P9fQRtETPPEeWqoCLEGomOrjGqmObERco2bqQZBIU2hAy4cQ.Y8.UE,Pc.7W2 hgXxhYhgmpZ2hgXVUYcZpC.k48EWKaT,UiYeZRioBaBIU2,..8n48EW...bN136F..UogVBIU0 Ad,RamIUBIU2lV2eigcs3iZJinRidxhiJUBI.EVumYuK,qE,.50aIrk48EoGLu0LR...IC.... Aa0gVeAZBoVBxd2heAhcUYcZ,.in4qk2aoa0pb8Je0Gayqnin4qk20JdyoVKIWKJdKIEGpmCLu 4HJin4ak2OpU8p2uKR0mYuIeKoXKIdiHECLR0mdKIein4aEVKoXaIbqk2aEIemt0GRqHEirNCn yin2WGJ0mlyqqUUYidhhZ3YmBgixgZ3YZJimxhm3YeAZUIZdgV7AVi3YugbUQanQbBAV7QiUIb xsSRPTrN0FVmhiiZidhhZ,.MOB969fP1fMNPN796JN8P68JN1,76,76hOEZ86RfC,NG.gZlIaB 2YU.Qiu2266PNAhN1BeAV7AV7AX7Ap76,76,76PuHh86,760mWCIgmmhKIV0JKqmM8niak2WHV GHWOIOqEX8HMUnIbU2YU665OHVWUkWkN4n2aEQCHXanMOo4OIN.hdC,76,FEeIVKIE0GE2YYoc m2akU,BV7waq2amgV4J4EQeHE00,7JZOEV86,76On2aEQGoWOn4O2kUeHE0GE2YB,2Y3BcMZZl AV7Ics2al2ak2ak24PcFZ,4HXeHE00,dIT8H,76,76K2CIaak2GoNCIMqEX81Ial.0ma.0mhKI VUqgfggc,3f7AVsAboga43aBgVn3Yu.qkt0mS0mM0mdWIa0GrmGEuKEmnS0mN4n4CLE6AN76x9 8R96t,am4CLE68R96t,2Ye2YcAaUQ8M8PM1PuHhO09uEl89,dPP6KTeIHMF18KN769OEqkVqIc akWCIgsAXN1bOFdeE9O018HPcIT8HHMF18KQcAhVBxdKtQN769OEIZdgV76HTvNRtI99RFtQHt C,7HTvNR7HRvCH68JlxCnN0mayIW0mN8ny0mS0mx4ny0mkCLE8rmCrumKu0moOKEGqoCrk8KqK 4M09eH786dmtsCPM1H.506JcAJtCPM0O3YZUghu2Y7p7.bfCUB...qmNmGEGnNqrRa.C4aKq.. .I3JN8Pk2u4gZnQbUghUIbx2YoQavgV7sQkxuKLumqqrRaEIcQ...aKngA.68.h0R1.g3ZN1.g hu22.EPqEE00kt.0Wm2aBocm.dNFp76,VUg7UUgc1lh.8ni6C30.galIbU220mVq20090b,C1. EOeHE00,dG662YY.6CHM0jdB.EPeHEEEG366O1..ldC,,,NH.,NF1GKqmMak28Y4pc4pc4VBoc m.GIR0GE66b8GNGE0GEg6QcA,98APcFZ,ocu222YB,2Y3R6i3EPqp2aU0VkgV4,OHNeHE00,tE EEMFsAkN..KHR0GE66J0667,kQak2SXk.UrIbU220Ge.,FP..MCp76,VUg7UUgc23fggZmAV7I c,pc3pc4pc4p6P.kWeHE00,tIUUMFsEN0IaBocm.j7Ap76,VUodDZeU2YU229W7AV4xa2JaBo6 UmIbU220mUuIW0GE229OEgc2398nNCINqEX816Bp76,VUg7UUQ9EN0nimmW4Y7.KoVqk4CLEeX U.M1b96vlxqLK0GzW0MPH76TeI,78P96t76VN8,tHZWnAaUYbUohdsQ,NDgd,3fcohg2YkAZio ZBBdC3ZhZZUQalAZxZZU2Zi32Ua2Yy3ZcghUEM22.oBHN1HsQ,ND2aioZnAaxZZU..WGr0WU24 OGEQ4MPHN1H.Uhhjg22MD.u4,,MPgbUQ4qk2.RXnA4.vlq.V76tND,dPH76B76C1..gB.gBEMU i,q4Q4oYUiVeA3Y7Q8.Ea.iLEiry0mkC5.6NAA.aUidCYav2Yh32Q4EakdkxuKLkIin2W0qLEO GE1GJa090dmtsCPM1.UIVnIZvgV7cJER.UWJbUIcDxdAhc,pdvgV7I6.R1.8KEenSohUAdC3Yv phUgdDZ6sCP68JN1EfErUI,g3ZN100EleHE.66PlNqEX8HMEV4HR000ma.0mWC2r0Aamg9WHVE O.6Bp766610,FEg6Q4HUngclAa4h,.jdC,,,NH.,NF1GK4124EMg,U0Rcu2YUEE8ZA760W3V1Z 7sE.MFp7666P06698FmmhK2.Icpga4ZaBo6kV4HR0GE6638J,76,76gc,lWM00HX4oNGIMqEX. GHR000mdKIe8IE0GEAcABV724ndA58APcF.jdC,762YBFV0GE0WP,QaRZZ,Zd76Cl7BfdFbVi3 Y7pdUQiUgbU23.00uaBx766HeHAZ7QCHuI,dQ9vNPMHTeJK20GrQcB38UnM1kWUcIZBxdKB,78 KN76b96JN8P684IbGo2KoV.,d8HFVGp2KIWW39uEaEIeGECIX0mS0mWCIg0mayIW.gc23fUIZd sI9W7Ac6hV,pd2BV,Zdg2Y,3dBgdDdEHcQ9vQfXg2Y,ZdBIZdk2m28oryKqWGlamR0GaEa.GJd KpW0GJaW7g6Y8sCPM1kV.UoIZvgV7AVK,Ee.CLRAcGJe,BfUYaUwd43YHh6rFle1.qU0,sQr8A v86pNDirMQbUQiPBaR3Yu.UmgfUIbx.kNqJEenS.PM0u4Q4ElUiVUQiP3aRR5cM,dCvFICnN0m a.H76HeH,VnQaUYc7peUQamgfUgbUA4HeHMAIZd68q.O3u4Y8UhcAP.,dJsQ...PFQqEE0GE.3 1.0WmAbBocm24ockIbU220maoeUUUg6Qf3FKcAvWs6BfdFdN1.CHR0GE66500090bNAsAB8CXd FPcF.hdC,,,dG662YY.MEHM0j,.2bu2YUEEG366O1..1eC,,,dE00,VP,8HQqJKKYMB,VlUYap gcogV4J4kWeHEEEC3386MEaUkMC.MAVNAp76,VUg78IEkh.animmUm2l,9uAPM1R1,FE.t,.g7 EEUdEEkqKqqqkayY7sEcP.kNg,MFkUu290EVGZnZZUgc1N1bOFdm2.A66Gq23O0.6HP.a.I6.U A,Y8c8A,R1,tAdtCPk284oBkh01ElUc6B,NHT8FM8.b7B,7FHeJ.8HEaIbkM.Y7I6.UAN0Fd8, dF18HbOF,d8HV3,kRqk4KIbGY2hgqlm.oZBoV0Ad,FEaKrCLu8ruCKuaqruqt8k4qkdWIaymd4 Idqk4yIsKKt4Kuaqruq4aIX0GPGnK8ooGLEqorGaUAgiZgUginBhixgUIe33fiweBAVI3d3pdB A,5vPffPdPH1uIL86VQc,tAB8GrN1HMFNuI9O1HM051.MAB8GrN1BOGP6R9PPVvETOJR8J,7Y1 B6FtETOJMERWXxhppBkIin4Grmqa2hcHZeU2mV8F9uIin4SJYaIaKIEWGuKqq0rV.,fc,7AHN1 H6FTO1HM0HeF,NOR1.,NOb96bOEN86TfQ,tIF8HPM0HM0d8GU7AV1pcU2mV4YBRe03Z2hcHN8r N1Hk2KIa66Fd8,NGRvQd1.Ed0mr8LECZG3YeAZBM0HM050YdHJccY6.OoYin4MG...m2EaUI,M 07OFb8J,,70SFF1GNin4ak2akWk4k2a2..UGhV7A,HEe.A,G22G.T76ZtC,78J76bOODfP99N, 7NHfRH9N999,dQTPRR9NHfPD96dvPjPMZ9N,dP9vN19RHfR996HfPBPORPOdPS,d8H,aU3VUU7 ,.U6J8.HU2,V2kL66r76Fd8KJrCro..,d8H,aEX.B0YiZhB.VYohgh,s2,B6XtCPM0T8FrN198 HH8GjuCPc1ZuHNu9ZuHZO1P68J76ZuHNmkuKmIeDJeUAhi,Un3YeA3bOGpOF,7Y1B6T8Q9fQuK mCpoermin4CoUCpW0GIGqmGrm8rqaKrKKECqrK5H76TeFPM0bOGp02buAVohgh,6Y23U,Vloc6 BZUgdDZ6ltC,78gdVRif3YXxhpFE8qmOqr8rm0may2JV7Qe7,AaqIb7YiZ,E678.10.MAhtCPM 0bOG.bdApN0d1.VYc.A6.UnsCPM0.oaoM0d1.VYc.A6Qa43dd22cBdtCPMFbOE5uCPM1Fd8Udp hn,wB,tPVPNZHuUeA3HeF,78dPN.obU2ad2YcI3VeQOrmuKuCLEKLsGqkGrmCLEGrr0mVOIEem IAVL3d7,.EkUBM07uHM0d1OYEma.A3A,7OF2YEGIGoWC3j.H76L76dPNP1rN1HM0G5w76YYC.Q 0.T8FA,a2AV1p66H.a0aIXQcD,v76XN1HM0d0,tHB86VYB,EEWpb8JECIXU3tIwd43YdRCffP7 PNBPORPN7vCPEXa2BOGrl4W0I8..T1.JV7FuKqqsHETEEUm,0mu0Lm.d1I3a.m2.UU,PU2x7A, EX0G67HsIZuEHtCPM0HEWK2,7Y23kLM8,VcYiZ,SFF1WUQe7Jf3N8rN1HUo,T007d1.b.kbU3N G.UB,M8rV7lV.v,Y8.V2.22MHbeE,d23B6X787OFbWvk2KYH,a4.R1o6o6oV0ZeBoYUiVL3hZp hUAgXRgZRinBhixA1963POd96HfP,NP9PPTfQn99,7RFPN,7QZvP5PNbnr8LEqqkaLE4qlC40G O0GlaLuKqtQioBgmZidphbdNZvPP96d9O9P1PPNPvP2YVZgYJiZRin3Yaxhm3YV3YnM93POd96 T9Q9Xi76bPOpPNN76fvQElaLEGLo2YaxhgZhjxidphbdQ99P19RHvPCLoaKsen4akWOKnKqlGr oOrmAcYZgm,L76F7BSFF3Z0Bhoxdapgnhgo3Y2B7M8HN1Rc.7ONhXEp3kt.aEc8Z1VGlWWLs8r mCbdxBFdJ1eIWLR0GWoi17JRdHT9N9P8rN1HEfkwmGE0LtKKK0Gq4qtGLR0GW.Uv2YjJgeJbUY cZ,yIleqmCKuiXmhAUu2Y0BfIhcvgV7I666bOOP9QNPN98SVfQC56SHtCPM0HMG2ZZBig3Ywg5 bPSaGEO0bPSP96tNDSqm4rI0GeWoWuo4EtKKq442Yug5bPSiHEGomkdumXKKuWmtabdQbUQedh B..arIin4M0VfQ996pNDuoYmoR0Gq4qt2YugbU.PM0HkYEwuGuaLsumlyqq0LEaIb0mx4It8rk aLK0GWaLr4It8ryaGEO0l1IcVRiZZet3iiogjJih3Y7p759O1fQbONdP8,7JF0M07ONhX0tIdf Q7ONZPNB98lP8PM0akWuYvg,A7AjiYit3C51kx...ADEV.oA.51..aEW..kwam4ak2g6.70sEF PN5vO3ORBfN8rouqnWGwmGEuoYmIK0GbUkJCNFqkIin4....Ajg2YCB7o76Q...sHV98ZPNN1Y ZU2jg2YtBZv.HWkJiZ3YX2YCBdA3YI3d3767ONU1xhiRioJC2ZCRgjhBN76VXg6SHtC,7QZPNR 7RnHEenS2jiYCiHEWLEenS2imhgUgcCZcBAV7gcANGB86bPSP96vlouKEGJYKYBU2,b0Ud..sQ .iHEG2I6HGIWLK00PU3,EEkt0GeWoW.UH,kIg,A7C5,,7PNR9RGJY.aksKrkmqoG4Wmr8KpamR qk2M0HWjJgepZhxhYlS0GeabUYe6FE.3GeaLsGpmCbc2jg2YjJgeZZUoc,Z7am4aU7AV3lW0mm 8LtWmO8nIqk2aU7gcCN1A,N0koGqmM8PM0cHkWU3p7,NFl9Q.in4uE,G2kYI.HEd.MGRf8FdJ1 Ws,6Ju2MSp7670.a0o8ogu2YH3dDJeIBdCZev2YfJbUAdCZe3,PEVUUogUIbx6SELUvU7FIWbX ZhVRin3Yx2YCZit3iZBZUw7WGw.UkJijRgd2YDJ8abXZhV,YC...056JF09fQZnM8HPam4aU3Z 7HWcogUAdC3YdphoReZZidc7Euc9EEqHECpmG5d0P.HWa3Yx2Y7phopao2YIVUQcjdR9fQd98l 99GomO5AhitAZ7Rn9QH769eHi1a.WLLC4.5vPRvQ0GeW2P.HsO,dCv76QgjphqBggpZdFv4Kqi n4a.HMG2Zf3Yw2Ykkb83LHT0GWK4qILqokWrdK4UUgAIakIadgV7M0HMFUtpZX,.C5Usp3oC.2 Yug53uPT9PduPHePd98L96HeH,NSRlr.bXqBggBZv2YspZjJge3Yug5RWBAV7AV7g6KY0BhiZg CxhYhgn3ZCZgj3ig2Y2,dGly4dPSV99,7SNlwQ5lntKLlCKq0GRqXdphBAV7M09eHqU7Ea.... ......u2gcAVZVtIadg,KIb2YvgV76SR7RnHEe17ONh1.gV7g6AdiRbBoV0.C2A7..c8,78hOE ZGwmGEIbU.mIOWHPuWohAHtCI6odBkYMSOqr85UUYe6V13hZRAF7SNFMmGECXdMFR0Y6.wcZph 0Bhoxdk3Z0Zeg2Yslwa0BeQ9PNF7SHtCO2AjdQbBM0bPNdvE588l99mqtCLK0GX42mGEOoUkIi HEWGJQgVJimBjUQiZZiUIZdkW.IY2iW2iZ24YlQaiAaloZm2aloaUAasIbmYauAap2Yf24V7AP cUXDJ99SCoruKu8rrmKqKKtCLLC358RZ9P7ONbvM,MwdGw..umVyKrG5EWE.QcjlkaKrICUm,. .Unp3.6F6.ZD,2U.UIE.0.a.0E..k.8cCU.2.4K.s,MK6.,k,9T66.,.E2kT2.0.3gwZ.0..Y2 2U,2.2.2YXG.0U.ow6I.zY.AU.k.E.0.3o42.0..I10U.U,.JFA.0E65.2..N6yY,YZPS9L6y0 I,5TWy4PPNQiiQcj,.kAU...F.,.aU.EAjot2YbQI,AzJE.nT32XD3h.2oe2n..8U0... --- end of encoding --- |
Автор: | Trurl [ Среда, 16 Ноябрь, 2016 12:44 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Евгений Темиргалеев писал(а): Хотелось бы исправить прежде всего реализацию (n IN s) до математического поведения при отключённых проверах границ А при включенных? В определении языка указано что n должно быть между 0 и MAX(SET) и реализация исходит из этого. Иначе получаются забавные казусы: Код: x := 7; y := 31; z := 32; s := {x..z}; p := {x..y}; INCL(p, z); Попробуйте сходу угадать, чему равны s и p. |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 15:38 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
1) При включённых до обработки результата дело не дойдёт. 2) У Вирта на армовском компиляторе n IN {1}, n = 33 должно дать корректное математическое значение, в арме сдвиги по-другому работают. >В определении языка указано что n должно быть между 0 и MAX(SET) и реализация исходит из этого. Иначе получаются забавные казусы. 3) Так про эти казусы я выше и написал. Они весьма неприятные. Поэтому нужно либо иметь математически корректную реализацию --- чтобы результат был ожидаемый, либо включённые по-умолчанию проверки. А так можно и выход за пределы массивов не проверять и получать очень забавные казусы. Но это ведь не наш метод. |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 15:43 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Trurl писал(а): Код: x := 7; y := 31; z := 32; s := {x..z}; p := {x..y}; INCL(p, z); Попробуйте сходу угадать, чему равны s и p. |
Автор: | Иван Денисов [ Среда, 16 Ноябрь, 2016 16:00 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Было хорошее обсуждение этой проблемы: http://forum.blackboxframework.org/view ... f=58&t=252 Дело в производительности, операции с SET должны быть производительными, они часто используются на системном уровне. Так что лучше в компиляторе оставить как есть, а для отдельных задач сделать отдельную реализацию в "подсистеме надежных вычислений". |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 16:05 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Иван, операции с массивами тоже должны быть производительными, они тоже часто используются на системном уровне. И, раз уж речь зашла про скорость, нужно показывать конкретные места, в которых просадка по скорости создаёт реальные проблемы. Иначе получается преждевременная (необоснованная) оптимизация. |
Автор: | Trurl [ Среда, 16 Ноябрь, 2016 18:36 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Ну это ерунда выйдет: программа которая правильно работает при выключенных проверках и трапает при включенных. А предложенное решение не совсем подходит. Оно будет работать в присваиваниях, но не будет в условиях. |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 18:42 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Тема всплыла не просто так... Сейчас искал причину... пока не понял, что ситуация невозможна, и тогда вспомнил про IN. Код: CONST plus = 6; minus = 7; or = 8;
... WHILE c.sym IN {plus, minus, or} DO CASE c.sym OF <<<<<<<<< TRAP: invalid case | plus: | minus: | or: END; ... |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 18:52 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Trurl писал(а): А предложенное решение не совсем подходит. Оно будет работать в присваиваниях, но не будет в условиях. "Условие" это разве не логическая величина (n IN s) в AL и во флагах после AND AL, AH? Она вычислена неправильно?
|
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 19:45 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Trurl писал(а): Ну это ерунда выйдет: программа которая правильно работает при выключенных проверках и трапает при включенных. Да, ерунда. Но лучшая, чем когда программа неправильно работает при выключённых проверках. Включил сейчас "все проверки" и полезло в других местах, где CASEв рядом нет...Надо либо проверки на SET делать включёнными по-умолчанию, как для индексов. Либо приводить вычисления к математически корректным. Лично мне последний вариант ближе. |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 19:54 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
С точки зрения собственной производительности заменил пока (x IN y) на In(x, y) Код: PROCEDURE In (x: INTEGER; y: SET): BOOLEAN;
BEGIN RETURN (MIN(SET) <= x) & (x <= MAX(SET)) & (x IN y) END In; |
Автор: | Trurl [ Среда, 16 Ноябрь, 2016 21:05 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Евгений Темиргалеев писал(а): "Условие" это разве не логическая величина (n IN s) в AL и во флагах после AND AL, AH? Она вычислена неправильно? Да, я упустил, что флаги после AND AL, AH остаются. Но можно и проще Код: TEST reg, FFFFFFE0 ; reg<32 <=> ZF=0 BT set, reg ; reg IN set <=> CF=1 & ZF=0 CMC ; reg IN set <=> CF=0 & ZF=0 А для CF=0 & ZF=0 есть код условия. |
Автор: | Trurl [ Среда, 16 Ноябрь, 2016 21:26 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
вот примерно Код: DevCPC486:
PROCEDURE In* (VAR x, y: DevCPL486.Item); VAR mask: DevCPL486.Item; BEGIN IF y.form = Set THEN Check(x, 0, 31) END; DevCPL486.MakeConst(mask, 0FFFFFFE0H, Int32); DevCPL486.GenTest(x, mask ); DevCPL486.GenBitOp(BT, x, y); DevCPE.GenByte(0F5H); (* CMC *) Free(x); Free(y); setCC(x, gtr, FALSE, FALSE); END In; |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 22:01 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Trurl писал(а): Но можно и проще А этот вариант учитывает, что если set --- память, то reg >= 32 приводит к чтению в следующих словах памяти?
Код: TEST reg, FFFFFFE0 ; reg<32 <=> ZF=0 BT set, reg ; reg IN set <=> CF=1 & ZF=0 CMC ; reg IN set <=> CF=0 & ZF=0 А для CF=0 & ZF=0 есть код условия. |
Автор: | Trurl [ Среда, 16 Ноябрь, 2016 23:01 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Зачем? Чтение же, не запись. Или Вы хотите полностью легализовать IN с любыми целыми? |
Автор: | maliya [ Четверг, 17 Ноябрь, 2016 04:25 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Hi Евгений Темиргалеев, first I agree with you the "k IN s" should return false when out of range [0,31]. I had done a patch for this issue, but after a year and a half, after you remind me, rechecking the code again, I find it had a bug. the new fixup have done. (ps; some proc's and var's name maybe changed in my code) DevCPV486.Condition Код: | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk}); DevCPC486.In(x, y,TRUE); (* check=TRUE *) | bit: Check(n.left, ux, sx); Expr(n.right, x, {}, ux + {short}); Mem(n.left, y, DevCPT.notyp, {}, {}); DevCPC486.Load(x, {}, {short}); DevCPC486.In(x, y,FALSE); (* check=FALSE*) | queryfn: DevCP486.In Код: PROCEDURE In* (VAR x, y: DevCPL486.Item;check:BOOLEAN); (* add "check" parameter *) BEGIN IF y.form = Set THEN CheckRange(x, 0, 31) END; DevCPL486.GenBitOp(BT, x, y,check); Free(x); Free(y); SetCC(x, lss, FALSE, FALSE); (* carry set *) END In; DevCPL486.GenBitOp, main code is here: Код: PROCEDURE GenBitOp* (op: INTEGER; VAR num, dst: Item;check:BOOLEAN); (*add check *) VAR L1:Label;c:Item; (* add vars*) BEGIN IF num.mode = Con THEN GenByte(0FH); ASSERT(num.obj = NIL); GenByte(0BAH); GenCExt(op, dst); GenByte(num.offset) ELSE ASSERT((num.mode = Reg) & (num.form = Int32)); IF check THEN (*add this block*) L1:=NewLbl; MakeConst(c, 32, num.form); GenComp(c, num); GenJump(ccAE,L1,TRUE); END; GenByte(0FH); GenByte(83H + op); GenDExt(num, dst); IF check THEN SetLabel(L1);END; (*add this line*) END; IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END END GenBitOp; after fixup, the "k in s" will plus 5 bytes code than before;not modify the SYSTEM.BIT function and "3 IN s" const k expression; the previous one I say it had bug, for having modified the SYSTEM.BIT funtion ,produced the wrong codes. this time I fixed it. PS: the undocument function SYSTEM.BIT is for code efficiency, no check range [0,31];can be used bit test for large size bitmap. there some test for it: Код: PROCEDURE S_BIT(); (* S.BIT(adrOfBITMAP,k) *) VAR s:ARRAY 12 OF SET;k:INTEGER; BEGIN IF S.BIT(S.ADR(s),k) THEN END; END S_BIT; PROCEDURE Bit*(); VAR b:BOOLEAN;x,k:INTEGER; s:ARRAY 100 OF SET; BEGIN s[0]:={1}; s[99] :={1}; k:=1; b := S.BIT(S.ADR(s),k); Log.Bool(b);Log.Ln; k:=2; b := S.BIT(S.ADR(s),k); Log.Bool(b);Log.Ln; k:=32*99+1; b := S.BIT(S.ADR(s),k); Log.Bool(b);Log.Ln; k:=32*99+2; b := S.BIT(S.ADR(s),k); Log.Bool(b);Log.Ln; END Bit; luowy |
Автор: | maliya [ Четверг, 17 Ноябрь, 2016 09:38 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
an improved one, consider the "range check" option. DevCPC486.In Код: PROCEDURE In* (VAR x, y: DevCPL486.Item); VAR L1: DevCPL486.Label; c: DevCPL486.Item; BEGIN L1:=DevCPL486.NewLbl; IF y.form = Set THEN CheckRange(x, 0, 31); IF (x.mode # Con) & ~ranchk THEN DevCPL486.MakeConst(c, 31, x.form); DevCPL486.GenComp(c, x); DevCPL486.GenJump(ccA,L1,TRUE); END; END; DevCPL486.GenBitOp(BT, x, y); DevCPL486.SetLabel(L1); Free(x); Free(y); SetCC(x, lss, FALSE, FALSE); END In; DevCPV486.condition, a bug fixup; Код: | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk});
DevCPC486.In(x, y) | bit: Check(n.left, ux, sx); Expr(n.right, x, {}, ux + {short,con}); (*here add "con" *) Mem(n.left, y, DevCPT.notyp, {}, {}); DevCPC486.Load(x, {}, {short}); DevCPC486.In(x, y) | queryfn: |
Автор: | maliya [ Четверг, 17 Ноябрь, 2016 16:13 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
DevCPV486.condition Код: | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk}); toКод: | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk}, {con, stk}); the AX is used by Евгений Темиргалеев's proposal case, here no need at all. sorry for my carelessness. I hope this forum can edit myself post freely without time limited. |
Автор: | Евгений Темиргалеев [ Пятница, 18 Ноябрь, 2016 02:20 ] |
Заголовок сообщения: | Re: Компилятор, реализация SET-операций |
Trurl писал(а): Зачем? Чтение же, не запись. Вирт предложил побитовые операции выражать через язык множеств. Отражаются они один в один. Выбиваются из схемы прямого отражения на побитовые операции только "конструирование" множеств {n} {n..m}, что Вирт и отмечает (http://oberoncore.ru/library/wirth_sets). И проверка n IN X, которая сводится к "конструированию" {n} /\ X # {}.Или Вы хотите полностью легализовать IN с любыми целыми? Если говорить непосредственно про побитовые сдвиги или проверку битов, какими эти операции реализуются, то явным образом выходит разрядность (контроль границ) и различия в машинных операциях. Например, на арме (см. примеры Вирта) сдвиг превышающий разрядность даёт 0, тогда как в интеле выполняется по модулю разрядности. На языке же множеств эти различия скрываются и есть два варианта: 1) требовать, чтобы операнды {n} {n..m} были в границах разрядности --- как в КП 2) конструировать с оглядкой на универсальное множество result = {n..m} /\ {0..MAX(SET)}. Тогда IN легализуется для любых целых. Считаю вариант (2) более логичным, поскольку он доводит до конца идею внедрения языка множеств без потери эффективности. Во-первых, конструирование не касается эффективности --- "основных" операций not or xor and. Во-вторых, полностью "легализует" одну из самых "красивых" конструкций языка множеств n IN X. См. пример Вирта (n = 2) OR (n = 3) OR (n = 5) OR (n = 7) OR (n = 11) OR (n = 13) OR (n = 17) <=> n IN {2, 3, 5, 7, 11, 13, 17}). В случае, скажем, проверки предусловий такой конструкцией мы не можем требовать, чтобы n было в границах разрядности. Половина "красот" пропадает: (0 <= n) & (n <= 31) & (n IN {2, 3, 5, 7, 11, 13, 17}). Если же говорить про (1), то выход за границы в этом случае ближе к переполнению при арифметических операциях, чем к проверке индексов массивов. А поскольку у нас "золотая середина", и переполнения проверяются только при включении всех проверок, то я признаю нелогичность в своих требованиях безусловного контроля границ выше. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |