DeviceScript: A Tailored TypeScript Experience for IoT with Visual Studio Code Integration
Microsoft has recently introduced DeviceScript, an experimental project that extends the capabilities of TypeScript to the realm of Internet of Things (IoT) devices. Launched in May, DeviceScript is an open-source initiative from Microsoft Research aimed at enabling developers to leverage their TypeScript skills for programming low-resource, microcontroller-based platforms such as the ESP32 and RP2040. This endeavor reflects Microsoft’s commitment to simplifying the development process for IoT applications while maintaining the familiar features of TypeScript.
DeviceScript is essentially a subset of TypeScript tailored for resource-constrained environments. It compiles down to custom VM bytecode designed to run efficiently on microcontrollers. With a minimal footprint, the VM can compile to just 10KB of code, and when combined with additional libraries, such as the floating-point library and Jacdac SDK, the total code size reaches approximately 40KB. This compact design makes it feasible for use in devices that typically have strict limitations on memory and processing power.
Getting started with DeviceScript is straightforward, thanks to comprehensive instructions available on the project’s website. A key feature of DeviceScript is its integration with Visual Studio Code through a dedicated extension. This extension facilitates the entire development lifecycle, allowing developers to build, deploy, debug, and trace DeviceScript code seamlessly. Additionally, it provides monitoring capabilities for connected devices, enhancing the overall development experience and enabling real-time feedback during testing.
One notable aspect of DeviceScript is its command line interface (CLI), which empowers developers to compile their programs from any preferred integrated development environment (IDE). The CLI’s versatility extends to container environments, such as Docker, making it a powerful tool for developers looking to streamline their workflows. This level of flexibility allows developers to integrate DeviceScript into various stages of their development pipeline, accommodating different project requirements.
While DeviceScript retains much of the functionality of TypeScript, it is important to note that not all features are supported due to the limitations of the runtime environment. For example, strings are implemented as Unicode rather than UTF-16, and aggressive tree shaking is utilized to optimize the code for size and performance. Despite these differences, DeviceScript closely follows the semantics of JavaScript, ensuring that developers can adapt to this new environment with relative ease.
DeviceScript also abstracts the interaction with hardware components through Jacdac services, allowing developers to access sensors, actuators, and other peripherals with minimal complexity. In this model, sensors function as servers, while DeviceScript scripts act as clients that interact with these services. Developers initiate client roles for each service they require, simplifying the process of integrating hardware functionalities into their applications. Furthermore, the use of package managers like npm, Yarn, or pnpm enables the distribution and consumption of DeviceScript packages, fostering a collaborative ecosystem for developers working on IoT projects