當我們今天在舒適的集成開發(fā)環(huán)境中敲擊鍵盤,享受著高級語言和智能提示帶來的便利時,或許很難想象,在計算機時代的黎明,程序員們是如何與那些龐然大物對話的。上世紀40年代至50年代,編程并非今天這般抽象和友好,而是一項極為繁瑣、直接且充滿物理性的工作。
一、機器語言:與“0”和“1”的直接對話
最初的計算機,如ENIAC(1945年),并沒有我們今天理解的“程序”概念。編程意味著手動設置物理開關、拔插電纜來配置機器的運算邏輯。這更像是布置一個巨大的電子線路板,每一次計算任務都需要重新進行物理連接,過程極其耗時且容易出錯。
出現(xiàn)了存儲程序的概念(馮·諾依曼結構),程序可以像數(shù)據(jù)一樣存儲在內存中。但此時的“編程語言”只有機器語言——純粹的二進制代碼(0和1的序列)。程序員需要熟記特定計算機的指令集(如操作碼001代表加法),并手動將這些指令轉換成二進制形式,通過打孔設備制作成穿孔卡片或穿孔紙帶。一個微小的錯誤,比如一個孔打錯了位置,就可能導致整個程序失效,排查起來如同大海撈針。
二、匯編語言:助記符帶來的革命
為了減輕程序員的記憶負擔,提高編程效率,20世紀50年代初,匯編語言應運而生。它用簡短的英文助記符(如ADD、MOV)來代替晦澀的二進制操作碼,用符號標簽來代替內存地址。例如,將數(shù)字A和B相加,不再需要寫一長串二進制,而是可以寫成類似“ADD A, B”的形式。
計算機的“大腦”CPU只能理解機器語言。因此,需要一個稱為“匯編器”的特殊程序,來負責將匯編語言編寫的“源程序”翻譯成機器碼。雖然多了一個步驟,但編程的抽象層級提升了一級,可讀性和可維護性大大提高。程序員仍需對硬件結構(如寄存器、內存地址)了如指掌,編程依然是貼近機器底層的精細活。
三、編程實踐:充滿物理感的工作流程
初代程序員的工作環(huán)境與今天大相徑庭:
- 設計與編碼:先在紙上用匯編語言(或更早時直接用二進制規(guī)劃)寫下程序邏輯。
- 打孔:將程序指令轉移到穿孔卡片或紙帶上。使用打孔機,將代碼對應的孔位逐一打出。一摞卡片或一卷紙帶就是一個程序。
- 輸入與執(zhí)行:將成疊的卡片放入卡片閱讀機,或將紙帶裝入紙帶閱讀機,計算機將其讀入內存。這個過程噪音大,且介質脆弱易損。
- 調試:如果程序運行失敗(幾乎總是),程序員需要檢查打印出的內存狀態(tài)(核心轉儲)或通過控制臺的指示燈來觀察寄存器內容,像偵探一樣逆向推理錯誤所在,然后修改紙帶或卡片,重新開始整個流程。
四、突破與遺產(chǎn)
50年代中后期,第一批高級語言(如FORTRAN, LISP)開始出現(xiàn),旨在讓編程更貼近數(shù)學表達或人類思維,進一步解放了程序員。但整個初期編程的核心特征——對硬件資源的極致把控、嚴謹?shù)倪壿嬎季S、以及將復雜問題分解為簡單指令序列的能力——奠定了計算機科學的基礎。
那個時代的編程,是真正的“創(chuàng)造機器可執(zhí)行的精確律令”。它沒有圖形界面,沒有自動補全,更沒有搜索引擎來答疑解惑。有的只是程序員與機器之間最原始、最直接的邏輯溝通。正是這些先驅者們“刀耕火種”般的探索,為我們今天繁榮的數(shù)字世界鋪下了第一塊基石。他們的工作提醒我們,在軟件的一切便利之下,最核心的依然是清晰、嚴謹和無差錯的邏輯思想。