[HN Gopher] A statically typed scripting language that transpile... ___________________________________________________________________ A statically typed scripting language that transpiles to Posix sh Author : TaKO8Ki Score : 193 points Date : 2022-03-25 13:54 UTC (9 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | bhussai20 wrote: | Let me preface by saying this is pretty cool. | | I feel that this seems like a good idea on paper, and a bad idea | in the wild. | | Last time I looked into shell syntax and such, I found out that | most shells don't. They vary so greatly that very large context- | free grammars have to be used to cover most of their context- | sensitive rules. I don't think being POSIX compliant changes | that. | | I suspect that if this got popular usage, the bugs would be quite | numerous. | goombacloud wrote: | I also wonder if targeting bash which has things like pipefail | and arrays could make things easier in the implementation side? | remus wrote: | I wonder whether there's a subset of shell syntax that's stable | enough and powerful enough that it could be used as the | compilation target whilst avoiding the incompatibilities you | mention? | tux1968 wrote: | Would be nice if the language supported a #! bang line in order | to make it a bit easier to execute, rather than manually typing | "lic run X". Although of course on Linux you can always use | https://en.wikipedia.org/wiki/Binfmt_misc without needing the | bang line. | perlgeek wrote: | Nice, a language written a pretty obscure language (V) and using | a pretty obscure build tool (z). I have a fondness for people | using unusual tools for their hobby projects. | | POSIX shell is a good compilation target if you want to write a | non-trivial build system, but be able to run it on some old or | otherwise challenging systems. | ducktective wrote: | So it's APE (actually portable executable) but for POSIX systems | which instead of binary uses scripting. | | nice | nomemory wrote: | Back in the day i had a similar idea, and i even started | implementing it, but never had the resilience to finish. It waa | too difficult for me at that time (probably even now). I am glad | that finally someone had the courage to do it. | JustLurking2022 wrote: | Definitely a niche that needs a solution - cool to see one! | beepbooptheory wrote: | looks like the task runner part [1] has unfortunate name overlap | with the family of programs that include z.lua[2] or zoxide [3] | or z.sh [4]. | | Not really that big of a deal, I just like tracking command line | apps naming because it is an interesting exercise of being short, | intuitive, and unique. When you decide a single letter is your | name, surely you are going to run into this. | | 1. https://github.com/zakuro9715/z 2. | https://github.com/skywind3000/z.lua 3. | https://github.com/ajeetdsouza/zoxide 4. | https://github.com/rupa/z | throwaway894345 wrote: | This seems neat. I love that there are examples front-and-center | on the README page. This is exactly what I want and the first | thing I would think to put when demonstrating a new language, but | sadly this is rare. | | I'm not sure how I'd use something like this, but I've often | found myself wanting simple statically typed scripting languages | for generating YAML/HCL/etc configs. Dhall seems close, but | config is something that every engineer has to touch and the | burden of making everyone learn its syntax and functional | programming idioms probably negates the advantages of using | static typing. I've also looked into CUE, but it seems like it's | largely neglecting the problem that I'm trying to solve DRY | configs in favor of some problem I didn't know I had (unifying a | bunch of layers of mostly-static configs?). This seems even worse | than Dhall with respect to burden:reward ratio. I haven't yet | checked out Nickel (the statically typed Nix language)--would be | curious to hear from those who have. | | EDIT: just skimmed Nickel. It seems like it's trying to hew | closely to Nix syntax and functional programming conventions, | which suggests it probably shares many of the same problems as | Dhall. Too bad. It seems like no one understands the assignment. | sdevonoes wrote: | What I miss in the README page is the output of the | transpilation. | JyB wrote: | I guess the output is not really meant to be readable in any | way | em-bee wrote: | if it transpiles to sh then the output should be an sh | script. that should be at least somewhat readable. | Brian_K_White wrote: | It's possible to express many common features and | functions of other languages in sh fairly well, so it's | probably possible for a tool like this to output | something not too bad. | | But even so, I would never expect any transpilation | output to be more than technically readable. | | The part with the high level meaning is the part the | human wrote. That's the entire point of any language. | | The output can not be considered source, regardless that | it's possible to also write source in that same syntax. | | The only reason to even bother with transpiling instead | of just requiring the necessary interpreter, is to ship | something that the target already supports. It's very | very little different than shipping a binary. | | The differences are just that a .sh is at least possible | to read and hack vs not-possible. Not convenient or good, | merely possible vs not-possible. And a .sh is more | portable than a binary in that it doesn't care what the | cpu or os is. | | If you want anything more high level meaningful instead | of some 90's web page generator html output, you have to | write that yourself. An automated tool cannot reverse | engineer some code into an elegant expression of the | original intent of that code. In that way a compiler or | transpiler is not much different from a decompiler. | | Though, I admit there is room for levels. I don't know | just how crude this tool's output is, but I know there is | a range of what's possible, it does't _have_ to be | ketralnis wrote: | That's not a given, think typescript compiling to | minified javascript. Some compilers like coffeescript do | put in some effort to have the output be readable but I | wouldn't assert that it should be a goal for everyone | eyelidlessness wrote: | > typescript compiling to minified javascript | | This is an odd example. TypeScript compiles to readable | JavaScript for nearly everything except the odd runtime | behavior (eg enums) and "downleveling", which is | increasingly unnecessary. Minification is still a | separate step AFAIK (if you're using tsc; obviously | ESBuild and SWC are another story, as will be Bun). | ketralnis wrote: | You caught me, I've never written typescript. I don't | think that changes my claim though | xyzzy123 wrote: | Yes although it might be readable in the same way that | autotools configure scripts are readable -- technically | you _can_ , but you probably don't want to, and if you | _need_ to then something has gone badly wrong. | xg15 wrote: | I mean yes. Things do go wrong, especially with bleeding- | edge projects such as this. | | You'll have to look at that output if you want to debug | things, understand error messages. | | As such, I'd absolutely see it as a quality measure for a | transpiler how readable the code it produces is. | em-bee wrote: | yeah, that's kind of what i meant. especially if the | script has external commands you should be able to at | least recognize something. | [deleted] | hnlmorg wrote: | I think you can liken this to web assembly. The output | might be text but it's not intended to be human readable. | maggs wrote: | I, too, missed that in the README. I was curious enough try | it out in a vm. Here's the output for fib.li: | https://termbin.com/pagk Or for something more complex, | raytracing.sh: https://termbin.com/4rpd | | I was mostly wondering how/if it does any type checks for | function input; it does not. Also raytracing.sh unfortunately | fails to run on my system as it is. | lakecresva wrote: | The functional stuff in Nickel is really pretty vanilla, and | the syntax seems much more inspired by ML than Nix. There's | some info in the repo's `RATIONALE.md` that specifically | answers "how is this different/better than | Dhall/JSonnet/Cue/Starlark". | em-bee wrote: | _I love that there are examples front-and-center on the README | page_ | | except that those examples are to simple. for something that | transpiles to sh i would like to use it to write better shell | scripts. so i'd like to see examples that resemble actual shell | scripts in that they call lots of external commands, do file | operations, terminal interaction and other things commonly done | with sh. | smoe wrote: | Felt the same. Most complete example seems to be the | installer for the language which is written in it. This | covers some of the things you mentioned | | https://github.com/cotowali/konryu/blob/main/konryu.li | | and the generated shell script | | https://raw.githubusercontent.com/cotowali/konryu/dist/konry. | .. | | There is also the website, heavily under construction, but | has some more documentation on the language than the readme | | https://cotowali.org/ | kazinator wrote: | > _I 'm not sure how I'd use something like this._ | | It seems that you could use this to program embedded systems | that have a shell, yet which don't support any other usable | language (due to flash space concerns, product management | approval or whatever). | mixedCase wrote: | Alright, here's the hot take: The assignment is for any | developer without basic knowledge of FP beyond .map and .filter | to complete their intermediate-level programming education. | | All problem domains that involve declarative programming, such | as configuration (Terraform, Kubernetes, Nix, many build | systems), dynamic HTML, relational databases, and pretty much | anything that is manipulating data in a pipeline fits | functional programming like a glove and is hard to get right in | a strictly traditionally imperative fashion. As an industry we | should stop pretending FP isn't a necessary part of a | professional programmer's education and that we can solve the | problem by coming up with the umpteenth "we promise it's not | FP" abstraction with its own take on fooling developers into | writing functional code through an imperative-looking layer | full of foot guns that subtly break imperative developer | expectations, like React. | Xavdidtheshadow wrote: | Do you have resources to this end that you'd recommend? | mixedCase wrote: | The easiest hands-on approach I know of is to go through | the Elm tutorial and build a simple CRUD app. The rest | should flow from there. | | After that, https://fsharpforfunandprofit.com/series/why- | use-fsharp/ and pretty much anything made by Scott Wlaschin | is very accessible, and to the point. | ModernMech wrote: | Missed opportunity: fsharpforfunandfunds | verall wrote: | I think it's a super hot take because the real world has | demonstrated (over and over again) that a huge portion of | professional software developers have no interest in learning | functional paradigms just to write some config files. | | Just like a huge portion of professional software developers | have no interest in learning RTL or digital logic just to | program an FPGA. | | HLS is a massively complex system to solve this problem. | People will also build massively complex systems to solve the | problem of "No FP here, please". | mixedCase wrote: | That'd be fine if it was just config files, but that's not | the problem now isn't it?. It's an enormous amount of | problem domains that FP handles trivially and is a complete | pain to manage imperatively. We've had entire groups of | people coming up with ridiculous ideas like replacing | relational databases with key-value stores for relational | data just because they find SQL "icky" because it fits a | mental model they never developed (syntax issues with SQL | aside) and it isn't until they're hand rolling data | aggregation that they realize the mess they got themselves | into. | | Which is why I stand by what I said: this knowledge is not | optional, and engineers not willing to learn them are going | to be stuck with sub-optimal tools, dragging the whole | industry down with them. While I can't be confident this is | the definitive solution, I believe that the best way to | move forward is to start treating basic FP (purity, data | transformation pipelines, immutability, favoring data | structures over code) as a baseline that everyone needs to | know to work as a developer, and stop treating it as if it | is on a superior level of difficulty compared to learning | whatever bullshit combination of half-templated server side | rendering, 4D DOMs and incantations needed to upgrade | Webpack we need to know to be "up to speed" nowadays. | klekticist wrote: | I agree with your point here, though imo it's worth drawing | a distinction between the FP concepts the language | designers / implementors must understand and the FP | concepts the language users must understand. | | Ideally languages prevent bug classes like null deref, use | after free while still being familiar enough for most | programmers to use. | | It's analogous to the spectrum of SQL knowledge folks have. | For instance knowing what a group by does vs how a group by | reshuffles data on a single node / across nodes. Ideally | the language design hides the hard details. | | A very tall order admittedly. | staticassertion wrote: | > (over and over again) | | Eh. I'm not saying one way or the other that FP is good or | bad, but the software industry is incredibly young and | changes a lot. Even in a relatively short period - 10 | years, let's say - things are pretty difference. 20 years, | still a short time, and things are radically different. | | And on top of that, it is still the case that a lot of | stuff takes a long time to get adopted. It's hard to build | and popularize a programming language, regardless of how | good or bad that language is, because they tend to lack | interoperability with other languages if they're very | different, which is usually a requirement if they want to | be considered worth looking at. | | So I'd just as easily buy that people haven't used a lot of | FP due to inertia, a lack of the right external inventives, | etc, and not by any virtue of the paradigm. | Willamin wrote: | > simple statically typed scripting languages for generating | YAML/HCL/etc configs | | Do you actually want a statically typed _imperative_ language | for generating configs? | | Or do you want a sane, statically typed, declarative language | for configs? | kirbyfan64sos wrote: | You might find Cue interesting: https://cuelang.org/ | | It's a bit overambitious IMO, but it tries taking a relatively | different approach to the problem that I find to be quite | interesting. | sidpatil wrote: | Parent already mentioned their investigation of CUE. | smasher164 wrote: | Neat! | | A really cool enhancement to this would be if the compiler could | target a polyglot script that is both Shell and Batch. For | example: https://stackoverflow.com/a/17623721 | | Then you'd get a single script that would automatically be | portable and executable on pretty much every conceivable | platform. | jokethrowaway wrote: | Why not just build a binary? What's the benefit of transpiling to | sh? | zakuro wrote: | Binary files are different for each architecture, but shell | script is not so. Most scripting languages require a | interpreter to be installed. Output of Cotowali is shell | script. so no need to install any interpreter. | westurner wrote: | Could this be done with LLVM? | neoyagami wrote: | nice. I do a lot of bash/sh things when need to automate some | task, now they can be programmed in a propper lenguaje( sh can be | painful sometimes) and just transpile it to sh | kazinator wrote: | There are no examples which show that the source language is | good for shell scripting tasks. Making shell programming tasks | nicer doesn't appear to be a goal. | zakuro wrote: | Although not yet in the sample, Cotwali is also intended to | use for shell programming tasks. | [deleted] | Brian_K_White wrote: | I see 2 possible rationales to transpile to posix sh: | | 1: To remove bashisms/kshisms/zshisms to create output that works | on ash/dash/busybox/xenix/sun/... In which case, the more useful | source language is bash or ksh etc, not a new invented one. | | 2: To generate a portable output like above from a better | language than any *sh (*). In which case the source language | should be something already common like python or perl or ruby | etc (even if just a subset). | | In either of those two use cases, I don't think it makes a great | deal of sense to make a new language, and especially not to write | the compiler for it in V of all things. | | That relegates the whole project to being just a curiosity or a | purely academic excercise. | | (*) I use every trick bash and ksh offer, so I know it's possible | to do all kinds of stuff in some *sh's, but a lot of the features | in them are encoded into practically inscrutable special syntax | and rules and tricks, where more purpose built programming | languages make all the features more explicit and spelled out -> | readable. bash is a powerful enough language, but not a readable | one, except for rairly stupid scripts that either don't do much, | or do everything the hard way. | maxbond wrote: | What about, to gain saner semantics (static typing) while | retaining the portability and versatility of shell scripts? | Brian_K_White wrote: | "What about, to gain saner semantics (static typing) while | retaining the portability and versatility of shell scripts?" | | I think I was insufficiently critical in a misguided | intention to be nice. Let me correct that a little :) | | If the need is great enough for a DSL, then the need is great | enough for python or c or any of 100 other fully fledged | universally available languages, and either require it's | interpreter or ship a binary. | | However annoying it may be to require a ruby interpreter or | something, there is essentially no case where the most | sensible answer is this "Vala-for-sh". | | It's the worst of all worlds. Taking the whole life cycle | into account, it's not saner or portable or versatile, it | reduces all of those. | chalst wrote: | Typical shell programming idioms are quite dynamic. You can | give saner semantics, allowing a fair amount of static | checking, without abandoning this dynamicity. | | What Andy Chu has been doing with Oil Shell is promising in | this respect. It supports optional type annotations. Cf. | https://www.oilshell.org/blog/2021/01/why-a-new-shell.html | [deleted] | nerdponx wrote: | I'm surprised to see that the compiler is written in V | (https://vlang.io/). Last I heard, V was vaporware, and a lot of | its claims about performance etc. ended up being "todo" items | rather than facts about the language as it actually existed. But | that was several years ago; has anything changed? | | Otherwise, fun project! I could see this actually being useful in | some niche cases, e.g. generating scripts that need to work on | some exotic architecture that has a POSIX Sh implementation. | | It might also be useful for writing interactive shell "plugins" | that set up things like a fancy PS1 prompt. | silisili wrote: | V is a beautiful language, but got tons of flak for being | overambitious if you're generous, a scam if you're being | suspicious. They've been called both on this very site. | | I follow it, and love their ambition...but there are a ton of | open issues that convince me it's not even alpha quality yet. | If anyone has experience otherwise, would love to hear. | yisonPylkita wrote: | I would love to hear more about that. Does someone here have an | experience with V lang and can tell us if its claims are at | least close to truth? | camgunz wrote: | This was my impression too and it looks like they've made | really impressive progress since I last saw them on HN. Their | bug list [0] looks kind of scary, but that's maybe par for | the course for a language? I remember the bad old days of | Go's 32-bit GC not being wonderful for example. | | [0]: https://github.com/vlang/v/issues?q=is%3Aissue+is%3Aopen | +lab... | rurban wrote: | looks very much like Rust's issue tracker to me | johnisgood wrote: | Agreed! Also... I was just going through smhasher. Thank | you for it! | KerrAvon wrote: | Maybe? Some of those sound like unit tests should have | caught them. | jokethrowaway wrote: | I generally prefer h https://h.christine.website/ | spacemanmatt wrote: | h is the core framework language of my global | infrastructure | codeflo wrote: | What's the main use case? I guess build scripts? | zakuro wrote: | Build scripts are one of the assumed use cases. Build scripts | are one of the assumed use cases. The other use case is | installation scripts. cotowali's installer is written in | cotowali itself. https://github.com/cotowali/konryu | metadat wrote: | Awesome idea, but "cotowali" is a truly terrible gibberish | sounding name, maybe even worse than klubernetes. | adriangrigore wrote: | Might as well check out my POSIX sh static site generator | https://mkws.sh/ if you're into this stuff. | Merad wrote: | Neat idea, but it seems to me like a critical part of making a | new language of any kind is documenting it so that others can | learn it and use it. On that note, can anyone explain the syntax | that seems to use pipes in a function declaration (i.e. every | function in the readme example other than fib)? | mbarbar wrote: | It appears to me those are the types the functions expect to | consume and output when used in a pipeline. | norswap wrote: | It's pretty nice! I'd love to see the compiled output of the | examples though! | Shadonototra wrote: | V is such a nice and simple language, it's Go for system | programming | nixpulvis wrote: | Unless I'm misinterpreting the example, it seems rather | unfortunate that you need to create a sentential value before a | `read` call to update some `&n` location. The `twice` function | really could be just `return read() * 2` no? | | I guess I should look into how this is actually compiled to sh. I | agree the README would benefit from adding some examples of this. | reincarnate0x14 wrote: | This is amazingly great for how simple the idea is, going to have | to play with the output a bit to poke around for strange edge | cases (it is sh, after all) but given all the random devices out | there with Busybox or similar this could end up being | significantly useful for configuration management, etc. | | Also seeing quick, readable examples right on the github landing | page is such a small but wonderful thing. | dogprez wrote: | Wouldn't it just be better to make a new shell that has this | syntax? | hnlmorg wrote: | There's already a plethora of shells that fit that domain: | + Nu Shell + NGS + Powershell + Oil Shell | + Elvish + Murex (which is one I'd written) | | Not to mention all the LISP, Python, and other such high level | language REPLs come shells. | | But they solve a different problem. This seems to be more like | what Typescript is to Javascript: a alternative "safer" | language where your end point is limited to supporting a | different language. So you need to compile down to a known | portable base language. | eyelidlessness wrote: | Better in that you can use it directly, not necessarily great | for interop. I love Fish shell, but it can be a pain when | trying to use tools that expect posix syntax to work. | hnlmorg wrote: | Wow this is a great advert for V (the programming language it was | written in). Having never written a line of V before I can still | read and understand the code. | IggleSniggle wrote: | I had exactly the same reaction. Extremely digestible syntax. | Didn't even notice until after looking it over that it had been | written in a language I don't know. | jpgvm wrote: | Would appear that V isn't as vaporware as I initially thought. | | Going to give this a fairly through once-over because I think | Posix sh is an under-appreciated transpilation target. ___________________________________________________________________ (page generated 2022-03-25 23:00 UTC)