1. 8

    We must make software simpler. Much much simpler.

    I am not sure whether this is feasible. Abstractions exist for reasons, one of them is to forget. Realistically, if Node.js developers are required to understand V8, not many things would get done. If depending on V8 (de-facto proprietary software, if there was any) is okay, and I think it is, I don’t see much difference for depending on other things.

    1. 6

      Abstractions exist for reasons, one of them is to forget.

      Indeed, but most of the obstacles for understandably don’t come from abstractions but from layers of indirection which do little to provide more introspection affordances to help the programmer understand the system and increase the surface area for bugs immensely. As noted by another article posted under this story:

      Accumulation of unnecessary code dependencies also makes software more bug-prone, and debugging becomes increasingly difficult because of the ever-growing pile of potentially buggy intermediate layers.

      We programmers are so accustomed to intermediate layers that most of us conflate the two. A good example of the complexity reducing power of abstraction is Plan9’s commitment to everything is a file (for real, no ioctls).

      Realistically, if Node.js developers are required to understand V8

      The whole point of the article is that something like V8 shouldn’t exist in the first place. There are more than enough examples of smaller code bases, from VPRI’s work to the the Tiny C Compiler, that show that such a world is possible today.

      1. 1

        Abstractions exist for reasons, one of them is to forget.

        But all abstractions are leaky (to varying degrees), so details from lower levels will bleed into the upper levels no matter what you do. This includes restrictions, (wanted or unwanted) features, performance limitations and security problems. If you can cut out a layer of abstraction without losing too much expressiveness, it is almost always better.

        1. 4

          Case in point: We were hit with a problem caused by a fix for the recent Ghostscript vulnerability in ImageMagick. The fix simply disabled PDF processing in ImageMagic’s policy.xml, which caused our perfectly functioning code to stop working. The code would send out an e-mail with a PDF containing some information. After the fix, ImageMagick would silently start creating an empty PDF file (it’s PHP, did you expect it to signal an error in a decent way?).

          This involves two or even three levels of abstractions, depending on how you look at it: Our image writer happened to use ImageMagick to make the PDF, and ImageMagick happened to use Ghostscript, so it had to be disabled at the configuration level by the sysadmin. If ImageMagick didn’t use Ghostscript, this problem would not have existed. Of course, the tradeoff is that this would mean it would need to use its own PDF processing instead. And the vulnerability could’ve been there too (but that’s perhaps less likely if it didn’t contain a full fledged Postscript interpreter, which in our case was completely unnecessary as we were only generating PDFs, not reading them).

          1. 4

            I agree with what you are trying to say but I see no abstractions here, just layers of indirection. I don’t think the problem is leaky abstractions, but rather that we (myself included) don’t know how to properly abstract. Because understanding the current system is unfeasible we just want to add a layer on top that treats the underlying system as a black box to do what we want and call it a day. And so the onion keeps growing and growing.

            1. 2

              I highly recommend Richard Gabriel’s book Patterns of Software, the first three chapters (“Reuse versus Compression”, “Habitability and Piecemeal Growth” and “Abstraction Descant”) are about exactly this topic. Written by the author of the “Worse is Better” essay, probably the most profound thinker on software development that I know of.

          2. 1

            But all abstractions are leaky (to varying degrees)

            Most are. DSL’s show us we can have non-leaky abstractions for a lot of things.

            1. 1

              Could you elaborate with some specific examples? From the top of my head, I don’t see how DSLs would be inherently better than any other abstractions; to me they feel mostly the same, i.e. most of them are leaky, though from time to time one may strike a pure one (like say, SQL? Dockerfile DSL?). Isn’t every function call a “DSL statement”, and every “framework” a DSL, just with a covoluted syntax?

              1. 1

                State, machine compilers are an easy example where you just list the functions, states, and transitions. It generates all the boilerplate. Then, you mode switch to fill in the blanks.

                Similar stuff can be done with GUI’s since they’re FSM’s or close. Might even count a subset of HTML with CSS 1 or 2 in there. They stay really close to document with styling metaphor. It only got leaky if including Javascript. That makes sense, though, given that transforms it into an executable program. I still used to use well-designed snippets from DynamicDrive.com, like menus, before I learned JavaScript since you just filled in the blanks. XML later fixed that abstraction by switching from document to data models.

                SQL is another many cite. Might fit here long as you are just doing queries.

                1. 3

                  Hmm, I think I’m still not really convinced. In my opinion:

                  1. FSMs are maybe closest to what I’d call a good abstraction, in that they embrace the leakiness - by limiting themselves to what they’re good at modelling. The “blanks filling” in my eyes is where they beautifully support good cooperation with other abstractions.
                  2. HTML, then with CSS 1, then 2, in my opinion is an example where the abstraction was seriously leaky and thus eventually broke apart (via JS). The CSSes already are examples of trying to patch HTML into submission. Infamously, creating non-rectangle shapes was always a problem here. Also motions. I’d say TeX is a good example how the seemingly simple task of text/page layout is surprisingly hard, bordering on impossible.
                  3. As to SQL, I think what it benefits from is the consistent and complete (I think) mathematical abstraction of relational DBs it’s based on. That said, in my opinion it’s still leaky, by virtue of needing an interpreter/VM. Thus for any practical use, one still has to employ a lot of divination and guesswork (or often cargo culting) trying to please the optimizer spirits.

                  I think my main takeaway from the classic article about leaky abstractions is that all of them are, and thus the fact should be embraced by explicitly designing them to allow clean and painless escape valves. See the FSMs. Also unsafe keyword in Rust, or ports in Elm.

                  1. 1

                    Good points. I guess it depends on one’s definition of leaky. For me, Im fine with an abstraction so long as I can ignore what’s in it. Just call it conforming to the contracts. Others might have something different in mind.

                  2. 1

                    You must have a curious conception of non-leaky abstractions if SQL queries are to be included. And one where all of practical computing being built on non-leaky abstractions wouldn’t be all that much of an improvement on the status quo.

                    1. 1

                      Just the parts about describing what to pull from or put in what. It looks really high-level and purpose-built compared to platform-specific, low-level, imperative code it replaced. We even taught folks with no programming experience how to use that model with Access, 4GL’s, etc.

                      1. 2

                        That’s true, but when used in anger sooner or later you’ll still have to spend time with the implementation details of the database. Certainly if you want to make effective use of the hardware’s capabilities.

                        1. 1

                          Oh yeah, definitely true!

              2. 1

                I don’t really think most systems warrant as much complexity as they have. Alan Kay had a talk about building the right language for each layer of an operating system. He has a demo of two languages, one is a DSL to implements a rasterizer, one is a DSL for implementing network protocols. To be fair, I haven’t looked deeply into the code or run it, but I think the idea works.

                For something that I have looked a bit closer at, Interim OS, is an OS implemented in C99 and Lisp. I’ve taken a weekend to read through the JIT code, and with a few more days, could probably start working in the codebase (on small to medium tasks). The entire kernel is written in 12K lines of C code and a few thousand of lisp. It’s capable of running on a Raspberry Pi, with a keyboard driver, basic VGA, TCP stack, and even an IRC client.

                Granted, I can’t say I fully understand this code either, but it’s definitely reasonable for me to grok the whole OS in a few weeks. I don’t think most people have time to vet every piece of software. That’s why we have sandboxing. However, the OS, my browser, my crypto libraries, my programming languages, my developer tools, and the base software running on my system should all be written in a way that I can understand and extend it.

                I feel like software changes too fast, and just keeps changing for no good reason – we very rarely reach the point where we can just stop messing with it and let it do it’s job. Feature creep is a real problem.

              3. 1

                Abstractions exist for reasons

                Some do, some don’t, some have reasons but everyone would still be better off without them. Nobody is arguing we should just drop all the abstractions.

              1. 2

                I’m https://awoo.space/@nc

                Planning on switching to a self hosted instance on my websites soon.

                I mostly post about compilers and programming. I’m hoping to set up some kind of bot that pulls from Twitter, and posts my toots to it, so I can fully move to mastadon.

                1. 7

                  Or use OpenBSD - simplicity is important if you want security and stability.

                  1. 4

                    I’m glad I’m not the only person who finds defining an AST data structure annoying :P

                    I hadn’t heard of attribute grammars before. Those look pretty interesting - I like the idea of being able to have a different set of attributes that exist for each phase. Going to look into this a bit.

                    I’ve been playing with redex recently, and am curious how easily I can convert the model into a compiler. It allows you to very nicely define the type system with rewrite rules. No need for an AST data type.

                    1. 1

                      I wish I know more about Lisp Machine architecture. I wonder how closely this stuff could map to a modern RISC architecture (like ARM), and if there would be some way of exploiting some instruction to do hardware type checking quickly?

                      1. 6

                        If you can track down the paper Architecture of the Symbolics 3600 then you’ll probably learn a lot.

                        I don’t think it maps well to something like ARM, but it could probably be made to work. This presentation should help give you an idea.

                        1. 3

                          Recent arm versions have hardware support for memory tagging - this might be useful when accessing memory. You could assume that value stored is of common type (tag) and get cpu to verify it for you while you try to execute happy path.

                          Additionally many modern cpu support much smaller address space than 64 bits so storing those type tags in pointers wouldn’t mean that fixnums need to be 24-26 bits wide but more like 48 bits wide.

                          Sadly my knowledge about all of this is very limited :(

                          1. 1

                            The AMD64 architecture is specifically designed to discourage using the high bits in a pointer as tag bits because it causes hell every time they try to expand the address space.

                            If your values are always aligned to 8 bytes or such (which AMD64 helps facilitate, cause the stack has to start aligned), you have a few low bits which are unused and can be used for tags freely.

                            1. 1

                              That said, it’s no harder to mask off high bits than low bits.

                              1. 1

                                Very true, but masking the low bits is more future-proof.

                        1. 9

                          Looks awesome! Really love to see websites that aren’t reliant on JS to work :)

                          Definitely gonna take a look at moving my github profile over.

                          1. 3

                            I really wonder why some of these qualifiers aren’t just added to the C standard. There’s plenty of examples of zero cost abstractions that could be added to C that would really aid in writing more correct code. Heck, much of the “formal verification” done on C code should just be stuff in the type system by default.

                            1. 0

                              Why? Because it is simple, clear, and useful.

                            1. 6

                              I really like this approach to building compilers - I used the nanopass framework for a compiler I wrote for my undergrad thesis: https://github.com/charles-l/comp

                              It’s not perfect. There are still a few limitations that can only be circumvented with some messy mutation, but most transformations can be performed quite elegantly with the nanopass DSL.

                              1. 7

                                One of the framework’s authors gave a nice talk at Clojure/conj a few years back.

                                https://www.youtube.com/watch?v=Os7FE3J-U5Q

                              1. 6

                                Hah, using nc to implement networked multiplayer is a pretty clever hack. I’m too scared to look at the rest of the code though :P

                                1. 20

                                  “(For the record, I’m pretty close to just biting the bullet and dropping $1800 on a Purism laptop, which meets all my requirements except the fact that I’m a frugal guy…)”

                                  One more thing to consider: vote with your wallet for ethical companies. One of the reasons all the laptop manufacturers are scheming companies pulling all kinds of bloatware, quality, and security crap is that most people buy their stuff. I try where possible to buy from suppliers that act ethically to customers and/or employees even if it costs a reasonable premium. An recent example was getting a good printer at Costco instead of Amazon where price was similar. I only know of two suppliers of laptops that try to ensure user freedom and/or security: MiniFree and Purism. For desktops, there’s Raptor but that’s not x86.

                                  Just tossing the philosophy angle out there in case anyone forgets we as consumers contribute a bit to what kind of hardware and practices we’ll see in the future every time we buy things. The user-controllable and privacy-focused suppliers often disappear without enough buyers.

                                  1. 10

                                    One more thing to consider: vote with your wallet for ethical companies

                                    Don’t forget the ethics of the manufacturing and supply chain of the hardware itself. I would imagine that the less well-known a Chinese-manufactured brand is the more likely it is to be a complete black box/hole in terms of the working conditions of the people who put the thing together, who made the parts that got assembled, back to the people who dug the original minerals out of the ground.

                                    I honestly don’t know who (if anyone) is doing well here - or even if there’s enough information to make a judgement or comparison. I think a while back there was some attention to Apple’s supply chain, I think mostly in the context of the iPhone and suicides at Foxconn, but I don’t know where that stands now - no idea if it got better, or worse.

                                    1. 6

                                      Apple has been doing a lot of work lately on supplier transparency and working conditions, including this year publishing a complete list of their suppliers, which is pretty unusual. https://www.apple.com/supplier-responsibility/

                                      1. 1

                                        Technically their list of suppliers covers the top 98% of their suppliers, so not a complete list, but still a very good thing to have.

                                        1. 1

                                          Most other large public companies do that too, just not getting the pat on the back as much as Apple.

                                          http://h20195.www2.hp.com/v2/getpdf.aspx/c03728062.pdf

                                        2. 2

                                          You both brought up a good concern and followed up with reason I didn’t include it. I have no idea who would be doing good on those metrics. I think cheap, non-CPU components, boards, assembly and so on are typically done in factories of low-wage workers in China, Malaysia, Singapore, etc. When looking at this, the advice I gave was to just move more stuff to Singapore or Malaysia to counter the Chinese threat. Then, just make the wages and working conditions a bit better than they are. If both are already minimal, the workers would probably appreciate their job if they got a little more money, air conditioning, some ergonomic stuff, breaks, vacations, etc. At their wages and high volume, I doubt it would add a lot of cost to the parts.

                                        3. 9

                                          Funnily enough

                                          The Libreboot project recommends avoiding all hardware sold by Purism.

                                          1. 5

                                            Yeah, that is funny. I cant knock them for not supporting backdoored hardware, though. Of the many principles, standing by that one make more sense than most.

                                            1. 1

                                              Correct me if I’m wrong, but I thought purism figured out how to shut down ME with an exploit? Is that not in their production machines?

                                            2. 3

                                              I agree, which is why I bought a Purism laptop about a year ago. Unfortunately, it fell and the screen shattered about 5 months after I got it, in January of this year. Despite support (which was very friendly and responded quickly) saying they would look into it and have an answer soon several times, Purism was unable to tell me if it was possible for them to replace my laptop screen, even for a price, in 6 months. (This while all the time they were posting about progress on their phone project.) Eventually I simply gave up and bought from System76, which I’ve been very satisfied with. I know they’re not perfect, but at least I didn’t pay for a Windows license. In addition my System76 laptop just feels higher quality - my Librem 15 always felt like it wasn’t held together SUPER well, though I can’t place why, and in particular the keyboard was highly affected by how tight the bottom panel screws were (to the point where I carried screwdrivers with me so I could adjust them if need be).

                                              If you want to buy from Purism, I really do wish you the best. I truly hope they succeed. I’m not saying “don’t buy from Purism”; depending on your use case you may not find these issues to be a big deal. But I want to make sure you know what you’re getting into when buying from a very new company like Purism.

                                              1. 1

                                                Great points! That support sounds like it sucks to not even give you a definitive answer. Also, thanks for telling me about System76. With what Wikipedia said, that looks like another good choice for vote with your wallet.

                                              2. 2

                                                Raptor but that’s not x86

                                                Looks like it uses POWER, which surprised me because I thought that people generally agreed that x86 was better. (Consoles don’t use it anymore, Apple doesn’t use it, etc)

                                                Are the CPUs that Raptor is shipping even viable? They seem to not have any information than “2x 14nm 4 core processors” listed on their site.

                                                1. 4

                                                  The FAQ will answer your questions. The POWER9 CPU’s they use are badass compared to what’s in consoles, the PPC’s Apple had, and so on. They go head to head with top stuff from Intel in the enterprise market mainly sold for outrageous prices. Raptor is the first time they’re available in $5000 or below desktops. Main goal is hardware that reduces risk of attack while still performing well.

                                              1. 5

                                                Asus Zenbook UX305C – it’s basically a knockoff Macbook Air with more Linux-friendly hardware (intel wireless, etc). It works pretty well with OpenBSD out of the box as well (but does lack trackpad drivers at the moment). Reasonable build quality. My only complaint with the build is the screen hinge is a bit loose. The high-dpi screen is nice too.

                                                At this point though, I’d probably just go with the Purism laptop as well – I haven’t bought one yet, but the idea of being able to upgrade laptop hardware is alluring. You’re not going to find that anywhere else (except maybe in a ThinkPad – but I have little trust for Lenovo anymore…)

                                                1. 4

                                                  I like the idea, but it’s a little too whitespace-y to be called brutalist IMO. If it could fit more toots on a page, I’d definitely use it.

                                                  1. 1

                                                    That could be arranged – page size in the mastodon API is configurable. (Maybe it could even be configured along with the theme.)

                                                  1. 3

                                                    Wow.

                                                    Yeah, I’ve also ended up toying around with Firefox because it sucks so much by default: https://is.gd/iHRkw2. Also got rid of that retarded hamburger menu in favor of Alt/F10 for the normal one, and learnt that Alt+Home fully replaces the home button, so that went away as well.

                                                    They broke Pentadactyl with WebExtensions–the addon installed its own minimalistic UI–and Chromium still sucks a lot more, so I didn’t have much of an option besides QuteBrowser, which I had to leave because of other problems.

                                                    You get what you pay for.

                                                    1. 5

                                                      qutebrowser dev here - out of curiousity, what other problems? :)

                                                      1. 3

                                                        Man, why can’t I rant without repercussions.

                                                        My log tells me I switched 11 June this year but my memory fails to provide context. IRC logs come up empty.

                                                        Let me dig… lack of a good AdBlock (such as uBlock Origin) was one thing. I think I also needed Firefox for some sites, and ran two browsers at the same time often. I think Google had a glitch with default focus.

                                                        Your blog is down as of right now.

                                                        1. 3

                                                          Sorry, blame F5Bot :D

                                                          I still plan to look into a more sophisticated adblocker, but as always, there’s a lot to do…

                                                          Your blog is down as of right now.

                                                          Huh? https://blog.qutebrowser.org/ works fine here.

                                                          1. 1

                                                            It definitely doesn’t work here, might be CDN issues, or I don’t know what.

                                                            1. 1

                                                              What does “doesn’t work” mean precisely? No CDN, so that’s weird.

                                                              1. 1

                                                                $ ping blog.qutebrowser.org

                                                                gives me no responses from the Czech republic (residential or VPS).

                                                                Edit: Okay, it is up now. Wasn’t before.

                                                                Edit: And now it’s not, again.

                                                      2. 1

                                                        I’ve also ended up toying around with Firefox because it sucks so much by default: https://is.gd/iHRkw2.

                                                        Glad to see I’m not the only one that tries to yank all of the whitespace and unused widgets out. I don’t think interfaces designed to compromise between traditional and touchscreen interfaces work well for either.

                                                        I used to use a Vim-like addon with Firefox many years ago. It was amazing. Hitting ‘f’ to make all of the links keyboard-navigable was the biggest boon, especially with a touchpad, as it meant I didn’t have to fear misclicking with the thing all the time.

                                                        Sad to see addons getting so strangled. Let’s hope things get back to where they were sooner rather than later.

                                                        EDIT: Ah, the hamburger menu. One of the things that I have to help everyone use because no-one has a clue what it does. A good user interface does not hide things, a menu bar is a very discoverable solution that has been around for decades. It’s a shame to see it being pushed aside.

                                                        1. 1

                                                          Not sure what problems you ran into, but I regularly use it as a “focus mode” browser. Light resource usage (particularly since I disable JS with it), and minimal vertical space is great for reading docs/blog posts. I still have FF for sites that don’t support qutebrowser well, but I’m finding most thing work fine in it.

                                                          1. 1

                                                            Now that you touch the topic, I need integrated reader mode, and something to change text to proper black color. The web is a hostile environment. I wish removing all the awful CSS was a reliably solvable problem.

                                                            1. 1

                                                              wish removing all the awful CSS was a reliably solvable problem

                                                              What do you mean by this? Are you referring to the difficulty of doing it in the webextensions environment of Firefox, or the difficulty of partially stripping CSS using heuristic-like things?

                                                              1. 1

                                                                I’m concerned about stripping (more precisely unifying) formatting while keeping a workable page layout, which, as far as I can tell, can only rely on heuristics. I’m glad that Reader Mode in Firefox at least mostly processes article-like pages successfully.

                                                        1. 3

                                                          Haven’t posted recently, but I might pick it up again soon. Mostly post about compilers, linux, and gamedev: http://charliethe.ninja/

                                                          1. 2

                                                            I get that we’re supposed to keep original titles but I’d argue that the spacing is a result of the site’s “styling” and doesn’t have to be reproduced (just like we wouldn’t prepend a # to every submission’s title that links to a markdown doc)

                                                            1. 2

                                                              In Swedish typography this is called “spärrning”, from the German Sperrsatz.

                                                              https://en.wikipedia.org/wiki/Emphasis_(typography)#Letter_spacing

                                                              It’s basically the only emphasis you have available if you can’t underline or use italics/bold.

                                                              1. 1

                                                                Yeah, I agree. The spaces just make things like searching for the article harder.

                                                              1. 4

                                                                Don’t use N computers when 1 will do.

                                                                This is so important, because people seem to forget that computers are fast. Really fast. Absolutely, mind-mindbogglingly fast. CPUs operate on a level of granularity of billionths of a second, while humans can barely sense thousandths of a second.

                                                                The only reason computers are “slow” is because most software is crap. I mostly blame Windows and the Web, since they’ve mislead average computer users into believing they have to wait for bloat to run (rather than regularly shouting at developers to profile their code).

                                                                An average laptop running F-Stack and a decent web server could host a website and handle millions of concurrent requests per second. Distributed systems on AWS are nice and all, but they’re way harder to build than systems that run on a single server. And they’re far harder to profile and optimize.

                                                                /rant

                                                                Out of curiosity, I wonder how the author managed to handle concurrency in SQLite, since it locks the whole DB on writes. He mentions writing multiple SQLite databases, but I’d be interested in more details.

                                                                1. 1

                                                                  Hmm, not come across F-Stack before. Ironic, in the context of your rant, that opening their page showed me nothing but a loading animation for a few seconds :P

                                                                  1. 1

                                                                    Out of curiosity, I wonder how the author managed to handle concurrency in SQLite, since it locks the whole DB on writes. He mentions writing multiple SQLite databases, but I’d be interested in more details.

                                                                    He also mentions using a nifty new (first appeared in 2010 :)) SQLite feature called WAL (Write-Ahead Logging). It makes writers and readers not block each other, plus it makes writes so fast (essentially just an append to a log) that they very rarely block each other.

                                                                    I’m not sure why it’s not on by default, but that’s probably just standard SQLite conservatism in practice.

                                                                    https://www.sqlite.org/wal.html

                                                                  1. 3

                                                                    Ugh… I know it’s not the point of the article but still hurts me to see sql that’s vulnerable to injections.

                                                                    1. 1

                                                                      Ah you’re right. Fixed it.

                                                                    1. 3

                                                                      It’s fast. This solution has the potential to be lightning fast. There are some additional optimizations to take into account, which are explained in detail here

                                                                      the link was dead - here’s a backup: https://web.archive.org/web/20171109151832/http://www.catch22.net/tuts/piece-chains

                                                                      1. 2

                                                                        raco exe + chez will be wonderful!

                                                                        1. 1

                                                                          what’s the advantage in having that?

                                                                          1. 1

                                                                            Chez has a better compiler than Racket. It’s faster, and has a simpler architecture (from what I can tell). Some more details here: https://blog.racket-lang.org/2018/01/racket-on-chez-status.html

                                                                            1. 1

                                                                              Have you tried compiling chez in a repeatable manner, that is delivered as an executable? I got stuck for quite a while dealing with all their boot files - raco exe working would mean I don’t need to do that.

                                                                          1. 6

                                                                            Since I’m graduated, I have loads of free time now before starting my new job in a few weeks :)

                                                                            As an exercise to learn D, I’ve been working on reimplementing MPD in D (https://github.com/charles-l/mop). I am really liking it so far - I feel far more secure in the correctness of my code than with C or C++, and the compile-time code generation is the most flexible I’ve seen for a systems-level language.

                                                                            I’m writing some bindings for the Zumo 32u4 robot for microscheme (https://github.com/charles-l/zumo-32u4-ms), and hoping to get most of the sensors working this week.

                                                                            Also, I’ve been messing around with J, hoping to learn it well enough to use it sort of as a desktop calculator on steriods for writing throwaway scripts. I wrote a Kalman filter with J last week, and will probably write an Extended Kalman filter or something similar this week.

                                                                            I’ll probably also work a bit more on my graphics engine (https://github.com/charles-l/ugg) and possibly a new language project.

                                                                            1. 3

                                                                              All of that sounds really cool. :) On desktop calculator, anyone interested in calculators mixed with programming should check out Frink. It’s a neat, little project.

                                                                              1. 2

                                                                                Neat - I’ll definitely check out Frink if only because its unit conversion is really nice :)

                                                                                1. 1

                                                                                  That’s the main reason I kept it. I was thinking having common units in mainstream languages would be a good idea. Frink would be a reference if I ever tried to add it to my own.

                                                                                  1. 2

                                                                                    Here are a few other languages with support for units of measure:
                                                                                    F#
                                                                                    Swift