[HN Gopher] DeviceScript: TypeScript for Tiny IoT Devices
       ___________________________________________________________________
        
       DeviceScript: TypeScript for Tiny IoT Devices
        
       Author : glutamate
       Score  : 117 points
       Date   : 2023-05-24 15:55 UTC (7 hours ago)
        
 (HTM) web link (microsoft.github.io)
 (TXT) w3m dump (microsoft.github.io)
        
       | EddieEngineers wrote:
       | This looks pretty nice! Especially
       | https://microsoft.github.io/devicescript/developer/simulatio...
        
       | niea_11 wrote:
       | It's a subset of typescript :
       | https://microsoft.github.io/devicescript/language
       | 
       | Microsoft did something similar before (without a vm) called
       | Static Typescript : https://www.microsoft.com/en-
       | us/research/publication/static-...
        
       | paulddraper wrote:
       | "TypeScript is a superset of JavaScript."
       | 
       | "DeviceScript is a subset of TypeScript."
       | 
       | We need to go deeper.
        
         | leodriesch wrote:
         | TypeScript is a superset of JavaScript.
        
       | henning wrote:
       | I love the idea of the code in my grandma's pacemaker having
       | dozens of exploitable vulnerabilities from all the fucking
       | JavaScript code in there! Yaass, slay (old people and people in
       | elevators and heavy machinery)!
        
         | jaywalk wrote:
         | Nothing you mentioned falls into the realm of IoT. This is not
         | for life- or safety-critical devices.
        
           | detaro wrote:
           | IoT includes all kinds of big industrial stuff. One would
           | hope the people building it do a good job keeping the
           | connected bits away from the critical bits, but past decades
           | of that industry don't make one too hopeful about it.
           | (Although something like this specifically would be less
           | likely to be used, yes)
        
       | zokier wrote:
       | MicroPython has managed to find its niche and be moderately
       | successful, I don't see why this couldn't manage similar status.
       | But in the same vein I don't think this will become default
       | choice for embedded anytime soon
        
         | Hamcha wrote:
         | .net micro framework was also an interesting attempt
        
           | nereye wrote:
           | FWIW, this lives again as .NET nanoFramework:
           | 
           | https://www.nanoframework.net/
           | 
           | Enterprising folks have even managed to run it on the
           | Raspberry Pi Pico...
        
       | franky47 wrote:
       | Very cool, looking forward to seeing more integration with the
       | IDE for debugging (eg: serial interface monitors, register
       | watches, interrupt control, logic trace analyser etc).
       | 
       | I've been using PlatformIO [1] (albeit with C++) in VScode, it
       | would be a good DX baseline for a comparison.
       | 
       | [1] https://platformio.org
        
       | CharlesW wrote:
       | I believe Moddable's XS was the first to compile JavaScript to
       | bytecode on a computer for embedded deployment:
       | https://www.moddable.com/faq#xs-in-c
       | 
       | (XS is a complete ECMAScript 2020 implementation, though.)
        
       | photochemsyn wrote:
       | What's the minimal reasonable footprint in terms of memory
       | requirements and processing power for such a 'tiny IOT device'?
        
       | ilyt wrote:
       | What those poor devices did to deserve such malady be placed upon
       | them...
        
       | epolanski wrote:
       | I have always been interested now that I've bought and renovated
       | my home into some nice experiments with IoT devices or building
       | my own stuff.
       | 
       | What would be an interesting starting point? I honestly don't
       | even know what I want to build to be fair but always been
       | interested in what the possibilities could've been with this kind
       | of pico boards up to the raspberry (which is in a totally
       | different range).
        
         | mmackh wrote:
         | Access control with NFC (sticker on the phone) is a big
         | upgrade. I've developed some hardware around this
         | https://instanfc.com
        
         | huseyinkeles wrote:
         | I've been doing home automation for many years.
         | 
         | From what you described, using Home Assistant in the center
         | would be the way to go (works fine on a raspberry pi, in the
         | beginning at least)
         | 
         | For the devices, I mainly use zigbee sensors and lights etc.
         | and bunch of fully DIY stuff running mostly on ESP32 with
         | ESPHome.
         | 
         | For the starters, you can skip the zigbee devices all together
         | and experiment with Home Assistant + ESPHome
        
           | baq wrote:
           | Note that the rpi is way overpriced for what it is currently,
           | just get a mini pc with real storage, unless you need the
           | gpio
        
       | cedarcedar wrote:
       | I've been having a lot of fun with https://kalumajs.org/ recently
       | for silly JS embedded things. It's been great so far, and has a
       | cool little community!
       | 
       | It's a runtime built on top of JerryScript, which has been pretty
       | neat to look into as well: https://jerryscript.net/
        
       | anujdeshpande wrote:
       | I am always a little surprised by efforts like these coming from
       | big companies. There have been multiple efforts in the past to
       | put languages meant for the web on small footprint devices -
       | especially JavaScript.
       | 
       | - Tessel (closed down, domain used to be tessel.io)
       | 
       | - Toit Lang: https://toitlang.org/
       | 
       | - Moddable: https://www.moddable.com/
       | 
       | - Espruino: http://www.espruino.com/
       | 
       | - mBed tried it too: https://os.mbed.com/javascript-on-mbed/
       | 
       | - https://github.com/coder-mike/microvium
       | 
       | I am sure I am missing a few here..
       | 
       | Note that some of these projects are over a decade old! Maybe I
       | am the "old man yelling at the cloud" meme, but I don't see
       | embedded developers who have to maintain a project for many many
       | years, using a programming language that changes often.
        
         | weinzierl wrote:
         | Not to forget Java ME (or whatever it is currently called). I'd
         | argue that it is by far the most successful of all these failed
         | attempts because it still is on many (maybe most even?)
         | smartcards.
        
         | paulddraper wrote:
         | TypeScript is popular and has static types. The others don't.
        
         | floitsch wrote:
         | Note that Toit has nothing to do with JavaScript or the Web. It
         | was from the beginning designed to run on embedded devices.
        
         | stephenboyd wrote:
         | If there are no breaking changes, is it really a disadvantage
         | for a language to add new capabilities frequently?
        
         | spyremeown wrote:
         | The truth is: we, actual embedded developers, much rather
         | compile a LUA interpreter and stick it in there and be done
         | with it.
        
           | golergka wrote:
           | Wouldn't a modern language with a great typesystem and a huge
           | ecosystem be nicer to work with?
        
             | akiselev wrote:
             | Ecosystems are as much a burden in embedded development as
             | they are a blessing. Either you put in the time to support
             | much of it across all your Tier 1 platforms or you punt on
             | the problem, defeating the purpose of using a language with
             | an ecosystem in the first place.
             | 
             | Take Javascript, for example. Which APIs are you actually
             | committing to support? Are you going to support the Date
             | class? BigInt extension? Node's fs, path, and crypto
             | libraries? The browser's local storage, indexed DB, and
             | other high level APIs? What about setTimeout and
             | setInterval? Or are you only supporting pure-JS libraries,
             | forcing the user to do a manual review of each dependency
             | they consider?
             | 
             | A lot of microcontrollers - probably the vast majority in
             | circulation - wouldn't have the ROM to even support most of
             | those APIs, if they made any sense on an MCU to begin with.
             | Look at MicroPython to see the kind of tradeoffs they have
             | to make - it isn't pretty.
        
             | spyremeown wrote:
             | Other comments have put better than I could, but I'll add
             | that what people call ecosystems nowadays is completely
             | unthinkable in embedded. Sometimes you have critical
             | applications and you bet you need to certify every single
             | line of code that goes into your application. Small
             | embedded devices are more geared towards engineering than
             | other kinds of development, and in my opinion that's why
             | applications work well, in comparison with the mess we have
             | in the web nowadays, for example.
        
             | thadt wrote:
             | Nicer from which side? Not OP, but I do like modern
             | languages and great type systems - I'll be the first to say
             | that TypeScript is fantastic and maybe one of my favorite
             | typed languages.
             | 
             | However, embedding Lua and writing bindings for it is
             | really easy to do. The entire thing fits in a nice, neat
             | single directory of a few ANSI-stone-age-C files and "Just
             | Works". You can drop it into your codebase, write a couple
             | of simple bindings and be off to the races in no time. And
             | you can easily fit its world model into the model of your
             | application. Lua's simplicity makes it a very, very
             | powerful tool.
        
           | tines wrote:
           | Yikes, not true. I can't imagine developing anything of
           | significant complexity with Lua. Also it hasn't been all-
           | capitals for a while.
        
         | astrobe_ wrote:
         | But being able to fish in the ocean of JS devs for embedded is
         | the dream of every manager.
        
           | mypalmike wrote:
           | /s?
        
           | CSSer wrote:
           | And it may be a foolish one because that ocean is filled with
           | sea monsters that even TS can't tame.
        
             | wiseowise wrote:
             | I'd rather say plankton than sea monsters.
        
               | CSSer wrote:
               | I've never seen plankton sink a ship or halve its
               | performance but sure. One can only take a metaphor so
               | far.
        
           | akiselev wrote:
           | Frontend developers can barely be arsed to read the short
           | React docs once a year to catch up on any updates.
           | 
           | There is no way in hell we're going to be able to function in
           | an industry with thousand page data sheets and programming
           | manuals.
        
             | charcircuit wrote:
             | >with thousand page data sheets and programming manuals.
             | 
             | Why aren't those just a library? There is no way everyone
             | deplicates the same work for interfacing with a chip for
             | every single project that wants to use it.
        
               | akiselev wrote:
               | There are plenty of libraries: from low level hardware
               | abstraction layers to high level libraries like you'd
               | find in the Arduino ecosystem. Those closer to the former
               | (the HALs) require more understanding thus more reading,
               | the latter expose less of the power of the chip because
               | they target the least common denominator.
               | 
               | However, when you're making a mass produced piece of
               | hardware with a $10 BOM cost and it turns out that you
               | can save even 25 cents by using 90% of the power of a
               | cheap chip instead of 5% of the power of an expensive
               | chip, you're going to have to dive down into the
               | documentation to figure out how to get every last ounce
               | of processing power out of the cheaper chip.
               | 
               | That usually means exploiting the unique configuration of
               | peripherals on a chip which can't be cleanly abstracted
               | away by a software library. My first few projects, for
               | example, I had to work around silicon errata in the
               | family of chips the projects had chosen: STM32F4s
               | couldn't run both DMA channels simultaneously at max
               | speed when outputting to different peripherals. I
               | wouldn't have been able to figure out what's going wrong
               | at any level of abstraction without reading the
               | documentation.
               | 
               | That's why I'm now in frontend instead of embedded.
        
             | johnfn wrote:
             | Lol, I know that people like to joke around that frontend
             | engineers are dumb, but this is just unnecessary.
        
               | von_lohengramm wrote:
               | It's obviously exaggerated and reductive, but you have to
               | admit that not knowing how to use React properly is
               | massively prevalent in frontend, let alone being able to
               | recognize _when_ to use React.
        
           | ranit wrote:
           | And remains a dream far away from reality.
        
         | circuit10 wrote:
         | AssemblyScript can be used for that too, though it's not it's
         | main purpose
        
         | ilyt wrote:
         | I see things like MicroPython as a nice tool for prototyping
         | hardware side rapidly (if you just need to test some SPI/I2C
         | stuff in more complex way than i2c interface allows) and for
         | projects simple enough that you don't ever will use most of the
         | CPU and can afford to spend $ for wasted RAM/Flash.
         | 
         | Like, you just want to flip some bits based on some inputs in
         | as simple way as possible.
         | 
         | But then eh, Arduino is easy enough for same thing...
        
       | gedy wrote:
       | Looks nice, didn't see in info what devices are supported yet?
        
         | aroman wrote:
         | Looks like at least the Pi Pico and ESP32 are supported:
         | https://microsoft.github.io/devicescript/devices
        
       | 0xCAP wrote:
       | For good and for bad, let's not forget it won't support (at least
       | a big portion of) existing npm modules.
        
       | rektide wrote:
       | It'd be nice if AssemblyScript + wasm could compete here too.
       | Quite the effort! Made their own small vm interpetter.
        
         | qbasic_forever wrote:
         | It can, wasm3 is a wasm interpretor ported to a lot of bare
         | metal microcontrollers: https://github.com/wasm3/wasm3
        
           | circuit10 wrote:
           | Or you can compile it to C with wasm2c or w2c2 for much
           | better performance
        
         | dmitrygr wrote:
         | Wasm is just a lobotomized assembly. On an embedded device your
         | code is likely the only thing running so just use normal asm?
         | Your free copy of GCC will happily compile c to it. Try.
        
           | rektide wrote:
           | I think it's a bit simplistic to assume native, already
           | compiled code is the only payload worth considering.
           | 
           | The portability of wasm will be pretty excellent, and over
           | time there may be a great cross-language ecosystem
           | surrounding wasm that native may not match.
           | 
           | Wasm also seems like a potentially better target than what we
           | have here, which seems interpetter focused. Wasm otoh might
           | actually be able to jit/aot compile down (which the mentioned
           | wasm3 interpretter eskews with a list of good reasons, for
           | anyone looking for counterarguments). And likely will have
           | more invested in the ecosystem in doing optimizations in
           | general.
        
             | dmitrygr wrote:
             | > I think it's a bit simplistic to assume native, already
             | compiled code is the only payload worth considering.
             | 
             | WASM _IS_ compiled code
             | 
             | > The portability of wasm will be pretty excellent, and
             | over time there may be a great cross-language ecosystem
             | surrounding wasm that native may not match.
             | 
             | 1. They said that about java too.
             | 
             | 2. Problem is...you need to compile _something_ to WASM,
             | and currently a lot more _somethings_ are compileable to
             | native than to wasm, and i doubt this will ever change,
             | since compiling to wasm is a strict superset of compiling
             | to native, in terms of work involved in making a compiler.
             | (this is not true for old esoteric architectures, but i do
             | not see you offering me a WASM runtime for the 8051 either)
             | 
             | > Wasm otoh might actually be able to jit/aot compile down
             | 
             | You know what else does that? Any compiled language ... to
             | native code... In fact, we "AOT" it from the start in a
             | process we call ... compilation. Your local free copy of
             | gcc can do this for you. Check it out.
             | 
             | > And likely will have more invested in the ecosystem in
             | doing optimizations in general.
             | 
             | You know what else does good optimization for a given
             | target? You local free copy of gcc. Check out the "march",
             | "mcu", and "O" flags
             | 
             | Point is: I buy the use of interpreted code on IoT: so
             | people who cannot program can still make a light blink. But
             | as soon as you go to compiled code, might as well compile
             | for your actual target, and not a pointless IL (which is
             | what WASM is until you show me your HDL for a WASM cpu)
        
               | rektide wrote:
               | I feel like you are super trapped in a very small way of
               | thinking.
               | 
               | Say I run an IoT system across a variety of embedded
               | systems. I could dynamically load small behaviors &
               | scripts to all targets with this. User scripts could
               | target all devices.
               | 
               | Your aim that native code can target everything seems to
               | be pretty limited. A lot of languages can't or won't
               | invest in wide micro-architectural & embedded support.
               | 
               | I feel lile you are confining yourself to a very very
               | narrow position, & refusing to see possible middle
               | grounds or uses. We needn't adopt such stark framing.
        
               | hutzlibu wrote:
               | "WASM IS compiled code"
               | 
               | Yes, but to a VM, so the same code can run wherever there
               | is a wasm runtime (number is growing).
        
               | circuit10 wrote:
               | > but i do not see you offering me a WASM runtime for the
               | 8051 either
               | 
               | As long as there's a C compiler for it, just use https://
               | github.com/WebAssembly/wabt/blob/main/wasm2c/README....
               | or https://github.com/turbolent/w2c2
               | 
               | That way, you get the portability of C, the optimisation
               | power of GCC or your favourite C compiler and the
               | portablity and determinism of WASM! Obviously there's
               | some overhead but there are definitely situations where
               | this is a good option, especially where there's a
               | compiler available for WASM but not for whatever obscure
               | platform you want to use
        
               | pjmlp wrote:
               | The amount of WebAssembly push, ignoring all bytecode
               | based formats since the late 1950's is incredible.
        
       | bakugo wrote:
       | I know companies are desperate to replace every programming
       | language with javascript so they can just hire cheap junior web
       | devs to do everything, but this is ridiculous.
        
       | nonethewiser wrote:
       | On that site, cmd+f makes the video full screen. yuck
        
         | orhmeh09 wrote:
         | I have found the browser extension StopTheMadness to be
         | invaluable to browsing the web in 2023.
         | https://underpassapp.com/StopTheMadness/
         | 
         | It even works on Chrome:
         | https://underpassapp.com/StopTheMadness/support-chrome.html
        
           | therein wrote:
           | TIL about the `ping` attribute on HTML anchor elements.
        
       | gigel82 wrote:
       | Interesting choice to build a brand new JS engine from the ground
       | up. Wondering if there's a life for that outside of the project
       | as an embeddable JS / TS engine (especially after Microsoft
       | abandoned Chakra/ChakraCore a few years back).
        
       | Ins43b wrote:
       | I've been using Espruino with TypeScript code for some years now,
       | but this looks quite interesting too. Time for a new IoT project
       | to test this out.
        
       | robbywashere_ wrote:
       | I have personally been trying to find either a language which
       | transpiles to c or c++ or one with near performance to run on a
       | ESP32. It would be nice to also make use of existing c++
       | libraries. I've seen NodeMCU, go lite, mini python, you name it.
       | Any suggestions? I am considering rust or zig...
        
       ___________________________________________________________________
       (page generated 2023-05-24 23:00 UTC)