Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 19:02

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 19 авг 2016, 10:29 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
В Ofront есть средство для вставки фрагментов на С, непосредственно в получаемый С-листинг.
Цитата:
For procedures, Ofront allows a "-" sign after the keyword PROCEDURE
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"
  1. PROCEDURE −malloc(size: LONGINT): LONGINT
  2. "((LONGINT)malloc(size))";

Ofront translates such procedures into macro definitions which are
subject to C preprocessing.
Код: "C"
#define Mymodule_malloc(size) ((LONGINT)malloc(size))
При помощи этого механизма и хитрых макросов препроцессора ранее была сделана вставка инструкций ассемблера для Z80.

Но этот механизм ограничен. Во-первых, "телом" такой спецпроцедуры может быть только одна строка, которая транслируется в макрос препроцессора. Во-вторых, параметры-строки передаются в этот макрос в кавычках, с приведением к типу (CHAR*) и с указанием длины строки.

Длину строки можно просто игнорировать как лишний параметр макроса, Reobne нашел остроумный способ убрать ненужное приведение (CHAR*). Но вот убрать кавычки средствами С-препроцессора невозможно. Трансляция в ассемблер Z80 реализована через макрос __asm__(), встроенный в SDСС (макрос принимает ассемблерные команды именно в кавычках). В TurboC ассемблерные вставки размещаются без кавычек, поэтому такой прием нельзя применить непосредственно.

Итак, получаются 2 проблемы:
1)Тело из одной строки
2)Лишние кавычки

Можно придумать синтаксис расширенной процедуры, например:
Код: "OBERON"
  1. PROCEDURE −Name(par1,par2: T)
  2. "Строка кода 1",
  3. "Строка кода 2",
  4. "Строка кода 3";
Но во что это должно превратиться в С-листинге, ведь макроопределения в С однострочные?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 19 авг 2016, 11:31 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Сейчас транслятор Ofront, обнаружив минус после PROCEDURE ставит для этой процедуры особый флажок. Затем, когда доходит до тела процедуры, читается строка, которая запоминается в особом поле ext. Кстати, интересная недокументированная фича: похоже, строка здесь может быть задана не только в кавычках, но и перечислением кодов символов через запятую. Но не проверял, работает ли этот способ.

Думаю, не так сложно сделать, чтобы считывались и запоминались несколько строк через запятую, как в примере выше. Но во что потом это транслировать?
Может быть
Код: "OBERON"
  1. PROCEDURE −Name(par1,par2: T)
  2. "Строка_кода_1",
  3. "Строка_кода_2",
  4. "Строка_кода_3";
должно приводить к появлению набора макросов
Код: "C"
#define Mymodule_Name__1(par1,par2) Строка_кода_1
#define Mymodule_Name__2(par1,par2) Строка_кода_2
#define Mymodule_Name__3(par1,par2) Строка_кода_3


Тогда каждый вызов Name(a,b) должен транслироваться в
Код: "C"
Name__1(a,b)
Name__2(a,b)
Name__3(a,b)
Очевидна громоздкость такого решения. Также не следует забывать о проблемах с побочными эффектами, что характерно для макросов, но здесь усилено дублированием на несколько строчек. При составлении таких многострочных псевдопроцедур нужно не забыть скобки "{...}" и разделитель ";" (если требуется).


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 19 авг 2016, 12:07 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Но проблемы с кавычками это не решает. Тут потребуется что-то дополнительно. Например системная процедура
Код: "OBERON"
  1. SYSTEM.INLINE(IN Code:ARRAY OF CHAR)
которая будет в месте своего появления выводить в Си-листинг строку Code без кавычек или каких-то дополнительных атрибутов. Параметр Code должен быть строковой константой.
Это очень мощное средство! При его наличии можно обойтись и без многострочных макросов - просто использовать несколько строк SYSTEM.INLINE.
Но это низкоуровневое средство, в отличие от "PROCEDURE-", не имеющее параметров и какого-то механизма контроля за ними. Наглядность и читабельность тоже гораздо ниже, как в Оберон- , так и в Си-листинге.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 19 авг 2016, 14:39 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Saferoll писал(а):
Можно придумать синтаксис расширенной процедуры, например:
Код: "OBERON"
  1. PROCEDURE −Name(par1,par2: T)
  2. "Строка кода 1",
  3. "Строка кода 2",
  4. "Строка кода 3";
Но во что это должно превратиться в С-листинге, ведь макроопределения в С однострочные?
Более того, Олежек, именно такой способ предложил в итоге Йозеф Темпл. У меня в ближайших планах есть намерение реализовать в Ofront+ такие многострочные инлайн-процедуры, и транслироваться они конечно должны в функции, а не в макросы.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 19 авг 2016, 15:18 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Saferoll писал(а):
Тут потребуется что-то дополнительно. Например системная процедура
Код: "OBERON"
  1. SYSTEM.INLINE(IN Code:ARRAY OF CHAR)
которая будет в месте своего появления выводить в Си-листинг строку Code без кавычек или каких-то дополнительных атрибутов. Параметр Code должен быть строковой константой.
Это очень мощное средство! При его наличии можно обойтись и без многострочных макросов - просто использовать несколько строк SYSTEM.INLINE.
Не возражаю, можно реализовать. Но такой INLINE можно будет применять только внутри тела процедур, что снижает его полезность.

Saferoll писал(а):
Но это низкоуровневое средство, в отличие от "PROCEDURE-", не имеющее параметров и какого-то механизма контроля за ними. Наглядность и читабельность тоже гораздо ниже, как в Оберон- , так и в Си-листинге.
Это да.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club