Finally! Finally! Finally!
經歷了銜接/暑期課的astrology♊️、unusual food🌮、What a floozy 💋、subcultures 🧸 、ghost month superstitions 👻、bullying on campus 🥊、gender communication ⚧,
萬眾矚目的EEC終於開課了!
今晚是L班的第一堂課,
雖然還沒恢復實體上課,
俐媽可是使勁補充、娛樂、鼓勵你們,
希望你們第一堂課就有視覺刺激、聽力享受、和源源不絕的筆記補充!
俐媽穿上我的破破牛仔褲,
因為,
Unit 1的主題,
就是The Origin of Blue Jeans👖 !
————————————————————————
另外,
不可以不知道我們EEC的全名喔!
🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊🔊
EEC
= Exclusive 獨家的 English 英文 Club 俱樂部
📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣
✏️ ex-: out/ clud: close
我要報導一則新聞了,關門之前,其他媒體都出去!所以我採訪的新聞,才是「exclusive 獨家的」。
下次看電視時仔細看!
只要是獨家新聞,常常畫面的角落會出現大大的EXCLUSIVE (NEWS)
🔠 在EEC課程中,俐媽常用英文解釋英文,幫助你們直接think in English,同時培養出英文耳朵。而且,俐媽的發音pronunciation、抑揚頓挫intonation、rhetorics辭藻、expression表達、body language 肢體語言都超棒!
💃🕺🏻 誰說C指的是class? Class代表填鴨cramming、考試、作業、壓力。
我們的C,是club!
過程中有singing🎤、dancing 👯、acting 🎭 、joking 🤡、laughing 🤪、interaction 💞,這樣的氣氛,才歡樂、才令人想一來再來!
——————————————————————
L班的孩子要認真上課吸收,
俐媽下課也會在班群中為各位解惑,
也可能會有隱藏版筆記唷😉😉
#俐媽英文教室
#俐媽英文教室EEC篇
#開課第一堂就送上50字大餐
#你們一定撐得住
#因為你是俐媽的孩子
#台大明明招牌EEC課程
#錯過會後悔
同時也有68部Youtube影片,追蹤數超過2萬的網紅Atsushiの日本語教室,也在其Youtube影片中提到,影片來源:C-CLASS2020年9月第2部 你想要更多翻譯練習的話,歡迎來到「C-CLASS」。 https://kabuki-anime.com/post-1531/ 【容易搞錯的日文】 場所助詞「に」跟「で」的不同/間違えやすい日本語・場所の助詞「に」と「で」の違い https://you...
「c語言class」的推薦目錄:
- 關於c語言class 在 辣媽英文天后 林俐 Carol Facebook 的最佳解答
- 關於c語言class 在 Facebook 的最讚貼文
- 關於c語言class 在 91 敏捷開發之路 Facebook 的最佳解答
- 關於c語言class 在 Atsushiの日本語教室 Youtube 的最佳貼文
- 關於c語言class 在 Atsushiの日本語教室 Youtube 的精選貼文
- 關於c語言class 在 Atsushiの日本語教室 Youtube 的最佳貼文
- 關於c語言class 在 [心得] C++ 與C 的特性及區別- 精華區C_and_CPP 的評價
- 關於c語言class 在 C++的Class中的一些重點整理| 技術筆記 的評價
- 關於c語言class 在 C++ 入門指南- 類別 - 程式語言教學誌FB, YouTube: PYDOING 的評價
- 關於c語言class 在 分享[筆記]類別、特殊函式、內嵌函式、函式物件|C++ 的評價
- 關於c語言class 在 QueenieCplusplus/Cplusplus: Intro, 導讀 - GitHub 的評價
c語言class 在 Facebook 的最讚貼文
【外國人獲得芥川賞的得獎方法】
前一陣子台灣的作家
獲得了日本文學賞「芥川賞」的榮耀。
身為日文教師,平常在教外國人日文的我,
看到這則新聞時,
真的受到相當大的衝擊。
「外國人竟然可以獲得連日本作家想得到都沒辦法得到的
『芥川賞』!?
有什麼比這個還厲害的事情!?」
一開始,我心想那位作家應該是
在日本長大的混血兒之類的,
但經過調查,並不是。
而且她的學歷背景跟我教導的學生們幾乎差不多。
我深深對她的努力感到佩服,
我想她是那種持續做好該做的事情,
然後把日文能力發揮的淋漓盡致的人吧!
可能也有其他人想要獲得芥川賞!
但外國人想獲得芥川賞的話,
最少需要具備以下4種能力
・出類拔萃的日文能力
・文學涵養
・自我獨特的世界觀
・將自己的世界觀撰寫出來的語言能力
這些條件如果沒有付出相當多的努力,
非常難以辦到。
而且除了上述4種條件,
想要獲得芥川賞
還需要相當優異的品味,
以及長年的累積,才有辦法達成。
不過
如果你...
「想要擁有像日本人優秀的國中生/高中生的
日文能力程度」
「想要能跟日本人客戶使用商業書信互通有無」
「想要將自己公司的商品推銷給日本人,
並且大幅提升業績」
「想要具備能過通過外交官考試的日文讀解能力及
寫作能力」
「想要了解日本人的思考邏輯及
感動日本人的詞語,並在人際關係中取得優勢」
「想要知道日本人的笑點,
並成為一個講話有趣的人氣王」
如果你的願望這樣就能達成的話,
其實並不是難事!
只需要正確的練習方法,
並且模仿正確的範本。
真的只需要做到這些,
你就可以達成上面說的這些目標唷!
我看過形形色色的學生當中,
幾乎沒什麼進步的學生,
大概可以分成下面3種:
・練習方法錯誤
・沒有模仿範本
・根本沒有練習
相反的,如果你...
・知道正確的練習方法
・有正確的範本
・而且正確的去模仿範本
光是做到這些,
你的日文程度就能很快的接近日本人!
我的課程當中
會大量的準備範本,
並且會請你大量去模仿,
綜合性的提升你的日文能力!
從現在開始也不遲,
拿出勇氣朝你的理想邁進吧!
https://kabuki-anime.com/page-2100/
PS
在這裡分享一下
模仿範本,
只花3個月就大幅進步的學生感想。
(27歳・男・台湾人)
ーーーーーーーーーーーーー
我是從今年一月開始上C-CLASS的課程,在上到第三個月時開始覺得可以完全跟上老師的進度,到四月時覺得自己應該可以更進一步學習日文,剛好在這時看到Atsushi老師在wed-site發表的新課程S-CLASS,[進攻型和防守型的日文]對其內容很感興趣,但一次上兩種課程的話怕自己能力不足應付不來,所以取消了C-CLASS的訂閱轉到S-CLASS。
因為平時周一到週五都要上班,特別是周五有時要加班到很晚,所以不一定能參加課程。我會運用六日的時間把昨天的課程動畫看完並盡可能將所有內容抄在筆記本上,標上不會的發音和單字解釋。周一到周四的時間則盡可能地去完成當周的作業,但由於我的日文能力還太弱了,常常拖到周四的凌晨才完成,有時甚至只寫了一半就交出去了。
印象較為深刻的是每周的作文解答例子,和自己跟其他同學的作業訂正,雖然之前有過只看自己的訂正的壞習慣,但被老師改正後開始學習把別人日文出錯的地方當成自己的錯誤,從這之中發現日文的進步程度大幅提升,真的很感謝Atsushi老師。
此外每周課程的最後內容都非常有趣,有時是科學知識,有時是男女關係或是金錢時間管理,運用在生活上很有幫助。
我在上S-CLASS的課程之前只能打出簡單簡短的日文,大概在持續上課兩個月後發現自己打100~200字左右的日文文章並不會太花功夫,大多數老師出的作業會要求字數限制,反而需要注意的是如何簡短清楚的用日文說明,文法的正確使用等。
比起3個月前在文法上的使用比以前更有把握,日文的單字量也爆發性的增加,大部分的漢字單字可以靠直覺讀出來。
其實開始上S-CLASS的課程後發現自己實在是跟不上學習的進度,一周大約3小時的課程我大概要花9~12小時的時間才能將筆記抄寫完。
有時會花很多時間在還沒學過的單字和聽不懂老師在說甚麼的問題上,說到底是自己的日文程度不足,其實到目前為止大約欠了三周的功課筆記還沒抄完。
從第一個月開始就在想著如何能順利跟上進度,因為上週的功課都還沒全部聽完(包含抄寫),又一邊熬夜想辦法在週四交出作文而心力憔悴的時候,有過停止繼續上課的想法。
但在老師更改自己作業時說過[這個人想做還是做得到嘛!]的喜悅[這裡出錯太可惜了]的不甘心,都讓我想繼續學習日文,相信自己可以更進一步。
原本學習日文的動機是因為在日本打工過三個月(當時在京都),非常喜歡日本的環境,也交了不少日本朋友,但當時只會簡單的日文會話,沒辦法更深入地聊天,我希望有一天能有日文母語者的程度,可以在日本工作生活,跟更多的日本人交朋友,做深度的交流,了解不同文化的思想。
【外国人が芥川賞を受賞する方法】
先日台湾人の作家が
日本の文学の賞「芥川賞」を受賞しました。
このニュースを見た時、
普段外国人に日本語を教えている僕は
ものすごく衝撃を受けました。
「日本人の作家ですら取りたくても取れない
あの芥川賞を外国人が受賞するなんて
そんなすごいことある?!」
最初はハーフだとか
日本で生まれ育ったのかと思って調べてみたら
そうではなく、
僕の授業を受けている生徒たちと
そんなに大差ない学習バックグラウンド。
しっかりやるべきことをやり続けた結果、
日本語力を極めることができた人なんだなぁ
とその努力に感服しました。
「私も芥川賞を取ってみたいです!」
という人もいるかもしれませんが、
外国人が芥川賞を受賞するためには
・圧倒的な日本語力
・文学的な素養
・自分だけの世界観
・それを言葉にする描写力
などざっと見積もっても
この4つの能力が最低限必要です。
これらは並大抵の努力では
身につきませんし、
その他にかなりのセンスや
長年の積み重ねが必要になると考えます。
しかし、
もしあなたが
「日本人の優秀な中学生/高校生レベルの
日本語基礎力を身につけたい」
「日本人相手にビジネスで通用する
メールを書けるようになりたい」
「日本人に自社商品をセールスして
大きな売り上げを上げたい」
「外交官試験をパスできるくらいの
日本語の読解力と作文力を身につけたい」
「日本人の思考や感情のトリガーを理解して
関係性を優位に進めたい」
「日本人の笑いのツボを理解して
話が面白い人気者になりたい」
このような希望を叶えるだけでいいのなら、
何も難しいことはありません。
正しい練習方法で
正しいお手本を真似する。
ただそれだけで
上記の目標は達成できます。
僕が色々な生徒を見てきた中で
全く伸びない生徒は大きく分けて
・練習法を間違えている
・お手本を真似していない
・そもそも練習をしていない
この3種類に分類できます。
逆に、
・正しい練習法を知って
・正しいお手本を手に入れて
・正しくそれを真似する
ただそれだけであなたの日本語は
一気に日本人に近づきます。
僕の授業では
とにかく大量のお手本を用意して
それをたくさん真似してもらって
総合的に日本語力を伸ばしてもらっています。
今からでも遅くはありません。
勇気を出して自分の理想に向かって
走り出しましょう。
https://kabuki-anime.com/page-2100/
PS
お手本を真似して
3ヶ月で大きく進化した
生徒の感想もシェアします。
c語言class 在 91 敏捷開發之路 Facebook 的最佳解答
【Classic TDD by Example】C# 版無限期、不限次 影音培訓內容正式推出,開放報名。
完成介紹,請參考:https://tdd.best/courses/classic-tdd-by-example-video-training/
【#你可以學會什麼】
➀ 怎麼做需求分析、測試案例分析、backlog items 分析、TDD 的測試案例設計、單元測試、TDD 的小步快跑、持續重構、假實作加上三角定位法。
➁ code smell 的辨識,例如 duplication, temp variable, primitive obsession, feature envy 等等。
➂ 會用到的重構功能與技能,大概整個 IDE 的重構功能都涵蓋到了,包含:
- rename, introduce variable/parameter/field
- extract method/class/interface/super class
- inline variable/field/parameter/method
- move/make method non-static (move class, folder, namespace)
- push member down
- replace switch/nested if logic
- split/merge/join variable
- change signature
- 如何移掉 out 參數的設計
➃ 設計原則:SOLID, 關注點分離, Simple Design
➄ 實戰 Refactoring to Patterns: strategy, chain of responsibility, template method…
【#你會得到的服務與內容】
➀ 你會拿到兩個影片,包含需求面的說明、解析、測試案例分析設計、待辦清單的設計。長度加起來為12小時40分鐘。
➁ 有一份線上講義,匯出成 PDF 共計 159 頁。(作業為2頁)
➂ 有一份 mind map, 跟著培訓做,會有 338 個 elements/nodes。
➃ GitHub上一份 181個 commits 的參考。
➄ 會有一個 slack workspace 供大家在上面發問、討論交流,以及方便我補充相關內容。
➅ 額外提供1hr online 1-1 coaching,企業報價為10630(不信的,有好幾張不同時間的發票金額與天數備註為證明,歡迎來跟我打賭)
➆ 如果因為這門培訓的練習,讓你打算訂閱 JetBrains IDE, 可獲得個人首年訂閱8折的 coupon, 舉例來說,如果是只有 Rider, 就可省27.8美元,如果是全家餐(全系列 10個 IDE 產品),則是節省 99.8 美元。
【#適合哪些朋友】
➀ 因為時空因素(例如人在國外或外地、因為疫情、因為週末時間得陪伴家人,只有深夜才能擁有自己時間的朋友),無法參加我的培訓,但又很想突破自己能力瓶頸的朋友,至少我很肯定你可以從中先獲得工作上有幫助的內容。
➁ 不想等那麼久才能上到實體課,怎麼報名都只能排在等待清單,要等到啥時才可以變強啊啊啊啊啊… 的朋友。畢竟我 2021 年的所有課,在一月份就已經全數額滿了。
➂ 喜歡反覆觀看影片學習、動手練習,能從反覆複習的過程中,獲得最大學習效果,獲得不同想法刺激的學習模式的朋友,這一次的影片絕對可以滿足你的學習方式。
➃ 上我的實體課覺得時間太短、觀念太多、實作跟不上,身心靈在實務課程節奏有點緊湊感覺吃力的朋友,但又覺得內容充實,可以學到很多東西的朋友,這是最適合你做一次打好基底的內容與形式。
➄ 對於內容提及的部份,覺得觀念不夠清楚,不知道怎麼實際進行重構、設計與實作出那些技巧和模式,最終達成 #簡單設計 成果的朋友。
甚至我覺得,即使不是這種學習模式的朋友,大概也避不掉得反覆看、反覆練習好幾遍,因為要行雲流水,得各環節都打通才行。
【#不適合哪些朋友】
➀ 如果因為影片課程的屬性,而只期待著課程費用要比較低的朋友,建議不要買。
➁ 只想看影片,不想打開 IDE 跟著練習 coding 的,建議不要買。不要浪費時間浪費錢,你只看食譜也無法學會煮菜,只看游泳的影片也無法學會游泳的。
➂ 看不懂也不想發問的人,不要買。因為這樣誰都幫不了你。
➃ 不想要自己相關資料被壓浮水印在自己購買的影片上的人,不要買。有壓你個資的影片,只有你跟我擁有。而你的個資只會在影片上使用,不會挪作他用。(確定的是,上面不會有身份證字號或護照號碼)
【#票價資訊】
♥ 一般票:NT$ 36,000
♥ 過來人推薦票(請附上已經購買此影音課程的推薦人,報名附上他的出貨序號,以及 email):NT$ 35,000
♥ 老鳥票(指 2018 年後參加過 91 的公開培訓課): NT$ 34,500
定價標準緣由,請見課程介紹。
【#報名方式】
想要報名的同學,請將下列的報名資訊 joeychen@odd-e.com。確認報名成功之後,我會回信給您告知出貨序號,以及對應的匯款資訊。
> 信件標題:Classic TDD by Example: {name} 報名 {程式語言版本}
- 真實姓名
- 聯絡電話
- email (相關權限與未來老鳥票依據)
- 遮罩過的身份證照片(身份證字號、生日、換發日請都遮罩)
- 與真實姓名能對得起來的名片、帳單或信件照片(用來雙重驗證真實姓名的一致性,以免有人用他人身份證或網路上的身份證照片)
- 程式語言
- 推薦人的出貨序號與 email (如果票種選擇 【過來人推薦票】,請附上此資訊)
【#授權條款】
購買人付費之後,等同於已同意下列條款:
- 授權僅限本人觀看,不限制裝置,無限期,無限次觀看影片。不依賴於平台,將直接提供影片下載連結,所以請不用擔心在平台上下架的問題。
- 購買將採實名驗證,影片將壓上購買人相關個人資訊浮水印。影片、程式碼內容等,未經本人授權,不得於公開場所、平台觀看,不得擅自販售、分享、散佈、擷取圖片或影片片段侵害作者權益等行為。請購買人妥善保管影片,以保護雙方權益。
- 不論「有償或無償」,均不得已在未經同意的情況下將影片做公開分享、重製、散佈、改做
- 本於誠實信用原則,影片僅供個人學習使用,不得共用
- 若違反前述約定,則著作財產權人可以請求所受損害與所失利益
【#出貨清單與出貨狀態】
因每個人的影片都會有客製化的調整與浮水印資訊,故每天產能有限,目前一天可處理 4~8 張訂單。
所以列出對應的出貨清單與狀態,各位可以看到自己的出貨序號,以及目前處理到哪一張訂單了。
出貨清單:https://hackmd.io/@SYvyb1O4SLq8W6nvAQW5mw/ByVVUt86O
c語言class 在 Atsushiの日本語教室 Youtube 的最佳貼文
影片來源:C-CLASS2020年9月第2部
你想要更多翻譯練習的話,歡迎來到「C-CLASS」。
https://kabuki-anime.com/post-1531/
【容易搞錯的日文】 場所助詞「に」跟「で」的不同/間違えやすい日本語・場所の助詞「に」と「で」の違い
https://youtu.be/xqXVS02P8O4
N1滿分合格的學生(30代)的日文学習的心得:N1満点合格した生徒(30代)の日本語学習の心得
https://youtu.be/7_fDXuNgUyU
記住日語單字的方式 【實用的暗記法】/日本語単語の覚え方【楽々実用暗記法〜 】
https://youtu.be/IRBaAwgOvAc
日文也會跟著變好! 讓頭腦變好的五個生活習慣/日本語も上達!頭がよくなる5つの生活習慣
https://youtu.be/XLAy7MUqJ9g
官方網站
https://kabuki-anime.com
Facebook
https://www.facebook.com/kabukianime
#日文聽力練習 #日文翻譯練習 #JLPT
c語言class 在 Atsushiの日本語教室 Youtube 的精選貼文
影片來源:C-CLASS2020年9月第1部
聽寫練習VOL.1
https://youtu.be/p0cOe_uUHr4
你想要更多練習的話,歡迎來到「C-CLASS」。
https://kabuki-anime.com/post-1531/
【容易搞錯的日文】 場所助詞「に」跟「で」的不同/間違えやすい日本語・場所の助詞「に」と「で」の違い
https://youtu.be/xqXVS02P8O4
N1滿分合格的學生(30代)的日文学習的心得:N1満点合格した生徒(30代)の日本語学習の心得
https://youtu.be/7_fDXuNgUyU
記住日語單字的方式 【實用的暗記法】/日本語単語の覚え方【楽々実用暗記法〜 】
https://youtu.be/IRBaAwgOvAc
日文也會跟著變好! 讓頭腦變好的五個生活習慣/日本語も上達!頭がよくなる5つの生活習慣
https://youtu.be/XLAy7MUqJ9g
官方網站
https://kabuki-anime.com
Facebook
https://www.facebook.com/kabukianime
#日文聽力練習 #日文聽寫練習 #JLPT
c語言class 在 Atsushiの日本語教室 Youtube 的最佳貼文
影片來源:C-CLASS2020年1月第1部
聽寫練習VOL.2
https://youtu.be/5lkJcSDMecc
你想要更多練習的話,歡迎來到「C-CLASS」。
https://kabuki-anime.com/post-1531/
【容易搞錯的日文】 場所助詞「に」跟「で」的不同/間違えやすい日本語・場所の助詞「に」と「で」の違い
https://youtu.be/xqXVS02P8O4
N1滿分合格的學生(30代)的日文学習的心得:N1満点合格した生徒(30代)の日本語学習の心得
https://youtu.be/7_fDXuNgUyU
記住日語單字的方式 【實用的暗記法】/日本語単語の覚え方【楽々実用暗記法〜 】
https://youtu.be/IRBaAwgOvAc
日文也會跟著變好! 讓頭腦變好的五個生活習慣/日本語も上達!頭がよくなる5つの生活習慣
https://youtu.be/XLAy7MUqJ9g
官方網站
https://kabuki-anime.com
Facebook
https://www.facebook.com/kabukianime
#日文聽力練習 #日文聽寫練習 #JLPT
c語言class 在 C++的Class中的一些重點整理| 技術筆記 的推薦與評價
class 與struct有很明顯的的差別是,class可以定義member function,但struct不行。另外,class預設的member權限是private,而struct預設則是public。 以下 ... ... <看更多>
c語言class 在 C++ 入門指南- 類別 - 程式語言教學誌FB, YouTube: PYDOING 的推薦與評價
類別(class) 用來設計自己需要的物件(object) ,這是說,類別是物件的模板。 C++ 中設計類別使用關鍵字(keyword) class ,後面接大括弧宣告(declare) 類別的 ... ... <看更多>
c語言class 在 [心得] C++ 與C 的特性及區別- 精華區C_and_CPP 的推薦與評價
無聊寫的,適合晚上睡不著的人催眠用。保證對學習沒幫助,對了解 C++
是什麼,有一定的混淆作用;大家沒事看看就好,不用在意。
◎貓抓老鼠--沒有適合所有人的編程語言
常常見到許多人在問「我應該學習什麼語言?」。類似這樣的問題,與
其說是「見仁見智」,不如說是「貓抓老鼠」。俗話說:「會抓老鼠的
貓,就是好貓。」對使用者而言,究竟何種編程語言是最合適的,端視
其個人的需求及能力。要是始終拿不住耗子,這隻貓就算再名貴,再漂
亮,也沒什麼意義。
當然,反過來說,如果學不好某種語言,也不必太過灰心,這或許表示
您應該嘗試著轉往另外一片更適合自己的天空發展(另一片天空,可能
是換養另一隻貓,也可能是換抓不同的老鼠,甚至可能是不抓老鼠改行
養老鼠)。但千萬莫要因自己的挫折經驗,就拼命攻擊抵毀它,尤其是
當「這隻貓」早已經被整個地球上業界頂尖的高手,和無數職業編程人
員及業餘玩家,證明了「它絕對是個好樣的」,實用價值無可取代時,
那些私心的言論,只不過暴露了批評者本身的偏狹。
◎其他主流語言與 C/C++ 的差異
在討論 C++ 和 C 的區別之前,或許先從「旁觀」者的角度,看看它們
「相同」或「相似」的部份。此處主要的參照體是選擇一般通用型的編
程語言。
一、實際運作的觀點
首先,從實際運作的觀點,C 及 C++ 都是循傳統的方式,透過編譯器
和連結器,直接產生原生的機器碼(Machine Code 或 Native Code)
,而新一代的編程語言,有很多(例如 Java, C# 等)是先透過翻譯轉
成 bytecode,然後再由虛擬機器(Virtual Machine)來執行。
雖然很多人認為 Java、C# 等語言依賴虛擬機器執行的方式,效率不佳
,不過客觀的說,其實這種技術在某種意味上是比較先進的觀念,它最
重要的優勢顯示在移植性方面。至於效率的問題多半出在各平台間的差
異太大,而實作技術則顯然尚未完全成熟。(但這是可以克服的)
可能已經有人開始著急了。「照這樣說,C/C++ 不是落伍了嗎?」其實
並沒有。本質上來看,兩者是一樣的。因為大可以把 C++ Complier 當
成虛擬機,只是它不是由一家公司或少數特定人士所規範的,而且絕大
多數的平台(機器和作業系統)上,都是支持 C/C++ 的。而像 J2SE,
.NET 這些架構則是 Sun 或 MS 所制定的。
(甚至可以這樣認為:C/C++ 的虛擬機器是很多不同廠商、組織各自實
作的,只是它們儘量遵循 ISO ANSI C/C++ 的標準,而 JVM 又或 CLI
這些東西,雖說也是開放的,但實則操縱在 Sun 和 MS 手中。)
實際上,C/C++ 與 Java, C# 等最大的分別,並不是體現在虛擬機器的
觀念或作法上,而是體現在應用層面。光學會 C/C++ 語言,甚至它們
的標準程式庫後,通常幹不了什麼有用的事。一個 C/C++ 程式人員,
至少得熟悉一種 GUI 框架、一種 IPC 框架及一種 Database 框架,才
大致可以說能處理大部份的應用問題。
當然,不是說用 Java, C# 就不必學會這些東西,只是這些功能有很多
都已經成為該語言(框架)標準的一部份,在學習語言的時候,通常就
會順便學到應用的架構。但在 C/C++ 中,所謂的「標準程式庫」,卻
只規範了最最基本的 I/O,檔案處理,和常用的基礎演算法等等,其他
都必須仰賴第三方或特定廠商的程式庫的支援,而這些東西則沒有所謂
的標準,又常常受限於特定的平台環境,在取捨上比較不易。
二、型別系統的觀點
C/C++ 語言都是採用傳統的靜態型別系統(static type system),而
許多新語言,為了便利物件導向特性的運作,是採用基於單根繼承的泛
化型別系統,例如 Object Pascal, Java, C# 都是如此。
靜態型別系統的特性,就是不強制改變使用者自訂型別(UDT: User-
defined Type)的記憶體佈局,並且允許在 stack 中配置 UDT 變量(
也就是「物件」,但由於在 C 語言中,沒有真正物件導向的觀念,因
此以「變量」來指稱)。此外,在靜態型別系統中,「型別」和「變量
」之間,是壁壘分明的,你無法在編譯期產生變量,也不可能在執行期
產生新的「型別」。
相對的,基於單根繼承的泛化型別系統,例如在 Delphi 的 VCL 架構中
,所有的 VCL 元件,都繼承自 TObject,這就使得某些特殊的功能,例
如以 ClassName 取得物件的實際型別資訊,就很容易實現。Java 和 C#
等也都是如此。某些語言甚至內建 MetaClass 的特性,型別本身也可以
當作變量,在執行期建立新的、或修改既有的型別,這些都是根源於泛
化型別系統的基礎。相形之下,在靜態型別系統中,很多特殊的功能,
語言本身不直接支持,就必須自己去實現,或仰賴函式庫。
當然,靜態型別系統的最大優勢,就是執行期的效率。這也就是 C/C++
的「零成本」原則:「使用者不該為他沒有用到的功能,付出執行期的
效率代價」。因為不是每一件事情都得靠泛化型別系統的多態性來解決
,並且解決的辦法也不應該只有一種(該語言所限制住的那一種)。
三、哲學的觀點
簡單的說,C/C++ 的設計哲學是把程式人員視為「成人」。它認為程式
人員知道自己在幹什麼,而不是把程式人員當成「小孩」甚至「犯人」
,需要特別的保護,甚至預設程式人員一定會犯某種錯誤,所以它儘量
給予最大的自由及彈性,而不是強迫的限制或規範。
例如,包括內建型別,使用者自訂型別,和指標在內,它不強迫你一定
要將變量(物件、陣列或指標)初始化,不強迫你檢查陣列的範圍,不
強迫指標一定要指向合法的位址,它甚至允許你在各型別之間任意轉換。
又例如,C/C++它並不內建垃圾回收器(GC: Garbage Collection),
它認為唯有程式人員自己,才能決定何時方是歸還動態申請記憶體的最
適當時機,而不會在背後監視著一舉一動,幫忙收破爛。
當然,如果只是因為「自由」和「彈性」,而要付出高昂的管理和維護
的代價,那是不值得的。C/C++ 相對於其他語言,顯得較為「寬鬆」,
主要還是基於效率方面的考量。很多基於物件導向特性的新語言,雖然
增加了安全和提供某些狀況下的便利性,然而一旦面對陌生或特異的問
題,既有的工具和規範,無法直接套用時,過多的限制或「預設立場」
,就很可能反變成了累贅。
從這個角度,也可以說,C/C++(其實主要指 C++)並不認為存在著某
種最完善的方案,可以解決所有「應用層次」的問題,因此並不在語言
層次去規範這些問題應該怎麼解決,而是把解決方案交給應用層(程式
庫)去負責。語言本身只提供各種抽象的設計機制(介面),讓程式庫
的使用能儘量與語言系統的風格一致。
◎ 偉大的 C 語言
就筆者個人的認知,C 絕對稱得上是一個偉大的語言。它最偉大之處,
在於語言本身,良好地對映了 Von Neumann 所提出的現代計算機的模
型(主要是:二進位制、序列執行,以及將程式與資料都儲存在機器裏
)。C 語言的指標(pointer),對記憶體操縱的簡潔、自由、及靈活
性,就充份體現了這一特色。透過 C 語言,使用者可以較為直覺地運
用抽象的數學觀念,來編寫程式,而不必直接面對晦澀的機器指令。
由於與機器模型之間的高度映射關係,以及語言本身的精鍊,相較於機
器語言,C 除了具備高度的移植性,在效能方面的表現也相當突出,大
部份的情況下,幾乎不遜於機器語言多少。很多大型的系統,除了少部
份的核心代碼使用機器語言之外,絕大部份都是以 C 語言編寫的。
以現在的眼光,雖然 C 語言不是大多數應用領域的首選(當然,還是
有不少領域是非常 prefer C 語言的),但透過 C 語言的學習,對於
理解程式在機器中實際的運作情形,有莫大的幫助,也可以說是理解程
式的基礎。任何人若想成為編程高手,精通 C 語言,可以說是起碼的
條件。在整個資訊科學領域中,C 語言更是佔有極其關鍵、無法磨滅的
歷史性地位。
◎從 C 到 C++
雖然其實筆者是很想下「偉大的 C++」這樣的標題,但實際上如果不是
承襲了 C 語言的精髓,C++ 是不可能有今天的成就的。另一方面,C++
的某些不盡人意之處(例如語法的過於複雜),也是因為承襲了 C 語
言的特點才造成的。
究竟 C++ 和 C 有什麼不同呢?本來,在 ANSI C99 的標準以前(C89)
,C++ 至少有 95% 甚至可以說 99% 是兼容於 C 語言的,因此可以說
C 語言是 C++ 的一個子集。但在 C99 之後,某些 C 語言新的特性,
特別是動態長度的 Array,使得這種大體上的兼容性被破壞了,也就是
說,把 C 當成 C++ 的子集,這樣的說法可能要有所保留了。如果將來
,C 和 C++ 再度出現某些重大的分歧,也不是什麼令人意外的事情。
一、強化「型別安全」--對型別系統的全面改進
許多涉及語法細節之處就略過了。在此只提出一個較重要的部份,是關
於 C++ 與 C 的根本不同之處:
int *v = ...;
void *p = v;
int *p2 = p; // 合法的 C 程式碼,但在 C++ 中不合法
簡單的說,C++ 不允許 void * 隱式轉換為任意型別 T 的指標。但在
C 語言中,這是合法的。
C++ 禁止上述操作的理由,是為了強化「型別安全」。程式中一旦使用
void *,就等於自動放棄了編譯器對型別的自動檢查與核對動作,也就
是放棄了型別安全。而明知不好,C++ 仍然支援 void * 這種用法的原
因,主要是為了兼容於 C,但由於 void * 隱式換為任意型別的 T *,
這種用法實在太危險,所以在 C++ 中被禁止了。
理想的 C++ 程式,是不應該出現 void * 這種用法的。C++ 之父 B.S.
就曾指出,除了低階程式之外,應該儘量避免使用 void *,如果非得
用 void * 不可,通常代表你的設計出了某些問題。
仔細觀察,C++ 的每一項基礎設施,都有提升型別安全的意味在其中。
例如:
1引入 bool 型別,避免混淆。(主要問題在函式 overload 時)
2鼓勵以 0 而非自行定義的 NULL 巨集等代表空指標。(B.S.大和另
一位 Herb Sutter 大,在 2003 年底提出新增加 nullptr 關鍵字,
但不曉得 C++03 是否有通過)。
3引入 const,讓「常數性」成為與型別不可分割的一部份,除了提升
安全,讓編譯器承擔檢核的責任之外,也有助於代碼的優化。(因此
後來 C 語言也跟進採用。)
4引入 const, inline 等用法,減少非必要巨集的使用。(因為展開
巨集是預處理器的動作,沒有通過編譯器,也就沒有型別安全可言)。
5引入 reference 機制,簡化指標的語法,並有效減少指標(尤其是
兩層以上的複雜指標)的使用。
6引入 new 和 delete,取代 malloc 和 free,把動態記憶體配置的
工作,提升至語言層級,減少強制轉型的使用(另一主要目的是為了
配合 operator overloading,提升介面的一致性)。
7引入新的 static_cast, const_cast 等關鍵字,鼓勵儘量減少強制
轉型的使用。
8引入 function/operator overloading 機制,讓同名函式及各種運
算子,可依據不同的操作型別,實現不同的動作。強調「型別」也是
函式具名的一部份,達成介面一致性,並使 UDT 能像內建型別的操
作一樣自然。
這些每一個小地方,都可以看出 C++ 為了強化「型別安全」,所付出的
用心和努力,雖然除了禁止 void * 的隱式轉型之外,基本上沒有限制
C++ 使用者延用舊的 C 語言的舊式習慣寫法,但筆者認為,了解型別系
統的特性,並隨時意識著「型別安全」,是掌握良好 C++ 編程風格的最
重要觀念。
二、在「思維方法」上的差異
程式語言處理的不外乎資料結構及演算法,STL 的發明人也說過:「程
式基於精確的數學。」前面提過,C 語言偉大之處,就是它十分良好地
對映到機器模型,免除了直接使用機器語言的晦澀。
也就是說,C 程式人員不必去操心 register 管理、記憶體定址等等極
度低階的細節問題。其所思考的,多半像是「我應該用什麼演算法,把
某幾段特定記憶體內的資料取出來,經過怎樣的運算後,再存到特定的
記憶體區段去……。」這種把運算和存取操作的細部具體動作,轉換為
抽象的數學思考的流程,本質上仍然是非常貼近機器模型的。而這樣的
風格,不僅反映在 C 程式碼上,更多半根深蒂固地植入 C 程式人員的
思維方式內。
隨著資訊科學的發展,愈來愈多的應用問題,需要利用編寫程式來處理
;人們發現,大部份應用程式所使用的演算法和資料結構,是極為有限
的。另一方面,編寫程式語言的常用技巧,卻已經累積地相當成熟了,
程式人員需要付出更多心力的,不再是某個典型的演算法或資料結構,
應該如何實現,如何處理;而在於,如何將問題的本身,適當地轉換為
程式語言。
因此,一種讓程式語言能夠以「貼近待解決的問題」的方式來思考,而
不再只是侷現於「貼近機器模型」的思想,就應運而生。簡單地說,它
就是起源於 70 年代(甚至更早),在 80~90 年代開始快速發展,直至
今日,雖不再新鮮,卻仍屬方興未艾的「物件導向」的觀念。
由於物件導向(OO: Object-Orientd)的觀念是如此氾濫,甚至已經上
升到哲學的層次,幾乎沒有一個比較新的語言(80年代以後),不支援
它的特性,所以這裏也就不多介紹了。只是要指出一點, C++ 也好,或
其他支援物件導向特性的編程語言也好,它們與 C 語言最大的分別,並
不在語法或功能的區別上,而是在於看待問題的基本思考方式,也就是
所謂「思維方法」上的差異。
三、multi-paradigm
C++ 和 C 語言,在觀念上最大的不同之處,就是,C++ 是支持 multi-
paradigm 的編程語言。如下面所示,C 語言及傳統的 Pascal 語言,
是所謂 procedual-based 的編程語言,而 Java, C# 等較新的語言,則
是 object-oriented 的編程語言(OOPL)。
至於 C++,它實際上是個支援 multi-paradigm 的編程語言,因為它不
僅保留了 C 的程序導向的編程,更重要的是它沒有沒有為了要支援 OO,
而破壞基於 C 語言的靜態型別系統,因此它提供的 ADT(abstract data
type)機制,與繼承和執行期繫結等 OO 特性的機制是互相獨立的。這使
得 C++ 在 OO 的執行期多型之外,罕有地提供了強大的編譯期多型的機
制,也就是一般稱為「泛型編程」的技術。
procedual-based(eg: C, Pascal...)
object-oriented(eg: Objective C, Object Pascal, Java, C#...)
C++: procedual-based object-based(ADT)
\ / \
\ / \
\ / \
generic object-oriented(OO)
由上面的簡單示意圖可看出,泛型(generic)的編譯期多型的特性,不
止對應在 ADT 上,也可以直接對應到程序導向的編程,例如 C++ 標準程
式庫所提供的泛型演算法,就大部份是以函式而不是 class 來呈現的,
實際上,整個 C++ Standard Library,除了 I/O 的部份,幾乎完全沒有
用到 OO 的執行期多型的特性(更多的是 ADT 和 template)。
此外,或許有人會提出,其實 Java 或 C# 也是支援 generic 編程的,是
沒錯,Java 也有類似 C++ 的樣板容器的功能,但實際上是用「代換法」
做的,並沒有真正產生新的型別,因此它無法達到 C++ template 那樣可
以有型別客製化(特殊化: specialization),或與其他抽象化機制合作
(例如繼承、甚至遞迴)的多樣化的能力,並不算真正意義上的編譯期多
型。實際上,Java 和 C# 語言所採行的單根繼承的泛化型別系統,早就先
天限定它們不適合朝編譯期多型的方向發展,它們比較接近純粹的 OOPL。
C 語言的思考方式偏重於資料運算和記憶體存取的動作,物件導向的思考
方式,則是將問題分解成不同的抽象概念(class),讓使用者專注在概
念與概念間之的關聯,能從一個整體的大的方向,去關注問題,避免過早
陷入細節,見樹而不見林。
同時,良好的設計,是當需求有所改變時,只需要修改、調整部份的模組,
就可以完成工作,不必整體性的翻修,牽一髮而動全身。這也是物件導向
設計的重要精神,有一個專門的領域 DPs(Design Patterns),它與特
定程式語言無關,就是在研究面對各種問題需求的典型解決方式,現在學
物件導向設計一定會接觸到它。
至於,C++「多思維面向」(multi-paradigm)的特性,又是如何影響編
程的思考方式呢?
這裏舉個《Modern C++ Design》第七章的例子。Smart Pointer 的發展
動機,是為了防止直接操作指標所帶來的危險性,但隨著各種不同的需求
,它的實作細節也就有所不同。例如:它能不能與其他容器類(例如標準
程式庫中的 vector, list 等)共用,以及使用的細節如何?是否允許取
得原始指標?是否對各種操作動作進行檢查,如何檢查?甚至,是否支援
多緒程式安全地操作……等等。
如果將各種需求組合都列出清單,再一個一個實作,勢必沒完沒了。最理
想的方式,是讓程式員自由選擇各種「需求策略」,讓編譯器自動產生相
應的程式碼。這種設計乍看來是遙不可及的理想,但實際上已經做到了。
這就是 Loki 函式庫所提供的實作品 class template SmartPtr:
template
<
typename T,
template <class> class OwnershipPolicy = RefCounted,
class ConversionPolicy = DisallowConversion,
template <class> class CheckingPolicy = AssertCheck,
template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;
由於牽涉的選擇項目過多,這裏只解釋 OwnershipPolicy,也就是實際物
件擁有權的策略,它預設是 RefCounted,也就是參用計數的規則。但也
可以依據需求的不同,選擇其他的擁有權策略,例如:RefCountedMT、
DestructiveCopy、DeepCopy、……等等。使用方式如下:
class User {...};
typedef SmartPtr<User, RefCounted> UserPtr;
如此,UserPtr 就變成類似 boost::shared_ptr<User> 的作用,可以和
標準容器合作,而實現 Java、C# 語言常見的功能。又假如:
class Manager {...};
typedef SmartPtr<Manager, DestructiveCopy> ManagerPtr;
現在,MangerPtr 則和 std::auto_ptr<Manager> 一樣,採取所謂「摧毀
式複製」的語義,也就是同時只有一個 ManagerPtr 可以真正操縱同一份
Manager 類型的實體物件。
實際上,SmartPtr 的實現牽涉到 ADT、多重繼承、編譯期多型等等的特
性,它應用了一種叫 policy-based 的設計觀念。這與其他程式語言或是
DPs 所標榜的 OO 的特性,或所謂「良好設計」的最終目的,並沒有不同
,同樣是將不同的概念獨立分解,再巧妙組合起來。只不過,在 C++ 中,
除了傳統 OO 執行期多型的技術之外,還多了強大的編譯期多型的支援,
使得不僅「物件」(資料結構和演算法),可以在執行期被彈性處理,就
連「型別」(概念)的本身,在編譯期,也可以自由的選取整合。這對程
式碼編寫的簡潔、靈活性和執行效率,都能帶來很大的提升。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
... <看更多>