<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=57651&amp;view=findpost&amp;p=385492</guid>
        <pubDate>Mon, 21 Jun 2004 11:35:41 +0000</pubDate>
        <title>АВТОМАТИЧЕСКАЯ  ОПТИМИЗАЦИЯ  ПРОГРАММ</title>
        <link>https://forum.sources.ru/index.php?showtopic=57651&amp;view=findpost&amp;p=385492</link>
        <description><![CDATA[e-moe: <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'><div class='tag-align-center'>Автоматическая оптимизация программ</div></strong></span><br>
<br>
В Турбо Паскале выполняется несколько типов оптимизации кода компилируемой программы с целью повышения её быстродействия и уменьшения объёма занимаемой памяти.<br>
<br>
<strong class='tag-b'>1. Свёртывание констант.</strong> Если операндами выражения являются константы ординального типа, то выражение вычисляется в период компиляции. То же относится к функциям <strong class='tag-b'>abs, sqr, succ, pred, odd, lo, hi, swap</strong>, если их аргументами являются константы ординального типа.<br>
<br>
<em class='tag-i'>Пример 1.</em><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var &nbsp;k : integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;k:=abs(-15)+sqr(7)-6*12;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Для выполняемой программы записанный в исходном тексте оператор будет заменён оператором  <strong class='tag-b'>k := -23;</strong><br>
Если индексом массива является константа или выражение, состоящее из констант, то адрес элемента массива вычисляется во время компиляции. Например, доступ к элементам  <strong class='tag-b'>a[sqr(7)+2,3*8] и a[61,24] </strong>будет таким же эффективным, как и доступ к простой переменной.<br>
<br>
<strong class='tag-b'>2. Слияние констант.</strong> Если в одном блоке несколько раз встречается одна и та же строковая константа, то в объектном коде программы компилятор разместит только одну ее копию.<br>
<br>
<em class='tag-i'>Пример 2.</em><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Введите значение &#39;,&#39;x =&#39;);</div><div class="code_line">&nbsp;&nbsp;................................</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Введите значение &#39;,&#39;y =&#39;);</div><div class="code_line">&nbsp;&nbsp;................................</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Введите значение &#39;,&#39;z =&#39;)</div><div class="code_line">&nbsp;&nbsp;................................</div></ol></div></div></div></div><br>
Для объектного кода программы это эквивалентно фрагменту<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;Const &nbsp;S = &#39;Введите значение &#39;;</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(S,&#39;x =&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;................</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(S,&#39;y =&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;................</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(S,&#39;z =&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;................</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>3. Вычисление по короткой схеме.</strong> Логическое выражение в Турбо Паскале вычисляется по короткой схеме. Это означает, что вычисление такого выражения прекращается, как только его результат становится очевидным.<br>
<br>
<em class='tag-i'>Пример 3.</em><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">If (x&#62;0) and (x&#60;100) and (y&#62;1) and (y&#60;x) then ...</div><div class="code_line">While (x&#60;0) or (y&#62;1) or (z&#62;x+y) do ...</div></ol></div></div></div></div><br>
Если  x = -1, то вычисление обоих логических выражений прекращается после вычисления значения истинности первого операнда. В первом случае имеем для всего выражения значение <strong class='tag-b'>false</strong>, во втором - значение true.<br>
<br>
<br>
<strong class='tag-b'>4. Удаление неиспользуемого кода.</strong> Операторы, которые никогда не будут выполняться, в объектный код программы не включаются.<br>
Пусть в исходном тексте программы записан оператор<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">If false then y:=sqr(x)+1;</div></ol></div></div></div></div><br>
Такой оператор при компиляции программы игнорируется.<br>
Используя это свойство компилятора, можно в исходном тексте программы подготовить различные её варианты, формируемые при повторной компиляции.<br>
<br>
Пример 4.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Const &nbsp;KeyPrint = 0; &nbsp;{ &nbsp; Ключ тестовой печати: }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ 0 - тестовая печать отсутствует ; }</div><div class="code_line">Begin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { 1 - активизируется тестовая печать }</div><div class="code_line">...............................</div><div class="code_line">If KeyPrint&#62;0 then</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Печать массива A</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">................................</div></ol></div></div></div></div><br>
Операторы отладочной печати включаются в объектный код программы, если до её компиляции было установлено значение константы <strong class='tag-b'>KeyPrint = 1.</strong><br>
<br>
<strong class='tag-b'>5. Эффективная компоновка.</strong> Процедуры и функции, к которым в программе нет ни одного обращения, в объектный код не включаются. Не включаются в объектный код также переменные, которые описаны в разделах <strong class='tag-b'>Var</strong>, но в программе не используются.<br>
Данный тип оптимизации кода имеет особое значение при использовании модулей. Если в программе записана фраза<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Uses Graph;</div></ol></div></div></div></div><br>
то в объектный код программы будут переписаны только те процедуры из модуля <strong class='tag-b'>Graph</strong>, к которым имеются обращения.<br>
Здесь следует отметить, что при компиляции программы в память эффективная компоновка не работает. Этим объясняется, почему некоторые программы становятся меньше при компиляции их на диск.<br>
<br>
По мотивам лекций Назаренко В.И.]]></description>
        <author>e-moe</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	