java编程计算机语言java会不会被其他计算机语言java替代,为啥

我在之前的文章中说过多次大學生在校期间应该去搞定那些基础知识,因为大学生没有工作的压力有大块的时间,基础知识相对枯燥要想有成就感,可以做一些简單的系统例如一个简单的编程计算机语言java,一个有基本功能的OS......

杨韬是我的知识星球“码农翻身”的一个大学生他在星球提到做了一个簡单的编程计算机语言java解释器,我建议他把过程给写出来 就是这篇文章了。

下文的“我”就是杨韬

为什么要自己写一个解释器?

从大学開始学习编程, 现在已经快两年了 接触了不少的编程计算机语言java。最开始入门学了C计算机语言java; 后来想写安卓软件 学了Java; 接着接触后台开發,学了Python; 后面又陆续地接触Go Dart, C++ 仔细算算, 已经接触过6门计算机语言java了!

但是仔细想想我似乎又什么也没有学到过年回家的时候, 遇到┅个对计算机很感兴趣的四年级的小朋友(ps: 小朋友会写一点点python html, 现在的小孩也太强了) 问了我诸如计算机上面的程序是怎么跑起来的, 代碼是怎么运行这种看似很基础的问题 可悲的是我居然对这些问题似懂非懂, 不能给小朋友很清楚地解释出来

我都不好意思说自己是学計算机的了, 居然连这些基础的问题都没有搞清楚 这是促使我去深入学习编译原理, 计算机组成原理和操作系统这些基础知识的重要原洇

学习编译原理最简单的方法(对我来说)大概是自己实现一门编程计算机语言java, 虽然费时费力 不过能对整个过程有个清晰的了解。

另外┅个重要原因是有一种想要自己写一门计算机语言java的冲动 尤其是在学了这么多门计算机语言java之后就会萌生出这样的念头。不同的计算机語言java有不同的让我喜欢的特性: Python有漂亮简洁的语法 静态计算机语言javaGo实现了像动态计算机语言java一样的鸭子类型的接口, Dart有很多语法糖和方便嘚异步… (当然这些特性是仁者见仁 智者见智的)。

但是又不能找到一门计算机语言java具备所有自己喜欢的特性, 那就自己写一个好了可鉯把自己喜欢的特性都加上。

学校的编译原理的课程安排在了大三 我还没有学过, 所以一切都是从0开始 我先看了前桥和弥写的《自制編程计算机语言java》一书, 这本书的实战性很强 没有介绍太多的理论知识, 而是直接教你怎么写编程计算机语言java

我从这本书中了解了写┅门编程计算机语言java的大致过程和大致的思路。 不过书中的很多解释不够充分 对于完全没有接触过编译技术的人来说还是有点费解(也可能是我自己理解能力不够好)。

我也是在自己了解了大致思路后就开始自己尝试写 然后再回过头来看书, 看作者提供的源代码 才能比较恏地了解作者是在干嘛。

还有一些书中内容介绍的不够充分 比如yacc和lex的使用。 这种工具毕竟比较流行 网上找找别人写的博客多看看, 自巳再多尝试就能很好地掌握

因为更喜欢在实战中学习, 所以前期只是了解了大致思路没有特别深入的学习理论知识 就直接开始码代码叻。 在具体实现的过程中遇到问题 再去看书或是网上寻找答案。

我选择写一个动态计算机语言java的解释器 而不是静态计算机语言java的编译器。

之所以要写解释器 不是因为我更偏好动态计算机语言java, 其实相比而言我更喜欢静态计算机语言java 真正的原因是, 我觉得这只是***次尝試 很多东西都不会, 肯定会写得很烂的不如先就写动态计算机语言java, 等真正学得比较好了 再回过头来写一门自己喜欢的计算机语言java。

正式开始写代码前 我还要给这门计算机语言java取个名字,虽然只是个练手的项目 不过还是得有个名字吧。 取名字还正不是一件容易得倳 就像给函数或者类取一个恰如其分的名字一样。

听说恰当的函数名或类名还能反应整个项目的设计是否合理 逻辑清晰, 计算机语言java嘚名字似乎并没有这样的意义

我脑袋里闪过的***个名字是Cactus(仙人球, 仙人掌) 我觉得很喜欢这个名字, 就把Cactus暂时留个我要写的静态计算机语訁java了(希望我真的会写 没有白留)。 仙人球是植物(正好是静态的) 同样带刺的动物是刺猬(Hedgehog)。 动物是动态的 正好符合我要写的动态计算机语訁java, 于是就叫Hedgehog了

前面提到了lex和yacc, 我在自己写的编程计算机语言java里面也使用了这两个工具做词法分析和语法分析 既然是自己要写一门计算机语言java为什么还要用别的工具呢? 当然不能以”不重复造轮子”作为借口, 我就是为了造轮子才想要自己写编程计算机语言java的 真正的目嘚是为了简单。

前面提到我把这当作一个练手的项目 为了熟悉整个过程, 我把简单作为了整个过程的一个原则很多地方我可以想到更優但更加复杂的实现方式, 但是大多数仍然采用了最简单最能保持整个项目逻辑清晰的实现方式 我更多的目的是为了了解整体过程, 整體结构 所以局部就尽量保持简单了吧(当然比较懒也是重要原因)。

当然后续词法分析和语法分析肯定会自己实现一下 毕竟这算是编译器戓者解释器的前端, 也很重要的

解释器是用C计算机语言java写的。 之前从来没有用C计算机语言java写过这么大的项目(虽然到目前一共也就2千多行嘚代码) 这次也让我学会了很多C计算机语言java的高级用法。 比如 :

是一个返回值为空 参数为空的函数指针;

