Soutaro Matsumoto

An Introduction to Typed Ruby Programming

Balkan Ruby 2019

00:00:19.609 Okay, thank you. So, my joke is about type systems and type checkers.
00:00:24.840 Before starting my talk, I'd like to do a survey. I thought that you already know that Ruby will have an optional type checker. Do you know this?
00:00:31.500 Everyone knows, that's fine. Another question is about the big topic of the development of type checker for Ruby, which is about duck typing. Do you think that you write duck typing?
00:00:45.239 Okay, about recent developments, it's awesome. Let me introduce myself. I'm Soutaro Matsumoto. I live in Japan, and I'm from Tokyo.
00:01:03.210 This is my first time visiting European countries. So now, Europe is a wonderful place for me. I hope that you see this picture. This is a picture of a big gate from a famous temple in Tokyo. There is a famous meetup called the Ruby Meetup in Tokyo, which happens weekly every Tuesday.
00:01:29.490 It’s a really nice meetup because many notable Ruby developers, including Akira Matsuda and Yoshi Shibata, attend it. So when you come to Japan, if you have time, it would be really nice to visit the meetup.
00:01:58.290 I'm currently working as an outsider at a Tokyo-based startup, and I have also worked at two other startups as a technical advisor. I'd like to introduce you to an idea for a web service that helps you review your code. It provides various code analysis tools and some open-source linting tools, which run on pull requests to find problems and give suggestions.
00:02:36.860 We support the Black Hole, and many of our users love working with our tools. We had an interview with Vulture at last year’s RubyKaigi event. I also developed a type checker for Ruby, and it's available in my GitHub repository. You can see the project there.
00:03:05.180 As you know, this is the topic of my talk today. This is the outline of my talk: first, I will explain the latest plan for Ruby 3, and then I'd like to introduce my type checker called Steep. Finally, I will share the progress of the type checking development project.
00:03:46.160 This is a picture from the keynote from the RubyKaigi conference this year. It covers three significant improvements: performance, concurrency, and static analysis, and we are focusing on static analysis.
00:04:09.859 The team consists of Ruby core members such as Matt, Koichi Sasada, and Uske Endo, along with type checker developers from around the world. We have some participants from Sorbet, including Geometry and others working for Solargraph.
00:04:54.680 Currently, one of the most practical type checkers available for Ruby is being developed by Professor Jeff Foster, who is a researcher at a university. He develops another type checker for Ruby, and it is part of his research project. Additionally, Cayendo also has a type checker called Type Profiler, which is still experimental.
00:05:30.700 We have meetings regularly, almost every month, discussing the foundations of type checking for Ruby. We share progress on our developments and discuss challenges. The primary goal of this project is to develop a type checker that detects the type of each Ruby expression without executing the code.
00:06:46.080 The purpose of the type checker is to assist in the development of Ruby applications by finding bugs, such as normal errors or argument mismatch.
00:07:03.810 It will also help with code navigation features, like 'jump to definition' in your IDE, which requires type information. Moreover, the type checker will provide refactoring support, making it easier to rename constants, methods, or instance variables accurately.
00:07:37.320 However, performance improvements are not our primary goal. While performance may improve by skipping certain runtime checks due to precise analysis of Ruby code, achieving this is quite difficult.
00:08:23.000 The focus of our project is static analysis, not performance.
00:08:36.280 This image presented at the RubyKaigi explains key items like the signatures of libraries, application levels, type checking, and how they will impact our development.
00:09:19.030 Ruby 3 will introduce a language to define type signatures for Ruby programs, including standard libraries and protocols to share signatures for gems.
00:09:52.150 This is an example of the Ruby signature language that is still unnamed, but structurally resembles Ruby. We'll have class definitions, mixing declarations, and method signatures, though the syntax will differ from standard Ruby.
00:10:23.430 We will define types for methods, instances, globals, and constants within this language, which will support advanced features like generics, union types, and optionals.
00:10:39.540 Ruby 3 will ship with signature definitions for standard libraries, and we will require these definitions for any type checking to maximize effectiveness.
00:11:21.940 If a library doesn't have a signature, you will have to write it yourself, which can be exhausting.
00:11:33.740 Ruby 3 will come with built-in standard library signatures that include basic gems, and a protocol to share signature definitions will be established.
00:11:53.950 We've been discussing providing new syntax for Ruby code annotations. There will be no new syntax or standard type checker, and any proposed syntax will need to effectively assist the annotation without confusing developers.
00:12:19.000 While there was a hope for new syntax, we recognize that we require some type annotations, including comments for type explanations or using embedded DSL methods. We are looking for ways to achieve this without introducing additional runtime requirements.
00:13:14.100 There's a lot of discussion on implementing type checkers like Sorbet and Steep. The tools are independent, but they all contribute to evolving the Ruby type-checking ecosystem.
00:13:59.730 There's continuous improvement and discussion on type definitions. We aim to enhance type-checking processes, empower developers in Ruby applications, and help libraries by keeping runtime dependencies minimal.
00:14:45.270 I'd like to emphasize that Steep provides a language for defining signatures, and we're actively developing a type checker that quickly detects errors in Ruby applications.
00:15:04.230 This small example highlights how Steep will identify bugs by checking method calls. For instance, if an initializer expects keyword arguments, but receives positional arguments instead, Steep will detect mismatches promptly.
00:15:47.540 Furthermore, Steep checks the implementation accuracy of methods and can catch logical errors, such as using an array method incorrectly. This capability is crucial for maintaining code quality.
00:16:37.200 Duck typing is an essential concept in Ruby programming, requiring us to find robust ways to implement typing that enhances our code without compromising its flexibility.
00:17:05.730 The support for duck typing allows you to define interfaces more flexibly, ensuring type safety while utilizing Ruby's dynamic programming features effectively.
00:17:59.050 Steep is also designed to be agnostic to metaprogramming, meaning that it focuses primarily on static typing without being influenced by dynamic method definitions.
00:18:54.460 The approach allows developers to continue leveraging Ruby's metaprogramming practices while ensuring type errors are detected accurately.
00:19:34.610 There are ongoing discussions about defining a minimal set of runtime dependencies required for utilizing type annotations. We want to minimize additional dependencies that could complicate library use.
00:20:16.900 So, discussing the current status of the type checker development, we have four type checkers being built: Steep, Sorbet, RDL, and Type Profiler.
00:20:54.040 Each developer is independently working on their tools while sharing experiences and insights to push forward the Ruby type-system implementation.
00:21:30.390 We continue working on defining a signature language suitable for Ruby's features, improving type definitions and their implementation in the community.
00:21:59.680 Ideally, we aim for a standard approach to defining signatures not only to ensure code accuracy but also to enhance collaboration between Ruby-based libraries.
00:22:47.440 I encourage everyone to feel free to ask questions, provide feedback, or share experiences and suggestions concerning type checker tools and implementations.
00:23:30.310 Finally, thank you for your time and listen. Don't hesitate to contact me for any further discussion or demonstrations regarding Steep.