Автор Тема: Возвращение функцией записи  (Прочитано 13853 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Возвращение функцией записи
« : Март 09, 2011, 03:34:12 pm »
Сейчас, вроде, сделано так, что все функции всегда возвращают результат в регистрах проца. Если разрешить функциям возвращать записи, то этой эффективной реализации придёт кирдык.  :)

Неправда :) Сейчас функции "возвращают" записи как VAR-параметр. Так что вопрос сугубо синтаксический. Никто не мешает компилятору по-прежнему использовать VAR-параметр, просто но будет скрытый. А с точки зрения синтаксиса - все будет единообразно.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #1 : Март 09, 2011, 04:02:27 pm »
Неправда :) Сейчас функции "возвращают" записи как VAR-параметр.
VAR-параметры передаются по ссылке. И эту ссылку функция возвращает в регистре.
Если делать тоже самое, но только закулисно (синтакисически возвращать якобы по значению), то будет только хуже. Ибо, не явная муть  :)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #2 : Март 09, 2011, 04:06:05 pm »
Неправда :) Сейчас функции "возвращают" записи как VAR-параметр.
VAR-параметры передаются по ссылке. И эту ссылку функция возвращает в регистре.
Если делать тоже самое, но только закулисно (синтакисически возвращать якобы по значению), то будет только хуже. Ибо, не явная муть  :)
Я таки дико извиняюсь, но где это в описании языка сказано? :-)
Кроме того, процессоры (как реальные так и виртуальные) могут регистров не иметь вообще. Кроме того, если уж программист так заботится о быстродействии и если у него регистровый процессор и если компилятор компилит именно так, то ничто не мешает ему таки не возвращать по значению жиррные записи (не жирные могут вполне поместиться в регистр -- регистры и 64 и 128 бит бывают, так что какой-нибудь (x,y) туда вполне влезет).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #3 : Март 09, 2011, 04:12:09 pm »
Я таки дико извиняюсь, но где это в описании языка сказано? :-)
Гы-гы-гы  :D Сырцы - это продолжение описания.
Но смотрел давно, мог и подзабыть. Не зря же в первом своём сообщении написал "вроде".

Реальные процы (в отличие от виртуальных машин), как правило, регистровые. Ибо никто заранее не знает какой глубины стек понадобится.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #4 : Март 09, 2011, 04:16:36 pm »
Сырцы чего именно, извините? :-)
Компиляторов Оберона ну очень много.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #5 : Март 09, 2011, 04:19:02 pm »
Неправда :) Сейчас функции "возвращают" записи как VAR-параметр.
VAR-параметры передаются по ссылке. И эту ссылку функция возвращает в регистре.

Да не надо ей ничего возвращать в регистре. Было:
VAR r: Record;
...
f(r);
x := f.field;

С новым синтаксисом стало:
x := f().field;

Что сделал компилятор:
VAR compiler_generated: Record;
...
f(compiler_generated);
x := compiler_generated.field;

Внутри функции было:
PROCEDURE f(VAR r: Record)
...
r.field := 0;

C новым синтаксисом:

PROCEDURE f(): Record;
VAR r: Record
...
r.field := 0;
RETURN r;


Что сделал компилятор:
PROCEDURE f(VAR r: Record);
...
r.field := 0;

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #6 : Март 09, 2011, 04:19:17 pm »
Сырцы чего именно, извините? :-)
Блэкбокс.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #7 : Март 09, 2011, 04:23:40 pm »
Сырцы чего именно, извините? :-)
Блэкбокс.
Ну, ББ это вообще КП, что не совсем оберон :-). А у КП всего две реализации вроде бы – ББ и GPCP.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #8 : Март 09, 2011, 04:26:51 pm »
C новым синтаксисом:
PROCEDURE f(): Record;
VAR r: Record
...
r.field := 0;
RETURN r;
Не понял. Туплю что-то  :)
Как процедура вернёт r, ведь после возврата из процедуры её кадр (вместе с локальной переменной r) будет снят со стека.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #9 : Март 09, 2011, 04:30:27 pm »
Ну, ББ это вообще КП, что не совсем оберон :-).
Да, но правила для обероновских функций, думаю, писАлись с оглядкой на те детали реализации, которые я напомнил.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #10 : Март 09, 2011, 04:38:43 pm »
C новым синтаксисом:
PROCEDURE f(): Record;
VAR r: Record
...
r.field := 0;
RETURN r;
Не понял. Туплю что-то  :)
Как процедура вернёт r, ведь после возврата из процедуры её кадр (вместе с локальной переменной r) будет снят со стека.

Здесь 'r' расположена на стэке, да. Но на стэке вызывающей процедуры. И эта вызывающая процедура (неявно) передает 'r' вызываемой через (неявный) VAR параметр.

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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #11 : Март 09, 2011, 04:47:58 pm »
Здесь 'r' расположена на стэке, да. Но на стэке вызывающей процедуры. И эта вызывающая процедура (неявно) передает 'r' вызываемой через (неявный) VAR параметр.
Хм... Интересно. Но вызывающих процедур (и вызываемых!) может быть много. К тому же, вызов может быть из блока-модуля, у которого и стека-то как бы нет.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #12 : Март 09, 2011, 05:15:22 pm »
Хм... Интересно. Но вызывающих процедур (и вызываемых!) может быть много. К тому же, вызов может быть из блока-модуля, у которого и стека-то как бы нет.

Так не бывает, что у вызывающей нет стэка, а у вызываемой есть. Откуда он берется? :) Если вызывающих много - то у них все равно у каждой свой участок стэка...

Весь вопрос в том, стоит ли игра свеч. В смысле, перевешивают ли достоинства предлагаемого решения те недостатки, которые связаны с усложнением реализации.  ;)

Да каое ж там усложнение? Чай не плюсовые шаблоны... :)

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Возвращение функцией записи
« Ответ #13 : Март 10, 2011, 07:34:06 am »
Так не бывает, что у вызывающей нет стэка, а у вызываемой есть. Откуда он берется? :)
В программе обычно один стек на все модули. Этот стек конечно есть всегда, но до вызова любой первой процедуры он пуст.
Вероятно, Вы имели в виду (в своём примере), что пролог вызова процедуры и выделит место под r на вершине стека перед тем, как загрузить туда фактические параметры.
Вобщем, технически осуществимо, и я с этим с самого начала и не спорил. Свои сомнения я высказал только по поводу эффективности такого решения.