之所以用函数指针, 是为了用C计算机语言java写面向对象 最开始我完全是使用面向过程, 只是简单的通过不同文件实现简单的封装

后来越写越大, 就出现各种问题 比如頭文件交叉引用引起编译器报错。 还有很多地方用面向对象可以更好地实现 比如要处理表达式的创建和求值, 如果能有一个表达式的接ロ 就能利用多态的好处, 不需要再写一个巨大的switch case语句, 使用枚举来判断不同的表达式 调用不同的函数。

我听说限制程序员的不是编程计算机语言java而是编程思维 C计算机语言java当然也可以写面向对象, 数据可以封装在结构体中 再给结构体加上函数指针就实现了类的方法。

多态也可以通过自己实现虚函数表 在对象初始化时把函数指针指向不同的函数就实现了。 大多数的面向对象的特性都有相应的方法实現 只不过是语法上不如原生支持面向对象的计算机语言java简单罢了。

还有一些问题是关于这门计算机语言java本身的设计问题:

(1) for if这类的语句Φ变量的作用域问题

一开始我设计的是Java, C++一样的 for, if的代码块中声明的变量 它作用域只存在于整个代码块中。 后来想到了这是一门弱类型的动态计算机语言java 独立的运行环境也没什么特别的用处, 于是就改成了和Python一样: 这种代码块都没有独立的运行环境

(2) 把函数看成什么的問题。

比如Java这种纯粹面向对象的计算机语言java 函数只能是对象的方法。 我这里是把函数作为一种基础数据类型 像字符串一样, 可以直接鼡于传参 赋值。

毕竟这是自己的编程计算机语言java可以把它设计成自己喜欢的样子, 所以大多数的设计都是根据自己的想法 自己觉得怎么合理就怎么来(当然不是天马行空地胡乱设计, 而是根据自己地实际经验选择合理的设计吧)

当然最开始写一门编程计算机语言java的时候,有很多地方不知道怎么设计才合理 这个时候我就参考自己学过的编程计算机语言java, 想想它为什么要采用这种设计 出于怎样的考虑。

這样的思考 让我对之前学过的编程计算机语言java有有了更加深刻的认识, 可以说是受益匪浅吧 我渐渐地也认识到编程计算机语言java的设计佷多时候都是设计者编程思维的体现。

说了这么多 是时候简单地介绍一下我写的这门编程计算机语言java了。目前还很简陋 后面再慢慢地唍善它吧。

hedgehog 的多数设计和 python 比较相似 无需声明变量类型, iffor等语句没有块级作用域。

语法上又有点像 go 计算机语言java: if for后面不需要(), 但是后面嘚代码块都必须加{};

大多数设计都是为了简化实现方式 比如必须加{}, ;是为了简化语法的解析

function也被看作一种值(基本数据类型), 不过目前还没囿对它实现垃圾回收, 所以直接以函数赋值或者其他操作会出现内存错误。

目前只实现了一个原生函数print print接收一个基本数据类型作为参数, 輸出并换行 或者无参数, 直接换行

大多数与c保持一致, 除了& |。 因为没有提供位运算的功能 所以直接用这两个符号表示逻辑与和逻輯或。

“What I cannot create I do not understand。” 我喜欢这种从自己制作过程中学习的方式 这种方式给了我一种踏实感, 让我觉得自己是真地明白了整个过程而不是仅僅记住了什么公式, 学会了调用新的API

【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】



  • Obj-C不一定消亡但很可能在未来的幾年不再火热,甚至掉出TIBCO的TOP10亦有可能完全取决于苹果的战略。这个世界总是在开放和封闭(尤其是软硬一体)中不断更替,此起彼落
  • Java。Paul大叔曾经将Java和Cobol比对并预研Java会死亡,那是2003年[1]如今,在Server和Desktop领域Java的进展确实相当缓慢。而Android的横空出世却为这个老迈的计算机语言java注叺了新的活力。我想在整个Android生态体系已经建成的时候,Google不太可能那么快放弃Java而改推其他计算机语言java除非有90年代末Java相对于C++那样的契机。

一年后回头看这个问题,先引鼡另外一个答案:

强类型静态类型,语法糖克制C like语法
跨平台,虚拟机JIT,AOT垃圾回收
完全开源,同时有数个大公司共同推动
DSL支持(不確定)JVM支持(不确定)

这说的不就是vert.x吗

强类型,静态类型语法糖克制,C like语法
跨平台虚拟机,JITAOT,垃圾回收
完全开源同时有数个大公司共同推动
DSL支持(不确定)JVM支持(不确定)

前一个不确定是polyglot,后一个不确定强化成graalvm不仅支持jvm,还支持编译成native

然后我们还可以加入一些額外的特性

比如有足够多的第三方仓库maven+npm已经不得了了,这里还能加上gem和pip的package

这些东西用来做互联网是够了

但是我更期待c/c++的ffi的强化因为我們要用vulkan等3d api来整游戏

是将来挑战,或者说取代现有架构的一个方向

实际上做到这一步的java其实已经不是传统认为的那种写在spring的java了

是加强版的java,实际上java最近的社区里面越来越多地加入了其他计算机语言java的生态

graal,vert.x只是刚开始以后你会越来越多地看到其他计算机语言java出现在java的系統中

所以将来真正替代java的,应该是polyglot多计算机语言java的生态,而不会是一个计算机语言java

java和c可能是历史上唯有的两个被大规模使用的计算机語言java,而将来更有可能是百花齐放的polyglot

然后框架嘛vert.x了

最新的java官推,也在转述一篇文章

我要回帖

更多关于 计算机语言java 的文章

 

随机推荐