V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yamasa
V2EX  ›  程序员

想慢慢做个 mini 数据库,选 C++还是 GO?很纠结,希望老哥们给点意见

  •  
  •   yamasa · 2019-09-30 16:21:30 +08:00 · 7007 次点击
    这是一个创建于 1642 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人情况

    本科四年基本一直用 C++,毕业接近 6 年,主要用 java,对关系型数据库比较感兴趣,用过 mysql 和 sqlserver,捯饬过慢查优化,索引设计和索引原理等,也看过《数据库设计概论》的一部分,但没有深入到源码层级。

    短板分析

    • 虽然出身科班,但基础较差(甚是惭愧)。看 java 一些涉及到大量位运算的源码就比较吃力。想做一个 mini DB 的契机很大程度上也是源于希望加深对操作系统各方面的认识,练好内功,适应以后技术的飞速变化。
    • 自认语言 stack 还是显得狭窄,想多熟练一门语言。
    • 虽有 C++经验,但水平一般且丢了好几年。个人认为 GO 的学习曲线应该比 C++稍微平些。

    纠结点

    • C++虽成本高,但更接近 OS 底层,而且熟练之后猜测对学 JVM 也有所裨益?毕竟现在几个主流的 VM 依然是 c/c++ 实现的。
    • 从功利一点的角度看,似乎 GO 更值得学。

    从个人而言,最重要考虑的点依然是加深对操作系统 /网络等基本功的认识。希望有类似经验的老哥们能给点参考意见。目前想法是先做一个比较简陋基本版的,再慢慢添砖加瓦。如果能推荐一些学习 c++或者 go 的 resource 就更好了。

    49 条回复    2019-10-01 23:21:56 +08:00
    owenliang
        1
    owenliang  
       2019-09-30 16:22:37 +08:00
    厉害。。。
    janxin
        2
    janxin  
       2019-09-30 16:30:30 +08:00   ❤️ 1
    最好的语言 Rust 不了解一下?
    yamasa
        3
    yamasa  
    OP
       2019-09-30 16:32:37 +08:00
    @janxin 对 rust 不甚了解,也是跟底层打交道多吗?
    90928yao
        4
    90928yao  
       2019-09-30 16:36:29 +08:00
    go 吧 好多 go 的数据库
    liprais
        5
    liprais  
       2019-09-30 16:40:31 +08:00
    用 java
    至少你想抄的时候有的抄
    xdeng
        6
    xdeng  
       2019-09-30 16:40:59 +08:00
    c/c++可以做成库给其他语言用,go 目前不行吧。
    ipwx
        7
    ipwx  
       2019-09-30 16:48:02 +08:00
    “想做一个 mini DB 的契机很大程度上也是源于希望加深对操作系统各方面的认识”

    我觉得不现实,mini 数据库用不着操作系统级别的优化,用了就不可能是 mini 数据库了。
    zjsxwc
        8
    zjsxwc  
       2019-09-30 16:49:28 +08:00
    @xdeng

    cgo 早期就是 从 go 编译成 c 语言,然后再用 c 的工具链编译成二进制,虽然现在是直接编译成二进制,
    但毫无疑问 go 可以编译成 so 库提供给 c++/c 用
    inhzus
        9
    inhzus  
       2019-09-30 16:51:10 +08:00 via Android
    这个得看 scale 有多大吧…不过咱也不是很懂
    wuzhizhan
        10
    wuzhizhan  
       2019-09-30 16:51:32 +08:00
    java 就可以了,你的 mimi 数据库。。。
    yamasa
        11
    yamasa  
    OP
       2019-09-30 16:54:34 +08:00
    @ipwx 并不是上来就要优化的意思。诸如操作 page,考虑和设计记录在 hardDisk 内的结构和存储方式(顺序 /链表),还有索引的实现和硬盘存储等,对于我也是比较有意义的。
    salamanderMH
        12
    salamanderMH  
       2019-09-30 17:02:54 +08:00
    C++需要多练习
    taogen
        13
    taogen  
       2019-09-30 17:19:49 +08:00 via Android
    老哥,书名写错了。。(尴尬

    你都说了是加深对操作系统 /网络等基本功,又不是为了加强某个语言的熟练度,所以选择你最熟悉的语言即可。
    catror
        14
    catror  
       2019-09-30 17:23:56 +08:00
    这里追求接近底层没啥意义,在你的代码里,和系统底层直接交互也就只有系统调用。这一点上,Go 有对系统调用进行封装,开发体验上和 C++不会有啥区别。
    guonaihong
        15
    guonaihong  
       2019-09-30 17:25:25 +08:00
    @zjsxwc 兄弟正解,我现在就用 go 代码生成 c 的 ABI 然后给 c++调用。这样开发效率可以。
    misaka19000
        16
    misaka19000  
       2019-09-30 17:28:27 +08:00
    建议 go,C++我怀疑你有可能写到一半放弃。。。
    yamasa
        17
    yamasa  
    OP
       2019-09-30 17:30:52 +08:00 via Android
    @taogen
    @catror
    感谢二位的回复,有大体的想法了。
    yamasa
        18
    yamasa  
    OP
       2019-09-30 17:32:03 +08:00 via Android
    @misaka19000 确实。。完全能想象(手动捂脸)
    scnace
        19
    scnace  
       2019-09-30 17:48:58 +08:00 via Android
    写新的数据库轮子 不用 Rust ?
    xdeng
        20
    xdeng  
       2019-09-30 17:51:42 +08:00
    @zjsxwc win 的 dll 还没支持吧
    such
        21
    such  
       2019-09-30 17:55:48 +08:00
    肯定是 c++,从 gc 上考虑,golang 天生劣势,既然有能力去用 c++写,为什么要用 go 呢
    XIVN1987
        22
    XIVN1987  
       2019-09-30 18:07:08 +08:00
    c+others,最底层核心用 C 写,方便完全掌控内存布局,,中高层用其他语言写,降低开发难度
    sadfQED2
        23
    sadfQED2  
       2019-09-30 18:15:35 +08:00
    我来泼个冷水,数据库应该是一个项目里面最不能出错的东西,也是性能要求就苛刻的。自己造的话涉及 io,网络,命令解析,索引等等,自己研究的话为什么不去读读 mysql 的源码?你自己也说没读过源码,你造这个不就是想学点东西吗,读源码明显能学到更多,实在是想自己造,Mysql 都是模块化的,你可以考虑造一个 Mysql 的存储引擎啊,以后出去面试也可以吹逼也好说一些啊
    xieren58
        24
    xieren58  
       2019-09-30 18:24:37 +08:00
    都 9102 了, 不用 rust ?
    VDimos
        25
    VDimos  
       2019-09-30 18:33:51 +08:00 via Android
    那当然是 rust 咯,c 艹需要一定功力,golang 性能肯定不如 rust,毕竟还有 runtime。
    Kilerd
        26
    Kilerd  
       2019-09-30 18:51:40 +08:00
    自带 GC 的语言你应该不会去考虑如何节省资源,什么时候该释放资源,所以 rust 更加适合这个场景。

    BTW 广告来了 resource.rs
    iPhoneXI
        27
    iPhoneXI  
       2019-09-30 18:55:09 +08:00
    Mini 数据库是 kv 的还是 RDBMS
    感觉后者挺复杂的
    redis 这样的数据库源码还是很清晰的
    lolizeppelin
        28
    lolizeppelin  
       2019-09-30 19:02:17 +08:00
    不是应该参考 PG 然后用 C 么!
    ClarkAbe
        29
    ClarkAbe  
       2019-09-30 19:05:45 +08:00 via Android
    @90928yao #4 大多都是 json
    yamasa
        30
    yamasa  
    OP
       2019-09-30 19:18:37 +08:00 via Android
    @iPhoneXI 想做 rdbms
    ClericPy
        31
    ClericPy  
       2019-09-30 19:44:43 +08:00
    推荐 rust 的说的都挺在理的, 多考虑一下吧

    golang 槽点你先看一下能不能忍, 再决定要不要学, 不过 C 系基础学 go 入门也快

    话说没调研过已有轮子? 看看源码提升比自己瞎摸索要大
    yamasa
        32
    yamasa  
    OP
       2019-09-30 20:27:32 +08:00 via Android
    @ClericPy 是这样的 个人这几年的经验 感觉不带着问题看源码效率很低 往往是自己尝试实现的时候碰壁了 带着问题去看 就有豁然开朗的感觉。我也不是打算闷着头闭门造成,遇到问题肯定会去参考源码实现和一些论文的,感谢大佬。
    yamasa
        33
    yamasa  
    OP
       2019-09-30 20:28:13 +08:00 via Android
    谢谢几位推荐 rust 的老哥,会认真考虑的。
    Mirana
        34
    Mirana  
       2019-09-30 20:48:55 +08:00
    纠结的时间都可以写完了
    hourann
        35
    hourann  
       2019-09-30 21:22:04 +08:00 via iPhone
    搜一下 pingcap talentplan
    keith1126
        36
    keith1126  
       2019-09-30 21:34:49 +08:00
    @Mirana #34

    这个真写不完
    zhuyichen1017
        37
    zhuyichen1017  
       2019-09-30 22:29:50 +08:00
    开个 repo 我来 watch 一下
    activemq
        38
    activemq  
       2019-09-30 22:47:50 +08:00
    用 Java 搞一个吧,完全跨平台,一个 jar 包走天下
    Rorshach
        39
    Rorshach  
       2019-09-30 23:59:00 +08:00
    35 楼正解
    其实我感觉不用从头写一个的。。上个公开课多好,比如 35 楼,或者 CS186
    miaoever
        40
    miaoever  
       2019-10-01 04:40:51 +08:00
    推荐 CMU Introduction of database system, 课程课件和视频 https://15445.courses.cs.cmu.edu/fall2019/
    配套的作业 database in C++: https://github.com/cmu-db/bustub
    jhdxr
        41
    jhdxr  
       2019-10-01 12:49:40 +08:00
    写这种底层的要么 c/c++,现在多了 rust 这么一个选项 ref: https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/

    至于 go 或 java,写着自己当玩具也许还行吧
    arloor
        42
    arloor  
       2019-10-01 13:38:06 +08:00 via iPad
    肯定不能有 gc 的语言
    ruyuejun
        43
    ruyuejun  
       2019-10-01 13:41:13 +08:00
    想使用 C++的话,可以考虑 rust
    想追求快速出结构,可以考虑 go
    FrankHB
        44
    FrankHB  
       2019-10-01 16:15:58 +08:00
    实现一个数据库需要的技能和你粗体强调的东西没多少交集。
    先老实重新分析清楚需求。
    yulon
        45
    yulon  
       2019-10-01 17:33:18 +08:00
    需要纠结就用 Go,C++ 水平高的写起来完全比 Go 爽,根本不用考虑选谁,Go 现在也能写动态库,共享方面不用担心。
    reus
        46
    reus  
       2019-10-01 18:33:43 +08:00 via Android
    go 有 tidb 和 cockroachdb。
    rust 还没有。
    find
        47
    find  
       2019-10-01 20:45:46 +08:00 via iPhone
    我用过 java 写过数据库作业 在我 github 里面
    yuikns
        48
    yuikns  
       2019-10-01 23:05:10 +08:00
    @reus tikv 是 rust 写的。然后在此基础上用 go 写的事务
    yuikns
        49
    yuikns  
       2019-10-01 23:21:56 +08:00
    其实就是看目标。如果就是实现个 parser,学习一下 transaction 之类的。选择自己最熟悉的语言。用 python php 都行。

    如果是 rdbms 楼上居然没有人建议看看 sqlite ?单论代码我觉得那个写得挺好看的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2828 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:40 · PVG 22:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.