やっほー
独自プログラミング言語「Zero」

新プログラミング言語『Zero』開発!言語デザインも解説!

  • 2020年4月6日
  • 2021年3月30日
  • Zero
  • ,
  • 140view
新プログラミング言語『Zero』爆誕!!
ということで、新プログラミング言語『Zero』を作りました。
きも男
アホの割にやるやん
と言いたいところですが、ほぼ↓の書籍に記載の「Diksam」という言語のパクリです。。お許しを。。
そのままパクってもいいよ」と仰ってくれているので、お言葉に甘えてパクらせていただきました。
が、何の前置きもなく「新しい言語作ったで」と言っちゃうのは人としてどうかと思うので、一言添えさせていただきました。
実はパクったのには理由があって、僕が作ろうとしていた言語にDiksamがかなり近かったのです。。はははっ。
目次

はじめにソースコードをプレゼント

ソースコードだけ見たいんじゃ、ぼけ!」という人のために。

Zero

新プログラミング言語の話の前に

まず、「お前のことなんか興味ないから言語の説明しろよ」という方は、ここら辺の前置きはすっ飛ばしてください。

なぜ新プログラミング言語を作ったのか

なぜ新プログラミング言語を作ったのかですが、それはもう「興味があったから」、それだけです。

今や無数のプログラミング言語がありますが、そのプログラミング言語がどうやってできているのかを知っている人はかなり少ないはずです。

ましてや、プログラミング言語を作ったことがある人はほぼいないでしょう。

まあ、僕もほぼパクっているので何とも言えないですが。。

新プログラミング言語を作ることに意味はあるのか

「意味はあるのか?」と聞かれたら、断言できますが意味はないですね

そもそも自分の作った言語が流行ることなんてほぼありません。

大前提多くの人に使われなくてはいけませんし、今はプログラミング言語もかなりの数があるので、よっぽどの理由がないと流行らないでしょう。

ただ作りたいものを作る。それがエンジニア的発想!!
きも男
カッコ良さそうで全然カッコ良くない

新プログラミング言語を作るのは楽しい

プログラミング言語を作るには、「lex」「yacc」等の知識が必要です。

また、各ツールはC言語のツールであるため、C言語に関する知識もある程度必要になります。

C言語はさておき、「lex」「yacc」なんて普通に生きていたら使うことはないツールですが、こういう古めかしいツールを触るのが実は楽しかったりします

字句解析・構文解析をしている自分に酔いしれることもできます。

新プログラミング言語を作ることの良さ

プログラミング言語を作ろうとすると、まず「自分が作りたい言語のデザイン」を考えることになります。

そのためには、現在流行っているプログラミング言語のデザインをある程度把握しておく必要があります。

その上で、「この言語のこういうところはいいな~」「この言語のこういうところは気にくわんな~」とかをグダグダ考えるわけです。

個人的には、この「言語デザインを考える」という部分が、プログラミング言語を作る一番の醍醐味だと思います。

言語のすべてを自分で決めることができる」というのが一番楽しいポイントなのです。

Zeroを作るまでの経緯

ここも、「お前のことなんか興味ないから言語の説明しろよ!!カスが!!」と思った方は、すっ飛ばしてください。

新プログラミング言語を作る前に

まず、プログラミング言語の作り方が全く分からなかったので色々とググりました

1つだけ「それらしいサイト」を見つけましたが、それ以外はあまり参考にならない。。

で、あとから気付いたのですが、この「それらしいサイト」の内容を本にしたものが冒頭で紹介した書籍になります。

僕はかなりの恩恵を受けているので個人名を出したい位ですが、勝手に出すのもあれなので書籍の方を再度ご紹介しておきます。

書籍で情報収集

日本人でプログラミング言語の神と言えば、Ruby開発者の「まつもとゆきひろ」さんです。

ってことで、Matzさんの本も一冊購入して読みました。

この本の面白いところは言語のデザインに深く触れている点です。

有名なプログラミング言語を片っ端から触る

先ほどの本を2冊読めば、プログラミング言語の作り方は何となく掴めます。

