1. C# / Говнокод #19627

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    static void Main(string[] args)
    {
    	try
    	{
    		watcher.Path = TargetPath;
    		watcher.Created += Watcher_Created;
    		watcher.Renamed += Watcher_Created;
    		watcher.EnableRaisingEvents = true;
    		logger.Info("Сервис запущен.");
    		System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    	}
    	catch(Exception ex)
    	{
    		logger.Error(ex, "Global error", null);
    		Main(null);
    	}
    }

    Запостил: хуита, 15 Марта 2016

    Комментарии (63) RSS

    • А в шарпе вызов Main из юзеркода разрешён?
      Ответить
      • функция как функция

        https://ideone.com/GC3j5M
        Ответить
      • ачотаковато
        Ответить
      • а что, в каком-то языке запрещено?

        Кого вообще кроме лоадера должно волновать что меин еще и не просто меин?
        Ответить
        • С, С++.
          Ответить
          • щито?

            Вот такая программа у меня собралась и писала мне букву "d" пока не упала

            #include <stdio.h>

            void main();

            void main() {
            printf("dd");
            main();
            }
            Ответить
            • Ну а кто-то с 16 этажа прыгает и не разбивается. Правилами языка запрещено, а проблемы тех, кто так попробует сделать шерифа не ебут. Проблемы могут быть или их может не быть. Компилятор за ручку тебя держать не обязан.
              Ответить
              • а можно мне пожалуйста нумер параграфа из С99 где сказано что нельзя?
                Ответить
          • Вроде только кресты. В сишке такого требования я не нашёл.
            Ответить
            • А в крестах такое зачем?

              В си 100% функция как функция

              https://ideone.com/mB7uba
              Ответить
              • Судя по обсуждениям комитета, main может инициализировать глобальные переменные в своём теле. Ещё сигнатура мэйна может не совпадать с объявленной. Поэтому любые манипуляции с main, включая получение указателя и определения типа функции — нелегальны.
                Ответить
            • В Кернигановской достандартной было нельзя. Формально не запрещено но return в main был эквивалентен exit. В любом вызове main, неважно какой уровень рекурсии. В С89 уже пофиксили: только возврат из начального main эквивалентен exit.
              Ответить
          • В тех реализациях C, C++, которые я видел, main ничем не отличается от остальных функций. Просто в стандартной либе есть объектный файл, в котором одна из функций помечена для линкера как точка старта программы, и эта функция после определённого ритуала по инициализации рабочего пространства вызывает main.

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

            Более того, бывают программы вообще без функции main. В некоторых библиотеках «главная» функция называется WinMain или типа того.

            Единственная тонкость, которая может потребовать поддержки компилятора — это то, что main может быть объявлена с аргументами argc, argv etc., а может и без них, и компилятор должен знать, какой вариант используется. Однако, для соглашения cdecl это не важно, ведь стек чистится вызывающим кодом, а значит, он может всегда заталкивать argc, argv, а использовать их или нет — дело мейна.

            *****

            http://stackoverflow.com/questions/13871617/winmain-and-main-in-c-extended
            Ответить
            • P.S. Виндобоги могут ещё соснуть от проблем с кодировкой, если используют main:
              «However, the de facto Windows standard for the encoding of the main arguments is Windows ANSI, which does not support general Windows filenames (such as, for a Norwegian Windows installation, filenames with Greek or Cyrillic characters). Therefore Microsoft chose to extend the C and C++ languages with a Windows-specific startup function called wmain, which has wide character based arguments encoded as UTF-16, which can represent any filename.»
              Ответить
            • Вот, кстати, сообщение от члена комитета: http://goo.gl/kMYInE. Учитывая, что он работает в Oracle, где наверняка своё железо и свои сборки компиляторов, возможно у них где-то есть какие-то особенные функции main. На х86 обычно main даже точкой входа не является, а вся инициализация проходит вместе с инициализацией рантайма С.
              Ответить
      • wh0cd1695271 <a href=http://atenolol24.us.org/>atenolol 25mg</a> <a href=http://cheapviagra247.us.org/>Prices For Viagra</a> <a href=http://amoxicillin247.us.org/>Buy Amoxicillin</a>
        Ответить
    • Стек резиновый, всё стерпит.
      Ответить
    • все правильно, евенты вызовутся же на другом потоке

      а что он main обернул -- так это правильно
      первые 742 раза exception не приведет к выключению, а потом приведет к Stack Overflow
      по-моему логично
      Ответить
      • Хвостовая рекурсия разве не преобразуется в цикл?
        Ответить
        • в момент JITа или при запуске ngen может быть

          А в момент компиляции C# кода в IL -- не думаю
          Я вообще думаю что cs (как и javac) ничо не оптимизирует
          Но это я так думаю
          А на самом деле как -- не знаю
          Надо смотреть получившийся IL код
          Ответить
          • 3_dar в http://govnokod.ru/19627#comment316249 написал:
            >> Хвостовая рекурсия разве не преобразуется в цикл?
            в шарпе - таки нет
            Ответить
            • Продали душу за бектрейсы?
              Ответить
              • В шапре изи получить cil из сборки
                Ответить
                • Ты не понял. Обычно отсутствие TCO обосновывают так: "ну в трейсах же дырка будет".
                  Ответить
                  • ааа

                    На самом деле в cil есть оптимизация хвостовой рекурсии, юзается из F# хз, почему в шарп не завезли, может в 6 шарпе уже. Во всяком случает она элементарно вставляется добавлением инструкции

                    tail.

                    перед call тра-ля-ля в cil руками
                    Ответить
                  • >Обычно отсутствие TCO обосновывают так: "ну в трейсах же дырка будет".

                    Дешевая отмазка если честно. Вот инлайны же трейсам не мешают.
                    Ответить
                    • Ну и <... some calls was optimized by TCO ...>, имхо, вполне бы адекватно смотрелось в бектрейсе.

                      З.Ы. С инлайнами немного другая ситуация - там всегда можно однозначно восстановить трейс, дорисовав фейковые фреймы.
                      Ответить
                      • >Ну и <... some calls was optimized by TCO ...>

                        Накуя?
                        Во-1, сломает обратную совместимость.
                        Во-2, любой мало-мальски продвинутый jit умеет выпиливать фреймы при оптимизации и самое главное - впиливать их обратно при деоптимизации.
                        Ответить
                        • Ну тут, чтобы впилить фреймы, придётся считать, сколько раз tail call сработал... Лишнее действие.
                          Ответить
                          • Это наименьшая из проблем.
                            TCO => цикл.
                            В циклах есть счётчики. Они практически бесплатны.

                            Даже можно эмулировать переполнения стека, для создания комфорта быдлокодерам.
                            Ответить
                        • Погодите, но ведь, чтобы впилить, нужно в худшем случае программу заново выпилить выполнить?
                          Ответить
                  • Проверил - в 6 ом не втыкается
                    Ответить
            • Ну а что-то типа O2 как в плюсах там есть?

              С трудом верится что нет.
              Иначе как объяснить быстродействие почти как у C/C++

              Знаю что Java даже деление на 2 на сдвиги не заменяет.
              Ответить
              • >> O2

                Кислород, это ты?


                Я не силен в шифрах, говори как есть
                Ответить
                • > > O2
                  > Кислород, это ты?
                  Опция компилятора, включает оптимизацию кода
                  -O2
                  Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. <...>

                  Видать, вопрос был о том, можно ли и как заставить JIT компилировать медленный CIL в натив, ещё более быстрый, нежели умолчательный.
                  Ответить
                  • -O100500 Optimize even more. GCC squeezes galaxies to the atomic sizes, raises execution speed above speed of light and performs all optimizations, including those involving a space-time continuum tearing...
                    Ответить
                    • -OOVER9000

                      The average level of optimization, when your mind are already got irreparable damage, and the universe and the laws of physics - not yet
                      Ответить
                  • Да, это я. Дышите глубже.
                    Ответить
                  • как не странно данная опция компилятора в шарпе называется

                    /optimize

                    Но гораздо удобнее просто поставить в vs крыжик "оптимизировать код"
                    Ответить
                • Дышим глубже! Не отвлекаемся!
                  Ответить
                • ты не силен в GCC
                  у вас в вендах это называется /Ox
                  Ответить
                  • /optimize

                    Я больше тебе скажу - я вообще не силен в компиляции руками
                    Ответить
                    • фу

                      поди и make файлы никогда не пейсал? все больше msbuildoм?
                      Ответить
              • >Знаю что Java даже деление на 2 на сдвиги не заменяет.

                Ну...
                Зато как веско звучит это слово: "знаю".hotspot давным-давно даже деления не степеней двойки заменяет на умножение.
                Ответить
                • Ок 3.14159265_dar, не "знаю", а "слышал".

                  Видел как говнокодеры прогроммисты на Java оптимизировали код заменой делений на шифты.

                  И первая ссылка на stackoverflow говорит что конпелятор это не оптимизирует.

                  Оттуда наверное и заблуждение.
                  Ответить
                  • http://ideone.com/QWfPdd
                    Ответить
                  • >Ок 3.14159265_dar
                    Ты меня с сёмой перепутал.

                    >Видел как прогроммисты на Java оптимизировали код заменой делений на шифты.

                    Тут вопрос что подразумевается под Java. Она состоит из 2х частей javac и hotspot. Обе части заменяемы.
                    javac - это просто конвертер исходников в специальный бинарный формат. Такой архиватор с потерями, который херит комменты и форматирование. Есть и разархиватор - jad например. Понятно что он ничего не "потимизирует" потому что конфертер.

                    hotspot - симбиоз интерпретатора и jitа.

                    По дефолту Java = javac + hotspot (jit)

                    >И первая ссылка на stackoverflow говорит что конпелятор это не оптимизирует.
                    Здесь http://govnokod.ru/15393#comment220818 уже давал:
                    http://hg.openjdk.java.net/jdk8/jdk8/hotspot/rev/f3de1255b035

                    Сейчас дополню еще одним забавным патчем, доказывающим что не всегда "оптимизированный" код быстрее наивного:
                    http://hg.openjdk.java.net/jdk8/jdk8/hotspot/rev/ae065c367d93
                    Ответить
                    • >Ты меня с сёмой перепутал.
                      Да нет, все правильно сделал.
                      Ответить
              • пи, запомни

                javac ничего ВАЩЕ неоптимизайит
                оптимайзит jit
                Ответить
                • Литералы вроде клеит. Или нет?
                  Ответить
                • А альтернативные компиляторы (типа gcj) умеют оптимайзить?
                  Ответить
                  • смотря что под оптимайзом понимать. Распространение констант, предварительные вычисления, анролинг циклов даже мой компилятор с 4 курса умел
                    Ответить
                  • видишь ли,
                    оптимизировать нужно под конкретную архитектуру

                    под MIPS, SPARC, x86 и ARM могут быть совсем разные оптимизации
                    потому логичнее делать это на kit
                    Ответить
                • >пи, запомни
                  >javac ничего ВАЩЕ неоптимизайит

                  Нихуя себе, ЧТО ПРАВДА??? Спасибо что ты мне глаза открыл.
                  http://govnokod.ru/19627#comment316438 2016-03-16T14:07:58+04:00 javac - это просто конвертер исходников в специальный бинарный формат. Такой архиватор с потерями
                  Ответить
            • wh0cd2079275 <a href=http://allopurinol.us.org/>allopurinol</a> <a href=http://buycipro.us.com/>buy cipro</a> <a href=http://buyadalat.com/>Buy Adalat</a> <a href=http://buysynthroid.us.com/>cheap synthroid</a> <a href=http://bentylgeneric.us.com/>bentyl cost</a>
              Ответить
    • Дышите глубже!
      Ответить

    Добавить комментарий