デファクトスタンダードでフリーなバーチャルマシンの必要性

まぁ、私が必要としているというだけのことですが(笑)…

バーチャルマシンというと、Java VMが思い浮かびますが、あれはSUNからOracleに権利が移っているようで、どうも…という…

で、オープンソース界隈ではエイプリールフールねただったPerl6のParrotがどうにかなるのかなとおもったら、それほど話を聞かないし…

ここで大切なのは、JITコンパイラが各種CPUに対して、すでに存在するというのが非常に重要です。

(そういうのが出てくれば、Emacsのバイトコードもそれになるでしょうから高速化されますね…)

で、LLVMがそういうやつなのかなという感じがしていますが、どうなんでしょう…

とは言え、Lisp to C translatorで、型推論とかするコードはターゲットをLLVMのビットコードとしても、意味を持つのでまぁ、時代の流れに合わせます…

私はノイマン型コンピュータをバーチャルマシンとしてソフトウェア的に抽象化することに賛成です。

LispからCへのトランスレート

Lisp, Ruby, Pythonなどのダイナミックな型の言語をCへトランスレートするときに実行速度を気にするなら、いかに型推論をうまくやるかがキモだと思われます。

で、私は型推論に関してはまったくの初心者です(笑)

数十年前にMLかHaskellのチュートリアルをネットで読んで、これはいいものだなと思いました。

当時から思っていたことは、

「人間がコーディング中に考えて、型を特定してオプティマイズできるということは、そういう判断基準がこの世に存在するということ(あとはそれをコードにすればいいだけ)」

です。(そういう判断をするコードは計算量のオーダーが…という意見には、ゲリラ的に解決します!と答えます…)

で、そういうLisp to C translatorを書けたら私は成仏するんだと思います(笑)

KISSのILOS実装は決定打までやるか?

ISLispのオブジェクトシステムILOSのオブジェクトのスロットをC言語のレベルでの構造体のメンバーにじかにするとO(C)レベルでのアクセスが可能ですが、ILOSは制限付き多重継承を許しているので、その前のスロット位置の計算にまたでかいO(C)レベルの計算量(ハッシュテーブル? シンボルに書き込む?)がたぶん必要になります。

………スロットはplistでいいだろ……(どうしようかな…)

———————————-
午後に気が付いたんですが、C言語へのトランスレートを視野にいれると、トランスレート時にスロットの位置は確定しますね… ILOSはCommon LispのCLOSとちがってクラスの動的な再定義はなしです。

多重継承を許しているC++がコンパイル時にそういうことやってるんだから当然ですね…勘が鈍っている…

———————————-
翌日ですけど、そういえば、C++のメソッドにはvtableがあってとか少しずつふわっと思い出してきました。

KISS is not dead

また、まったりとISLisp処理系KISSの開発をはじめるかなと思っています。

とりあえず、ILOSの実装をplistからちゃんとしたC言語レベルでの構造体にしようと思っています。まぁ、実行速度的にどれほど意味があるのかわからないんですが、美意識ですね、なんちゃって…

私はのめりこみやすい分、さめると一向に集中できなくなるので雑念が入らないようにしながらゆっくり楽しみながらやろうと思っています。

ISLispHyperDraftのタグ付けがだいたい終わりました

ISLispHyperDraftとは、プログラミング言語Lispの国際規格であるISLispの規格草案をHTML化したものです。

作業を始めてから、みなさんからのサポートや助言をいただきながら、すべての章のタグ付けが終わりました。いろいろとお世話様でした。

これからも、手を入れていく予定ですが、最初に私が望んだ見た目にはなったので、とりあえずは一段落したという感じです。

github.ioで閲覧できます。(リポジトリ)

それではみなさんハッピー・ハッキング!


ISLispHyperDraft is an html version of ISLisp specification draft.

ISLisp is a programming language Lisp standardized by ISO.

Almost all the tagging is done now.

I still intend to touch up here and there but for the time being, this is it.

You can browse it at github.io. (the repository is here)

Happy hacking!




2017年9月 ISLisp処理系KISS開発進捗状況

みなさん、おはようございます。

ISLisp処理系KISSですが、最近けっこう集中的に開発をしていて、色々な進展がありました。

・GC可能な全Lispオブジェクト構造体に、以前はポインタ2つ分のメンバを使っていたんですが、いまはGC用ポインタ1つだけにしました。GCで使うフラグはこのポインタ内の1ビットを使うようにしました。

・Lispオブジェクトを指し示すポインタ内部にいわゆるFixnumとFixcharを詰め込みました。これにより、普通の整数や文字の生成ではヒープからメモリ確保しなくてよくなりました。

・GNU MP数学ライブラリを使うことで、いわゆるBignumが使えるようになりました。

・rlwrapというGNU Readlineライブラリのラッパーコマンドを教えていただいたおかげで、コマンドラインでカッコの入力がやりやすくなりました。対応するカッコがブリンクするんですね。(./kis)

