歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 我對“Hello World”30年的愛恨情仇

我對“Hello World”30年的愛恨情仇

日期:2017/3/1 9:17:04   编辑:Linux編程

  我最近在 7 月 4 日的那一周休了一個假,因此有時間來回顧我的職業生涯。令我震驚的是,我已經寫了近 30 年的代碼了!於是,我決定好好利用這段額外的休息時間來創作一篇懷舊的帖子,回顧在過去近 30 年時間中我工作過的編程語言。向我從“Hello, World”開始學習新語言的 30 年致敬。

  我學習的第一種編程語言是 TI BASIC,BASIC 專門為微軟 TI 99 / 4A microcomputer 而編寫的一種語言。BASIC,即 Beginner’s All-purpose Symbolic Instruction Code(初學者通用符號指令代碼),是一個 7 歲的、被約束在家裡、沒有游戲玩的孩子學習的完美語言。該語言用行號組織代碼行,並且像這樣在屏幕上展示內容:

  1981 年 – TI BASIC

  我花了幾個月的時間使用 TI BASIC 編寫了“choose your own adventure”游戲,並且其中更多的時間是花在聽黑色的盒式磁帶記錄器存儲和恢復數據時發出的汽笛聲,爆裂聲,還有嘶嘶聲。也許我年輕的生命中最令人激動和關鍵的時刻就是,幾年後我的父母帶回家一台 Commodore 64。這台機器提供開箱即用的 Commodore BASIC,或 PET BASIC。這也是微軟基於 6502 Microsoft BASIC 而編寫的,而 6502 Microsoft BASIC 專門為那個芯片系列而寫,恰巧那時此芯片系列也同樣可以服務 Apple 機器。

  1984 年 – Commodore BASIC

  問號是 PRINT 命令的簡寫,而之後奇怪的字符是輸入 RUN 命令的省略方式(R SHIFT + U ——在 Commodore 64 鍵盤上提供出色的小的圖形片段,你可以用它來制作基本的圖片)。

  我很快發現,BASIC 不會做所有我想要它做的事情。 “demo scene”在那時一枝獨秀,並且一群志同道合的人正在制作令人驚歎、將挑釁機器極限的程序。它們會做一些類似誘使 video chip 去繪制圖形,去繪制那些原本應該是不可能的或滾動內容的或甚至是移動數據到屏幕“超出范圍”邊界部分的圖形。實現這些特技需要精確的定時,而定時只能通過直接的機器語言代碼才能實現。所以,我啟動了機器監視器(允許你直接輸入機器代碼到內存的軟件名稱),並寫了這個小程序:

  1985 年 – 6502 Machine Code

  這個小 app 通過一個索引加載“Y-累加器”,然後通過始於$ C100 的內存旋轉,一次發送一個字符到 ROM 子程序,ROM 子程序會將它們打印到顯示器。這等同於機器代碼中的一個 for 循環(for y = 0; y <= 0x0d, y++)。該 RTS 從子程序返回。為了執行程序,你必須使用內置的 SYS 命令,調出內存地址(不幸的是,你必須將十六進制值$ C000 轉換為十進制 49152,但除此之外,這樣的工作很有魅力)。我有用於“HELLO,WORLD”的 PETSCII 字符,保存在內存地址$ C100(是的,Commodore 64 有它自己特殊字符頁)。

  下面是結果:

  當然,生活中的話,當我從原始機器代碼轉移到程序集更容易。有了程序集,我可以預先計劃好我的軟件,並使用標簽來標記存儲區域,而無需記住內存地址。上面顯示的相同程序可以這樣寫:

  1986 年 – 6502 Assembly

* = $C000;
set the initial memory addressCHROUT = $FFD2  ;
set the address for the character out subroutine         
  LDY #$00 LOOP     
  LDA HELLO, Y          
  CMP #$00         
  BEQ END          
  JSR CHROUT          
  INY          
  BNE LOOP END      
  RTSHELLO    
  ASC 'HELLO, WORLD.' ;
PETSCIIHELLOEND DFB 0 ; 
zero byte to mark the end of the string
  大約在那個時候我才意識到我真的很喜歡編寫軟件。我在高中學了一些課程,但所有他們教的是愚蠢的小 Pascal 語言,一種旨在使學習如何編程更“容易”的語言。真的?更容易嗎?在使用機器監視器手工編碼復雜程序之後,Pascal 感覺非常的矯枉過正。當然我不得不承認“Hello, World”的語法真的特別直接。

  1989 年 - Pascal

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

  我認為那時時尚的年輕人使用C語言工作。這是一種相當靈活的語言,感覺比程序集更像是一組功能性宏。我作為兼職自學了C,但只用了一小段時間。

  1990 年 – C

#include <stdio.h>
main (){  
  printf ("Hello World");
}

  這個小程序,包括處理標准輸入/輸出,然後以它自己的方式發送文本的一個庫。庫是C語言如何允許我們開發跨平台——函數調用也是同一回事,無論你是在 Windows 還是 Linux 環境中,但庫本身實現所有低級別的使其在目標機器上工作所需的例行程序。上面的代碼是我幾年後在我的 Linux 機器上鼓搗的。很難形容如果你在那個時間還沒有投入計算機是什麼樣子,但感覺你並非一個真正的程序員,除非你構建你自己定制的 Linux 安裝。我所說的通過“構建你自己”,字面上的意思是粗粗處理源之後,定制它以匹配特定的你所擁有的硬件。最有趣的是處理視頻卡,和了解“dot clocks”以及所有讓主板與圖形芯片友好結合的細微差別。好吧,我有點離題了。

  C 語言真不是我學習的一個挑戰,但我很快發現時尚的年輕人正在做一些與眾不同的東西,並遵循這種被稱為“面向對象編程”的范式。機器代碼和程序集與 OO 大不相同,因此,從程序性到面向對象的轉變是我准備好要應對的挑戰。那時的你還不能便捷地從網上搜索內容(當然也是可以的,但它使用不同的機制),所以我到外面去給自己買了一摞 C ++ 的書。事實證明,C ++ 支持“對象”這個想法。它甚至用對象來表示流和管道以操作對象。這個面向對象的玩意還推出了命名空間的概念,以便於更好地管理代碼分區。總而言之,“Hello,World”變成了:

  1992 年 – C ++

#include <iostream>using namespace std;
int main (){
  cout << "Hello World";  
  return 0;
}

  我上了大學,但令我失望的是,大學竟然不教我感興趣的“現代”語言課程,例如C和 C ++。相反,我不得不蒙混過關一門家庭作業是在我們稱之為“Cypher”的主機上執行的課程,使用一種有趣的編程語言,叫 Fortran,這語言實質上關注你把代碼放到了哪個縱列!這是對的,當時這個語言指定縱列 1 用於注釋,縱列 1 – 5 用於聲明標簽,縱列 6 用來標記延續,僅在縱列 7 你才可以開始編寫實際的代碼。總之,學得越多,我越下定決心以後再也不要使用它。

  1993 年 – Fortran

PROGRAM HELLOWORLD       
       PRINT *, 'Hello, World!'       
       END

  因為我並沒有投入太多熱情到主課程,所以我大多數晚上都在計算機實驗室中,登陸到學校擁有的大量 Unix 機器上。就是在那裡,我發現了 Internet,並學到了關於安裝軟件的“老派”方式:拉下源代碼,構建,檢查錯誤,調整,修復,並獲得一個可工作的客戶端。老實說,我不知道你在沒有學習基於運行回去方式編程的情況下是如何使用 Unix 的,我只能不斷地用我的方式圍繞系統編輯修改、探索和學習。我經常要做的一件事是執行命令,那將導出大量的信息,然後你不得不使用“方便的”命令行工具來解析這些信息。在那段時間我學習的一種最酷的語言之一是 PERL。用這樣一個簡單的例子,我就可以說明它並沒有得到應有的公正,請看:

  1993 年 – PERL

