Автор Тема: Часто замечаю за собой  (Прочитано 30748 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #30 : Февраль 24, 2012, 02:32:17 pm »
Еще раз - IMPORT SYSTEM может добавить встроенных в язык функций. Ведь никто не указывает имя модуля когда использует функцию LEN, или INC, или ASSERT. При этом они не являются зарезервированными, ключевыми, словами языка.

Так вот - импортировал SYSTEM, получил еще одну встроенную функцию ZeroRec.

Кроме того, ни INC ни LEN ни ASSERT обычно не являются функциями/процедурами, то есть никто ничего на стек не кладет, не делает  call и не разбирает возвращаемое значение. Это чисто inline-функции/процедуры. То же самое может быть и с ZeroRec.
МОЖЕТ , например если вы покопаетесь в компиляторе, кстати чего-то не увидел ИСХОДНИКИ модуля SYSTEM , с чего бы это ?  ;)  и добавить процедуру туда точно  уж  - НЕ "как нефиг делать".

Да не. Там относительно просто (в ББ). Там для подобного есть забавный расширизм (и как раз получаем inline-функцию. одну, да. и включается этот расширизм как раз по импорту SYSTEM):
Цитировать
Code procedures

Code procedures make it possible to use special code sequences not generated by the compiler. They are declared using the following special syntax:

ProcDecl = PROCEDURE "[" SysFlag "]" IdentDef [FormalPars]
[ConstExpr {"," ConstExpr}] ";".
The list of constants declared with the procedure is interpreted as a byte string and directly inserted in the code ("in-line") whenever the procedure is called. If a parameter list is supplied, the actual parameters are pushed on the stack from right to left. The first parameter however is kept in a register. If the type of the first parameter is REAL or SHORTREAL, it is stored in the top floating-point register. Otherwise the parameter (or in the case of a VAR/IN/OUT parameter its address) is loaded into EAX. For function procedures the result is also expected to be either in the top floating-point register or in EAX, depending on its type. Be careful when using registers in code procedures. In general, the registers ECX, EDX, ESI, and EDI may be used. Parameters on the stack must be removed by the procedure.

Examples
PROCEDURE [code] Sqrt (x: REAL): REAL (* Math.Sqrt *)
0D9H, 0FAH; (* FSQRT *)

PROCEDURE [code] Erase (adr, words: INTEGER) (* erase memory area *)
089H, 0C7H, (* MOV EDI, EAX *)
031H, 0C0H, (* XOR EAX, EAX *)
059H, (* POP ECX *)
0F2H, 0ABH; (* REP STOS *)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #31 : Февраль 24, 2012, 02:48:20 pm »
Да не. Там относительно просто (в ББ). Там для подобного есть забавный расширизм (и как раз получаем inline-функцию. одну, да. и включается этот расширизм как раз по импорту SYSTEM):
......
Ну да, в смысле 1  определения инлайна    :) , то есть вы утверждаете что написать ZeroRec в машинных кодах  "относительно просто" - что же почему бы и нет  :), осталось только поместить ее в SYSTEM....

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #32 : Февраль 24, 2012, 05:09:53 pm »
... Конечно же, использовался отдельный модуль с ZeroRec.

По поводу SYSTEM. Если правильно определить минимум базовых абстракций работы с двоичными данными (модули этих абстракций, конечно, будут IMPORT SYSTEM), то можно на них написать приложение класса, например, Web-сервера, без единого IMPORT SYSTEM...

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #33 : Февраль 24, 2012, 05:14:04 pm »
... Конечно же, использовался отдельный модуль с ZeroRec.

По поводу SYSTEM. Если правильно определить минимум базовых абстракций работы с двоичными данными (модули этих абстракций, конечно, будут IMPORT SYSTEM), то можно на них написать приложение класса, например, Web-сервера, без единого IMPORT SYSTEM...
Имелось ввиду другое - можно ли без ковыряния в компиляторе сделать так, чтобы  к ЛЮБОМУ приложению можно было прицепить ZeroRec аналогично LEN или  ASSIGN? (фактически , речь идет о расширении списка предопределенных процедур)
« Последнее редактирование: Февраль 24, 2012, 05:16:03 pm от DIzer »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #34 : Февраль 24, 2012, 05:27:20 pm »
... Конечно же, использовался отдельный модуль с ZeroRec.

По поводу SYSTEM. Если правильно определить минимум базовых абстракций работы с двоичными данными (модули этих абстракций, конечно, будут IMPORT SYSTEM), то можно на них написать приложение класса, например, Web-сервера, без единого IMPORT SYSTEM...
Имелось ввиду другое - можно ли без ковыряния в компиляторе сделать так, чтобы  к ЛЮБОМУ приложению можно было прицепить ZeroRec аналогично LEN или  ASSIGN? (фактически , речь идет о расширении списка предопределенных процедур)

Это выходит за рамки оберон парадигмы: простой язык <-> простой компилятор. Если язык что-то не позволяет - компилятор допиливается (предполагается, что легко). Можно соглашаться с таким подходом или нет, но он такой. Можно спорить насколько такой подход оправдался в конкретной реализации (ББ) при решении конкретных задач...


