Уменьшение размера исполняемого файла

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

Лекс Айрин писал(а):Да нет, как раз таки, все методы известны. Иначе их бы нельзя было откомпилировать.

Вы что, издеваетесь? :evil:
Например

Код: Выделить всё

procedure DrawFigure(const s: string);
begin
 case S of
  'point': DrawPoint;
  'line':   DrawLine;
  'rect':  DrawRect;
  'circle': DrawCircle;
 else
  RunError();
 end;
end;


А теперь расскажите мне как тут компилятор или линкер должен мертвый код выбрасывать. :)

Лекс Айрин писал(а):Угу... поколения программировавшие на/для ЕС ЭВМ|System/360 дружно кричат: "Да ты гонишь!" и показывают пальцы. Тогда была чистая итерактивность, мультизадачность, и многопользовательность...

Такое ощущение что Вы не понимаете о чем пишете... :?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Mikhail писал(а):А теперь расскажите мне как тут компилятор или линкер должен мертвый код выбрасывать. Такое ощущение что Вы не понимаете о чем пишете...

В программе - нет никаких имён. там только адреса. А имена, программе, нужны только в крайних случаях, когда нужна идентификация по имени (например для dll ). А без этого всё под адресами. Адреса скармливаются процессору, там нет имён, там нет string. там "ноли" и "единички", которые обрабатываются процессором.
Последний раз редактировалось vitaly_l 23.10.2015 15:06:32, всего редактировалось 3 раза.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail, Вот если у Вас в проге, даже теоретически, не может быть вызван один из четырех методов, то его можно безболезненно вырезать.
Кстати, у вас логическая ошибка при проектировании программы. Процедура/метод RunError тут абсолютно лишняя. При правильно спроектированной программе это как раз и есть недостижимый код, который программист должен убрать. То есть, либо ветки else нет, либо она пустая.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Лекс Айрин писал(а):Mikhail, Вот если у Вас в проге, даже теоретически, не может быть вызван один из четырех методов, то его можно безболезненно вырезать. Кстати, у вас логическая ошибка при проектировании программы. Процедура/метод RunError тут абсолютно лишняя. При правильно спроектированной программе это как раз и есть недостижимый код, который программист должен убрать. То есть, либо ветки else нет, либо она пустая.

а если "s" читается из произвольного файла (например инструкции к шейдерам) и на момент компиляции программы не известно какие значения будут в файле?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

скалогрыз писал(а):а если "s" читается из произвольного файла и на момент компиляции программы не известно какие значения будут в файле?

Это исключение и его нужно описать заранее, вот только в примере речь о string а string - не удаляется, т.к. не является названием функции или класса.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

Лекс Айрин писал(а):Mikhail, Вот если у Вас в проге, даже теоретически, не может быть вызван один из четырех методов, то его можно безболезненно вырезать.
Кстати, у вас логическая ошибка при проектировании программы. Процедура/метод RunError тут абсолютно лишняя. При правильно спроектированной программе это как раз и есть недостижимый код, который программист должен убрать. То есть, либо ветки else нет, либо она пустая.

Вам уже ниже отметили, что данные могут читаться из некоторого произвольного источника данных, например, загрузка формы в VCL и LCL именно так реализована.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Оптимизацию можно описать вот так:

Код: Выделить всё

procedure адрес0(const s: string);
begin
case S of
  'point': адрес1;
  'line':   адрес2;
  'rect':   адрес3;
  'circle': адрес4;
else goto MyLovelyGoto;
end;

MyLovelyGoto:
end;
Последний раз редактировалось vitaly_l 23.10.2015 15:15:46, всего редактировалось 1 раз.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

vitaly_l писал(а):Это исключение и его нужно описать заранее, вот только в примере речь о string а string - не удаляется, т.к. не является названием функции или класса

я старался, но не понял что ты имеешь ввиду.
НО рекомендую почитать как работает язык Objective-C. К паскалю он имеет отношение, потому что FPC умеет так называемый Objective Pascal.
К этой теме, Objective-C имеет отношение в том, что всякий метод, имеет своё имя (string), и очень часто имя приходится переводить в некий бинарный вид, чтобы вызвать конкретный код.
Но почему-то программисты на Objective-C (читай разработчики под iOS) никогда не жалуются на размеры бинариков (имён методов в бинарике и необходимость обфускации)

