跳转到内容
返回首页
Feature

在 Android 上运行 16 种语言的代码 —— 设备端运行

PocketCode 在你的 Android 设备上运行 16 种语言和文件类型,而不是在远程服务器上:13 种内置于应用,3 种是可选语言包。哪些能运行、哪些还不能。

更新于:
2 min
作者 Pelayo Naredo
在 Android 上运行 16 种语言的代码 —— 设备端运行

大多数在手机上"运行代码"的方式,其实都悄悄把代码送到了别处 —— 云端运行器、远程沙箱、某个网站的服务器。在信号中断之前,或者在你并不介意代码离开设备之前,这都没什么问题。PocketCode 反其道而行:它在设备本身上执行真正的语言,所以运行一个脚本就像打开一条笔记一样本地。

下面是完整的全貌:哪些能运行、哪些即刻可用、哪些需要一次性下载,以及哪些目前还不能用。

应用内置的十三种语言和文件类型

这些语言随 APK 一起打包,所以首次启动就在那里 —— 无需下载。你需要一个免费账户,并在登录时联网;之后,打开一个文件,点击 Run(这个按钮标注为实验性),你的代码就在设备上执行:

语言在设备端运行的内容
JavaScript真正打包的 Node.js 运行时
TypeScript同一个内置 Node,它会去除类型:没有类型检查,也没有 tsc
CTCC 编译器(0.9.27),编译并运行一个 .c 文件
Python编译为 WebAssembly 的 CPython 3.12
RubyWebAssembly 上的 Ruby 3.2
PHPWebAssembly 上的 PHP 8.2,运行方式类似命令行的 php
JavaBeanShell,一个 Java 风格的解释器,实验性且功能有限:它不是 javac,不支持注解处理,带对象、继承或接口的类,以及泛型、lambda、enum 和 printf 都无法运行
Kotlin手机上的 kotlinc 2.3;如果项目用了应用没有内置的库,会退回到更简单、可能失败的脚本模式
ShellAndroid 自带的 sh,它不带大多数命令行工具:缺少某个工具时以 exit 127 结束
SQLAndroid 的 SQLite,每个文件对应一个临时数据库
HTML不会渲染:只检查结构,并提供 在 DevBrowser 中打开
Markdown打开预览
JSON校验文件

HTML、Markdown 和 JSON 更像是预览和检查,而不是运行时,但"写一个脚本、搭一个页面、看一些数据"这套日常三件套正靠它们。在你打开应用的那一刻就能用。

想深入了解其中某一种?我们写了一篇完整指南,讲**在 Android 上运行 Python** —— WebAssembly 构建如何在本地执行、标准库涵盖了哪些内容,以及它诚实的局限(没有 pip,所以它是一个用于编写脚本和学习的环境,而不是数据科学工具栈)。

再多三种,只需一次下载

除了内置的语言之外,PocketCode 还提供可选的语言包。你只需在 设置 → 编译器和运行时 → 额外的语言运行时 中下载某个包一次,从此这门语言就会像内置语言一样在设备端运行。如今可以安装的语言包:

  • Lua 5.4(约 0.6 MB)。编辑器没有 Lua 高亮,所以 .lua 文件会按纯文本打开。
  • Go(约 38 MB),通过 Yaegi 解释器运行。它不是完整的 go build:只支持标准库,一次一个文件,没有 go get,也不支持带 go.mod 的项目。
  • Rust 风格脚本(约 1.4 MB),通过 Rhai 运行。它是语法类似 Rust 的脚本语言,不是 rustc:没有高级 trait、生命周期、async 或 crate。

合计是 16 种语言和文件类型、17 个运行器(Kotlin 有一个备用运行器),在同一个编辑器、同一部手机上、无需服务器介入。

目前还不能运行的

插件管理器里还列着 Perl、C++(Clang)、C#、Zig、Dart 和 Swift,但这六个在当前版本中都无法安装:应用没有包含下载它们所需的校验和。它们的文件可以在编辑器中打开,而 Run 会保持灰色。Java 也不是编译执行的,也没有真正的 rustc 或完整的 Go 工具链。我们不会把这些算作能运行的语言。

为什么"设备端运行"才是关键所在

