A comparison of array languages & libraries: APL, J, BQN, Uiua, Q, Julia, R, NumPy, Nial, Futhark, Dex, Ivy, SaC & ArrayFire.
Cuda
232
197 commits
updated Feb 1, 2025
Array Language & Library Comparisons
This is a collection of idioms and small programs in APL, J, BQN, Julia, R, NumPy, Nial, Futhark & SaC.
There are several sites that do these kinds of comparisons:
| General | Array Language Specific | Array Library Specific |
|---|---|---|
| Rosetta Code | BQN-Dyalog Dictionary | ArrayFire-MATLAB-NumPy |
| Programming-Idioms | BQN-Dyalog Dictionary | ArrayFire-Eigen |
| J-Dyalog APL Rosetta | ArrayFire-Numpy | |
| Q-APL Dictionary | MatX-MATALB-NumPy |
| Language | π² | Main Website | Help / Docs | Online REPL | |
|---|---|---|---|---|---|
| π | Dyalog APL | dyalog.com | Dyalog Help | TryAPL | |
| π | Kap | kapdemo.dhsdevelopments.com | Kap Ref | Kap Interpreter | |
| π | TinyAPL | tinyapl.rubenverg.com | TinAPL Primitives | Online REPL | |
| π | J | jsoftware.com | J NuVoc | J Playground | |
| π | BQN | mlochbaum.github.io/BQN | BQN Docs | BQNPAD | |
| π | Uiua | uiua.org | Uiua Docs | UiuaPAD | |
| π | Q | π² | code.kx.com/q | Q Ref | β |
| π | Julia | julialang.org | Julia Docs | Replit | |
| π | MATLAB | π² | mathworks.com/products/matlab.html | MATLAB Help | π² |
| π | NumPy* | numpy.org | NumPy Docs | Replit | |
| π | R | r-project.org | R Docs | JDoodle | |
| π | Nial | nial-array-language.org | Nial Dictionary | TIO | |
| π | Futhark | futhark-lang.org | Futhark Docs | β | |
| π | Dex | github.com/google-research/dex-lang | InDex | β | |
| π | Ivy | pkg.go.dev/robpike.io/ivy | Ivy Docs | β | |
| ππ | SaC | sac-home.org | SaC Docs | β | |
| π | ArrayFire* | arrayfire.com | ArrayFire Docs | β | |
| π | MatX* | nvidia.github.io/MatX | MatX API Ref | β | |
| π | ATen* | - | ATen Docs | β | |
| π | Eigen* | eigen.tuxfamily.org | Eigen Dox | Godbolt |
* Library, not an actual language
LA = Leading AxisTA = Trailing AxisAA = Axis Agnostic() = ParenthesesLR = Left to RightRL = Right to Left| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| APL | π | 1 (or βIO) | LA/TA | RL | Row |
| Kap | π | 0 | LA/TA | RL | Row |
| TinyAPL | π | 0 | LA | RL | Row |
| J | π | 0 | LA | RL | Row |
| BQN | π | 0 | LA | RL | Row |
| Uiua | π | 0 | LA | RL | Row |
| Q | π | 0 | β | RL | Row |
| Julia | π | 1 | AA | () | Column |
| MATLAB | π | 1 | LA | () | Column |
| NumPy | π | 0 | AA | () | Row |
| R | π | 1 | AA | () | Column |
| Nial | π | 1 | AA | LR | Row |
| Futhark | π | 0 | β | LR | Row |
| Dex | π | 0 | () | ||
| Ivy | π | 1 (or origin) | β | RL | Row |
| SaC | β | 0 | LA | () | Row |
| ArrayFire | β | 0 | LA | () | Column |
| MatX | β | 0 | LA | () | Row |
| 6 | 7 | 8 | 9 | |
|---|---|---|---|---|
| APL | β’ | β΄ | β΄β΄ | Γ/β΄ |
| Kap | β’ | β΄ | β΄β΄ | Γ/β΄ |
| TinyAPL | β’ | β΄ | ΟΌ | Γββ΄ |
| J | # | $ | $$ | */@$ |
| BQN | β | β’ | = | ΓΒ΄β’ |
| Uiua | β§» | β³ | β§»β³ | β§»β |
| Q | count | β | β | count raze |
| Julia | size(a, 1) | size(a) | ndims(a) | length(a) |
| MATLAB | length(a) | size(a) | rank(a) | numel(a) |
| NumPy | len(a) | a.shape | np.ndim(a) | a.size |
| R | dim(a)[1] | dim(a) | length(dim(a)) | length(a) |
| Nial | first shape | shape | valence | tally |
| Futhark | length | β | β | flatten |> length |
| Dex | size* | β | β | |
| Ivy | 1 take rho | rho | rho rho | rho , |
| SaC | shape(a)[0] | shape(a) | shape(shape(a)) | prod(shape(a)) |
| ArrayFire | a.dims()[0] | a.dims()* | a.numdims()* | a.elements() |
| MatX | a.Shape()[0] | a.Shape() | a.Rank() | TotalSize(a) |
π Means the REPL has certain limitations
rlwrapIf you are using Q, Nial, Futhark or other languages with REPL limitations, you can get around this by invoking with rlwrap. On Linux using the Q REPL:
sudo apt install rlwrap
rlwrap taskset -c 2 ./q
Note that even when using rlwrap, some of the limitations will remain (such as CTRL + arrows).
| Language | 1a | 1b | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| APL | π | β | π | π | π | π | π | π | π | π |
| Kap | π | π | π | π | π | π | π | π | π | π |
| TinyAPL | π | π | π | π | π | π | π | π | π | π |
| J | π | π | π | π | π | π | π | π | π | π |
| BQN | π | π | π | π | π | π | π | π | π | π |
| Uiua | π | π | π | π | π | π | π | π | π | π |
| Q | π | π | π | π | π | π | π | π | π | π |
| Julia | β | π | π | β | π | π | π | π | π | π |
| MATLAB | π | β | π | β | π | π | π | π | π | π |
| NumPy | π | π | π | β | π | π | π | π | π | π |
| R | π | π | π | π | π | π | π | π | π | π |
| Nial | π | β | π | π | π | π | π | π | π | π |
| Futhark | π | π | π | π | π | π | π | π | π | π |
| Dex | β | β | π | β | π | π | π | β | ||
| Ivy | β | β | π | π | π | π | π | π | π | π |
| SaC | π | π | π | π | π | π | π | π | π | π |
| ArrayFire | π | π | π | π | π | π | π | π | π | π |
| MatX | π | π | π | π | π | π | π | π | π | π |
Cuda
59.7%
C++
23.8%
CMake
13.7%
MATLAB
1.8%
Makefile
1.1%
A comparison of array languages & libraries: APL, J, BQN, Uiua, Q, Julia, R, NumPy, Nial, Futhark, Dex, Ivy, SaC & ArrayFire.
Cuda
232
197 commits
updated Feb 1, 2025
Array Language & Library Comparisons
This is a collection of idioms and small programs in APL, J, BQN, Julia, R, NumPy, Nial, Futhark & SaC.
There are several sites that do these kinds of comparisons:
| General | Array Language Specific | Array Library Specific |
|---|---|---|
| Rosetta Code | BQN-Dyalog Dictionary | ArrayFire-MATLAB-NumPy |
| Programming-Idioms | BQN-Dyalog Dictionary | ArrayFire-Eigen |
| J-Dyalog APL Rosetta | ArrayFire-Numpy | |
| Q-APL Dictionary | MatX-MATALB-NumPy |
| Language | π² | Main Website | Help / Docs | Online REPL | |
|---|---|---|---|---|---|
| π | Dyalog APL | dyalog.com | Dyalog Help | TryAPL | |
| π | Kap | kapdemo.dhsdevelopments.com | Kap Ref | Kap Interpreter | |
| π | TinyAPL | tinyapl.rubenverg.com | TinAPL Primitives | Online REPL | |
| π | J | jsoftware.com | J NuVoc | J Playground | |
| π | BQN | mlochbaum.github.io/BQN | BQN Docs | BQNPAD | |
| π | Uiua | uiua.org | Uiua Docs | UiuaPAD | |
| π | Q | π² | code.kx.com/q | Q Ref | β |
| π | Julia | julialang.org | Julia Docs | Replit | |
| π | MATLAB | π² | mathworks.com/products/matlab.html | MATLAB Help | π² |
| π | NumPy* | numpy.org | NumPy Docs | Replit | |
| π | R | r-project.org | R Docs | JDoodle | |
| π | Nial | nial-array-language.org | Nial Dictionary | TIO | |
| π | Futhark | futhark-lang.org | Futhark Docs | β | |
| π | Dex | github.com/google-research/dex-lang | InDex | β | |
| π | Ivy | pkg.go.dev/robpike.io/ivy | Ivy Docs | β | |
| ππ | SaC | sac-home.org | SaC Docs | β | |
| π | ArrayFire* | arrayfire.com | ArrayFire Docs | β | |
| π | MatX* | nvidia.github.io/MatX | MatX API Ref | β | |
| π | ATen* | - | ATen Docs | β | |
| π | Eigen* | eigen.tuxfamily.org | Eigen Dox | Godbolt |
* Library, not an actual language
LA = Leading AxisTA = Trailing AxisAA = Axis Agnostic() = ParenthesesLR = Left to RightRL = Right to Left| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| APL | π | 1 (or βIO) | LA/TA | RL | Row |
| Kap | π | 0 | LA/TA | RL | Row |
| TinyAPL | π | 0 | LA | RL | Row |
| J | π | 0 | LA | RL | Row |
| BQN | π | 0 | LA | RL | Row |
| Uiua | π | 0 | LA | RL | Row |
| Q | π | 0 | β | RL | Row |
| Julia | π | 1 | AA | () | Column |
| MATLAB | π | 1 | LA | () | Column |
| NumPy | π | 0 | AA | () | Row |
| R | π | 1 | AA | () | Column |
| Nial | π | 1 | AA | LR | Row |
| Futhark | π | 0 | β | LR | Row |
| Dex | π | 0 | () | ||
| Ivy | π | 1 (or origin) | β | RL | Row |
| SaC | β | 0 | LA | () | Row |
| ArrayFire | β | 0 | LA | () | Column |
| MatX | β | 0 | LA | () | Row |
| 6 | 7 | 8 | 9 | |
|---|---|---|---|---|
| APL | β’ | β΄ | β΄β΄ | Γ/β΄ |
| Kap | β’ | β΄ | β΄β΄ | Γ/β΄ |
| TinyAPL | β’ | β΄ | ΟΌ | Γββ΄ |
| J | # | $ | $$ | */@$ |
| BQN | β | β’ | = | ΓΒ΄β’ |
| Uiua | β§» | β³ | β§»β³ | β§»β |
| Q | count | β | β | count raze |
| Julia | size(a, 1) | size(a) | ndims(a) | length(a) |
| MATLAB | length(a) | size(a) | rank(a) | numel(a) |
| NumPy | len(a) | a.shape | np.ndim(a) | a.size |
| R | dim(a)[1] | dim(a) | length(dim(a)) | length(a) |
| Nial | first shape | shape | valence | tally |
| Futhark | length | β | β | flatten |> length |
| Dex | size* | β | β | |
| Ivy | 1 take rho | rho | rho rho | rho , |
| SaC | shape(a)[0] | shape(a) | shape(shape(a)) | prod(shape(a)) |
| ArrayFire | a.dims()[0] | a.dims()* | a.numdims()* | a.elements() |
| MatX | a.Shape()[0] | a.Shape() | a.Rank() | TotalSize(a) |
π Means the REPL has certain limitations
rlwrapIf you are using Q, Nial, Futhark or other languages with REPL limitations, you can get around this by invoking with rlwrap. On Linux using the Q REPL:
sudo apt install rlwrap
rlwrap taskset -c 2 ./q
Note that even when using rlwrap, some of the limitations will remain (such as CTRL + arrows).
| Language | 1a | 1b | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| APL | π | β | π | π | π | π | π | π | π | π |
| Kap | π | π | π | π | π | π | π | π | π | π |
| TinyAPL | π | π | π | π | π | π | π | π | π | π |
| J | π | π | π | π | π | π | π | π | π | π |
| BQN | π | π | π | π | π | π | π | π | π | π |
| Uiua | π | π | π | π | π | π | π | π | π | π |
| Q | π | π | π | π | π | π | π | π | π | π |
| Julia | β | π | π | β | π | π | π | π | π | π |
| MATLAB | π | β | π | β | π | π | π | π | π | π |
| NumPy | π | π | π | β | π | π | π | π | π | π |
| R | π | π | π | π | π | π | π | π | π | π |
| Nial | π | β | π | π | π | π | π | π | π | π |
| Futhark | π | π | π | π | π | π | π | π | π | π |
| Dex | β | β | π | β | π | π | π | β | ||
| Ivy | β | β | π | π | π | π | π | π | π | π |
| SaC | π | π | π | π | π | π | π | π | π | π |
| ArrayFire | π | π | π | π | π | π | π | π | π | π |
| MatX | π | π | π | π | π | π | π | π | π | π |
Cuda
59.7%
C++
23.8%
CMake
13.7%
MATLAB
1.8%
Makefile
1.1%