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

哪种语言编写的程序转成可执行文件比较方便(exe / binary file) ?

  •  1
     
  •   aim467 · 2023-07-04 00:23:01 +08:00 · 13386 次点击
    这是一个创建于 509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想写一些小工具,主要是基于命令行上进行操作的工具,想问问大家哪个语言来写比较方便

    159 条回复    2023-11-16 08:53:20 +08:00
    1  2  
    pkoukk
        101
    pkoukk  
       2023-07-04 17:38:08 +08:00
    go 最合适,编译简单,产物体积小,跨平台交叉编译很容易
    beixiao
        102
    beixiao  
       2023-07-04 17:41:03 +08:00 via iPhone
    用下来还是 go 最方便
    nikenidage1
        103
    nikenidage1  
       2023-07-04 17:42:06 +08:00   ❤️ 1
    我发现 V2EX 上大家对 .net / c# 的信息很滞后
    .net / c# 现在完全可以做到跨平台、原生编译、无需运行时、冷启动快、占用内存低、单文件 exe 等等特性,且不需要什么特殊操作。

    可以参考我之前实验性写的跨平台带 UI 的小软件
    https://www.v2ex.com/t/952603
    someonedeng
        104
    someonedeng  
       2023-07-04 17:46:23 +08:00
    go , rust 学习成本高(已经会的话当我没说)
    monkeyWie
        105
    monkeyWie  
       2023-07-04 17:53:43 +08:00
    必然是 go 啊,交叉编译体积又小
    xz410236056
        106
    xz410236056  
       2023-07-04 18:22:38 +08:00
    golang 官方自带工具,转各个平台的 app ,单个程序,运行不要任何环境
    xz410236056
        107
    xz410236056  
       2023-07-04 18:25:36 +08:00
    @someonedeng #104 go 有啥学习成本。。3 分钟入门
    shyangs
        108
    shyangs  
       2023-07-04 18:27:52 +08:00   ❤️ 1
    tabtoy[1] 用 Golang 寫的,5MB.
    fd[2] 用 Rust 寫的,1MB.
    Locale Emulator[3] 用 C# 寫的,1MB.
    NoClose[4] 用 AutoHotkey 寫的,500KB.
    PageFileUsageMonitor[5] 用 VB6 寫的,60KB.


    [1] https://github.com/davyxu/tabtoy
    [2] https://github.com/sharkdp/fd
    [3] https://github.com/xupefei/Locale-Emulator
    [4] https://www.dcmembers.com/skrommel/download/noclose/
    [5] http://www.standards.com/ThisAndThat/PageFileUsageMonitor.html
    yanue
        109
    yanue  
       2023-07-04 19:02:00 +08:00
    推荐 node 的没有运行环境怎么跑?
    dw2693734d
        110
    dw2693734d  
       2023-07-04 21:50:22 +08:00
    go
    tangtang369
        111
    tangtang369  
       2023-07-04 22:17:47 +08:00
    go 肯定是最 ok 的 完全的跨平台 随便切换
    chrawsl
        112
    chrawsl  
       2023-07-04 22:22:52 +08:00   ❤️ 1
    c#大法好
    SenLief
        113
    SenLief  
       2023-07-04 22:24:21 +08:00
    小型的脚本直接撸 python ,python 自己用写起来小工具是真的舒服,如果是打包分享的,可能还是 golang 更好一些。
    RRRSSS
        114
    RRRSSS  
       2023-07-04 22:28:30 +08:00
    Go rust
    ViriF
        115
    ViriF  
       2023-07-04 22:35:46 +08:00
    https://github.com/vercel/pkg ( Nodejs ,个人体会很好用)
    https://pyinstaller.org/en/stable/ ( Python ,个人体会比较难受,尤其是涉及 Nvidia/LibTorch 等的库文件的时候,启动简直折磨,对硬盘空间也有要求)
    lhbc
        116
    lhbc  
       2023-07-04 23:13:12 +08:00 via Android
    为什么没人提 php ?
    lcj2class
        117
    lcj2class  
       2023-07-04 23:21:00 +08:00
    H0H
        118
    H0H  
       2023-07-05 02:34:18 +08:00
    @idealhs 你咋不直接说自己水平太差呢?做个 exe 小工具,就非要换个语言把现有提供各种库的生态完全抛弃?小工具写着写着要转成大工具持续维护了,此时需要各种功能时没有第三方库难道自己发明轮子? 99%的人真有能力发明轮子?

    C++写 exe 的确最适合,为什么市场占有率一直上不去?要不你继续吹吹?

    拿语言论高下的,不就是一个没入门的菜鸟嘛
    H0H
        119
    H0H  
       2023-07-05 02:40:19 +08:00
    @lujiaxing 我做的启动器是支持自动下载并安装特定版本的 JRE 的,这样 exe 程序本身就可以保持的很小,一般都小于 20M ,在大公司就可以通过邮件直接分享。winrar 自解压包怎样轻松实现这个功能?

    更不用说,启动器还可以实现 Mutex 单进程运行功能,程序执行过程中被二次启动时可以直接拒绝运行,一般定时任务中很适合。还可以监控最大运行时间等等。
    H0H
        120
    H0H  
       2023-07-05 02:43:10 +08:00
    @c3de3f21 拿各种编程语言论高低的,不就是没入门的菜鸟嘛,怎么好意思求别人?要不你吹吹高大上的?是不是非要 C++写一下才显水平? Electron 这种 js 开发套个 Chrome 浏览器的,比 JRE 还低效,但迅雷用起来也没感觉有多么难以接受啊,要不你来批评批评?
    GeruzoniAnsasu
        121
    GeruzoniAnsasu  
       2023-07-05 02:55:44 +08:00   ❤️ 1
    @H0H
    > 支持自动下载并安装特定版本的 JRE 的,这样 exe 程序本身就可以保持的很小,一般都小于 20M

    你有没有想过……
    H0H
        122
    H0H  
       2023-07-05 02:57:22 +08:00   ❤️ 1
    @LeeReamond 的确,什么语言都能写写小工具,我有些现在还在跑的小工具,就是 win32asm 汇编写的。但这类工具做不大,如果将来做着做着小工具需要转为大工具持续开发,那汇编、C 、C++、Qt 这类用起来就很麻烦。主要缺失的就是生态里面的各种第三方库。招人也很难。这类语言市场一直做不大,本就证明了这一点。

    如果做一个小工具就不再维护了,那的确什么语言都行。C 这类麻烦的就用 Python 或 Go 这类更新的语言。但如果一个小工具打算用几十年(我自己用汇编写的小工具都有 10 年的历史了,至今还在用,而且在 windows 11 ARM 版验证过,也能自动被转译执行),那技术选型选来选去,最终就会发现还是 Java 这类市场占有率最大的语言最省事。想做成桌面版轻轻松松搞定,想改成 Web 版在服务端运行也很容易,想支持三大桌面操作系统也不需要重新开发,又有最完善的生态,需要什么都有第三方库。而 C/C++/Python/Go 这类,如果要求也这么高,那它们还真是搞不定。

    至于不会打 exe ,这明显是技术水平问题。至于说程序包太大,Electron 也不小啊,迅雷这种不就在用嘛。更不用说,手机上的 App ,现在随便一个都轻轻松松几百 M ,一个 Java 带 JRE 也是几百 M 的桌面版小工具还有什么不能接受的?

    当然,Java 是泛指,不是特指。我的意思就是说应该尽可能选择市场占有率最高的语言及其生态来开发 exe 小工具。可能基于 js 的也行,只不过我没有足够踩坑经验,而我在 Java 踩坑够了,所以对我来说就选了后者。

    所以这是一个小马过河的故事,无非就是看站在哪个层面看需求了。
    H0H
        123
    H0H  
       2023-07-05 02:59:20 +08:00
    @GeruzoniAnsasu #121 ,实在不懂的话可以不评论。
    owt5008137
        124
    owt5008137  
       2023-07-05 03:01:39 +08:00 via Android
    golang ,rust
    GeruzoniAnsasu
        125
    GeruzoniAnsasu  
       2023-07-05 03:03:52 +08:00
    @H0H 一个猜想,不一定对,你阿里 P7

    我想我很委婉了。
    iseki
        126
    iseki  
       2023-07-05 03:42:27 +08:00
    Go ,或者 (Java|Type)Script 然后用 deno compile 打包成 exe······
    zjsxwc
        127
    zjsxwc  
       2023-07-05 06:55:31 +08:00 via Android
    @lhbc
    kphp 生成的独立二进制可执行文件,也可以推荐。
    zjsxwc
        128
    zjsxwc  
       2023-07-05 06:57:18 +08:00 via Android
    zjsxwc
        129
    zjsxwc  
       2023-07-05 06:58:26 +08:00 via Android
    @zjsxwc 但本质上 kphp 是 c++,需要对 c++有一定的了解。
    hez2010
        130
    hez2010  
       2023-07-05 08:09:53 +08:00 via Android   ❤️ 1
    要不试试 bflat ,go 工具链体验版本的 c#,默认就是 nativeaot ,既具备交叉编译同时类库还比 go 丰富得多,出来的体积还比 go 更小。
    既然是命令行工具那也就没有什么所谓的 nativeaot 限制,基本想咋用就咋用。
    其实就算是 gui 应用你拿 avalonia 写照样不存在限制,人家原生就支持 nativeaot 。
    hez2010
        131
    hez2010  
       2023-07-05 08:11:31 +08:00 via Android
    arfaWong
        132
    arfaWong  
       2023-07-05 08:29:24 +08:00
    @nikenidage1 go 能编译出来只有一个 exe 文件,但是你的小软件除了 exe 还有 dll 文件。
    hez2010
        133
    hez2010  
       2023-07-05 08:40:36 +08:00
    @arfaWong 那是 Google ANGLE 的 dll ,虽然可以静态链接进去但是作者没这么做。
    chengxiao
        134
    chengxiao  
       2023-07-05 08:52:17 +08:00
    golang 不需要特别的设置,只要不涉及 cgo,写出来直接用交叉编译,跨 win/mac/linux 跨 x86/arm64 都可以,而且不需要在特定平台下编译,可以直接在 x86 编译 arm64 可以在 win 下编译成 mac 的可执行文件
    Alias4ck
        135
    Alias4ck  
       2023-07-05 08:57:43 +08:00
    小众语言 vlang !!!
    wulili
        136
    wulili  
       2023-07-05 09:00:13 +08:00   ❤️ 1
    肯定是 C#呀,结合宇宙第一 IDE Visual Studio ,直接一键打包发布成各个平台的可执行文件
    都不需要去折腾什么编译环境了
    Corybyte
        137
    Corybyte  
       2023-07-05 09:17:54 +08:00
    @westoy golang 大法好
    xingjue
        138
    xingjue  
       2023-07-05 09:44:59 +08:00
    必须 golang 大法
    githmb
        139
    githmb  
       2023-07-05 09:54:28 +08:00
    必须 Rust ,cargo 那么多库,不香?
    nikenidage1
        140
    nikenidage1  
       2023-07-05 10:11:03 +08:00
    @arfaWong 啊,因为我这是 ui ,所有有点依赖的 dll ,如果是命令行就一个文件。再者,应该也可以链接进去
    yiling1995
        141
    yiling1995  
       2023-07-05 10:12:43 +08:00   ❤️ 1
    C#大法好,直接选择 Net7 支持跨平台。
    c3de3f21
        142
    c3de3f21  
       2023-07-05 10:40:47 +08:00
    @H0H 嗯,我确实菜,坐看阁下舌战群儒。
    lmw2616
        143
    lmw2616  
       2023-07-05 10:45:20 +08:00
    @H0H java 就算了吧
    mxT52CRuqR6o5
        144
    mxT52CRuqR6o5  
       2023-07-05 10:49:35 +08:00 via Android
    Python 也有办法打包成可执行文件,主要看你自己的技术栈吧
    qfdk
        145
    qfdk  
       2023-07-05 13:13:46 +08:00 via iPhone
    @yanue pkg...
    qfdk
        146
    qfdk  
       2023-07-05 13:16:47 +08:00 via iPhone
    @ViriF pkg 有些库没法打包, 不得不删依赖 改代码. 比如 mongo-session 或者最新的 axios 这样的
    Trim21
        147
    Trim21  
       2023-07-05 13:22:25 +08:00 via Android
    @qfdk pkg 好像还不支持 esm 吧…
    qfdk
        148
    qfdk  
       2023-07-05 13:25:06 +08:00 via iPhone
    @Trim21 对 不支持. prisma 支持也不行 最后换成 mongoose
    ViriF
        149
    ViriF  
       2023-07-05 13:39:30 +08:00
    @qfdk #146 这个我还真不知道,我自己用它打包过几次服务端带静态资源还挺顺利的;去看了 pkg 的 issue 好像确实有些打包不是开箱即用,这要是遇到就难受了
    Trim21
        150
    Trim21  
       2023-07-05 13:47:38 +08:00
    @qfdk prisma 生成的客户端里有二进制 dll
    Masoud2023
        151
    Masoud2023  
       2023-07-05 13:50:40 +08:00
    如果你不想被强制要求 runtime

    1. Golang
    2. Rust
    3. Python + PyInstaller
    4. cpp

    如果你觉得拖个 runtime 也没啥问题

    1. .net core 全家桶(比如 csharp )( windows 太低要.net CLR )
    2. Java (别做梦了,怎么弄 Java 不都得挂个 jvm )
    3. Electron (挂个 Chrome )

    如果要跨平台:Golang 、Rust

    如果要跨平台 GUI:Electron 、Rust+Qt ?
    qfdk
        152
    qfdk  
       2023-07-05 14:01:12 +08:00
    @Trim21 #150 我是打 linux 上面的,因为他们的 package.json 里面缺个版本号还是啥来着看了一眼,放弃了 不折腾完活要紧 哈哈哈哈
    muxueqz
        153
    muxueqz  
       2023-07-05 14:17:36 +08:00   ❤️ 1
    nim-lang 语法简单,编译快速,还可以结合 cosmopolitan 一次编译,跨平台运行
    bugmaker233
        154
    bugmaker233  
       2023-07-05 15:46:41 +08:00
    如果考虑 win 平台,貌似 visual studio 还不错,什么语言都可以支持,直接打包 exe 也不会有太多坑。跨平台或者 UI 要求多可以 QT ,但是 qt 只能用 c++,而且 qt 大又难用
    eoo
        155
    eoo  
       2023-07-05 22:29:07 +08:00
    PHP yyds
    lightwell
        156
    lightwell  
       2023-07-06 12:41:36 +08:00
    @yanue pkg 打包,不需要运行环境。
    someonedeng
        157
    someonedeng  
       2023-07-06 16:50:09 +08:00
    @xz410236056 我断句问题,rust 成本高
    talkischeap567
        158
    talkischeap567  
       2023-11-02 08:53:25 +08:00
    @shyangs 建议直接开源,然后弄成乱码论文,采纳.
    Conantv2
        159
    Conantv2  
       2023-11-16 08:53:20 +08:00
    @H0H 实践出真知,我必须说,写命令行交互的 exe 确实是 golang 简单。我没写过 golang ,昨晚我边查语法边写脚本,几十分钟就成功写出来并且成功打包 exe 可执行文件。同样是新人学 java 的话,一个小时怕是 IDE 都还没装好吧。😁


    @SenLief 认同,有 python 环境的写 python ,打包 exe 写 golang 。昨晚我就踩坑了,先用 python 写,写好了打包 exe 体积吓死人,换 golang 瞬间变迷你,舒服了。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.