На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (29) « Первая ... 3 4 [5] 6 7 ...  28 29  ( Перейти к последнему сообщению )  
> Вопрос к программистам на C , Исходники ядра Linux
    В принципе, можно компилить и из плюсов с -fno-rtti и -fno-exceptions. Но! Внимание, вопрос: в чем тогда смысл пользования плюсами? Чтобы тормозило? _Ядро_? Чтобы понты с шаблонами и классами были? А нафуа? Нам ездить как бы надо, а преумножение сущностей, называемых шашечками, процессу езды не помогает.

    Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам.

    Поэтому, хотя шаблоны, равно как использование Common Lisp, коему нет равных в этом деле, позволяют расставить пальцы шире некуда, для ядра ОС вполне достаточно тех средств метапрограммирования (написание на C -- тоже метапрограммирование в известном смысле, приставку "мета-" убирать позволительно лишь в случае лабания напрямую бинарника), которые предоставляет ISO C и его препроцессор. Я не могу понять, почему некоторым людям недостаточно вполне достаточных средств.
      Цитата the_Shadow @
      Цитата
      Странно. А почему я могу писать, например, консольные порграммы безо всяких MFC? У меня компилятор неправильный?

      Хе-хе... Не про то речь. Возьми какой-нибудь helloworld :D:D:D для Win и Lin и посмотри его внимательно до линковки, после, как асм-код и т.д. и т.п. Т.е., если начинаем исследовать код, то вылезают вполне интересные вещи. В частности то, что архитектура Linex, в общем и целом обеспечивает более "лёгкий" код. Вот и всё. Причём, изначально и безо всякого моего (как проггера) участия.

      Цитата
      Исполнимый файл? Я тебе и без просмотра скажу. У него RTL меньше. Да и оптимизацию надо смотреть.

      А я-то как раз вот об этом... Если вспомнить наш с Flex'ом флейм про Visual... :D:D:D
      Я, кстати, про то же и рассказываю... :D:D:D

      Цитата
      Ну помимо всего прочего, размер зависит и от способности компилятора к оптимизации. Я, помнится, в алгоритмах выкладывал дизассемблированную функцию перемножения векторов. Там и Intel С++ и Metrowerks развернули циклы на пару килобайт кода. И за счет этого обставили паскаль по быстродействию раза в 3 и сравнялись с оптимизированной вручную на ассемблере. А если не разворачивать - будет сотня байт. :)

      Во-во-во... 5 (пять!) баллов.
      Вот по этой-то причине до разного рода споров (в т.ч. и х?ли-варных) я и предлагаю по-смотреть код с опцией -S. При разных режимах оптимизации. Вот тогда мы более-менее поймём что же там на самом-то деле происходит. А не будем огульно говорить что Линукс тормозит по причине того, что там с gcc всё скомпилировано... :D:D:D

      Взять, говоришь, и посмотреть? Пожалуйте. Возьми простейший исходник:
      ExpandedWrap disabled
        #include <stdio.h>
         
        int main()
        {
            puts("Hello world");
            return 0;
        }

      Скомпили его под виндой с опциями /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF. Под Lin - с опциями -O4 -S. Сравни результаты.

      Добавлено
      Если пока нет возможности запуситить, то результаты такие:
      helloworld.cod:
      ExpandedWrap disabled
            TITLE   helloworld.c
            .386P
        include listing.inc
        if @Version gt 510
        .model FLAT
        else
        _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
        _TEXT   ENDS
        _DATA   SEGMENT DWORD USE32 PUBLIC 'DATA'
        _DATA   ENDS
        CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
        CONST   ENDS
        _BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
        _BSS    ENDS
        _TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
        _TLS    ENDS
        FLAT    GROUP _DATA, CONST, _BSS
            ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
        endif
        PUBLIC  _main
        EXTRN   __imp__puts:NEAR
        _DATA   SEGMENT
        $SG827  DB  'Hello world', 00H
        _DATA   ENDS
        _TEXT   SEGMENT
        _main   PROC NEAR
         
        ; 5    :    puts("Hello world");
         
          00000 68 00 00 00 00   push    OFFSET FLAT:$SG827
          00005 ff 15 00 00 00
            00       call    DWORD PTR __imp__puts
          0000b 83 c4 04     add     esp, 4
         
        ; 6    :    return 0;
         
          0000e 33 c0        xor     eax, eax
         
        ; 7    : }
         
          00010 c3       ret     0
        _main   ENDP
        _TEXT   ENDS
        END

      helloworld.S:
      ExpandedWrap disabled
            .file   "helloworld.c"
            .section    .rodata.str1.1,"aMS",@progbits,1
        .LC0:
            .string "Hello world"
            .text
            .p2align 2,,3
        .globl main
            .type   main, @function
        main:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $8, %esp
            andl    $-16, %esp
            subl    $28, %esp
            pushl   $.LC0
            call    puts
            xorl    %eax, %eax
            leave
            ret
            .size   main, .-main
            .section    .note.GNU-stack,"",@progbits
            .ident  "GCC: (GNU) 3.4.3 20041212"

      Размер исполняемого файла под винды: 4096 байт.
      Размер исполняемого файла под линух: 4718 байт.

      Что я делаю не так? ;)

      Добавлено
      Цитата Ho Im @
      Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам.

      В общем смысле - да. Применительно к С++ речь обычно идет об обобщенном программировании.
        Вот поэтому плюсы я записываю в более "прикладную" область, где задача состоит в "что-то посчитать", и сделать это правильно в первую очередь, а не "пообщаться с ковриком для мышки". Мону Лизу в микроскоп обычно не разглядывают, равно как деление клетки не наблюдают невооруженным глазом.

        Вот так и здесь, задаче нужен свой инструмент. Как для рассматривания одних произведений исскуства нужен невооруженный глаз, для других микроскоп, для третьих -- анаглифические очки, а для четвертых -- замочная скважина.
          Цитата Ho Im @
          Вот поэтому плюсы я записываю в более "прикладную" область, где задача состоит в "что-то посчитать", и сделать это правильно в первую очередь, а не "пообщаться с ковриком для мышки". Мону Лизу в микроскоп обычно не разглядывают, равно как деление клетки не наблюдают невооруженным глазом.

          Опять же, дело не в этом. Ну, вот, к примеру, возьмем C-шный алгоритм сортировки (qsort). Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа?
            Цитата
            Слушай, если плотник сколотил кособокий дом со щелями - это, наверное, молоток и топор виноваты?

            Слабая аналогия.

            Цитата
            Убери из настроек линкера ненужные библиотеки импорта (которые туда добавляются при создании проекта "по умолчанию"), и таблица импорта не будет такой пухлой.

            Нет. Лучше посмотри на lcc. Почему в "стандартном" Visual не так?

            Цитата
            Какое имеет отношение RTTI к шаблонам?

            Вообще-то я имею ввиду первоначальное высказывание, с которого "покатился" спор.

            Цитата
            Это, конечно, не совсем правильное сравнение, но, если совсем упрощенно, то шаблон - это сильно улучшенная версия макроса.

            Сильно упрощённо, на мой взгляд.

            По причине того, что:
            Цитата
            Но, в отличии от макроса, который "исчезает" после обработки кода препроцессором, шаблон существет на этапе компиляции, что и составляет одно из основных его отличий от макроопределения. Другое отличие - шаблон может по-разному "раскрываться" в зависимости от того, с какими параметрами его инстанцируют.

            Flex, вот обрати внимание на то, что я написал выше -- для реализации этих конструкций нужен только ли компилятор? И никакой поддержки в части библиотек?
              Цитата the_Shadow @
              А не будем огульно говорить что Линукс тормозит по причине того, что там с gcc всё скомпилировано... :D:D:D

              В gcc производительность частично принесена в жертву переносимости. Он и в самом деле компилирует более медленный код по сравнению с icc. Это факт.
              Цитата Flex Ferrum @
              Размер исполняемого файла под линух: 4718 байт.

              Что я делаю не так? ;)

              Ты не делаешь strip :P Размер бинарника 3328 байт, но не забываем, что он еще динамически слинкован с libc.so. Впрочем, у виндового бинарника без kernel32.dll шансы на исполнение тоже невелики :)
                Цитата Flex Ferrum @
                Скомпили его под виндой с опциями /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF. Под Lin - с опциями -O4 -S.

                Как в студии задать опции /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF?
                  Цитата
                  Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам.

                  Да чё ты пристал как пиявка к метапрограммированию. Это всего лишь один из мега-способов сделать нашу жизнь лучше :yes: Другие такие методы - параметры по умолчанию, шаблоны, разрешение перегрузки, namespaces (я ещё не дошёл до классов с их полиморфизмом). А вот как раз препроцессор C - мдя.. ещё скажи, что отлаживать их тебе доставляет удовольствие :lool:

                  Препроцессор.. это вообще в пользу бедных разговоры. Поскольку нет более удобных средств. Максимум для чего нужен - для условной компиляции. Ну ещё есть пара мест, где он к месту (например, декларирование и определение message map-ов в MFC, но там он являеся всего лишь псевдонимом).

                  И после этого привыкшие к #define люди вместо того, что бы корректно унаследоваться или typedef попользовать пишут

                  #define CMyClass std::vector<CMyMiniClass>
                  загляните в исходники C++ ой (совершено не по по праву носящую это имя) библиотечки wxWidgets. И спросите себя - можно ли так писать?.. (MFC в общем то тоже, но меньше :) )

                  Цитата

                  Размер исполняемого файла под винды: 4096 байт.
                  Размер исполняемого файла под линух: 4718 байт.

                  Часто замечаю, что один и тот же код под Linux-ом и Win весит больше на первом. Это стопудово. Могу даже из залежей что нибудь достать, как до дома доберусь.

                  Да и дистрибутивы под Win и Lin одних и тех же программ под первое весят меньше. Иногда - здорово меньше.
                    Цитата the_Shadow @
                    Слабая аналогия.

                    Аналогия в самый раз. Ибо дело далеко не всегда в используемом инструменте. А компилятор - это инструмент.

                    Цитата the_Shadow @
                    Нет. Лучше посмотри на lcc. Почему в "стандартном" Visual не так?

                    Может быть, это, от рук зависит? От количества прочитанных манов? Пример смотри выше по тексту.

                    Цитата the_Shadow @
                    Сильно упрощённо, на мой взгляд.

                    :yes:
                    Цитата the_Shadow @
                    Flex, вот обрати внимание на то, что я написал выше -- для реализации этих конструкций нужен только ли компилятор? И никакой поддержки в части библиотек?

                    Только компилятор. И никакой поддержки со стороны библиотек. А что поддерживать то?
                      Цитата Flex Ferrum @
                      Опять же, дело не в этом. Ну, вот, к примеру, возьмем C-шный алгоритм сортировки (qsort). Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа?

                      Здесь шаблоны покажут себя гораздо лучше. Это несомненно, ибо у qsort'а будут дополнительные накладные расходы на вызов функции сравнения. Зато qsort не компилится каждый раз :)
                      Кажется, дело запало холиваром C vs C++? :D
                        Цитата linuxfan @
                        Ты не делаешь strip Размер бинарника 3328 байт, но не забываем, что он еще динамически слинкован с libc.so. Впрочем, у виндового бинарника без kernel32.dll шансы на исполнение тоже невелики

                        Уменьшил значение ALIGN до 512. Получил размер 2560 байт. :tong:


                        Цитата plan699 @
                        Как в студии задать опции /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF?

                        Ox - C/C++ -> Optimization -> Optimization -> Full optimization
                        MD - C/C++ -> Code Generation -> Runtime libaray -> Multithread DLL
                        FAcs - C/C++ -> Output Files -> Assembler Output -> Assembly, Machine Code and Source
                        ALIGN:512 -
                        OPL:REF - Linker -> Optimization -> References -> Eliminate Unreferenced Data
                        ALIGN можешь задать в Linker -> Command Line -> Additional Options
                          Цитата
                          Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам.

                          Добавлю ещё одно утверждение. Метапрограммирование вредно при описании полностью определённой задачи. Оно "помогает" порождать сущности, которые не нужны в принципе, т.е., ведёт к усложнению задачи (на уровне исходгого кода в том числе). Вначале надо понять -- а зачем здесь это? И только потом детально разобраться с тем, что же это делает.

                          В случае С проблема так не стоит.
                          Цитата

                          Я не могу понять, почему некоторым людям недостаточно вполне достаточных средств.

                          Добавлю -- и имеющих вполне очевидные и детально описанные интерфейсы.
                          Цитата

                          Применительно к С++ речь обычно идет об обобщенном программировании.

                          И... нафига оно?

                          Цитата
                          Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа?

                          Взяли. И что дальше? Зачем нужна оптимизация, если он и так достаточно оптимален? Или, будем оптимизировать уже соптимизированное?

                          Цитата
                          Размер исполняемого файла под винды: 4096 байт.
                          Размер исполняемого файла под линух: 4718 байт.

                          Не-а... -O2 -S дают 4688, после strip test получается 2908 (байт).

                          Цитата
                          Что я делаю не так? ;)

                          Ты привёл размер бинарника, содержащего отладочную информацию. Таким образом, корректнее было бы сравнивать с кодом, содержащимся в ветке DEBUG твоего проекта. Достаточно? :D:D:D

                          Добавлено
                          Цитата
                          Кажется, дело запало холиваром C vs C++? :D

                          Оххх... Застрелите кто-нибудь БухгХантера... :D:D:D
                            Цитата the_Shadow @
                            -O2 -S дают 4688, после strip test получается 2908 (байт).
                            От версии компилятора зависит. 4710 байт, после стриптиза -- 2924. gcc version 4.1.0 20060304 (Red Hat 4.1.0-3)
                              Цитата
                              Оххх... Застрелите кто-нибудь БухгХантера... :D:D:D

                              Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать :)
                              Препроцессор блин :P
                                Цитата
                                Аналогия в самый раз. Ибо дело далеко не всегда в используемом инструменте. А компилятор - это инструмент.

                                Инструмент... да... Вот только подход к этому инструменту различен у разных фирм.
                                Даже в среде M$ Борланд как-то не шибко хорошо живёт. А про тот же lcc (и программирование с Win32 API вообще) и собаки не лают -- ну что поделать, если в M$ иное видение.
                                Желающим рекомендую на lcc реализовать модуль .cpl (угу... апплет контрольной панели). Я не говорю что это невозможно. Это, скажем так, затруднительно.

                                Цитата
                                Может быть, это, от рук зависит? От количества прочитанных манов? Пример смотри выше по тексту.

                                Да-да... Именно -- выше по тексту.
                                А теперь сделай над собой усилие и по-пробуй то же под lcc. Я серьёзно говорю. :D:D:D

                                Цитата
                                Только компилятор. И никакой поддержки со стороны библиотек. А что поддерживать то?

                                Fleeeex... Ну не в Linux это. В M$ я не лезу -- это отдельный вопрос. Ну не катит такой подход в Linux.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (29) « Первая ... 3 4 [5] 6 7 ...  28 29


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0703 ]   [ 14 queries used ]   [ Generated: 19.09.25, 02:04 GMT ]