the target platform post has been improved
This commit is contained in:
parent
b357cac07c
commit
239c60a520
|
@ -14,17 +14,17 @@ As programmers, we have a tough life when it comes to making a decision that
|
|||
has direct impact on our product. I'm pretty sure you went through this process
|
||||
at least once. From choosing a semantically great name for a variable to choosing
|
||||
a right technology for your next billion dollar startup. It is always hard to
|
||||
pick a tech stack for a new project. Specially when the new product happens to be
|
||||
pick a tech stack for a new project. Especially when the new product happens to be
|
||||
a new programming language. If I get my hands dirty with a wrong tech stack for
|
||||
a simple web application, no big deal. I still can rewrite the whole thing and
|
||||
pay a penalty. But in case of programming languages that's not the case. Wrong
|
||||
pay a penalty. But in the case of programming languages that's not the case. Wrong
|
||||
platform can easily destroy you. From the dawn of computers, many smart people
|
||||
created tons of languages. But only few of them made it to the top. While there
|
||||
are so many reasons for their success, going with the right platform is one
|
||||
the most important ones.
|
||||
|
||||
The obvious question that comes to mind when we're talking about "The platform"
|
||||
is that should we build a platform from scratch or should we piggyback on others?
|
||||
is, should we build a platform from scratch or should we piggyback on others?
|
||||
Creating a programming language and a virtual machine from scratch is gigantic and
|
||||
bone crushing task. It needs a crazy set of skills and knowledge. Even with such
|
||||
wisdom and experience people who went through it has made many mistakes and had to
|
||||
|
@ -39,7 +39,7 @@ abandon my goal. I should ride on the shoulders of the giants to gain benefit fr
|
|||
their great work. I should choose a platform that helps me to move faster and iterate
|
||||
through different ideas quicker.
|
||||
|
||||
From technical perspective, Starting from scratch means that I have to write a
|
||||
From a technical perspective, Starting from scratch means that I have to write a
|
||||
program that includes at least a parser and a compiler. Building a compiler
|
||||
is no joke. Hypothetically let's say we have a working compiler and parser, What
|
||||
about use libraries and ecosystem ?? It would be really hard to convince people
|
||||
|
@ -56,9 +56,9 @@ the picture. We need to find a good platform for it. But what are the options ??
|
|||
> already available.
|
||||
|
||||
[Racket](http://racket-lang.org) is a dialect of Lisp which allows us to build our own
|
||||
language by extending it. While Racket is really cool and have long list of pros and
|
||||
language by extending it. While Racket is really cool and have a long list of pros and
|
||||
[many reasons why to use it](https://beautifulracket.com/appendix/why-racket-why-lisp.html)
|
||||
(It's Lisp after all), it has a disadvantage that forced me to stop thinking about it
|
||||
(It's Lisp after all), it has the disadvantage that forced me to stop thinking about it
|
||||
for **Serene**. As I mentioned in the [rational](/programming/rational-and-a-name/)
|
||||
I'm not trying to build a toy language or a domain specific one and Racket's ecosystem
|
||||
isn't as great as a battle tested and well-known ecosystem like Java or Python (or other
|
||||
|
@ -68,18 +68,18 @@ popular ecosystems).
|
|||
We're living in the age of Web and one of the big players in this era is Javascript. The number
|
||||
of the programming languages that compile to Javascript is increasing rapidly. Javascript
|
||||
as a language [sucks](https://whydoesitsuck.com/why-does-javascript-suck/) but as platform
|
||||
it is amazing. Lots of money and engineering afford has been spent on improving Javascript engines.
|
||||
it is amazing. Lots of money and engineering effort has been spent on improving Javascript engines.
|
||||
As a result Javascript is a crappy language with well engineered engines such as
|
||||
[V8](https://v8.dev/).
|
||||
|
||||
Creating a language base on Javascript platform means that I have to be involved with the whole
|
||||
Creating a language based on Javascript platform means that I have to be involved with the whole
|
||||
transpiling scenario and deal with the fact that this new language can be used on different
|
||||
browsers or on the backend. Or even on IE6 (Just kidding). I don't want to deal with all this.
|
||||
I think Javascript platform can't be a good fit for what I need. So i won't go in details about
|
||||
I think Javascript platform can't be a good fit for what I need. So I won't go into details about
|
||||
it
|
||||
|
||||
## Python
|
||||
Python is another famous platform form creating programming languages. Many people has built
|
||||
Python is another famous platform form creating programming languages. Many people have built
|
||||
programming languages on top of Python (Checkout [Lispy](http://norvig.com/lispy.html) if you're
|
||||
a Python fan). Python is super popular these days and you'll see it everywhere. Creating a language
|
||||
on top of Python (just like Javascript) gives me access to a rich ecosystem with huge number of
|
||||
|
@ -87,15 +87,15 @@ libraries and a robust ecosystem.
|
|||
|
||||
But as I mentioned in the [rational](/programming/rational-and-a-name/) I want support for built-in
|
||||
concurrency and parallelism. Python isn't even good when it comes to parallelism and concurrency.
|
||||
I'm using python for more that 10 years now and I'm very familiar with it. I know about all the
|
||||
I'm using python for more than 10 years now and I'm very familiar with it. I know about all the
|
||||
effort to create useful concurrency and parallelism such as asyncIO. But the fact is Python
|
||||
is not designed for this job. **GIL** is a huge problem in Python that literally prevents
|
||||
us from Running two piece of code in parallel in two kernel space thread. It is a problem
|
||||
us from Running two pieces of code in parallel in two kernel space thread. It is a problem
|
||||
for me. If you can't do a decent concurrency and parallel execution you have no chance
|
||||
against modern languages like Clojure, Go, Elixir and others. Python is fine now despite
|
||||
of its problems because it is good at other stuff and people accepted it for what it is.
|
||||
Python is out there for about 25 years now and it has established a big community. If
|
||||
Guido van Rossum created Python a year ago, I'm pretty sure that it would've fail because
|
||||
Guido van Rossum created Python a year ago, I'm pretty sure that it would've failed because
|
||||
it can't compete with modern languages. Don't get me wrong, I'm not trying to trash Python.
|
||||
It is great and it has many good qualities but a good Concurrency and parallel execution model
|
||||
ain't one of them.
|
||||
|
@ -120,17 +120,17 @@ Plenty of researches have been made to make it better and better.
|
|||
|
||||
The JVM has a mature ecosystem and a massive community of developers that resulted in an
|
||||
unbelievable number of libraries (not the largest though, NPM is the largest artifact
|
||||
repository. But it has huge amount of useless BS as well). By targeting the the JVM,
|
||||
repository. But it has a huge amount of useless BS as well). By targeting the JVM,
|
||||
users will have an easy time adopting the new languages because of the rich tools set
|
||||
provided by the Java ecosystem and all the languages that targeted JVM as well. For example,
|
||||
it will be possible to use libraries written in Scala or Clojure as well.
|
||||
|
||||
Long story short, I think the JVM is the right platform for me. The fact that many languages
|
||||
have chosen it as their base platform shows that how useful it can be. But there is a problem.
|
||||
have chosen it as their base platform shows how useful it can be. But there is a problem.
|
||||
Targeting a higher level virtual machines like the JVM means that I'll have an easier job to
|
||||
create a compiler. But I still have to write one. A compiler that takes the code and produces
|
||||
JVM bytecode. As I mentioned earlier writing a compiler is an enormous task and the chance
|
||||
of doing it wrong with some one like me who never has built a compiler before is very high.
|
||||
JVM bytecode. As I mentioned earlier, writing a compiler is an enormous task and the chance
|
||||
of doing it wrong with someone like me who has never built a compiler before is very high.
|
||||
|
||||
## One VM to rule them all
|
||||
Luckily there is a solution. I can write an interpreter in a VM that is designed to optimize
|
||||
|
@ -160,7 +160,7 @@ them all.
|
|||
|
||||
[Truffle](https://github.com/oracle/graal/tree/master/truffle) library is one the key
|
||||
players in GraalVM. The initial results of Truffle are super exciting. Implementations
|
||||
of Ruby in Truffle has a performances on the same order of magnitude as the much bigger
|
||||
of Ruby in Truffle has a performance on the same order of magnitude as the much bigger
|
||||
projects of JRuby. Just checkout [Truffle Ruby](https://chrisseaton.com/truffleruby/)'s
|
||||
website to get amazed by it.
|
||||
There is a [Javascript implementation](https://github.com/graalvm/graaljs)
|
||||
|
@ -178,9 +178,9 @@ interpreter and Graal will handle the rest. It means that I can start by buildin
|
|||
important and use a very well engineered toolkit in my advantage to get to my goal quicker
|
||||
and then later on replace any part that I like with my own implementation. How cool is that???
|
||||
|
||||
But as an engineer and a wannabe scientist I'd like to see the proof with my own eye. Not
|
||||
But as an engineer and a wannabe scientist I'd like to see the proof with my own eyes. Not
|
||||
because I don't trust academic work, Just because it feels good to experience the proof.
|
||||
|
||||
So to begin with I'm going to create a dead simple Serene interpreter in Java and OpenJDK
|
||||
and then build the same interpreter using Java on GraalVM using Truffle library and
|
||||
compare the result and prove myself that choosing GraalVM is the right choice.
|
||||
compare the results and prove myself that choosing GraalVM is the right choice.
|
||||
|
|
Loading…
Reference in New Issue