OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 22:06

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




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 21 Декабрь, 2019 23:56 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Исходное название темы "Поправка: Переделать иерархию логов"

Коллеги,

когда я делал Тайлер, случайно сделал консольный лог, чтобы писать из ядра: не знал, что это уже сделано. Сейчас захотел от него отказаться и импортировать, что уже было сделано Александром Ширяевым и Иваном Денисовым. Но с наскока не смог: мой логгер ничего не импортирует, а реализация Ивана цепляет Strings, а Александра цепляет Dialog. Стал вникать, и вот как предлагаю упорядочить вещи.

Задача: дать ядру возможность писать в консольный лог, по возможности не отягощая ядро деталями реализации.

Код:
MODULE Kernel;
   Hook = POINTER TO ABSTRACT RECORD END;
   Kernel.Log = POINTER TO ABSTRACT RECORD (Hook)
      PROCEDURE String
      PROCEDURE Char
      PROCEDURE Int
      PROCEDURE Ln
   END;
   PROCEDURE SetLog(log: Log);


MODULE Log;
   Hook = POINTER TO ABSTRACT RECORD (Kernel.Log)
      PROCEDURE Real
      ...
   END;


MODULE Console;
   Console = POINTER TO ABSTRACT RECORD (Kernel.Log)
      (* Kernel.Log *) PROCEDURE String
      (* Kernel.Log *) PROCEDURE Char
      (* Kernel.Log *) PROCEDURE Int
      PROCEDURE ReadLn
   END;
   
   PROCEDURE WriteStr
   PROCEDURE WriteLn
   PROCEDURE WriteChar
   PROCEDURE ReadLn
END Console;


MODULE HostConsole;
   IMPORT SYSTEM, Kernel, (*HostLang,*) ...;
   Cons = POINTER TO RECORD (Console.Console) END;   (* not exported *)
END HostConsole;


А модуль HostLang предлагаю расформировать, функциональность из него отправить: в HostDialog - TYPE LanguageHook, в HostConsole - PROCEDURE ParseLang, VAR lang, enc.
ParseLang может отнесена быть по смыслу в HostConsole, поскольку это параметр во-первых хостовый, для взаимодействия с внешним миром; и во-вторых - все-таки уровня консоли; на уровне ГУИ в ББ используются свои обозначения языка. Ну и, в конце концов, непонятно, куда его аккуратно пристроить ). В перспективе, если появится, например, модуль HostEnv для изучения переменных окружения, можно будет туда передвинуть ParseLang(), lang и enc.

MODULE ConsLog без изменений
MODULE StdLog без изменений

Что эта "перетряска" дает:
* более стройная (на мой взгляд) линейка интерфейсов: ясно, что в системе есть понятие Log, и оно развивается и уточняется
* модуль HostConsole можно залинковать, и ядро сможет сражу же писать в консольный лог. Это, конечно, прикладным программистам до лампочки, но когда ловишь системные ошибки и всякие там сигналы - очень полезно.
* из ядра убрана сишная нечисть в виде вызовов printf и сопутствующих 0DX->0AX, CHAR->SHORTCHAR и прочих iconv, при этом ядро вполне способно даже по-русски писать в консоль

Если такая схема получит одобрение, я могу проверить ее реализацию и опубликовать результат. Что скажете, коллеги?

ПС
(Надеюсь, я не сливаю преждевременно:) насколько мне известно, начата работа над версией 1.8. Может, стоит какой-то раздел завести для обсуждений?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 08:19 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Считаю последовательной идею убирать платформенно-зависимые вызовы из ядра.

