开发者用LLVM/Clang为Commodore 64解决Advent of Code 2023题目
来源标题:Advent of Code 2023 on a Commodore 64
一位开发者利用llvm-mos项目(将LLVM/Clang移植到6502 CPU)在Commodore 64上解决Advent of Code 2023题目。传统上C64开发只能用BASIC或6502汇编,前者性能不足,后者开发效率低,而llvm-mos提供了兼顾性能与生产力的方案。通常流程是在PC上编写代码,再通过VICE模拟器或交叉部署到真机运行。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
说起 Commodore 64 开发,传统上通常会用两种语言之一:BASIC 或 6502 汇编。但我觉得这两种语言都不太适合 Advent of Code,因为它们的生产力都不够(或者说我的生产力不够),用它们解题,进度撑不了几天就会卡住。BASIC 更高级一些,但我怀疑它的性能不够;汇编则非常快,但后面我会被复杂性拖垮。我想要一种比 BASIC 性能更好、又比汇编生产力更高的东西。
luckily,几年前就有一些专家开发者把 LLVM/Clang 移植到了 6502 CPU 上:可以看看 llvm-mos 项目。今年我第一次看到这个项目时,感觉就像所有(50 颗)星星都对齐了。我当时就知道,这就是我想用的东西。
不过,现代 C64 开发的典型工作流是在 PC 上写代码,然后在像 VICE 这样的模拟器上运行编译好的程序(一个“.PRG”文件),或者交叉部署到真实的 C64 上执行。虽然这个工作流非常高效,但在圣诞节期间进行 AoC 这样的旅程,我真的很想感觉自己是在操作真实的设备,而不是从 PC 上交叉开发。我想体验在 C64 上直接运行文本编辑器、在 C64 键盘上敲代码、在原始 CRT 上使用它是什么感觉。(不过要说明一下,我并不是什么 CRT 原教旨主义者。)
所以今年 11 月初,我提前开始准备,实际搭建一套让这一切成为可能的工作流。我发现需要开发的缺失部分有:
- 一种把 PRG 从 PC 部署到 C64 磁带或磁盘的机制,
- C64 上的一个 C/C++ “IDE”,
- 一个直接在 C64 上访问 Advent of Code 网站的客户端程序,
- 一个 C 标准运行时(libc)实现(比如用于磁盘和磁带 I/O),因为写作时 llvm-mos-sdk 的那个还不支持文件 I/O
大约花了一个月开发,但在 Lemon64 社区以及 llvm-mos 和 Mega65 Discord 频道的帮助下,我赶在 12 月开始前完成了上面的项目。\o/
在我的开发设置中,我使用一个自制的 Advent of Code 客户端程序和一个 RR-Net 3 卡带来访问 Advent of Code 网站。这个客户端程序让我可以阅读题目描述,并把题目输入保存到磁带或磁盘。因为 adventofcode.com 网站使用 HTTPS,而在 C64 上搞 OpenSSL 有点要求太高了,所以我在 PC 上写了一个代理服务器,为 C64 提供基于 API 的 Advent of Code 服务器访问。这是基于 scarvalhojr/aoc-cli 项目构建的。感谢 scarvalhojr 提供这么有用的 CLI 工具!
然后我用自己写的 C++64 “IDE” 程序来开发解题代码。写好的代码会流式传输到 PC,PC 用 llvm-mos 编译代码,编译出的 .PRG 结果(或编程错误诊断信息)最后再送回 C64。
结果是一种奇特的原生 C/C++ 开发体验,借助 Advent of Code 客户端程序,我可以不离开 C64 就尝试解决 AoC 谜题!我甚至可以直接从 C64 提交谜题答案,这有多酷 :)
第 1 天
好吧,终于到了。硬件和软件都为大启动日准备好了,我的直播设置也准备好了。我想我会像去年一样直播这个过程。不幸的是,我了解到 Twitch 在某个时候开始删除旧视频,所以去年的 2022 年视频丢了。今年我得小心把视频下载到本地存档里。
Advent of Code 客户端在实际使用中效果很好,我可以直接在 C64 的 1084S 显示器屏幕上阅读谜题描述。多么酷的体验。40 列文本让人起鸡皮疙瘩 :D。
“让我们准备投石机”——Reddit u/ArnaudValensi
今年有了 AI 图像生成的力量,我们欣赏到了许多非常有创意的 AI 提示词,把 Advent of Code 的旅程很好地视觉化了。我会在这里展示我最喜欢的,比如上面这个。
从第 1 天开始,我们又看到了不称职的精灵们在行动。不意外。精灵们要用投石机把我们发射到天上,去解决为什么没有雪产生的问题。这让我回想起小时候,父母会逗我说如果没有雪圣诞老人就不会来,而临近 24 号时如果气温升到零度以上,我就会吓坏了,因为雪会开始融化。天哪,所以最好还是帮帮精灵们。
当年我们从来没有 C64 的磁盘驱动器,只有一个 Datassette,是制造商“Phonemark”的第三方克隆型号。那就是我这次挑战用的同一台设备和同一台 C64——我妈妈这些年来一直把 C64 保存在阁楼里。那台 Phonemark Datassette 有点特别,它有一个“Load-It!”机制,用一排 LED 灯显示信号质量。小时候我以为所有 C64 Datassette 都有这些灯,后来才知道并非如此。
所以第 1 天,我用 Datassette 来解决挑战。在做这件事的过程中,我最终制作了一盘 C 磁带,上面有所有题目输入(.TXT 文件)、程序代码(.CPP 文件)和编译输出程序(.PRG 文件)。令人惊讶的是,仅仅题目输入就占用了 60 分钟长磁带的很大一部分。(文件 2023.IN1.TXT,22,043 字节,几乎占了 A 面的一半!)
在 1084S 显示器上打字原来是一种超级有趣的体验。上图显示了我为解决问题第二部分写的一个辅助函数。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。