Rust
语言编译成WASM
)Wired Logic - a pixel-based digital circuit simulator running in a browser (Rust compiled into WASM).
受wired-logic
启发,wired-logic-rs
是一个基于像素的数字电路模拟器,核心技术采用Rust
和WebAssembly
wired-logic-rs 是怎么工作的呢?系统先对图像进行扫描,然后采集一个线路,电能源,和各种晶体管,收集成一个集合, 然后对这些集合元素运行模拟仿真程序,只要确保模拟的状态不会重复就算是模拟成功。然后再把模拟仿真结果渲染在一个GIF格式的图像上。
手动编译步骤:
$ wasm-pack build
$ npm install
$ npm run serve # to start the webpack dev server
$ npm run bundle # to create the production bundle
点击进入模拟例子-Goto the Online Simulator
更多请阅读-Read More in Project Github
Multiversion 0.5.0, now "production ready"
Multiversion
- 是Rust
语言支持多版本函数的属性宏.
什么是function multiversioning
?
大部分的CPU架构都有自己独特的指令集支持一些额外的功能。最常见的例子包括
x86/x86-64
上的SSE & AVX
,NEON
上的ARM/AArch64
指令集扩展Single Instruction, Multiple Data(SIMD)
。这些指令集扩展可以给某些特殊的函数提升大量的运行速度。这些特殊的功能是不能胡乱的编译到一个 不支持这些特殊功能CPU的可执行文件里去的,那样往往会造成系统崩溃。
Function multiversioning
是一种特殊的编译方法,通过编译包含特殊功能支持的不同版本的函数 能够在运行时runtime
检测到这些特殊的功能并匹配不同的版本的可执行函数。
Function multiversioning功能:
例子:用clone
属性宏来实现多版本函数,类似GCC的target_clones
use multiversion::multiversion;
#[multiversion]
#[clone(target = "[x86|x86_64]+avx")]
#[clone(target = "x86+sse")]
fn square(x: &mut [f32]) {
for v in x {
*v *= *v;
}
}
用multiversion和target属性宏来实现多版本函数.use multiversion::{multiversion, target};
#[target("[x86|x86_64]+avx")]
unsafe fn square_avx(x: &mut [f32]) {
for v in x {
*v *= *v;
}
}
#[target("x86+sse")]
unsafe fn square_sse(x: &mut [f32]) {
for v in x {
*v *= *v;
}
}
#[multiversion]
#[specialize(target = "[x86|x86_64]+avx", fn = "square_avx", unsafe = true)]
#[specialize(target = "x86+sse", fn = "square_sse", unsafe = true)]
fn square(x: &mut [f32]) {
for v in x {
*v *= *v;
}
}
更多信息请点击crates官网说明-Read More
下面链接是长达40多页纸的调查报告
Active Rust developers estimated at 0.6 million (pdf, page 10)
How to install rust on Windows 10 (native)
下面是快速安装Windows 10 2004
的步骤:
Build Tools for Visual Studio 2019
,一般这个下载隐藏在微软下载链接的"Tools for Visual Studio 2019"
下面。Build Tools for Visual Studio 2019 Installer
并选择:C++ Tools
C++ Tools
中还必须同时选择安装"Windows 10 SDK"
,安装程序提供多个版本,选最新的版本安装就好。测试看看是否安装成功:
cd %TEMP%
cargo new toolchain_test
cd toolchain_test
cargo run
然后你应该可以得到一个编译的过程并看到结果显示"Hello, world!"
如果遇到类似cargo command not found
的错误,你需要检查一下你的%PATH%
看看是否设置好。
Apache Spark
的Rust
语言绑定Rust bindings for Apache Spark
这里例子演示使用Ballista Rust DataFrame API运行一个Apache Spark的查询请求.
Rust Client:
例子程序使用Ballista's的[Rust DataFrame](https://github.com/ballista-compute/ballista/blob/master/rust/src/dataframe.rs).
创建一个逻辑查询计划,对一个CVS文件做聚合查询:
let spark_master = "local[*]";let mut spark_settings = HashMap::new();spark_settings.insert("spark.app.name", "rust-client-demo");spark_settings.insert("spark.ballista.host", "localhost");spark_settings.insert("spark.ballista.port", "50051");let ctx = Context::spark(spark_master, spark_settings);let path = "/mnt/nyctaxi/csv/yellow/2019/yellow_tripdata_2019-01.csv";let df = ctx.read_csv(path, Some(nyctaxi_schema()), None, true)?.aggregate( vec![col("passenger_count")], // group by vec![min(col("fare_amount")), max(col("fare_amount"))] // aggregates)?;// print the query plandf.explain();// collect the results from the Spark executorlet results = df.collect().await?;// display the resultsutils::print_batches(&results)?;
当代码执行的时候collect()
函数会将逻辑计划编码成protobuf格式, 然后发送给在spark_settings
设置中设置了服务端口并运行了Ballista Spark Executor
执行器的远程服务器节点。
上面的例子程序将执行显示如下结果:
Aggregate: groupBy=[[#passenger_count]], aggr=[[MIN(#fare_amount), MAX(#fare_amount)]]
TableScan: /mnt/nyctaxi/csv/yellow/2019/yellow_tripdata_2019-01.csv projection=None
+-----------------+-------+-----------+
| passenger_count | MIN | MAX |
+-----------------+-------+-----------+
| 1 | -362 | 623259.86 |
| 6 | -52 | 262.5 |
| 3 | -100 | 350 |
| 5 | -52 | 760 |
| 9 | 9 | 92 |
| 4 | -52 | 500 |
| 8 | 7 | 87 |
| 7 | -75 | 78 |
| 2 | -320 | 492.5 |
| 0 | -52.5 | 36090.3 |
+-----------------+-------+-----------+
Spark Executor Ballista的Spark执行器Spark Executor在收到客户端发送过来的使用protobuf格式编码的逻辑查询计划请求后翻译成如下的Spark执行计划:
== Physical Plan ==
*(2) HashAggregate(keys=[passenger_count#3], functions=[min(fare_amount#10), max(fare_amount#10)])
+- Exchange hashpartitioning(passenger_count#3, 200), true, [id=#18]
+- *(1) HashAggregate(keys=[passenger_count#3], functions=[partial_min(fare_amount#10), partial_max(fare_amount#10)])
+- *(1) Project [passenger_count#3, fare_amount#10]
+- BatchScan[passenger_count#3, fare_amount#10] CSVScan Location: InMemoryFileIndex[file:/mnt/nyctaxi/csv/yellow/2019/yellow_tripdata_2019-01.csv], ReadSchema: struct<passenger_count:int,fare_amount:double>
上面的例子是用到了Apache Arrow Flight协议, 想了解更多请参阅SparkFlightProducer代码实现。
Upgrade Rust's Android SDK to API level 16 #71123
---- From 日报小组 BobQ(qwy16)