Discuss / Java / 请教廖神,是不是每一门语言实际上就是一个解释器?

请教廖神,是不是每一门语言实际上就是一个解释器?

Topic source

看了很多解释器模式的文章,还是没有看懂解释器模式...

我理解的解释器模式是对语法的解释。比如在 Java 中,"int a = 1;" 这样一句代码,运行时就会给 JVM 解释,int 表示整数、a 是一个变量名,它的初始值是 1,这样理解对吗?(我知道实际上是 class 文件的逐行解释,忽略编译成 class 文件过程)

也就是说,是不是每一门语言实际上就是一个解释器?

这么表述有点太直白了,我的意思是:Java 语言实际上就是一个解释器,它的作用是把 Java 代码翻译成类似汇编语言那样的地址、栈结构等;汇编语言也是一个解释器,它再次把自己的代码解释给底层的机器。

如果我们仿照解释器模式,也能写出一个自己的语言,比如这样的自定义语法结构:

整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;

我的解释器如下:

class Explain {    int translate(String language) {        // 提取出句子        String[] sentences = language.split(";");        // 参数名-> 参数值 对应表        HashMap<String, Integer> args = new HashMap<>();        for (String sentence : sentences) {            // 提取出每个句子中的单词            String[] words = sentence.split(" ");            if (words.length == 4 && "整数".equals(words[0]) && "等于".equals(words[2])) {                // 赋值操作                args.put(words[1], Integer.parseInt(words[3]));            } else if (words.length == 6 && "整数".equals(words[0]) && "等于".equals(words[2]) && "加".equals(words[4])) {                // 加法操作                args.put(words[1], args.get(words[3]) + args.get(words[5]));            } else if (words.length == 2 && "返回".equals(words[0])) {                // 获取返回值                return args.get(words[1]);            }        }        return -1;    }}

这个解释器很粗糙,但有了它,我们在客户端就可以用它来解释两个数的加法了:

String myLanguage = "整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;";int result = new Explain().translate(myLanguage);// 输出结果为 3System.out.println(result);

在这个例子中,只要我们把 Explain 类和调用它的代码都封装起来,只让客户编写 就相当于一门自己的语言了。虽然这门语言现在还很简陋,只能实现两个整数的加法。但 Explain 类实现了把我们自己的语法解释成 Java 语言的功能。

想请问廖神,这样属于解释器模式吗?

这个评论ye代码格式化太难搞了....再贴一份
String myLanguage = "整数 a 等于 1;整数 b 等于 2;整数 c 等于 a 加 b;返回 c;";int result = new Explain().translate(myLanguage);// 输出结果为 3System.out.println(result);
class Explain {    int translate(String language) {        // 提取出句子        String[] sentences = language.split(";");        // 参数名-> 参数值 对应表        HashMap<String, Integer> args = new HashMap<>();        for (String sentence : sentences) {            // 提取出每个句子中的单词            String[] words = sentence.split(" ");            if (words.length == 4 && "整数".equals(words[0]) && "等于".equals(words[2])) {                // 赋值操作                args.put(words[1], Integer.parseInt(words[3]));            } else if (words.length == 6 && "整数".equals(words[0]) && "等于".equals(words[2]) && "加".equals(words[4])) {                // 加法操作                args.put(words[1], args.get(words[3]) + args.get(words[5]));            } else if (words.length == 2 && "返回".equals(words[0])) {                // 获取返回值                return args.get(words[1]);            }        }        return -1;    }}

代码格式还是好丑...真心实意提问,麻烦复制到 IDE 里面运行,感谢....

链接文字

廖雪峰

#7 Created at ... [Delete] [Delete and Lock User]

编译器、解释器广义上都算,只不过这里的解释器模式是一种小型解释器,比如解释一个包含占位符的字符串,因为编译器级别的代码量太大了,不是一个简单的模式可以描述的


  • 1

Reply