C程式語言介紹

開始學習C,一種基礎的程式語言 C可能是最廣為人知的程式語言。它被全球各地的電腦科學課程作為參考語言,可能和Python和Java一起是人們在學校學得最多的語言。 我記得它是我學到的第二種程式語言,之後是Pascal。 C不僅僅是學生用來學習程式設計的語言,它不是一門學術語言。而且我會說它並不是最容易的語言,因為C是一種相對較低階的程式語言。 今天,在嵌入式設備中廣泛使用C,它也為大多數使用Linux的網絡服務器提供動力。Linux內核使用C編寫,這也意味著C動力了所有Android設備的核心。我們可以說C代碼運行了整個世界的很大一部分。真是令人驚訝。 在C誕生之時,它被認為是一種高階語言,因為它在各種機器上都可移植。今天我們基本上認為,可以在Mac上運行在Windows或Linux上的程序,也許可以使用Node.js或Python。但在過去,根本不是這種情況。C所帶來的是一種易於實現的語言,具有可以輕易移植到不同機器的編譯器。 我提到了編譯器:C是一種編譯語言,就像Go、Java、Swift或Rust一樣。其他流行的編程語言如Python、Ruby或JavaScript則是解釋語言。差異是顯著的:編譯語言會生成一個可以直接執行和分發的二進製文件。 C不會進行垃圾回收。這意味著我們必須自己管理內存。這是一個複雜的任務,需要非常小心地防止bug,但這也是C成為編寫Arduino等嵌入式設備程序的理想語言。 C不隱藏底層機器的複雜性和功能。一旦你知道你可以做什麼,你就擁有了很大的能力。 現在,我想介紹第一個C程序,我們將它稱為“Hello, World!” #include <stdio.h> int main(void) { printf("Hello, World!"); } 讓我們來描述一下程式原始碼:首先我們引入了stdio庫(這個名稱代表標準輸入輸出庫)。 這個庫讓我們可以使用輸入/輸出函數。 C本身非常小,除了核心部分,其他任何東西都是由庫提供的。這些庫有些是由普通程序員編寫的,並提供給其他人使用。還有一些庫是編譯器內建的,像stdio和其他庫一樣。 stdio是提供printf()函數的庫。 這個函數被包裝在main()函數中。main()函數是任何C程序的入口點。 那麼,什麼是函數? 函數是一個例程,它接受一個或多個參數並返回一個單一值。 在main()的情況下,該函數不接受任何參數,並返回一個整數。在參數中使用void關鍵字來識別,並使用int關鍵字來聲明返回值。 函數有一個函數體,它用大括號括起來,在函數體內我們放置了函數執行所需的所有代碼。 printf()函數的寫法不同,正如你所見。它沒有定義返回值,我們傳入一個用雙引號括起來的字符串。我們沒有指定參數的類型。 這是因為這是一個函數調用。在stdio庫的某個地方,printf被定義為 int printf(const char *format, ...); 你現在不需要理解這意味著什麼,但簡而言之,這就是函數的定義,當我們調用printf("Hello, World!");時,函數就執行了。 上面我們定義的main()函數: #include <stdio.h> int main(void) { printf("Hello, World!"); } 在執行程序時,將由操作系統來執行。 那麼,如何執行C程序? 如前所述,C是一種編譯語言。要運行程序,我們必須首先編譯它。任何Linux或macOS電腦都已內建了C編譯器。對於Windows,您可以使用Windows Subsystem for Linux(WSL)。 無論如何,當您打開終端窗口時,可以輸入gcc,這個命令應該會返回一個錯誤,說您沒有指定任何文件: 這很好。這意味著C編譯器存在,我們可以開始使用它。 現在輸入上面的程序到一個hello.c文件中。您可以使用任何編輯器,但出於簡單起見,我將使用終端中的nano編輯器: 輸入程序: 現在按下ctrl-X退出: 按下y鍵確認,然後按回車鍵確認文件名: 這樣,我們應該回到終端: 現在輸入 gcc hello.c -o hello 該程序不應該產生任何錯誤: 但它應該生成一個hello 可執行文件。現在輸入 ./hello 來運行它: 我在程序名前面加了./以告訴終端該指令位於當前文件夾...

JavaScript非同步程式設計與回呼函式(Callbacks)

