虽然说没有银弹,但是我感觉 c++完全可以设计成更友好,开发速度更快的语言

2021-07-14 21:14:58 +08:00
 zxCoder

c++大佬别杠我,不可否认的是 c++学起来实在太难,写起来实在太慢

实际上很多东西感觉完全可以反过来吸收别的语言的优点

17253 次点击
所在节点    程序员
209 条回复
junkun
2021-07-19 14:20:22 +08:00
@RobberPhex 我觉得你这结论不对。开发中处理本质性的困难就已经很麻烦了,可是如果编程语言 /工具又增加了附属性的困难,那不是难上加难。这也是为什么有的语言可能开发效率高,有的语言可能开发效率低。
junkun
2021-07-19 14:29:17 +08:00
@RobberPhex 这也是我觉得 rust 优于 c++的原因,在写 c++的时候我需要花费大量精力去检查是否有 UB 等算是附属性困难的问题。而 rust 中,在 unsafe 以外我就完全不需要考虑这些,只要让编译器通过即可,甚至可以差不多像托管语言一样编程,称之为解放感也不足为过。
Austaras
2021-07-19 14:41:28 +08:00
@wutiantong  首先 adt 起码对应 std::variant 和 std::tuple,你可以看看 cpp 里的实现是多扭曲,而且 cpp 里也并没有相应的基础设施,随便多嵌套几层就等着爆炸吧

feature 并不是越多越好,恰恰相反,需要仔细斟酌加什么不加什么,衡量收益和代价,而在这点上 cpp 可以说是灾难性的失败
Austaras
2021-07-19 14:42:54 +08:00
@wutiantong  你都封装成智能指针了那哪里的 zero cost 呢?固然 rust 这边可以全部 Arc (不多线程共享的可以用 Rc,这点上成本比 cpp 的 shared_pointer 还要低),但性能损失呢?
wangxn
2021-07-19 14:56:30 +08:00
@Austaras 没理解,你不能拿两个不等同的东西来比吧。shared_ptr 只能用来和 Rc 比。C++假如有需要也可以写一个单线程专用的。而且我不觉得这么简单几行就能实现的东西 Rust 还能比 C++快。
wangxn
2021-07-19 14:57:59 +08:00
@wangxn 只能和 Arc 比。按你的说法。
Austaras
2021-07-19 15:00:04 +08:00
哦,std variant 果然也没有 niche 优化,这可真 zero cost
Austaras
2021-07-19 15:05:01 +08:00
@wangxn 那你要怎么知道这个东西不会被多线程共享呢?不好意思 cpp 没有这样的能力,只好全部上 Arc
wangxn
2021-07-19 15:07:05 +08:00
@Austaras 难道说 Rust 能编译时或运行时自动判断?
wutiantong
2021-07-19 15:07:13 +08:00
@Austaras
std::variant std::tuple 我不仅看过,也在不断地大量使用。

我其实不明白你们为何那么执着要证明 rust 比 C++更好,
而且我也没看到任何有说服力的证据,翻来覆去说的都是一些老生常谈。

毕竟在我看来,你们口中各种对 C++的控诉,看起来似乎只能证明你们并没有学会这门语言的正确写法。

那么,根据你刚才的两条回复,我能否请你:

1. 举出一个实际代码的例子,展示 rust 的 adt+pattern match 是如何漂亮地抽象了一个复杂问题,我可以试试用 C++是否会写得丑陋且爆炸。

2. 举一个引用必须要飞来飞去地例子,来展示通过声明周期标记 rust 编译器是如何为我们节省思虑并且提高性能的,我可以试试用 C++是否必须要牺牲性能与可读性。
Austaras
2021-07-19 15:10:31 +08:00
@wangxn 是可以,有两个 auto trait send 和 sync,快来学吧 233
wangxn
2021-07-19 15:12:03 +08:00
@Austaras 我看了一下 Arc 的文档,假如我没理解错,用法和实现完全等同于 shared_ptr,没发现有什么特别的、可以超越 C++的地方。
Austaras
2021-07-19 15:17:08 +08:00
@wangxn 超越的地方就是不需要线程共享的时候可以不用这个改用 Rc 啊,而且 rust 能保证 Rc 被共享的时候会编译出错
paoqi2048
2021-07-19 15:23:00 +08:00
这个贴子现在已经变成了 Rust 厨和 C++厨的交锋了🙃
Austaras
2021-07-19 15:30:18 +08:00
@wutiantong pattern match 的优越性是老生常谈了,各路 fp 语言都分别论证过一遍的东西,随手举几个例子
···
fn foobar(n: u8) -> String {
(match (n % 3, n% 5) {
(0, 0) => "foobar",
(0, _) => "foo",
(_, 0) => "bar",
(_, _) => ""
}).into()
}

struct List<T> {
value: T,
next: Option<Box<T>>
}

fn len<T>(list: List<T>) -> usize {
1 + match list {
List { value: Some(list), ...} -> len(list) ,
List { value: None, ...} -> 0
}
}
···
复杂的例子里最好的例子大概是 ast,比如
···
let persistent_id = match &mut item {
// function Foo() {}
ModuleItem::Stmt(Stmt::Decl(Decl::Fn(FnDecl { ident, .. }))) => {
if let Some(hook) = handle_map.remove(&ident) {
hook_reg.push((ident.clone(), hook));
}
get_persistent_id(ident)
}

// export function Foo() {}
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
decl: Decl::Fn(FnDecl { ident, .. }),
..
})) => {
if let Some(hook) = handle_map.remove(&ident) {
hook_reg.push((ident.clone(), hook));
}
get_persistent_id(ident)
}

// export default function Foo() {}
ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultDecl(ExportDefaultDecl {
decl:
DefaultDecl::Fn(FnExpr {
// We don't currently handle anonymous default exports.
ident: Some(ident),
..
}),
..
})) => {
if let Some(hook) = handle_map.remove(&ident) {
hook_reg.push((ident.clone(), hook));
};
get_persistent_id(ident)
}

// const Foo = () => {}
// export const Foo = () => {}
ModuleItem::Stmt(Stmt::Decl(Decl::Var(var_decl)))
| ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
decl: Decl::Var(var_decl),
..
})) => {
···
至于生命周期的例子,不好意思,cpp 只要愿意永远可以怼裸指针,而且 rust 里需要手动标记的地方也是越来越少,所以很难搞出一个具体的例子,不过你可以看看 rust 里的 COW 是怎么做的
Austaras
2021-07-19 15:35:38 +08:00
wutiantong
2021-07-19 15:41:46 +08:00
Austaras
2021-07-19 15:59:45 +08:00
mingl0280
2021-07-19 16:18:08 +08:00
@junkun 我不是精通 C++,我只知道有特性我不确定的时候我会去查特性怎么用是不是 UB,你又不是精通又要装精通那肯定觉得 C++好难啊。本质上你提出来的所有问题都是你自己对自己的能力判断过高然后却又非要装成老大哥来教育别人的问题。
xcstream
2021-07-19 17:06:27 +08:00
c++版本众多,没有统一的设计模式。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789560

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX