[Solved] ECE421 Assignment 8 Rust and WebAssembly

$25

File Name: ECE421_Assignment_8__Rust_and_WebAssembly.zip
File Size: 386.22 KB

SKU: [Solved] ECE421 Assignment 8 – Rust and WebAssembly Category: Tag:
5/5 - (1 vote)

Question 1: WebAssembly is a small, well-defined language. It is specified using mainly sequent calculus. You can find the specification here: https://webassembly.github.io/spec/core/valid/instructions.html

Given this specification and notational conventions, we define several lower-level functions in

WebAssembly. Write sequent calculus definitions for the following functions; a- The instruction t.const results in the same generic type.

b- The instruction t.add takes two generic values and returns the same generic type c- The instruction t.eq takes two generic values and returns in an i32 value. Yes, WebAssembly implements Boolean as an Integer.

Question 2: Consider the following piece of code:

1 use hyper::rt::Future;2 use hyper::service::service_fn_ok;3 use hyper::{Body, Request, Response, Server};78 fn main() {9 let addr = ([127, 0, 0, 1], 3000).into();10 let server = Server::bind(&addr)11 .serve(|| { 12 service_fn(service_router)13 })14 .map_err(|e| eprintln!(server error: {}, e));1516 println!(Listening on http://{}, addr);17 hyper::rt::run(server);18 }1920 fn svc_wait(t: u64) -> impl Future<Item = (), Error = ()> {21 println!([start] waiting);22 let when = Instant::now() + Duration::from_millis(t);23 Delay::new(when)24 .map_err(|e| panic!(timer failed; err={:?}, e))25 .and_then(|_| {26 println!([end] waiting);27 Ok(())28 })29 }303132 fn fetch_data() -> impl Future<Item = future::FutureResult<RespStruct, 33 String>, Error = ()> {34 let uri: Uri = http://httpbin.org/get.parse().expect(Cannot parse35 URL);36 Client::new()37 .get(uri)38 // Future is polled here39 .and_then(|res| { 40 res.into_body().concat2()41 })42 .map_err(|err| println!(error: {}, err))
43 .map(|body| {44 let decoded: RespStruct =45 serde_json::from_slice(&body).expect(Couldnt deserialize);46 future::ok(decoded)47 })48 }495051 type BoxFut = Box<dyn Future<Item = Response<Body>, Error = hyper::Error>52 + Send>;535455 fn service_router(req: Request<Body>) -> BoxFut {56 let mut response = Response::new(Body::empty());5758 match (req.method(), req.uri().path()) {606162 (&Method::GET, /wait) => {63 let r = svc_wait(1500);64 hyper::rt::spawn(r);65 *response.body_mut() = Body::from(format!(Triggered waiting66 {}ms, 1500));67 }686970 (&Method::GET, /fetch) => {71 let r = fetch_data().map(|x| {72 println!(got data: {:?}, x);73 });74 hyper::rt::spawn(r);75 *response.body_mut() = Body::from(Sent request to external76 webservice);77 }7879 // more routers80 }81 eprintln!(Returning a response);82 Box::new(future::ok(response)) 83 }
  • Explain what do the numbers mean in line 9.
  • The function in line 20 uses Future; what is Future?
  • What does http://httpbin.org do (line 34)?
  • Give a definition for the body variable in line 45.
  • Explain the BoxFut type in line 51 f- Should BoxFut (Line 51) implement the Sync trait? g- Should BoxFut (Line 51) use a lifetime?

h- At some points, you will be using the following instruction:

$ curl localhost:3000/wait

What does curl do?

Does this code use Async/IO, if not, how would you change the program to use it? Question 3:

Question 3: Libra (libra.org) is a major new product from Facebook. Libra is a cryptocurrency platform. Facebook expect to make billions from Libra and revolutionize the financial industry.

a- What language is Libra written in? b- Discuss the technical reasons why this choice of language suits the application and its objectives.

c- Libra uses many standard packages, including lazy_static, tokio, failure, etc. Briefly, describe each of these packages.

Question 4: Consider the following program:

a- What is nighty channel in Rust (check Playground) b- What are unstable features? c- Why can playground run this code (think O.S.) d- What is the output from this code?

e- Provide comments for the lines ending in #

#![feature(asm)] fn main() {let message = String::from(James, you are completely mad
); syscall(message);} #[cfg(target_os = linux)] fn syscall(message: String) { let msg_ptr = message.as_ptr(); let len = message.len(); unsafe { asm!(mov $$1, %rax # mov $$1, %rdi # mov $0, %rsi # mov $1, %rdx # syscall # :: r(msg_ptr), r(len))}}

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[Solved] ECE421 Assignment 8  Rust and WebAssembly[Solved] ECE421 Assignment 8 Rust and WebAssembly
$25