次に、ひたすら有名なプログラミング言語を触りました

僕は元々「Java」「PHP」「フロント関連」は業務で触ったことがあったので、「C」「C++」「Python」「Go」など、それなりに有名な言語を片っ端から勉強しました。

Rubyを触らなかったのは、資格勉強をした時に触っていたのと、先ほどのMatzさんの書籍でRubyの思想は何となく理解できたからです。

 

以下は僕が実際に購入した本です。

新プログラミング言語のデザインを決める

大体やるべきことはやったので、新プログラミング言語のデザインを決めました。

以下が新プログラミング言語に搭載したいポイントだったのですが、やはり僕はJavaが好きなので、かなりJavaチックです。

  • 静的型付け言語である
  • オブジェクト指向である
  • バイトコードはファイルとして出力しない
  • 拡張子は「ze」である
色々と勉強した割にこだわりはないですが、後々言語仕様を変えていく方針でもいいかなと思ったのでとりあえずこんな感じで。

新プログラミング言語作成

では実際にプログラミング言語を作ります。

環境構築

まずは環境構築が必要ですが、それは下記を参照してください。

環境構築はこちら

さーーーて、今回から本格的に新プログラミング言語を作っていきます。 と言いたいところですが、まずはそのための下準備「環境構築」が必要です。 全体的に昔に作られたツールばっかりなので色々戸惑いそうですが、ささっとやっていきましょう[…]

独自プログラミング言語を作成する!~環境構築~【2】

電卓を作成

新プログラミング言語を作るにあたり、まずはツールの理解をするべきなので、すごく簡単な電卓を作成しました。

まあ大体以下に書いてるので参考までに。

電卓作成

