几只野猫穿着ALGOL风衣。
摘要
POP-2是一种具有类似ALGOL语法和连接式求值的编程语言,提供基于栈的操作,并为Uxn等系统提供高效编译。它包括变量、函数、循环和I/O的简单结构,使其适合复古计算环境。
暂无内容
查看缓存全文
缓存时间: 2026/08/30 06:41
# pop2
来源:https://wiki.xxiivv.com/site/pop2.html
## 几只穿着ALGOL风衣的野猫
**POP-2**的语法类似ALGOL,赋值采用中缀表示法(https://wiki.xxiivv.com/site/notation.html),但其求值方案具有深度连接式(https://wiki.xxiivv.com/site/concatenative.html)特性。
```
foo := 123;(Pascal风格)
```
```
123 -> foo;(POP-2风格)
```
该语言明确支持操作数栈的概念。因此,前述赋值可拆分为两个独立语句:第一条语句将值留在栈上,第二条语句则消耗该值:
```
123; -> foo;
```
典型POP-2程序员### 解释器
该语言可轻松编译为Uxn(https://wiki.xxiivv.com/site/uxn.html)目标平台。实际上,其语法设计如此优雅精简,完整编译器代码量不足800行,且仅占用2.5KB内存空间。
乍看之下,该语言与Pascal(https://wiki.xxiivv.com/site/pascal.html)有些相似。语句以关键字开头,后接表达式,最终以分号终止。求值过程通过遍历程序完成,根据需要将值压入栈中。
```
function sum x y;
x + y;
end
sum(5,6) * 2;
```
但需谨记所有操作均由栈机器执行——函数返回的多个值仅是暂存于栈中供后续语句使用。
### 注释
注释语句会阻断文本解析,直到遇到终止分号。
```
comment 这是注释,
可跨越多行;
```
### 变量声明
变量通过vars语句分配,可定义任意长度。在默认16位系统中,变量由两个8位单元构成。
```
comment 以下是三个变量x、y和z;
vars x y z;
comment 变量foo长度为10字节;
vars foo:10;
```
### 条件语句
初看该语言并不惊人,但需注意每个分支都将值压入栈而非返回值或赋值:
```
vars x; 4 -> x;
if x > 4
then 1;
elseif x = 4
then 2;
else
3;
close
```
```
2
```
### 函数定义
函数采用典型ALGOL风格声明,递归调用时参数保留在栈中:
```
function factRec n;
if n = 0
then 1;
else
n * factRec(n-1);
close
end
factRec(5);
```
### 跳转语句
循环通过简单GOTO语句(https://wiki.xxiivv.com/site/basic.html)实现,没有迭代器语法。
```
comment 循环执行10次;
vars i;
loop:
if i < 10
then i + 1 -> i, goto loop;
close
i;
```
```
10
```
### 输入输出
原始实现使用无目标的大箭头`(=>)`,但本实现运行于Varvara宿主系统(https://wiki.xxiivv.com/site/varvara.html),支持多输出目标。通过控制台端口(https://wiki.xxiivv.com/site/varvara.html#console)编号`(0x17, 0x18)`输出ASCII(https://wiki.xxiivv.com/site/ascii.html)字母"H":
```
0x48 => 23; 输出结果:H
```
### 数组操作
变量可存储多个字节单元,通过`#`前缀访问内存中的绝对位置(指针)。以下示例将短整型`0x0048`存入数组第三、四单元:
```
vars array:10 i; 2 -> i;
0x48 -> (#array+i);
```
花括号可执行指针运算并加载内存值,大箭头将其发送至控制台端口:
```
{array+i} => 23;
```
综合运用以上特性,可构建字符串打印函数:
```
comment 23是Varvara系统端口编号;
function putChar c;
c => 23;
end
function printString s;
vars c:1 i; 0 -> i;
loop:
{s+i} >> 8 -> c;
if c
then putChar(c), i + 1 -> i, goto loop
close
end
printString("Hello World!\n");
```
- 源代码(https://wiki.xxiivv.com/etc/pop2.tal.txt),Uxntal语言
- 代码仓库(https://git.sr.ht/~rabbits/pop2),Uxntal语言
- 简要提案(https://hitogata.neocities.org/POP-2000),连接式语言
**相关链接:** oscean(https://wiki.xxiivv.com/site/oscean.html) 2026(https://wiki.xxiivv.com/site/2026.html)
相似文章
POP-2000,一种通用POP-2方言
POP-2000是POP-2编程语言的一个新方言,旨在作为小型编译器和底层系统的通用语言,强调最小化语法和易于实现。
T3X/0:一门极简的过程式语言
T3X/0 是一门极简的过程式编程语言,提供免费编译器,旨在用于教学,并能在 Unix、DOS 和 CP/M 等系统间实现跨系统兼容性。
AP8L - apl
AP8L 是一种受 APL 启发的编程语言,嵌入在 PICO-8 中,支持类似 APL 的函数和基本图形。
Multistack Concatenative Programming Languages
An exploration of multistack concatenative programming languages, discussing how auxiliary stacks and dynamic bindings like Factor's namespaces and PostScript's dictionaries can ease data stack management without sacrificing concatenative composition.
FreeOberon – 开源、跨平台,类似 Free Pascal/Turbo Pascal 的语言
FreeOberon 是一个用于 Oberon 编程语言的开源、跨平台 IDE 和编译器,其设计采用了 Pascal 环境经典的伪图形风格。