$welcome = "Hello World";
print "$welcome\n";

  同時,我很快發現了大量的 World Wide Web(是的,這就是我們當時對它的稱呼……Internet 運行所有那些有趣的程序,例如 Gopher 和 Archie,而 World Wide Web 只是上面的一系列文檔)。HTML 對於我而言是另一個飛躍,因為這是我第一次親密接觸創建聲明式 UI。不同於加載變量或常量,以及調用某些關鍵字或子程序,照字面意思我就可以在頁面上組織內容。你會驚訝於 20 年後,HTML 頁面的基本語法真的完全沒有改變。

  1993 年 – HTML

<html>
  <head>
    <title>Hello, World</title>
  </head>
  <body>
    <h1>Hello, World</h1>
  </body>
</html>

  這對我來說是一個有趣的時刻。我從個人計算機(TI-99/4A 和 Commodore 64 以及一段花在 Amiga 上的短暫時期)轉移到了大型計算機,突然我的 PC 於我而言成為了一個連接到 Unix 大型主機的終端。我也運行 Linux 操作系統在我的 PC 上,因為這是當時連接到 Internet 和網絡最快的方式——TCP / IP 協議棧被內置到操作系統,而不是像在舊的 Windows 版本中那樣放置在系統上面(還記得 NETCOM 嗎?)。我的大部分工作都是在大型計算機上完成的。

  我沒有意識到的是我正在失去與 PC 世界的聯系。這在當時非常明顯,個人計算機的瘋狂時代已經過去,塵埃落定於這兩種計算機:PC,運行 Windows,對於我們大多數人,以及 Mac,對於設計師。這就是我深信不疑的。當時我有一個室友,專注於 Mac,並且在那段時間設計了電子優惠券。他有所有這些漂亮的圖形設計程序,並常常問我,“你的 PC 上有什麼能做到這一點?”我會聳聳肩,提醒他我甚至不會畫圓和正方形,所以我了解圖形軟件干什麼呢?我喜歡我的 PC,因為我理解軟件理解數學,所以即使我不會繪畫,也可以使用數學來創建分形圖形或粒子風暴。當然,這樣做需要有一個顯卡,而且從 Telnet 會話到 Unix 框並不實用,所以我開始學習如何在 PC 上編碼。當時,只有 Win32 和 C ++ 才能實現這些伎倆。現在你仍然可以在 Visual Studio 2012 中創建用於堆棧的樣板文件。當然,我就不讓 Win32 跨越 150 行代碼的初始“HELLO.C”的細節來煩你了。

  1994 年 – Win32 / C ++(示例為近期的)

  用命令行執行的結果:

  然而,粒子流和 Mandelbrot 集對我就業並沒有產生任何幫助,因此我只能采取不同的辦法。諷刺的是,我一開始的職業和計算機沒有一點關系。是的,我的第一份正式工作是在一家保險公司接索賠電話,工作語言為西班牙語。在這個我願意熬夜工作於 PC,並且對低薪表示“滿足”的工作面試中,我不經意間提及我會講西班牙語。於是他們派了他們的雙語代表來面試我,我通過了測試,並在一周內獲得了一個更高薪水的職位,在一些簡短的電話中,我學到了比我多年在高中學到的更多的西班牙語。

  我年輕,有競爭力,並且我們基於一天成功解決多少索賠進行排名。但是我總是落後,因為我用的軟件往往隔一段時間就崩潰。這對我而言,是一個全新的系統——AS / 400(現在稱為 iSeries)——但我還是搞清楚了,並且學會了至少如何在崩潰之後重新啟動索賠軟件。IT 部門很快流行起來,並把我拉到一邊。我擔心我遇到了麻煩,但是他們給了我去 IT 部門的 offer。於是我的工作基本上變成了維護 AS / 400 系統,以及給大量打印機換墨盒,以便於打印保單表格和索賠。

  在我去操作換墨盒的過程中,我做了一個很大的改變。由於某些表格只要黑色墨水,而其他表格還需要綠色或紅色的亮點。但是這些打印機只能處理一種墨水輪廓,所以每當遇到不同類型的表格時,我們會得到一個警報,然後去換墨水。我覺得這這是荒謬的,所以我花時間來自學 RPG。我寫了一個程序,它將匹配打印作業到墨水顏色,然後排序打印隊列,以便於所有的黑色打印都能放到一起,所有的綠色都放到一起,等等,這將 8 小時的工作到縮減到 2 個小時,並給了我大量時間來學習 RPG。原始版本——RPG II 和 RPG III ——是一種粗糙的語言,被簡單地設計為模仿打卡系統,並生成報告(代表 Report Generator)。和 Fortran 一樣,RPG 是一種定位語言。

  1995 年 – RPG

