КСВ делится на 3 типа:
1 за ВМ
2 за сборщик мусора
3 за ручное управление
А если посмотреть с другой стороны?
4 за траспайлеры
rust
available-targets
Взять тот же Blazor webassembly — монструозная надстройка над html и js.
и хотя нам обещают бешенную производительность, пока (уже несколько лет) этого не произошло.
Вероятно потому что V8 одна из самых оптимизированных существующих ВМ.
Ну и зачем оно спрашивается?
Когда можно взять относительно простой F# и собрать код под js и получить на выходе рабочее приложение без дополнительных прослоек.
или rust и получить бинарь аналогичный тем, что пишут растаманы?
| Giraffe.ViewEngine(F#) |
| let index (items : seq<string>) = html [ _lang "ru"] [ul [] [ yield! items |> Seq.map (fun e -> li [] [str e])]];;
val index: items: string seq -> XmlNode
> index ["alice"; "bob"; "jack" ] |> RenderView.AsString.htmlDocument ;;
val it: string =
"<!DOCTYPE html>
<html lang="ru"><ul><li>alice</li><li>bob</li><li>jack</li></ul></html>"
> index ["alice"; "bob"; "jack" ];;
val it: XmlNode =
ParentNode
(("html", [|KeyValue ("lang", "ru")|]),
[ParentNode
(("ul", [||]),
[ParentNode (("li", [||]), [Text "alice"]);
ParentNode (("li", [||]), [Text "bob"]);
ParentNode (("li", [||]), [Text "jack"])])])
|
| |
Вот пример F# -> Rust при помощи Fable.
Плюшки очевидны: код прост, программа нативная без сборщика мусора.
type Person = { Name : string }
[<EntryPoint>]
let main args =
let alice = { Name = "Alice" }
printfn "Hello, %A!" alice
0
#![allow(dead_code,)]
#![allow(non_camel_case_types,)]
#![allow(non_snake_case,)]
#![allow(non_upper_case_globals,)]
#![allow(unreachable_code,)]
#![allow(unused_attributes,)]
#![allow(unused_imports,)]
#![allow(unused_macros,)]
#![allow(unused_parens,)]
#![allow(unused_variables,)]
use fable_library_rust::NativeArray_::array_from;
use fable_library_rust::String_::fromString;
pub mod Program {
use super::*;
use fable_library_rust::Native_::LrcPtr;
use fable_library_rust::NativeArray_::Array;
use fable_library_rust::String_::string;
#[derive(Clone, Debug, Default, PartialEq, PartialOrd, Hash, Eq, Ord,)]
pub struct Person {
pub Name: string,
}
impl core::fmt::Display for Program::Person {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{}", core::any::type_name::<Self>())
}
}
pub fn main(args: Array<string>) -> i32 {
let alice: LrcPtr<Program::Person> =
LrcPtr::new(Program::Person{Name: string("Alice"),});
println!("Hello, {:?}!", alice);
0_i32
}
}
pub fn main() {
let args = std::env::args().skip(1).map(fromString).collect();
Program::main(array_from(args));
}