A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | AB | AC | AD | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | category | trait | trait_scalar | javascript | javascript_comment | typescript | typescript_comment | rust | rust_comment | python | python_comment | java | java_comment | ocaml | ocaml_comment | go | go_comment | c | c_comment | cpp | cpp_comment | bash | bash_comment | gleam | gleam_comment | elm | elm_comment | ||||
2 | correctness | well modeled fallibility | 3 | 1 | present in exceptions, null, undefined, cb sigs. extremely non-uniform, but present | 2 | present in exceptions, null, undefined, cb sigs. extremely non-uniform, but present. however, strict mode allows for greatly improved detection, even if modeling not uniform | 3 | universal monadic impls | 2 | None, exception | 2 | null, Exception | 3 | 1 | 1 | 1 | 0 | 3 | 3 | |||||||||||
3 | correctness | memory safety - compile time | 3 | na | na | 3 | na | na | na | 1 | bad memory behaviors not strictly caught at compile time, like invalid method access on a struct, or range error | 1 | 2 | na | na | 3 | |||||||||||||||
4 | correctness | memory safety - run time | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 1 | 1 | 3 | 3 | 3 | ||||||||||||||||
5 | correctness | collection transforms (e.g. functional operators, functor, iter streams/xforms, etc) | 2 | 2 | basic functional ops and iter capabilities | 2 | basic functional ops and iter capabilities | 3 | entirely unmatched iter tooling with extremely productive and capable batteries | 1 | procedural loops and comprehensions only, weak functional iter capabilities. itertools package common, but pales in comparison to other langs | 2 | diverse selection of iter tooling, including streams() intfcs, but lesser than the competion | 2 | 1 | 1 | 2 | 0 | 3 | 2 | |||||||||||
6 | correctness | laziness | 1 | 1 | generators | 1 | generators | 2 | async naturally lazy, generators, ...mainly opt in | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||
7 | correctness | types - existent | 3 | na | 3 | 3 | 0 | typings module is inadequate for non-trival typing | 3 | 3 | 3 | 2 | 2 | na | 3 | 3 | |||||||||||||||
8 | correctness | types - type mapping | 1 | na | 3 | 2 | there, less ergo: https://stackoverflow.com/a/67532477/1438908 | 0 | 0 | https://docs.oracle.com/javase/tutorial/java/generics/index.html | 2 | module X = struct ... type t = X.t Map ... blarg | 1 | 1 | 1 | na | 1 | 1 | |||||||||||||
9 | correctness | types - inference | 2 | na | 3 | 3 | 0 | 2 | 3 | 2 | 1 | 1 | na | 3 | 3 | ||||||||||||||||
10 | correctness | types - alegbraic | 2 | na | 2 | 1 | https://stackoverflow.com/questions/45065518/how-to-show-that-the-rust-type-system-supports-algebraic-data-types-adts, but standard algebraic operations are not as easily expressable as FP | 0 | 0 | 3 | 0 | 0 | 2 | na | 1 | 2 | |||||||||||||||
11 | correctness | types - completeness | 3 | na | 2 | you can mix ts/js, but it's not what is observed in practice at user level. package level source language variance is high, with plenty of JS deps | 3 | 0 | 3 | 3 | 3 | 3 | 3 | na | 3 | 3 | |||||||||||||||
12 | correctness | types - advanced (dependent, hkt, etc) | 1 | na | 1 | 1 | ??? | 0 | 0 | 3 | 0 | 0 | 1 | na | 3 | 3 | |||||||||||||||
13 | correctness | types - structual | 1 | na | 3 | na | https://beachape.com/blog/2021/05/25/structural-typing-in-rust/ | na | na | na | na | 3 | 3 | na | na | na | |||||||||||||||
14 | correctness | types - nominal | 1 | na | 2 | branding is easy, but 3p | 3 | na | 3 | 3 | 3 | na | na | na | 3 | 3 | |||||||||||||||
15 | developer ux | paradigm - functional | 0 | 2 | 2 | fp is harder without hkt | 2 | 1 | 1 | 3 | 0 | 1 | 1 | 1 | 3 | 3 | |||||||||||||||
16 | developer ux | paradigm - procedural | 0 | 3 | 3 | 2 | 3 | 1 | 3 | 3 | 3 | 2 | 3 | 2 | 0 | ||||||||||||||||
17 | developer ux | paradigm - oop | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 3 | 0 | 0 | 0 | ||||||||||||||||
18 | developer ux | meta-programming | 1 | 0 | 0 | 3 | 0 | 2 | 1 | ppx is rough | 1 | reflection. yay. | 2 | 2 | 0 | 0 | 1 | ||||||||||||||
19 | developer ux | debugger | 1 | 3 | 3 | 1 | 2 | 2 | 1 | don't get me started | 3 | 2 | 3 | 0 | 1 | 1 | |||||||||||||||
20 | developer ux | ide - syntax | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 3 | 3 | ||||||||||||||||
21 | developer ux | ide - launch | 1 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 3 | 3 | 1 | 1 | 2 | ||||||||||||||||
22 | developer ux | ide - completions | 1 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 2 | 3 | 2 | 2 | 3 | ||||||||||||||||
23 | developer ux | ide - task execution | 1 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 2 | 3 | 1 | 1 | 1 | ||||||||||||||||
24 | developer ux | learning - teachable | 2 | 3 | 3 | 2 | 3 | 3 | 2 | 3 | 2 | 2 | 3 | 3 | 3 | ||||||||||||||||
25 | developer ux | learning - accessible | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | ||||||||||||||||
26 | developer ux | project - hydration/bootstrap | 1 | 3 | clone, npm i, npm start | 3 | 3 | 2 | 1 | 1 | have mercy | 3 | 1 | 1 | 1 | 3 | 2 | ||||||||||||||
27 | performance | efficent machine/bytecode | 2 | na | 2 | 3 | 1 | 2 | 3 | 2 | 3 | 3 | 1 | 3 | 1 | ||||||||||||||||
28 | performance | abstractions - memory cost | 3 | 1 | astractions often cost objects | 2 | astractions often cost objects, but fancy types can reduce weight | 3 | 1 | abstractions = classes | 1 | 2 | e.g. Option::None does carry cost in some scenarios | 2 | 3 | 3 | 1 | 1 | 2 | ||||||||||||
29 | performance | abstractions - cpu cost | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 2 | ||||||||||||||||
30 | performance | common compile duration | 1 | na | 2 | 1 | na | 2 | 2 | famous, but practically, on par | 3 | rips | 3 | 2 | 3 | 2 | 2 | ||||||||||||||
31 | developer ux | batteries - standard modules | 1 | 1 | 3p libs oft required | 1 | 2 | 3 | 3 | 1 | famously lack of | 3 | 2 | 2 | 1 | 3 | 2 | ||||||||||||||
32 | developer ux | batteries - testing | 2 | 2 | none, but clear 3p winners | 1 | none, but clear 3p winners | 3 | 3 | 1 | none, but clear 3p winners | 1 | 3 | 1 | 1 | 1 | 1 | 2 | |||||||||||||
33 | developer ux | batteries - project/repo management | 2 | 3 | unmatched, npm + scripts + deps | 3 | unmatched, npm + scripts + deps | 2 | 1 | setup.py, non std impl patterns | 1 | swaths of metadata, oft ide driven for common project. present, but compare to others | 2 | dune | 2 | 1 | 1 | 1 | 3 | 2 | |||||||||||
34 | ecosystem | batteries - packaging & distribution | 3 | 3 | unmatched | 3 | unmatched | 2 | 1 | famously non std toolkits (requirements, pip-lock, etc) | 2 | 1 | opam. works, less ergo than alt envs | 3 | 1 | 1 | 1 | 3 | 3 | ||||||||||||
35 | ecosystem | module abundance | 3 | 3 | unmatched | 3 | unmatched | 3 | 3 | 2 | https://vegibit.com/wp-content/uploads/2018/05/npm-package-counts.png | 2 | 3 | 2 | 2 | 3 | 1 | 3 | |||||||||||||
36 | community | support - community | 3 | 3 | 3 | 3 | 3 | 3 | 1 | great 1:1 issues (SO, discord), online resources small | 3 | 3 | 3 | 3 | 3 | 2 | |||||||||||||||
37 | community | support - enterprise | 1 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 3 | 3 | 2 | 1 | 1 | ||||||||||||||||
38 | ecosystem | tooling - builds | 1 | 3 | 3 | 3 | 3 | 3 | 2 | 3 | 3 | 3 | 2 | 2 | 3 | ||||||||||||||||
39 | ecosystem | tooling - ci/cd | 1 | 3 | 3 | 3 | 3 | 3 | 1 | 3 | 3 | 3 | 2 | 2 | 2 | ||||||||||||||||
40 | ecosystem | tooling - asset management | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 2 | 2 | ||||||||||||||||
41 | ecosystem | maturity | 2 | 3 | 3 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 3 | ||||||||||||||||
42 | hiring | hiring availability | 2 | 3 | 2 | 1 | 3 | 3 | 1 | 3 | 2 | 2 | 3 | 1 | 1 | ||||||||||||||||
43 | |||||||||||||||||||||||||||||||
44 | |||||||||||||||||||||||||||||||
45 | |||||||||||||||||||||||||||||||
46 | |||||||||||||||||||||||||||||||
47 | |||||||||||||||||||||||||||||||
48 | |||||||||||||||||||||||||||||||
49 | |||||||||||||||||||||||||||||||
50 | |||||||||||||||||||||||||||||||
51 | |||||||||||||||||||||||||||||||
52 | |||||||||||||||||||||||||||||||
53 | |||||||||||||||||||||||||||||||
54 | |||||||||||||||||||||||||||||||
55 | |||||||||||||||||||||||||||||||
56 | |||||||||||||||||||||||||||||||
57 | |||||||||||||||||||||||||||||||
58 | |||||||||||||||||||||||||||||||
59 | |||||||||||||||||||||||||||||||
60 | |||||||||||||||||||||||||||||||
61 | |||||||||||||||||||||||||||||||
62 | |||||||||||||||||||||||||||||||
63 | |||||||||||||||||||||||||||||||
64 | |||||||||||||||||||||||||||||||
65 | |||||||||||||||||||||||||||||||
66 | |||||||||||||||||||||||||||||||
67 | |||||||||||||||||||||||||||||||
68 | |||||||||||||||||||||||||||||||
69 | |||||||||||||||||||||||||||||||
70 | |||||||||||||||||||||||||||||||
71 | |||||||||||||||||||||||||||||||
72 | |||||||||||||||||||||||||||||||
73 | |||||||||||||||||||||||||||||||
74 | |||||||||||||||||||||||||||||||
75 | |||||||||||||||||||||||||||||||
76 | |||||||||||||||||||||||||||||||
77 | |||||||||||||||||||||||||||||||
78 | |||||||||||||||||||||||||||||||
79 | |||||||||||||||||||||||||||||||
80 | |||||||||||||||||||||||||||||||
81 | |||||||||||||||||||||||||||||||
82 | |||||||||||||||||||||||||||||||
83 | |||||||||||||||||||||||||||||||
84 | |||||||||||||||||||||||||||||||
85 | |||||||||||||||||||||||||||||||
86 | |||||||||||||||||||||||||||||||
87 | |||||||||||||||||||||||||||||||
88 | |||||||||||||||||||||||||||||||
89 | |||||||||||||||||||||||||||||||
90 | |||||||||||||||||||||||||||||||
91 | |||||||||||||||||||||||||||||||
92 | |||||||||||||||||||||||||||||||
93 | |||||||||||||||||||||||||||||||
94 | |||||||||||||||||||||||||||||||
95 | |||||||||||||||||||||||||||||||
96 | |||||||||||||||||||||||||||||||
97 | |||||||||||||||||||||||||||||||
98 | |||||||||||||||||||||||||||||||
99 | |||||||||||||||||||||||||||||||
100 |