ITエンジニアのブログ

IT企業でエンジニアやってる人間の日常について

自作プログラミング言語

プログラミング言語を作る。第14回:グローバル変数

プログラミング言語の開発について考えていたのですが、関数の部分適用など、いきなり実装するには難しい概念があるので、まずはC言語に似たプログラミング言語を作って概形を把握したいと思います。今回はグローバル変数について調査していました。普段はで…

プログラミング言語を作る。第13回:関数と型推論

関数型の要素を静的型付けの言語の仕様に持ち込むならば、やはり型推論は欲しいところです。ただし、言語の仕様によっては、型推論は関数定義などを行うときにかなりややこしいことになる可能性があります。例えば、簡潔で強力な型推論の例として、 OCaml の…

プログラミング言語を作る。第12回:関数適用とメソッドチェーン

今、二つの数値を受け取り、その和を返す関数 add があるとします。多くの関数型言語で用いられる関数適用は、次のような形を指定します。 add 1 2exp を式として、 exp exp という形です。他方で、手続き型やオブジェクト指向型の言語での関数適用は、次の…

プログラミング言語を作る。第11回:カリー化と部分適用

言語仕様の詳細を練っていきます。関数型言語では、カリー化や関数の部分適用が可能な言語が多くなっています。カリー化によって、関数の引数を一つずつ与えられるようになり、関数を部分的に適用することができるようになります。例えば、 add x y = x + y…

プログラミング言語を作る。第10回:グローバル変数

第8,9回において、C言語と似た文法の言語を用い、型検査や3アドレスコードへの変換などを行ってきました。そろそろ独自言語の文法を考案し、それを主体として細かな設定について考えていきます。 例えば、次のような入力を与えるとします。大体想像つくと思…

プログラミング言語を作る。第9回:型検査

第8回で計算式の平坦化を行いましたが、それは全て Int 型を想定して行っていました。拡張として、複数の型を導入して、型検査を実行してみようと思います。例えば、プラスの記号の両側には同じ型の値が与えられ、それらと同じ型の値を返すというように決め…

プログラミング言語を作る。第8回:計算式の平坦化

そういえばドラゴン本を買いました。これを参考にしてコンパイラ制作を加速させます。第5回で字句解析と構文解析を行いました。四則演算や関数適用などの簡易的な入力に対し、それを構文解析して抽象構文木を出力しましたが、今度はそれを変換します。例えば…

プログラミング言語を作る。第7回:LLVM入門

LLVM を用いて FizzBuzz を書きました。色々と躓いた点があったので、それを記述しておきます。まずはプログラム本体から @s1 = constant [10 x i8] c"FizzBuzz\0A\00" @s2 = constant [6 x i8] c"Buzz\0A\00" @s3 = constant [6 x i8] c"Fizz\0A\00" @s4 = …

プログラミング言語を作る。第6回:LLVM入門

引き続いて LLVM を勉強します。今回は、 FizzBuzz のC言語プログラムを LLVM に変換して、その内容を確認してみようと思います。C言語の FizzBuzz プログラムです。 #include <stdio.h> int main(void){ int i; for(i = 1; i <= 100; i++){ if(i % 15 == 0){ printf(</stdio.h>…

プログラミング言語を作る。第5回:字句解析と構文解析

LLVM の勉強と平行して、コンパイラについて勉強します。コンパイラは、プログラムの入力から中間コード生成までの間に、字句解析と構文解析の作業を行います。ただの文字列からトークン列、構文木というように変換していきます。字句解析と構文解析はプログ…

プログラミング言語を作る。第4回:LLVM入門

第2,3回で x_86-64 のアセンブリに手を出してみましたが、プログラムをいきなりアセンブリに変換するのは困難です。普通は中間コードを経てアセンブリ、機械語に変換されます。色々調べてみると LLVM というものがあってそれ用の中間コードを作ると、あとの…

プログラミング言語を作る。第3回:x86-64アセンブリ

前回は Hello, world! を出力させる x86-64 アセンブリを書いたので、一段階レベルを上げて、数字を出力させてみます。 アセンブリでは、C言語みたく printf("%d", n) のような一発で数値を出力する機構は存在しません。数値を文字列に変換しなければ出力で…

プログラミング言語を作る。第2回:x86-64アセンブリ

コンパイラを作るには、手順としては最初にする必要は無いでしょうが、アセンブリの事を分かっていないとあまりイメージが湧きにくい気がします。 そのようなわけで、まずはアセンブリプログラミングをしてみようと思います。 私が使っている多くのパソコン…

プログラミング言語を作る。第1回:構想

新しいプログラミング言語のコンパイラを作りたいと思ってなかなか行動に移していなかったのですが、社会人になることですし、そろそろ開発をしていきたいと思います。 最初から道筋が決まっていてそれを解説するのではなく、作りながら試行錯誤を繰り返して…