P.S. Лично я не стал бы вводить никаких ZeroRec, а просто сделал нормальную инициализацию рекордов по умолчанию, раз уж все равно компилятор ковырять "под себя".
« Последнее редактирование: Февраль 24, 2012, 05:30:06 pm от vlad »

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #35 : Февраль 24, 2012, 05:33:58 pm »
Естественно это ВЫХОДИТ но мы говорим о ХАКЕ - насколько легко его сделать(устойчивости к придуркам). Но ладно, пусть даже есть возможность засунуть эту инлайн процедуру в SYSTEM - Vlad - скажите какого УРОВНЯ ДОЛЖНЫ быть навыки у человека решившего написать ZeroRec (обнуляющие ВСЕ поля записи ПРОИЗВОЛЬНО-ДОПУСТИМОЙ  структуры) в кодах, в особенности для ЯП где строение ВНУТРЕННЕЙ структуры обьектов НЕ ДЕКЛАРИРУЕТСЯ (в том же Эйфеле язык ГАРАНТИРУЕТ предопределенную инициализацию для структур ЛЮБОЙ сложности)?
« Последнее редактирование: Февраль 24, 2012, 05:36:57 pm от DIzer »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #36 : Февраль 24, 2012, 05:34:30 pm »
P.S. Лично я не стал бы вводить никаких ZeroRec, а просто сделал нормальную инициализацию рекордов по умолчанию, раз уж все равно компилятор ковырять "под себя".
Угу. И при импорте SYSTEM'a добавил бы возможность тёггирования переменной тэгом [uninit], что означало бы, что вот эту штуку инициализировать автоматом не надо, что мы тут боремся за эффективность - вон даже SYSTEM ради этого импортировали.

То есть безопасное поведение по умолчанию с возможностью быстрого поведения когда это явно указано, а не наоборот (как сейчас).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #37 : Февраль 24, 2012, 05:43:25 pm »
Естественно это ВЫХОДИТ но мы говорим о ХАКЕ - насколько легко его сделать(устойчивости к придуркам). Но ладно, пусть даже есть возможность засунуть эту инлайн процедуру в SYSTEM - Vlad - скажите какого УРОВНЯ ДОЛЖНЫ быть навыки у человека решившего написать ZeroRec (обнуляющие ВСЕ поля записи ПРОИЗВОЛЬНО-ДОПУСТИМОЙ  структуры) в кодах, в особенности для ЯП где строение ВНУТРЕННЕЙ структуры обьектов НЕ ДЕКЛАРИРУЕТСЯ (в том же Эйфеле язык ГАРАНТИРУЕТ предопределенную инициализацию для структур ЛЮБОЙ сложности)?

Ну естественно, что это не учебные навыки. С другой стороны, чтобы полноценно писать на каком-нибудь С++, в котором не ковыряясь в компиляторе можно много всего интересного сделать (да! даже это самое автоматическое обнуление!) - тоже нужны не учебные навыки. Можно поискать что-то между этими двумя крайностями - ЯП много...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #38 : Февраль 24, 2012, 06:05:07 pm »
Нетривиальным (по крайней мере, для меня) является вопрос об области наиболее эффективного использования их  творений...
Ну, мне более-менее понятно что Оберон as is не является инструментом для прикладного программирования, это инструмент для системного программирования. Но не в том смысле в котором обычно (и, на мой взгляд неправильно) системное программирование понимают. То есть не для написания операционной системы, драйверов и вообще не для программирования хоть чего-то на самом обероне (как он есть искаропки). Оберон хорош как полуфабрикат из которого системный программист может сделать, относительно быстро и затратив относительно немного усилий, инструмент для прикладного программирования в области где еще нет удовлетворительных готовых решений.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #39 : Февраль 24, 2012, 06:08:11 pm »
То есть не для написания операционной системы, драйверов и вообще не для программирования хоть чего-то на самом обероне (как он есть искаропки). Оберон хорош как полуфабрикат из которого системный программист может сделать, относительно быстро и затратив относительно немного усилий, инструмент для прикладного программирования в области где еще нет удовлетворительных готовых решений.
ММ прототипирование? , возможно, но точно НЕ пользовательского интерфейса конечного приложения.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #40 : Февраль 24, 2012, 06:38:23 pm »
Я чо-то не понял, с чего ZeroRec нужно приравнивать к предопределённым процедурам.
Обычная процедура.
Не помню, как она была у меня написана, но можно хоть так:

VAR zeroArray: ARRAY 1024 OF BYTE;

PROCEDURE ZeroRec (VAR rec: ANYREC);
  VAR t: Kernel.Type;
BEGIN
  t := SYSTEM.TYP(rec)(Kernel.Type);
  SYSTEM.MOVE(SYSTEM.ADR(zeroArray[0], SYSTEM.ADR(rec), t.size)
END ZeroRec;

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #41 : Февраль 24, 2012, 06:43:52 pm »
Я чо-то не понял, с чего ZeroRec нужно приравнивать к предопределённым процедурам.
Обычная процедура.
Не помню, как она была у меня написана, но можно хоть так:

VAR zeroArray: ARRAY 1024 OF BYTE;

PROCEDURE ZeroRec (VAR rec: ANYREC);
  VAR t: Kernel.Type;
BEGIN
  t := SYSTEM.TYP(rec)(Kernel.Type);
  SYSTEM.MOVE(SYSTEM.ADR(zeroArray[0], SYSTEM.ADR(rec), t.size)
END ZeroRec;

1. Да нет же ,  это обсуждение возникло после Reply #24 Алексея
2.НЕ ПОНЯЛ, что это код ОЧИЩАЕТ ВСЕ ПОЛЯ ПРОИЗВОЛЬНОЙ записи?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #42 : Февраль 24, 2012, 06:48:13 pm »
Я чо-то не понял, с чего ZeroRec нужно приравнивать к предопределённым процедурам.
Мы просто увлеклись моими фантазиями. :-)
Спасибо за ответ.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Часто замечаю за собой
« Ответ #43 : Февраль 25, 2012, 05:43:58 am »
Да, он затирает область памяти размером, соответствующим размеру записи, нулями.

DIzer

  • Гость
Re: Часто замечаю за собой
« Ответ #44 : Февраль 25, 2012, 08:15:56 am »
Да, он затирает область памяти размером, соответствующим размеру записи, нулями.
Да, но только если размер записи меньше 1024 байт.