- cross-posted to:
- programming@programming.dev
- cross-posted to:
- programming@programming.dev
New favorite tool 😍
Compiling to bash seems awesome, but on the other hand I don’t think anyone other than the person who wrote it in amber will run a bash file that looks like machine-generated gibberish on their machine.
Compiling to bash seems awesome
See, i disagree because
I don’t think anyone other than the person who wrote it in amber will run a bash file that looks like machine-generated gibberish on their machine.
Lol I barely want to run (or read) human generated bash, machine generated bash sounds like a new fresh hell that I don’t wanna touch with a ten foot pole.
I disagree. People run Bash scripts they haven’t read all the time.
Hell some installers are technically Bash scripts with a zip embedded in them.
Why not write… Bash?
As someone who has done way too much shell scripting, the example on their website just looks bad if i’m being honest.
I wrote a simple test script that compares the example output from this script to how i would write the same if statement but with pure bash.
here’s the script:
#!/bin/bash age=3 [ "$(printf "%s < 18\n" "$age" | bc -l | sed '/\./ s/\.\{0,1\} 0\{1,\}$//')" != 0 ] && echo hi # (( "$age" < 18 )) && echo hi
Comment out the line you dont want to test then run
hyperfine ./script
I found that using the amber version takes ~2ms per run while my version takes 800microseconds, meaning the amber version is about twice as slow.
The reason the amber version is so slow is because: a) it uses 4 subshells, (3 for the pipes, and 1 for the $() syntax) b) it uses external programs (bc, sed) as opposed to using builtins (such as the (( )), [[ ]], or [ ] builtins)
I decided to download amber and try out some programs myself.
I wrote this simple amber program
let x = [1, 2, 3, 4] echo x[0]
it compiled to:
__AMBER_ARRAY_0=(1 2 3 4); __0_x=("${__AMBER_ARRAY_0[@]}"); echo "${__0_x[0]}"
and i actually facepalmed because instead of directly accessing the first item, it first creates a new array then accesses the first item in that array, maybe there’s a reason for this, but i don’t know what that reason would be.
I decided to modify this script a little into:
__AMBER_ARRAY_0=($(seq 1 1000)); __0_x=("${__AMBER_ARRAY_0[@]}"); echo "${__0_x[0]}"
so now we have 1000 items in our array, I bench marked this, and a version where it doesn’t create a new array. not creating a new array is 600ms faster (1.7ms for the amber version, 1.1ms for my version).
I wrote another simple amber program that sums the items in a list
let items = [1, 2, 3, 10] let x = 0 loop i in items { x += i } echo x
which compiles to
__AMBER_ARRAY_0=(1 2 3 10); __0_items=("${__AMBER_ARRAY_0[@]}"); __1_x=0; for i in "${__0_items[@]}" do __1_x=$(echo ${__1_x} '+' ${i} | bc -l | sed '/\./ s/\.\{0,1\}0\{1,\}$//') done; echo ${__1_x}
This compiled version takes about 5.7ms to run, so i wrote my version
arr=(1 2 3 10) x=0 for i in "${arr[@]}"; do x=$((x+${arr[i]})) done printf "%s\n" "$x"
This version takes about 900 microseconds to run, making the amber version about 5.7x slower.
Amber does support 1 thing that bash doesn’t though (which is probably the cause for making all these slow versions of stuff), it supports float arithmetic, which is pretty cool. However if I’m being honest I rarely use float arithmetic in bash, and when i do i just call out to bc which is good enough. (and which is what amber does, but also for integers)
I dont get the point of this language, in my opinion there are only a couple of reasons that bash should be chosen for something a) if you’re just gonna hack some short script together quickly. or b) something that uses lots of external programs, such as a build or install script.
for the latter case, amber might be useful, but it will make your install/build script hard to read and slower.
Lastly, I don’t think amber will make anything easier until they have a standard library of functions.
The power of bash comes from the fact that it’s easy to pipe text from one text manipulation tool to another, the difficulty comes from learning how each of those individual tools works, and how to chain them together effectively. Until amber has a good standard library, with good data/text manipulation tools, amber doesn’t solve that.
This is the complete review write up I love to see, let’s not get into the buzzword bingo and just give me real world examples and comparisons. Thanks for doing the real work 🙂
Here’s a language that does bash and Windows batch files: https://github.com/batsh-dev-team/Batsh
I haven’t used either tool, so I can’t recommend one over the other.
If their official website isn’t https://batsh.it I’m going to be very sad.
Edit: ☹️
The only issue I have is the name of the project. They should have gone with a more distinct name.
I can’t believe they didn’t with go with BatShIt. it’s right there! they were SO close!
I’m very suspicious of the uses cases for this. If the compiled bash code is unreadable then what’s the point of compiling to bash instead of machine code like normal? It might be nice if you’re using it as your daily shell but if someone sent me “compiled” bash code I wouldn’t touch it. My general philosophy is if your bash script gets too long, move it to python.
The only example I can think of is for generating massive
install.sh
Just learn Bash lol
I’m trying but I’m shooting my own foot all the time 😢
It’s okay it’s filled with foot guns.
I like the idea in principle. For it to be worth using though, it needs to output readable Bash.
Why?
Because you still need to be able to understand what’s actually getting executed. There’s no debugger so you’ll still be debugging Bash.
I checked the docs, and I’m a bit confused with one thing. They show that you can capture the stdout of a command into a variabe, but they never show stderr being captured. How would that work?
Like this: ‘’’ $mv file.txt dest.txt$ failed { echo “It seems that the file.txt does not exist” } ‘’’
Knowing if a command failed and capturing stderr (which contains stuff like error messages) are not the same thing.
Cool to see that after Cotowali was sadly abandoned due to lack of funding. Please, fund the FOSS projects you use!
Why not compile it to sh though.
There is no sh shell. /bin/sh is just a symlink to bash or dash or zsh etc.
But yes, the question is valid why it compiles specifically to bash and not something posix-compliant
There is no sh shell.
lol
Yes, there was the bourne sh on Unix but I don’t see how that’s relevant here. We’re talking about operating systems in use. Please explain the downvotes
It’s relevant because there are still platforms that don’t have actual Bash (e.g. containers using Busybox).
sh
is not just a symlink: when invoked using the symlink, the target binary must run in POSIX compliant mode. So it’s effectively a sub-dialect.Amber compiles to a language, not to a binary. So “why doesn’t it compile to
sh
” is a perfectly reasonable question, and refers to the POSIX shell dialect, not to the/bin/sh
symlink itself.Thanks
Cool website
Late to the party. Idris had a bash backend (i.e. you could compile Idris to bash), and it’s already bit rotted with new Idris versions.
I hope the language is at least as cool as Idris.
let
What are you talking about?
About the
let
keyword, which is used to declare a variable.I thought so, but why do they object? Do they want Bash’s error-prone implicit variable declaration?
They, most probably, just didn’t like the name.
The Javascript style syntax
The language idea is good, but:
THREE.WebGLRenderer: A WebGL context could not be created. Reason: WebGL is currently disabled
.Seriously? Why do I need WebGL to read TEXT in docs? :/
Gotta try, the website seems amazing