I              
'HELLO, WORLD'        
C         
HELOC           
HELO      
DSPLYC                     
SETON                     
LR

  注意第一個字符顯示的行的不同類型(其實它原本會有若干列,但我有意省略了一些邊緣代碼)。這定義並顯示了一個常數,然後設置一個指示符結束程序。

  在這些操作之後,我又開啟了第二幕個人秀。月末的會計需要相當多的時間和精力。原來的系統是一台讀取穿孔卡片的 Honeywell 主機。寫了一個 COBOL 程序,能在模擬穿孔卡片的文件中讀取並輸出另一個之後注入 AS / 400 被處理的文件。在此之後,各種會計數據必須得匹配。由於捨入誤差,不支持的交易,以及任何其他許多數字幾乎從不匹配的問題,所以這工作就成為了調查進程,找出哪裡壞了,然後更新代碼來解決它。我們也曾“緊急”工作過 11 個小時,讀取輸出數據生成賬務調整,以平衡賬目,如果我們無法找到問題的話。雖然我沒有涉及很多 COBOL 代碼,但是我不得不去充分地了解它,以便於閱讀 Honeywell 源代碼來解決 AS / 400 上的問題。

  1995 年 – COBOL

IDENTIFICATION DIVISION.PROGRAM-ID. HELLO.ENVIRONMENT DIVISION.DATA DIVISION.WORKING-STORAGE SECTION.01 WELCOME-MESSAGE           PIC X (12) .PROCEDURE DIVISION.PROGRAM-BEGIN.    MOVE "Hello World" TO WELCOME-MESSAGE.    DISPLAY WELCOME-MESSAGE.PROGRAM-DONE.    STOP RUN.

  這只是一段很短的時間,之後頂級 RPG 大師來到我們公司給我們上了為期三天的課程,因為最酷的事情是發生在 AS / 400 世界中。不僅 AS / 400 機器轉移到 64-bit(眾所周知加倍的位數更好,對吧?),而且 RPG 語言正在越來越規整,版本 IV 將接受更多的程序並且幾乎比以往任何時候都要更面向對象。那有什麼酷的嗎?在給我們培訓的時候,我不由得大笑,因為所有老的 RPG 開發者對這種“新的編程風格”目瞪口呆抓耳撓腮,試圖蒙混過關,但我卻可以放心,因為最終可以回歸到我更習慣使用的C和 C ++ 程序,而不是 RPG 語言曾經那種緊密,狹隘,指示符和基於列的風格。

  一些開發人員可能會因為其中一個特征而三振出局,要知道這些特征真的可以打敗任何人。語言要求指示符從某一個列開始,並且輸入的指示符要先於它們。這是一個非常有限的空間,所以你可能真的只能加載幾個字符常量,否則,你就不得不指定它們作為常量或數據結構並讀取它們。新的語言移動關鍵字欄到了右側,這樣就有更多的空間來放置在“要素一”。這意味著我們現在只要短短的幾行代碼就可以做到“Hello, world”。語言也更“程序化”,所以你可以通過 return 結束一個程序,而不是設置指示符(盡管如果我沒有記錯的話,主程序的 return 其實只是設置在幕後的指示符)。

  1996 年 – RPG / ILE

