[閒聊] Herb Sutter 展示 cppfront 編譯器

作者: nh60211as   2022-09-21 20:18:25
影片連結: 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
作者: johnny94 (32767)   2022-09-21 20:29:00
跟carbon不知道那個會勝出XD
作者: NciscalA   2022-09-21 23:47:00
是說 Circle 也是在實作實驗性語法,不過 cppfront 好像比較注重在編譯器跟 ABI 的相容性?
作者: descent (「雄辯是銀,沉默是金」)   2022-09-25 17:46:00
感謝分享
作者: ab4daa (nooooooooooooooooooo)   2022-09-29 08:48:00
所以以後可以把legacy code用這build了?
作者: yuichanprpr (有以ちゃん)   2022-09-29 16:37:00
雖然我都沒用過 但這類次世代C目前是Rust最有利吧
作者: wulouise (在線上!=在電腦前)   2022-09-29 20:57:00
是新轉舊不是舊轉新..
作者: KMore   2022-10-02 02:14:00
用這怎不直接去rust
作者: OnlyRD (里巷人)   2022-11-25 02:31:00
c++最棒的地方就是你不想要安全只想要速度的時候...

Links booklink

Contact Us: admin [ a t ] ucptt.com