Вот тут для Windows у меня такой модуль Env и HostEnv появился когда-то. Не помню уже откуда. Может использовать как затравку.
Код:
StdCoder.Decode ..,1 ..Y.....FuPb9RTNHT9NTNFRfRRtP7vMCpwCLuKqqymayKm..tk...
 .
 1Ak...2v....58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET
 fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.4I5
 U.QklbcjRAktgdjZgZZh2hgnlsDor.kay4.qorGqmQiig76FUHZijJCbnWmqmqKWKqtcw7.,.T
 Q1A,wkBE.0E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.XN1E.CcIhgsNHT
 9N9ntQ8qorG4704D.CbB,708T1U.kRi.T.bt02U.2.4kV5.86.QC18RdfQHfMf9R9vQ7ONb17.
 ,..I16.M.,U.I3tfj1.0E65.wj1UozzzzT1.0zzzzz,myzzzzJh,Uo11.,6w.6vk14.GDA.2Uo
 1Uk1Ug1F.,6uzzzzr.UuzzzzTUizzzzTUk1UwzzzzT.E2E.WzzzzzB.6v.6w.6x.cv.cwzzzzL
 ,Uw11.Ozzzzz,mCQ72Uq11.Oyzzzz,8DI.cxk.Uu1Uw1Ui1J0.1.OD.uzzzzz,OD.GDwMwzBxd
 2heAhcU2djRiohcipivgVU2YUAdB3eDJeI3Y3phqZZUwedph,3idZZUQeNReIhcBRbB2YUM1,7
 6,tETeHb8J,NH19SNONR96v76bdAjdBjtCP66,l4EeaJcKo40GE0GE0W6xhjRhUgbU2eDBdCZe
 3JeUYeD3YGhc1xdGZccgcipii2djxhfBZB2YUEEUKBgghiZZdZphh2Yu2Y7pdIhc5hcGhVU2YU
 66KIbGoRqEE00,ldCJu8LEqHE03cIkU8Jd4og0mbOIECJYyIdGpVWoU8pRqEEM1cJ1eIP662YU
 cQ9vQ,dC,NGsFQbB.,Foyqr2Yu2Y6xhjtCP66g,2eGxd1hc2heGhcUYejRecxhmZicAdC3YnZi
 m3Yu2Y,JeG,Qc6B6H76p76buIdnRqEE66,Ff66,dQ99R,dC,tI.66komGEmqmuKEeHEa2.cE9u
 FHeHP66,FE0Wd3YugbU2av2YghgilS0GaKIbWmtGLtGmIiHEuoWSJI0GtKag2YghAiGE4HEamR
 qEEEEwe6BdAhcUAhUYbUYBYcDhVU2200ICipoqJEenSQe6x7WGECLu8rhaqi0mIi166koUd3Yf
 2YlgVU220W3,EEICUuEMWpRqEEEEIe3ZeJJeC3YmhgohVU229WUYejR8sCP66g,28.EayKrSKI
 CLu8LEsIM8,dCKIrObHZimBhixgvgVUEE0WK,66g6..22MON,IbUA7.EV.0WU22H96kR.qXA,Y
 2.EK.LVU.66S3Uw.G2EEUmlhERkbuoXWGECLuQ9A3UU.H1aafk4UUMFQ5EEICUuEMW3EEI8.g,
 g600N0rN1M168J7658Vj7Vv7VV7V38VN8V,tB7QDsF7QB7QD7AC7QB7A6z7Vf7V,8Vf7Vt7Vf7
 VvlSGMTGsQGMEemIqEE0WE,Uc2hu2Y6Vd2Y5hgo3Z7p7RPMPPN,dC,NEUD,.90MO.0GEo8QiiB
 ghhgg2YnpiVZhUIbUQ8Q5EEUghAeHE..22cQ22K2..30660GEQiiBA0Wx6JTvIEIuqkqadQbB2
 222N1qXmgaqQbB2222ROFj0hXg2YgVdQbB.,FtQCqHESpou4umXKKuKIrOro8rruqqKKrGLf4K
 taqk8KqKKICLr44x89,tQhXSZZUYhZN8rN1,,,FtYCqHEGZAVccR1nIin4UUcI.M1MFsF99RrN
 1,VBUckPGMMGMOGMMGMV..MDW10026Y5g5vFT.UE,..sI99RF,EKoiVZhu2Y,,.sCP.,76O3.Q
 C220pba283.UHtHQ6Q5cE.2YUsQEE.b0.H,66CLvUx.UqBggB3UUcQC5w8UHhgoh6...US,ofd
 gVUkWkdKKui1g,23SF01H0,EUGMMGsPGMSGsO26,tB.MDWH0zI01mTG6,mOY5g5vFTELqEE0WU
 22l6V18Vz7Vx7Vr7VN8Vj7V58Vf7V38V18VT8V,V.ZksYkUwb2q5Qc2yc2i4vFQ2b2uB..y2l7
 Vj7V,d57Q67g9P.0WJYk,ZkvYksYkUIa2qb2ya2Ka24c244H8Vf7VvFT2YrYE.6CKXUAa2qb2S
 5NGYGsOGcrYkk.qH0rXysA7gD7A6,8Vw4t,,GMYZUIc2qb24Y3ZkmYkyME7gE7A6x7V38V1mOG
 MRGMMGsOGMVA6TGL0GJam4Ec...UKBggZdZphcAhUIbUA7w6aGK0GbKYvgVUEV.66,FIcE7AC7
 QF7gD7QB7A6l7Vb7Vv7VxFUGMQ2c2qb2Ka24a2i5l,,tD02eH01Xr6AuGEqF0DI0PH0rH0vXUw
 c2Kc2q5PdE7gD7A6z7VEOGsVGMSGMMGMVUeA3EEAd43YcAhUobx2YkAZUoYU2Zd7DqokUd2YI3
 d3pdB22226ORdJ19PfPN66pVd,,78J765mX2b2Kc2Sd2Ka244fFS2YxYkysCWXu66Z7V,dC7gD
 7QD7gF7QB7oUGMV2c2q5p7Vl7V,d8.,lWM1,76K2,,.rN1,VBUE,U7phdZie2Zghgi32,,Uv.3
 0UU22RWc6OTXUAZvg,66Wqrc9hOMN1kSYhZphv.0W3pBRlmGLYyqr2ZcxhjN8P.9eHAdiBBrN1
 M13OFDOGU7pBWGNKHPam4KIbGIEWorC5cUXDJ9X1xhiZimxhgZhZJinpZHZiYRcoJigZcZRiX3
 Ul1.UiQcjpho,YcZRiX3.501PO.cQ...sQR,.G20EtV.UIU.U76.2..AU0CyIhA8pumqm8rtum
 dcIf9PY62Ulb8.CLL8pumqmY62UmT.2U.kJl16.53,6.C6.QiiQ8CJuaLqKKWKqt2Ul1.RVtZB
 E.8z16.0.E22.p00.3Qw.EL4Iu.Ka2V.6,6..UYU.AU.U.UUQoO,,c2dP.GR8N.M.6.,U0KyB.
 ,..e,2.A.c8.2UEC.6..mEw7169rwKiEw3c0Cy2lugACb1xB..0,0..606.k22.WtZCbUwYX8U
 tj00MyfUMwdc7cJ7a.Vh0...
 1Ak...JS....58FTuPE,5TWyqlKrqKKrGrtumdGLmGorCquU2hgnRAXDFTvMUn7FTvMf1G2sET
 fPdPMHfP9fQbf9hOO9vR7ONbvMoedhgrRiioedFWUkTeoxhmhgnpZHZijJC7ONbvM0.,.S.8l1
 E.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7ONbXmb.2.
 2g4k2EgO.,E.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.3c,E.CcIhgsNHT
 9N9ntQ8qorG4704D.CbB,708T1U.E4G.T.76,2U.U,wL2U00.bnUGLu8ro8quGrmCLWKqtE0E.
 ..p.0.4E.6.JFyuv.U.2m,.T2GzzzzzB.6wzzzz56vzzzzr3Uk11.mCA96xk.Uk1Ug1L.0DA.6
 vE2E.0Dwi,kzrobGoemoW0mWuKvin4qEE0GEGpg0pWqEE0WU22b8RZPORvNJ76v76VuHHeHdOF
 Z86duH,NEZeI1OK,tHB8658G1eIrN1,76,FE2djxhfJZUg5..3uIdeI1uEd86ZOF5uHZ8F,NFR
 8FrN1,76qEE0GEOpU8JEWqryqp0GR0GYyqrQbB2YUM168J7658Vj7Vv7VV7V38VN8V,tB7QDsF
 7QB7QD7AC7QB7A6z7Vf7V,8Vf7Vt7Vf7VvlSGMTGsQGML0GE0Gr4qqKKEqGEqH01XrYkmYkkYk
 xYksUU.ESkSg5x,,d8HN1,760JdyoVKIWKJdKIEWGoeHEW2aGESomGrK0GIaIb0Gr4qqcC,NEZ
 eI.kI0GR0mdGLtEK0GbKofmGE4IVCZGVvgVUEIsB7AA7AB7AA7gE.kXkS25226E6DMDqXyUi.k
 K.j,.22.m1qXxcD69,dR19P,N9,tB7QDsFMDW10GJ.V0..kdKKuq0.mGEOrkcC,NE..mGEuoW.
 I8.q.03.Cpm2djxBJ78F96p76F0HtCP66,FVKoXaIbqEE0GE0GE2hjxB,lS0GoqEE0W3p7,tI9
 9RkRUBUE,U5hAJ78HeH,,0GRA6..,VH,in40030UU22ZOFdOJZeH,7OTXiwcZZicohVhBHN1,7
 6K2SomGrRq.q.03.C3J,Ug.ME..in40030UU22F1CpmGLI.kIqEE0W3VHlRUBgcCZcUgcipiiI
 klbeZlVyKrGLtyKqmqm8rtumdGb1ZimZh2hgnRg.AS..oZ1xhiZCU2hgnRg.sEMMH1.Z1...bf
 9.EWE.8D2.Y02.A,,U..U,IklbeZFdKLqKKtCLLC3ZORNX2V.AyI,ktuGdKLqKa2V.Iy1.,UfW
 5UXW.2.52.CLLC3b8Rn9P99F9vQ0ks,Uikwm46.Zz,2.,.60cKE.cU.UiAco,gA70,E0E...7,
 ,M.,.,.,tcp00E7Gr.YuIm.k.E.0.3gwP.0..I16.M.EJ.6.VQ.E..YVsH4EKithQVs9E3Qw7W
 p,Qcj,.E6E...F.,.aU.EAjot2YbQI,AzJE.nT32XD3B,h8l24X,...
 --- end of encoding ---


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 11:55 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Я написал, как логи реализованы в Мультиобероне https://forum.oberoncore.ru/viewtopic.php?f=157&t=6428&p=110262#p110255. Но у меня там свои требования.
В качестве критики:
1. BlackBox и Kernel развивает центр, и их взгляд на мир отличается от моего, и может отличаться от Вашего, Антон. Поэтому менять ядро даже при наличии оснований - это надо убедить всех.
2. Вы можете сделать модуль Console с нулевым импортом и вызывать его откуда хотите, если подключите реализацию. Все зависит от Ваших требований.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 12:22 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Дмитрий Викторович, спасибо за информацию, полезно знать ваш use case. Мне понравилась идея иметь отдельную процедуру для вывода адресов, а не просто целых: тогда .Int выводит в десятичном формате, а .Adr - в 16ричном.

