一、为什么要写这个工具?

公司内容有多个项目需要同一个功能,而这些项目中,有的是用Java的,有的是用C++的,同时由于某些现实条件限制,无法所有项目都调用统一的服务接口(如:可能运行在无网络的情况下),所以可选方案有两种:

a.分别用Java和C++实现两套一样的功能。

b.实现一个生成工具,用来生成同一种逻辑的Java和C++代码。

现在项目还刚刚开始,还不确定未来会使用以上两种方案之中的哪一种,不过我还是需要事先做准备。

二、本文不会有的内容

我不希望在一篇技术文章中涉及到任何业务,以及为避免任何形式的公司敏感信息的泄露,所以本文中不会出现这个工具中的关键代码,即:

a.这篇文章中的代码都是用于描述方便而写的测试代码,而不会包含真实的项目代码。

b.这篇文章只讲技术,而不涉及业务处理。

三、为什么用Scheme来做为源语言?

首先要说一下,这个源语言是一个Scheme-like的语言,而不是Scheme本身,但语法非常相似。

那么为什么用Scheme的形式来做为源语言呢?直接用Java不就只需要把Java翻译成C++了么?

我选择用Scheme的原因是:

a.这个语言是一个动态类型语言,所以在语法上不会在声明中出现对象的类型。

b.Scheme-like实际上就是lisp-like(S表达式),这种语法形式非常简单,而且各种语言元素上高度统一,非常容易实现。

基于以上两点,以后如果我们再写一个图形工具(给业务方用户直接使用来编辑算法)来生成这个语言也会比较容易——如果要写一个GUI工具编辑好算法之后,生成的直接是Java代码,则有点过于困难了,虽然还是可以做到,但工作量上可能会是10倍,甚至数十倍的差距。所以,为了未来可能的处理方便,以及现在对语言本身的实现方便,这里选用一个在语言上“看似”无类型的,且语法简单的语法来做是比较好的。同时,因这个语言整个就是我在做,所以以后在现在语法的基础之上增加更具表达力的语法也并不会再困难。

四、关于类型

Scheme语言是一个动态类型的语言,而我的目标语言是Java和C++两个静态类型语言,所以这个Scheme-like语言只是在形式上是动态语言的,而本制上必须还是一个静态类型语言才行。那么即然在语言的文本上并不存在关于类型的声明,那么我们怎么知道翻译到Java和C++之后是什么类型呢?

关于类型识别分为如下几种情况:

a.业务代码直接掉用的接口是最简单的……后续补充。

b.函数内部的变量定义……后续补充。

c.对于内部的一个函数,情况最是复杂,比如:(define (fun m a) (m a))这样一个函数可以看出m是一个函数(或一个lambda),它接受一个参数a,但我们从这个函数中无法确定a是什么类型的,m的返回值是什么。而这此类型在Scheme中也是只有当运行时才可以确定的,但我们需要直接翻译到静态的代码中,这样我们实际上不得不通过一些手段以确定期类型……后续补充。

d.……

五、表达式与函数

在Scheme中,表达式都是有值的,所以我们可以写出这样的代码:(let ((a (if (< 1 2) 1 2))) a),而在C++和Java中表达式都是没有值的,所以我们不可以这样写:double x = {if (true) 1; else 2;},这样在本身的语法映射上就差别太大了。为了简化开发,还是把Scheme中的函数,都对应的在Java和C++代码中实现一个函数,这样就会比罗容易做这个翻译。

比如:在Scheme中if是一个函数,则在Java中实现一个这样的接口<T> T _if(Supplier<Boolean> cond, Supplier<T> exeBody1, Supplier<T> exeBody2);在C++中实现这样一个函数template<class T> T _if(std::function<bool()> cond, std::function<T()> exeBody1, std::function<T()> exeBody2);——这里使用lambda式参数的原因会在后面讲到。

再比如:在Scheme中+是一个函数,则在Java中实现一个这样的接口double add(double d1, double d2),在C++中也实现同样一个函数。

等等。

这些函数的实现都是只有一行的,C++编译器都是可以用inline的方式优化掉的,所以不会有什么性能问题,而Java语言并不会做inline这样的动作,但我就不清楚JVM是否会在运行时进行inline处理了。

