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

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

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

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

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

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

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

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

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

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

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

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

    PS:C 可不是什么低级语言,它也是堂堂正正的高级编程语言呢
    FYFX
        30
    FYFX  
       33 天前
    go 有 gc 可能还行,c 大概率不行,我不觉得 LLM 会帮你加上有用的生命周期管理
    alexhx
        31
    alexhx  
       33 天前
    依赖怎么办呢
    xgdgsc
        32
    xgdgsc  
       33 天前
    我经常用 julia 先写然后自己翻译成 cpp 也感觉差不多,而且以后需要翻译的场景可能越来越少 https://www.reddit.com/r/Julia/comments/1g1gzlw/does_julia_still_produce_large_executables/
    mike163
        33
    mike163  
    OP
       33 天前 via Android
    @alexhx 现代大语言模型可以自动 用目标语言合适的模块 替换。这是真正厉害的地方。
    levelworm
        34
    levelworm  
       32 天前 via Android
    我自己写项目就这样,先用 Python 然后翻译成 C++,不过是纯粹锻炼和好玩。公司的不用。
    mike163
        35
    mike163  
    OP
       32 天前
    一个具体的例子,用 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  
       29 天前
    @mike163 不是,我贴的这个不是大模型,这个是人工设计解析转译的,语言转译是非常复杂的,小脚本可以,大一点就没办法了,以我的黄油为例,游戏引擎,渲染框架,UI 框架,到游戏本身,数据结构,AI 算法,游戏逻辑,拼 UI ,还有周边的所有工具链,我做完这一整套,也就四五兆的代码,一个很小的文字黄油,而 AI 要做这种小项目的转译,目前希望也很渺茫
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.