Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Расширенное средство для вставки С-кода (in-lined C code sequence). https://zx.oberon.org/forum/viewtopic.php?f=32&t=288 |
Страница 1 из 1 |
Автор: | Saferoll [ 19 авг 2016, 10:29 ] |
Заголовок сообщения: | Расширенное средство для вставки С-кода (in-lined C code sequence). |
В Ofront есть средство для вставки фрагментов на С, непосредственно в получаемый С-листинг. Цитата: For procedures, Ofront allows a "-" sign after the keyword PROCEDURE При помощи этого механизма и хитрых макросов препроцессора ранее была сделана вставка инструкций ассемблера для Z80.in a procedure declaration to indicate that this procedure is an in-lined C code sequence. The in-lined code is written in quotation marks after the procedure heading as in the following example: Код: "OBERON"
Ofront translates such procedures into macro definitions which are subject to C preprocessing. Код: "C" #define Mymodule_malloc(size) ((LONGINT)malloc(size)) Но этот механизм ограничен. Во-первых, "телом" такой спецпроцедуры может быть только одна строка, которая транслируется в макрос препроцессора. Во-вторых, параметры-строки передаются в этот макрос в кавычках, с приведением к типу (CHAR*) и с указанием длины строки. Длину строки можно просто игнорировать как лишний параметр макроса, Reobne нашел остроумный способ убрать ненужное приведение (CHAR*). Но вот убрать кавычки средствами С-препроцессора невозможно. Трансляция в ассемблер Z80 реализована через макрос __asm__(), встроенный в SDСС (макрос принимает ассемблерные команды именно в кавычках). В TurboC ассемблерные вставки размещаются без кавычек, поэтому такой прием нельзя применить непосредственно. Итак, получаются 2 проблемы: 1)Тело из одной строки 2)Лишние кавычки Можно придумать синтаксис расширенной процедуры, например: Код: "OBERON"
|
Автор: | Saferoll [ 19 авг 2016, 11:31 ] |
Заголовок сообщения: | Re: Расширенное средство для вставки С-кода (in-lined C code sequence). |
Сейчас транслятор Ofront, обнаружив минус после PROCEDURE ставит для этой процедуры особый флажок. Затем, когда доходит до тела процедуры, читается строка, которая запоминается в особом поле ext. Кстати, интересная недокументированная фича: похоже, строка здесь может быть задана не только в кавычках, но и перечислением кодов символов через запятую. Но не проверял, работает ли этот способ. Думаю, не так сложно сделать, чтобы считывались и запоминались несколько строк через запятую, как в примере выше. Но во что потом это транслировать? Может быть Код: "OBERON"
Код: "C" #define Mymodule_Name__1(par1,par2) Строка_кода_1 Тогда каждый вызов Name(a,b) должен транслироваться в Код: "C" Name__1(a,b) |
Автор: | Saferoll [ 19 авг 2016, 12:07 ] |
Заголовок сообщения: | Re: Расширенное средство для вставки С-кода (in-lined C code sequence). |
Но проблемы с кавычками это не решает. Тут потребуется что-то дополнительно. Например системная процедура Код: "OBERON"
Это очень мощное средство! При его наличии можно обойтись и без многострочных макросов - просто использовать несколько строк SYSTEM.INLINE. Но это низкоуровневое средство, в отличие от "PROCEDURE-", не имеющее параметров и какого-то механизма контроля за ними. Наглядность и читабельность тоже гораздо ниже, как в Оберон- , так и в Си-листинге. |
Автор: | Zorko [ 19 авг 2016, 14:39 ] |
Заголовок сообщения: | Re: Расширенное средство для вставки С-кода (in-lined C code sequence). |
Saferoll писал(а): Можно придумать синтаксис расширенной процедуры, например: Более того, Олежек, именно такой способ предложил в итоге Йозеф Темпл. У меня в ближайших планах есть намерение реализовать в Ofront+ такие многострочные инлайн-процедуры, и транслироваться они конечно должны в функции, а не в макросы.Код: "OBERON"
Saferoll писал(а): Кстати, интересная недокументированная фича: похоже, строка здесь может быть задана не только в кавычках, но и перечислением кодов символов через запятую. Но не проверял, работает ли этот способ. Да, работает. Вставляет в сишный текст символы с этими кодами. Именно поэтому оказалось возможным унифицировать метод разбора такой кодовой вставки, вплоть до того, что процедура OPP.GetCode будет иметь одинаковое устроение в Ofront и BlackBox.На очереди ещё одно усовершенствование: убрать в Ofront+ лимит на макс. размер строк. Helmut Zinn писал(а): Dear Oleg
I test your changes about the procedure GetCode in DevCPP. I send your solution to Josef. Josef's answer and comments: A string constant in a code proc can be seen as an undocumented feature but both BB1.6 and Oleg's latest fix can also be seen to suffer from the same bug: The grammar in "Platform-Specific Issues (Windows)" says that there can be a sequence of constExpr separated by a comma. So, any string constant should actually be appended to the code procedure. In addition: what happens when a real constant is used? It is ignored. This is an undetected error. PROCEDURE [code] CodeProc() 1, 2.3; It's even worse: GetCode does not support ConstExpr but only numeric and string literals. Grrr... - Josef Josef experiment with the strings inside the LOOP and improved the readability. He pointed out that his version is not tested. ConstExpr is not supported. Here is his result: StdCoder.Decode ..,, ..1S....3QwdONl9RhOO9vRbf9b8R7fJHPNGomCrlAyIhgs,CbKBhZ xi2,CoruKu4qouqm8rtuGfa4.hOO9vRb1Y66wb8RTfQ9vQRtIdvPZHWKqtCa.E.U5UEw.2U.Qk lbeZ3DPuP7PNNvQRtId9NPuP7X2hgnRAXDJ.QCPuP7PNG2sET1.PuP.MHT9N9nt.G2sIdvPZnt gcghghZcZRC8T0E.kkH.T.nC,2U..X086.QC18RdfQHfMf9R9vQ7ONb1E...p.0.4U.EJYjyC. 6.VQ.EzG.zT0H6IZuH5OF7OJZOF,tF99R5uP7PNrN1HM0HcJ1eI,NNl9Rp767ONhvEV8JRtETf Pb9R98SdvC,dPN76599,NOp76HeHdOFDOFZuC,tQp76VuHHeHdOFZ86duH,NEZeI1OK,tHB86b 8GTeIduEFOEZuCPM0Hk4ak2aEc83.9ePbPRZPNNONR98NPNRfC,NGRW5lIin4a.HcJcOp76H0s CIau2YEx7cI....cE9uFHeHPM0HM0HMGB86NPNR96x76NOFR88bfLH76d8G9eHH68J76HfN,tP hPNZfNNvPj96d9O9fP,NORvMZPN1vQ996bPOpPN,tPB961fQZPMn96b96JN8PM0Hk2od3xecQi mYZUYd3p7EJ0GNamR0GXyId0Gp0GRqHE0HEGpb0Gr0mK0mM0GWyIECLNupheqi0GRqHECLjiJp qZ3pd2RbUQiUIbx22ZtCP.HMFR8FPM0HM0669ePb1sCPM082.R96pND0nR0GbKofWWg2YqYadQ bBA,H6HTuHVO1HM0akYsQnPP,ND,dPfPP3PNZ96d8G9GECKEenSYcZpCCJLaKrGLv4KqiHEKIr C5EIuKEiGE4nIin4a.HkY68596t76VN8,tHZ86FtMuHE8nOKnI0mb837ONh1uquqKuaLs0mYuI EiLtKqkmKK0GtKqkmqN8HKIiZFPGnyaGEGJYM1HU7km8LtWGPCnIiHECKEe1XtC,dP,dCvFMqk 2aU7MFsCPM0Hk2YcZpi1V5hgo3ZnBjhBZv2YnRfihfUI5CJYy2FtEFeIFtMHN8r76HeH588RP8 rN1M098HbOGB86bXUktGLtaKrSKEGJYKYU.G2ko.,N9,NAWGJKKwCKqKLmKKE0HgemIiHEKIr. .CqIin4a.HEXyId0mo0GRqXk22QgUgZUA470rGEiGEaqi0GRqX2,QioJiPBhR3Y3p7qk2M0G2k X.a0Ug22HtCk2KIb.AV7lt66QgjhhhBgUYe6V2hA.UdgV7A,HMFN0EEcP.UZJim3ZXxhhlIqk2 M09W33Y33f7ZeBA,akWuYB.Q5MGohUQYU2aUYe6h6uoWSZZ3joZZUohdQbUAhUI50nRqk2M0j8 GH8H986H96t76R967uH,NNl9RrOOv86pVnRfdhfv2Y7VdBZUgcC,gcAVZ3jo3YugbUod7ZdBAV 7Eb.0LtyqlumlyKrOrkmKLKKwGLEkmWbvgV7kYuoVmII0Ltyql.sQ99RhPMN99,7O1vQ3uP7PS HN1HkW66DONd1cUXDJ9X1xhiZimxhgZhZJinpZHZC58RZ9P7ONbvM,Mwd0.UiQcjpho,YcZRiX 3.5uPAA.cQ...sQR,.G20EtF.0.G,,6.M00.,..1cUXDJcIf9P9fQbf9bWGhigFWE.4Te.sQRd If9P9HWE.8z,E.0.L3DU.QI2U.sU.ktumdsIdPSNPN7ONbH.4D.o3aLq.,cwF.,.E2Eh6.,6.I E.EL4Iu.6F6.G.0..676.16.6.665hK2.,sFnQ.ytrM.M.6.,U0Ky8.,..e,2.A.c80S45.2UE C.6...nK1... --- end of encoding --- With Josef's changes I have not the trouble which I mentioned above. That is the current state. Oleg, please test Josef's changes and tell me if you are happy with his solution. I send a copy of this e-mail to Josef. With best regards Helmut Zinn |
Автор: | Zorko [ 19 авг 2016, 15:18 ] |
Заголовок сообщения: | Re: Расширенное средство для вставки С-кода (in-lined C code sequence). |
Saferoll писал(а): Тут потребуется что-то дополнительно. Например системная процедура Не возражаю, можно реализовать. Но такой INLINE можно будет применять только внутри тела процедур, что снижает его полезность.Код: "OBERON"
Это очень мощное средство! При его наличии можно обойтись и без многострочных макросов - просто использовать несколько строк SYSTEM.INLINE. Saferoll писал(а): Но это низкоуровневое средство, в отличие от "PROCEDURE-", не имеющее параметров и какого-то механизма контроля за ними. Наглядность и читабельность тоже гораздо ниже, как в Оберон- , так и в Си-листинге. Это да.
|
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |