Noop
是一门新的程序设计语言,更准确的说,它是一个实验,准备把一些优秀的工程实践集成到语言中,比如依赖注入、测试、代码可读性等等。不过,Noop实在太新了,新到很多东西还没有成型,也不要指望现在就用它来做些什么。但是,翻看一下Noop,还是发现一些有趣的东西。
Noop采用构建系统是Buildr
,
你可以把它理解成Ant或是Maven。Buildr是Apache的第一个Ruby项目,当然,它主要还是为Java系统服务。对很多项目而言,构建脚
本会随着系统的发展逐渐增大,里面逐渐也会出现很多逻辑,换句话说,构建脚本也是程序。这个理念的实践者,对于Ruby项目,自然就是Rake
,而C/C++项目,可以选择SCons
,
现在Java项目有了Buildr。Buildr内置的许多task,在项目不复杂的情况下,只要遵循约定,简单几行代码就可以把构建过程实现出来,充分
体现了“易者易为,难者可为”的理念。它甚至还支持生成Eclipse和IntelliJ IDEA的工程文件,省去了自己手工配置的烦恼。
Noop的主要开发语言是Scala。Scala近来的名头越来越响,Java之父James Gosling把它选做Java之外的第一选择
,Twitter用Scala改写了一些后端服务
,Groovy的创造者James Strachan甚至认为如果Scala早点可用,他就不会去写Groovy
。在编译器方面,Scala支持Parser Combinator,为人们提供了从零开始手工编写和用工具(像ANTLR和yacc)编写解析器之外的又一种选择。不过,Noop里面并没有运用Scala的这个方面能力,它用了ANTLR
,这也让我们有机会见识Scala的另一优秀之处,在Java类里直接使用Scala类。
具体看一下Noop。打开src/main,里面有三个目录:
- antlr,ANTLR的语法文件
- noop,用noop实现的标准库
- scala,Noop语言的实现
再来看看语言实现,scala/noop目录有几个包:
- grammer,调用ANTLR生成的类实现的解析器
- interpreter,实现了一个基本的解析器
- model,语言的基本模型
- types,一些基本类型,可以理解为Noop的运行时。
从现有的目录和代码,我们可以看到Noop还是非常简单的,它甚至不包含生成JVM字节码的部份,而且类型也是最基本的几个。
最后,让我们实际运行一段Noop程序,在此之前,你需要安装Mercurial(也就是hg)和Buildr,对于Ubuntu而言:
sudo apt-get install hg
sudo env JAVA_HOME=$JAVA_HOME gem install buildr
获得Noop的代码
hg clone https://noop.googlecode.com/hg/ noop
clone成功之后,进入到noop目录,构建整个noop
buildr
如果是第一次运行,可能它会用一段时间下载所需JAR文件,然后,才会执行编译,运行测试等任务。
打包的命令是这样的:
buildr package
有了生成的JAR包,我们可以运行Noop程序了,这里我们用了Noop提供了一个HelloWorld的例子程序,它位于examples/noop/helloworld/HelloWorld.noop。
java -jar target/noop-0.1.0-SNAPSHOT.jar HelloWorld examples/noop/helloworld src/main/noop/stdlib
还是那句话,Noop实在太新了,包括目前的命令行都是那么粗糙,它甚至不能加载自己的标准库,需要指定对应的路径。
Noop刚刚起步,对于希望了解语言实现的人,它可以当作一个起步的阶梯。
分享到:
- 2009-09-20 23:19
- 浏览 1306
- 评论(1)
- 论坛回复 / 浏览 (1 / 1786)
- 查看更多
相关推荐
这些算法在现代操作系统中已经有所改进,比如Linux采用了多种I/O调度器,如NOOP(无操作)、Anticipatory(预期)、CFQ(完全公平队列)和Deadline(截止时间)等,它们各自针对不同的工作负载进行了优化。...
- 'noop'是无操作的占位符,可能用于心跳或保持连接活跃。 - 'Payload'部分涉及到数据包的编码,Engine.IO使用'\xle'作为记录分隔符,并可能使用base64编码来传输数据。 Engine.IO的这种设计使其在复杂网络环境中...
在RFC 821中,你可以找到如HELO(Hello)、MAIL FROM、RCPT TO、DATA、RSET、VRFY、EXPN、NOOP、QUIT等一系列SMTP命令的定义和使用场景。 "www.pudn.com.txt"可能是从"PUDN"网站下载此资源时保留的记录文件,PUDN是...
1. **识别发送方**:客户端使用HELO(HELLO)命令向SMTP服务器发送问候,标识自己的域名。 2. **定义邮件发送者**:使用MAIL FROM命令,指定邮件的回信地址(reverse-path)。 3. **指定邮件接收者**:使用RCPT TO...
- **NOOP**:执行空操作,通常用于测试目的。 - **QUIT**:结束会话并关闭连接。 - **VRFY**:验证邮箱的存在性,出于安全考虑,很多服务器禁用了此命令。 - **EXPN**:验证和扩展邮箱列表,同样因为安全原因很少被...
4. **利用$.noop()优化空函数**: 当函数不需要做任何事情时,使用$.noop()代替空函数。 5. **避免在循环中使用jQuery方法**: 在循环内部使用JavaScript原生方法,如`for`循环,可以提高性能。 总结,jQuery 1.4.4...
- **全局工具函数**:如`.extend()`、`.noop()`等辅助函数。 #### 四、示例代码 - **jQuery: HelloWorld**: 1. 在Eclipse中创建一个新的静态Web项目。 2. 将jQuery库文件(例如`jquery-2.1.3.js`)复制到项目的...
command=echo 'hello' ``` - **注释**:在job文件中使用`#`来进行注释。 - **打包**:将job资源文件打包为.zip格式。 - **类型**: - `command`:执行shell命令。 - `javaprocess`:执行Java类。 - `java.class...
1. **HELLO 或 EHLO 命令**:用于客户端向服务器进行自我介绍。如果支持扩展SMTP命令,则使用EHLO,否则使用HELLO。 - **语法**:`HELLO <domain> CRLF` - **作用**:通知接收方SMTP服务器客户端的身份。 2. **...
from luma.core.interface.serial import spi, noop from luma.core.render import canvas from luma.oled.device import ssd1306 # 初始化设备 serial = spi(device=0, cs=0, dc=2, sclk=1) device = ssd1306...
- **NOOP**:执行无操作命令,通常用于测试连接是否仍然有效。 - **QUIT**:结束SMTP会话。 - **VRFY string**:验证是否存在指定的用户或邮件地址。 - **EXPN string**:验证是否存在邮件列表。 - **HELP**:请求...
如:`$('div').append('<p>Hello</p>')`。 4. **appendTo()** 和 **prependTo()**:将元素添加到其他元素的末尾/开头。与前两者相反,此操作会移动元素。 5. **html()** 和 **text()**:获取或设置元素的HTML内容...
.withUser("user").password("{noop}password").roles("USER"); } } ``` - **AbstractSecurityWebApplicationInitializer**:这是一个抽象类,可以简化 Spring MVC 和 Spring Security 的集成。 - **无现成 ...
const MyComponent: React.FC<Props> = ({ name }) => <div>Hello, {name}!; ``` 2. **Props和State的类型约束**:通过接口来声明组件所需的props和state,确保传递的数据类型正确。 ```typescript interface ...