00:00:00.000
You see on our next speaker to you, and we'll do a quick swap to see if the laptop's there. So please welcome Lena Plaksina.
00:00:10.139
I actually know Lena because we both spoke together at Kiwi Ruby back in 2017, so I already have very good evidence that she's a fantastic speaker.
00:00:16.320
She's going to be talking to us about writing her own programming language. She's an avid cat rescuer, a learning enthusiast, and a member of the organizing committee for Rails Bridge Wellington.
00:00:28.380
She started out in design but fell for web and software development during her first industry internship. She's been writing Ruby since 2015 and is currently learning other languages to expand her toolkit.
00:00:40.620
Lena loves finding patterns, building and communicating software in a way that helps everyone understand it. She believes in failing better, as mistakes help her become a better developer.
00:00:52.610
When she's not coding, she's watching movies with her three-legged rescue cat, Warlock, collecting enamel pins, and helping out or presenting at tech community events around town.
00:01:11.390
Thank you very much! Hi everyone, welcome back! I'm going to try to be super chipper because we're back from a break, and it's day two, and it's going to be great.
00:01:16.710
To start us off and get into the spirit of things, I was thinking we could play a bit of a game. If any of you are familiar with a game called Animal, Vegetable, or Mineral, it's kind of like that—but not really.
00:01:30.180
In this game, you just have to think of the answer and keep it in your head. I'm going to think of something, and I'll give you three clues to guess what it is.
00:01:36.510
Clue number one: the thing I'm thinking of has something to do with the sea. I'll give you a second to think. I feel like this is an unfair clue because there are literally thousands of things related to the sea.
00:01:50.250
Clue number two: in addition to having something to do with the sea, it also has something to do with pigs. At this point, I know I made it too easy. By now, everyone probably knows what I'm thinking about.
00:02:04.860
Clue number three: it's not actually full-grown pigs; it's piglets. Clearly, I’m thinking of sea piglets! In Germany and Russia, these fluffy little creatures are known as sea piglets in a literal translation. However, if your native language isn't one of those, you might recognize the animal as a guinea pig.
00:02:42.420
All of this is to say that language cultivates meaning. I was born in Russia and spoke only Russian for the first ten years of my life. As an immigrant, English is my second language, so this small fact manifests in my having a slightly unusual accent and making small talk difficult.
00:03:19.849
However, it sometimes leads to funny situations. When I try to have conversations or deliver a talk at a conference, some words or even entire phrases can just drop out of my brain. Often, those words get replaced by the equivalent in my native language.
00:03:39.579
Why would someone like me conceptualize guinea pigs as little piglets from the sea? Despite speaking English for a long time, the language I first heard to describe those concepts formed strong links in my brain and cultivated different ways of thinking.
00:04:20.610
In the 1960s, Melvin Conway created a theory that suggests organizations which design systems are constrained to produce designs that mirror the communication structures of those organizations. This idea implies that the products we make reflect the teams that wrote them.
00:04:49.039
I’d like to propose that when writing your language, it can reflect the writer. We also join communities that reflect our personal ethos as a consequence of this concept. While all of this is interesting, I don't think you're here to learn about Conway’s theory or my origin story.
00:05:15.389
So, it’s about time I tell you a little bit about Wholesome Lang. Wholesome Lang is the name of the language I attempted to write. I started this journey nearly two years ago, and it began as a joke about my speaking patterns.
00:05:59.759
In my regular life, I’m a pretty silly person. I say a lot of silly things and make up silly words, and my friends like to tease me about it. One year for my birthday, they gifted me a dictionary that included silly words I've made up, creating a sort of 'English Plus Lena'.
00:06:32.549
Because I'm that kind of person, I decided to take the joke a bit too far and write an entire language around it. I wanted to create something cute and funny, similar to an esoteric programming language, and I decided to base it on object-oriented paradigms, implementing it in Ruby since I love Ruby.
00:07:07.259
This choice meant that I didn’t have to learn a whole bunch of new technologies while trying to do something I'd never attempted before. My friends helped me get started, and I looked through several tutorials online. Initially, I thought this would be difficult, but it turned out I could choose to make it as simple or as complex as I wanted.
00:07:39.459
One tool I found valuable was an article from FreeCodeCamp. It serves as a great reference for implementing a programming language and covering many concepts that I ended up using. The author provides excellent advice for anyone writing a new language, detailing their decisions and alternatives.
00:08:42.960
Naturally, I didn’t follow all their advice because I wasn’t trying to solve significant technical challenges with Wholesome Lang. I wasn't concerned about performance, speed, or even writing my own compiler. I chose to focus on having fun. Thus, I wrote the entire language in Ruby, making it an interpreted language sitting on top of an interpreted language.
00:09:22.370
One recommendation I did keep from the tutorial was creating my own custom tokenizer. There are two really cool components that I ended up using in Wholesome Lang: the tokenizer and the parser.
00:09:39.670
The tokenizer interprets the source code you provide, converting the states of symbols into tokens that the rest of the program can recognize, while the parser builds the abstract syntax tree for the rest of your program to interpret.
00:10:13.770
I would say that one of the main reasons languages benefit from having a tokenizer is that it introduces an intermediary agent to decipher what the individual blocks of symbols represent and what type of entity will eventually process them.
00:10:47.210
In Wholesome Lang, my tokenizer handles the bulk of the work, and I identified tokens by using regex matching. I cycle through all token class descendants until I can find a matching expression for the specific symbols I'm analyzing.
00:11:20.680
This was one of the first internal pieces of Wholesome Lang that I wrote, and I felt quite good about it. Once I began writing it, I started realizing many things about programming languages and what it takes to write them.
00:12:04.250
A programming language is essentially just another program, and like all other programs, it has a main runner that takes arguments like the file you want to execute. Wholesome Lang hasn’t been packaged or shipped for installation, so I run it on my machine by calling Ruby to grab Wholesome Lang.
00:12:40.100
Like any other program, a language runner can accept flags. Here, you can see Wholesome Lang attempting to process a file called samples.wl, which shows the flags it's using.
00:13:07.020
It also runs searches and validations, rejecting invalid data. However, I realize that with this slide, I’m making it look worse than it is. The example here depicts some errors, but this isn't the actual behavior of Wholesome Lang.
00:13:39.059
The flow of the Wholesome Lang program is straightforward. At the very start, file contents get passed to the tokenizer, which determines if the content is 'wholesome.' If it’s not, it raises a critical error and ceases further processing.
00:14:28.140
If it's wholesome, the tokens are passed to the parser, which builds a tree. The entire program execution involves walking down the nodes and processing the descendants.
00:15:01.470
Now that you know a bit about how Wholesome Lang works under the hood, let me share what it can actually do. I realize I said I started this project about two years ago, but this doesn't mean I've been developing it every day. What I have is a small subset of features.
00:15:57.290
One of the concepts I highly value is debugging. As such, Wholesome Lang has extensive debugging capabilities. During the initial stages, significant time was invested in creating different windows into the tokenizer and parser to ease the debugging process.
00:16:29.280
However, let's look at some features with a bit more personality and flavor. From the start, I found myself implementing features that I thought were funny rather than the most useful.
00:16:57.160
The very first function allows you to type a message, and it will print that to your console. This interaction creates a sense that you're communicating with a friend, which I find amusing. While this might not resonate with everyone, I think it’s cute.
00:17:50.260
Another ongoing feature I’m developing is the concept of 'friends' instead of classes. I find the term 'class' somewhat loaded, so when initializing a new friend, you can essentially meet them, which I think adds a fun twist.
00:18:12.360
As you've seen, Wholesome Lang's execution will not proceed if the source code contains any hate speech or insults. An interesting aspect behind this feature is what one of my friends described as 'an extremely long walk for an extremely short drink of water.' If you're curious about how this works, feel free to chat with me later.
00:18:39.460
The result is that Wholesome Lang won’t permit unwholesome code, not just in English, but in various languages, including Klingon. My programming language reflects my spoken language, which in turn mirrors my thought patterns.
00:19:36.450
At the highest level, my thinking is influenced conceptually. For example, when learning about object encapsulation, my mentor encouraged me to visualize objects as sentient beings with their jobs. This idea deeply integrated into Wholesome Lang, where every class is treated like a friend.
00:20:44.549
The way I code also led to certain assumptions. For instance, in the source code from the pot file WOL, I formatted assignment operators with spaces on either side, as that’s my habitual style. When somebody else attempted to run it, they were confused because their coding style differed.
00:21:57.190
As someone who enjoys Ruby and appreciates Matz's perspective about creating a programming language that brings happiness, I can relate to his sentiment. It’s clear that when designing a language, it greatly influences the community.
00:22:48.880
Programming languages are a product of their creators, reflecting their values, preferences, and personalities. This is evident in Wholesome Lang; my preferences for spacing and the absurdity of the whole concept shape its essence.
00:23:39.740
These operations and features created by the creator will often be intuitive for them. Programming languages aren't solely about machines; they act as tools for communication, and I would argue that developers are often communicating with future versions of themselves.
00:24:02.829
Reflecting on the experience of learning programming, I think about how almost all programming languages require translation. As developers, our jobs demand that we translate ideas and concepts from our minds into a language we know.
00:24:47.430
As someone whose native language isn't English, I navigate this translation with an additional challenge. For instance, if 'guinea pig' were a programming word, they would have to convert that concept into the correct programming term, a shape recognized by the machine.
00:25:51.870
Before starting to work with Wholesome Lang, I perceived programming languages as magical domains crafted by geniuses. It wasn’t until I started writing Wholesome Lang that I recognized these tools as approachable and within my reach.
00:26:38.960
Curious about how other languages began, I discovered that even Java started as a small project in 1991 called Green Talk. A handful of passionate developers aimed to construct something with simplicity that would become a mainstream language.
00:27:10.640
Java evolved through significant contributions over time and by the time it was officially released, it had acquired thousands of hours of development. Like many programming languages, it didn’t emerge as a polished product but rather as something built to suit the needs of its creators.
00:27:55.590
This realization helped me see writing a brand new language as achievable. The more I pondered this, the clearer it became: the question of who can write a programming language boils down to who has things to say.
00:28:38.260
Although I'm not trained in linguistics or programming language theory, I'm a Ruby developer who wanted to create something amusing for myself and my friends. Ultimately, everything we interact with was developed by individuals with ideas, and those ideas resonated with others.
00:29:22.080
At the end of the day, I created Wholesome Lang for me and my friends, as a lighthearted joke. I hope that sharing my journey encourages you to try your hand at writing your own programming language.
00:30:07.820
If you do decide to go for it, I wish for you to create a language that is just your type. Thank you!