一种快速编程的方法,推荐给大伙。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
mike163
V2EX    程序员

一种快速编程的方法,推荐给大伙。

  •  
  •   mike163 361 天前 via Android 6143 次点击
    这是一个创建于 361 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就是先用 高级语言,例如 ruby python 把功能做出来,然后让大语言模型翻译成 低级语言,例如 go c/

    一般来说,翻译完了还有一点小问题,一般是一些语法细节,所以你要懂目标语言,改完了就能得到全功能的目标语言文件了。

    用这个办法写了好几个东西了,速度很快,还能享受低级语言的性能 一致性 容易部署。很爽。

    36 条回复    2024-10-23 13:44:17 +08:00
    sphawkcn
        1
    sphawkcn  
       361 天前
    大部分项目还没到拼语言性能的时候,连拼框架性能都到不了。
    mike163
        2
    mike163  
    OP
       361 天前 via Android
    @sphawkcn 有些还是需要的,例如我用 ruby 写了一个 web 程序,但 ruby 很难支持并发,然后让语言模型翻译成 go ,并改成异步并发模型,很方便。

    用感觉语言先实现业务逻辑,用低级语言提高性能。
    yellowsky
        3
    yellowsky  
       361 天前
    直接告诉 AI 你的需求,让它一步步给你写不就行了,还绕这个弯子干嘛
    vcbal
        4
    vcbal  
       361 天前
    这种一般都只能是玩具吧,工程上这样做 复杂度要高很多,不如直接重写
    mike163
        5
    mike163  
    OP
       361 天前 via Android
    @yellowsky 低级语言写代码,效率还是比高级语言低很多。

    实际上,可以把高级语言,看成是给 llm 提需求的提示,但自然语言有太多细节很难描述,不如高级语言好用。
    jr55475f112iz2tu
        6
    jr55475f112iz2tu  
       361 天前
    用低级语言来形容 C 可还行
    NessajCN
        7
    essajCN  
       361 天前
    c 也就算了,go 不是比 python 都简单快捷吗,为啥要脱裤子放屁
    mike163
        8
    mike163  
    OP
       361 天前 via Android
    @vcbal 工程上可以把一个大框架拆成多个模块,每个模块独立实现,模块之间通过 web json 交互,这样耦合性非常好。
    yellowsky
        9
    yellowsky  
       361 天前
    @mike163 #5 我都是给 AI 需求,让它一步步写,你只要把控好业务和逻辑不要错,项目就慢慢堆起来了,省时又省心,最后回看,自己考虑得都没它全面。
    mike163
        10
    mike163  
    OP
       361 天前 via Android
    @yellowsky 肯定可以。不过我不写低级语言很久了,习惯用高级语言,但有时候高级语言性能不行,这时候就必须用低级语言。上面的办法就很好用了。
    Yanlongli
        11
    Yanlongli  
       361 天前
    简单的一个函数、算法还行,代码多一点都是不可用状态,各种缺斤少两
    vfx666
        12
    vfx666  
       361 天前 via iPhone
    直接让 ai 写低级语言不行吗。。。没必要绕一圈啊
    Mark24
        13
    Mark24  
       361 天前   1
    我懂 OP ,非常可以

    杠的都没意思了。
    Mark24
        14
    Mark24  
       361 天前
    @mike163 Ruby 并发可以 关注 Async

    https://github.com/socketry/async
    iorilu
        15
    iorilu  
       361 天前
    直接让 ai 写 rust, 我写了好几个命令行小程序了
    Hopetree
        16
    Hopetree  
       361 天前   1
    这个我会啊,我用 Python 写了一个通用的 OpenAPI 封装模块,然后让 AI 转成 go 和 Java 的版本,我调试了几次就直接可以用了,相当舒服,再也不用找人帮忙写了
    mike163
        17
    mike163  
    OP
       361 天前 via Android
    @Hopetree 就是这个意思,用了就知道爽了。
    mike163
        18
    mike163  
    OP
       361 天前 via Android
    @Mark24 我知道,就是不想用 asyncore ruby ,让大语言模型帮我转成 go 只花了 1 分钟。如果用 async ,至少折腾半天。 每个语言都有自己的优势。
    njylll
        19
    njylll  
       361 天前
    1. 我都用"高级语言"把功能做完了, 为啥还要翻译
    2. go 都成低级语言了啊
    mike163
        20
    mike163  
    OP
       361 天前 via Android
    @njylll 1 部署,性能,并发支持等。2 实现同样功能,ruby 代码量可以是 go 的一半还少。
    aizya
        21
    aizya  
       361 天前
    请教下 op ,我都是找网页单个文件手动翻译的,有啥便捷的方式吗?
    nekoharuya
        22
    nkoharuya  
       361 天前
    你的想法,好几年前 facebook 就做过,但是只能做简单的小脚本,比较核心的问题是,出了 bug 完全无法排查,不过当时他们是基础的 seq2seq 模型,没现在模型那么大,设备那么烧钱,虽然目前大模型也做不了太大的项目就是了。纯人工开发的语言转译工具是有的,比如 python 有 nuitka ,不过,性能提升并不明显就是了,转译相对来说是比较复杂的问题,比如进 python3.8 的时候,我给他们提过一个 bug https://github.com/Nuitka/Nuitka/issues/630
    cutchop
        23
    cutchop  
       361 天前
    最高级的语言不就是"中文"吗
    cutchop
        24
    cutchop  
       361 天前
    AI 编程发展最终就是这样的,把最高级的语言“中文”翻译成最低级的“1010010100101”
    mike163
        25
    mike163  
    OP
       361 天前 via Android
    @aizya 没看懂,我是直接把代码扔给大模型,让塔用目标语言写一份新的
    mike163
        26
    mike163  
    OP
       361 天前 via Android
    @nekoharuya 以前模型能力不行。新代码质量很差。现在大模型编程能力上来了,写的代码质量比较好。
    cloudzhou
        27
    cloudzhou  
       361 天前
    "就是先用 高级语言,例如 ruby python 把功能做出来,然后让大语言模型翻译成 低级语言,例如 go c/"

    有这个时间,都可以直接 go/java 开发完成了
    Kylin30
        28
    Kylin30  
       361 天前   1
    脚本语言应该是最精确的提示词了
    xuanbg
        29
    xuanbg  
       360 天前
    你写一段工具代码这个办法还可以,但一个使用了多种框架的项目,你是没办法转换语言的。

    PS:C 可不是什么低级语言,它也是堂堂正正的高级编程语言呢
    FYFX
        30
    FYFX  
       360 天前
    go 有 gc 可能还行,c 大概率不行,我不觉得 LLM 会帮你加上有用的生命周期管理
    alexhx
        31
    alexhx  
       360 天前
    依赖怎么办呢
    xgdgsc
        32
    xgdgsc  
       360 天前
    我经常用 julia 先写然后自己翻译成 cpp 也感觉差不多,而且以后需要翻译的场景可能越来越少 https://www.reddit.com/r/Julia/comments/1g1gzlw/does_julia_still_produce_large_executables/
    mike163
        33
    mike163  
    OP
       360 天前 via Android
    @alexhx 现代大语言模型可以自动 用目标语言合适的模块 替换。这是真正厉害的地方。
    levelworm
        34
    levelworm  
       360 天前 via Android
    我自己写项目就这样,先用 Python 然后翻译成 C++,不过是纯粹锻炼和好玩。公司的不用。
    mike163
        35
    mike163  
    OP
       359 天前
    一个具体的例子,用 ruby 写一个一个 自动生成 图片压缩的服务, 然后 转换成 go

    require 'sinatra'
    require 'open-uri'
    require 'rmagick'
    require 'time'


    # Initialize cache
    $image_cache = {}

    # Cleanup task to remove stale cache entries
    Thread.new do
    loop do
    sleep 8 * 60 * 60 # Sleep for 24 hours
    current_time = Time.now
    $image_cache.delete_if do |url, entry|
    current_time - entry[:last_accessed] > 24 * 60 * 60
    end
    end
    end

    get '/' do
    # Get the URL parameter
    url = params['url']

    # Ensure the URL is provided
    halt 400, 'URL parameter is missing' if url.nil?

    # Check cache for the image
    if $image_cache.key?(url)
    entry = $image_cache[url]
    entry[:last_accessed] = Time.now
    content_type 'image/jpeg'
    return entry[:image_data]
    end

    # Fetch the image from the URL
    begin
    image_data = URI.open(url).read
    rescue => e
    halt 500, "Failed to fetch image: #{e.message}"
    end

    # Read the image data using RMagick
    begin
    image = Magick::Image.from_blob(image_data).first
    rescue => e
    halt 500, "Failed to read image: #{e.message}"
    end

    # Resize the image while maintaining the aspect ratio
    begin
    resized_image = image.change_geometry("360") do |cols, rows, img|
    img.resize(cols, rows)
    end
    rescue => e
    halt 500, "Failed to resize image: #{e.message}"
    end

    # Convert the resized image to a blob
    resized_image_data = resized_image.to_blob

    begin
    # Convert the resized image to a blob
    resized_image_data = resized_image.to_blob
    rescue Magick::ImageMagickError => e
    puts "Error: #{e.message}"
    puts "Backtrace: #{e.backtrace.join("\n")}"
    end

    # Store the resized image in the cache
    $image_cache[url] = {
    image_data: resized_image_data,
    last_accessed: Time.now
    }

    # Send the resized image data to the user
    content_type 'image/jpeg'
    resized_image_data
    end%

    转换后的代码,

    package main

    import (
    "bytes"
    "fmt"
    "image"
    "image/jpeg"
    "log"
    "net/http"
    "sync"
    "time"

    "github.com/nfnt/resize"
    )

    const (
    port = 8300
    cacheCleanupInterval = 8 * time.Hour
    cacheExpiratiOnTime= 24 * time.Hour
    )

    type CacheEntry struct {
    ImageData []byte
    LastAccessed time.Time
    }

    var (
    imageCache = make(map[string]*CacheEntry)
    cacheMutex sync.RWMutex
    )

    func main() {
    go cleanupCache()

    http.HandleFunc("/", handleRequest)
    log.Printf("Server starting on port %d", port)
    log.Fatal( http.ListenAndServe(fmt.Sprintf(":%d", port), nil))
    }

    func cleanupCache() {
    for {
    time.Sleep(cacheCleanupInterval)
    currentTime := time.Now()
    cacheMutex.Lock()
    for url, entry := range imageCache {
    if currentTime.Sub(entry.LastAccessed) > cacheExpirationTime {
    delete(imageCache, url)
    }
    }
    cacheMutex.Unlock()
    }
    }

    func handleRequest(w http.ResponseWriter, r *http.Request) {
    url := r.URL.Query().Get("url")
    if url == "" {
    http.Error(w, "URL parameter is missing", http.StatusBadRequest)
    return
    }

    cacheMutex.RLock()
    if entry, ok := imageCache[url]; ok {
    entry.LastAccessed = time.Now()
    cacheMutex.RUnlock()
    w.Header().Set("Content-Type", "image/jpeg")
    w.Write(entry.ImageData)
    return
    }
    cacheMutex.RUnlock()


    log.Printf("Fetching image: %v\n", url)

    resp, err := http.Get(url)
    if err != nil {
    http.Error(w, fmt.Sprintf("Failed to fetch image: %v", err), http.StatusInternalServerError)
    return
    }
    defer resp.Body.Close()

    img, _, err := image.Decode(resp.Body)
    if err != nil {
    http.Error(w, fmt.Sprintf("Failed to decode image: %v", err), http.StatusInternalServerError)
    return
    }

    resizedImg := resize.Resize(360, 0, img, resize.Lanczos3)

    var buf bytes.Buffer
    if err := jpeg.Encode(&buf, resizedImg, nil); err != nil {
    http.Error(w, fmt.Sprintf("Failed to encode resized image: %v", err), http.StatusInternalServerError)
    return
    }

    cacheMutex.Lock()
    imageCache[url] = &CacheEntry{
    ImageData: buf.Bytes(),
    LastAccessed: time.Now(),
    }
    cacheMutex.Unlock()

    w.Header().Set("Content-Type", "image/jpeg")
    w.Write(buf.Bytes())
    }%
    nekoharuya
        36
    nekoharuya  
       356 天前
    @mike163 不是,我贴的这个不是大模型,这个是人工设计解析转译的,语言转译是非常复杂的,小脚本可以,大一点就没办法了,以我的黄油为例,游戏引擎,渲染框架,UI 框架,到游戏本身,数据结构,AI 算法,游戏逻辑,拼 UI ,还有周边的所有工具链,我做完这一整套,也就四五兆的代码,一个很小的文字黄油,而 AI 要做这种小项目的转译,目前希望也很渺茫
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1038 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:27 PVG 02:27 LAX 11:27 JFK 14:27
    Do have faith in what you're doing.
    ubao 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