思维被Lisp的语法所绑架

pollex 发布于 2014/05/22 14:21
阅读 431
收藏 1

实际上Lisp那就是语法树的文本表示,然而Lisp最不好的就是用大括号,毫无原则的层层包括。我发现很多人自从学了Lisp之后思维反而被绑架了,跳不出这种括号了。而且还天天为括号歌功颂德。

那只是假象,我就是认为这种括号语法无法用于真正的软件设计。别说大型软件,光是中小型软件就能搞死人。你维护,看到的只是一堆毫无原则胡乱拼凑的括号,一堆的括号,一层层的括号,这些括号把所有东西都掩盖了。各种都不能立刻看清楚。

int f(int x, int y, int z)
{
    return x * y + (x*2 + y*2 + z);
}


(define (f x y z)
  (+ (* x y)
    (+ (+ (* x 2) (* y 2)) z)))


哪个更有可读性?哪个更直观更简便?哪个更容易写?我刚才用lisp写的时候还得思考一下嵌套顺序,在主流语言根本不存在的问题。然而却有一大堆人天天说Lisp的语法多么优美多么好,这就是被思维被绑架。


他们根本不懂“形状”的重要性,或者说他们根本连“形状”这个概念都不知道。他们就只知道括号,只知道S表达式多么优美多么好。

主流的,能实际用的,能真正做软件的工程语言,每一个都是有形状的:

class app
{
    public static void main(String args[])
    {
        System.out.println("hello world!");
    }
}


#include <stdio.h>

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        printf("argc < 2\n");
        return 1;
    }
    printf("arg 1 = %s\n", argv[1]);
    return 0;
}


你一眼就能很直观的知道代码要体现的东西,函数的内容,分支的走向,全部都非常的清晰。这是优美的Lisp语法完全达不到的。如果用Lisp的语法写,你除了括号就什么都看不到,程序的一切都被括号混乱。

为什么需要语法?为什么需要?为什么要增加这些看似不必要的语法解析工作,哪怕带来了各种歧义问题?

我发现,就连王垠都只看到了表面,而不知道S表达式的危害性。连王垠也跟很多人一样,认为Lisp的语法最优美最好,是理论的极限。我不知道他的对程序语言领域的造诣有多高,但我知道,他也不懂“形状”。

会实际应用到的工程语言,如果没有形状,那么维护就是灾难。就连汇编也是:

data SEGMENT
     msg DB 'Hello, world.$'
data ENDS
code SEGMENT
    ASSUME CS:code,DS:data
start:
    MOV AX,data
    MOV DS,AX
    LEA DX,msg
    MOV AH,9h
    INT 21h
    MOV AX,4C00h
    INT 21h
code ENDS
END start

从一开始,以应用为主的语言都有“形状”,都知道“形状”的必要性。然而为什么现在很多人忽略了“形状”,而天天赞美S表达式,这就真是想不通。某些程度上我认为王垠说的是对的:计算机领域在退步或者没怎么前进。但我敢肯定不是在这个S表达式上,而是在对“形状”的认知上,没有了对“形状”的认知,反而莫名其妙刮起了一股赞扬S表达式的风,这确实是退步。

很多人强调S表达式多么好,多么先进,多么强大。但他们始终不明白,先进!=能实际应用。你写Lisp程序,实际上不是写“人能理解的程序”,而是在操作抽象语法树,你能直接操作语法树,所以你就能轻易实现很多主流语言目前比较繁琐的东西。直接操作抽象语法树,是不健康的编程方式,这不是真正的编程,而是在当人肉型编译器前端。你需要自己做前端工作,把你所想的转换为语法树。如果大型软件用这类S表达式的语言来做,那就是灾难。

S表达式从来就不优美,不是样子不优美,而是思维不优美,甚至很丑。机器有机器的方式,人类有人类的方式,就算是汇编这种机器语言,也要弄出很多人类能理解的助记符,因为写程序的是人类而不是机器。所以才需要语法这种东西,如果不是为了让人能理解,那么今天的计算机还要那么多东西干嘛?直接让人来二进制读写不就好了?S表达式正是这个观念,把机器应该做的事变成人必须做的事。

主流的工程语言,不会很优美,不会很简洁,但永远是最好用的,最贴近“人类”而不是“机器”的。永远都是从“人类”的角度去想问题,而不是根据“机器”是否这么做更方便来想。是以“人类”为主,而不是“机器”。王垠就是这么说的,他的观点是“机器”为“人类”服务,永远要以“人类”的角度去设计,然而他在S表达式上却不是这么想的,不知道是他忘记了还是他根本没有发现。顺便预言一下他的Yin语言,肯定只是语言界的过眼云烟,因为用的S表达式。

主流的工程语言必然会全面的超越S表达式,不需要操作语法树,不需要充当人肉编译器前端,用最好用、最自然的方式来实现S表达式能做的,和做不了的事。

加载中
0
不行就再写一个
不行就再写一个
语言本身就是一种形状,自己适应就行,错的不是s表达式,错的是把计算机软件开发当作工程
返回顶部
顶部