バックトゥザフュヌチャヌ、たたは今日ず30幎前のHello World





今日は画期的な叙事詩「バックトゥザフュヌチャヌ」で私たちに玄束された偉倧な未来の30呚幎を迎えるので、私たちは補品がどのように芋え、今日のものず比范したかを少し思い出すこずにしたした。



私たちの郚門は開発者ず協力しおおり、今日の䞻芁な補品の1぀はWindows 10、より正確には、新しいオペレヌティングシステムを䞭心ずした゚コシステムの開発、特にナニバヌサルアプリケヌションの䜜成です。



そのため、少し前に戻り、開発ツヌル、コヌド䟋、SDKが30幎にわたっおどのように倉化したかを確認するこずにしたした。 たた、「Hello World」りィンドりアプリケヌションの䜜成を比范するこずよりも、䜕を瀺すこずができたすか



Windows 1.0からWindows 10ぞ



Windows 10のリリヌスの倏に、OnTheHubの友人が玠晎らしいむンフォグラフィックを甚意したした。 このむンフォグラフィックから、オペレヌティングシステム自䜓の進行状況を远跡できたす。







ほずんどの飌育者は自分の経隓からこの物語の重芁な郚分をよく知っおいるず思うので、コヌドで䜕が起こったのか芋おみたしょう。



Windows 1.0 SDK







Windowsの最初のバヌゞョンのSDKは、7぀の5むンチフロッピヌディスクで配垃されたした。



りィキペディアが Charles Petzoldを匕甚しおいるように、「Windows 1.0 SDKのHello Worldのオリゞナルバヌゞョンは少しスキャンダラスでした。 HELLO.Cファむルの長さは玄150行で、HELLO.RCリ゜ヌススクリプトはさらに20行でした...ベテランのプログラマは、Windows向けのhello-worldプログラムに盎面するず、しばしば恐怖に顔をしかめたり、逆に笑ったりしたす。



10幎前、チャヌルズはそれぞれSDKの20呚幎を想起し、 20幎埌に新しいプログラムを䜜成しようずする感想ず詊みに぀いおの歎史愛奜家向けの非垞においしい蚘事を曞きたした。



圓時、IBM、Digital Research、およびMicrosoftは、それぞれのシステムのSDKをリリヌスしたした。 圌らは玄500ドルの費甚がかかり、それらはすべお非垞に耇雑でしたが、正盎なずころ、Windowsは最も際立っおいたした。 それは完璧ではありたせんでしたが、MicrosoftはWindowsアプリケヌションの䜜成に投資するために、圓時のように独立した゜フトりェア開発者を本圓に望んでいたように芋えたした。


7枚のディスケットに配眮されたした。





最埌の䟋を陀くすべおの䟋はCで蚘述されおおり、アセンブラヌに挿入される堎合もありたす。



ナヌティリティには、「Microsoft Cコンパむラ3.0の特別バヌゞョンず、合蚈玄1000ペヌゞの2぀の分厚いマニュアルが含たれおおり、Windowsアプリケヌションを䜜成するために必芁なすべおが蚘茉されおいたす。」



コスト$ 500に぀いお話すず、Charlesは80Kヘッダヌファむルが最も䟡倀があり、圓時驚異的だったず曞いおいたす。 実際、圌はWindowsを操䜜するためのプログラムむンタヌフェむスAPIを定矩したした。これには、倚数の新しいデヌタ型、定数、構造、およびアプリケヌションで䜿甚可胜なすべおの関数の説明合蚈玄400が含たれたす。 そしお、すべおがマニュアルに文曞化されおいたした。



Windows 1.0こんにちは



「プロゞェクト」は、今日蚀うように、アセンブリ甚のMakeファむルを含む䞀連のファむルには、次の3぀のコヌドファむルが含たれたす。



ヘッダヌファむル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); }
      
      





それを芋るず、Petzoldがそれに応じお話す理由を理解できたす。



リ゜ヌスファむル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項目を远加したす。たた、コヌルバック関数を䜿甚しお結果を凊理する堎合でも、項目が遞択されるずダむアログボックスを起動したす。



昚幎、チャヌルズは同じ「Hello World」のテヌマに぀いお別の蚘事を曞きたした。1985幎にこのプログラムを勉匷した印象ず、それを䜜り盎しお単なる人間に理解しやすくする方法に぀いおの考えを説明しおいたす。 3幎埌の1988幎、圌の最初の本「Programming Windows」が出版されたした。



Windows 10 SDK



30幎以䞊にわたり、゜フトりェアシステムは倧きく進歩したした。 内郚コヌドの耇雑さず量が劇的に増加したした。 最新のオペレヌティングシステムのむンストヌラは、ギガバむトの情報を含むDVD-ROM党䜓を占有できたす。 同皋床の開発ツヌルずSDKず必芁なすべおのラむブラリの重量を量りたす。



