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

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

Поэтому мы решили немножко перенестись в прошлое и посмотреть, как изменились инструменты разработки, примеры кода и SDK за 30 лет. А что может быть более показательным, чем сравнить создание оконного приложения “Hello World”?

От Windows 1.0 к Windows 10


Летом к выходу Windows 10 наши друзья из компании OnTheHub подготовили замечательную инфографику, из которой можно проследить прогресс самой операционной системы.



Уверен, что большинство хабрачитателей знакомы со значительной частью этой истории на собственном опыте, поэтому давайте смотреть, что же там было с кодом?

Windows 1.0 SDK




SDK для первой версии Windows распространялась на семи (7) пятидюймовых флоппи-дисках.

Как Википедия цитирует Чарльза Петцольда, «оригинальная версия программы Hello World в Windows 1.0 SDK носила слегка скандальный характер. Файл HELLO.C был около 150 строк длинной, и еще примерно 20 строк занимал ресурсный скрипт HELLO.RC… Программисты-ветераны часто морщатся в ужасе или наоборот смеются, сталкиваясь с той hello-world программой для Windows.» Код программы приведен ниже.

Десять лет назад Чарльз вспоминал соответственно 20-летний юбилей выхода SDK и написал очень «вкусную» для любителей истории статью о своих впечатлениях и попытках написать новую программу двадцать лет спустя.

В то время IBM, Digital Research и Microsoft выпустили SDK для своих соответствующих систем. Они стоили примерно по $500, все были достаточно сложны, но, честно говоря, больше всех среди них выделялась Windows. Она не была идеальной, но создавалось впечатление, что Microsoft действительно хотела, чтобы независимые разработчики ПО, как мы тогда, инвестировали в написание приложений для Windows.

На семи дискетах размещались:

  • Утилиты – 2 дискеты с установочными и исполняемыми файлами
    • EXEHDR, IMPLIB, LIB, LINK4, MAKE, MAPSYM, RC, RCPP, SYMDEB, WINSTUB
    • DIALOG, FONTEDIT, HEAPWALK, ICONEDIT, SHAKER, SLAPJR

  • Библиотеки и include-файлы, включая знаменитый Windows.h на 80Kb! – тоже 2 дискеты
  • Символьные файлы и библиотеки для отладки – 1 дискета
  • Примеры кода – 2 дискеты, включавшие 13 приложений в исходниках:
    • HELLO – создание окон,
    • TYPE – ввод с клавиатуры и отображения текста,
    • SHAPES – работа с меню и рисование фигур в окне,
    • TRACK – работа с мышью (вы же помните, что мышь только начинала входить в обиход и массовому пользователю была не знакома?),
    • FONTTEST – создание диалоговых окон и обработка пользовательского ввода, работа со шрифтами,
    • TEMPLATE – пустое приложение как основа для все остальных
    • MAPMODES – разные режимы отображения данных с изменением положения и размера,
    • SAMPLE – тоже самое, что TEMPLATE, но с дополнительными пунктами меню (File, Edit) и стандартными диалоговыми окнами,
    • CLOCL – аналог приложения с часами в самой системе, показывающий, как работать с битмапами,
    • CARDFILE – аналог приложения с картотекой из Windows, работа в полноэкранном режиме,
    • MUZZLE – приложение на паскеле, демонстрирующее создание работу с окном.

Все примеры, кроме последнего, написаны на Cи, иногда со вставками на ассемблере.

Утилиты «включали специальную версию Microsoft C Compiler 3.0, а также два толстых мануала на примерно 1000 страниц в сумме, описывающих все, что вам нужно было знать для написания Windows-приложений».

Говоря о стоимости ($500), Чарльз пишет, что самую большую ценность представлял заголовочный файл на 80K, что было феноменально на то время. Фактически, он определял программный интерфейс (API) для работы с Windows, включая кучу новых типов данных, констант, структур и описание всех функций, которые были доступны вашим приложениям (около 400 всего). И все было отлично документировано в руководствах.

Windows 1.0: HELLO


«Проект», как бы мы сказали сегодня, а тогда просто набор файлов с Make-файлом для сборки включает три файла кода:

Заголовочный файл HELLO.h


/* String table constants */
#define IDSNAME     100
#define IDSABOUT    200
#define IDSTITLE    300

/* 'About' dialog box resource id */
#define ABOUTBOX    1

/* icon name */
#define HELLOICON 1


Файл программы HELLO.c


/*  Hello.c
    Hello Application
    Windows Toolkit Version 1.03
    Copyright (c) Microsoft 1985,1986        */

#include "windows.h"
#include "hello.h"

char szAppName[10];
char szAbout[10];
char szMessage[15];
int MessageLength;

static HANDLE hInst;
FARPROC lpprocAbout;

long FAR PASCAL HelloWndProc(HWND, unsigned, WORD, LONG);

BOOL FAR PASCAL About( hDlg, message, wParam, lParam )
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
    if (message == WM_COMMAND) {
        EndDialog( hDlg, TRUE );
        return TRUE;
        }
    else if (message == WM_INITDIALOG)
        return TRUE;
    else return FALSE;
}


void HelloPaint( hDC )
HDC hDC;
{
    TextOut( hDC,
             (short)10,
             (short)10,
             (LPSTR)szMessage,
             (short)MessageLength );
}


/* Procedure called when the application is loaded for the first time */
BOOL HelloInit( hInstance )
HANDLE hInstance;
{
    PWNDCLASS   pHelloClass;

    /* Load strings from resource */
    LoadString( hInstance, IDSNAME, (LPSTR)szAppName, 10 );
    LoadString( hInstance, IDSABOUT, (LPSTR)szAbout, 10 );
    MessageLength = LoadString( hInstance, IDSTITLE, (LPSTR)szMessage, 15 );

    pHelloClass = (PWNDCLASS)LocalAlloc( LPTR, sizeof(WNDCLASS) );

    pHelloClass->hCursor        = LoadCursor( NULL, IDC_ARROW );
    pHelloClass->hIcon          = LoadIcon( hInstance, MAKEINTRESOURCE(HELLOICON) );
    pHelloClass->lpszMenuName   = (LPSTR)NULL;
    pHelloClass->lpszClassName  = (LPSTR)szAppName;
    pHelloClass->hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
    pHelloClass->hInstance      = hInstance;
    pHelloClass->style          = CS_HREDRAW | CS_VREDRAW;
    pHelloClass->lpfnWndProc    = HelloWndProc;

    if (!RegisterClass( (LPWNDCLASS)pHelloClass ) )
        /* Initialization failed.
         * Windows will automatically deallocate all allocated memory.
         */
        return FALSE;

    LocalFree( (HANDLE)pHelloClass );
    return TRUE;        /* Initialization succeeded */
}


int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
HANDLE hInstance, hPrevInstance;
LPSTR lpszCmdLine;
int cmdShow;
{
    MSG   msg;
    HWND  hWnd;
    HMENU hMenu;

    if (!hPrevInstance) {
        /* Call initialization procedure if this is the first instance */
        if (!HelloInit( hInstance ))
            return FALSE;
        }
    else {
        /* Copy data from previous instance */
        GetInstanceData( hPrevInstance, (PSTR)szAppName, 10 );
        GetInstanceData( hPrevInstance, (PSTR)szAbout, 10 );
        GetInstanceData( hPrevInstance, (PSTR)szMessage, 15 );
        GetInstanceData( hPrevInstance, (PSTR)&MessageLength, sizeof(int) );
        }

    hWnd = CreateWindow((LPSTR)szAppName,
                        (LPSTR)szMessage,
                        WS_TILEDWINDOW,
                        0,    /*  x - ignored for tiled windows */
                        0,    /*  y - ignored for tiled windows */
                        0,    /* cx - ignored for tiled windows */
                        0,    /* cy - ignored for tiled windows */
                        (HWND)NULL,        /* no parent */
                        (HMENU)NULL,       /* use class menu */
                        (HANDLE)hInstance, /* handle to window instance */
                        (LPSTR)NULL        /* no params to pass on */
                        );

    /* Save instance handle for DialogBox */
    hInst = hInstance;

    /* Bind callback function with module instance */
    lpprocAbout = MakeProcInstance( (FARPROC)About, hInstance );

    /* Insert "About..." into system menu */
    hMenu = GetSystemMenu(hWnd, FALSE);
    ChangeMenu(hMenu, 0, NULL, 999, MF_APPEND | MF_SEPARATOR);
    ChangeMenu(hMenu, 0, (LPSTR)szAbout, IDSABOUT, MF_APPEND | MF_STRING);

    /* Make window visible according to the way the app is activated */
    ShowWindow( hWnd, cmdShow );
    UpdateWindow( hWnd );

    /* Polling messages from event queue */
    while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
        TranslateMessage((LPMSG)&msg);
        DispatchMessage((LPMSG)&msg);
        }

    return (int)msg.wParam;
}