Да, поправки в Kernel - это как поправки к Конституции: надо сначала убедить Палату представителей и Сенат, а потом еще добиться ратификации всеми штатами ))). Поэтому я и завел этот разговор.

Свой Console я сделал, как вы и говорите, с нулевым импортом. Прочел ваши посты про МО. И еще краем глаза заметил, что в Та_ у вас тоже консольный лог, который с Евгением Темиргалеевым вы делали, или на основе его логгеров. Таким образом, есть два ваших Use case, один мой, очевидно, еще один у Александра Ширяева (для чего-то же он написал Console, который сейчас в ББ) и Ивана (который подтянул Console к Log.Hook), возможно, еще у Евгения. Все эти юскейсы изобрели свой велосипед; мне кажется полезным сделать выводы и, возможно, внести поправки к "Конституции".

Мой юскейс - я работал над тайловым интерфейсом, много правил HostWindows, и поэтому часто трапы не могли отобразиться в окно (ведь оконная система трапала); поэтому я сделал трап-лог в консоли. И ядро тоже слегка пришлось подправлять (напр. с Иваном Денисовым для Dialog.RunExternal), ловить ситуации, когда ББ просто молча умирал. Лог в консоль был оч полезен.

Я правильно понимаю, что "отстроиться" от уже существовавших логов вам пришлось из-за того, что их интерфейсы завязаны на вьюз, и вам пришлось бы "тащить" это в свои платформенные реализации логов?

Если так, то подошла бы вам схема, которую я предложил тут? Вы могли бы сделать расширение Kernel.Log (в котором нет ничего про вьюз) и писать из МО в такое расширение?
Или: вы могли бы реализовать OLog для ББ на основе интерфейса Kernel.Log и его реализации в HostConsole?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 12:34 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Иван Денисов писал(а):
Вот тут для Windows у меня такой модуль Env и HostEnv появился когда-то. Не помню уже откуда. Может использовать как затравку.


Иван, интересно. Прочел Env и подумал, что, наэн, все это хозяйство было бы уместно в Dialog? Там ведь уже есть commandLinePars. А реализацию в HostDialog.

ПС. Маленькое пожелание: каждый документ отдельно кодировать. Поскольку тогда можно их распаковать и посмотреть, не создавая файлов; а так приходится, просмотрев, удалять еще из файловой системы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 12:39 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Дмитрий Дагаев писал(а):
1. BlackBox и Kernel развивает центр, и их взгляд на мир отличается от моего, и может отличаться от Вашего, Антон. Поэтому менять ядро даже при наличии оснований - это надо убедить всех.

Новое ядро проектируем для версии 1.8, подключился Антон и орловцы. Вот поэтому и Борис про Utf8 написал, что раз идет редизайн ядра, то можем сделать всё более элегантно. Там ещё платформенно-независимую реализацию для сопрограмм хотелось бы иметь. Чтобы ваши модули для сопрограмм поддерживались ядром. Так что рассчитываем на вашу поддержку в этом плане также. Я делал прототипы такой поддержки, когда в Центре обсуждали внедрение сопрограмм. Так что этот вопрос выведу для обсуждения после Нового Года.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 21:29 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
adimetrius писал(а):
Я правильно понимаю, что "отстроиться" от уже существовавших логов вам пришлось из-за того, что их интерфейсы завязаны на вьюз, и вам пришлось бы "тащить" это в свои платформенные реализации логов?