C     'HELLO, WORLD' DSPLY C                    
  RETURN
  AS / 400 內置數據庫功能在操作系統內稱為 DB2。在很長的一段時間內,數據庫只支持通過 RPG 或其他軟件直接的指示符,不支持 SQL 語法。它作為一種特殊的程序包,名為 SQL / 400 而推出,但潛在的支持依然在那裡。我在 1998 年寫了第一篇出版(打印)的,關於竊聽 SQL 用於 AS / 400(Create an Interactive SQL Utility)的文章。大概有一百萬個方法可以用 SQL 輸出“Hello, World”,但也許最簡單的方法是這樣的:

  1998 年 – SQL

SELECT 'HELLO, WORLD' AS HELLO

  首先抱歉這裡我沒有按時間順利來寫,但 SQL 作為我“主要”或“有薪”工作的一部分,很重要。並且同時我參與了很多重游戲,從 DOOM 開始(我的第一個游戲,因此印象深刻,當時我還花錢購買了完整版本),然後是 DOOM II 和 HEXEN,以及最後的 Quake。如果你不熟悉第一人稱射擊游戲的歷史,那麼我告訴你正是 Quake 這個游戲改變了游戲的歷史。它提供了第一個“真正的”3D 世界(前人只是用 2D 地圖模擬 3D,從而允許不同的地板和天花板高度),並通過支持 TCP / IP 和使用高級代碼徹底改變了死亡匹配,這些高級代碼比以前允許更多的游戲玩家出現在同一張地圖中。

  這也是極其定制化的。雖然我在審美上不擅長,並且從來沒有去創造我自己的模型或地圖,但是我直接跳進了編程。Quake 提供了一種基於C的語言,叫 QuakeC,從字面上你會編譯成一個特殊的跨平台字節碼,可以運行在所有目標平台上,如 Quake。我快速寫了一些修改,以便於做一些例如允許玩家玩火或導致釘鞋從牆上逼真彈回的事情。有人在聊天室要求我編程一個點子,正是這個點子讓我出了名,它被稱為“MidnightCTF”,基本上說,就是將現有地圖的所有燈關掉,只允許玩家使用配備的手電筒照明。Quake 是第一批支持真正 3D 音效的游戲,這增加了游戲的趣味。

  甚至有人從我的修改中擇取了一個代碼片段收錄到“編程語言詞典”的 QuakeC entry 條目下。Nikodemos 是我玩 Quake 時用過的昵稱。QuakeC 的“Hello, World”不過是一條在游戲中發送給當前所有玩家的廣播消息。

  1996 年 – QuakeC

bprint ("Hello World\n");

  直到這時候我才意識到互聯網是真的蓬勃發展了。1993 年,我在大學裡發現它的時候,還沒有人明白我在說什麼,那個時候我真的非常灰心喪氣。但短短幾年後大家都在爭先恐後地訪問 Internet(一些公司,如 AOL 和微軟 MSN,認為他們可以建立自己的版本……但最後都放棄了,決定接入到互聯網中)。我意識到,在大型機上的工作會逐漸過時,或者充其量我只能做那種隱藏在後面昏暗角落中攻擊“舊系統”的開發人員。我決定學習新的東西。

  我轉移到另一個正在研究一個新玩意的部門——設計一個應用程序,通過連接用 VB6(COM +)和 ASP 編寫的應用程序中的幾個不同的系統,來提供跨供應商的可視化。

  1998 年 – VB6(COM)W / ASP

Public Class HelloWorld    
  Shared Public Function GetText () As String         
    return "Hello World"    
  End Function
End Class

  -

<%@ Page Language="VB" %>
<OBJECT RUNAT=SERVER SCOPE=Session ID=MyGreeting PROGID="MyLibrary.HelloWorld">
</OBJECT>
<HTML>
  <HEAD>
    <TITLE><%= MyGreeting.GetText () %></TITLE>
  </HEAD>
  <BODY>
    <H1><%= MyGreeting.GetText () %></H1>
  </BODY>