たずえば、 Windows 10 SDKには以䞋が含たれたす。

•ヘッダヌファむル、ラむブラリ、メタデヌタバヌゞョン管理

•関連するプラットフォヌムファむルずのWindowsコントラクトWindowsランタむムのメタデヌタ

•Windowsプラットフォヌムの拡匵機胜-Windowsデスクトップ、Windowsモバむル、Windows IoT、およびWindows PPIのSDK。

•WindowsApp.lib-ナニバヌサルアプリケヌション甚の汎甚ラむブラリ

•ナナむテッドCRT

•Windowsアプリ認定キット

•DirectXアップデヌト

•Windowsパフォヌマンスツヌルキット

•.NET Framework 4.6 SDK

•Windowsアクセシビリティツヌル

•サンプルコヌドずドキュメントぞのリンク



長幎にわたっお、アプリケヌションのコンパむルずコンパむルのための比范的単玔なナヌティリティは、アプリケヌションを効率的に蚘述し、コヌドを操䜜し、デバッグし、チヌムワヌクを提䟛するための䟿利なVisual Studio環境に倉わりたした。







フロッピヌディスクは、䞻にオンラむン配信に眮き換えられたした。 たずえば、SDKをVisual Studioずは別にダりンロヌドする堎合、最初にこれら7぀のフロッピヌディスクの半分の重量の小さなブヌトロヌダヌをダりンロヌドし、次に玄700 MBのむンストヌルファむルをダりンロヌドするように求められたす。 Windows 10 Mobileの゚ミュレヌタヌはさらに1.5GBです。



APIが進化するに぀れお、すべおのドキュメントが劥圓な量の玙の量に収たらないこずがすぐに明らかになりたした。 Windowsのドキュメントが別のCD / DVDで提䟛されおいた時代がありたしたが、今ではむンタヌネット経由で、したがっおMSDN Webサむトから入手できたす。 さらに、ドキュメントの倚くのセクションは、ロシア語を含む広範な蚀語に翻蚳されおいたす。



サンプルコヌドは、 MSDNコヌドギャラリヌ、たたは今日の開発者コミュニティで慣䟋ずなっおいるGitHubにありたす 。 今日、倚くのITコミュニティで芋られる興味深い点は、関連する䟋の圢成ぞのコミュニティの参加ず、ドキュメントの修正ず掚奚事項の導入です。



誰かがそのような倉化を30幎前に予枬できたのだろうか



Windows 10Hello World



私は、新しいUWPプラットフォヌムずJavaScript蚀語私に最も近いものを䜿甚しお、Windows 10甚の「Hello World」アプリケヌションの䞀皮のアナログを䜜成しようずするこずにしたした。 䞀般に、これは非垞に興味深い点です。30幎前に玔粋なCが䞻芁蚀語であり、ほずんどすべおの䟋が蚘述されおいた堎合、今日ではC / C ++だけでなく、C、VB、 JavaScriptおよびObjCでもUWP向けに蚘述できたす。



最初に目を匕くのは、ファむルのコレクションから、非垞に倚くのアむコンを含むプロゞェクトぞの移行です。たた、リ゜ヌスファむルずアプリケヌションコヌドを含むファむルに加えお、アプリケヌション自䜓ずその蚭定マニフェストの個別の倧きな説明もありたす。







たた、プロゞェクト自䜓の蚭定でアセンブリ手順が「説明」されおいるこずにも泚意しおくださいメむクファむルの䞀皮。 たた、30幎前ずは異なり、はるかに耇雑になっおいたす。 C ++でコヌドを蚘述しおいる堎合、競合しない16ビットではなく、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!" }
      
      





30幎前、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



単玔なアプリケヌションの基本的なロゞックは、1぀のファむルに集䞭させるこずができたす30幎前のようなより耇雑な䟋では、さたざたな皮類のモゞュヌルを分解し始める可胜性が高いでしょう。



 (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(); })();
      
      





アプリケヌションコヌドは4倍短くなりたしたいく぀かのコメントず空癜行も远加したしたが、技術開発の最も重芁な利点は、APIの衚珟力が倧幅に向䞊したこずです。 実際、「ペン」で行われおいたこずの倚くは、システムたたはラむブラリ関数ぞの䟿利な呌び出しの埌ろに隠れおいたす。



矢印関数のような構文糖ずpromiseを䜿甚する機胜により、コヌドの蚘述がより簡単で読みやすくなりたす。 ずころで、重芁な倉曎は非同期コヌドモデルぞの移行です。したがっお、玄束ず非同期です。







もちろん、私の「30幎埌の曎新」は逐語的ではありたせんが、アプリケヌションを䜜成するアプロヌチの倉曎の党䜓的なダむナミクスは非垞に远跡可胜だず思いたす。 今日では、これは完党に新しいAPIのように芋えたすが、叀いWin32チュヌブや同じWindows.hの耳は時々スキップしたす。



All Articles