Если так, то подошла бы вам схема, которую я предложил тут? Вы могли бы сделать расширение Kernel.Log (в котором нет ничего про вьюз) и писать из МО в такое расширение?
Или: вы могли бы реализовать OLog для ББ на основе интерфейса Kernel.Log и его реализации в HostConsole?

Да, правильно, но аргумента тут два:
1. Не надо тащить все, что мне не нужно (вьюз),
2. Независимость моих изменений в OLog от изменений Log.
Поэтому, если возникнет Ваш вариант, я эти изменения адаптирую в OLog.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 22:12 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
8)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 23 Декабрь, 2019 14:30 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
adimetrius писал(а):
...еще один у Александра Ширяева (для чего-то же он написал Console, который сейчас в ББ)...

Я делал реализацию, которую считал тогда целесообразной. Когда ещё ничего не было. Сейчас, если нужно, можно сделать по-другому.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 00:38 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Дмитрий Дагаев писал(а):
...Поэтому менять ядро даже при наличии оснований - это надо убедить всех.
2. Вы можете сделать модуль Console с нулевым импортом и вызывать его откуда хотите, если подключите реализацию.
Вот этот подход мне нравится. Даже если этот модуль надо будет линковать в пускач. По-моему, лучше лишние пару модулей в пускач слинковать, чем интерфейс Kernel расширять.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 06:14 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
На мой взгляд, не стоит в ядро ничего импортировать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 09:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Согласен, не надо. Потому что есть решение без импорта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 09:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Евгений Темиргалеев писал(а):
Согласен, не надо. Потому что есть решение без импорта.

Какое решение без импорта? Через процедурные переменные, которые вчера обсуждали не стоит делать. Нарушает безопасность.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 10:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
И если вернуться к самому началу, к иерархии логов, то сейчас получается следующая картина.

В эталонном ББ есть StdLog, который обозначен как средство для отладки.
Цитата:
Module StdLog provides a log text and procedures that simplify writing into the log text. Typically, log windows are only used during development, not for end user environments. The log window is opened by the following statement in procedure Config.Setup:
Dialog.Call("StdLog.Open", "", res)


И есть private interface Log, который, по описанию Центра для низкоуровноевой отладки.
Цитата:
Module Log provides an abstract interface for logging. It can be used for logging in low-level modules that cannot import StdLog directly due to cyclic imports. The logging features are the same as for StdLog except that any logging before the installation of the logging hook is silently ignored. During the normal startup of BlackBox StdLog is loaded and installs a logging hook. In principle, it would also be possible to support other logging devices such as a console, a file, or a remote server by means of appropriate implementations of the logging hook.