</HTML>

  當時,我有機會與一個有天賦的架構師一起工作,這位架構師設計了一個在當時相當令人驚訝的系統。我們的 COM + 組件在接口中都接受單一的字符串參數,因為輸入信息是作為 XML 傳遞的。這使得我們的組件可以輕松處理來自於網站的消息,因為它們可以引入來自於第三方系統的數據。這是一種真正的“web 服務”,在我真正理解這個詞是什麼意思之前。在客戶端,表單是由 JavaScript 解析並打包成 XML,再發布下去的,所以來自於網頁的“帖子”和直接來自於服務的帖子並沒有什麼不同。服務也返回作為 XML 的數據。這將與一個針對 UI(稱為 PXML——presentation XML)的模板結合,然後 XSLT 模板將轉換它用於顯示。這使得我們可以調整 UI 而無需更改底層代碼,而且這非常像一個低效率的 XAML 引擎。這是在 .NET 之前的日子。

  當然,JavaScript 是我們的克星,因為那時候我們不得處理各種浏覽器。是的,當涉及到 JavaScript 和跨浏覽器兼容性的時候,存在於 15 年前的同樣問題今天依然存在。幸運的是,所有的浏覽器接受發送對話框給最終用戶的方式。

  1998 年 – JavaScript

alert ('Hello, World.');

  很多時間被花在工作於 Microsoft XML DLLs 上(是的,如果你還記得注冊 MSXML 解析器)。MSXML3.DLL 很快就成了我最好的朋友。下面是使用 XSLT 將 XML 轉換為 HTML 的一個例子。

  1998 年 – XML / XSLT to HTML

<?xml version="1.0"?>
<hello>Hello, World!</hello>

  -

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
  <xsl:template match="hello">        
    <html>            
      <head>
        <title><xsl:value-of select="."/></title>
      </head>
      <body>
        <h1><xsl:value-of select="."/></h1>
      </body>

  -

<%Const MSXMLClass = "MSXML2.DOMDocument" 
        Set XSLT = Server.CreateObject (MSXMLClass)
        Set XDoc = Server.CreateObject (MSXMLClass) 
        XDoc.load (Server.MapPath ("hello.xml"))
        XSLT.load (Server.MapPath ("hello.xsl")) 
        Response.ClearResponse.Charset = "utf-8"Response.Write 
        XDoc.transformNode (XSLT)%>
  我用了好幾年的時間工作於那個范例。在那段時候我經歷了個人的轉變,體重減了近 70 磅,腰圍從 44” 降到 32”,對健身充滿了激情。我開始兼職性地開辦我自己的公司,並最終離開了我所在的公司,成為了一家為醫院提供翻譯服務,並有一個西班牙語的在線飲食計劃的小公司的 IT 總監。這再一次提高了我講西班牙語的能力,因為翻譯是從英語翻譯成西班牙語,反之亦然。我學到了不少關於各種行業用語之間的差異,以及有針對性翻譯的重要性。我還重寫了一個完整的應用程序,此應用程序使用 ASP 和嵌入的 SQL 調用,並且被硬編碼為西班牙語,成為一個完全數據庫驅動的,白標的(對於品牌推廣)本地化 app(該公司一直想擴展其他語言,例如法語)。這是一個激動人心的時刻,當我在我的工作中使用 Microsoft 堆棧時,因為工具和服務器成本的關系,於是我為自己的公司開源社區。就是在那個時候我學會了所有這些關於 LAMP 堆棧……Linux 操作系統,Apache HTTP 服務器,MySQL 數據庫,以及用於開發的 PHP。諷刺的是,這方面的經驗之後反倒促成了我和 Microsoft 合作的第一次咨詢活動之一,因為他們想要接觸到開源社區以便於著手 Silverlight……但這是另一個故事了。

  2002 年 – PHP

<?php $hello = 'Hello, World.'; 
echo "$hello";?>

  當我有機會轉移到另一個職位去為一家新公司構建軟件開發時,時間又過去幾年,這中間我一直工作於這些特定的平台上。我成為了一家提供無線熱點的小型初創企業的第三個員工,在無線熱點這個詞盛行起來之前。當我加入的時候,我發現這家公司的初始平台是用 Java 寫的。這門語言其實我已經用它做過相當多的“修修補補”工作,所以結合 C ++ 和 Microsoft 堆棧技能迅速掌握它,並不是一個巨大的跨越。

  2004 年 – Java

