在前面我們曾經說過世界上有很多種不同的程式語言,程式設計師們會依自己的專長,選一個適合的程式語言,像是寫 Apple iOS 會選 Swift,網頁前端選 JavaScript,寫網站選 Ruby 或是 Elixir 等。但這些語言的邏輯運作方式差異不會太多,通常學了一種之後,要上手其它的會快很多。(但精通就比較不容易)
不過有幾種語言跟上面的通用程式語言不同,能做的事很少,卻是所有程式設計師都應該要會的。
這些語言用來專門處理一個很獨特的領域,我們叫他們領域特定語言,英文縮寫是 DSL (Domain-Specific Language)。就像水果削皮刀,雖然不像一般刀子什麼都能切,但是想要削水果的果皮時就又快又方便。
而大家都要會的 DSL 有兩種:
記得我們之前寫網頁應用程式時,把記帳的資料存在瀏覽器的 LocalStorage 裡嗎?我們那時有提到 LocalStorage 的容量蠻小的。想要存很多人的很多資料時,通常會用到資料庫這種東西。
如果你在上電腦課時用過 Excel,就想像資料庫是一種可以存無敵多張 Excel 表的倉庫就可以了。
最主流的資料庫叫關聯式資料庫,著名的有 MySQL、PostgresQL 及 MS SQL,以及手機或是單機程式用,輕量的 SQLite。
[補: MySQL、PostgresQL 及 MS SQL 圖示]
當然還有其它不同功能,但不是用一般 SQL 操作的資料庫。但只要知道這件事就好了。
我們會在資料庫裡做的事,基本上分成四種,新增 (Create)、查詢 (Read)、修改 (Update) 及刪除 (Delete)。這四個動作用英文字開頭簡稱 CRUD。
-- 新增學生資料
INSERT INTO students (name, age, grade) VALUES ('王小明', 10, '四年級');
-- 查詢特定學生
SELECT * FROM students WHERE name = '王小明';
-- 查詢年齡大於 10 歲的學生
SELECT * FROM students WHERE age > 10;
-- 修改王小明年齡
UPDATE students
SET age = 11
WHERE name = '王小明';
-- 刪除年齡小於 8 歲的學生
DELETE FROM students WHERE age < 8;
你有沒有用過一些網站,在輸入 email 帳號,或是身份證字號時,會很快的跟你說「這個 email/身份證的格式不對,請重新輸入」呢?
我們之前有教過 if/else
語法,那麼我們來想像一下,要用幾個 else if
條件,才能把所有輸入的文字是正確 email 格式的可能性都列出來比較呢?
答案是:辦不到,因為輸入的文字有無限多種組合,要一個個列出條件,列到世界末日也列不完。
那麼這個功能是怎麼辦到的呢?就是用 正規表示法(Regular expression),來比對文字的格式。
所謂的格式,就像是「這段文字前面有幾個英文或數字,後面跟著一個 @
。再接著是幾個英文或數字,再跟著一個 .
」...之類的。
Regular expression 這個英文字太長,常常被縮寫成 Regex。
Regex 寫起來非常像外星文 👽。下面是簡單的判斷 email 格式的 regex。
^[\w\.-]+@[\w\.-]+\.\w+$
如果你看了之後,心裡發出很大的「ㄏㄚˊ ???」,是超級正常的,快速解釋一下:
^ 開頭
[\w\.-]+ 一個或多個:字母、數字、底線、點、減號
@ 一定要有 @
[\w\.-]+ 一個或多個:字母、數字、底線、點、減號
\. 一定要有點
\w+ 一個或多個:字母或數字
$ 結尾
除了 SQL 跟 Regex 之外,還有很多不同的 DSL,有些是自己獨特的語法,例如用來處理網路程式間傳輸資料的 jq。
有些是跑在通用語言裡的 DSL,例如寫自動化測試程式時,Ruby 的 RSpec 及 Elixir 的 ExUnit,看起來像是在讀英文的規格書一樣,不懂程式的人也能猜出在做什麼,相當漂亮。
(跟 Regex 完全相反,很多人寫出了會動的 Regex,過一個月自己就看不懂了。)
如果有一天,你想要自己設計程式語言,來解決特定的問題時,可以考慮用某些很靈活的語言,來設計一套自己的 DSL。
適合做這件事的程式語言有 Elixir, Ruby, Kotlin 及 Lisp 這個比較小眾的語言,Python 跟 JavaScript 勉強可以做到。