И предлагается еще одна точка отладочного вывода, но уже в Kernel.

Я понимаю стремление упорядочить код в Host. Но не понимаю параллельно возникающего стремления этот упорядоченный код сразу обощить для всех Host и вытащить его из Host либо в System, либо в Kernel. А обобщить сразу для всех Host по определению нельзя.

А начинали с чего? С того, чтобы printf отладочные собрать в одном месте. Собрали в HostLog с прямым импортом и все. Пусть он линкуется. Пусть самые низкоурвневые модули его импортируют. Вот и упорядочение. Надо по-особому отлаживать? -- слинковали спец. пускач с особой версией.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 10:38 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Иван Денисов писал(а):
Евгений Темиргалеев писал(а):
Согласен, не надо. Потому что есть решение без импорта.

Какое решение без импорта? Через процедурные переменные, которые вчера обсуждали не стоит делать. Нарушает безопасность.
Да, через процедурную переменную для Kernel, если для отладочного вывода в Kernel не хватает процедур на базе системного ввода-вывода и надо обязательно иметь Kernel с настраиваемым выводом.

Но действительно ли сейчас не хватает?

VAR DebugLog: PROCEDURE (IN x: ARRAY OF CHAR);
PROCEDURE String (IN x: ARRAY OF CHAR); BEGIN IF DebugLog # NIL THEN ....
PROCEDURE Int (IN x: ARRAY OF CHAR); BEGIN IF DebugLog # NIL THEN ....
PROCEDURE SetLog* (x: PROCEDURE (IN x: ARRAY OF CHAR));

Какое здесь нарушение безопасности?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 13:14 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Да так можно, только надо добавить Ln. И реализации по умолчанию в ядре.
Ну и не пойму, чем оно проще чем через ConsHook, если честно. Через ConsHook даже как-то лаконичнее...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 13:18 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Собственно для тех, кому лень лезть в ядро, но интересно о чём речь идет. Мы с adimetrius вот такую внедрили вещь в 1.8.