六、关于延时计算

延时计算主要应用在两个方面:

……

七、关于短路

……

今天有点累了,改天再补完吧。

把Scheme翻译成Java和C++的工具的更多相关文章

  1. JavaScript翻译成Java

    这两天公司有一个需求,将一段加密的JavaScript代码转换为JAVA版. JavaScript中的某一段代码: 前期查看了整个JavaScript代码,发现代码中,方法里面嵌套方法,各种不合规的变 ...

  2. 一脸懵逼学习Hive的安装(将sql语句翻译成MapReduce程序的一个工具)

    Hive只在一个节点上安装即可: 1.上传tar包:这个上传就不贴图了,贴一下上传后的,看一下虚拟机吧: 2.解压操作: [root@slaver3 hadoop]# tar -zxvf hive-0 ...

  3. 【Java】 剑指offer(46) 把数字翻译成字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...

  4. java中为什么把Checked Exception翻译成受检的异常?

    6.Checked Exception(受检的异常) 马克-to-win:为什么我大胆的把Checked Exception翻译成受检的异常?因为这类异常,编译器检查发现到它后会强令你catch它或t ...

  5. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  6. 【Offer】[46] 【把数字翻译成字符串】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成"a",1翻译成"b",..... 1 ...

  7. ANTLR4将BF翻译成CPP

    实验环境: 操作系统:windows 10 JAVA:JDK 1.8 antlr:antlr-4.7.1-complete.jar IDE:IntelliJ IDEA 2017.2.7 实验目的: 实 ...

  8. 剑指 Offer 46. 把数字翻译成字符串 + 动态规划

    剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...

  9. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

随机推荐

  1. C项目实践--图书管理系统(2)

    前面在<<C项目实践-图书管理系统(1)>>中把系统中的三大功能模块中可能涉及到的常量,结构体及相关函数进行了声明定义,下来就来实现它们. 执行系统首先从登录到系统开始,所以首 ...

  2. mongodb02

    memcached redis : kv数据库(key/value) mongodb 文档数据库,存储的是文档(Bson->json对象二进制化后叫bson,js的二进制对象,引擎是用js实现的 ...

  3. YTU 1098: The 3n + 1 problem

    1098: The 3n + 1 problem 时间限制: 1 Sec  内存限制: 64 MB 提交: 368  解决: 148 题目描述 Consider the following algor ...

  4. eclipse相关技巧总结

    原文:http://licoolxue.iteye.com/blog/619983 eclipse作为被广泛使用的ide,基本的使用技巧每个人都会一些,然而可能并未充分发掘其潜力,也许我们并没有真正认 ...

  5. SELinux 初探

    SELinux:Security Enhanced Linux.SELinux 是 NSA(美国国家安全局)开发设计,整合到 Linux 内核中的一个模块. 0. 基本概念 DAC(Discretio ...

  6. BZOJ_1307_玩具_单调栈+双指针

    BZOJ_1307_玩具_单调栈+双指针 Description 小球球是个可爱的孩子,他喜欢玩具,另外小球球有个大大的柜子,里面放满了玩具,由于柜子太高了,每天小球球都会让妈妈从柜子上拿一些玩具放在 ...

  7. bzoj4276

    线段树优化建图+费用流 朴素的做法是每个强盗直接对每个区间的每个点连边,然后跑最大权匹配,这样有5000*5000条边,肯定过不去,那么我们用线段树优化一下,因为线段树能把一个O(n)的区间划分为O( ...

  8. java笔记之IO1

    File:文件和目录(文件夹)路径名的抽象表示形式 * 构造方法: *   File(String pathname):根据一个路径得到File对象 *   File(String parent, S ...

  9. Tinkoff Challenge - Elimination Round C. Mice problem(模拟)

    传送门 题意 给出一个矩形的左下角和右上角的坐标,给出n个点的初始坐标和运动速度和方向,询问是否存在一个时间使得所有点都在矩形内,有则输出最短时间,否则输出-1 分析 对于每个点如果运动过程中都不在矩 ...

  10. python 面向对象八 多继承

    python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...