zoukankan      html  css  js  c++  java
  • 使用Java实现一门简单的动态语言

    原文地址:https://www.cnblogs.com/estrigriac/p/8612860.html 

    2018.8.4更新:

    用Java写起来还是太繁琐了,直接用Python重写了。https://github.com/gcnyin/compiler

    这次正确地实现了静态作用域,还添加了另外几门玩具语言。

    原文:

    项目地址:https://github.com/gcnyin/toy-lang

    学习了EOPL后,不禁想自己写一门语言,同时还想学习下如何用静态类型语言实现动态类型语言,所以就选择了Java来写。

    目前只写了后端,前端部分其实也可以手写,但之前已经写得够多了,再写下去也无法提高水平,而目前还不会使用Antlr这样的工具,所以就先不写了,反正也很简单。

    最终的效果是这样的:

    let x = 200
      in let f = proc (z) -(z,x)
        in let x = 100
          in let g = proc (z) -(z,x)
            in -((f 1), (g 1))

    总结一下:

    一、实现了“动态作用域”而非“静态作用域”。EOPL中将env传入exp中后,可以立即将identifier替换为绑定的值,能这样做是因为Scheme的动态性,所以Java做不到。目前的实现里,只能将exp完全展开后再进行idetifier的替换,那么后面的绑定覆盖了前面的绑定,所以成为了“动态作用域”。

    二、体会到了Java实现动态语言的痛点,再也不想用动态类型语言来实现动态类型语言了。编写过程中,经常需要使用反射或者增加字段来确定运行时某一变量的类型,并做大量的强制类型转换。这样写完后自己感到很别扭,但问了下开源哥,好像也没有什么太好的办法了。

    三、写大点的项目还是用Java好,有IDEA的加成,还有那么多可用的工具。瞧瞧DrRacket,代码补全和项目管理还是太弱,写起来好难受。 

  • 相关阅读:
    centos7上安装JupyterHub
    我的测试第一篇博客
    TCP,SYN,FIN扫描
    nmap使用帮助翻译
    MySQL 常用函数
    MySQL 视图
    MySQL 索引
    JAVA 注解
    JAVA 反射
    spring boot MySQL极简封装
  • 原文地址:https://www.cnblogs.com/estrigriac/p/8612860.html
Copyright © 2011-2022 走看看