Код:
   TYPE
      ConsHook* = POINTER TO ABSTRACT RECORD (Hook) END;
      StdConsHook = POINTER TO RECORD (ConsHook) END;

   VAR
      consHook: ConsHook;
      stdConsHook: StdConsHook;

   PROCEDURE (ch: ConsHook) String* (IN s: ARRAY OF CHAR), NEW, ABSTRACT;
   PROCEDURE (ch: ConsHook) Ln*, NEW, ABSTRACT;

   PROCEDURE Msg (IN msg: ARRAY OF CHAR);
   BEGIN consHook.String(msg); consHook.Ln
   END Msg;

   PROCEDURE (ch: StdConsHook) Ln;
      VAR ss: ARRAY 2 OF SHORTCHAR; res: INTEGER;
   BEGIN ss[0] := 0AX; ss[1] := 0X; res := Libc.printf(ss)
   END Ln;
   
   PROCEDURE (ch: StdConsHook) String (IN str: ARRAY OF CHAR);
      CONST max = 1024;
      VAR ss: ARRAY max + 2 OF SHORTCHAR; i, j, res, len: INTEGER;
   BEGIN len := LEN(str); ss[max + 1] := 0X;
      i := 0; j := 0; WHILE (i < len) & (str[i] # 0X) DO ss[j] := SHORT(str[i]); INC(i);
         IF j = max THEN res := Libc.printf(ss); j := 0 ELSE INC(j) END
      END;
      IF j > 0 THEN ss[j] := 0X; res := Libc.printf(ss) END
   END String;

   PROCEDURE SetConsHook* (hook: ConsHook);
   BEGIN IF hook # NIL THEN consHook := hook ELSE consHook := stdConsHook END
   END SetConsHook;

BEGIN
      stdConsHook := S.VAL(StdConsHook, NewRec(S.TYP(StdConsHook)));
      consHook := stdConsHook;

   


consHook далее по плану экспортировать для использования в HostFiles и HostPackedFiles.

Суть предложения в том, что реализацию отладочного вывода ядра возможно было перенаправить куда угодно без перекомпиляции.
Хоть в файл, хоть в сеть. А также заменить в одном месте реализацию через Libc. А такая необходимость уже была озвучена.
Также возможно будет установить кодировку для вывода позднее. Чтобы в utf8 формате писать в консоль в Linux, например.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 14:44 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Может всё-таки обойдёмся без вывода через ядро?
Для отладки ядра в нём можно процедуры сделать с выводом не через printf.
Для отладки Host -- пусть будет что-то в хост, если нужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 15:21 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Может, просто добавить Write/WriteLn в сам язык?
Oh, wait...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Февраль, 2020 18:01 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Евгений Темиргалеев писал(а):
Какое здесь нарушение безопасности?


Нарушение безопасности такое:

MODULE M; IMPORT Kernel; BEGIN Kernel.DebugLog := NIL; Kernel.DebugLog("VsemuKonec")...

и все, тут будет происходит бесконечный рекурсивный вызов DefaultTrapViewer, поскольку он вызывает String, а это вызывает новый авост. Всему конец, когда стеку конец, и будет Segmentation fault core dumped

Но это можно поправить так:
Код:
MODULE Kernel;
  VAR String-: PROCEDURE (IN str: ARRAY OF CHAR);
  PROCEDURE SetString* (p: PROCEDURE (IN str: ARRAY OF CHAR));
END Kernel.


Я на днях напоролся на авост, который возникал во время работы сборщика мусора Kernel.Mark. Это я потом узнал, где он возникал, сначала ББ падал молча.
Выяснилось, что типосвязанные процедуры от ConsHook могут не работать во время сборки мусора, поскольку сборщик шаманит что-то с указателями, как-то их обращает или маркирует.
В этом смысле интерфейс на процедурных переменных для аварийного вывода надежнее, чем на производных типах.

Однако! Лично я не возьму никак в толк, что вредного в том, чтобы импортировать что-то в Kernel и поставить что-то перед ним в команде компоновки. Но, коллеги, уважительно отношусь к тому, что это может представляться вредным. Поэтому мы с Иваном сошлись на ConsHook, который он выше привел.

В (моем) идеале бы сделал так:
Код:
MODULE Con;  (* ну или HostCon, хотя в этом интерфейсе ничего хостозависимого *)
  TYPE Logger* = POINTER TO ABSTRACT RECORD END;
  VAR
    ln: PROCEDURE (l: Logger);
    logger: Logger;
  PROCEDURE (l: Log) String*...;
  PROCEDURE (l: Log) Ln*...;

  PROCEDURE SetHook* (l: Logger); BEGIN ... <ln := l.Ln> ... END;

  PROCEDURE String*...;
  PROCEDURE Ln*; BEGIN IF ln # NIL THEN ln(logger) END; (* чтобы работало и во время сборки мусора *)
  PROCEDURE Int*...;
  PROCEDURE Adr* ...;
END Con.

Импортировал бы его спокойно в Kernel и любые хост-модули и пользовался.
1) Это BB-way с крюками и производными типами
2) Это надежно
3) Это удобно и исключает дублирование кода для Int и Adr
4) Это гибко: дает возможность подставлять другие реализации и писать лог хоть на усб, хоть на спутник посылать. В т.ч. в нужный момент направить вывод в StdLog. Или, если вам не посчастливилось, и вы в уиндоус, то - накопить вывод в строке и потом вывести его через MessageBox (сейчас это тоже есть в dev18)
5) Это локализует системозависимые вещи printf в одном месте.

За последние полгода все мои проекты так или иначе цепляли глубокосистемный уровень, и в каждом из них мне нужен был вывод в консоль, поскольку вывод в StdLog был вообще невозможен (ББ падал, не успев ничего там отрисовать, или я не успевал увидеть, что он там отрисовал, или я портил что-то в механизме сообщений, от которого отрисовка зависит), либо запаздывал и рассинхронизировался с моими процессами. Так что я свой Con := VarCon много где импортирую. Если он уже будет импортирован в ядро и загружен - тем лучше.

Цитата:
не понимаю параллельно возникающего стремления этот упорядоченный код сразу обобщить для всех Host

Я бы сказал, обобщить не для разных Host-систем, а для разных модулей в Host в одной системе.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу 1, 2, 3  След.

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


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

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


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

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB