Interesting Programming Languages
I kinda have a fetish for unconventional programming languages. Basically, programming is a hobby of mine: if I’m going to spend my free time coding something I better write it in an interesting language. Here’s a list of the languages that I’m interested on and some notes on them.
Stuff I use
This are languages I know and love. It’s basically what I use on my day-to-day — besides more conventional languages such as Python and Ruby that I use when contributing to random projects on the web. There’s some other languages I know well too, but I don’t quite like those…
- Rust
-
Rust has a lot of things going for it. It’s meant to be a modern alternative to languages such as C and C++. It’s very fast and it has a minimal runtime.
One of it’s more interesting features is it’s memory model: references in Rust are owned, which means memory is guaranteed to be safe — unsafe memory is one of the most common bug-causes in C and C++, so this is a direct answer to some of the shortcomings in C-ish languages. Some people have a very hard time “fighting Rust’s borrow-checker”, but I love it.
Another very interesting feature of Rust is it’s type system. Rust supports algebraic datatypes (ADTs), which means Rust types have products and coproducts. ADTs means pattern-matching too, which is awesome!
Finally, Rust also has a very interesting hygienic macro-system. You can checkout the details in here: danielkeep.github.io/tlborm/book/README.html
- Haskell
-
The one and only. Haskell doesn’t need much introduction, but for those of you who don’t know: it’s a lazy, statically-typed, pure functional language.
The lazy bit means evaluation is postponed as much as possible, which allows for infinite data-structures and generally improves performance. The pure bit means functions in Haskell have no side-effects — well, not really, but there’s a type-level barrier between the world of pure functions and the side-effecty world.
Like Rust, Haskell supports ADTs — it even supports generalized algebraic datatypes (GADTs), which are a generalization of ADTs.
Stuff I’d like to learn
- Idris
-
Idris supports dependent types, which means types are values and type-parameters need not to be types — type-parameters can have any type.
This allows the programmer to express precise constraints of a peace of data using it’s type-signature. For example, one can write
v : Vect 5 t
to say “v
is a list of five elements of typet
”.Of course, you can already do this sort of thing in languages like C or Java (i.e.
t v[5];
), but Idris supports generalized dependent types: type-parameters can have any type.For example, one could define a generic type
Transaction (db : DataBase)
, which is parameterized by a value of typeDataBase
—Transaction
is really a function that takes an instance ofDataBase
and returns a type (i.e. a value of typeType
).It turns out dependent types can also be used to express and prove statements about a program, which is really cool too.
- Racket
-
Racket is a Lisp dialect — specifically, it’s a Scheme implementation. I’d really like to experience the joy of Lisp everyone talks about. People say Racket is a pretty cool choice for writing DSLs too.
- Prolog
-
Prolog is a logic programming language. Programs are expressed as relations instead of functions or procedures, which is very interesting.
- OCaml
-
OCaml is another language from the ML family. I’d really like to get some experience with more traditional ML descendants — basically anything other than Haskell and Miranda.
- Erlang/OTP
-
Erlang is a beautiful language for writing embarrassingly concurrent systems. It’s a really really interesting paradigm and it’s definitively my choice for concurrency-related problems — I just don’t get solve those very often.
There’s actually a whole bunch of languages built for the BEAM — the virtual machine Erlang runs on. Some highlights are Elixir and Alpaca. I’m interested in learning any of those.
Stuff I’d like to play with
- GAP
-
GAP “is a system for computational discrete algebra”. It’s mostly focused on Group Theory, which is something I’ve been studding lately. I’d like to know what it’s actually capable of.
- Assembly
-
I’ve played around with x86 assembly in the past, but I’m far from being able to be productive with it. I’m also interested in developing a game for a vintage console such as the NES.
Here’s a video o talk of mine on (basic) assembly programming: pablopie.xyz/2020/11/19/introduction-to-assembly.html