Добавлено спустя 1 минуту 22 секунды:
vitaly_l писал(а):Оптимизацию можно описать вот так:

:mrgreen: :mrgreen: :mrgreen:
вездесущий гото уменьшит размер бинарика
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

скалогрыз писал(а):а если "s" читается из произвольного файла (например инструкции к шейдерам) и на момент компиляции программы не известно какие значения будут в файле?


И чо? Я же сказал о теоретической достижимости. Тогда будут достижимы все.

Если вы не знаете какое значение, то у вас нет возможности вызвать нужный обработчик --> ничего не будет происходить и программа не сможет нормально отрисовать данную фигуру. В этом случае программа напишет что-то типа "ошибка чтения файла". В моем просто проигнорит и нарисует все возможное.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Лекс Айрин писал(а):И чо? Я же сказал о теоретической достижимости. Тогда будут достижимы все.

об этом Mikhail и говорит, что выкинуть всё нельзя, т.к. очень часто "теоритическая достижимость" 100%.
Например код менеджера потоков даже для однопоточного приложения не выкидывается из RTL-а, а потому что теоритически используется (один же поток всё же есть! :) хотя тут немного подругому... )

...Ну и логической ошибки в программе тоже нет, т.к. согласно тех заданию, программа должна доложить об ошибке, а не выводить недокартину.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

скалогрыз писал(а):вездесущий гото уменьшит размер бинарика... программа должна доложить об ошибке, а не выводить недокартину.

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

Код: Выделить всё

procedure адрес0 (const s: string);
begin
case S of
  'point': goto адрес1;
  'line':   goto адрес2;
  'rect':   goto адрес3;
  'circle': goto адрес4;
  else goto MyLovelyGoto;
end;
RunError(); // и если это запустится то это будет ошибкой
MyLovelyGoto:
end;


Добавлено спустя 2 минуты 22 секунды:
В смысле в программе нет никаких имён, там только адреса.



.
Последний раз редактировалось vitaly_l 23.10.2015 15:34:46, всего редактировалось 1 раз.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

vitaly_l писал(а):Конечно уменьшит потому, что правильно было написать вот так и об ошибке программа тоже неправильно сообщает, надо вот так:

аминь
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, выход из процедуры по гото это первейший способ словить исключение общей защиты.

Mikhail писал(а):например, загрузка формы в VCL и LCL именно так реализована.


И оптимизация, кстати, прекрасно работает, исключая ненужные модули и вызывая ошибки если модуль не подключен. Я, кстати, не понял почему форму нельзя создать не включая ее прототип в файл. По идее, проще создать процедуру рисования формы.

Добавлено спустя 5 минут 34 секунды:
скалогрыз писал(а):...Ну и логической ошибки в программе тоже нет, т.к. согласно тех заданию, программа должна доложить об ошибке, а не выводить недокартину.


о логической ошибке я и не говорю. Соглашусь, если уж так необходимо сообщить об ошибке, то да, но я бы все равно не использовал бы вызов процедуры. Установил бы флаг обработки и пусть обрабатывает процедура вызвавшая некорректную функцию.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Лекс Айрин писал(а): выход из процедуры по гото это первейший способ словить исключение общей защиты.

Я описал принцип, т.к. GoTo - очень хорошо позволяет доказать что в РАБОТЕ программы нет никаких имён! Но они там хранятся для различных РЕДКО ИСПОЛЬЗУЕМЫХ НУЖД, так вот если удалить эти ненужные программе имена, то она будет весить на примерно 33% меньше.
Что 100% доказывает нашу с Вами правду! Скалогрыз по этому поводу, даже молитву спел, системы: "аминь"...
Остальное можно не доказывать, т.к. против GoTo (или asm прыжков) не поспоришь...
Я отвечал на вопрос Mikhail и привёл 100% доказательство.

PS: по поводу кода RunError(); все по своему правы.
Но только у Mikhail - это скорее должно называться не ошибка(RunError), а исключение(RunExclusion)...

.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, аминь еще используется в виде предложения реализовать данный подход.
Ответить