暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JShell和Shebang

开源中间件 2021-09-10
570

今天我们从简单而好玩,容易上手的特性开始。


JShell


JShell从就能字面理解,即Java Shell,Java的一个交互式终端界面,正式的称呼为REPL(Read-eval-print-loop)交互式的解释器。

一般来说,解释性的语言都有REPL界面的,如Python, Ruby,而编译性的语言就没有,比如C,C++。Java语言之前一直也没有,只是基于JVM的语言,如Scala,Groovy都提供REPL。


如今Java程序员大多都是从IDE开始学习的,IDE开发环境自然比REPL Shell提供了强大太多的功能。

但如果没有IDE呢?我还记得我初学计算机时的,中华学习机上Basic语言界面上跳跃的字符,一个儿童的各种遐想能通过一行行语句的输入,和显示的信息得到证实。

没错,使用REPL界面是用来尝试学习一门新语言极好的方式。尽管对于大学生以上的成年人,IDE入门是最有效率的,而对于中小学生,使用JShell这样的REPL界面,来学习一门语言,我个人认为是极有好处的。

应该说比Scratch这样完全图示化语言的更接近实用性,而又比C/C++的简化版IDE更能体会语言的妙处。当然,Python也是初学者一个很好的选择。


JShell是Java9以后加入的,通过jshell命令就可以呼出,非常方便。

通过输入/help命令就可以查询到jshell支持的命令,反馈的结果即时可见,非常有利于调试小型三方库。

我们用一个小例子来说明如何把玩jshell:


mp3agic是一个java编写的mp3文件信息解析库,可以从中央仓库下到jar包,地址为

http://central.maven.org/maven2/com/mpatric/mp3agic/0.9.1/mp3agic-0.9.1.jar

我们使用JDK11 build 26,在启动时需要引入mp3agic的jar包


$ ./java -version

openjdk version "11-ea" 2018-09-25

OpenJDK Runtime Environment 18.9 (build 11-ea+26)

OpenJDK 64-Bit Server VM 18.9 (build 11-ea+26, mixed mode)


$ ./jshell --class-path x1/down/mp3agic-0.9.1.jar 

|  Welcome to JShell -- Version 11-ea

|  For an introduction type: help intro

jshell> 


我们使用这个mp3库提供的类来打开一个迈克尔杰克逊的mp3,先导入必要的类

jshell> import static java.lang.System.out

jshell> import com.mpatric.mp3agic.*


jshell> Mp3File mp3 = new Mp3File("/tmp/mj.mp3")

mp3 ==> com.mpatric.mp3agic. Mp3File@370736d9


可以看到打印出一个类实例的正常信息,表示这个mp3已经正常打开了。


jshell> ID3v2 id2v2Tag = mp3.getId3v2Tag()

id2v2Tag ==> com.mpatric.mp3agic. ID3v23Tag@63753b6d

我们获取mp3文件中附带的信息


jshell> out.print(id2v2Tag.getAlbum())

King Of Pop

jshell> out.print(id2v2Tag.getArtist())

Michael Jackson

jshell> out.print(id2v2Tag.getTitle())

Beat It

jshell> out.print(id2v2Tag.getYear())

2010-02-10


以上读出了该mp3文件对应的唱片名称,歌手姓名,歌曲名,以及发行年份。

当然,更多的信息可以进一步读出。如果你想成为歌手,可以这样:


jshell> id3v2Tag.setArtist("张三");

jshell> mp3.save("zhangsan.mp3");


可以设想你可以从网上找到各种三方包,导入并边学边玩。

我计划有空时给孩子整理一个minecraft的程序包,这样在游戏中学习,能编程构建出精妙的建筑,以及创造出别致的工具,是不是很有趣呢?


综上所述,JShell提供一个直接了当使用Java的工具,对于Java开发工程师,提供了一个媲美解释性语言的能力,对于数据分析,系统管理等方面也很有用处。


Shebang


如果说JShell很容易理解的化,Shebang(设?帮?)是个什么鬼?

熟悉Unix的同学都知道"#!"组合符号吧,这个就被成为shebang,其实就是

hash + bang的写法(hashbang -> sha-bang -> shebang)

!叹号(Exclamation mark)在计算机中被称为bang,没错,按照拼音读法就对。(如果你不熟悉bang的顿挫的读法,说明你没有经历过Linux环境下Bash的蹂躏。下面是抢答时间:“#!, $!, !!, !^“分别代表什么意思? 能不查网络全部答对,Linux基本功说明不错)


Shebang #!组合符号,就是告诉bash,这个执行文件可以通过哪个命令来执行,比如说#!/bin/bash, #!/bin/python等。

这样说来,java可以难道自行启动了

对,从Java11起,普通的java源代码文件可以在设置可执行属性后,可以直接启动:

我们创建一个java文件,叫做helloPengyou,里面是正常的java源代码。


#!/x1/java/jdk-11/bin/java --source 11


public class HelloPengyou {

  public static void main(String[] args) {

    System.out.println("Hello Peng youquan");

  }

}


第一行用shebang告诉shell,使用java程序来启动,并告知为jdk11代码。

需要给helloPengyou赋予可执行属性


$ chmod 0755 simpleInterest

$ ./helloPengyou 

Hello Peng youquan

Java圈的朋友们,惊喜不惊喜?


其实这里的原理是,java程序做了一个精简


javac -d <memory> Hello.java

java -cp <memory> hello


先调用类似javac在内存中进行编译,再用java来解释执行,通过shebang来找到java程序的位置。


所以其实是java直接解释执行java源文件。此处似乎有个bug,我需要把文件名更换一下,以及注释掉shebang定义才能运行成功。


$ mv helloPengyou HelloPengyou.java /并注释第一行

$ /x1/java/jdk-11/bin/java HelloPengyou.java

Hello Pengyouquan


至此,java语言具备了单个文件“解释”执行能力。我们可以设想,同jshell结合起来,开发者可以快速的利用三方库实现小的功能,并执行验证。


以上就是Java在文件解释执行方面的新优功能归纳,相对比较简单,我也不深入探寻相应的实现原理了,希望对大家有所启发。


文章转载自开源中间件,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论