網頁

2021年4月21日 星期三

程式語言入門

進入主題之前,先談一下我的程式撰寫經歷。

我是機械背景,因研究所接觸到較有趣的工程資料庫,畢業後便進入 IT 領域,從此離不開程式設計及開發。

一開始是使用 Delphi 開發自動倉儲系統(透過RS232控制PLC),進入半導體公司後則多使用 VB6 開發 Windows 視窗介面、Portal 網頁(JavaScript、ASP、JSP...)及 Fab 監控系統(Java Servlet/Applet use Apache Tomcat),以及以 C/C++ 開發 UNIX/Linux 端的 MES server ,因此 Windows / UNIX-Like shell script 也頗有涉略,最近建置一套串流影音平台 - Jellyfin,使用 Node.JS、JavaScript、C#、AJAX 等較新技術,乃一典型的主從式架構的整合應用。問我學哪種程式語言好?其實要看需求而定,假如學校老師或公司主管要求以 C# 開發,即使你熟悉Java,也只能暫拋一邊了。不過程式語言重邏輯,只要熟悉其中一種,要跨入另一種就會容易許多,主要不同點在於語法上的差異,撰寫時通常 google 一下,然後 copy & paste 就可以了,腦袋不用記太多細節,因久沒用很容易忘記。以下列出常見的 GPL 差異:

Java

  1. 開發:以 IDE 撰寫 *.java (功力夠的話也用使用一般的文字編輯器,其他語言也一樣)
  2. 編譯:不管是下指令或者 IDE 方式,都是以 javac 進行編譯 => javac *.java 編譯成 *.class
  3. 執行:java  *.class,若有多個 class 可打包成 JAR 檔,方便 deploy 及執行。
  4. 開發環境需要 JDK(Java Development Kit),執行環境只需 JRE(Java Runtime Environment)
  5. 可進階了解什麼是反組譯 - 以工具將機器碼往編譯的反方向產出 source code。

Python

  1. 環境:電腦先安裝 Python
  2. 開發:以原始碼編輯器(ex: Visual Studio Code)撰寫 *.py
  3. 直譯:Python 是直譯器語言,直譯指令為: python *.py,過程中會產生 Byte Code(*.pyc),然後交由所屬平台的 Process Virtual Machine 轉成機器碼,最終結果與編譯器一樣。
  4. 執行:可將程式打包成 exe 檔供別人使用,指令: pyinstaller -F .\*.py => 參考

C++

  1. 開發:以 IDE 撰寫 *.cpp
  2. 編譯:常見的編譯器 gcc / g++,指令為: g++ *.cpp,Linux 通常透過 Makefile 方便編譯,而Windows 則由 IDE 代勞 => 參考,Linux 下使用 Makefile 有些複雜,有機會用到再研究即可。
  3. 執行:直接跑編譯後的結果,例如 Windows 的 exe 檔、UNIX-Like 的 .o, .so...

C# (C++有2個+,C# 則有4個+)

  1. 開發:以 Microsoft Visual Studio 撰寫 *.cs,然後編譯成執行檔及 dll 檔(伴隨而生的pdb檔可不用部署,那是debug用的),建議在熟悉的 Windows 環境開發,然後部署到不同平台執行。
  2. 開發環境需要 .Net SDK,執行環境只需 .Net Runtime,因 .Net 版本一直推陳出新,需注意版本相容性的問題。
  3. 如果只在 Windows 使用,搭配 .Net framework 支援度會比較高,但若跨平台,則需搭配 .Net Core 或 .Net Standard

以上簡單列出不同語言間的差異,若是使用 IDE 進行開發,可以不管太多細節,但建議還是要弄懂基本流程,以免 IDE 開發、除錯遇到問題時,不知如何排除。拜網路盛行之賜,許多大學都有開網路課程,例如 台大OCW 就有 C++ 的教學,有時間可慢慢看,或者直接看別人整理好的線上教學(請點我)。

好了,介紹就到這邊,下海才知海深,接下來就安裝一套 IDE 開始 C++ 的學習之旅吧!初學者建議安裝 Visual Studio Code 加 mingw-w64(for Windows) 或 Clang (for Mac),然後參考 程式範例 ,一步步熟悉 C++ 的程式語法。

p.s. VS code 記得安裝 "Code Runner" 延伸模組(extension),方便執行測試,若遇"無法在唯讀編輯器中編輯"的問題,解法:檔案 > 喜好設定 > 設定 > 延伸模組 > Run Code Configuration > Run in Terminal > 勾選。

2021年4月20日 星期二

淺談程式設計

想學 程式語言 卻不知從何下手? 網路上的教學網站、影片琳瑯滿目,品質也參差不齊,為了讓孩子減少摸索的時間,於是興起「整理」的念頭。

