hyj 哲學

C、C++ 與其他語言

C 彷彿草原上奔放不羈的野馬,原始而自由。沒有各種奇怪的語法,結構簡單。每一處記憶體都可以親自控制,這便是自由所在,然而過分的自由也會導致麻煩。選手往往難以親自管理好底層的記憶體,程式碼也容易混亂。

C++ 彷彿是穿上了一件破衣的原始人,雖有了現代的模樣,卻改不了原始的根。 C++ 的確引入了一些現代的特性,卻往往因為巨大的歷史包袱及各種原因難以充分現代化,發展也相當緩慢。不過值得肯定的是 C++ 的面向物件及 STL 的確方便了許多,然而在大多數選手的程式碼中 C++ 唯一的體現可能就是 cinsort,這與 CCF 對於現代 C++ 的消極推行有一定關係。而且 OI 中常有常數相關的題目,有些選手也有意識在程式碼中減少對 C++ 的使用,以減少常數。

Python 是優雅的,是穿上了華麗衣服的舞者。熟練掌握 Python 可以提高(程式設計)效率,但常數較大。 Python 在競賽中通常可以充當資料生成器,簡單的對拍及各種工具。

Rust 就是一個脫去了歷史包袱的語言的例子,與其他語言相比創新很多,也足夠底層,然而較為複雜,不好入門。它像 C++ 一樣哪裡都能用,前景光明。

JavaScript 是個神奇的語言,有許多設計缺陷的地方,但生態極好。隨便一個專案能有 GiB 級別的 node_modules,能同時用同個依賴的不同版本,居然還能流暢地跑起來。 TypeScript 是好的,一定程度上改善了這些設計缺陷。

0 還是 1

大量 OIer 的程式碼中,陣列是從 1 開始的,還有一些語言(如 lua)也是這樣。誠然,這種編號方法更加符合人類對數字的認知,也不容易出錯。但這樣使用 C++ STL 時總少不了各種 +1 -1,不如統一成從 0 開始,左閉又開,這樣更加符合 C++ 的哲學。

左閉又開有許多好處。比如說對於區間 [l1, r1)[l2, r2],他們的長度分別是 r1 - l1r2 - l2 + 1;如果要對差分陣列操作,一個是 d[l1] += x; d[r1] -= x,一個是 d[l2] += x; d[r2 + 1] -= x;表示連續區間時,左閉又開的兩個區間的中間端點是相同的;表達空區間時,開區間不得不使右端點小於左端點;

作業系統

Windows 設計冗雜,歷史包袱重,對命令列支援太差,還是微軟家的。唯一優點是生態好。

GNU/Linux 十分自由,能高度自定義,同樣是歷史悠久的作業系統,Unix 一直以來就設計良好。還有開源軟體心理 buff。微軟、騰訊及其他科技巨頭對 GNU/Linux 的消極支援,使用者對大量非 FOSS 軟體的依賴,是 GNU/Linux 無法在桌面端流行的重要原因。

vim 和 neovim

我現在仍然在使用 vim。

neovim 是推動 vim 前進的重要力量。

vim9 比 lua 好。

文件與排版

這篇文章就是直接在 vim 中寫的。

通常 WYSIWYG 是沒有必要的,它反而可能會使排版混亂,而純文本介面中,字號樣式一目瞭然,對於電腦也更容易處理。

圖形介面有極大的侷限性,比如說公式排版,LaTeX 比 Word 好用多。

軟體

當代中小學計算機教育應當減少非 FOSS 軟體的教授,這樣可以避免整個社會在未來被某些巨頭所主導。

非 FOSS 的軟體是不值得信賴的,當然 FOSS 軟體也需要經過充分審查才能信賴。