前回はプログラミング言語を作成するための環境を構築しました。 [sitecard subtitle=前回の記事はこちら! url=https://traveler0401.com/zero-2/ target=blank] &n[…]

yacc&lexって何?プログラミング言語の解析手順についても
電卓作成

地獄の電卓作成編!開幕! 前回は「yacc」と「lex」についてお話ししましたが、実践しないとわけ分からんので実際に手を動かしていきます。 プログラミング言語を作るにあたり、まずは電卓を作ってみて、その後本格的に言語作成に入ります。[…]

lexファイルの文法の読み方を解説!地獄の電卓作成編【4】
電卓作成

なんか、すごい、色々書くのが面倒だったのでファイルの記載のみ。すみません。。 %{ #include <stdio.h> #include <stdlib.h> #define YYDEBUG 1 %} […]

yaccファイル!地獄の電卓作成編【5】
電卓作成

地獄の電卓作成編!完結! さて、今回で電卓作成に関しては完結します。 プログラミング言語作成というよりは、bison(yacc)とflex(lex)の使い方に終始してしまっているわけですが、基本を押さえないとわけ分からんことになるの[…]

bisonとflexで電卓を作成!地獄の電卓作成編完結!【6】

Zeroの作成に着手

冒頭でもお話しした通り、基本的には書籍のソースコードを複製したものです

コピー元のソースコードをZero用に書き換えていますが、機能自体はほぼ変わりません。

機能は追々変えていくかもしれませんが、変更する場合は本記事を更新します。
コピー元のソースコードのダウンロードサイトは書籍に記載されており、本記事で勝手に記載するのもどうかと思ったので割愛します。
欲しい場合は、先ほど紹介した参考サイトからダウンロードするか、ZeroをパクってもらえればOKです。
ちなみに後で書きますが、Zeroも無償で複製してもらっていいので、どんどんパクっちゃってください

Zeroという名前について

Zeroについて説明する前に、Zeroという名前にした理由をお話ししていませんでした。

実は命名には色々理由があるので、箇条書きにしてみます。

  • ゼロから言語を作れるように(誰もが無償で複製可能という意味)。
  • B’zの大ファンで「ZERO」という曲が好きだから。
  • 日本らしい名前を付けたかったのですが、靖国神社で零戦を見て「日本の象徴と言えば零戦じゃね?」と思ったから。

まあ最初の理由以外は後付けくさいですが、そこはまあ勘弁です。

ただ、一番は「ゼロから言語を作れるように」という点で、ソースコード&本記事もできる限り分かりやすく書いていくつもりです。

飽き性なので途中で飽きるかもしれません。

注意した点

注意した点として、世の中にあるプログラミング言語と名称が被らないようにだけは気を付けました

下記を見て、「Zeroってないよね?」って感じで。命名するときには気を付けましょう。

Zeroについて

さて、ようやくZeroの説明です。

何はともあれサンプルがあるとイメージが湧きやすいかと思うので、FizzBuzzのサンプルコードを載せておきます。

 

まあ、JavaとかCに似てますね。

言語仕様については後述しているのでそちらを見てください。

ここでは、Zeroのざっくり概要をお話していきます。

静的型付け言語である

サンプルにある通り、Zeroは「静的型付け言語」です。

個人的に型がない言語はメッサ嫌いです

最近はPythonやPHPが流行っていますが、PHPだと型がないのにタイプヒンティングがあったりと、どうもいけてない感じがすごい嫌です。

しかもPHPは型がないのではなくて、暗黙的に解釈されてるから意識する必要がないってだけで、型はありますからね。。

僕がJavaから入ったからキモイと感じるだけなのかもしれませんが。。

オブジェクト指向言語である

Zeroは、オブジェクト指向言語です。

当然クラスやインタフェース、継承という概念を持ち合わせていますが、詳細については言語仕様の方で書くのでこちらでは割愛します。

バイトコードは出力しない

Javaなんかだとコンパイルした場合、クラスファイルが出力されます。

が、これうっとおしくないですか?

ということで、Zeroはバイトコードをメモリ上に持ちます

つまり、バイトコードが出力されないので、変な訳の分からないファイルは吐き出されないのです。

素敵。

これはGo言語と同じですね。
コンパイルはしてもファイルは出力しないという思想。

拡張子は「ze」

拡張子は悩みましたが、「ze」にしました。

最初は「zero」にしようかなとも考えましたが、長いのでやめました。

個人的には、世の中にある全拡張子と被らなければいいやと思っていたので、気を付けたのはそこだけでしたね。

どうでもいいですけど、「ze」って何かカッコよくないですか?

バイトコードは仮想マシン「ZVM」が実行する

JavaだとJVMという仮想マシンが存在します。

それと同じで、Zeroにもバイトコードを実行するZVMが存在します

ZVMは、「Zero Virtual Machine」の略です。

Zeroの言語仕様

さて、ここからはZeroの詳細な言語仕様をお話しします。

各説明箇所にサンプルのソースコードも載せておきます。

変数名などは「hoge」「foo」「bar」を使用しています。特に意味がないので。

規則

予約語

Zeroには予約語があります。

以下に記載の予約語は変数名などに使用することはできません。

abstract boolean break case catch class const constructor continue default delegate do double else elsif enum false final finally for foreach if instanceof int interface native_pointer new null override private public rename require return string super switch this throw throws true try virtual void while

識別子

これも一般的なプログラミング言語と基本的には同じです。

  • 最初の1文字目は、英字もしくはアンダーバー(_)であること。
  • 2文字目以降は、英字・数字・アンダーバー(_)であること。
ちなみに、識別子とは「変数名」「関数名」「クラス名」などです。

ホワイトスペース

Zeroのホワイトスペースは、「空白」「タブ」「改行」です。

上記3つは識別子の区切り文字以上の機能を持ちません。

コメント

コメントは、「/* */」「//」の2種類が使用可能です。

ここは今後変えていきたいと思っています。
個人的に、コメントの書き方にはある程度縛りが欲しいですね。
皆自由にかけるから統一感が失われていくわけなので。

基本的に、型の取り得る値の範囲は、ZVMがコンパイルされるC言語環境のものと一致します。

整数型(int)

整数型です。

実数型(double)

実数型です。

論理型(boolean)

論理型です。

値は「true」、もしくは「false」です。

文字列型(string)

文字列型です。

null代入可能であり、変更不可(immutable)です。

void型(void)

void型です。

特殊型で、関数の戻り値がない場合のみ使用可能です。

配列型

配列の要素数は宣言時に決定しなくても問題なしです。

要素数は動的に確保されます。

列挙型

列挙型です。

delegate型

delegate型は、関数の型定義を行うことで変数としての宣言が可能となります。

これに関してはサンプルを見るのが一番分かりやすいかと思います。

宣言文

宣言文とは、変数の宣言のことを指します。

 

変数宣言時には初期化子を設定できます。

 

final」を先頭に付与することで値の上書きが禁止されます。

 

const」を先頭に付与することで定数定義が可能となります。

初期化子によって型を決定するため、型の指定は不要です。

if文

波括弧({})は省略不可」です。

switch文

Zeroのswitch文は「break」を書く必要がありません。

あるcaseにマッチし処理が実行されたらswitch文を抜ける仕様です。

波括弧({})は省略不可」です。

while文

波括弧({})は省略不可」です。

do while文

波括弧({})は省略不可」です。

for文

try文

関数

上の関数が下の関数を呼べないということはありません。

クラス・インターフェース

クラス

ソースコードだけだと伝わりにくいので、日本語で構文規則を記載しておきます。

 

抽象クラス

子クラスは抽象クラスのみ継承をすることが可能です。

言い換えると、あらゆるクラスは抽象クラスしか継承できません

インターフェース

インターフェースはabstractメソッドしか記述できません。

その他

ファイル名

ファイル名は「スネークケース」とします。

ただし、スネークケースでないと動作しないというわけではなく、あくまでZero内での決まりです。

暗黙の型変換

型変換に関しては、以下の規則とします。

  • int型とdouble型の演算は、int型をdouble型に型変換して行う。
  • 文字列型に数字型を結合した場合、数字型を文字列型に型変換して結合する。

Zeroの使い方

Zeroの使い方は環境が整っているかどうかで変わります。

Windowsであれば、「gcc」「bison」「flex」などがPCにインストールされていないと使えません。

というのも、Zeroに対して上記のツールを実行することで、最終的に「zero.exe」が出力されます。

要はこれが、Zeroのソースコードを実行するための実行ファイルになります。

ということで、誰でも使えるように出力ファイル軒並み「develop」ブランチにプッシュしているので、「最終的な成果物を寄こせ!」という方は以下からダウンロードしてください。

Zeroの環境が整っていない方はこちら!

先ほどお話しした通り、PCに諸々インストールされていない方は「develop」ブランチからZeroをダウンロードしてください。

で、「powershell」を起動し、「compiler」フォルダで実行ファイルを実行します。

 

今回は「test」フォルダにある「test.ze」を実行してみました。

ソースコードが長いので、以下にアクセス!

 

実行すると、「test.ze」ファイル内のソースコードが実行されました。

Zeroの環境が整っている方はこちら!

Zeroを実行するための環境、というか以下の記事に記載のことを一通りやっている方ですね。

関連記事

さーーーて、今回から本格的に新プログラミング言語を作っていきます。 と言いたいところですが、まずはそのための下準備「環境構築」が必要です。 全体的に昔に作られたツールばっかりなので色々戸惑いそうですが、ささっとやっていきましょう[…]

独自プログラミング言語を作成する!~環境構築~【2】

 

環境が整っている方は「master」ブランチからZeroをダウンロードします。

 ・Zero

 

compiler」フォルダで、「make」コマンドを実行します。

実行が完了すると、「compiler」フォルダに「zero.exe」が出力されます。

あとの手順は環境が整っていない方と同じです。

MinGWのデフォルトは「mingw32-make.exe」なんですが、これを「gmake.exe」にしています。

Zeroのテストコード

↑にテストコードのサンプルがあります。

Zeroの色々

ソースコード管理

今更ですが、ソースコードは「GitHub」上で管理しています。

ブランチ 説明
master Zero本体
develop masterブランチの内容+outputファイル
※Zeroの全ファイルです。

 

また、masterブランチのみ「.gitignore」ファイルを配置しています。

理由としては、「出力されたファイルをGit管理対象外としたい」ためです。

Zeroのライセンスについて

あとで書きますが、基本コピペしてもらってOKです。
Zero」っていう名前だけ変えて、新しい言語作ったで!って声を高らかに言ってもらってもOKです。
もちろん、僕への許可も何もかも必要ありません。
できれば、「Zero」っていう名前だけは被るからやめてね。。

今後やりたいこと

どちらかというと、これが一番やりたかったことでもあります。

Zeroに関連したやりたいこと

  • Zeroのインストーラを作る
  • Zero用のVSCode拡張プラグイン(シンタックスハイライト)を作る
  • Wikipediaに載せたい
  • Dockerイメージ作成(DockerHubで公開)
  • Zeroのマスコットキャラみたいなの作る(Go言語みたいに)

Zero内部に対してやりたいこと

  • makeコマンド実行時に表示されるコンソールのワーニング的なものを消したい
  • UTF8対応
  • コーディング規約
  • .editorconfigを適用
  • コメントの書き方をもう少し考えたい
  • 言語仕様をもう少し詳しく書く(もっと良い言語にならないか検討)
  • テストをもっといい感じに自動化したい(でないとリファクタリングがやりにくい)
  • outputファイルの削除シェルを作る
  • エラー一覧を作る(コンパイルエラーなど)

言語デザインについて

おまけみたいなものですが、言語デザインについて色々とグダグダ考えたので、そこら辺も本記事に集約しちゃいます。

ちなみに、ここでお話しする内容はあくまで僕の考えなので、強いツッコミは入れないでください。凹みます。

新プログラミング言語の命名について

新プログラミング言語の名称を「Zero」にした理由は先ほどお話しした通りですが、実は英字の「大文字小文字問題」はぼちぼち悩みました。

つまりは、「ZERO」なのか、「Zero」なのか、「zero」なのか、ってことですね。

個人的に「zero」はダサいので却下として、「ZERO」と「Zero」は結構悩みました。

例えば、PHPは全部大文字で、Pythonは先頭だけ大文字、Rubyも先頭だけ、でもCOBOLは全部大文字。。

こうなってくると、「自分の好きな言語に倣うべきだ!」ってことで「Java」に倣って「Zero」にしました。

あとは、「ZERO」ってちょっと堅苦しいですよね。。それだけ。。

ちなみに、これを考えた後にGitのリポジトリを切ったんですが、「ZERO」になっているのに途中まで気付きませんでした。
まあそんなもんです。

ファイル名について

ファイル名の規則は、正直何だろうとZero自体は動くのですが、これも色々考えました。

元々「Hoge.ze」みたいにパスカルケースにしようと考えていたのですが、スネークケースを見慣れているせいか、なんかしっくりこない。。

ちなみに、パスカルケースにしようと考えていた理由としては、ファイル名がスネークケースよりも短くなるからです。

ただ、まあしっくりこないってことで、Zeroはファイル名を「スネークケース」にすることとしました。

あくまでZero内のルールなだけで、スネークケースじゃないといけないというわけではありません。

ファイルの拡張子について

Zeroの拡張子は「ze」です。

元々「zero」とかにもしようと考えていたのですが、最終的に「ze」に落ち着きました。

大前提、世の中にある拡張子と被らないことが基本ですが、それを考慮すれば、後は極力拡張子を含むファイル名は短い方が良いという考えです。

個人的に、ファイル名が長くなることでメリットがあるとは思えないので、極力短くしました。

また、短くするとしても「zr」「zo」の選択肢はあったのですが、なんか見た目がダサいってことで却下しました

ということで「ze」にしたのですが、「zero」にするか渋っていたのには理由があってですね。。

Groovyっていう言語の拡張子が「groovy」っていうメッサ長い拡張子なんですよね。

きもっ」て思いつつも、「世の中にこういう長い拡張子があるのなら考えるべきだな」ということでグダグダ考えてたわけです。

まあ結果的に「zero」にはしなかったわけですが。。

「elseif」なのか「elsif」なのか「elif」なのか問題

if文を使う際に用いる「else if」ですが、これは言語によって書き方が様々です。

Zeroでは「elsif」を採用していますが、これには理由があります。

というよりは消去法ですが、他の文法を採用しなかったのは以下の理由からです。

  • elseif:長い
  • elif:短くて良いが、普通に発音すると「エルイフ」になってしまう。

「try catch」か「begin rescue」か

例外処理の文法として多いのは「try catch」です。

ただ、Rubyは「begin rescue」です。

Matzさん的には、tryというのは「やってみよう」という意味合いが強く、そもそもエラーが発生しないコードはないという立場で、「やってみようはおかしくない?」ということから「try catch」を採用していないそう。

僕も「try」に関しては違和感を持っていますが、エラーの補足と言う意味だと「rescue」よりも「catch」の方が好きです。

こうなると、「begin catchか?」とも思いましたが、変に文法を変えるとこれはこれで違和感がすごいので、Zeroでは「try catch」のままにしています。

rescueって「救援する」っていう意味らしいですね。
個人的には救援しているわけではなくて、あくまでエラーが投げられて「捕まえた!!」みたいなイメージなのでcatchが好きです。

「def」について

Python・Rubyには「def」があります。

関数の定義をする際に記載しますが、僕はこれが好きではありません。

Javaとかだと「def」は記載不要ですが、関数名の後ろに「()」が付いていれば大体関数(というかメソッド)というのは分かります。

ま、それはさておき一番嫌いな理由としては、defの意味が「define:定義する」という点です。

関数を定義する」ではなく「定義する」なんです。

defの意味が「定義する」なので、defを付けても「それって関数を定義するっていう意味合いになるの?」と疑問に思っちゃうわけです。

まあ分かるんですけどね、分かるんですよ、でもこういうのをネチネチ考えるのが楽しいんですよね。

「end」について

Rubyは構文の終わりに「end」を書きますし、Excel VBAなんかだと「End If」とかを書いたりします。

個人的にはこういうのは好きではないのですが、その理由は以下です。

  • 「end」がない言語もあり、かつ違和感を抱かないということは、「end」を書かなくても終了していることは認識できていると判断できるため。もちろん構文全体のバランスは重要。
  • 書くのが面倒。。

多重継承という考え方について

C++を触っていて、嫌いですが面白いと思ったのが「多重継承」です。

Javaとかは「多重継承禁止」、というより大体他の言語も禁止ですが、実際に多重継承をやってみて分かったことがあります。

それは、「やっぱ多重継承あきまへん」ってことです。

正直、何が何やら分からなくなってきます。

個人で何かを開発するならまだいいですが、業務だと基本チームで開発をするわけで、そうなると多分皆好き勝手継承やっちゃいまボンビーだと思います。

例えば、目の前に欲しい機能を持っていたクラスが転がっていたら継承できちゃうわけですよ?

そりゃやっちゃうわって感じですよね。

皆楽したいですからね~。

でもそれがいいかと言われたら、ダメだよね~。

ってことで、「Zeroは多重継承禁止」です。

もっと言うと、「Zeroは抽象クラスしか継承できない」言語です。

以上です。

関連記事

C++は禁じ手である多重継承ができます。 他言語は基本的に多重継承を禁止しています(厳密にはインタフェースを使うことで可能)。 禁止している理由としては、単純にカオスになるからです。 ちなみに僕は元々Java屋さんというこ[…]

多重継承
関連記事

前回、多重継承に関する記事を書きました。 [sitecard subtitle=前回記事 url=https://traveler0401.com/cc-multiple-inheritance/ target=blank] […]

ダイヤモンド継承

継承は「extends」か「:」か問題

Javaは「extends」ですよね。

C++は「:」ですよね。

最初C++の構文を見た時は違和感が凄かったのですが、これ圧倒的に書くの楽なんですよね。。

ってことで、Zeroではクラスの継承を「:」で表現します

Pythonという言語の良さの違和感

Pythonって面白いですよね。

まあそんなにゴリゴリ触ったことはないんですが、ライブラリが豊富なので分析などにはもってこいですよね。

で、よくPythonの良さを聞いてみたりすると、大体「ライブラリが豊富」という答えが返ってきます。

前から思ってたんですが、これ変ですよね?

それはPythonの良さっていうんですかね?

ライブラリが多ければ素晴らしいっていうのはライブラリが少なければクソ雑魚ってことになります。

僕個人としてはそういうことを聞いているのではなくて、「Pythonというプログラミング言語の良さは何ですか?」って聞いてるんですけどね。

例えば、「インデントでブロックを表現するんやで!!」とかなら納得できます。

そう、つまり、ただの愚痴です。

まあ、「ライブラリの豊富さも言語の良さ」、と解釈はできますが、なんかいつも気になるんです。。

ちなみに、僕はPython嫌いなわけではないです。
どちらかと言うと、データ分析とかに1ミリも興味がないって感じです!
ちゃっす!

Pythonのインデントについて

Pythonではインデントでブロックを表現します。

 

Javaではこうなります。

 

どちらかがすごい嫌いとかいう気持ちはないのですが、個人的にはJavaの方が好きです

なぜかというと、以下でも動作するからです。

 

インデントでブロックを表現しない(括弧で表現する)言語は、括弧内がどう崩れても動作は変わりません(ソースコードが汚くなるだけ)

ただ、Pythonだとそういうわけにはいきません。

まあ、「そこらへんを制限しているからのPythonだ!」とも取れますが、インデントってうっかり変えちゃうことも稀にあると思います(ないか。。)

そうなった時に、ソースコードとして動作しなくなるのはどうもしっくりこないんですよね。

なので、ZeroでもJavaのように括弧でブロックを表現します

と言いつつ、インデントで表現するのは案外好きです。

インデントで表現するということは、Javaみたいに「書く人によってインデントがばらばら」みたいな事態を極力防げますし、ソースコード全体の統一感が生まれます。

ただそれを採用しなかったのは、僕に気力がなかったこともありますし、Javaが好きというのもありますし、正味どうやったらいいのか分からなかったというのもあります。。

自由度の高い言語について

最近は自由度の高い言語が流行っているように思います。

Python, Rubyなど、一般的に自由度が高いと言われている言語を僕はあまり好きではありません

この自由度というのは、「やれることの豊富さ」「文法としての書き方の豊富さ」など、色々あると思います。

自由度の高さだけ見ると良いことのように思えますし、僕も素晴らしいことだと思います。

では、「それを人間がちゃんと使いこなせているのか?」と言われれば、Noではないでしょうか?

自由度の高い素晴らしいアイテムを与えられても、人間がそれを正しく使いこなせないと意味がありません。

そもそも、「なぜ人間が正しく使いこなせないのか?」と言うと、皆が皆勉強しているとは限らないからですよね。

結果的に、チームで開発をしているのに自由度が高いゆえに、記載粒度はバラバラみたいなことになってクソみたいなすばらしいシステムの出来上がりです。

ってことで、Zeroの今の言語仕様はさておき、今後はどんどん自由を縛っていこうと思いますww

ちなみに、今まで色んなプロジェクトに参画してきましたが、「綺麗なソースコードでできたシステムやな~」と思ったことは一度もありません。
まあ、そんなもんですし、かくいう僕も綺麗には書けません。。

まとめ

新しいプログラミング言語を作るのは何より楽しいです

ただ、作ったところで日の目を浴びないのは確実です。

でも、「エンジニアなら作りたいときに作りたいものを作る」、それが何より大事だと思います。

プログラミング言語を作るのなんて正味ただの自己満足ですが、自分が楽しけりゃいいんじゃないですかね。

あと、なんやかんやで言語デザインをグダグダ考えるのは楽しいですよ。

今流行りの言語が「なぜそういう構文なのか?」を考えるだけでも十分楽しいですし、それを楽しいと思えるならとっとと言語作っちゃいましょう。

Zeroパクっちゃいましょう!

 

さて、次は何をやろうかな。

きも男
じゃあな
独自プログラミング言語「Zero」
フォローしてもらえると泣いて喜びます