初學者該從哪種語言開始?可參考下面這張圖及影片(請點我):

 
建議先學一種 GPL(General Purpose Language),例如: Java, Python, C++,其中 Java 太過 物件導向(Object Oriented),學習門檻比較高,而Python雖簡單,但有執行效能慢的問題,因此可從 C++入門(適合工程背景的人),先看這部影片(請點我),以及以下基礎知識的補充:
  1. 硬體、韌體、軟體的關係 => 典型的韌體: BIOS
  2. 軟體的開發流程 => 這裡有C範例程式的變數宣告、程序導向 概念
    • Bit = 位元 = b(小寫) = 0 或 1
    • Byte = 位元組 = B(大寫) = 00000000、00000001 ~ 11111111,2^8(256)種狀態
    • 變數宣告 int = 4Byte = 32Bit;bool = 1 Bit (0/1);char = 1 Byte(例如英文字母,另中文字為 2 Byte) ...參考、或者 變數的使用 =>拿出手機按一下計算機
    • 積體電路每一 CMOS 代表一個 0 或 1,千萬甚至上億個 CMOS 組成一個 Chip(晶片,或稱Die), 一片12"晶圓約可生產 500 個 Chip(視產品用途而定) => 積體電路的組成
    • Chip 中的 CMOS 彼此之間如何溝通?這當然要看產品想要達成哪些功能,以及 IC 設計工程師如何設計而定,可參考 積體電路的製作流程 => 上億個肉眼看不到的超微小CMOS如何串連? 如何生產製造?
  3. 開發的程式可在不同平台執行(ex: Windows, MacOS, Linux...)
    • 早期程式只能跑在單一平台,例如 Foxpro、Delphi、VB6...只能跑在 Windows。
    • 現在大都可跨平台,同樣的 source code 拿到不同平台編譯便可跑在該平台,甚至可編譯成 DLL 拿到各平台直接使用。
  4. 整合開發環境(IDE, Integrated Development Environment):圖形介面,引入GUI framework及外掛(plugins),所見即所得(what you see is what you get、WYSIWYG) => 通常程式是一行行的敲出來,為能重複利用可寫成 procedure(不用回傳值) 或 function(可回傳值),但若要在畫面中新增一個視窗物件(ex: Button、Combo Box)讓使用者操作,直接拖拉及簡單設定ㄧ下是不是容易許多?所以程式開發通常都以 IDE 進行。
    • Java: Eclipse、JBuilder、JDeveloper
    • C++: Visual C++、C++ Builder、Dev-C++
    • C#: Microsoft Visual Studio
    • JavaScript: Visual Studio Code、泛用文字編輯器(ex: UltraEdit, NotePad++)
    • 有沒有哪個 IDE 可支援多種語言,只要熟悉一種介面及設定方式便可通吃?個人覺得 Eclipse 還不錯用,除 Windows 版本外,也有 MacOS、Linux 版本 => 參考
    • Microsoft Visual Studio 與 Visual Studio Code 是不同的產品,兩者定位不同,但都非常適合一般人使用,因網路上資源多,又是系出名門,而且還可跨平台,初學者就直接使用這個吧 => 參考

 
程式語言只是一個解決問題的工具,可多利用別人寫好的函式庫及程式,或者參考網路上的眾多資源,切記!寫程式的最佳夥伴是 Google

2021年4月3日 星期六

奇怪的夢

 

最近做了一個奇怪的夢,夢中的我到一個風景秀麗的地方旅行,看到樹下有一隻猴子及一隻螃蟹,猴子調皮戲弄螃蟹,被螃蟹的螯冷不防夾個正著,痛得哇哇大叫,不管猴子怎麼用力甩,都無法掙脫螃蟹的糾纏,一旁的我見義勇為,拿起棍棒猛打猴子,想將兩方支開,突然想起猴子才是受難的苦主,要打應該是打螃蟹才對!

棍棒才要往螃蟹身上落,夢境突然轉場,變成我家老三被老二拿夾子夾手,痛得哇哇大叫,當下的我介入調停,但老二異常淡定不為所動,追問之下才知是老三調皮招惹老二,被夾手是活該自找的,接著我就醒來了,而夢境也跟著結束。

做夢人人會做,但做這麼奇怪的夢還真是頭一回。比較常做的夢是到國外旅行,面對許多漂亮的風景,想拿單眼相機拍照,卻發現相機突然故障,又或者想拍照時,才發現相機遺留某處忘了拿,只能望著漂亮風景興嘆...。

夢很奇妙,許多與自己八竿子打不著的情節會突然跑進夢裡來,醒來不將它記下,不用多時便忘得一乾二淨,除了常做的夢以外。談「夢」有點複雜,倒不如將時間拿來看「哆啦ㄟ 夢」,喜歡裡頭的人物及對話,也興趣哆啦ㄟ 夢的眾多法寶,其中竹蜻蜓及任意門最是實用,假如能夠擁有它,以後出門及出國就便利多了。也許以後的科技真能實現這天馬行空的想像也說不定。