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

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

  •  1
     
  •   aim467 · 298 天前 · 12296 次点击
    这是一个创建于 298 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    159 条回复    2023-11-16 08:53:20 +08:00
    1  2  
    westoy
        1
    westoy  
       298 天前   ❤️ 24
    golang 大法好
    alexapollo
        2
    alexapollo  
       298 天前   ❤️ 1
    我觉得写小工具可能还真是 https://github.com/geekan/MetaGPT 这个比较方便……
    H0H
        3
    H0H  
       298 天前   ❤️ 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  
       298 天前
    golang ,交叉编译很方便。
    LeeReamond
        5
    LeeReamond  
       298 天前   ❤️ 8
    @H0H 你这个方法要是算简单的话那大部分语言都挺简单。。。小工具+好编译成二进制=go 或者 rust
    jackmod
        6
    jackmod  
       298 天前
    能够比较简单制造 exe 的话估计只有 golang 和 rust 了,不过 linux 下的 rust 需要使用 musl 达到 static
    fbichijing
        7
    fbichijing  
       298 天前
    你提出的问题和描述似乎不太相同啊。

    如果是 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  
       298 天前
    之前写了个一百来行的命令行程序,用 goreleaser 编译然后发布,goreleaser 的默认设置已经完全能满足你的这个需求了

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

    产物体积小且快, rust zig

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

    java graalvm 应该也可以, 没用过
    lhbc
        15
    lhbc  
       298 天前 via Android
    golang 最佳
    别用 cgo
    wxf666
        16
    wxf666  
       298 天前
    你给点工具的应用场景出来呗?

    比如,音视频处理?文本处理?结构数据处理?……
    shuimugan
        17
    shuimugan  
       298 天前 via Android
    c sharp(aot 编译)
    javascript/typescript(deno 或者 pkg)
    dart 类似 ts 的语法
    MrKrabs
        18
    MrKrabs  
       298 天前
    zig rust swift
    crab
        19
    crab  
       298 天前
    bat
    zsj1029
        20
    zsj1029  
       298 天前 via iPhone
    Dart 发布二进制自带虚拟机,类似 Java
    GPLer
        21
    GPLer  
       298 天前 via Android   ❤️ 2
    只有 C ,其他都不方便。
    https://justine.lol/ape.html
    https://github.com/jart/cosmopolitan
    基于 cosmopolitan 编译的 C 能做到二进制跨平台运行
    fyq
        22
    fyq  
       298 天前
    那显然是 C
    kljsandjb
        23
    kljsandjb  
       298 天前 via Android
    @aa51513 是的,这方面生态还是太不成型了
    musi
        24
    musi  
       298 天前 via iPhone   ❤️ 3
    第一次见到写小工具用 Java 的,那不得打一个 jre 放包里,小而美?
    snw
        25
    snw  
       298 天前 via Android
    VB6 ?
    placeholder
        26
    placeholder  
       298 天前
    那你还不如用 nodejs 写 cli 呢
    yazinnnn
        27
    yazinnnn  
       298 天前
    java 写个 hello world, aot 之后都有 11M, 咋做小工具哦...
    cozof
        28
    cozof  
       298 天前 via iPhone
    golang 啊。你看我不费吹灰之力就把 go 写的小工具打包了各平台的几十个可执行文件。 https://github.com/qcozof/portsman/releases
    LeegoYih
        29
    LeegoYih  
       298 天前
    考虑到逆向的话,还是别选解释型语言和 Java 了
    xgdgsc
        30
    xgdgsc  
       298 天前
    体积小 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  
       298 天前
    写命令行还得是 golang/rust,不接受反驳!
    bthulu
        32
    bthulu  
       298 天前   ❤️ 1
    当然是.net 了, 直接支持打包成单文件
    recolic
        33
    recolic  
       298 天前 via Android
    @u823tg 如果是要给别人用的程序,用脚本语言写的话,小白会追在你屁股后面说环境有问题/出错了/跑不了,烦死人。
    gimp
        34
    gimp  
       298 天前
    首推 Golang ,其次 Rust
    a33291
        35
    a33291  
       298 天前
    推荐 rust 或者 go,主要是交叉编译跨平台特性,cli 比较合适

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

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

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

    命令行当然也没问题
    a33291
        40
    a33291  
       298 天前
    @nikenidage1 #39 抱歉我可能没表达清楚,每个语言都有他的特色和优势

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

    如果仅 windows 的话首选 C#,winform
    xiangyuecn
        45
    xiangyuecn  
       298 天前
    “主要是基于命令行上进行操作的工具”,干脆直接写命令行脚本得了😂

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

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

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

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

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

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

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

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

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

    写小工具 Rust 还具有最快的启动速度,最小的二进制体积,上个 O3 LTO 比 Go 小到不知道多少倍。
    jlkm2010
        92
    jlkm2010  
       298 天前
    cj
    lerry
        93
    lerry  
       298 天前
    go ,编译以后单文件,不需要什么特别配置,很简单
    poporange
        94
    poporange  
       298 天前
    python
    brookegas
        95
    brookegas  
       298 天前
    golang

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