/* Procedures which make up the window class. */
long FAR PASCAL HelloWndProc( hWnd, message, wParam, lParam )
HWND hWnd;
unsigned message;
WORD wParam;
LONG lParam;
{
    PAINTSTRUCT ps;

    switch (message)
    {
    case WM_SYSCOMMAND:
        switch (wParam)
        {
        case IDSABOUT:
            DialogBox( hInst, MAKEINTRESOURCE(ABOUTBOX), hWnd, lpprocAbout );
            break;
        default:
            return DefWindowProc( hWnd, message, wParam, lParam );
        }
        break;

    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;

    case WM_PAINT:
        BeginPaint( hWnd, (LPPAINTSTRUCT)&ps );
        HelloPaint( ps.hdc );
        EndPaint( hWnd, (LPPAINTSTRUCT)&ps );
        break;

    default:
        return DefWindowProc( hWnd, message, wParam, lParam );
        break;
    }
    return(0L);
}

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

Ресурсный файл HELLO.rc


#include "style.h"
#include "hello.h"

HELLOICON  ICON    hello.ico

STRINGTABLE
BEGIN
    IDSNAME,    "Hello"
    IDSABOUT,   "About..."
    IDSTITLE,   "Hello Windows!"
END

ABOUTBOX DIALOG 22, 17, 154, 75
STYLE WS_POPUP | WS_DLGFRAME
BEGIN
    CTEXT "Microsoft Windows"                   -1, 0,  5, 154, 8
    ICON  "hello"                               -1,  9, 23,  0, 0
    CTEXT "Hello application"                   -1,  0, 14, 154, 8
    CTEXT "Version 1.03"                        -1, 30, 34, 94, 8
    CTEXT "Copyright  1985,1986, Microsoft Corp."   -1,  0, 47,154, 9
    DEFPUSHBUTTON "Ok"                        IDOK, 61, 59, 32, 14, WS_GROUP
END

Как вы можете видеть по исходникам, на самом деле это не совсем тривиальное приложение (на 170+ строчек), выводящее в заголовке или внутри приложения простую фразу. В действительности оно было несколько сложнее: в нем демонстрируется также работа со строками из ресурсного файла и также добавляется About-пункт в системное меню, запускающий диалоговое окно при выборе элемента, причем уже с использованием callback-функции для обработки результата.

В прошлом году Чарльз написал еще одну статью на тему того самого “Hello World”, в которой описывает свои впечатления от изучения программы в 1985 и мысли на тему того, как можно было бы ее переделать, чтобы сделать более понятной простым смертным. Спустя три года, в 1988 выйдет его первая книга “Programming Windows”.

Windows 10 SDK


За тридцать лет программные системы прошли огромный путь. Драматически выросли сложность и количество внутреннего кода. Инсталлятор современной операционной системы может занимать целый DVD-диск с гигабайтами информации. Сопоставимо весят инструменты разработки и SDK со всеми необходимыми библиотеками.

Например, в состав SDK для Windows 10 входят:
• Заголовочные файлы, библиотеки и метаданные (с учетом версий!)
• Windows-контракты (метаданные для Windows Runtime) с соответствующими платформенными файлами
• Расширения Windows-платформы — SDK для Windows Desktop, Windows Mobile, Windows IoT и Windows PPI.
• WindowsApp.lib – общая библиотека для универсальных приложений
• Объединенная CRT
• Windows App Certification Kit
• Обновления DirectX
• Windows Performance Toolkit
• .NET Framework 4.6 SDK
• Windows Accessibility Tools
• Ссылки на примеры кода и документацию

За многие годы относительно простые утилиты для компиляции и сборки приложений превратились в удобную среду Visual Studio для эффективного написания приложений, работы с кодом, отладки, обеспечения командной работы – еще одна огромная новинка по сравнению с тем, как программы создавали тридцать лет назад.



Дискеты во многом заменила доставка через интернет. Например, скачивая SDK отдельно от Visual Studio, вы сначала загрузите небольшой загрузчик, который весит как половина тех семи дискет, а потом вам предложат скачать еще около 700Мб установочных файлов. Эмулятор для Windows 10 Mobile – это еще 1.5Гб сверху.

По мере развития API вскорости стало очевидно, что всю документацию невозможно уместить в разумное количество бумажных томов. Было время, когда документация для Windows поставлялась на отдельном CD/DVD, однако, сейчас она доступна через интернет и, соответственно, сайт MSDN. Причем многие разделы документации переведены на широко распространенные языки, включая русский.

Примеры кода можно найти в MSDN Code Gallery или, как это принято в сообществе разработчиков сегодня, на GitHub. Интересный момент, который сегодня можно наблюдать во многих IT-сообществах, — это участие сообщества в формировании актуальных примеров и внесении правок и рекомендаций в документацию.

Интересно, мог ли кто-то предсказать подобные изменения тридцать лет назад?

Windows 10: Hello World


Я решил попробовать написать своего рода аналог “Hello World”-приложения под Windows 10, используя новую платформу UWP и язык JavaScript (как наиболее близкий мне). Вообще это такой интересный момент, что если 30 лет назад основным языком был чистый Си и почти все примеры были написаны на нем, то сегодня это не только С/С++, но также и такие «новые» языки, как C#, VB и JavaScript (и даже на ObjC можно писать для UWP!).

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



Стоит также отметить, что процедура сборки «описывается» в настройках самого проекта (своего рода замена make-файлам). И, в отличие от времен тридцатилетней давности, она стала существенно более комплексной. Если бы я писал код на С++ мне бы пришлось вместо безальтернативных 16bit выбирать сборку под x86, x64 или ARM, не говоря уже о множестве других параметров, которые обычно заботливо прячутся за банальным нажатием F5 или Shift+F5.

Ресурсний файл resources.resjson


В случае проекта на JavaScript ресурсные файлы (с автоматической поддержкой локализации!) представляют собой обычные JSON-файлы:

{
    "idsname"         : "Hello",
    "idsabout"        : "About...",
    "idstitle"        : "Hello Windows!",
    "aboutbox.text"   : "Microsoft Windows\nHello application\nVersion 10.03\nCopyright @2015, Microsoft Corp.",
    "aboutbox.button" : "Ok!"
}

Тридцать лет назад не было ни JavaScript, ни XML, ни JSON.

Файл разметки страницы default.html


Хотя приложение можно «собрать» из кода, значительную часть интерфейса теперь можно описать более простым и наглядным декларативным способом. Причем тут же можно подключить связывание данных, в том числе с ресурсами:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>HelloWorld</title>

    <!-- WinJS references -->
    <link href="WinJS/css/ui-dark.css" rel="stylesheet" />
    <script src="WinJS/js/base.js"></script>
    <script src="WinJS/js/ui.js"></script>

    <!-- HelloWorld references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body class="win-type-body">
    <nav>
        <a href="#" id="aboutMenu" data-win-res="{textContent: 'idsabout'}"></a>
    </nav>
    <p data-win-res="{textContent: 'idsname'}"></p>
</body>
</html>

(Автоматическое) связывание данных – огромная плюшка современной разработки.

Файл с логикой приложения default.js


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

(function () {
	"use strict";

	var app = WinJS.Application;
	var activation = Windows.ApplicationModel.Activation;
	var appView = Windows.UI.ViewManagement.ApplicationView.getForCurrentView();

    // Called on app activation
	app.onactivated = function (args) {
        // Initiate resources and UI -- all joined into a chain of promises
	    var promise = new WinJS.Promise.join([
            WinJS.Resources.processAll(),
	        WinJS.UI.processAll()
        // Add basic logic
	    ]).then(function () {
            // Update window title
	        appView.title = WinJS.Resources.getString('idstitle').value;

            // Add click listener for menu "about" item
	        document.getElementById("aboutMenu").addEventListener("click", (e) => showAboutDialog());
	    });

	    args.setPromise(promise);
	};

    // Show"About" MessageDialog
	function showAboutDialog() {
	    var messageDialog = new Windows.UI.Popups.MessageDialog(
            WinJS.Resources.getString('aboutbox.text').value,
            WinJS.Resources.getString('idsabout').value);

        // Dummy event handler for commands in dialog box
	    var aboutHandler = (command) => { return true; };

	    messageDialog.commands.append(
            new Windows.UI.Popups.UICommand(WinJS.Resources.getString('aboutbox.button').value, aboutHandler));

	    messageDialog.showAsync();
	}

	app.start();
})();

