V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aim467
V2EX  ›  程序员

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

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

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

    159 条回复    2023-11-16 08:53:20 +08:00
    1  2  
    westoy
        1
    westoy  
       2023-07-04 00:26:56 +08:00   ❤️ 24
    golang 大法好
    alexapollo
        2
    alexapollo  
       2023-07-04 00:32:46 +08:00   ❤️ 1
    我觉得写小工具可能还真是 https://github.com/geekan/MetaGPT 这个比较方便……
    H0H
        3
    H0H  
       2023-07-04 00:40:13 +08:00   ❤️ 3
    Java 这类最通用的跨操作系统的语言就可以。然后用 Native 语言给写个启动器来找到 JRE 后将相关参数传进去启动即可,Windows 下面我用汇编语言写了启动器,你可以选择用 Visual Studio 下的 C++来写这个启动器; macOS 下我就用那个 Swift 写了启动器。

    其实只要你会用 native 语言来写这个启动器,那么各种编程语言都能制作成一个单独的 exe 文件。只不过一般人不会要求全部合并成一个 exe 文件,都是一个 exe 文件带很多 dll 或 jar 包等。

    比如 Java 写的程序非要合并成一个 exe ,那么就可以将 JRE 、Jar 包作为资源文件放到启动器那个 exe 中,这样就变成了一个单独的 exe 程序。启动器启动后,将 JRE 、jar 包释放到临时目录运行就行了。
    Trim21
        4
    Trim21  
       2023-07-04 00:44:37 +08:00
    golang ,交叉编译很方便。
    LeeReamond
        5
    LeeReamond  
       2023-07-04 00:46:10 +08:00   ❤️ 8
    @H0H 你这个方法要是算简单的话那大部分语言都挺简单。。。小工具+好编译成二进制=go 或者 rust
    jackmod
        6
    jackmod  
       2023-07-04 00:50:49 +08:00
    能够比较简单制造 exe 的话估计只有 golang 和 rust 了,不过 linux 下的 rust 需要使用 musl 达到 static
    fbichijing
        7
    fbichijing  
       2023-07-04 01:09:46 +08:00
    你提出的问题和描述似乎不太相同啊。

    如果是 exe 的话不是基本上圈定 C, C++ 了吗?独立的可移植的 exe 文件。

    如果是基于命令行进行操作的工具,那我觉得使用 python 写命令行是十分舒服的。
    写成一个 package ,自定义喜欢的全局命令,只要存在 python 环境自己安装一下就能全局使用了。现在的服务器基本上都预装有 python ,所以就像是写一次可以各个地方运行了。

    因为平时经常有这需求,而这种全局命令的文件格式又十分固定。所以我写成一个十分简单的 package 放在 pypi 上,方便自己使用......用来方便自己构建全局命令。

    ------
    以下只是我自己平时的使用方式,因为自己写的这个 package 很简单,只是作为举例之用。

    pip install package-gen

    然后提供了一个全局命令:pk-gen

    比如:
    pk-gen mytest

    就生成一个 package 的模板,往里面定义自己想要的全局命令,然后将实现代码敲出来就行了。比起去弄 gui ,全局命令这方面写起来就很舒服。
    Trim21
        8
    Trim21  
       2023-07-04 01:12:30 +08:00
    之前写了个一百来行的命令行程序,用 goreleaser 编译然后发布,goreleaser 的默认设置已经完全能满足你的这个需求了

    https://github.com/trim21/try
    Licsber
        9
    Licsber  
       2023-07-04 01:14:16 +08:00
    我的设备同时有 linux bsd mac win 所以我的小工具包已经成 python 改成 golang 了
    非常方便改下 GOOS 就能换系统 改 ARCH 就能换架构
    目前工具类型涵盖了文件元信息计算、文件夹统计、去重、获取微信 token 、快捷打印、检测电脑是否摸鱼(空闲微信提醒)等
    Licsber
        10
    Licsber  
       2023-07-04 01:16:36 +08:00
    @Trim21 #8 哈哈哈 当时也有这个需求
    然后学着 shell 写了个 判断 $? -eq 0 自动重试的 function
    看来大家都遇到过这样的问题
    kljsandjb
        11
    kljsandjb  
       2023-07-04 01:21:10 +08:00 via iPhone
    Rust 挺合适的
    u823tg
        12
    u823tg  
       2023-07-04 01:25:27 +08:00
    为啥一定要 exe 之类二进制文件呢, 小工具还是命令行不是脚本语言最好用吗,随时更改的。
    aa51513
        13
    aa51513  
       2023-07-04 01:26:53 +08:00 via Android
    @kljsandjb 用 Rust 进行 GUI 编程,真的一言难尽,装开发环境都能磨死人
    Al0rid4l
        14
    Al0rid4l  
       2023-07-04 01:28:11 +08:00   ❤️ 1
    生态上 go rust, 很多 tui 以及其他 cli 相关的库, c/c++ 生态不用说, 但是和方便不搭边

    产物体积小且快, rust zig

    方便且跨平台, go rust c# zig, 后面两个生态差点, 综上 go rust

    java graalvm 应该也可以, 没用过
    lhbc
        15
    lhbc  
       2023-07-04 01:34:03 +08:00 via Android
    golang 最佳
    别用 cgo
    wxf666
        16
    wxf666  
       2023-07-04 02:39:57 +08:00
    你给点工具的应用场景出来呗?

    比如,音视频处理?文本处理?结构数据处理?……
    shuimugan
        17
    shuimugan  
       2023-07-04 03:09:38 +08:00 via Android
    c sharp(aot 编译)
    javascript/typescript(deno 或者 pkg)
    dart 类似 ts 的语法
    MrKrabs
        18
    MrKrabs  
       2023-07-04 03:11:06 +08:00
    zig rust swift
    crab
        19
    crab  
       2023-07-04 03:52:40 +08:00
    bat
    zsj1029
        20
    zsj1029  
       2023-07-04 05:50:03 +08:00 via iPhone
    Dart 发布二进制自带虚拟机,类似 Java
    GPLer
        21
    GPLer  
       2023-07-04 07:42:29 +08:00 via Android   ❤️ 2
    只有 C ,其他都不方便。
    https://justine.lol/ape.html
    https://github.com/jart/cosmopolitan
    基于 cosmopolitan 编译的 C 能做到二进制跨平台运行
    fyq
        22
    fyq  
       2023-07-04 07:43:49 +08:00
    那显然是 C
    kljsandjb
        23
    kljsandjb  
       2023-07-04 07:57:52 +08:00 via Android
    @aa51513 是的,这方面生态还是太不成型了
    musi
        24
    musi  
       2023-07-04 08:13:49 +08:00 via iPhone   ❤️ 3
    第一次见到写小工具用 Java 的,那不得打一个 jre 放包里,小而美?
    snw
        25
    snw  
       2023-07-04 08:25:00 +08:00 via Android
    VB6 ?
    placeholder
        26
    placeholder  
       2023-07-04 08:25:15 +08:00
    那你还不如用 nodejs 写 cli 呢
    yazinnnn
        27
    yazinnnn  
       2023-07-04 08:35:39 +08:00
    java 写个 hello world, aot 之后都有 11M, 咋做小工具哦...
    cozof
        28
    cozof  
       2023-07-04 08:36:14 +08:00 via iPhone
    golang 啊。你看我不费吹灰之力就把 go 写的小工具打包了各平台的几十个可执行文件。 https://github.com/qcozof/portsman/releases
    LeegoYih
        29
    LeegoYih  
       2023-07-04 08:41:42 +08:00
    考虑到逆向的话,还是别选解释型语言和 Java 了
    xgdgsc
        30
    xgdgsc  
       2023-07-04 08:42:01 +08:00
    体积小 rust go 最方便。不嫌体积大(500M),从简洁的动态脚本写起,Julia 用 https://comonicon.org/stable/ https://julialang.github.io/PackageCompiler.jl/dev/ 也可以, 参考 https://github.com/ninjaaron/administrative-scripting-with-julia
    lsk569937453
        31
    lsk569937453  
       2023-07-04 08:45:36 +08:00
    写命令行还得是 golang/rust,不接受反驳!
    bthulu
        32
    bthulu  
       2023-07-04 09:02:56 +08:00   ❤️ 1
    当然是.net 了, 直接支持打包成单文件
    recolic
        33
    recolic  
       2023-07-04 09:08:15 +08:00 via Android
    @u823tg 如果是要给别人用的程序,用脚本语言写的话,小白会追在你屁股后面说环境有问题/出错了/跑不了,烦死人。
    gimp
        34
    gimp  
       2023-07-04 09:09:57 +08:00
    首推 Golang ,其次 Rust
    a33291
        35
    a33291  
       2023-07-04 09:11:35 +08:00
    推荐 rust 或者 go,主要是交叉编译跨平台特性,cli 比较合适

    .net 和 java 就别掺和了,丢脸
    tool2d
        36
    tool2d  
       2023-07-04 09:17:42 +08:00
    看程序的复杂程度了,我是觉得 C 好,因为你倒退个 10 ~ 30 年,github 上的代码大部分核心算法,都是用 C 写的,随时可以抄作业。

    如果程序很简单,那 nodejs 写写也可以,任何语言都可以。
    jiulang
        37
    jiulang  
       2023-07-04 09:20:06 +08:00   ❤️ 1
    @a33291 你这么说会把自己的脸打了的。.net 能生成多平台的单文件,也能 aot 编译成多平台的二进制文件
    a33291
        38
    a33291  
       2023-07-04 09:26:01 +08:00
    @jiulang #37 好多语言都能,还能搞 AI 呢,那咋不把 python 都换成 C#?每个语言在特定场景下有其擅长和优势,不要混淆概念和扩大范围.
    你想说 C#和 java 很好没问题,但是前置场景也要考虑.
    java 和.net 的 AOT 就算非常成熟(况且目前还不够成熟)也不过是现在 rust 的 native 水平

    所以,能不能和谁合适,是要看场景的
    nikenidage1
        39
    nikenidage1  
       2023-07-04 09:28:58 +08:00
    @a33291 纯请教,rust 的 native 水平是啥意思啊?
    我前两天用 C#写了一个跨平台原生编译 aot 的 ui
    https://www.v2ex.com/t/952603

    命令行当然也没问题
    a33291
        40
    a33291  
       2023-07-04 09:36:40 +08:00
    @nikenidage1 #39 抱歉我可能没表达清楚,每个语言都有他的特色和优势

    是这样,就是.net 和 java 都带有 runtime,c/c++/rust 不带,编译就是针对特定平台的产物(win 就是 dll 或 exe),他们 aot 之后的确也不需要安装环境(但是本质上还是内嵌了一个 runtime),通过裁剪等可以减少 aot 的大小达到性能和大小的平衡(也见过使用极限手段优化 aot 大小的,但是并不是开箱即用),但是总是需要付出更多努力的
    zysuper
        41
    zysuper  
       2023-07-04 09:39:17 +08:00
    golang
    c2const
        42
    c2const  
       2023-07-04 09:44:45 +08:00
    小工具,C/C++最舒服、win 平台还可以 C#。
    ----------------------------------------
    go 、java 、python 、js 也可以。
    但是 go 写小工具可能误报毒,java 、python 、js 都有打包或者 AOT 编译到 exe ,但体积大。
    选个熟悉的语言写就行,别想那么多。
    nikenidage1
        43
    nikenidage1  
       2023-07-04 09:47:42 +08:00
    @c2const
    @a33291 您看看我上面这个
    C#写的, 带 UI ,跨平台,原生编译,不需要运行时,体积 20 几 M ,很简单,没啥操作手段
    mscorlib
        44
    mscorlib  
       2023-07-04 09:49:42 +08:00
    跨平台:
    首选 golang
    次选 rust
    然后是 java 、.net

    如果仅 windows 的话首选 C#,winform
    xiangyuecn
        45
    xiangyuecn  
       2023-07-04 09:50:07 +08:00
    “主要是基于命令行上进行操作的工具”,干脆直接写命令行脚本得了😂

    参考我的一个 Java 开源库,也是命令行里面调用测试的,文件直接在根目录裸奔,给 windows 写了个.bat ,linux macos 写了个.sh ,脚本写法基本上都是通用的

    高性能的省市区坐标数据、边界数据查询工具,Java 开源程序、内置 http 查询接口,内存占用低( 1 秒可查 1 万个以上坐标对应的城市信息): https://github.com/xiangyuecn/AreaCity-Query-Geometry
    zjsxwc
        46
    zjsxwc  
       2023-07-04 09:55:11 +08:00
    虽然但是,既然 java jre 加个起动器都可以,
    那么,javascript node 加个起动器也可以。
    liantian
        47
    liantian  
       2023-07-04 10:02:11 +08:00 via iPhone   ❤️ 1
    这种讨论毫无意义啊…

    用最熟悉的语言搞就完事了…

    我们这一堆运维脚本是 js 的,挂 node 跑,原因无他,写脚本的大佬以前是个前端 js 大佬…
    ljsh093
        48
    ljsh093  
       2023-07-04 10:20:20 +08:00
    @aa51513 #13 rust 的 gui 跟闹着玩一样
    c3de3f21
        49
    c3de3f21  
       2023-07-04 10:23:03 +08:00
    @H0H 别 java 了求求了
    c3de3f21
        50
    c3de3f21  
       2023-07-04 10:23:46 +08:00
    就用 C 写最好
    BingoXuan
        51
    BingoXuan  
       2023-07-04 10:27:08 +08:00
    python ,用 py2app 或者 pyinstaller 打包,配合 dearpygui 这类 imgui 可以很快出效果
    billzhuang
        52
    billzhuang  
       2023-07-04 10:27:19 +08:00
    golang 的 exe 容易被 windows defender 报毒
    wu67
        53
    wu67  
       2023-07-04 10:27:31 +08:00   ❤️ 1
    上来就整 Java, 我上着班呢, 差点笑死
    GiantHard
        54
    GiantHard  
       2023-07-04 10:33:49 +08:00
    用最熟悉顺手的编程语言就好了,先把工具写出来,再考虑优化。
    thin0
        55
    thin0  
       2023-07-04 10:40:32 +08:00
    @xgdgsc 我还以为 golang 写的东西几兆几兆的已经够大了😂,没想到还有几百兆的? golang 的生成物体积能到 kb 级别就好了
    westoy
        56
    westoy  
       2023-07-04 10:46:03 +08:00
    @thin0

    strip && upx 大法好
    thin0
        57
    thin0  
       2023-07-04 10:54:37 +08:00
    @westoy 加壳了就更容易报毒了,我使用场景对体积和是否报毒这块要求比较高,所以不想用 c/c++折中的方式之前去入门了 rust ,哈哈
    beyondex
        58
    beyondex  
       2023-07-04 10:54:59 +08:00   ❤️ 2
    c#写起来很舒服啊。也能发布成单 exe 文件。跨平台等等。
    shijingshijing
        59
    shijingshijing  
       2023-07-04 10:56:11 +08:00
    Java 可拉倒吧,还得装个 JRE ,命令行+小工具+跨平台,再考虑到开发难度和速度,Python 和 Qt 是最合适的,Python 有一键打包成 exe 的工具。
    idealhs
        60
    idealhs  
       2023-07-04 11:05:12 +08:00
    @H0H JAVA 仔特有的 Native 气质
    idealhs
        61
    idealhs  
       2023-07-04 11:08:17 +08:00
    如果只是个 CLI 程序,anything except JAVA ,但是我推荐用 python 来节约你的生命
    如果一定需要打包二进制,C ,C++, C#, GO, RUST
    Tanix2
        62
    Tanix2  
       2023-07-04 11:08:55 +08:00 via iPhone
    rust 写命令行工具方便
    fengjianxinghun
        63
    fengjianxinghun  
       2023-07-04 11:09:06 +08:00
    java c# 脚本仔就别来趟 native 浑水了,写点 web 不挺好的么?
    xqdoo00o
        64
    xqdoo00o  
       2023-07-04 11:09:13 +08:00
    毫无疑问,go ,配个环境变量就能交叉编译的快感,其他还要配置工具链的语言没法比。
    次选 rust 。
    说 java 和 c#的是在扯淡,谁写个小工具还会带个 jre 和.net 跑,用 aot 更是麻烦。
    Tink
        65
    Tink  
       2023-07-04 11:09:39 +08:00
    rust 和 go 吧
    idealhs
        66
    idealhs  
       2023-07-04 11:10:04 +08:00   ❤️ 2
    @a33291 #35 有没有可能.net 的原生编译不依靠打包 runtime 呢,丢人前可以先 google 下避免尴尬的
    virusdefender
        67
    virusdefender  
       2023-07-04 11:12:02 +08:00
    首选 go ,还有一个上面没人说过,我也没用过的 kotlin native 也许可以
    2NUT
        68
    2NUT  
       2023-07-04 11:52:13 +08:00
    必然是 c
    veike
        69
    veike  
       2023-07-04 11:52:59 +08:00 via Android
    @H0H 你太幽默了😁
    wonderfulcxm
        70
    wonderfulcxm  
       2023-07-04 11:55:53 +08:00
    人家没有说要移植,要跨平台,只要容易转可执行文件,楼上某些哥们的戏是不是有点多?😂
    yanmu6626
        71
    yanmu6626  
       2023-07-04 11:59:47 +08:00
    Windows 上开发 rust ,跨平台方便吗?
    imicksoft
        72
    imicksoft  
       2023-07-04 12:18:04 +08:00
    windows 推荐 aardio ,真的方便
    superchijinpeng
        73
    superchijinpeng  
       2023-07-04 12:20:58 +08:00
    c 、c++、rust 、go
    dobelee
        74
    dobelee  
       2023-07-04 12:26:14 +08:00 via iPhone
    c++ c# go
    qistchan
        75
    qistchan  
       2023-07-04 13:07:07 +08:00
    VB😂
    lujiaxing
        76
    lujiaxing  
       2023-07-04 13:10:38 +08:00
    @musi 那多简单. 直接用 WinRAR 打一个 Self-Extract Package 加几个 post extract command 就可以了 (
    lujiaxing
        77
    lujiaxing  
       2023-07-04 13:12:36 +08:00   ❤️ 2
    @fengjianxinghun 怎么就是蹚浑水了?? .NET 做不了 AOT 编译是咋地?
    mohumohu
        78
    mohumohu  
       2023-07-04 13:13:47 +08:00
    go 吧,rust 跨平台静态编译没这么方便
    ql562482472
        79
    ql562482472  
       2023-07-04 13:17:57 +08:00
    我目前也有一个需求要做成原生的 cli 工具
    我用 java 的 org.graalvm.buildtools.native-maven-plugin 这个插件 AOT 的,还行其实,但是包会变得巨大,大小基本在所有依赖包的总和的水准上了。
    同时 JNI 的调用还是会有问题。
    另一个就是打包时间稍长了些。
    lujiaxing
        80
    lujiaxing  
       2023-07-04 13:21:38 +08:00
    @H0H 你还不如直接用 WinRAR / 7-Zip 打一个自解压 EXE 文件算了.
    ggvoking
        81
    ggvoking  
       2023-07-04 13:25:45 +08:00
    首选 golang ,go 写起来真的舒服,交叉编译也方便。再也不想用 c#、python 写了。
    次选 rust 。
    flyqie
        82
    flyqie  
       2023-07-04 14:00:17 +08:00 via Android
    python 或者 go 吧。

    看你自己,个人推荐用 go 。
    raycool
        83
    raycool  
       2023-07-04 14:00:27 +08:00   ❤️ 2
    那必须是 C#吧
    LokiSharp
        84
    LokiSharp  
       2023-07-04 14:06:18 +08:00
    @lujiaxing #77 .net 性能还行但是冷启动慢,只适合做服务,不适合做小工具
    howfree
        85
    howfree  
       2023-07-04 14:16:44 +08:00
    java 使用 GraalVM 可以生产不同操作系统的可执行文件
    hatsuyuki
        86
    hatsuyuki  
       2023-07-04 14:28:19 +08:00
    首推 Rust
    FightPig
        87
    FightPig  
       2023-07-04 14:31:55 +08:00
    我用 go 和 rust 都写过,整体 go 的话写起来轻松些,rust 不熟的话写起来太麻烦了
    Slurp
        88
    Slurp  
       2023-07-04 14:32:53 +08:00
    @idealhs 🤪 .NET AOT 吹和 GraalVM 吹能不能消停点,用起来一堆限制还觉得支持完美也是厉害。
    seakingii
        89
    seakingii  
       2023-07-04 14:35:39 +08:00
    windows 下推荐 c#,原因是 c#语法最方便
    linux 或者跨平台推荐 go,库很多,编译方便
    NoOneNoBody
        90
    NoOneNoBody  
       2023-07-04 14:38:02 +08:00
    写了几十个 python 脚本,自用没有分发需求,反而部分有不时改动一下,所以都没编译

    有些传参只是文件路径的,直接在 total commander 工具栏加个按钮就当 GUI 用了
    Slurp
        91
    Slurp  
       2023-07-04 14:40:07 +08:00   ❤️ 1
    还是那句话,作为用户巴不得你 Rust 写,Go 的 CLI 几乎都是透露着一种未完善的气息。

    Rust 直接调用 Clap 解参数,log 日志,anyhow 错误处理,serde 解配置文件,toml_edit 还能基于结构增量修改配置,要 REPL 还能用 nushell 同款基础库 rustyline 。

    能给用户带来非常统一完善的体验。而不是有些 Go CLI 上来一个 panic 给我整乐了。

    写小工具 Rust 还具有最快的启动速度,最小的二进制体积,上个 O3 LTO 比 Go 小到不知道多少倍。
    jlkm2010
        92
    jlkm2010  
       2023-07-04 14:44:29 +08:00
    cj
    lerry
        93
    lerry  
       2023-07-04 14:52:22 +08:00
    go ,编译以后单文件,不需要什么特别配置,很简单
    poporange
        94
    poporange  
       2023-07-04 14:57:35 +08:00
    python
    brookegas
        95
    brookegas  
       2023-07-04 15:07:09 +08:00
    golang

    交叉编译,直接用 mac 上瞬间编译出 linux 、mac 、windows 下的二进制文件
    编译速度快到飞起
    cat9life
        96
    cat9life  
       2023-07-04 15:09:06 +08:00
    当然是 go 最方便,没啥可争辩的
    raptor
        97
    raptor  
       2023-07-04 15:11:01 +08:00
    果然第一个就是 GO
    a33291
        98
    a33291  
       2023-07-04 16:23:40 +08:00
    @idealhs #66 您说得对 😊
    storyxc
        99
    storyxc  
       2023-07-04 17:13:01 +08:00   ❤️ 2
    上面说用 java 写的也太搞了,虽然我也是干 java 的,但写工具这种活真没 java 啥事。没接触 go 之前我都是用 python ,接触了 go 之后全都是用 go 写,跨平台编译太香了。
    DOLLOR
        100
    DOLLOR  
       2023-07-04 17:36:39 +08:00
    如果是命令行小工具,用 go 就行,dart 也可以。
    退两步,那就 python 或者 node 。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2696 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:49 · PVG 15:49 · LAX 23:49 · JFK 02:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.