Генерация высококачественного кода для программ, написанных на СИ - [14]
Хотя все девять рассматриваемых компиляторов генерируют приемлемый код, три из них, - Datalight Optimum-C, Microsoft C 5.0 и WATCOM C 6.0, - выполняют оптимизацию кода более высокого уровня, чем остальные.
Компилятор Datalight Optimum-C - это быстрый и выразительный исполнитель. Он выполняет обширный анализ потоков данных и оптимизирует код, за который другие компиляторы не берутся.
Microsoft C 5.0 применяет оптимизацию циклов, которая является одной из областей с большими потенциальными возможностями улучшения кода. Применяя вынесение инвариантного кода, удаление переменных индукции циклов и очень качественное распределение переменных по регистрам, Microsoft C 5.0 вырабатывает прекрасный код.
Компилятор WATCOM C 6.0 соперничает с Microsoft C 5.0 по степени выполняемой оптимизации и генерирует наиболее быстрый код в тесте оптимизации. То, что WATCOM теряет на не самых оптимальных циклах, он более чем наверстывает в малых заголовках вызова функций. WATCOM C 6.0 хорошо использует регистры, минимизирует обращения к памяти и повышает эффективность выполнения программ.
Компиляторы Metaware High C и Computer Innovations C86Plus выполняют более-менее удовлетворительную степень оптимизации, но отступают на второй план при рассмотрении усовершенствований, сделанных в технологии компиляторов фирмами Datalight, Microsoft и WATCOM.
Нет единственного производителя, который захватил бы на рынке область технологии оптимизации для компиляторов Си. Конкуренция на рынке подталкивает производителей к развитию технологии и к обеспечению разработчиков лучшими и более мощными средствами языка Си. В будущем это может означать появление оптимизирующих компиляторов, которые будут вырабатывать более быстрый и компактный код.
/* ---------------------------------------------------------- *
¦ ¦
¦ Серия тестов PC Tech Journal ¦
¦ Тест оптимизации кода Си ¦
¦ ¦
¦ Copyright (c) 1988 Ziff-Devis Publishing Company ¦
¦ ¦
¦ Эта программа-тест была разработана для проверки ¦
¦ методов оптимизации кода, применяемых компилятором ¦
¦ Си. Она не вырабатывает разумные результаты и не ¦
¦ представляет хороший стиль программирования. ¦
¦ ¦
* ---------------------------------------------------------- */
>
>
>#include
>#include
>
>#define max_vector 2
>#define constant5 5
>
>typedef unsigned char uchar;
>
>int i, j, k, l, m;
>int i2, j2, k2;
>int g3, h3, i3, k3, m3;
>int i4, j4;
>int i5, j5, k5;
>
>double flt_1, flt_2, flt_3, flt_4, flt_5, flt_6;
>
>int ivector[ 3 ];
>uchar ivector2[ 3 ];
>short ivector4[ 6 ];
>int ivector5[ 100 ];
>
>#ifndef NO_PROTOTYPES
>void dead_code( int, char * );
>void unnecessary_loop( void );
>void loop_jamming( int );
>void loop_unrolling( int );
>int jump_compression( int, int, int, int, int );
>#else
>void dead_code();
>void unnecessary_loop();
>void loop_jamming();
>void loop_unrolling();
>int jump_compression();
>#endif
>
>int main( argc, argv )
/* optbench */
> int argc;
> char **argv;
> {
>
>
/* ---------------------------- *
¦ Размножение констант и копий ¦
*------------------------------*/
>
> j4 = 2;
> if( i2 < j4 && i4 < j4 )
> i2 = 2;
>
> j4 = k5;
> if( i2 < j4 && i4 < j4 )
> i5 = 3;
>
>
/* ------------------------------------------ *
¦ Свертка констант, арифметические тождества ¦
¦ и излишние операции загрузки/сохранения ¦
* ------------------------------------------ */
>
> i3 = 1 + 2;
> flt_1 = 2.4 + 6.3;
> i2 = 5;
> j2 = i + 0;
> k2 = i / 1;
> i4 = i * 1;
> i5 = i * 0;
>
>#ifndef NO_ZERO_DIVIDE
>
/*
* Некоторые компиляторы распознают ошибку
* деления на нуль и не генерируют объектный код
*/
> i2 = i / 0;
> flt_2 = flt_1 / 0.0;
>#else
> printf( "This compiler handles divide-by-zero as
\
> an error
\n>");
>#endif
> flt_3 = 2.4 / 1.0;
> flt_4 = 1.0 + 0.0000001;
> flt_5 = flt_6 * 0.0;
> flt_6 = flt_2 * flt_3;
>
>
/* -------------------- *
¦ Лишнее присваивание ¦
* -------------------- */
>
> k3 = 1;
> k3 = 1;
>
>
/* ------------------ *
¦ Снижение мощности ¦
* ------------------ */
>
> k2 = 4 * j5;
> for( i = 0; i <= 5; i++ )
> ivector4[ i ] = i * 2;
>
>
>
/* ------------- *
¦ Простой цикл ¦
* ------------- */
>
> j5 = 0;
> k5 = 10000;
> do {
> k5 = k5 - 1;
> j5 = j5 + 1;
> i5 = (k5 * 3) / (j5 * constant5);
> } while ( k5 > 0 );
>
>
/* -------------------------------------- *
¦ Управление переменной индукции цикла ¦
* -------------------------------------- */
> for( i = 0; i < 100; i++ )
> ivector5[ i * 2 + 3 ] = 5;
>
>
/* ----------------------- *
¦ Глубокие подвыражения ¦
* ----------------------- */
>
> if( i < 10 )
> j5 = i5 + i2;
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.