Код приложения стал раза в четыре короче (я тоже добавил немного комментариев и пустых строк), но самое главное преимущество развития технологий – это сильно возросшая выразительность API. Фактически, многие вещи, которые раньше надо было делать «ручками» сегодня прячутся за удобные вызовы системных или библиотечных функций.

Синтаксический сахар вроде стрелочных функций и возможности использовать promise сильно облегчают написание кода и его читаемость. К слову, существенное изменение – это переход к асинхронной модели кода, отсюда промисы и async.



Конечно, мое «обновление 30 лет спустя» не является дословным, но, думаю, общая динамика изменений в подходах создания приложений вполне прослеживаема. Сегодня это выглядит как совершенно новый API, хотя то и дело, все-таки проскакивают уши старого лампового Win32 или даже того самого Windows.h.

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


  1. d_olex
    21.10.2015 16:27
    +52

    Вероятно, для JS-хипстеров это будет шоком, но если взять самую последнюю версию Visual Studio и выполнить в ней File -> New -> Project -> Win32 Project то вашему взору предстанет новый проект на С исходный код которого почти один в один похож на тот самый HELLO.C из 85-го года.
    Алсо, не напомните, UWP это какая по счету технология разработки GUI приложений от MS которая будет признана устаревшей и не рекомендованной к использованию через пару-тройку лет?


    1. DaylightIsBurning
      21.10.2015 16:33
      +4

      Почему разработчики вообще используют UWP? Каковы мотивы? Почему не используют, например, Qt?


      1. ad1Dima
        21.10.2015 16:58
        +1

        UWP распростроняются через стор.

        В Qt есть поддержка WinRT, конечно, но не совсем ясно ее качество.


        1. DaylightIsBurning
          21.10.2015 17:06
          +4

          We now offer full support for Windows Store Apps allowing you to reach Windows Phone 8.1 and Windows RT tablet users.
          www.qt.io/qt5-4


          1. ad1Dima
            21.10.2015 17:11
            +2

            В Qt есть поддержка WinRT, конечно, но не совсем ясно ее качество


            И в общем-то, в таком случае Qt-приложения тоже будут WinRT/UWP приложениями


            1. DaylightIsBurning
              21.10.2015 17:17
              +4

              При этом с точки зрения разработки, это будут Qt-приложения и разработчик о UWP может вообще не знать. А если UWP умрёт — приложению это ничем не грозит.


              1. ad1Dima
                21.10.2015 17:44
                +4

                Qt-приложения и разработчик о UWP может вообще не знать

                В если писать на C++ то можно ничего не знать ни про винду ни про линукс, ни про любую другую платформу, ага. Нет, если писать HelloWorld, то так оно, вероятно, и есть.

                UWP это не Xaml и не объектная модель GUI это вполне себе среда исполнения: AppContainer, Системное API и так далее.


                1. DaylightIsBurning
                  21.10.2015 17:53
                  +4

                  Вы правы, но всё же суть моего сообщения была не в этом, а в том, что Qt-приложение позволяет не отвлекаться на очередные заморочки Microsoft. Вопрос был в том, почему люди выбирают UWP как инструмент разработки и фреймворк, а не как платформу/ОС? По поводу OS/API всё ясно — выбора нет, как и в случае с другими ОС, но выбор среди фреймворков то есть вроде.


                  1. ad1Dima
                    21.10.2015 19:28
                    +3

                    Qt-приложение позволяет не отвлекаться на очередные заморочки Microsoft.
                    А отвлекаться на очередные заморочки Qt. Заморочки есть везде.
                    Вопрос был в том, почему люди выбирают UWP как инструмент разработки и фреймворк,

                    UWP — это именно платформа, на ней работает С++/CX, WinJS (HTML5+JS), на нем работает .NET.
                    Если вы имеете ввиду последний, и его графическую реализацию, то ей не 3 месяца, а уже 10 лет. Если разработчит 10 лет назад изучил WPF или, тем более SL, то принципиально для него мало что поменялось: те же контролы, тот же жизненный цикл UI.

                    Все хорошо для своих задач: Qt — для кросплатформенной десктопной разработки. Иногда чуть-чуть для мобильной, но тот же 2Гис вкладываясь в разработку мобильного Qt интерфейсы пишет нативно.


    1. ad1Dima
      21.10.2015 16:49
      +3

      UWP это какая по счету технология разработки GUI

      Это всего лишь еще одна вариация WPF. РЕально являющаяся эволюционным развитием WinRT, котроый был эволюционным развитием SL.

      А так, ну WinForms все еще есть.


  1. Stepanow
    21.10.2015 16:42

    Назад в будущее, или Hello World сегодня и тридцать лет назад
    30 лет назад фразу «Hello, world!» писали без ошибок.

    Реквестирую аналогичные Hello, world! под другие платформы в комментариях.


    1. REU
      21.10.2015 17:02
      +16

      Практически для всех платформ.

      #include <stdio.h>
      
      int main() {
      	printf("Hello, world!\n");
      	return 0;
      }
      


      1. iandarken
        21.10.2015 17:58
        +11

        Практически для всех платформ

        program hello;
        
        begin
          writeln('Hello, World!');
        end.  
        


        1. VasilioRuzanni
          21.10.2015 21:50
          +5

          Практически для всех платформ :)

          package main
          
          import "fmt"
          
          func main() {
          	fmt.Println("Hello, World!")
          }


          1. Yuuri
            21.10.2015 22:53
            +3

            ПДВП :)

            main = putStrLn "Hello, world!"
            


            1. Allfar
              22.10.2015 10:30
              +1

              ПДВП :)

              print "Hello, world!"


              1. winger
                22.10.2015 11:32
                +2

                ПДВП :)
                ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.


                1. Muxto
                  22.10.2015 12:11
                  +2

                  Поставлю жирную точку. Даже две. Да, я подлец.
                  ru.wikipedia.org/wiki/Hello,_world!
                  lurkmore.to/Копипаста:Hello,_world!


                  1. Mithgol
                    22.10.2015 14:01
                    -2

                    Практически для всех платформ.

                    https://github.com/Mithgol/Hello-Habrahabr


        1. iandarken
          21.10.2015 22:25
          +4

          Цель коммента — не разжечь срач, а понять один момент.
          Вот у коммента на данный момент три минуса — это какая-то особая ненависть к fpc/Delphi среди сишников или явологов, или это просто модно — пытаться пнуть паскаль в каждом подвернувшемся случае?
          Вангую еще «щютку» в ответе — «А чего пинать труп» и прочее.


          1. Wedmer
            22.10.2015 01:09

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


            1. iandarken
              22.10.2015 11:46
              +1

              Ну так не все платформы подразумевают наличие GUI. Я слышал есть ещё какие-то «маршрутизаторы» на всяких ARM, MIPS с разными *NIX внутри, но без возможности ткнуть мышкой в «About...»


              1. REU
                22.10.2015 14:31

                Вот на них вряд ли будет fpc.


                1. iandarken
                  22.10.2015 14:37

                  На них и gcc, как правило, нет. И если уж ставить — то абсолютно без разницы, что именно при прочих равных.
                  Хотя да, если верить http://wiki.freepascal.org/Platform_list — MIPS пока fpc поддерживается костыльно.


                  1. REU
                    22.10.2015 14:46

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


                    1. iandarken
                      22.10.2015 15:24
                      +3

                      http://wiki.lazarus.freepascal.org/Cross_compiling с вами не согласен )
                      И fpc и Delphi хоть и проваливают все гонки за лидером, все же развиваются. И инерционные «зато в вашем паскале нет...» очень часто оказываются не «в вашем паскале нет», а «я думал, что в вашем паскале нет, а оказывается..»

                      Я не планирую его пропагандировать, для меня, в общем, нет разницы, C или fpc, мне паскаль нравится просто потому что нравится. Безотносительно реализованных или нереализованных фич и популярности. И обидно, когда его пинают ногами просто «потому что тут так принято»


      1. rusec
        21.10.2015 19:23
        +5

        Это другая программа. Во-первых, консольная. Во-вторых, без ветки --about.
        Незачёт.


  1. Error1024
    21.10.2015 18:31
    +16

    Вообще круто то, что Hello Word 30-ти летней давности можно спокойно и почти без изменений на современной Windows скомпилировать, современным компилятором, и запустить.
    Таким мало что может похвастаться.


    1. defuz
      22.10.2015 00:10
      -4

      Не уверен, что конкретно в случае с Windows это повод для гордости.


  1. michael_vostrikov
    21.10.2015 20:15
    +7

    Извиняюсь за нубский вопрос, а то, что в default.js — оно потом компилируется в машинный код или выполняется в каком-то интерпретаторе?


    1. Finesse
      22.10.2015 06:42

      Присоединяюсь к вопросу. Аналогичный вопрос про HTML и CSS. Если оно интерпретируется, а не компилируется, то это очень плохо.


    1. Dima_Sharihin
      22.10.2015 08:18

      Скорее всего JIT-ится js-движком Internet Explorer/Edge


    1. kichik
      22.10.2015 09:04
      +1

      Оно выполняется движком Chakra из Edge. Современные браузеры давно пытаются максимум кода не интерпретировать, а перекомпилировать в наиболее близкое к машинному состояние.


      1. michael_vostrikov
        22.10.2015 18:08
        +1

        Я в общем-то так и подумал. Просто, на мой взгляд со стороны, мне не очень понятно, чем такое «программирование под Windows» отличается от программирования под любую другую ОС, для которой есть браузер.


        1. kichik
          22.10.2015 18:17
          +1

          Браузера или веб-вью не достаточно. В данном случае, и с точки зрения разработчика, весь WinRT API через метаданные напрямую доступен из кода на JS без дополнительных обязок. Поэтому, если бы я писал на XAML/C#, то все вызовы API выглядели точно также.


  1. QtRoS
    21.10.2015 21:46
    +6

    … а что-то вечно:

    #include «windows.h»


    1. stychos
      22.10.2015 04:21

      А вот не зарекайтесь… www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4047.pdf


  1. Sixshaman
    21.10.2015 21:56
    +3

    Эх, всё-таки большинству современных SDK(любых, а не только виндовых) не хватает чего-то такого, что есть в старом Windows.h. Их код выглядит как-то слишком прилизанно без венгерской нотации, названий типов вроде PWNDCLASS или LPPAINTSTRUCT, без слегка долбанутой архитектуры. Недостаёт там этой манящей и слегка сумасшедшей брутальности.


    1. tyomitch
      22.10.2015 02:05

      Всё меняется.
      Тридцать лет назад программирование для ПК было уделом фриков-энтузиастов, а теперь это серьёзный бизнес, пронизанный политкорректностью.


  1. SkidanovAlex
    21.10.2015 22:02
    +6

    но самое главное… – это сильно возросшая выразительность API.
    возможности использовать promise сильно облегчают написание кода и его читаемость


    	    var promise = new WinJS.Promise.join([
                WinJS.Resources.processAll(),
    	        WinJS.UI.processAll()
            // Add basic logic
    	    ]).then(function () {
                // Update window title
    


    Да тут читаемость вообще зашкаливает.

    Я в 1997 году в Delphi бы форму с кнопкой About которая вызывает диалоговое окно сделал бы в общей сложности написав одну строку «Form2.ShowModal()».

    Еще одна вещь, которая в 1997 году была лучше чем сегодня в универсальных приложениях Windows 10 и чем 30 лет назад в Windows 1 — окна могли друг друга перекрывать.


    1. QtRoS
      22.10.2015 10:41
      +1

      Думается, поэтому делфи так и взлетел, особенно в среде бизнес-приложений а-ля:

      Классика
      image


    1. ad1Dima
      22.10.2015 14:30

      Еще одна вещь, которая в 1997 году была лучше чем сегодня в универсальных приложениях Windows 10 и чем 30 лет назад в Windows 1 — окна могли друг друга перекрывать.

      В windows 10 окна могут друг друга перекрывать. Попробуйте.


      1. SkidanovAlex
        22.10.2015 22:54

        Всмысле сделали, что метро-приложения теперь в окнах могут быть? Это круто. То есть вернули и кнопку Пуск, и что все в окнах можно запускать, так это же почти так же круто как Windows 7.

        Вообще мне нравится Cortana и Notification Panel. Наконец-то мой компьютер догнал по функциональности мой телефон.


        1. ad1Dima
          23.10.2015 09:33

          То есть вы признаете, что осуждали, не читая?

          10ка не считая некоторых проблем с дровами (как всегда) — прекрасная система. С летним выпуском они, конечно, несколько поторопились, но Осенний апдейт должен поправить практически все косяки (сейчас сижу на Insider Preview).


          1. Wedmer
            23.10.2015 16:03

            Надеюсь он решит мою проблему, а то после установки обновлений и перезагрузки мне приходится плясать с бубном, чтобы появился Logon Screen. также не могу пользоваться встроенной почтой, тк не может запустится служба учетных записей. Причем проблема только на ноутбуке, стационарник такого не показывает. Правда разница в том, что ноут обновлялся с семерки, а стационарник с 8.1.


            1. ad1Dima
              23.10.2015 16:47

              Не факт, что поможет. Попробуйте на чистую переустановить 10 (в настройках есть сброс). После этого многое может починиться. Но при этом могут отвалиться какие-нибудь специяические дрова.


              1. Wedmer
                23.10.2015 16:54

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


  1. NeoNN
    21.10.2015 22:54
    +1

    JS для приложений сам Майкрософт (который написал пост, класс!) уже готов слить как неудачный эксперимент, и вернуть XAML как основное средство разработки. Собственно, это уже практически и произошло. Зачем писать тут пример программы на JS — загадка. Шумиха трехлетней давности, что скоро все будет на джаваскрипте сама собой умерла. И хорошо. Интересно об этом говорит Билли Холлис в одной из недавних передач на .netrocks


    1. ad1Dima
      22.10.2015 14:32

      В 10ке есть очень интересная возможность упаковки сайта в appx, после чего тот получает доступ ко всему API и может распространяться через стор. Так что не все потеряно для JS.

      ЗЫ, сам я пишу на .NET


    1. Simplevolk
      22.10.2015 21:26

      А у меня, наоборот, подозрения: Майки тащат в студию Node.js,Cordova,Win10App+Js…

      Как бы одним прекрасным днем они не закопали бы XAML… вместе с .Net впридачу… Ведь облакам все равно, какой код выполнять-главное, чтобы это было «правильное» облако.


      1. ad1Dima
        23.10.2015 09:37

        А еще они тащат в студию Xamarin, Obj-C и кросс-платформенный C++. Просто они хотят как можно больше разработчиков привлечь к своей платформе. Ведь чем больше разрабов пользуется студией — тем больше пользуется виндой. А если разрабы пользуются виндой, то они будут писать под нее приложения, хотя бы для себя.

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


  1. stychos
    22.10.2015 04:31

    Я только пару раз в жизни писал приложение на чистом WinAPI, но каждый раз с места в карьер — знаний о С/С++ ноль, а надо написать, например, файловый дедубликатор. До сих пор иногда вспоминаю эту пару бессонных ночей с «рисованием» формочек с ностальгией. Ещё помню, какой болью оказалось переделывать ras.h (там не было #ifdef!) под паскаль, даже взгрустнулось немного… Жаль, кривая увела в php =(


    1. disinvis
      22.10.2015 08:55

      О да! Похожие воспоминания про WinAPI :) От того первый пример, как родной.


  1. grishkaa
    22.10.2015 05:01
    +1

    Охлол, да WinAPI с тех пор не сильно изменился-то :)
    Выходит, что универсальный hello world для всех существующих на этой планете винд — это вот так:

    #include <windows.h>
    
    int main(){
        MessageBox(NULL, "Hello World!", NULL, MB_OK);
        return 0;
    }
    


    1. Wedmer
      22.10.2015 05:21

      Где элемент меню «About...»?


      1. grishkaa
        22.10.2015 05:26
        +3

        int result=MessageBox(NULL, "Hello World!\n\nBy the way, we've also got an about box! Would you like to see it?", MB_YESNO);
        if(result==IDYES){
            // показать окно about таким же способом
        }
        


  1. disinvis
    22.10.2015 08:39

    Не знаю, за современными технологиями не слежу почти, но мне первый пример был куда более понятным, студенчество вспомнил. А на «static HANDLE hInst;» чуть не всплакнул от умиления и ностальгии.


  1. user452
    22.10.2015 09:55
    +2

    У меня нет фото Microsoft 30-летней давности, но есть свежее фото Редмондовского кампуса, вернее, Commons, немножко снаружи и внутри:
    1.image
    Это водоём возле здания Commons — чуть более, чем полностью состоящего из маленьких кафешек.
    Кстати, по краям водоёма установлены таблички, которые намекают, что в воду и не лезть, и не пить, дескать, химикатами очищена.

    2.image
    Одна из тех самых кафешек.

    3.image
    Фото от 16 октября сего года.