Несколько дней назад корпорация Microsoft приняла решение открыть исходный код известной всем программы — «Калькулятора» из ОС Windows. Это приложение входило во все дистрибутивы ОС от Microsoft начиная с 1985 года, когда свет увидела Windows 1.0.

Microsoft использует лицензию MIT для своего ПО. Это тот же тип лицензии, что используется в .Net Core, Visual Studio Code, и MS-DOS. По словам представителей корпорации, сейчас они открывают процесс разработки для open-source сообщества. Сторонние разработчики могут предлагать новые функции и сотрудничать с инженерами Microsoft для добавления этих фич.

С течением времени Калькулятор Windows совершенствуется. Программа появилась на свет в качестве элементарного помощника для выполнения арифметических действий. Сейчас же это надежный научный калькулятор, который может использоваться широким кругом пользователей для решения весьма серьезных задач.

Программа написана на С++ и содержит более 35000 строк кода. Для компиляции проекта пользователям необходима Windows 10 1803 (или более новая) и последняя версия Visual Studio. Со всеми требованиями можно ознакомиться на GitHub.



Компания открыла код для того, чтобы любой желающий мог ознакомиться с такими технологиями Microsoft как Fluent, Universal Windows Platform, Azure Pipelines и другими. Благодаря этому проекту разработчики могут больше узнать о том, как выполняется работа по созданию тех либо иных проектов в Microsoft.

Тем разработчикам, кто планирует присоединиться к проекту, необходимо ознакомиться с требованиями и нормами, сделать это можно здесь.

Ну а с подробным анализом исходного кода Калькулятора Windows можно ознакомиться здесь, прямо на Хабре.

