作者nh60211as (xXx_5354M3_31M0_xXx)
看板C_and_CPP
標題[閒聊] Herb Sutter 展示 cppfront 編譯器
時間Wed Sep 21 20:18:25 2022
影片連結:
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