・C言語のinline関数を使い始めました。リスト操作系のほとんどすべての関数をインライン関数としてヘッダファイルkiss.hに移しました。

・C言語でのLisp用関数の実装で、使い捨てのLispオブジェクトは、できるだけconsしないように、つまり、スタックにLispオブジェクトを確保するようにし始めました。

・hash-tableを実装して、Symbol管理に使い始めました。


今後の作業予定は…

・テストコードをもっと書く。

・オブジェクトシステム(ILOS)のデータ構造を良くする。クラス専用のC構造体の用意とか。ただスロットの継承関係の表現で依然としてスロットはリストで表現するのが分かりやすいと判断しました(午後追記、ベクタにするいい方法を思いついたのでベクタにします)。

・ジェネリックファンクションも良いデータ構造を用意する。引数のクラスによるメソッド呼び出し用キャッシュとか…

・インタープリタとしてISLispとしてほぼ納得できるものにしてから、Cへのトランスレータを書く。

それではみなさん、Happy Hacking!

あ、あとISLisp規格ドラフトのHTMLバージョンをいろいろいじっています。

 




Introducing hyperdraft.el

This package is an adaptation of Erik Naggum’s hyperspec.el to ISLisp.
Enter `M-x islisp-hyperdraft’ and the name of ISLisp items(functions, variables, etc).
Then the default web browser shows that part of ISLispHyperDraft (ISO ISLisp specification draft).

Happy Hacking

https://github.com/nenbutsu/islelisp




Almost finished general-array* implementation

Howdy guys!

I’m just finishing general-array* implementation of ISLisp processor KISS.

Also, I just started ISLispHyperDraft project. The point is, I want ISLisp equivalent of Lispworks’ Common Lisp HyperSpec . The current state is you can view the draft but it lacks hyper links.

Visit my github

 




Started to give it a try to write ISLisp to C translator

2017/04/09

I just started to write a ISLisp to C translator.

I’ve read the source code of Kyoto Common Lisp (currently known as Gnu Common Lisp (GCL, not Gnu CLisp)) before, which uses a C compiler on the fly. So I knew that’s possible.

My goal is to write portable code.

And another project is to link with the Gnu MP library (the GNU multiple precision arithmetic library).

By the way, I’m using  the BoehmDemersWeiser conservative garbage collector.

Happy hacking!

Download the latest kiss (the translator has not been included yet.)

 

ISLisp processor KISS

KISS is aimed to be a conforming ISLisp processor.
The development is at the initial stage.

The current KISS is an interpreter written in C and ISLisp.

The rep loop is already running.

The object system and generic functions are working, too.

The license of this software is GPL. See gpl.txt in the zip file.

Download the latest version of kiss.zip .

Any comments are welcome.
I read English and Japanese.

ISLisp処理系KISS配布所

ここにリンクを貼っときます。最新版ですね。
ブログを更新しなくてもその時点での最新版を置いておきます。

 

最終的にはKyoto Common Lispに敬意を表して、Cへのトランスレータを書きたいと思っています。ただし十年二十年単位での話です(そんなに生きるつもりかよというのはなしで(笑))。飽きたら放置に入るのはご容赦ください。

でですよ、Cへのトランスレータが仮にできたとしたら、いまLispで実装していることに速度的な意味が生じますね。Cのような仮想アセンブラより抽象化がすすんだLispで書いたほうが読みやすいのはだれでも納得していただけると思います。で、速度的にトランスレータでCになれるんならより抽象度の高いLispで書いたほうがいいんですね。

2017/04/05: ライセンスをGPLにしてstring.cとstring.lispで作業をしました。
2017/04/04: いまは number.c と number.lisp を書いてます。

お気楽プログラミング再開しました

4年くらい前に書いていたkissという名前のなんちゃってISLisp言語処理系をクラウドストレージから掘り出して、またいじりはじめました。

インタープリタとしてC言語で実装してありますね。setjmpなんかでLispのコントロール構造を実装してあります。

で、C言語なんですが、読めば一応わかりますが、重箱の隅は忘れているので、誉れ高いC言語のバイブルK&Rをネットで無料で調達して、リファレンスマニュアルをざっと確認しました。

いやー、いいですねプログラミングは…。

msys2をインストールして、gcc *.c でコンパイルしようとしたら、ワーニンングがたくさんでました。wchar_t関係ですね。で、頭にきたので全部charに変更して動くようにしました。昔ながらのstrcmpなんかが変な名前の関数使わなきゃいけないんでヤだったんですよね。

ただ楽しみのためだけにプログラミングすることにしました。

で、すでに偉そうにオブジェクトシステムとかジェネリックファンクションなんかも実装してあるので(そこで力尽きたみたいです)、ベクタとか残りを実装して、ノリでISOから規格書(約2万円!)もそのうち買って、規格準拠の処理系ですなんてすました顔して公開してみたいなと思っています。

 

ISLispインタープリタをC言語とISLispで実装する、その後2

Sketchyな実装ではあるもののオブジェクトシステム、ジェネリックファンクション、コンディションシステムの実装を終えました。私事ですこし開発が遅れていますが山場はこえたのでどうやらこれは形になったものを世間に公開できそうな雰囲気。

まぁ、締め切りがあるわけではないのでゆっくり行くつもりです。

とりあえず、現状をkiss-2012-09-12.zipとして公開しときます。gcc *.cでコンパイルして./a.exeで走るはずです。



ISLispインタープリタをC言語とISLispで書く、その後

自分用の書きなぐりではありましたが、読んでくださる方がいたので翌日朝(2012年8月22日)若干修正。

以前、失敗したにもかかわらず、自分(俺様)仕様LispのインタープリタをCで書いていました。しかし、結局ISLispからObject Orientedな部分とGeneric funcitonを除いたものに毛が生えた程度になってしまいあまりにも簡単すぎたので、それならとISLisp準拠を目指そうと書き直しています。

目的は、まず、自分にもISLisp処理系が書けた!ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイという感情を味わうこと。基本方針はKISS(Keep It Simple and Stupid)決してKeep It Short and Simpleとは言いません。バカなほど愚直な実装しか自分には書けないだろうと見積もったわけです。

デザイン指針は、まずC言語で小さなISLispの機能縮小版インタープリタを書きます。そこからISLispで書いた本格的なISLisp処理系を立ち上げ時にロードするというものです。”ISLispで書いた”と言いましたが実際は機能縮小版で実装されている部分と徐々にロードされていくISLispで書いた機能を使ってしか書けないわけです。だがいかにも自由にISLispでISLispを実装しているかのように書くのがミソというわけです。

そして実行速度は無視。インタープリタとしての機能を実現するコードの簡潔さと読みやすさを重視します。fixnumとポインタでビットを立てて区別とかのテクニックは使いません。bignumも最初はなしで必要になったらGNU MP libraryを使います 。ガベージコレクタは最初はつけずに開発します。いずれ必要になればBoehm-Demers-Weiser garbage collectorを使用することにします。

現在のCで書いた縮小機能版は、バッククオートなどもサポートしたread関数、適当に書いたformat-object関数、eval関数などです。つまりrepループは動いています。
ストリームもC言語ライブラリのストリームへの薄いラッパーとして実装しました(stream-ready-pが実装できない危険性あり)。コントロール系スペシャルオペレータのif、Non local exitのunwind-protect、catch、 throw、 tagbody、 go、 block、 return-fromなどもCで記述しました。簡単なerror関数。あとISLispで書いたファイルをロードしてISLisp処理系として立ち上げるためのload関数など。

ISLispで書いたファイルはbuilt_in_classes.lisp、class.lisp、cons.lisp、control.lisp、error.lisp、
format_object.lisp、generic_function.lisp。

class.lispはdefclassを定義しています。このdefclassはメタクラス指定が<built-in-class>のクラス定義だけ動くようになっています。まだメタクラスが<standard-class>のものは受け付けません。

built_in_classes.lispは<built-in-class>をメタクラスにもつ<cons>, <vector>などのクラスの継承関係をdefclass文を使って記述しています。

generic_function.lispは現在書きかけです。Generic Functionは以前、Cで実装したことがあるので実装する自信はありますがなぜかここでやる気が途切れて放置しています。

generic functionは<standard-class>のクラスが定義できないdefclassのままでもテストできるので、次の実装目標となりました。(<sequece>, <string>, <cons>などのビルトインクラスのオブジェクトをテストには使います。)

Standard Class、Generic FunctionとCondition Systemが書けたらもうあとは考える必要がないような部分になります。果たしてこの山を越えられるのかまた挫折するのか。Condition Systemは一回、Common Lispで書いたことがあるのでできるはずなんですが忘れています。クロージャとダイナミック変数を使って実装したような…。



LispインタープリタをC言語で実装

Lisp In Small Piecesは内容が難しくて理解するのを断念。

すこしLisp界の現状をGoogleで調べたらISOで標準化されたISLispというのを見つけた。
規格の規模がCommon Lispよりもだいぶ小ぶりなのでこれを参考にインタープリタを
実装してみることにした。

簡単なread, eval, print ループを実装して、generic functionを実装してオブジェクトシステム
のインスタンス生成を実装しようと思っていたところでC言語で実装されたLisp関数の
呼び出し方、詳しくは引数の受け渡し形がよくないことがわかって書き直している。

最終的にはC言語へのトランスレータを書いてみたいが、ECLがCommon Lispで
CLOSサポート、スレッドサポート、Unicode対応などいい仕事をしているようなので
完成したとしても一般的な受けはあまり期待できなそう。