Комментарии (183)


  1. tormozedison
    08.03.2019 21:13
    -10

    Ну вот, теперь его перетащат в ReactOS и сделают программируемым и графическим.


    1. enabokov
      08.03.2019 22:35
      +5

      Он работает на UWP. Я ожидал C#, получил нечитаемый (по сравнению с C#) С++.


      1. tormozedison
        08.03.2019 23:45

        Почитал, что за UWP. Значит, не перетащат.


      1. xfaetas
        09.03.2019 05:33

        Получается в MS не используют свой же C# даже для калькулятора.


        1. leotsarev
          09.03.2019 10:04
          +1

          C# по историческим причинам не популярен среди команды Windows


          1. 0xf0a00
            09.03.2019 11:51

            Так какого же лысого они им весь мир кормят?


            1. tyomitch
              09.03.2019 12:10

              «Они»? Вы про команду Windows или про команду Development Tools?


            1. leotsarev
              09.03.2019 14:06
              +1

              1. Команда винды и команда development tools, представляете, разные команды.
              2. Команда Windows крайне консервативна и любит велосипеды. В частности, убедить из перейти на git удалось только в 2018 году, кажется.
              3. Команда development tools, наоборот, очень любит Шарп и всюду его пихает.
              4. Вообще C# популярен в MS, например в бинге


      1. Wesha
        09.03.2019 07:10

        The purpose of this platform is to help develop universal apps that run on Windows 10, Windows 10 Mobile, Xbox One and HoloLens without the need to be re-written for each.

        Замечательно. Братва, кто хочет поиграть в калькулятор на Xbox? :)


        1. solovetski
          09.03.2019 12:16
          +2

          Ага, с мультиплеером на сто юзеров.


        1. CHolfield
          09.03.2019 15:22
          +1

          Дэсматч в калк по сети на хололинзах (ёпт)


          1. Wesha
            10.03.2019 22:03
            +2

            Это как — проигравший делит на ноль (фаталити!)?


            1. qw1
              10.03.2019 22:39

              Проигравшего делят.


              1. General_Failure
                11.03.2019 07:44

                Но он же тогда станет стремиться к бесконечности, то есть станет бессмертным!


      1. Groramar
        09.03.2019 12:06

        Видимо Шарпей настолько хорош, что Майкрософт не использует его даже для калькулятора :)))


        1. Groramar
          11.03.2019 15:43
          -1

          Возразить есть что? Или правда глаза колет? :) Больше минусов, больше!!! Обожаю анти-кармодрочество.


    1. sumanai
      09.03.2019 07:55
      +1

      А я наоборот в десятку калькулятор от ReactOS ставлю. Ибо он лучше.


      1. AlexanderS
        10.03.2019 10:36

        А как вы настраиваете кодировку? У меня вместо русских — крякозябли.


        1. sumanai
          10.03.2019 16:04

          Ничего не настраивал, всё работает из коробки. Даже виртуальные кнопки при нажатии физических нажимаются

          Заголовок спойлера
          Скриншот калькулятора из ReactOS на Windows 10


          1. AlexanderS
            10.03.2019 16:42

            Я только под Win7x64 запускал.

            Заголовок спойлера


  1. Evengard
    08.03.2019 21:13
    +3

    Всё равно калькулятор из семёрки лучше! =)


    1. Victor_koly
      08.03.2019 22:47
      +2

      Вы не понимаете, самый крутой был в Windows XP. А потом ввели глупое ограничение, не дающее считать результат величиной 1010000 и более. А я так хотел посчитать на своем процессоре 250000!..


    1. Sun-ami
      08.03.2019 23:08
      +9

      Нет, калькулятор из XP лучше — в семёрке просто бесит, что для того, чтобы перевести число в шестнадцатиричный вид, или из него в десятичный, нужно переключаться из инженерного режима в режим «Программист», при этом текущий результат стирается, и теряется возможность вычислений с дробной частью!


      1. KostaArnorsky
        09.03.2019 15:58

        Звучит как идея для Pull Request или хотя бы Issue.


      1. KostaArnorsky
        09.03.2019 16:22

        Создал Issue.


    1. Psychosynthesis
      08.03.2019 23:36
      +1

      Ну, кстати да. Для меня лично единственный объективный минус это отсутствие графического переключателя режимов (инженерный, программист, etc). Если бы кто-нибудь выкатил точно такой же как системный, но всего лишь с дополнительной полоской радио-селекта режима, вынесенной из меню — скачал бы не раздумывая.


    1. zv347
      09.03.2019 07:00
      +3

      Самый лучший калькулятор был в девяностовосьмерке. У него экранные кнопки «нажимаются», когда вводишь с клавиатуры, т.е. слепой ввод облегчается. Хорошо, что и в десятке (20 лет спустя!) его можно использовать.


      1. Max_JK
        09.03.2019 11:48
        +7

        Только что проверил в 10 калькуляторе экранные кнопки тоже нажимаются при вводе с клавиатуры


        1. zv347
          10.03.2019 07:39

          Слева нажатая кнопка, справа ненажатая.



          Если в Windows 10 экранная кнопка визуально меняется при вводе с клавиатуры, то это хорошо. И удивительно. Потому что в XP, Vista, 7, 8 — ничего подобного не было, а было последний раз в 98.

          Сам проверить не могу, у меня Windows 10 LTSB и метро нет, а стандартный калькулятор от семерки.


          1. spinagon
            10.03.2019 08:11
            +1

            image


      1. danfe
        10.03.2019 20:08
        +1

        Хорошо, что и в десятке (20 лет спустя!) его можно использовать.
        Это, кстати, мой личный предмет дикой зависти как юниксоида: WinAPI, при всех его недостатках, предоставляет достаточно богатый baseline (стандартную графику, работу со звуком и пр.) для создания в т.ч. весьма сложных программ, работающих хоть на WinNT 4.0, хоть на «десятке» (без перекомпиляции). Фрюниксы таким похвастаться, к сожалению, не могут. :-(


  1. rsashka
    08.03.2019 21:14
    +6

    В него даже успели накидать ишью, что под Linux не работает ;-)


    1. enabokov
      08.03.2019 22:31
      +6

      Тролли загадили ишью лист топиками вроде «деление на ноль не работает».


  1. vladimirad
    08.03.2019 21:18
    +9

    Маленький шаг для сообщества и гигантский для Микрософт.


  1. Andy_U
    08.03.2019 21:20
    +6

    Тридцать пять тысяч строк C++ кода?


    1. EvilGenius18
      08.03.2019 21:57

      Что же тут удивительного? Это ведь не высокоуровневый язык вроде JS или Python, где многое выполняется за тебя автоматически.

      Хотя, в эту цифру они наверно еще xml и С# код посчитали


      1. Serge78rus
        08.03.2019 22:12
        +6

        А с каких пор C++ стал низкоуровневым? И что такого за меня автоматически выполняется в JS, что в плюсах придется писать руками?


        1. EvilGenius18
          08.03.2019 22:28

          Я имел ввиду более высокоуровневые, поскольку C++ обычно все считают более близким к железу.

          А на счет того, что JS делает автоматически — управление памятью, к примеру. Да в C++ есть поинтеры, позволяющие уменьшить количество мусора, но попробуйте написать 35000 строк идеально структурированого кода без автоматического сборщика мусора. В сравнении с той же программой на JS, тут неизбежно увеличится количество кода.


          1. Serge78rus
            08.03.2019 23:04
            +4

            Честно говоря, мне трудно представить архитектуру приложение, подобного калькулятору, в котором автоматическое управление памятью сколько-нибудь серьезно уменьшило бы объем кода.

            попробуйте написать 35000 строк идеально структурированого кода без автоматического сборщика мусора
            Если не считать за автоматическое управление памятью упомянутые Вами «умные» указатели, то занимаюсь этим на постоянной основе. Было бы нескромно называть свой код «идеально структурированным», но что уж точно не сильно влияет на его приближение к идеалу, так это отсутствие встроенного в язык сборщика мусора. Помимо C++, приходилось писать и на Java, и на JavaScript, и ни один из этих языков за счет наличия GC автоматически не приближал мой код к идеалу. Более того, в Java сильно не хватало так привычного по плюсам RAII, ведь ресурсы, которыми приходится управлять, не сводятся только к памяти.


          1. Groramar
            09.03.2019 12:13

            Ручное управление памятью (разрушение) в более-менее структурированном коде занимает примерно 0.1% строк программы. То есть в калькуляторе примерно 35-50 строк. Можно проверить.


          1. Groramar
            11.03.2019 15:48

            но попробуйте написать 35000 строк идеально структурированого кода без автоматического сборщика мусора.
            У меня, например, проекты по миллиону строк достаточно стуктурированного кода без автоматического сборщика. Так даже удобнее.
            С другой стороны, 35 тысяч строк — это в самом деле замного для калькулятора.


      1. DrPass
        09.03.2019 00:39
        +2

        Что же тут удивительного?

        Удивительно то, что если написать на C++ приложение калькулятора с аналогичным функционалом на чистом WinAPI, со всеми плюшками по валидации данных, поддержке разных языков и т.д., там все равно должно получиться этак на порядок меньше строк.


        1. Wesha
          09.03.2019 03:32
          +4

          Вы про код телеметрии забыли!


        1. leotsarev
          09.03.2019 10:06
          +1

          Покажете?


          1. DrPass
            09.03.2019 13:03
            +1

            Нет. Но вы зря сомневаетесь в моей способности (и вообще в способности любого среднестатистического программиста) написать калькулятор, подобный виндовому, уложившись в 3500 строк на С++ :)


            1. leotsarev
              09.03.2019 14:00
              +2

              Забыли добавить: за выходные вечерами.


      1. FloorZ
        09.03.2019 11:02

        А чо там писать?
        Алгоритм сортировочной станции, работающий по обратной польской записи.
        Этого хватит для любого матиматического действия


    1. alsii
      08.03.2019 22:10
      +4

      это вызов для плюсистов :-) Сделать калькулятор с теми же функциями и неотличимый внешне, но с меньшим объемом кода.


      1. Serge78rus
        09.03.2019 09:47
        -3

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


      1. Mirn
        10.03.2019 09:03

        ну что-ж начнём: я уго… кхм реализую этот функционал за 5 но… кхм тысяч строк


    1. Serge78rus
      08.03.2019 22:27
      +1

      Хотел съязвить, что половина из них — это комментарии с перечислением копирайтов, авторов и т.д. в заголовке каждого файла. Но был не прав — оказалось, что заголовок один из самых коротких, что видел на GitHub:

      // Copyright (c) Microsoft Corporation. All rights reserved.
      // Licensed under the MIT License.
      


      1. WRONGWAY4YOU
        09.03.2019 18:36

        Обычно комментарии в таких случаях не считаются. Все современные инструменты анализа объема кода пропускают всё, что находится под комментарием, т.к. оно никак не влияет на сложность программы.


        1. Serge78rus
          09.03.2019 20:38

          Согласен, но при желании насчитать побольше можно и wc -l использовать.


    1. enabokov
      08.03.2019 22:36

      Интересно, если бы он был написан на C#, было бы меньше строк?


  1. MonkAlex
    08.03.2019 21:32
    +2

    Самый смак в телеметрии.


    1. al_one
      08.03.2019 22:26
      +7

      Вам тоже понравилась вот эта функция? :)

      TraceLogger::LogInvalidInputPasted
          void TraceLogger::LogInvalidInputPasted(wstring_view reason, wstring_view pastedExpression, ViewMode mode, int programmerNumberBase, int bitLengthType)
          {
              if (!GetTraceLoggingProviderEnabled()) return;
      
              LoggingFields fields{};
              fields.AddString(L"Mode", NavCategory::GetFriendlyName(mode)->Data());
              fields.AddString(L"Reason", reason);
              fields.AddString(L"PastedExpression", pastedExpression);
              fields.AddString(L"ProgrammerNumberBase", GetProgrammerType(programmerNumberBase).c_str());
              fields.AddString(L"BitLengthType", GetProgrammerType(bitLengthType).c_str());
              LogTelemetryEvent(EVENT_NAME_INVALID_INPUT_PASTED, fields);
          }


      1. EvilGenius18
        08.03.2019 22:35
        +6

        fields.AddString(L"PastedExpression", pastedExpression);

        Т.е. если ты случаяно вставишь предыдущий скопированный текст в калькулятор (думая, что ты вставляешь скопированное число), то программа автоматически отправит этот текст в Майкрософт, здорово…


        1. al_one
          08.03.2019 22:39

          Я глубоко не копал, могу ошибаться, но похоже так и есть.


          1. EvilGenius18
            08.03.2019 22:45
            +1

            Скорее всего так и есть, ведь скопированный текст, картинки, и тп. не буду считаться валидным вставленным числом (что как раз и регистрирует ::LogInvalidInputPasted), что автоматически выдаст ошибку, и вызовет данного логгера, который отправит телеметрию с этими 5 значениями (одно из которых «pastedExpression» — вставленное значение)


            1. al_one
              08.03.2019 22:57
              +2

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


        1. KostaArnorsky
          09.03.2019 16:41

          А если посмотреть на LogTelemetryEvent

          void TraceLogger::LogTelemetryEvent(wstring_view eventName, LoggingFields fields) const
              {
                  g_calculatorProvider.LogEvent(eventName, fields, LoggingLevel::Verbose, LoggingOptions(MICROSOFT_KEYWORD_TELEMETRY));
              }
          

          то можно удивить, что это все-лишь Event Tracing, но ведь это скучнее, чем Microsoft следит за всеми. Я думаю, что если покопаться, то окажется, что по умолчанию он вообще отключен и его нужно специально включать для отладки.


          1. al_one
            10.03.2019 15:50
            +1

            А как по-вашему выглядит «настоящий» код отправки телеметрии? Могу предположить, она реализована именно как event tracing, где событию, относящемуся к телеметрии, ставится соответствующий флаг (MICROSOFT_KEYWORD_TELEMETRY). А системный сервис уже решает, что делать с таким событием на основе своих настроек.

            // Telemetry events. Uploaded to asimov.
            /* вырезано */
            
            #ifdef SEND_TELEMETRY
                // c.f. WINEVENT_KEYWORD_RESERVED_63-56 0xFF00000000000000 // Bits 63-56 - channel keywords
                // c.f. WINEVENT_KEYWORD_*              0x00FF000000000000 // Bits 55-48 - system-reserved keywords
                constexpr int64_t MICROSOFT_KEYWORD_CRITICAL_DATA = 0x0000800000000000; // Bit 47
                constexpr int64_t MICROSOFT_KEYWORD_MEASURES = 0x0000400000000000; // Bit 46
                constexpr int64_t MICROSOFT_KEYWORD_TELEMETRY = 0x0000200000000000; // Bit 45
                constexpr int64_t MICROSOFT_KEYWORD_RESERVED_44 = 0x0000100000000000; // Bit 44 (reserved for future assignment)
            #else
                // define all Keyword options as 0 when we do not want to upload app telemetry
                constexpr int64_t MICROSOFT_KEYWORD_CRITICAL_DATA = 0;
                constexpr int64_t MICROSOFT_KEYWORD_MEASURES = 0;
                constexpr int64_t MICROSOFT_KEYWORD_TELEMETRY = 0;
                constexpr int64_t MICROSOFT_KEYWORD_RESERVED_44 = 0;
            #endif
            

            Опция SEND_TELEMETRY включается для билдов для «production configuration to be released to the Store and the Windows image», т.е. как раз для релизов в официальном магазине и в дисках с windows.


      1. rogoz
        09.03.2019 01:27

        // Telemetry events. Uploaded to asimov.
         ...
        constexpr auto EVENT_NAME_INVALID_INPUT_PASTED = L"InvalidInputPasted";


  1. terrier
    08.03.2019 23:04
    +2

    Неплохо.
    Объявляем переменную:

    wchar_t m_resolvedName[LOCALE_NAME_MAX_LENGTH];

    Затем сравниваем ее значение со строкой:
    if (m_resolvedName == L"en-US")

    Microsoft — запредельный профессионализм сотрудников и традиционно высокое качество!
    Студентам на начальном курсе C/C++ за такое двойки ставят, а для них норм!


    1. Psychosynthesis
      08.03.2019 23:55
      -2

      Ну вообще забавно, да, весьма корявая конструкция. Можно более подробно в каком файле вы это нашли? А то вообще не очень понятно, что именно тут хотели сделать. Насколько я понимаю, это такая корявая попытка понять разрядность текущей системы (подозреваю, что в x64 LOCALE_NAME_MAX_LENGTH будет больше чем L«en-US», хотя не уверен, поскольку не знаю правил типизации для компилятора, используемого в VS).

      В общем, хотелось бы понять, что конкретно вам не нравится. Вы думаете это опечатка (я про L перед строкой) или вас в принципе смущает корявый способ преобразования типа сей строки и использование «магической константы» «en-US»?


      1. OldFisher
        09.03.2019 00:03
        +4

        Здесь вместо сравнения строк по значению сравниваются указатели (на объявленный массив и на строковую константу, которая тоже массив). Указатели эти, понятное дело, не совпадут никогда.


        1. Psychosynthesis
          09.03.2019 00:18

          А, я чёт не обратил внимания на квадратные скобки… Тогда всё ещё более коряво, согласен.

          и на строковую константу, которая тоже массив
          А разве L, перед этой константой, никак не повлияет на способ передачи этого массива в оператор сравнения?

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


          1. 0xd34df00d
            09.03.2019 03:10

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

            Маловероятно, что она ранее была, так как перегружать оператор сравнения для типов вроде указателей или массивов нельзя.


            1. Psychosynthesis
              09.03.2019 06:09

              перегружать оператор сравнения для типов вроде… массивов нельзя

              Можно подробнее? Впервые об этом слышу.


              1. 0xd34df00d
                09.03.2019 06:21

                When an operator appears in an expression, and at least one of its operands has a class type or an enumeration type, then overload resolution is used to determine the user-defined function...

                Отсюда.


                1. Psychosynthesis
                  09.03.2019 19:00

                  А, я понял, вы имели ввиду, что нельзя перегружать операторы для встроенных типов вообще, без обёртки их в класс.

                  Но тут как раз вот это объявление:
                  wchar_t m_resolvedName[LOCALE_NAME_MAX_LENGTH]
                  Внутри класса, поэтому внутри этого же класса может быть перегружен оператор сравнения для это типа. По вашей же ссылке в Restrictions нет ничего про "==".


                  1. 0xd34df00d
                    10.03.2019 17:13
                    +1

                    Смотрите не на то, где объявлен operator==, а на то, какие у него аргументы. И хотя бы один аргумент должен быть классом либо перечислением.


                    1. Psychosynthesis
                      10.03.2019 22:24

                      Upd… не, я чёт не так сделал, походу.


                      1. 0xd34df00d
                        10.03.2019 22:38

                        (Отвечая на ваш исходный коммент)

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


                        1. Psychosynthesis
                          10.03.2019 22:42

                          Ну я согласен, что в исходном варианте, который обсуждается практически гарантированно будет сравнение указателей, перегрузка оператора сравнения это достаточно редкий кейс, насколько я могу по своему опыту судить.

                          Мне хотелось в деталях разобраться просто.


                          1. 0xd34df00d
                            10.03.2019 22:45

                            Ну, для value-подобных объектов всякие операторы сравнений перегружаются регулярно, без этого некуда.


                      1. qw1
                        10.03.2019 22:40

                        Если хотя бы один аргумент — объект класса
                        Но это не наш случай (wchar_t m_resolvedName[100] — не объект класса).


        1. poison85
          09.03.2019 03:26

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


      1. terrier
        09.03.2019 00:14
        +2

        Собственно, код взят отсюда.
        В массив m_resolvedName кладется (видимо) название локали, после чего в функции GetEnglishValueFromLocalizedDigits проводится вышеуказанная проверка — если мы уже в американской локали, тогда конструируем строку как есть, иначе начинаем ковырять переданную строку.
        Проблема, однако, в том, что само имя m_resolvedName — это не строка, а указатель. Сравнение указателя со строковым литералом, как мне подсказывает статический анализатор — unspecified behavior. Здесь правильно воспользоваться семейством функций *str(n)cmp.


        1. Psychosynthesis
          09.03.2019 00:19

          В массив m_resolvedName кладется (видимо) название локали
          Я так понимаю, тут ещё веселее. Туда вообще ничего не кладётся, это тупо объявление массива длиной LOCALE_NAME_MAX_LENGTH.


          1. terrier
            09.03.2019 00:25

            Ну, в смысле где-то между объявлением переменной и вызовом функции с этой проверкой туда кладется имя локали.


            1. Psychosynthesis
              09.03.2019 00:29

              А зачем вообще имя локали кладётся в массив? Не логичнее было бы для этой цели строку использовать, и сравнивать потом уже эту строку со строкой, чтобы такой огород не городить?


              1. terrier
                09.03.2019 00:39
                +1

                Не логичнее было бы для этой цели строку использовать, и сравнивать потом уже эту строку со строкой, чтобы такой огород не городить?

                Да, конечно, логичнее. Почему автор так не сделал и ни один из его инструментов разработки ему не подсказал — загадка.
                Вообще, понятно, что имя локали лучше положить в переменную отдельного типа LocaleName, ведь мы не любую строку туда можем запихать — как минимум есть ограничения по длине, уверен много других. Но автор поленился — и вот.


                1. aram_pakhchanian
                  09.03.2019 03:18

                  Ну так код компилировали с /w3. Кто-то уже попробовал с w/4 и компилятор выдал предупреждение на эти строки.


              1. SergeyMax
                09.03.2019 08:53

                А зачем вообще имя локали кладётся в массив? Не логичнее было бы для этой цели строку использовать
                Массив из wchar_t — это и есть строка.


                1. Serge78rus
                  09.03.2019 10:08

                  Это строка в C. Конечно, можно и в C++ использовать строки в стиле C, но зачем?


                  1. Welran
                    09.03.2019 13:16
                    +2

                    Видимо потому что функции по получению имени локали из API используют C-style строки. А потом их пытаются сравнить как std::string, что естественно не срабатывает.


                    1. Serge78rus
                      09.03.2019 18:09

                      Windows API, как и многие другие API, весь написан в C-style. Но это не мешает программистам, работающим на C++, преобразовывать полученные от него данные в более высокоуровневые типы и далее, оперируя уже только ими, избегать подобных «детских» ошибок.


                1. Psychosynthesis
                  09.03.2019 18:35
                  -1

                  Да? И что, методы типа empty() или clear() для такого массива тоже работают?


    1. questor
      09.03.2019 00:28
      +12

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


      1. qw1
        09.03.2019 10:21
        +1

        Вангую, что не скоро (либо совсем не увидим), т.к. калькулятор написан на MC++ (managed C++/CLI), который синтаксически не совместим с C++, т.е. анализатор упадёт уже на создании AST.


        1. Andrey2008
          09.03.2019 10:49
          +12

          PVS-Studio. Поддерживаемые языки и компиляторы:

          • Windows. Visual Studio 2010-2017 C, C++, C++/CLI, C++/CX (WinRT), C#
          и т.д.
          • Windows. IAR Embedded Workbench, C/C++ Compiler for ARM C, C++
          • Windows/Linux. Keil µVision, DS-MDK, ARM Compiler 5/6 C, C++
          • Windows/Linux. Texas Instruments Code Composer Studio, ARM Code Generation Tools C, C++
          • Windows/Linux/macOS. GNU Arm Embedded Toolchain, Arm Embedded GCC compiler, C, C++
          • Windows/Linux/macOS. Clang C, C++
          • Linux/macOS. GCC C, C++
          • Windows. MinGW C, C++
          • Windows/Linux/macOS. Java


          1. lostpassword
            09.03.2019 12:47
            +2

            Так увидим?)


            1. Andrey2008
              09.03.2019 16:12
              +1

              Коллега уже в процессе написания заметки.


            1. Andrey2008
              09.03.2019 21:10
              +3

              1. lostpassword
                10.03.2019 21:11

                Вот это оперативность!)


    1. NeocortexLab
      09.03.2019 04:06

      Ссылка на MS
      Equality operators can compare pointers to members of the same type. In such a comparison, pointer-to-member conversions are performed.
      В данном случае имеем случай с same type (wchar_t)


      1. tyomitch
        09.03.2019 11:15
        +2

        В данном случае не member, так что ваша цитата ни при чём.


    1. Wesha
      09.03.2019 07:12
      +1

      Слово "индиоты" не из ниоткуда появилось...


    1. gasizdat
      09.03.2019 08:29
      -1

      Ну значит я зря удивлялся почему в стандартном калькуляторе 2 + 2 * 2 = 8. Теперь все ясно.


      1. agranom555
        09.03.2019 08:42

        Калькулятор в простом режиме вычисляет последовательно. Поэтому и так


        1. gasizdat
          09.03.2019 09:09
          +1

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


          1. SergeyMax
            09.03.2019 09:19

            Возьмите в руки аппаратный калькулятор, узнаете много нового)


            1. alan008
              09.03.2019 10:10

              На научных калькуляторах порядок действий соблюдается, а иногда еще и скобки есть. На бухгалтерских — вряд ли соблюдается.


            1. gasizdat
              09.03.2019 14:05
              +1

              Вот я не поленился и взял в руки Citizen LC-110N. Это самый простой из тех, что имеются у меня. Ничего нового не узнал. Калькулятор не соблюдает приоритет операций, но при этом ведет себя честно, в отличие от сабжа. Так, если ввести 2 + 2, а затем нажать на *, то он сразу посчитает промежуточный результат и отобразит 4. Т.о. четко видно, что следующее действие будет выполнятся над 4. И результат будет закономерным — 8. «Стандартный» же калькулятор просто наглым образом врет, позволяя полностью записать выражение 2+2*2 и при этом получить неверный с математической точки зрения результат.


              1. SergeyMax
                09.03.2019 14:24
                +1

                Стандартный» же калькулятор просто наглым образом врет
                Стандартный калькулятор точно так же
                сразу посчитает промежуточный результат и отобразит 4. Т.о. четко видно, что следующее действие будет выполнятся над 4


              1. sumanai
                09.03.2019 22:46

                Так, если ввести 2 + 2, а затем нажать на *, то он сразу посчитает промежуточный результат и отобразит 4. Т.о. четко видно, что следующее действие будет выполнятся над 4.

                В Андройде так же, только в итоге выходит 6.


      1. rogoz
        09.03.2019 15:24
        +1


        1. UMAX
          09.03.2019 21:25

          Ой, извините за оффтоп, а как он у вас на русском языке?
          У меня русская 10-ка (уже 1809), но все «стандартные» проги винды на английском.


          1. Demon_i
            09.03.2019 23:00

            У Вас язык интерфейса русский. Стор (и прочая Метро братия) Тянет язык интерфейса приложений. В настройках языковых параметров переключите все на русский. В принципе, «метод ввода по умолчанию» можно оставить на английском, если программируете. Хотя лучше поставить галку запоминать для каждого приложения.


            1. UMAX
              11.03.2019 14:23

              Спасибо!


          1. WayMax
            11.03.2019 13:45

            1. UMAX
              11.03.2019 14:23
              -1

              Спасибо!


  1. Stepan555
    08.03.2019 23:45
    -1

    Кому это надо? :-)


  1. caveeagle
    09.03.2019 00:14
    +21

    В комментарии призывается Andrey2008 — как раз для его PVS-студии развлечение, ну и мы посмеёмся.


    1. Andrey2008
      09.03.2019 21:35
      +1

      Демоны призваны и выполняют вашу волю.


  1. SkyHunter
    09.03.2019 01:48
    +3

    > Компания открыла код для того, чтобы любой желающий мог ознакомиться с такими технологиями Microsoft как Fluent, Universal Windows Platform, Azure Pipelines и другими.

    Без этого уже калькулятор никак не написать?


    1. aram_pakhchanian
      09.03.2019 03:19

      Наверное, на нем студенты практиковались.


    1. Wesha
      09.03.2019 03:36
      +3

      "При изготовлении часов использованы самые современные технологии: сварка взрывом, клёпка газом, сборка трезвым." ©


      1. OldGrumbler
        09.03.2019 19:14

        Ага, «Позолоченный корпус куркучасов оцинкован вольфрамом» )))


    1. neit_kas
      09.03.2019 04:20

      М.б. понесло? Было как-то. Писал одну прогу для себя. Работы там было на 2-3 дня зевая. Но это же скучно. И понесло меня в абстракции: всякие менеджеры, какие-то зачатки недоСОА, хитрая сигнальная библиотека на C++ шаблонах (её м.б. как-нибудь даже на хабр вытащу, если допилю). В общем, пилил я это всё месяца два, да так и не допилил.


    1. leotsarev
      09.03.2019 10:09
      -1

      Вообще-то нет


    1. leotsarev
      09.03.2019 10:10

      Расскажите, как бы вы написали калькулятор без Azure Pipelines например. Вручную бы собирали и в релиз добавляли?


  1. selivanov_pavel
    09.03.2019 02:37
    -3

    *минутка рекламы калькуляторов*

    Открытый кросс-платформенный speedcrunch умеет всё то же самое и даже больше, как-то обходясь без сбора телеметрии.


    1. enabokov
      09.03.2019 06:04
      +1

      Ну если пошла такая пьянка — писать выражения вручную, то тогда уже надо ставить Jupyter, который поддерживает разные ядра (языки) с разными прилагающимися библиотеками. Фактически это учебный стандарт.


      1. selivanov_pavel
        09.03.2019 11:27

        Ну это уже другого класса инструмент, так можно и до Maxima/Mathcad докатиться :)

        Вручную набрать быстрее, чем кликать по кнопочкам, особенно если для авто-дополнение для функций и констант работает.


      1. Andy_U
        09.03.2019 15:59

        тогда уже надо ставить Jupyter, который поддерживает разные ядра (языки)


        А просто набрать в строке поиска Google? Например 2+2*2? Кстати — ответ 6.


        1. Groramar
          11.03.2019 15:54

          Есть еще wolframalpha:
          www.wolframalpha.com


    1. balsoft
      09.03.2019 10:19
      +2

      Вы забыли про самый лучший из всех калькуляторов — qalculate (основанный на qalc), Открытый, кроссплатформенный,…


      1. roodz
        09.03.2019 19:10

        О да, он чертовски хорош.
        Хоть старый добрый Numlock Calculator 3.2 и всплывает быстрее, но тут такая мощь…


        1. balsoft
          09.03.2019 23:51

          У меня qalc прикручен к запускалке albert, и поэтому открывается мгновенно. Позволяет делать всё, что может понадобиться вычислительно-считательного и даже немного больше.


      1. sumanai
        09.03.2019 22:50

        Installer for Windows: 56,0 МБ


        1. MTyrz
          10.03.2019 01:11

          Так он небось всю GTK с собой в гости ведет?


          1. sumanai
            10.03.2019 15:51

            Естественно.


        1. 0xd34df00d
          10.03.2019 17:16

          Ну так то Windows.


          Calculating dependencies... done!
          [ebuild  N     ] dev-libs/tinyxml-2.6.2-r3::gentoo  USE="stl -debug -doc -static-libs" 206 KiB
          [ebuild  N     ] app-text/rarian-0.8.1-r3::gentoo  USE="-static-libs" 482 KiB
          [ebuild  N     ] sci-libs/libqalculate-2.8.1:0/20::gentoo  USE="gnuplot readline -curl -icu -static-libs" 1?916 KiB
          [ebuild  N     ] sci-calculators/qalculate-gtk-2.8.1::gentoo  2?589 KiB
          
          Total: 4 packages (4 new), Size of downloads: 5?191 KiB

          Правда, 2.5 мегабайта на калькулятор — всё равно перебор, даже если там в комплекте красивые начертания для всяких тангенсов-котангенсов.


          1. sumanai
            11.03.2019 03:14

            У вас просто GTK уже стоит, вот он его и не посчитал. У меня под WSL всё намного печальнее, правда лишь потому, что ещё иксы тянутся со всеми прибабахами.


            1. 0xd34df00d
              11.03.2019 03:24

              Ну, gtk — достаточно широко используемая библиотека, чтобы считать, что она почти наверняка уже есть. Вон, даже у меня есть, несмотря на USE="-gtk -gtk2 -gtk3".


    1. danfe
      10.03.2019 15:22
      +1

      Открытый кросс-платформенный SpeedCrunch
      Действительно, весьма фичастый и приятный калькулятор; странно, что вас заминусовали. Обновил FreeBSD'шный порт до мастера бхагавад-гиты.


  1. Ivnika
    09.03.2019 03:28
    +1

    Мне как почти полному нубу в программировании всегда было интересно- почему нажатие кнопок в этом гадском калькуляторе не всегда срабатывало? Причем это не зависило от мощности ресурсов.


    1. morgot
      09.03.2019 04:19

      При каких вводных данных это было и на какой ОС?
      Чтобы программист мог найти ошибку, он должен ее сначала воспроизвести. Копаться в 35к строках чужого кода сложно, намного проще запустить в отладчике.


      1. AngReload
        09.03.2019 07:15
        +1

        Зря кто-то чуваку минус поставил, есть непонятные траблы с этим калькулятором. Например, Win 10 1809, после смены раскладки клавиатуры калькулятор перестаёт реагировать на нажатие Backspace. Но на нескольких других компах это не воспроизводится.
        Впрочем, мельком взглянув на исходники, у меня уже пропало всякое желание в этом разбираться.


      1. Ivnika
        09.03.2019 10:18

        Версии виндовс от 97 до 10
        проявляется в несрабатывании кнопок калькулятора при клике на них мышкой. Клик быстрый. Визуально видно что кнопка нажимается, но на экране нет отклика (не появляется цифра)


        1. 4umak
          09.03.2019 15:56

          Возможно mouseup происходит уже за пределами кнопки? Тогда она не активируется, да, нажатие в винде срабатывает именно на up, а не на down. Можно зажать мышью кнопку, держать, увести курсор с кнопки, отпустить, и ничего не произойдёт.


          1. sumanai
            09.03.2019 22:52
            +3

            Полезная кстати фича, когда понимаешь, что нажал не ту клавишу, но отжать ещё не успел.


  1. dimonoid
    09.03.2019 06:23
    -1

    Зачем писать калькулятор когда можно использовать Python или R? Там есть куда больше возможностей для вычисления чего угодно, даже тех формул которые ещё не существует.


    1. Zuy
      09.03.2019 07:21
      +3

      Потому что эта куча возможностей большинству не нужна, а нужен аналог самого обычно калькулятора, к ктоторому люди привыкли в обычной жизни. Люди хотят видеть и нажимать ровно теже кнопки которые они нажимают на обычном калькуляторе и никого не волнуют функции которых не существует, нужны те, которые уже существуют сотни лет и чтобы пользоваться было так же, как и в докомпьютерную эпоху.
      Ну и потом, калькулятор, который был до Win10, просто удобный. Как вы на питоне переведете число из десятичной системы в шестнадцатиричную, а потом мышкой битики пощелкаете, чтобы увидеть как оно меняется? Один клик мышкой по биту позволяет изменить его состояние и увидеть как изменилось само число. Никакой python или R такой фичей не похвастается.


      1. Dovgaluk
        09.03.2019 11:50
        +1

        Если сотни лет, то умножать придется в столбик.


      1. dimonoid
        11.03.2019 03:32

        Windows калькулятор тоже графики строить умеет одной командой? А посчитать сумму серии?
        Desmos прямо никто не использует вместо калькулятора? Wolfram Alpha? Symbolab?
        Покликать мышкой по битикам не оправдание, этим мало кто вообще пользуется (только для понимания принципа бинарных чисел?)


        Я просто пытаюсь объяснить что именно Windows калькулятор не умеет почти ничего, что возможно в вышеперечисленных продуктах.
        Почему на хабре так Python не любят? Он мягкий и пушистый особенно для единоразовых вычислений. Также имеет историю и возможность сохранить формулы вычисления на потом, и сохранить все это в виде программы.


        1. DrPass
          11.03.2019 04:23

          Я просто пытаюсь объяснить что именно Windows калькулятор не умеет почти ничего, что возможно в вышеперечисленных продуктах.

          Так с этим никто не спорит. Ещё калькулятор Windows вам не защитит сеть от кибератак, не загрузит свежие фоточки в облако и не проведет анализ семантического ядра сайта.
          Но зато он похож на обычный калькулятор. Вы можете набрать на клавиатуре, или даже мышкой, выражение и увидеть результат, ничего вообще не зная про командные строки, как скачивать и устанавливать Питона и т.д.
          Это ведь важнее, чем возможность сохранять формулы вычисления на потом и т.д. (я без сарказма). Сложных навороченных агрегатов с побочной функцией «могу посчитать выражение» немало, и Питон не первый, и не последний из них. Калькулятор крут тем, что он простой и понятный всем (ну, по крайней мере, простой в тех инкарнациях, которые без телеметрии и 35000 строк счастья).


  1. tendium
    09.03.2019 09:39
    +2

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


  1. lany
    09.03.2019 10:03
    +4

    В старой утечке исходников Windows 2000 тоже был ещё старый калькулятор. Любопытно, что эти исходники лежат на гитхабе. Интересно, в курсе ли Микрософт?..


    1. Serge78rus
      09.03.2019 10:26
      +2

      Там sloccount насчитывает всего 3065 строк. Это явно недостаточно для таких заявлений, как:

      Компания открыла код для того, чтобы любой желающий мог ознакомиться с такими технологиями Microsoft как Fluent, Universal Windows Platform, Azure Pipelines и другими. Благодаря этому проекту разработчики могут больше узнать о том, как выполняется работа по созданию тех либо иных проектов в Microsoft.


      1. lany
        09.03.2019 10:30
        +6

        Ну так это почти двадцать лет назад было. С тех пор технологии калькулирования-то сильно шагнули вперёд!


  1. 0xf0a00
    09.03.2019 11:57
    +4

    По моему гениально, выкладываем код стандартных приложений. Сообщество их приводит в порядок, обновленные приложения набиваем телеметрией и выкладываем с новым апдейтом венды, не забывая взять денег за лицензию.


    1. tyomitch
      09.03.2019 12:12
      +10

      Вы описали традиционную бизнес-модель Red Hat :-)


  1. Stepan555
    09.03.2019 12:48

    Я так и не понял в связи с чем такой ажиотаж. Когда в «детстве» я писал на дельфях, такую поделку сделал бы за часок и никто бы этому не удивился. Там кто-то увидел какие-то гениальные откровения в коде?


    1. Groramar
      09.03.2019 12:57
      +8

      Так это в детсве и на делфях. А сейчас для этого нужно 35 тысяч строк, отдел программистов и тестировщиков :)))


    1. leotsarev
      09.03.2019 14:02
      +1

      Ещё один. Давайте за два часа. Напишете?


      1. Stepan555
        09.03.2019 20:52
        -1

        Для этого мне надо найти машину с Виндусом, найти где-то дистриб Дельфей, установить и всё для того, чтобы доказать вам, что я умею класть кнопочки на форму и писать простые обработчики? Мммм, пожалуй, мне это не интересно.


      1. 0xf0a00
        09.03.2019 23:53

        Нет никаких проблем накидать калькулятор на Delphi.


        1. leotsarev
          11.03.2019 09:50

          Ждем статью. За два часа аналог калькулятора винды :-)


          1. Stepan555
            11.03.2019 10:13

            не ждите, откройте Дельфи для чайников и делайте
            xn--i1abbnckbmcl9fb.xn--p1ai/статьи/524913
            ds-release.ru/borland-delphi-7/kalkulyator-na-delphi
            ну и так далее:
            yandex.ru/search/?text=delphi%20calculator&clid=2233627&lr=213


            1. leotsarev
              11.03.2019 11:02

              Немного намекаю на то, что может вы поторопились с оценкой в 1 час? Это нормально для разработчиков, мы всегда так делаем. Сейчас время подумать и оценку изменить :-)


              А то бросаться выводами, не подумав, недостойно инженера. Вот сейчас например вы сделали вывод, что я не знаком с Delphi. Зачем? :-)


              1. Stepan555
                11.03.2019 11:47

                даже если я и поторопился и это будет не 1 час, а 1 вечер, это всё равно не материально и не сравнимо с 35000 строк и человеко-годами, затраченными MS. И никто так и не ответил мне на мой изначальный вопрос — в связи с чем такой ажиотаж и в чём ценность этого кода, щедро предоставленного МS?
                А вам я просто ответил, что если вам интересно как на Дельфи сделать калькулятор, то всё уже давно сделано 1000 раз, не надо ждать 1001 статьи на ту же тему. Вашего уровня знакомства с Дельфи я неимею чести знать.


                1. leotsarev
                  11.03.2019 14:53
                  +1

                  Сделать на Дельфи калькулятор так же, как и везде: взять и написать :-)
                  Вопрос-то не в этом. Вопрос в том, что вы даёте совершенно нереалистичные оценки с умным видом. Зачем?
                  Вот сейчас вы написали про человеко-годы. На основании чего?
                  Вы понимаете разницу между написанием прототипа и законченным программным продуктом?


                  1. dim2r
                    11.03.2019 15:17
                    -1

                    Сделать на Дельфи калькулятор так же, как и везде: взять и написать :-)


                    а как же кровавый энтерпрайз, аджайл, совещания? чем занять толпу менеджеров? :):):):):)


      1. Groramar
        10.03.2019 01:12

        Скорее всего в два часа уложусь. Если на Лазарусе, то будет еще и кросс-платформенный. В отличие от :)


        1. leotsarev
          11.03.2019 09:51

          Ждем статью. За два часа аналог калькулятора винды :-) Кроссплатформенный.


  1. Alexufo
    09.03.2019 12:51
    +10

    сделают все что угодно для отвода глаз, лишь бы не выкладывать пинболл.


    1. cyber_roach
      09.03.2019 13:33
      +2

      Думаю причина в этом: habr.com/ru/post/163105

      этот код был написан несколькими годами ранее сторонней компанией, и никто в Microsoft никогда не понимал, как он работает (ещё меньше до сих пор это понимают), и бoльшая часть кода была полностью без комментариев. Поэтому мы просто не могли понять, почему детектор столкновений не работает. Чёрт, мы даже не могли найти детектор столкновений!

      Кстати я бы тоже посмотрел на код игрушек MS, пусть даже бы и только новых, последний сапер на UWP был неплох.


  1. cb_ein
    09.03.2019 13:36

    Как сейчас помню, что окончательно переехал на unix, когда калькулятор в чистой свежеустановленной win 10 вдруг выбросил исключение при запуске.


    1. Alexufo
      09.03.2019 17:43

      вы еще не видели как калькулятор предлагал оценить его звездочками после некоторой эксплуатации.


  1. DVoropaev
    09.03.2019 17:01

    Программа написана на С++ и содержит более 35000 строк кода.

    не слишком ли много?


    1. Alexufo
      11.03.2019 00:19

      в то время премии платили за «сколько поработал».


  1. itconsulting
    09.03.2019 17:13

    Вспомнилось из юности, когда калькуляторы были в новинку и их только недавно разрешили использовать на «предприятиях советской торговли и общественного питания» — но только после тестирования: необходимо было умножить число 12345679 (без восьмёрки!) на любое число из строки таблицы умножения для девятки (9, 18, 27, 36, 54 и т.д.). Если в результате получалось число вида 111111111, 222222222, 333333333 — то это должно было документироваться и калькулятор допускался к использованию.


  1. ainoneko
    09.03.2019 17:59
    +4

    Мне помнится, был когда-то «неофициальный калькулятор от MS» (из пакета «PowerToys»), который ещё и графики рисовал.
    В нём доблестные программисты вычисляли синус разложением в ряд, не приводя аргумент к небольшому диапазону.

    Результат был немного предсказуем:
    синус достигал «военных значений» (10 и более).


  1. DerRotBaron
    09.03.2019 18:36

    Компания открыла код для того, чтобы любой желающий мог ознакомиться с такими технологиями Microsoft как Fluent, Universal Windows Platform, Azure Pipelines и другими. Благодаря этому проекту разработчики могут больше узнать о том, как выполняется работа по созданию тех либо иных проектов в Microsoft

    Теперь понятно, почему встроенный калькулятор Windows 10 просит оценить себя в магазине приложений.


  1. MacIn
    09.03.2019 19:32

    Кстати, а XPшный в десятке будет работать?


    1. SvyatoslavMC
      09.03.2019 20:45

      Будет, наверное. Я до сих пор играю в Пинбол, скопированный из дистрибутива с XP :D


    1. sumanai
      09.03.2019 22:57
      +1

      Используйте из ReacOS, он практически идентичен калькулятор из XP и имеет давнюю историю открытого исходного кода.


  1. SvyatoslavMC
    09.03.2019 21:12
    +1

    Всех, кто упомянул PVS-Studio и не верил, что проверка нестандартного C++ возможна, приглашаю к прочтению и обсуждению!

    Подсчитаем баги в калькуляторе Windows (хабрапост).


  1. perfect_genius
    10.03.2019 00:13
    +1

    Вот бы они выпустили исходники Пейнта — багов там целый список можно набрать.


    1. sumanai
      10.03.2019 15:52

      Боюсь если и откроют, то Paint3D.