Какой компилятор С/C++ вы используете под win?

Тема в разделе "LANGS.C", создана пользователем Ronin_, 24 дек 2016.

  1. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Всем детектед кого давно не видел! Надеюсь что этот ресурсец не умрет как тот васм с точкой ру на конце.

    Собственно вопрос в заголовке. Сам юзаю gcc из пакета mingw.

    Только давайте без религий.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    mingw-w64
     
    CurryHowardIsomorphism и Ronin_ нравится это.
  3. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Всех приветствую, сегодня наткнулся на такой СИ компилятор как tcc, сам весит ~1.5 МБ(распакованный), что интересно исполняемый файл получается тоже меньше, на моем тестовом примере с 8,50 КБ(с флагами -s -Os) до 2 КБ.

    Сам прожект кому интересно - http://bellard.org/tcc/

    Будет также интересно мнение кто его уже юзал.
     
    Последнее редактирование: 31 дек 2016
  4. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Имхо, перспективы пока не проглядываются.
     
  5. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Посмотрим, уже как четыре года миновало с последней версии.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    юзайте Clang или GCC, в чем смысл использовать какой-то допотопный и без поддержки С-компилер, который даж оптимизировать толком не умеет?
     
  7. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    У автора несколько проектов, если посмотреть в некоторые то они очень даже активны:

    [​IMG]

    Есть и за 2017. :)

    Можно подробнее про оптимизацию?

    Чем понравился, тем что размер скомпилированного файла намного меньше, сам бинарный файл работает быстрее, не создает не используемых секций.

    Tcc:

    [​IMG]

    Gcc:

    [​IMG]

    Плюс gcc в отладчик много информации отдает в листинг, exe на tcc менее разговорчив.
     
  8. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Напомню, что автор TCC - Fabrice Bellard, так что проект не сказал бы что хреновый. Развитие только хромает.
    Кстати, заметил, что когда-то любимый мною OpenWatcom получил новую реинкарнацию - https://github.com/open-watcom/open-watcom-v2
     
    Ronin_ нравится это.
  9. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Полностью согласен с SadKo, человек очень талантлив, про его прожекты заинтересовался после знакомства с tcc. :)
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    у GCC есть нормальная стандартная библиотека CRT, у TCC ее толком нет... если отключить стандартную библиотеку в GCC, то в исполняемом файле тоже не будет "лишних" секций, но скажем вывести double или int64 с помощью printf'а у вас не выйдет... по поводу оптимизаций, проведите эксперимент, возьмите какой-нить большой С-код, хотя бы например реализацию AES+RSA, скомпилируйте шифрование 100мб данных, и запустите обе программы, замеряя время исполнения... только сначала разберитесь с флагами GCC, чтобы не было "лишних" секций и все было по честному...
     
  11. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    И так почти по честному, компилировал компилятором tcc не задавая никаких флагов, кроме -Wall, дабы задетектить ворнинги, gcc приходиться добавлять флаг -s, чтобы уменьшить размер скомпилированного файла.

    Вот пример файла hello_win.c из папки examples компилятора tcc, чтобы не ходить далеко:

    Код (C):
    1. //+---------------------------------------------------------------------------
    2. //
    3. //  HELLO_WIN.C - Windows GUI 'Hello World!' Example
    4. //
    5. //+---------------------------------------------------------------------------
    6.  
    7. #include <windows.h>
    8.  
    9. #define APPNAME "HELLO_WIN"
    10.  
    11. char szAppName[] = APPNAME; // The name of this application
    12. char szTitle[]   = APPNAME; // The title bar text
    13. const char *pWindowText;
    14.  
    15. void CenterWindow(HWND hWnd);
    16.  
    17. //+---------------------------------------------------------------------------
    18. //
    19. //  Function:   WndProc
    20. //
    21. //  Synopsis:   very unusual type of function - gets called by system to
    22. //              process windows messages.
    23. //
    24. //  Arguments:  same as always.
    25. //----------------------------------------------------------------------------
    26.  
    27. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    28. {
    29.     switch (message) {
    30.  
    31.         // ----------------------- first and last
    32.         case WM_CREATE:
    33.             CenterWindow(hwnd);
    34.             break;
    35.  
    36.         case WM_DESTROY:
    37.             PostQuitMessage(0);
    38.             break;
    39.  
    40.         // ----------------------- get out of it...
    41.         case WM_RBUTTONUP:
    42.             DestroyWindow(hwnd);
    43.             break;
    44.  
    45.         case WM_KEYDOWN:
    46.             if (VK_ESCAPE == wParam)
    47.                 DestroyWindow(hwnd);
    48.             break;
    49.  
    50.         // ----------------------- display our minimal info
    51.         case WM_PAINT:
    52.         {
    53.             PAINTSTRUCT ps;
    54.             HDC         hdc;
    55.             RECT        rc;
    56.             hdc = BeginPaint(hwnd, &ps);
    57.  
    58.             GetClientRect(hwnd, &rc);
    59.             SetTextColor(hdc, RGB(240,240,96));
    60.             SetBkMode(hdc, TRANSPARENT);
    61.             DrawText(hdc, pWindowText, -1, &rc, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
    62.  
    63.             EndPaint(hwnd, &ps);
    64.             break;
    65.         }
    66.  
    67.         // ----------------------- let windows do all other stuff
    68.         default:
    69.             return DefWindowProc(hwnd, message, wParam, lParam);
    70.     }
    71.     return 0;
    72. }
    73.  
    74. //+---------------------------------------------------------------------------
    75. //
    76. //  Function:   WinMain
    77. //
    78. //  Synopsis:   standard entrypoint for GUI Win32 apps
    79. //
    80. //----------------------------------------------------------------------------
    81. int APIENTRY WinMain(
    82.         HINSTANCE hInstance,
    83.         HINSTANCE hPrevInstance,
    84.         LPSTR lpCmdLine,
    85.         int nCmdShow
    86.         )
    87. {
    88.     MSG msg;
    89.     WNDCLASS wc;
    90.     HWND hwnd;
    91.  
    92.     pWindowText = lpCmdLine[0] ? lpCmdLine : "Hello Windows!";
    93.  
    94.     // Fill in window class structure with parameters that describe
    95.     // the main window.
    96.  
    97.     ZeroMemory(&wc, sizeof wc);
    98.     wc.hInstance     = hInstance;
    99.     wc.lpszClassName = szAppName;
    100.     wc.lpfnWndProc   = (WNDPROC)WndProc;
    101.     wc.style         = CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;
    102.     wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    103.     wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    104.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    105.  
    106.     if (FALSE == RegisterClass(&wc))
    107.         return 0;
    108.  
    109.     // create the browser
    110.     hwnd = CreateWindow(
    111.         szAppName,
    112.         szTitle,
    113.         WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    114.         CW_USEDEFAULT,
    115.         CW_USEDEFAULT,
    116.         360,//CW_USEDEFAULT,
    117.         240,//CW_USEDEFAULT,
    118.         0,
    119.         0,
    120.         hInstance,
    121.         0);
    122.  
    123.     if (NULL == hwnd)
    124.         return 0;
    125.  
    126.     // Main message loop:
    127.     while (GetMessage(&msg, NULL, 0, 0) > 0) {
    128.         TranslateMessage(&msg);
    129.         DispatchMessage(&msg);
    130.     }
    131.  
    132.     return msg.wParam;
    133. }
    134.  
    135. //+---------------------------------------------------------------------------
    136.  
    137. //+---------------------------------------------------------------------------
    138.  
    139. void CenterWindow(HWND hwnd_self)
    140. {
    141.     HWND hwnd_parent;
    142.     RECT rw_self, rc_parent, rw_parent;
    143.     int xpos, ypos;
    144.  
    145.     hwnd_parent = GetParent(hwnd_self);
    146.     if (NULL == hwnd_parent)
    147.         hwnd_parent = GetDesktopWindow();
    148.  
    149.     GetWindowRect(hwnd_parent, &rw_parent);
    150.     GetClientRect(hwnd_parent, &rc_parent);
    151.     GetWindowRect(hwnd_self, &rw_self);
    152.  
    153.     xpos = rw_parent.left + (rc_parent.right + rw_self.left - rw_self.right) / 2;
    154.     ypos = rw_parent.top + (rc_parent.bottom + rw_self.top - rw_self.bottom) / 2;
    155.  
    156.     SetWindowPos(
    157.         hwnd_self, NULL,
    158.         xpos, ypos, 0, 0,
    159.         SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE
    160.         );
    161. }
    162.  
    163. //+---------------------------------------------------------------------------
    164.  
    gcc arguments: gcc -Wall -s -mwindows -o hello_win.exe hello_win.c, в итоге имеем - 10,5 КБ
    tcc arguments: tcc -Wall -mwindows -o hello_win.exe hello_win.c, итог - 3,50 КБ, на 7 КБ меньше.
    Плюс tcc заметно быстрее скомпилировал.

    Посчет оптимизации которую проводит gcc, после чего быстрее работает exe если я вас правильно понял, вопрос спорный.
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    gcc -Wall -m32 -O3 -Os -mwindows -nostdlib -e_Main -s -o hello_win.exe hello_win.c -lkernel32 -luser32
    и поменяйте WinMain на Main без параметров... HINSTANCE можно взять GetModuleHandle(NULL)...
     
  13. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Код (Text):
    1. c:\lessons>gcc -Wall -m32 -O3 -Os -mwindows -nostdlib -e_Main -s -o hello_win.exe hello_win.c -lkernel32 -luser32
    2. C:/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: warning: cannot find entry symbol _Main; defaulting to 00401000
    3. C:\Users\Ronin_\AppData\Local\Temp\ccfdD4dC.o:hello_win.c:(.text+0x50): undefined reference to `GetStockObject@4'
    4. C:\Users\Ronin_\AppData\Local\Temp\ccfdD4dC.o:hello_win.c:(.text+0x2b4): undefined reference to `SetTextColor@8'
    5. C:\Users\Ronin_\AppData\Local\Temp\ccfdD4dC.o:hello_win.c:(.text+0x2c6): undefined reference to `SetBkMode@8'
    6. collect2.exe: error: ld returned 1 exit status
    Пробовал уже сегодня с параметром -nostdlib, ничего не вышло. Ещё возможно вот поэтому:
    Вот теперь и смотрите какой шквал флагов нужно заюзать, чтобы не достичь результата. В tcc достигается все это элегантно и не принужденно. gcc хорош только тем что в пакете с ним идет много плюшек. Таких как objdump, strip, etc...
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    и что непонятного в этом? -lgdi32

    WinMain сделали, как я сказал?

    и что? не умение пользоваться инструментом не означает, что инструмент плох... означает, что плохи руки...

    потому что TCC - шлак, непригодный для нормальных проектов...
     
  15. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Скиньте сюда в листинг исправленный вариант на ваш ляд, winapi плохо знаю, очень плохо.

    Читал что им был браузер собран самим автором tcc, причем быстрее, так что говорить что он шлак не правильно, взяли бы лучше форкнули прожект. :)

    Чтобы писать и запоминать флаги для этого прямые руки не нужны. :) Инструмент хорош, я не говорил что он "шлак", но и tcc тоже хорош, в некоторых ситуациях даже выигрывает!
     
  16. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    При отключении этой стандартной библиотеки, вывод на winapi текста не удается(выводит кракозябры), а вот "шлак" tcc собирает так как нужно, без танцев с бубном.

    Также добавлю, что секций все равно получается - 3, с tcc - 2.

    Размер по прежнему больше, gcc - 4096 байт, tcc собирает размеров в 3584 байта!
     
  17. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    А компилятор-то тут причем? Пиши исходники в cp1251 и все будет нормально выводиться. Или даже прям психани и в юникоде (виндовом, который utf-16) пиши :)
     
  18. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    В том то и дело, что так и писал, пробовал менять кодировку на ansi, символы - латиница. Как только убираю флаг -nostdlib, все корректно. :)

    Видимо какая-то завязка есть на эту стандартную библиотеку.
     
  19. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Тогда кракозябр быть не может. Латиница в любой кодировке имеет одинаковые коды символов (даже в utf-8).
     
  20. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Может, попробуйте выше пример из листинга с флагами которые давал Rel, только без флага -e_Main.