计算机科学发展到现在已经经历了百余个春秋。作为人类与机器的沟通桥梁,程序设计语言也层出不穷。各个国家也抓紧着对年轻一代的教育,期盼着某些人能从“小白”蜕变成“大佬”。
但,我们所走的路,真的是完全正确的吗?
如今我国程序设计基础教育的标准语言是Python。尽管Python以简单著称,但事实上更多人是在被动的学或者功利地学。哪怕是偏专业领域的初学者,也难免陷入功利被动的困境。我身边不少人表示“能过(就行”,“今后再不碰编程”。此外,就连IT圈内也有种种不良风气:语言歧视,语言崇拜,华而不实,小题大做……
我们常学习的C/C++、Java和Python等是通用语言,但很多时候我们并不需要随手写一个桌面程序,或者没事搞个多线程玩玩。我们需要的是更加简单而实用的小工具,而不是功能强大但哪怕只复杂一点点的大型机械。
编程应当成为与螺丝刀,扳手,智能手机,计算器一样人人都可以轻松使用的下里巴人,而不是自娱自乐孤芳自赏的阳春白雪。
一门好的面相非专业者的程序设计语言应该好用而不复杂,专门化而不强大,应该前所未有的符合人的直觉和简便易懂。
于是我设计了这门语言,它满足了我所构思的部分特性,我也会逐步完善它,直到它真的成为一门好用的工具。
不过本语言仅仅是为了取代科学计算器而产生的,而且设计目的也是单纯的 简单 。有更高级需求的朋友们可以转去学习更为专门化的R语言或者Matlab
-
Q:这门语言好学吗?
A:尽管我已经尽力去设计的符合直觉,但具体体验还是会 因人而异。因此我欢迎大家提出宝贵意见,我也会尽力修改地使其更加合理。现在一部分语法非常贴合直觉,比如循环n次可以使用标明一部分语句然后乘上n来处理,尽管牺牲了部分灵活性,但是也使得其更贴近直觉。 -
Q:Abacus是什么意思?
A:Abacus是算盘的意思,我希望这门语言可以取代传统的科学计算器,并且推广到全世界。让非专业但有需求者可以拥有一种趁手的工具。 -
Q:这门语言会开源 免费 吗?
A:是的。基础服务内容比如编译器,解释器,图形化界面以后也会一直保持开源,但拓展服务,比如更专业的处理或者更多的功能比如Excel的接口会考虑收费。 -
Q:我可以用这门语言代替其他简单语言(比如Python)吗?
A:不能 。这门语言更倾向于计算方面,适用于批量计算处理的方面,其一般架构为IPO。相比之下其他语言比如Python更为全面。Abacus是一门领域特定语言(DSL)而Python是通用语言(GPL)。 -
Q:我已经有其他语言的编程基础,我需要多长时间才能学会这门语言?
A:小于5分钟。
算盘(Abacus)语言是一个对无基础/非专业人士流程化处理数据的解决方案。Abacus的语法设计贴近思维直觉,语法灵活,易于无基础/非专业人士学习。可以说 会算数学就可以学会算盘
-
新建任意文本文件(建议修改拓展名为aba)。 编辑文件内容为程序代码。
-
使用Abacus.exe运行
-
算盘使用换行判断指令,因此写完语句后请换行。
-
具体事例例如,hello world或a+b problem可以参考examples文件夹
input x, y, z …
-
- 其中xyz可以为变量名称或者变量声明
- 其中xyz可以为变量名称或者变量声明
-
- 尚未声明的变量会被认为是字符串,读入一行
- 尚未声明的变量会被认为是字符串,读入一行
-
- 已被声明的变量会按照类型读入
重新声明变量会覆盖原声明,这会丢失原数据
- 已被声明的变量会按照类型读入
output: x, y, z
-
- 其中xyz可以为变量名称,字符串,数字,运算式(比如1+1)或者类型转换(比如 int 1.3,输出为1,不会四舍五入)
-
- 已被声明的变量会按照类型输出
-
- 运算式会先运算再输出,包含类型转换会先运算再转换
x=y*z+1
-
- 如果左侧变量没有定义,则会按照右侧运算结果保存 否则,会将左侧变量重新定义成右侧运算结果类型。
condition ?
Y: ...
N: ...
-
- condition如果返回不是0,则执行Y,否则执行N
-
- 注意Y/N都可以不写,不写不执行
{
operation
} * n
-
- 执行operation操作,重复n次,n可以为inf(关键字)
input int a, int b
output: a+b, a-b, a*b, a/b
-
- 注意整数间的除法是整除
-
- %可以取余数
input real a, real b
output: a+b, a-b, a*b, a/b
-
- 使用方法与int相同
-
- 除法是真正的除法
-
- 输出总是保留两位小数
input str a
input b
output: a, b, a*3
-
- 很多运算都受限
-
- 一般仅作为提示出现
- sqrt函数计算一个数字的开平方,返回实数
output: sqrt(4)
- absolute函数计算一个数字的绝对值,返回实数
output: absolute(-4)
- round函数对一个 实数 四舍五入,返回 整数
output: round(0.5)
- pow函数计算 第一个参数 的第二个参数 次方,当第一个参数为数字时,第二个参数可以为整数或实数;第一个参数为矩阵时,第二个参数只能为 非负整数
output: round(5, 3)
-
- 向量可以像数字类型一样被定义,输入和使用,输入的格式是
- 向量可以像数字类型一样被定义,输入和使用,输入的格式是
1 2 3 4 5 ...
-
- 代码是
input: vector a1
-
- 两个相同维度的向量可以相加/减(或求积,见下)
input vector a1, vector a2
output: a1 + a2
output: a1 - a2
-
- 两个向量可以叉乘(*),也可以点乘(·,也就是中文分隔符)。注意叉乘仅允许二维或三维互相运算,二维的第三位数字默认为0
input: vector a1, vector a2
output: a1 * a2
output: a1 · a2
-
- 向量可以与数字相乘,结果是每一个元素乘上数字的新向量, 左右乘没有区别。
input vector a1
output: 2 * a1
output: a1 * 2
-
- 可以使用内置函数 norm 求其模/范数,不指定 p 时,求2-范数(模)
output norm(a1)
output norm(a1,1)
-
- 向量也可以作为一组数据进行运算,求和,方差和平均数
input vector a1
output: summation(a1)
output: average(a1)
output: variance(a1)
-
- 矩阵可以像数字类型一样被定义,输入和使用,输入的格式是
- 矩阵可以像数字类型一样被定义,输入和使用,输入的格式是
1 2 3
4 5 6
7 8 9
-
- 注意最后的空行。代码是
input: matrix A
-
- 两个矩阵可以相乘(*),如果不符合运算规律会报错
input: matrix a1, matrix a2
output: a1 * a2
-
- 两个相同维度矩阵可以相加/减
input: matrix a1, matrix a2
output: a1 + a2
output: a1 - a2
-
- 为了保证行列式的合理性,矩阵不可以与数字相乘。
-
- 可以使用build内置函数来通过两个向量构架矩阵
input vector a1, vector a2
output: build(a1,a2)
-
- 可以使用内置函数 norm 求其p-范数,不指定 p 时,求2-范数(尽管有inf关键字,但暂未实现$\infty$-范数)
output norm(A)
output norm(A,1)
-
- 可以使用内置函数Triangle处理矩阵,产生上(U)下(D)三角阵,或者使用Diagonal产生对角阵。注意如果矩阵为奇异矩阵,Diagonal可能会返回0阵
input matrix A
output: Triangle(A, "U")
output: Triangle(A, "D")
output: Diagonal(A)
-
- 可以使用内置函数Determinant处理矩阵,计算行列式
input matrix A
output: Determinant(A)
-
- 可以使用内置函数Minor计算i,j的(代数)余子式
input matrix A
output: Minor(A, 1, 2)
output: Minor(A, 1, 2, "normal")
output: Minor(A, 1, 2, "complemental")
-
- 矩阵不可以除以一个数字,但介于矩阵求逆需要这个操作,我也给出了求逆的内置函数。
-
- 可以使用内置函数Adjoint计算矩阵的伴随矩阵,Inverse计算逆(奇异矩阵报错)
input matrix A
output: Adjoint(A)
output: Inverse(A)