Skip to content

Commit 3d9579c

Browse files
committed
零.二版設計與概述
1 parent f113007 commit 3d9579c

3 files changed

Lines changed: 150 additions & 0 deletions

File tree

book/.vitepress/config.mts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ export default defineConfig({
6565
},
6666
],
6767
},
68+
{
69+
text: "音界咒零.二版:極簡圖靈完備",
70+
items: [
71+
{
72+
text: "設計與概述",
73+
link: "/零.二版/設計與概述.md",
74+
},
75+
],
76+
},
6877
{
6978
text: "雜項",
7079
items: [
@@ -74,6 +83,15 @@ export default defineConfig({
7483
},
7584
],
7685
},
86+
{
87+
text: "用語",
88+
items: [
89+
{
90+
text: "用語對照",
91+
link: "用語對照.md",
92+
},
93+
],
94+
},
7795
],
7896

7997
socialLinks: [

book/用語對照.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
## 零.二版引入
4+
5+
###
6+
函式
7+
8+
### 外術
9+
外部函式
10+
11+
### 基括號
12+
〖〗
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
零.一版是沒法自舉的,它甚至難以稱之為「咒」。「咒」必須圖靈完備,圖靈完備之後,才有條件自舉。
2+
3+
在零.二版,貧道將嘗試定義一極度簡單但圖靈完備的法咒。
4+
5+
## 圖靈完備
6+
圖靈機有一套嚴謹的符號定義,但貧道不打算在此細述,首先,雖然當代電腦/通用法咒(程式語言)都圖靈完備,但這套原始的符號定義與現今的計算機/法咒有不小的差異,需要一些推導才能證明兩者是等價的。
7+
8+
基本上,首先想像有一個「咒指針」指向法咒正在執行的行數,法咒只要有語句能控制
9+
10+
- 循序,即咒會一行一行往下執行(咒指針遞增)
11+
- 修改記憶體狀態
12+
- 決策,可根據「條件」決定咒指針要跳躍至何處
13+
- 這個「條件」是「當下記憶體狀態」的函數
14+
15+
就圖靈完備了。
16+
17+
編譯器生成真言後,放到真實機器上本就會逐步執行,因此循序不會是問題,只要檢視後兩條即可
18+
19+
以 C 語言為例
20+
21+
- 賦值語句能修改記憶體狀態
22+
- `if` 搭配 `goto` 能根據條件選擇性跳躍到任意一行
23+
24+
決策有很多種實現,`if` 必不可少,用 `if` 搭配 `goto` 當然是最直觀符合定義的,但 `while` 也能取代 `goto` ,可證明 `while``goto` 的能力等價。思路是嘗試找到一種方法把 `while` 轉換為 `goto` ,同時找到一套方法把 `goto` 轉換為 `while`
25+
26+
除了 `goto``while` ,遞迴也是一種與 `if` 搭配來達到圖靈完備的方法。道友可嘗試將 `while` 與遞迴互相轉化來證明。
27+
28+
而多數流行的法咒會同時提供 `while` 與遞迴,乃至迭代器、`for` 迴圈等等語句,什麼好寫就支援什麼。
29+
30+
## 設計
31+
32+
零.一版音界咒已有循序與修改記憶體的能力,再加上決策語句便能完備。
33+
34+
音界咒零.二版選擇的是**遞迴**,想必道友們並不會太意外,畢竟那句古老的偈語早就深植人心:
35+
36+
> 遞迴只應天上有,人間該當用迴圈。
37+
38+
在符合「離塵」的寓意之外,實現遞迴也就意味著實現了****(函式)此一重要的模組化工具,為構造較大型的程式打下了基礎,其泛用程度相較 `goto``while` 又高上了一檔。
39+
40+
## 概述
41+
42+
零.二版新增「若」語句,以及「術」的定義與施展(調用),並支援「外術」(外部函式),以實現標準輸入輸出。
43+
44+
此外,為輔助「若」語句的使用,亦加入相等、不等、小於......等等比較算子。
45+
46+
### 新增算子
47+
48+
#### 比較運算
49+
- `==`
50+
- 等於
51+
- `!=`
52+
- 異於
53+
- `<=`
54+
- 小於或等於
55+
- `>=`
56+
- 大於或等於
57+
- ``
58+
- 大於
59+
- ``
60+
- 小於
61+
62+
以上算子的求值結果皆為整數,若式子成立,值為1,否則值為0。
63+
64+
#### 餘數
65+
66+
`` 取餘數。
67+
68+
### 「若」語句
69+
70+
```音界
71+
若(甲==乙)〖
72+
...
73+
74+
```
75+
在括號內條件不為0時,執行〖 〗內語句,括號內為0時,注意到括號內並不限定是比較算子,可以是任意算式,乃至數字或變數。
76+
77+
貧道不採用塵界常見的花括號,是因為全形的花括號並不容易與圓括號區分,貧道自用的微軟正黑體是如此,恐此問題普遍存在,故採`〖 〗`,此類括號似乎沒有通用的念法,在此給它取個名吧!
78+
79+
道友請看,此括號一面平,一面弧,若置平面朝下、弧面朝上,便好似能擺放蛋或球體的基座。故吾名之曰**基座括號**或簡稱**基括號**
80+
81+
與「若」連用的尚有「或若」、「不然」兩關鍵字。
82+
83+
```音界
84+
若(甲>10)〖
85+
...
86+
〗或若(乙==1)〖
87+
...
88+
〗或若(乙==0)〖
89+
...
90+
〗不然〖
91+
...
92+
93+
# 決策結尾
94+
```
95+
96+
此結構中,唯有當上一層的條件不符合時,才會嘗試下個括號內的條件並執行基括號內的語句。例如,以上法咒唯有在「甲<=10」時才會去檢查「乙==1」,當所有條件都不成立時,就執行`不然`基括號內的語句。
97+
98+
###
99+
100+
```
101+
術.輾轉相處(甲、乙)〖
102+
若(乙==0)〖
103+
歸.甲
104+
105+
歸.輾轉相除(乙、甲%乙)
106+
107+
```
108+
109+
上例展示一遞迴術——輾轉相除術,以下逐詞解釋:
110+
111+
1. ``:關鍵字,由此開頭,定義一術
112+
2. ``:音界號,用以區隔關鍵字與術名
113+
3. `輾轉相除`:術名
114+
4. `(甲、乙)`:參數列表,參數之間以頓號``為間隔
115+
5. ``:左基括號,術體開始
116+
6. `若(乙==0)〖 歸.甲 〗`:符合條件時,將甲作為術的求值結果(歸值),結束術。
117+
7. `歸.輾轉相除(乙、甲%乙)`:施展`輾轉相除(乙、甲%乙)`,以其歸值為歸值,結束術。
118+
5. ``:右基括號,術體結束
119+
120+
在零.二版中,術的參數與歸值(回傳值)都是整數。若在任意分支中,術沒有歸值,編譯器應報錯。

0 commit comments

Comments
 (0)