求推荐一个技术选型(编程语言) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX    问与答

求推荐一个技术选型(编程语言)

  •  
  •   zxCoder 2021-07-02 16:28:26 +08:00 2739 次点击
    这是一个创建于 1596 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要

    • 调用 c 语言写的动态库
    • 调用一些可执行文件或者一些 linux 命令
    • 提供几个简单的 http 接口,就包括了几个简单的处理逻辑
    • 希望最后的程序也能编译成单个可执行文件

    我知道基本上任何语言都能实现这个功能,只是想问一下有没有相对比较好的,写起来方便一点

    我自己的考虑:

    • C:动态库是自己写的,用 C 写这个服务就完全不用考虑其他,可以直接耦合在一起,不过提供 http 接口有点头疼,昨天发帖求了几个,看起来还是挺难写的
    • Python:python 我记得调用动态库,执行命令啥的应该挺方便的,就是一行代码,不过不清楚能否编译成单个可执行文件,等下查查
    • Golang:不太熟悉,只知道可以编译成一个可执行文件,因为语法不太喜欢,可能放在最低的优先级了
    • Java/C#:这两个很像,C#调用动态库简单很多,也能编译成单个可执行文件,就是感觉有点大,这个小应用希望能用脚本语言搞定 ...

    其他的不太熟悉了,大佬们有什么建议吗

    22 条回复    2021-07-03 18:24:53 +08:00
    ipwx
        1
    ipwx  
       2021-07-02 16:30:02 +08:00
    python 提供 http 接口是所有语言里面最简单的了基本上。

    以下挑一个:

    fastapi
    flask
    ysc3839
        2
    ysc3839  
       2021-07-02 16:51:13 +08:00 via Android
    golang 吧,因为默认就是编译成单个可执行文件,也有自带的 http server library 。
    ysc3839
        3
    ysc3839  
       2021-07-02 16:55:06 +08:00 via Android
    不然的话就 C++ 或 Rust,C++ 也有一些好用 http server library 。
    Jirajine
        4
    Jirajine  
       2021-07-02 17:11:53 +08:00 via Android
    py 或者 deno
    luooooob
        5
    luooooob  
       2021-07-02 19:45:02 +08:00
    c 写的服务直接写个 nginx module 就好了,简单的东西就不要折腾什么跨语言调用了。
    Cbdy
        6
    Cbdy  
       2021-07-02 20:52:12 +08:00
    当然是选 Node.js 啦
    GeruzoniAnsasu
        7
    GeruzoniAnsasu  
       2021-07-02 20:56:16 +08:00
    > 调用 c 语言写的动态库
    > 希望最后的程序也能编译成单个可执行文件
    > 简单的 http 库


    没错就是 golang,而且基本没什么会绕远路的可能性,动态库把头文件拷过来.go 里加几行注释就能链接上(前提是不用 dlsolve )
    lujjjh
        8
    lujjjh  
       2021-07-02 20:59:19 +08:00
    推荐用 Go 。Go 调 C 非常方便,写 HTTP server 也非常方便,也能生成单独的可执行文件。

    其次是用 C,如果 HTTP 接口没有高并发需求,写个 CGI 还是很容易的,外面套一个 nginx 或者其他 web server 。git 的 HTTP 接口就是这么玩的,可以参考: https://github.com/git/git/blob/670b81a890388c60b7032a4f5b879f2ece8c4558/http-backend.c#L739
    3dwelcome
        9
    3dwelcome  
       2021-07-02 21:00:08 +08:00
    "不过提供 http 接口有点头疼,昨天发帖求了几个,看起来还是挺难写的"

    用 apache cgi 真心简单。

    三个步骤

    1 写一个 hello world 控制台 C 程序,用 gcc 编译成 elf 文件。
    2 改后缀为.cgi
    3 放到服务器上的 cgi-bin 目录下,用当成正常的 http get 请求访问,apache 会自动把你的 C 代码输出,转换成 web 的返回格式。
    3dwelcome
        10
    3dwelcome  
       2021-07-02 21:14:33 +08:00
    从头写 web 服务不难,http1.1 协议相对还是很容易的。

    但有两点问题,一是现在网络基本都是 https,套一层 SSL 中间层是比较麻烦事的,一般全一点的安全库都不太小,还要加载服务器域名证书之类的。

    还有一点就是对于服务器监控的访问,最好的协议不是 http get/post 短连接,而是 websocket 这种长连接,能实时看到服务器推送的 CPU/内存 /进程运行状态的东西。
    BiteTheDust
        11
    BiteTheDust  
       2021-07-02 22:52:56 +08:00
    c 语言其实轻量的 http 实现也很简单 加俩头文件就行
    simple2025
        12
    simple2025  
       2021-07-02 23:24:12 +08:00
    要单个可执行文件,估计只能 golang 了吧
    hronro
        13
    hronro  
       2021-07-02 23:40:24 +08:00
    Rust 吧,无痛调用 C ( C 也可以无痛调用 Rust ),其他几个条件也能满足。说 Go 调用 C 非常方便的还是省省吧。

    上个 Web 框架比如 Rocket 之类的,实现起来应该很简单。
    agagega
        14
    agagega  
       2021-07-03 00:02:53 +08:00 via iPhone
    我说一个别人不敢说的,Swift (逃

    静态语言,语法舒适(比 Go 特性多,比 Rust 好上手),没有 GC,可以编译到单个可执行文件,性能还行,而且和 C 混编不麻烦。缺点是对 Windows 兼容比较差
    0o0O0o0O0o
        15
    0o0O0o0O0o  
       2021-07-03 00:06:16 +08:00 via iPhone
    zig
    lujjjh
        16
    lujjjh  
       2021-07-03 00:14:11 +08:00
    @hronro 没必要踩一捧一,cgo 调 C 跟 Rust 的 FFI 调 C 的体验区别不大。

    我理解很多人觉得 Rust 很香,但是考虑到 Rust 的学习曲线,推荐给一个零基础、想要快速实现功能的人是不理智的。对 C 比较熟悉的话,直接用 C 写或者学跟 C 很像的 Go 是最快的。
    voiyy
        17
    voiyy  
       2021-07-03 08:56:20 +08:00
    nim 、vala
    signalyc
        18
    signalyc  
       2021-07-03 10:04:37 +08:00
    PHP
    zhuzongxing
        19
    zhuzongxing  
       2021-07-03 10:29:12 +08:00
    看你自己主力语言啊。。。
    learningman
        20
    learningman  
       2021-07-03 10:50:46 +08:00 via Android
    go,py 不好编译成单个文件
    cs8425
        21
    cs8425  
       2021-07-03 12:49:17 +08:00
    除了 go, 再提一个: C#
    个人没试过, 但是调用动态库应该没啥问题
    参考:
    stackoverflow is-there-a-linux-equivalent-of-dllimport-in-net-core
    stackoverflow p-invoke-to-dynamically-loaded-library-on-mono
    (不知为啥直接贴网址要认证才给发
    Hconk
        22
    Hconk  
       2021-07-03 18:24:53 +08:00
    建议 C++吧,既然会写 c,把 C++当 C with class 用几乎没有学习成本,再用个 header only 的 http 库,实现起来也很简单,你提的这些用 Go/Rust 或者别的实现肯定没有问题,不过从工作的角度不建议你选,你们公司如果没人熟悉这些语言建议不要用,小众语言后期你想交给别人开发维护很难交出去,这种一有问题只能找你维护的小东西积累多了后面有你难受的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2521 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 05:02 PVG 13:02 LAX 21:02 JFK 00:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86