レガシーコード生産ガイド

私に教えられることなら

forth

「標準FORTH」を読みました

やたらと古本価格が高かったり、中身が濃いという噂で一部のマニアに知られている標準FORTHをようやく読みました。 標準 FORTH作者: 井上外志雄出版社/メーカー: 共立出版発売日: 1985/07メディア: 単行本この商品を含むブログ (1件) を見る 1章で軽い紹介、…

Forthで多目的カッコ

Forthでメタプログラミングを行う際にちょっと面倒な点として、本当は次のように書きたいんだけど list { 1 2 3 } class Point { var: x var: y :m get-x ( -- x ) x @ ; :m set-x ( x -- ) x ! ; } 全てがワードなので、次のように「どの構造の終了なのか」…

Forthの使用例 / 名前について / Closureについて

Forthの使用例 ForthHubというコミュニティから招待が来ていたので入ってみた。(enthusiastってほどでもないけど……) その中でForthのUse Caseについての質問があって、面白いものがいくつか挙げられていたので、何を作っているかより、コーディングスタイル…

ForthでMarkCompactGC

VMに手を入れず、ForthのみでMarkCompactGCをやろうと思い立った。多分できました。 github.com まだ全然使うことを想定して作っていません。あくまでも「できるものなんだな」程度に見て下さい。ここからバグ潰して整備するのはとても苦労しそう。 gforth-0…

Glypher - Windows,Forth,FASM

FASM(flat assembler)の練習にForthを書いていて、マクロの書き方がわからないので探していたら見つけた github.com FASMで書かれた、Windows用のゲーム作成用Forthっぽい。 Charles Childers氏(Retroの作者)のリポジトリだけど、作者は別の人で、RetroForth…

Synstackプロジェクトの紹介

Karsten Schmidt氏のプロジェクトが正式に公開された hackaday.io "Polyphonic, stack based synth & livecoding environment for STM32"ということで、Forth/StackVMでベアメタルからシンセやシーケンサを作る、まさにこれやりたい!!というプロジェクトな…

作業記録

RFR64で末尾呼び出し最適化 サブルーチンスレッディングで作ったRFR64だけど、せっかく最適化をいろいろ試すためにサブルーチンスレッディングを選んだので、そろそろ取り掛かってみることにした。 末尾呼び出し最適化自体についてはここらへんが詳しい http…

Forthの仕組み6 - 再帰、リターンスタック、インタラクティブ入力

前回 今回は、インタラクティブなコードの入力、リターンスタックの操作と再帰を追加していく。 サンプルコード 組み込みワード追加 必要なワードと、デバッグに便利なワードをいくつか追加する。 latest, latest! 辞書で最後に定義したワードのアドレスを取…

ForthでC関数ワード定義とSSEレジスタメモ

そろそろ全くわかってない浮動小数点数をどうにかしよう、と思い立って浮動小数点数スタックをRFR64に実装した。 前後するけど、その前にRFR64でもC関数をdlopen経由で使えるようにしていたので、浮動小数点数の表示をprintfに任せてみることにした。 C関数…

ForthでMark&Sweep GC書いた

前にも1度C言語で挑戦したんだけど、何かこう自分で何やってるのかよくわからん感があったので、メモリを直に触れるForthでMark&Sweep GCに挑戦し直した。 コード 設計 Forthの辞書構造を活かしたままGCをやるのは多少難しいというか、辞書全部を保守的にや…

Forthの仕組み5 - ループ

前回 今回は、前回に続きワードbranchと0branchを使い、Forth自身でループ用ワードを作っていく。 サンプルコード 比較ワードの追加 ループを作る前に、その終了条件の判定などに数値の比較を行うワードを実装する。 0が偽として、真をどの数値で返すかを考…

サブルーチン・スレッディングのForth処理系作った

RFR64 github.com Linux 64bit向け、アセンブリで書いたForthは2個目。 VFX ForthとSwiftForthめっちゃ速い - レガシーコード生産ガイドで、Disassembleするとどちらの処理系もサブルーチン・スレッディングを使ってるので気になってた。ので作った。MovingF…

64bit Linuxでアセンブリで書いたForthからC言語の関数を呼ぶ

ForthからSDLやAllegroを使って何かやりたいな、と思い立ったんだけど、基礎知識が無いので調べるのに苦労した。ので、記録しておく。 結論としては gccで-ldlフラグを追加し、dlopen/dlsymを使えるようにする スタックから各引数のレジスタにpopしてcallす…

NASM / Linux x86-64でForth開発日誌 その後

少し前までjonesforthをNASM/Linux/64bitに移植してて、開発日誌は一度完結ということにしたんだけど、その後いろいろ追加したり、考え方が変わったりしたので記録しておく。 追加したもの すべて組み込みワードとして追加してある。 CREATE & DOES> 用途が…

gforthでパイプ処理(と、Forthらしいコードの模索)

標準入力に何かしらフィルタをする方法を調べてみた。マニュアルを見ると、バッファを用意してバッファ 長さ stdin read-fileを繰り返してやればいいみたいだ。 read-fileはc-addr u1 wfileid -- u2 wiorというスタックエフェクトで、wiorが何の略かよくわか…

gforthで日本語文字列(UTF-8)を扱う

マニュアルを見ながら日本語をいろいろ操作してみたメモ。 Forthの文字列はアドレス バイト数の組なので、s" うたちゃん"などでUTF-8を読み込むと、1byteずつのデータとして認識される。 s" うたちゃん" .s <2> 13793104 15 ok ( UTF-8の日本語なので3バイト…

自作FORTHでカカシ班を呼ぶ(DOER / MAKE)

最近はThinking Forthを寝る前に読みつつ、たまにjf64に手を加えたりしてる。 毎日5分ぐらい読んではそのまま寝たりしながらも一応終盤まで目を通してて、ちょっと面白そうだったDOERとMAKEを実装してみた。自作処理系の命名規則を使ってdoer>とmake>にした…

Forthの仕組み - 制御構造if

前回 今回は、ワードbranchと0branchを使い、Forth自身で制御構造ifを作っていく。 サンプルコード 追加ネイティブワード まずいくつかのネイティブワードを追加する。また、今回からスタックエフェクトを説明に使う。 スタックエフェクトとは、ワードの実行…

Forthの仕組み - コンパイル

前回 今回は、ユーザがワードを定義できるように、コンパイル処理を作っていく。 サンプルコード Forthのコンパイルとは 前回までに見た通り、ForthのワードはCoreのみ、又はCore(docolon)+呼び出すワードのCFAの列、となっている。前者をネイティブワード、…

いろいろなForth処理系でのOOP比較

自作処理系の参考にするか、とても使いやすければいっそそれを使ってしまおう、という魂胆で、いろいろなForth処理系でのOOPの構文や使い方を調べてみた。 特に重視するのは Late Bindingができるか Polymorphismが違和感無く行えるか メッセージの送り方 オ…

Forthでユークリッドの互除法とローカル変数

早速The Art of Computer Programmingを読んでいて、アルゴリズムを試したくなったので自作のForth処理系jf64を使った。自分の庭というカンジで楽しい。 本題だけど、Forthでよくデメリットとして挙げられる(っぽい)のがスタックジャグリングの難しさと保守…

Forthの仕組み - 解釈実行

前回 サンプルコードはgithubリポジトリに置いてある。 documentation-forth/002.interpret at master · phaendal/documentation-forth · GitHub 今回は、ユーザーの入力を解釈して、ワードを実行する仕組みを説明してみる。 といっても、他の言語とは違い、…

VFX ForthとSwiftForthめっちゃ速い

Forthでハノイの塔 - sileのブログ を見てやたら速いので「ホントに??」と思って調べてみた、ら、VFX Forth - common featuresのコード生成見てビックリした。こんな最適化できるんだ。 で、NASM / Linux x86-64でForth開発日誌3 ベンチマーク - レガシー…

Forthの仕組み - ワード実行

(7/19 いくつかミスが見つかったので修正) いろいろForth処理系を作ってきて、 大分動作が頭に染みこんできたので、ここらへんで一度復習も兼ねて動作を解説してみる。 ForthやConcatenativeLanguageには本当にいろいろな作り方があるんだけど、 今回はjones…

NASM / Linux x86-64でForth開発日誌 完

phaendal/jf64 · GitHub 前回からの変更点 システムコール用のワード追加 それを使って簡単なファイル入出力を追加。File. example3で同じディレクトリのwrite-test.txtにhello!と書き出す。 あとちょっとしたユーティリティをいくつか まだまだいろいろ、例…

NASM / Linux x86-64でForth開発日誌4

mkforth4-jsで作ってたVocabularyとRegionに加えて、ワードをインライン展開ワードに変えるinline!を作ってみた。 といっても仕組みは単純で、対象ワードと同名のimmediateワードを作り、 コンパイルモードの場合は、対象ワードのdfaからreturnの前までを辞…

NASM / Linux x86-64でForth開発日誌3 ベンチマーク

Cog VM リリース記念: Squeak、Ruby、Python を恒例のフィボナッチベンチで戦わせてみる - Smalltalkのtは小文字ですを見てて、どれぐらいの速度が出るのか気になったので計ってみた。 (2016-03-05追記) なおこの記事でのForthは自作の処理系(最適化一切ナ…

NASM / Linux x86-64でForth開発日誌2

流石に土日を徹夜で潰すわけには…… →誘惑に勝てなかった Local Variable、Quotation、あとツールを作った。エスケープシーケンスで色つけて良かった、見た目が楽しいほうが楽しい。 残るはPrivateとVocabulary、Region。流石に仕事に支障が出るから今週は1日…

NASM / Linux x86-64でForth開発日誌

そろそろjonesforth名乗るのもな、というカンジになってきたのでとりあえず日記のタイトルを変えた。 いよいよ楽しい自己拡張タイムになったので、気づいたら今日一日中ひっきりなしに触ってた。今のところ、Forth処理系作ってて最も楽しいとこは、最初のワ…

NASM / Linux x86-64でjonesforthを移植してみる 5

コロン定義(コンパイル)までできた!これで一番重要なところは終わりかな? https://github.com/phaendal/jf64 $ ./forth : hoge 64 ; : hoge hoge emit ; : hoge hoge cr ; hoge @ bye $ 他にもLisp好きでjonesforthを64bitに移植した方がいる、という情報…

NASM / Linux x86-64でjonesforthを移植してみる 4

ようやく詰まってたところを突破して、ネイティブワードとDOCOLワードが動くようになった! https://github.com/phaendal/jf64 DOCOLワードが動かなかった原因は EXIT(return)の存在を忘れていた call後にjmp先のDOCOLでraxレジスタを使うんだけど、それを忘…

NASM / Linux x86-64でjonesforthを移植してみる 3

前回 phaendal/jf64 · GitHub ようやくワード名を入力して解釈実行するようになった。長かった…… 64bitだから8bit * 8で8byteでしょ!と安易にアライメントしてたんだけど、計算が合わなくて苦しんだ。動くようにはなったけど、どう間違ってたかまだわかって…

NASM / Linux x86-64でjonesforthを移植してみる 2

昨日の続き。 https://github.com/phaendal/jf64/ 1文字入力、1文字出力、トークンの読み取り、文字列の出力、などを実装して、以下のようにdefwordで命令列を定義して実行できるようになった。 defword "test", 4, 0, test ; @を出力する dq lit dq 60 dq l…

NASM / Linux x86-64でjonesforthを移植してみる 1

アセンブリの勉強どこから始めていいかわからないので、とりあえず動作を理解している(と思ってる)jonesforthのコードの移植を通じて、必要な知識を得ようとしてみる。 phaendal/jf64 · GitHub とりあえず今日は昨日書いたHelloWorldに、リターンスタックの…

Forthでごく簡単なRegion

mkforth4-jsではQuotationの実装を、RetroForthに倣って 1) 次の2を飛ばすジャンプ命令 2) ワードのアドレス列(ワード定義の本体部分) 3) 2のアドレスをスタックに置く としている。 これで一応高階関数みたいなことはできるんだけど、関数ポインタと同じよ…

JavaScriptで動くForth REPL/VMを作っている

うごく: http://phaendal.github.io/mkforth4-js/ リポジトリ: https://github.com/phaendal/mkforth4-js なんでVMか アセンブラで書かれた、それ自体がForth処理系作成入門の素晴らしいドキュメントになっているjonesforthというものを昔発見して、実装して…

ConcatenativeなFactor(Forth)ライク言語を作るのに挑戦しました

Forth + プロトタイプベースなFactor風言語を作りました - レガシーコード生産ガイドの記事のあと、様々なバグを発見して修正しているうちに、「これはよりプリミティブなものを作って基礎をしっかりさせたほうがいいのでは」と思い、純粋にクォーテーション…

Forth + プロトタイプベースなFactor風言語を作りました

JavaScriptで組みました。動作ページ 前書き エラー処理はまだないので、コンソールを開いて確認してください。 名前は未定です。(とりあえずPrototype + ForthでProtoForth) とりあえずの実験なので、何度か全体を書き直すと思います。 Factorを始めとした…