在本地运行并不是一个技术上的注脚 —— 它改变了一部手机能成为什么:

  • 你的代码在设备上运行。 登录之后,内置语言和你下载过的任何语言包都在本地执行。这一点在移动设备最闪光的场景里尤为重要:通勤路上、飞行途中、信号时断时续、新兴市场的网络环境。(应用在登录时需要联网;已有会话时打开应用无需联网。)
  • 你的代码归你所有。 没有任何东西被送到第三方运行器上去执行。WebAssembly 引擎(Python、Ruby、PHP、Lua、Go、Rhai)默认没有网络;带参数运行里有一个允许 WASM 引擎访问网络的开关。Node.js、C 和 shell 不受它影响。
  • 没有什么需要组装。 无需引导一个终端环境,无需手动编译工具链。运行时已经在那里;你只管按下 Run。
  • 它是即时的。 没有远程容器需要唤醒 —— 执行在设备上立即开始。

环绕它的编辑器

运行器只是故事的一半;你还想把代码写好。每一种语言都在同一个**代码编辑器中打开:支持 39 种语言的 TextMate 语法高亮、其中 19 种语言可一键安装语言服务器(Java、Kotlin、Go、Rust、C、C++ 和 Ruby 不在其中)、支持 24 种语言的内置格式化、多光标编辑,以及编程符号栏。输出会流入 Run 面板 —— print/console.log、堆栈跟踪、退出码,还有一个供读取输入的程序使用的 stdin 输入框。旁边还有一个内置终端**:它的 shell 的 PATH 里有 node,但 Python、Ruby、PHP、C、Java 和 Kotlin 是通过编辑器的 Run 按钮运行的,而不是作为 shell 命令。

它是什么,不是什么

坦白地界定范围,能让期待保持诚实:

  • 非常适合编写脚本、学习一门语言、算法练习、自动化、原型开发,以及在远离办公桌时运行真正的代码。
  • 它不是一个完整的原生构建集群。繁重的计算以解释器的速度运行,而依赖庞大原生生态的运行时(想想 Python 的 C 扩展包)只能停留在每种语言随设备打包提供的范围之内。插件只能是 WebAssembly 文件:Google Play 不允许下载原生编译器。

在这些界限之内,它是一个在本地执行的、装进口袋的多语言运行时。


一部手机,16 种语言和文件类型,全部在你手中的设备上执行。

PocketCode 已在 Google Play 上架。获取 PocketCode,在你自己的设备上运行你所选择的语言。

常见问题

可以在 Android 上运行代码吗?

可以。PocketCode 直接在手机上运行真正的编程语言:目前是 16 种语言和文件类型,其中 13 种内置于应用,3 种是可选下载。打开一个文件,点击 Run(标注为实验性),代码就在设备上执行。

在 Android 上可以运行哪些语言?

目前可运行 16 种语言和文件类型,共 17 个运行器。应用内置的有:JavaScript(Node.js)、TypeScript(只去除类型,不做类型检查)、Shell、JSON 校验、Markdown 预览、HTML 检查、基于 SQLite 的 SQL、Python 3.12、Ruby 3.2 和 PHP 8.2(WebAssembly)、Java(实验性且功能有限:BeanShell 解释器,不是 javac,大多数面向对象代码、泛型、lambda 和 printf 都无法运行)、Kotlin 以及 C(TCC)。可选下载的有:Lua 5.4、Go(Yaegi 解释器,仅标准库)和 Rust 风格脚本(Rhai,不是 rustc)。Perl、C++、C#、Zig、Dart 和 Swift 虽然列在插件管理器里,但目前还无法安装。

运行代码需要电脑或服务器吗?

不需要。代码在手机本身上执行。登录时需要联网;已有会话时打开应用无需联网;之后不会有任何内容被上传到远程服务器来运行。

需要 Termux 吗?

不需要。运行时已内置于 PocketCode 中——无需从包管理器安装,也无需手动编译。

可以在手机上编译代码吗?

C 可以:内置的 TCC 编译器会在设备上编译 .c 文件并运行。Kotlin 通过手机上的 kotlinc 运行,如果项目用了应用没有内置的库,就会退回到更简单、可能失败的脚本模式。Java 是实验性的,功能有限:由 BeanShell 解释执行,不是用 javac 编译,大多数面向对象代码、泛型、lambda 和 printf 都无法运行。C++ 目前还不能运行。

我运行的代码可以建立网络连接吗?

在 WebAssembly 引擎(Python、Ruby、PHP、Lua、Go、Rhai)中默认不行:它们默认没有网络,你可以在“带参数运行”中允许。Node.js、C 和 shell 不受这个开关影响。

运行代码需要账户或网络连接吗?

需要一个免费账户(邮箱、Google 或 GitHub)以及登录时的网络连接。之后,你的代码就在设备上运行。

本文背后的工具

代码编辑器

准备好试用 PocketCode 了吗?

下载应用,开始用手机编程。