public class Hello {
    public static void main (String[] args) {
        System.out.println ("Hello, World");
    }
}

  作為一門語言,我毫無理由反對 Java,但是我們在使用時特定地包括即將擱置不用的 Microsoft JVM,以及一個不想擴展的自定義服務器。我將平台遷移到了 .NET 上,令人驚訝地是,單一的 IIS 服務器比若干專用 Java 服務器可以處理更多的請求。雖然這裡我說的是“遷移”,但其實是打造一個新的平台。我們希望遷移 J ++ 代碼到C#,因為 J ++ 真不實用。幸運的是,C#非常接近於 Java,所以大多數時候團隊都能夠輕松過渡,我們使用現有系統作為新系統運行在 Windows 機器上的“spec”,並從 MySQL 移動到 SQL Server 2005。注意C#的“Hello, World”和 Java 是何等的相似。

  2005 年 – C#

public class Hello
{
   public static void Main ()
   {
      System.Console.WriteLine ("Hello, World!");
   }
}

  使得我們公司在當時如此成功的部分原因是,有一個允許我們從中央位置管理所有熱點和接入點的“控制面板”。我們可以遠程重啟它們,應用固件更新,監控它們以及存儲歷史以診斷問題。這個軟件迅速發展成為移動設備管理(MDM)平台,而這個平台就是公司現今的主打產品。他們重新命名軟件的名稱,並把產品投入市場,但我們面臨的挑戰是用 HTML 提供一種極致互動的體驗,而且還要跨浏覽器兼容(使用 Microsoft 定制的 Java 小程序事先解決)。我們使用 AJAX 和 HTML 成功構建了一個令人印象深刻的系統,但我們的團隊苦苦掙扎於復雜,豐富的用戶界面,當他們不得不測試通過這麼多浏覽器和平台的時候。雖然我們需要因為熱點登錄體驗做到這一點,但是管理方面可以更加靈活,因此我研究了一些替代方案。

  當我發現 Silverlight 的時候,我被迷住了,於是決定先駕馭它。由於我成功地在幾個星期內搞定了監測儀表板的 POC,並且每個人都喜歡它,所以我們決定孤注一擲。在我最樂觀的猜測下,我們的團隊使用 Silverlight 能從概念到發布代碼比 JavaScript 和 HTML 堆棧快 4 倍。那時 HTML5 還仍然是個空談。我們建立了相當多的 Silverlight 功能,在我離職之前。直到我們在和 Apple 一起工作在 MDM 方面時,他們不希望 Silverlight 出現在他們軟件的任何地方,並且 HTML5 減緩了發展勢頭,因此公司只能改弦易轍,但是我還是享受了好幾年用這一種語言來構建豐富的業務應用程序,並且這種語言通過 XAML 將聲明式 UI 的力量帶到允許插件的浏覽器和平台中(我聽說那些已經不流行了)。

  2008 年 – Silverlight(C#和 XAML)

<UserControl x:Class="SilverlightApplication1.MainPage">    
  <Grid x:Name="LayoutRoot" Background="White">        
    <TextBlock x:Name="Greeting"></TextBlock>    
  </Grid>
</UserControl>

  -

public partial class MainPage : UserControl
{         
  public MainPage ()         
  {                 
    InitializeComponent ();                 
    Loaded += MainPage_Loaded;         
  }
  void MainPage_Loaded (object sender, RoutedEventArgs e)
  {                 
    Greeting.Text = "Hello, World.";         
  }
}

  當然,Silverlight 就像一只壞股票一樣一路綠了下去。但它仍然是一種非常有用和可行的技術,但一旦人們意識到 Microsoft 並沒有放太多籌碼在這只股票上,那時它就只能死掉——和它在當時是否是正確的工具無關,一切根源在於一種它已經過時的感覺。HTML5 用“write once, run everywhere”的口號很好地營銷了自己,並且數以百計的企業在他們意識到自己的錯誤之前,就貿貿然地一頭扎了進來(它其實應該是“一次編寫,到處被困,然後為每個目標設備再寫一次”)。

  不過,Silverlight 還是有讓我們喜歡的部分的,就在 Windows 8.1 中的 XAML 和C#堆棧。下面是“Hello, World”的一個版本,使用模型 – 視圖 – 視圖模型(MVVM)模式。

  2011 年 – WinRT / C#

public class ViewModel
{
  public string Greeting    
  {        
    get
    {
      return "Hello, World";        
    }    
  }
}
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">    
  <Grid.DataContext>        
  <local:ViewModel/>    
  </Grid.DataContext>    
  <TextBlock Text="{Binding Greeting}"/>
</Grid>

  雖然 Windows 8.1 讓我有空閒投入到我的寫作和業余項目,但對於大多數公司而言,仍然有一些新的東西在裡面,因此他們希望一個基於 web 的解決方案。那意味著 HTML 和 JavaScript,所以那是我花了我大部分時間攜手工作的語言。是的,一旦我以為我可以抽身離去,它們又將我拉了回來。在我認真思考了我為什麼討厭使用 HTML 和 JavaScript 來 web 開發的原因之後,我決定去找一個更好的辦法。我們的團隊聚在一起,尋找潛在的方法,終於發現一個很酷的解決方案。最近,一種新的語言被發布了,它就是 TypeScript,這是 JavaScript 的一個超集。它沒有試圖改變語法,任何有效的 JavaScript 也是有效的 TypeScript。更進一步的,這語言還提供了一些開發時功能,例如可幫助塑造 API 調用和提供豐富內容的接口(而沒有出現在生成的代碼中),同時還有很多構造例如有繼承性的類,強類型變量以及靜態修飾符所有這些編譯成完全有效的,跨浏覽器的 JavaScript。

  使用 TypeScript 是一個非常容易��的決定。即使是處於測試階段,100% 它的產品都適用於 JavaScript,所以如果我們發現它不能很好地工作,那麼我們只要放到 JavaScript 開發即可。事實證明,這令人難以置信地有用——即使是團隊中的 JavaScript 純粹主義者和那些憎恨任何試圖“修改語言”的人,也贊同 TypeScript 給了我們額外的控制力和重構能力,並且 TypeScript 支持並行開發,能夠提升我們發布基於 web 的高質量代碼的能力。

  2012 年 - TypeScript

class Greeter {
public static greeting: string = "Hello, World";    
public setGreeting (element: HTMLElement): void {
element.innerText = Greeter.greeting;    
    }
}
var greeter: Greeter = new Greeter ();
var div: HTMLElement = document.createElement ("div");
greeter.setGreeting (div);
document.body.appendChild (div);

  TypeScript 並不是我們所做的唯一變化。我們也想要去掉一些圍繞建立對象用於數據綁定時的慣例和繁文缛節。我們使用了 Knockout,Knockout 是一個偉大的框架,但它需要我們做比預想更多的事情。我們團隊中的某個人在調查了幾個備選方案之後,選擇了 AngularJS。起初我持懷疑態度,但很快意識到這真的很像用於 web 的 XAML。它給了我們一個在保持 UI 聲明式的同時隔離命令式邏輯和解決另一個問題的辦法。我們的團隊愉快地使用 TypeScript 和 AngularJS 堆棧已經好幾個月了,並且毋庸置疑地愛上了它。我現在正工作於用於 WintellectNOW 的模塊,因為我相信這是一件大事。如果說 30 年的編程時間教會了我什麼的話,那就是:今天是今天,明天會改變。我不是一個C#開發人員,也不是一個 JavaScript 開發人員或 AngularJS 專家。我都不是。我是一個碼農。是一個程序員。一個純粹,樸素和簡單的程序員。語言只是一種工具,而我恰巧會講很多種而已。所以,“Hello, World”,我希望你能享受我 30 年的旅程……下面是最新的。

  2013 年 – AngularJS

  “Goodbye,各位讀者。”

<div ng-app>    
  <div ng-init="greeting = 'Hello, World'">        
    {{greeting}}    
  </div>
</div>

  -

  英文原文:30 Years of “Hello, World”

Copyright © Linux教程網 All Rights Reserved