IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Нужен нормальный C/C++ компилятор
-=CHE@TER=-
Aug 6 2008, 11:07
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



В общем, в последнее время часто приходится работать с программами на Си / C++.
В связи с этим хотелось бы нормальный компилятор. Сейчас пользуюсь DEV-CPP 4.9.8.0 и MSVC++ 6.0.
Чем меня не устраивают оба этих компилятора - на примере adx2wave с моего сайта.
DEV-CPP всем хорош, но использует msvcrt.dll, что меня несколько напрягает, размер .EXE - 14,336 байт.
MSVC++ 6.0 - при включении опции оптимизации по размеру тоже начинает, гад, использовать msvcrt.dll, если её не включить - всё хорошо, использует только .DLL от ядра системы, но, увы, размером похвастаться не может - 40,960 байт.

Поэтому хотелось бы спросить - существует ли нормальный компилятор (даже, скорее, линкер - т.к. скомпилировать, чтобы ошибок не было, могу и под другим компилятором), который:
а) Не гадит в получаемый исходный файл лишней информацией (как MSVC).
б) Не использует левые библиотеки, кроме .DLL ядра системы (как DEV-CPP).
в) Генерирует небольшие по размеру исполняемые файлы.
г) Ещё, было бы здорово, если бы он был Freeware'ный.
Кто-нибудь знает - такое в природе существует?

P.S. Блин, написал бы уже давно собственный компилятор для Delphi и C++, чем тем что есть пользоваться, но, увы, у меня нет такого дикого количества времени и сил...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=CHE@TER=-
Jun 9 2013, 17:03
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Мне вчера было откровение, которым спешу поделиться, но обо всём по порядку.

Во-первых, я отказался от TCC, потому что, несмотря на маленький размер (при желании такого размера и через GCC собрать можно), почему-то все программы с использованием этого компилятора убивает после компиляции AVG (да, он у меня всё ещё стоит, хотя уже бесит). Помнится точно такая же нелюбовь была у долбанного Dr.Web к программам на Delphi...

Во-вторых, про откровение. Если кто-нибудь компилировал программы под GCC, то наверняка обращал внимание, что строки там идут прямо в теле секции кода (в примере ниже точки - непечатаемые символы):
QUOTE
...........INPUT FILE MISSING.РРРРРРРРРРРРР.........INVALID EXT!.РРР
где Р - символ с кодом 0x90 (команда NOP) для выравнивания строки до границы в 16 байт.
В результате чего код выглядит как куча навоза.
MSVC++ 6.0, к примеру, сгребает все строки в конец файла в секцию с данными. Но уродский GCC это делать не хочет. По идее, это сделано чтобы оптимизировать скорость выполнения программы: где строчка используется там её и пихать, чтобы указателем по памяти туда-сюда не прыгать. Однако, на деле прирост производительности от этого трюка весьма сомнительный, а вот прирост размера кода весьма существенный.
Я читал кучу документаций по ключам компилятора и линковщика и, единственный выход который я нашёл, объявлять все строки статическими. Т.е. вместо кода:
CODE
printf("Hello world!");

писать:
CODE
static char st[] = "Hello world!";
printf(st);

Тогда строчки будут где надо. Но писать так для каждой строки, и тем более для каких-нибудь простых параметров, типа "%s\%s", это же удавиться просто можно.
И вот, вчера я натолкнулся на то что так долго искал...
А теперь (барабанная дробь) строчка командной строки компилирующая исходный код как надо:
QUOTE
C:\Dev-Cpp\bin\gcc.exe -s -fwritable-strings -Os -Wall -ansi -pedantic "!.!" -o "!.exe" C:\Dev-Cpp\lib\CRT_noglob.o

Это строчка для меню по F2 в FAR Manager, так что "!.!" - это имя файла на котором стоит курсор, а "!.exe" оно же с расширением .EXE (ключ -o задаёт имя выходного файла).

Теперь о ключах.

-s
Не добавлять информацию для отладки. Этот ключ избавляет от запуска утилиты strip.exe на получившейся программе, чтобы она похудела, и компиляция проходит быстрее. Хочу отметить, что информация для отладки может занимать очень много места, иногда даже больше чем вся программа без неё.

-fwritable-strings
То самое откровение - пихает все строчки в секцию данных, а вернее делает их изменяемыми. Единственный минус - из-за этого каждая строчка считается уникальной и три вызова printf("%s\%s", ....); создадут 3 строки "%s\%s" в секции с данными... Впрочем, для небольших программ на сайт, где строчки не повторяются это не критично.

-Os
Optimize for Size - оптимизирует код сначала по быстродействию, затем по размеру.

-Wall -ansi -pedantic
Warnings=all, стандарт ANSI'89, pedantic - скрупулёзно сообщать о любых огрехах, даже самых незначительных.

C:\Dev-Cpp\lib\CRT_noglob.o
Этот файл нужен, чтобы при запуске программы с параметром "*.dat" в каталоге где лежат файлы "file1.dat", "file2.dat" и "file3.dat" получить на входе один параметр в виде "*.dat", а не три параметра в виде упомянутых файлов. Это иксовая фишка разворачивающая маску в имена файлов, которая включена по умолчанию и её нужно вручную вырубать.

Скомпилированная подобным образом программа по прежнему будет зависеть от гадской "msvcrt.dll" (надо будет написать модуль для её замены, типа HELPERS2.INC для DCC32HACK), но внутри уже будет выглядеть так, как и должна.

К сожалению, у MSVC++ 6.0 при включении всех упомянутых Grom PE выше оптимизаций всё равно размер получается меньше, но ещё сильнее уменьшить размер в GCC я не смог (если кто знает как - обязательно пишите).

На последок хочу сказать, что я теперь в некотором роде наСИльник, потому что в Си, в отличие от Delphi, очень просто (без написания лишнего кода и кучи преобразований) можно напрямую работать с памятью, что экономит время написания программы и силы. Delphi я не бросаю, но если что-то мне удобнее писать на Си, то буду писать на нём.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 28th May 2024 - 04:46