JavaScript默認是同步的,並且是單線程的。這意味著程式碼無法創建新的線程並且並行運行。了解一下非同步程式碼的含義以及它是什麼樣子。 程式語言中的非同步性 JavaScript 回呼函式 處理回呼函式中的錯誤 回呼函式的問題 回呼函式的替代方案 程式語言中的非同步性 電腦的設計使其成為非同步的。 非同步意味著事情可以獨立於主程式流程發生。 在現代消費者電腦中,每個程式運行一段特定的時間片段,然後停止執行,以讓其他程式繼續執行。這個循環運行得非常快,我們認為我們的電腦同時運行許多程式,但這只是一種幻覺(除了在多處理器計算機上)。 程式內部使用中斷,這是發送給處理器以引起系統注意的信號。 我不打算深入探討這方面的內部細節,只是讓你記住,程式是非同步的很正常,它們在等待時會暫停執行,並且電腦可以在此期間執行其他任務。當程式在等待網絡響應時,它無法阻止處理器停止執行。 通常,程式語言都是同步的,一些語言提供了一種處理非同步的方式,可以在語言本身或通過函式庫中進行處理。C、Java、C#、PHP、Go、Ruby、Swift、Python等都是默認同步的。有些語言通過使用線程來處理非同步,而線程則產生新的進程。 JavaScript JavaScript默認是同步的,並且是單線程的。這意味著程式碼無法創建新的線程並且並行運行。 程式碼按照順序一行行執行,例如: const a = 1 const b = 2 const c = a * b console.log(c) doSomething() 然而,JavaScript誕生於瀏覽器中,最初的作用是響應用戶操作,比如onClick、onMouseOver、onChange、onSubmit等等。它如何在同步程式模型下實現這一點呢? 答案就在它的環境中。瀏覽器提供了一種處理此類功能的方式,它提供了一組API。 最近,Node.js引入了一個非阻塞的I/O環境,用於擴展此概念到文件訪問、網絡請求等等。 回呼函式 你無法知道用戶何時會點擊一個按鈕,所以你要做的是,為點擊事件定義一個事件處理函式。這個事件處理函式接受一個函式作為參數,在事件觸發時將調用該函式。 document.getElementById('button').addEventListener('click', () => { //當按鈕被點擊時執行 }) 這就是所謂的回呼函式。 回呼函式就是一個簡單的函式,它作為值傳遞給另一個函式,並且只有在事件發生時才會被執行。我們之所以能夠做到這一點,是因為JavaScript提供了一級函式的功能,這些函式可以被賦值給變量並且可以傳遞給其他函式(稱為高階函式)。 通常會將所有的用戶端代碼包裝在window對象上的load事件監聽器中,只有在頁面準備好時才會運行回呼函式: window.addEventListener('load', () => { //視窗已加載 //執行你想做的事情 }) 回呼函式無處不在,不僅僅在DOM事件中使用。 一個常見的例子是定時器: setTimeout(() => { //2秒後執行 }, 2000) XHR請求也接受回呼函式,這個例子中通過將一個函式賦值給一個屬性,在特定事件發生時調用該函式(在此例中,是請求狀態發生改變): const xhr = new XMLHttpRequest() xhr.onreadystatechange = () => { if (xhr....

如何學習多種語言?

在我發送第一封電子報宣告新的SwiftUI系列時,有人問我這個問題:“你是如何學習多種語言的呢?” 好問題! 在過去,我學過Pascal、C、Java、PHP、JavaScript、Objective-C、Go、Python和Swift。我想我列出了我使用過的所有語言。 並非所有語言都是一樣的。有些比其他更“平等”(引用)。 我認為上述的所有語言非常相似。一旦你學會了其中一種,很容易學習其他語言。變數、函數、迴圈、物件。 當然,不同的語言都有一些獨特的特性,比如Go的協程或者C是非常低級的。但是底層基礎是相同的。 有些語言非常非常不同,比如Haskell、Elixir或者Lisp。我希望有一天能夠學習它們,但目前還沒有機會。 現在,我嘗試專注於受歡迎的初學者友好語言,有一個很好的原因。原因是你不會用Haskell開始你的職業生涯。當你去學它時,你已經是一個經驗豐富的程序員,我不需要教你任何東西。 不管怎樣,我稍微偏離了主題。 “你是如何學習多種語言的呢?” 我選擇一種新的語言,長時間專注學習它。 我用這種語言來建立東西。 我不斷練習,以初學者的心態,好奇並開放於這種語言應該如何運行。 有些語言很無聊,有些非常令人興奮。這完全取決於你需要做什麼。如果你夢想著機器學習,Python對你來說可能非常令人興奮。如果你的夢想是構建一個被世界各地數百萬用戶使用的iOS應用程序,Swift就是你的選擇。 我覺得在你的職業生涯中並不只學習一個編程語言。除非是特殊情況,事物會不斷變化。 20年後我不會繼續使用JavaScript。JavaScript要麼會完全不同於現在(就像你將現在的JavaScript與10年前的JavaScript比較),要麼它將會是一種古老的語言。 這就是為什麼我不標榜自己是一個“JavaScript開發者”或任何其他標籤。我只是一個開發者,這就是全部。 語言只是工具。 學習一門新語言並不是一個終點,而是一個冒險的開始。