2016-01-01から1年間の記事一覧
PHP の json_decode を使って 自作の json ファイルを連想配列にしようとしていたのですが、何故か返り値が NULL になっていました。日本語が含まれていたからエンコーディングの問題かと思いましたが、そうではなく、オブジェクトや配列の最後の要素にカン…
簡易的にパスワードを設定したかったため、 .htaccess を設置したところ、変更が有効になりませんでした。 htaccess が機能しないことについて調べたところ、パーミッションやその他いろいろで .htaccess を変更しても動かず、 Apache 側で AllowOverride と…
div 要素に p を5つ追加したい時に var div = $("<div>"); var p = $("<p>"); for(var i = 0; i < 5; i++){ div.append(p); } とするとうまくいきませんでした。 var div = $("<div>"); var p; for(var i = 0; i < 5; i++){ p = $("<p>"); div.append(p); } とするとうまくい</p></div></p></div>…
span 属性の項目に大きさを付加してみました。 span.a{ width: 100px; height: 100px; } span.b{ width: 50px; height: 50px; } 実際に <span class="a"><span class="b"></span></span> として配置してみましたが、どちらも 0px になり大きさが設定できていません。原因は、 span はインライン属性の DOM …
プログラミング言語の開発について考えていたのですが、関数の部分適用など、いきなり実装するには難しい概念があるので、まずはC言語に似たプログラミング言語を作って概形を把握したいと思います。今回はグローバル変数について調査していました。普段はで…
社会人になりました。エンジニアとして働きます。これから、趣味のプログラミングや勉強に加え、音楽制作、イラスト描画に割ける時間が大幅に少なくなると思いますが、様子を見ながら頑張っていけたらと思います。
ハーマンミラーという店でアーロンチェアを買いました。定価は17万円近くでしたが、中古品をリニューアルして新品の部品と入れ替えたものが11万円で提供できるとの事だったので、それにしました。とても高価な買い物で、まだ社会人になっておらず所持金が厳…
github.com 自身のウェブサイトで各プログラムの GitHub 及び Bitbucket のリポジトリ内でのコード記述行数を掲載しているのですが、 Scheme の記述行数がかなり少なかったので、 Scheme で何か書こうと思いました。大学の講義で Scheme による Scheme イン…
最近、頑張って作曲をしています。まだ完成した曲はありませんが。まだ初心者なので当然ではあるのですが、音楽を作っていて、後で聞くと「全然ダメだ」って思うことが多いです。それで何回も作り直しをしています。今までの作曲手順は次のとおりです。 テー…
関数型の要素を静的型付けの言語の仕様に持ち込むならば、やはり型推論は欲しいところです。ただし、言語の仕様によっては、型推論は関数定義などを行うときにかなりややこしいことになる可能性があります。例えば、簡潔で強力な型推論の例として、 OCaml の…
今、二つの数値を受け取り、その和を返す関数 add があるとします。多くの関数型言語で用いられる関数適用は、次のような形を指定します。 add 1 2exp を式として、 exp exp という形です。他方で、手続き型やオブジェクト指向型の言語での関数適用は、次の…
言語仕様の詳細を練っていきます。関数型言語では、カリー化や関数の部分適用が可能な言語が多くなっています。カリー化によって、関数の引数を一つずつ与えられるようになり、関数を部分的に適用することができるようになります。例えば、 add x y = x + y…
第8,9回において、C言語と似た文法の言語を用い、型検査や3アドレスコードへの変換などを行ってきました。そろそろ独自言語の文法を考案し、それを主体として細かな設定について考えていきます。 例えば、次のような入力を与えるとします。大体想像つくと思…
第8回で計算式の平坦化を行いましたが、それは全て Int 型を想定して行っていました。拡張として、複数の型を導入して、型検査を実行してみようと思います。例えば、プラスの記号の両側には同じ型の値が与えられ、それらと同じ型の値を返すというように決め…
そういえばドラゴン本を買いました。これを参考にしてコンパイラ制作を加速させます。第5回で字句解析と構文解析を行いました。四則演算や関数適用などの簡易的な入力に対し、それを構文解析して抽象構文木を出力しましたが、今度はそれを変換します。例えば…
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 = …
引き続いて 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>…
LLVM の勉強と平行して、コンパイラについて勉強します。コンパイラは、プログラムの入力から中間コード生成までの間に、字句解析と構文解析の作業を行います。ただの文字列からトークン列、構文木というように変換していきます。字句解析と構文解析はプログ…
ある場において出発地点、目的地点、通過可能な場所が与えられた時、出発地点から目的地点までたどり着くことが可能かどうかを判定する到達可能問題を解こうと思います。問題を想定します。幅 width 高さ height の場が与えられ、出発地点と目的地点が与えら…
第2,3回で x_86-64 のアセンブリに手を出してみましたが、プログラムをいきなりアセンブリに変換するのは困難です。普通は中間コードを経てアセンブリ、機械語に変換されます。色々調べてみると LLVM というものがあってそれ用の中間コードを作ると、あとの…
C++ と OCaml でダイクストラ法の実装を行いました。 ダイクストラ法では、夫々の辺に負でない長さが与えられたグラフ上で、二つの頂点間の最短距離とそれを与える経路を求められます。まずグラフを用意します。 インターネット上でいい感じのグラフを見つけ…
自作言語を作っている途中ですが、様々な手法を学習するため、 MinCaml という言語のコンパイラを作りながら関数型プログラミング言語のコンパイラ作成の概形と内容について学びます。MinCaml というのは OCaml のサブセットのような言語で、検索するとわか…
Homebrew で LLVM をインストールしたのですが、 llc と入力しても command not found となり実行できなかったので解決策を書きます。Homebrew のインストール時に keg-only という出力がされているものは、普段使っている /usr/local/bin にインストールさ…
前回は Hello, world! を出力させる x86-64 アセンブリを書いたので、一段階レベルを上げて、数字を出力させてみます。 アセンブリでは、C言語みたく printf("%d", n) のような一発で数値を出力する機構は存在しません。数値を文字列に変換しなければ出力で…
コンパイラを作るには、手順としては最初にする必要は無いでしょうが、アセンブリの事を分かっていないとあまりイメージが湧きにくい気がします。 そのようなわけで、まずはアセンブリプログラミングをしてみようと思います。 私が使っている多くのパソコン…