Scala,基於JVM的併發語言
無意中看到這篇文章,開始還以為是在Java中實現Threadless的併發,結果看下去才發現是基於JVM的一門語言 Scala。它物件導向,函式式,靜態型別,更重要是克隆了Erlang裡面的程式間通訊的概念。
下載後,使用它的編譯器編譯,生成了很多.class,原來不是用Java來解析執行,而是編譯成JVM相容的位元組碼,並且能夠呼叫java類庫。這裡是一個PingPong的例子
package examples.actors
import scala.actors.Actor
import scala.actors.Actor._
abstract class PingMessage
case class MsgStart() extends PingMessage
case class MsgPingInit(count: int, pong: Pong) extends PingMessage
case class MsgSendPing extends PingMessage
case class MsgPong(sender: Pong) extends PingMessage
abstract class PongMessage
case class MsgPing(sender: Ping) extends PongMessage
case class MsgStop() extends PongMessage
object PingPong {
def main(args : Array[String]): Unit = {
val ping = new Ping
ping.start
val pong = new Pong
pong.start
ping ! MsgPingInit(100000, pong)
ping ! MsgStart
}
}
class Ping extends Actor {
def act(): unit = {
loop(0, null)
}
def loop(pingsLeft: int, pong: Pong): unit = {
react {
case MsgPingInit(count, pong) => {
System.out.println("Ping: Initializing with count:"+count+":"+pong)
loop(count, pong)
}
case MsgStart() => {
System.out.println("Ping: starting.")
pong ! MsgPing(this)
loop(pingsLeft-1, pong)
}
case MsgSendPing() => {
pong ! MsgPing(this)
loop(pingsLeft-1, pong)
}
case MsgPong(pidS) => {
if (pingsLeft % 100 == 0) {
System.out.println("Ping: pong from: "+pidS)
}
if (pingsLeft > 0)
this ! MsgSendPing()
else {
System.out.println("Ping: Stop.")
pong ! MsgStop()
}
loop(pingsLeft, pong)
}
}
}
}
class Pong extends Actor {
def act(): unit = {
loop(0)
}
def loop(pongCount: int): unit = {
react {
case MsgPing(pidPing) => {
if (pongCount % 100 == 0) {
System.out.println("Pong: ping:"+pongCount+" from: "+pidPing)
}
pidPing ! MsgPong(this)
loop(pongCount+1)
}
case MsgStop() => {
System.out.println("Pong: Stop.")
System.exit(0)
}
}
}
}
編譯:
D:\scala-2.3.3\bin>scalac -d classes D:\scala-2.3.3\doc\scala-devel\scala\exampl
es\actors\PingPong.scala
執行:scala -cp classes examples.actors.PingPong
輸出:
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85300 from: examples.actors.Ping@dd87b2
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85400 from: examples.actors.Ping@dd87b2
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85500 from: examples.actors.Ping@dd87b2
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85600 from: examples.actors.Ping@dd87b2
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85700 from: examples.actors.Ping@dd87b2
Ping: pong from: examples.actors.Pong@1a73d3c
Pong: ping:85800 from: examples.actors.Ping@dd87b2
用JAD反編譯了生成的.class,裡面基本上沒有用太多反射,效能應該還是值得信賴的。
這語言是05年開發的,現在最新版本2.3.3。感覺它只是克隆了微程式間訊息通訊,模式匹配這些部分,對於分佈這方面還沒有涉及。關注之。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-277837/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java環境中基於jvm的兩大語言:scala,groovyJavaJVM
- JVM 併發性: Java 和 Scala 併發性基礎JVMJava
- 又一個基於JVM的程式語言:FlixJVM
- 十九、Go語言基礎之併發Go
- 有趣的 Scala 語言: 簡潔的 Scala 語法
- GO語言併發Go
- Rust語言神奇的併發模型Rust模型
- 《Go 語言程式設計》讀書筆記 (六) 基於共享變數的併發Go程式設計筆記變數
- 第09章 Go語言併發,Golang併發Golang
- Scala 的基礎語法
- Go語言是徹底的面向組合的併發語言Go
- 基於物件的JavaScript語言(轉)物件JavaScript
- Scala基礎語法
- Scala併發程式設計程式設計
- Go語言併發程式設計Go程式設計
- JVM相容語言 stabJVM
- XLM — 基於BERT的跨語言模型模型
- goweb,基於go語言的API框架GoWebAPI框架
- GO 語言的併發模式你瞭解多少?Go模式
- scala基礎語法-----Spark基礎Spark
- scala 語言值得去學習嗎
- Scala確實是門好語言
- JVM 還支援哪些語言JVM
- Oracle EBS 基於Host併發程式的開發Oracle
- 基於GO語言框架Gin開發的MVC輪子框架:GinLaravelGo框架MVCLaravel
- 自然語言處理之:搭建基於HanLP的開發環境自然語言處理HanLP開發環境
- goweb,基於go語言API框架GoWebAPI框架
- Go語言 | CSP併發模型與Goroutine的基本使用Go模型
- plsql開發語言基礎SQL
- Scala: 感覺像動態的靜態語言
- JVM筆記 -- JVM的發展以及基於棧的指令集架構JVM筆記架構
- 有趣的 Scala 語言: 使用遞迴的方式去思考遞迴
- PostgreSQL 併發控制機制(3):基於時間戳的併發控制SQL時間戳
- Go語言的100個錯誤使用場景(55-60)|併發基礎Go
- 基於 Scala 的產品開發實踐 | 掘金技術徵文
- 基於 Scala Trait 的設計模式AI設計模式
- 基於C語言的Q格式使用詳解C語言
- 滴滴基於Go語言的DevOps重塑之路Godev