V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

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

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

    我需要

    • 调用 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 实现也很简单 加俩头文件就行
    chenqh
        12
    chenqh  
       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   ·   实用小工具   ·   2352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:52 · PVG 23:52 · LAX 07:52 · JFK 10:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.