Глобальные переменные зло?

А можно пожалуйста поподробнее, а то до меня не дошло откуда тут такое вылазит? Я то думал что глобальные переменные помогают тут тем что под них не выделяется отдельно память каждый раз, а 1 и то же место в памяти переписывает. И откуда получается что отладочная версия компиляции в 8 раз меньше замедляет работу программы с глобальными переменными, чем с локальными(или как их называть?)?

Глобальные переменные - прежде всего, зло еще в концепции структурного программирования Э.Дейкстры. Их наличие затрудняет понимание логики работы отдельной программной единицы, усложняет раздельную компиляцию, поскольку компилятору приходится решать, как работать с этой, непонятно откуда вдруг свалившейся на голову “чужой” переменной. Глобальные переменные пришли в программирование из ассемблера и COMMON-областей Фортрана и, по мнению Э.Дейкстры, их использование должно быть крайне ограниченным и продиктованным жесткой необходимостью.(кроме констант, конечно).

Ну время компиляции допустим меня волнует в последнюю очередь, а вот чем в готовой программе так плохи глобальные переменные и почему при компиляции с дебаг информацией они работают быстрее - я всё ещё не понимаю.

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

Вангую, что конструкции вида

var i1:=i + 1;
var i2:=i1 + 1;
var i3:=i2 + 1;

были попросту выкинуты компилятором в релизной версии за ненадобностью, так как впоследствии не используются. Дебажная версия так делать не умеет и не должна.

Глобальные переменные - то, что может быть доступно из 1) других потоков 2) других функций 3) по адресации в памяти на протяжении всей работы программы, поэтому работу с ними оптимизировать нельзя ни в каком виде.

Локальность переменных позволяет заводить ну очень эффективные оптимизации кода на уровне компилятора, чего не сделаешь при их глобальности. Ну, ИМХО.

Различие в 2/8 раз как раз объяснимо разными используемыми уровнями оптимизации кода.

Не выкинуты. Вот пример:

var
  i2, i3, i4: integer;

function p1(i: integer): integer;
begin
  i2 := i + 1;
  i3 := i2 + 1;
  i4 := i3 + 1;
  Result := i4 + i2 + i3;
end;

begin
  var s := 0;
  loop 100000000 do
    s += p1(1);
  Println(s, Milliseconds);
end.

и

function p1(i: integer): integer;
begin
  var i2 := i + 1;
  var i3 := i2 + 1;
  var i4 := i3 + 1;
  Result := i4 + i2 + i3;
end;

begin
  var s := 0;
  loop 100000000 do
    s += p1(1);
  Println(s, Milliseconds);
end.

Второе быстрее в 4 раза.

Хорошо, идея номер два. Вангую последовательную замену var i1:= ...Result:= ... => Result := (i + 1) + ((i + 1) + 1) + (((i + 1) + 1) + 1) => Result := 3 * i + 6, , или хотя бы Result := i + i + i + 6. Упрощать выражения вроде как компиляторы умеют :slight_smile: Нельзя в первом случае, там побочный эффект :slight_smile:

Идея номер три. Еще - p1(1) - число константное, вполне могло быть выполнено один-единственный раз, а затем просто подставляться при каждом шаге цикла во втором варианте. А вот в первом нельзя, там побочный эффект :slight_smile:

Проверил бы, но рефлектора под рукой нет, да и несподручно на работе :slight_smile:

Нет, PascalABC.NET оптимизацией не занимается (почти), но какие-то простейшие оптимизации делает Jit-компилятор (скажем, inlining). p(1) считать константой - это глубокий анализ тела p - его никакие почти компиляторы не делают.

Нет. Зло - это динамические переменные. Не могу выполнить по ним задание

Динамические переменные - это самое прекрасное, что есть. Только потому, что под них можно подконтрольно выделять память. А значит, можно оптимизировать программу довольно эффективней, чем с обычными, статическими.

а если правда нужно оптимизировать, то лучше вообще не смотреть в сторону управляемых языков :wink:

Оптимизировать для чего? Для прошивки в кристаллы бортовых компьютеров? Там на С пишут и на ассемблере.

Обычно тот, кому надо оптимизировать, знает для чего :wink: Области, где применяются только неуправляемые языки, довольно обширные на самом деле.

ну я Теорию читаю, не пойму, 1 задание у нас вычислить выражение ln(xxx+3) с помощью динамических переменных. Думаю надо еще раз прочитать теорию. В справке абц.нет нету конкретного раздела по этой теме

каких еще динамических переменных?

Честно говоря, я думал, что он имел ввиду те переменные, под которые выделяется динамическая ОП, типа как динам. массивы через “new” ну или хотя бы он нашёл где-то метод запроса ОП у ОС, как в Си “malloc();”

в которых используются кавычки 1^

^ - это если я правильно помню, операция разыменования для типизированного указателя, так что 1^ - нечто бессмысленное.