看板 C_and_CPP 關於我們 聯絡資訊
影片連結: https://www.youtube.com/watch?v=ELeZAKCN4tY
在今年的 CppCon 中,提出了多項 C++ 功能的 Herb Sutter 展示了他自己實驗性的編譯器:cppfront。 Github 連結:https://github.com/hsutter/cppfront 這個編譯器可以將 Herb Sutter 設計的新語法 C++ syntax 2 (Cpp2) 轉譯成 C++ 語法 (類似 TypeScript > JavaScript) 以下是 Cpp2 語法: main: () -> int = { std::cout << "Hello " << name() << "\n"; } name: () -> std::string = { s: std::string = "world"; decorate(s); return s; } decorate: (inout s: std::string) = { s = "[" + s + "]"; } 看了語法有點類似 Kotlin 等比較年輕的程式語言, 提出一種新語法的目的不外乎是為了讓 C++ 更安全、簡單, 因為 C++ 為了語法相容性的關係很少提出破壞性的新語法, 因此很多人就算使用的 C++ 編譯器可以支援新語法和工具了可能還在使用 raw pointer、NULL 這些舊時代的產物。 為了解決這些問題,Herb Sutter 提出的新語法預設便是以安全性為前提, 例如使用 new 產生 pointer 時 Cpp2 的語法 i := new<int>(0); 會使用 std::unique_ptr 來避免忘記釋放記憶體導致的問題, 另外還有很多為了讓 C++ 更安全、簡單而提出的想法都可以在影片中看到。 感覺這些想法就算不會進入標準也應該可以作為寫 C++ 程式的時候可以參考的做法。 個人滿喜歡的是其中支援 pattern matching 的語法感覺可以讓寫 template function 的時候寫法更易讀: main: () -> int = { print_an_int("syzygy"); print_an_int(1); print_an_int(1.1); } print_an_int: ( x: _ ) = { std::cout << std::setw(30) << typeid(x).name() << " value is " << inspect x -> std::string { is int = std::to_string(x as int); is _ = "not an int"; } << "\n"; } 目前 cppfront 可以在各個主流的編譯器下用 C++20 編譯並使用, Compiler Explorer 也已經支援 cppfront 了: https://godbolt.org/z/bs371778a -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.228.71.204 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1663762710.A.FDD.html
johnny94: 跟carbon不知道那個會勝出XD 09/21 20:29
NciscalA: 是說 Circle 也是在實作實驗性語法,不過 cppfront 好 09/21 23:47
NciscalA: 像比較注重在編譯器跟 ABI 的相容性? 09/21 23:47
descent: 感謝分享 09/25 17:46
ab4daa: 所以以後可以把legacy code用這build了? 09/29 08:48
它可以接受 legacy C++ code,可是不會有什麼效果。 cppfront 只會把它自己的語法轉譯成合法的 C++ 語法, 接著讓 C++ 編譯器實際編譯程式。
yuichanprpr: 雖然我都沒用過 但這類次世代C目前是Rust最有利吧 09/29 16:37
wulouise: 是新轉舊不是舊轉新.. 09/29 20:57
※ 編輯: nh60211as (125.228.71.204 臺灣), 09/30/2022 20:12:29
KMore: 用這怎不直接去rust 10/02 02:14
OnlyRD: c++最棒的地方就是你不想要安全只想要速度的時候.. 11/25 02:31
OnlyRD: . 11/25 02:31