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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 又一個基於JVM的程式語言:FlixJVM
- 十九、Go語言基礎之併發Go
- GO語言併發Go
- Scala 的基礎語法
- 《Go 語言程式設計》讀書筆記 (六) 基於共享變數的併發Go程式設計筆記變數
- 第09章 Go語言併發,Golang併發Golang
- Scala基礎語法
- Go語言併發程式設計Go程式設計
- XLM — 基於BERT的跨語言模型模型
- scala基礎語法-----Spark基礎Spark
- GO 語言的併發模式你瞭解多少?Go模式
- JVM 還支援哪些語言JVM
- 滴滴基於Go語言的DevOps重塑之路Godev
- 自然語言處理之:搭建基於HanLP的開發環境自然語言處理HanLP開發環境
- 基於GO語言框架Gin開發的MVC輪子框架:GinLaravelGo框架MVCLaravel
- Go語言的100個錯誤使用場景(55-60)|併發基礎Go
- Go語言 | CSP併發模型與Goroutine的基本使用Go模型
- Scala是世界上最好的語言(一):Type Bound
- 2020-09-29【學習筆記】scala語言(三十三) scala中的抽象方法筆記抽象
- 基於C語言的Q格式使用詳解C語言
- JVM筆記 -- JVM的發展以及基於棧的指令集架構JVM筆記架構
- 基於MDK建立純組合語言--組合語言
- 2020-09-25【學習筆記】scala語言(二十九) scala中的建立物件筆記物件
- PostgreSQL 併發控制機制(3):基於時間戳的併發控制SQL時間戳
- 樂觀的併發策略——基於CAS的自旋
- 歸併排序——C語言排序C語言
- Go語言專案實戰:併發爬蟲Go爬蟲
- 2018年第18周-Java語言思想-併發Java
- 基於go語言gin框架的web專案骨架Go框架Web
- 基於Dart語言的開源後端框架:UpperDart後端框架
- 基於Mixin Network的Go語言比特幣開發教程:建立機器人Go比特幣機器人
- 使用Scala語言實現基本影像識別
- JVM筆記 -- Java跨平臺和JVM跨語言JVM筆記Java
- 基於go語言學習工廠模式Go模式
- Go語言 | 併發設計中的同步鎖與waitgroup用法GoAI
- c語言的基礎C語言
- 基於 LNMP 的 Nginx 百萬併發之路 (三)基於域名的虛擬主機LNMPNginx
- Scala 函數語言程式設計(一) 什麼是函數語言程式設計?函數程式設計
- 基於 go 語言開發部署的部落格 免費開源供參考Go