独自言語「NLL」をmicro:bitに対応しました.

PCとmicro:bitをUSBケーブルで繋ぎ,端末エミュレータで接続するとNLLのプロンプトが出ます.

以下のことができます.ファイルシステム上にNLLのプログラムをいくつか保存しておいて,ロードして起動したり,テキストエディタで編集して実行したりができます.

micro:bitは標準の開発環境はブラウザ上でのプログラミングで,テキスト型言語だとMicroPythonが使えるようですが,それらとはまた違った「80年代のBASICっぽい感じの言語」でmicro:bitを制御できます.

  • micro:bitとPCをUSBシリアルケーブルで接続し,NLLでプログラミングして動かす
  • LED(5x5)へのグラフィック表示(グレースケール)や文字の表示
  • A/Bボタンの検知
  • 加速度センサ,磁気センサ,温度センサの値の取得
  • CPU温度の値の取得
  • GPIOの操作
  • サウンド
  • フラッシュROMをファイルシステムとして利用可能(ファイルサイズに上限あり)
  • ファイルシステムに設定保存
  • 起動時の実行ファイルを指定して,PC無しで起動して動作
  • USBシリアルケーブル経由でのPCとのファイルの送受信(XMODEM/YMODEM)
  • 簡易テキストエディタ(アプリケーション)

 

vectorにもあります.

 

 

大熱血!アセンブラ入門のアセンブラ出力環境のバージョンアップ版と,NLUXのバージョンアップ版を一気にリリースしました.

https://kozos.jp/books/asm/ →アセンブラ出力環境(gcc-11)
https://kozos.jp/nlux/download.html →2025/06/13版

これらは今まで別々のツールだったのですが,今回,これらが協調動作するようになりました.

まず,大熱血アセンブラのアセンブラ出力環境はgccベースになっていて,各種CPUアーキテクチャ向けのクロスコンパイラ(gcc)をビルドし,サンプルプログラムをクロスコンパイルすることで実行ファイルを生成したり,その実行ファイルをシミュレータ上で動作させたりすることができます.

またNLUXには,独自のCコンパイラ(NLCC)と独自の標準Cライブラリ(のサブセット)(nllibc)が含まれています.

で,今回のリリースでは,以下のようなことができるようになりました.(やりかたはNLUXのトップのREADME.txtの「クロスコンパイル」の章を参照)

  • 大熱血アセンブラの環境にNLCCを使ってアセンブリを生成できる.さらに実行ファイルを生成し,シミュレータで実行ができる.
  • 大熱血アセンブラの環境とNLCCを使って,nllibcをクロスビルドできる.(コンパイラにはNLCCを使うが、アセンブラやリンカには大熱血アセンブラの環境を使う)
  • そのクロスビルドしたnllibcとNLCCを大熱血アセンブラの環境に使って,実行ファイルを生成できる.
  • さらにその実行ファイルをシミュレータで実行できる.(MIPS16/RX以外)
  • これらのことが,11種類のCPUアーキテクチャでできる.(AArch64/ARM/MIPS/MIPS16/PowerPC/RISC-V/RX/Thumb/Thumb2/x86/x86-64)

MIPS16とRXはnllibcを用いての実行確認ができていませんがそれを差し引いても,NLCCは9種類のアーキテクチャで,標準Cライブラリのサブセット(printf()含む)をビルドして動作確認できる程度には動いたということなので,そこそこ動作確認がとれたということにはなるかなと思います.

これはNLCCが新たなCPUアーキテクチャに対応しやすいという特徴があるためです.

詳しくはNLUXのREADMEに書いてあるのですが,具体的には以下のような方針で設計することで実現しています.

  • 利用するレジスタを限定(演算は2種類のレジスタのみで行う)
  • 出力するアセンブリのパターンを限定(最低限のアセンブリパターンのみ登録し,それらの組み合わせで処理を実現する)
  • ビルトインの活用(他の命令で代用可能な処理は,未登録でも代用され動作する)

2つのレジスタ(NLCC内では「R0」と「R1」と呼んでいる)に何を使うかを決めて,R0に定数値を代入する命令,R1をR0に代入する命令,R0とR1を加算しR0に格納する命令,などを登録しておけば,それらを組み合わせて処理をするようなアセンブリのコードを生成してくれます.

 

x86-64の例だと,R0にRAX,R1にRDXを指定して,上の例なら以下のような関数を登録しておくことになります.(asm_code_amd64.c参照)

static void get_value(FILE *out, long value)
{
  ASM_CODE_OUT(out, "\tmov\t$0x%lx, %%rax\n", value);
}

static void get_r1(FILE *out)
{
  ASM_CODE_OUT(out, "\tmov\t%%rdx, %%rax\n");
}

static void calc_add(FILE *out, model_t model, model_t model_arg0, model_t model_arg1)
{
  ASM_CODE_OUT(out, "\tadd\t%%rdx, %%rax\n");
}

現状では最適化を一切しないため,生成されるアセンブリは非効率極まり無いものとなっています.

が,10アーキでとりあえず動きますし,新たなアーキに対応させるコストも極小です.
 

バイナリかるたをリニューアルしました.

 

https://kozos.jp/binary-karuta/

↑ここの「バイナリかるたのサンプル」「バイナリかるたのサンプル(初心者向け)」「バイナリかるた生成ツール」です.

 

「初心者向け」は,入門向けにカードを限定してファイル種別等も入門向けにして,1枚シートで印刷できるようにしたものです.

 

バイナリかるたは独自の生成システムがあって,makeするだけでかるた札のデータやスライドPDFを自動生成してくれるというものなのですが,今回大幅にリニューアルしました.新規データも追加されています.

もともと2013年ごろにSECCONで始めたバイナリかるたですが,その後に書籍「バイナリで遊ぼう」の題材になったり,とある会社のノベルティグッズになったりしましたが,最近とあるところでやる機会があったので,良い機会なので生成システムをリニューアルしました.

今回は,市販の標準的な名刺シート用の印刷データ生成を追加しています.

標準的な名刺シートというのはA4サイズで2×5で10枚の名刺が作成できるものですが,これに印刷するためにサイズ合わせして縁塗り足しも追加した印刷用データを生成してくれます.

(生成後のデータも添付しています)

 

これを名刺シートに印刷すれば,自前でかるた札の印刷が可能です.

(ただコンビニとかの印刷サービスとかでは,印刷用紙の持ち込みはほとんど対応していないので注意してください(紙づまり等するとトラブルになる可能性有り).自宅のプリンタか,持ち込みの名刺用紙での印刷を受け付けてくれる印刷所とかでの印刷が必要)

makeしなおせば自前でデータ作成も可能ですが,必要ツールをインストールする必要があるのと,あと私はFreeBSD上でやっているので,DebianやUbuntuとかだと動作や生成データに微妙な違いがあるかもしれないです.

ホームページ上では、他のシートサイズに合わせた印刷用データも配布しています.

A-ONEの通常名刺シート,角丸マルチシート(キャッシュカードサイズ),つり下げ名札シート,店頭POP用シートのサイズに合わせたデータがあります.

新規データは,初心者向けにテキスト系のデータを追加しました.

また今まで無かった音声系,ファイルシステム系を追加しました.


Let's binary karuta!
 

久々に,本を出しました.(大熱血アセンブラ以来か…)

 

独自言語「NLL」の入門書です.
電子と紙の書籍があります.紙の書籍はオンデマンドなので,ネット上での注文販売です.
https://www.amazon.co.jp/dp/4295603392/


独自言語を使うことのメリットを出したかったため,言語の入門書というだけでなく,プログラミングによって算数の問題をいかに解くか?というテーマで書いてみました.
また,言語仕様を淡々と説明するのでなく,実験しながら修得するというやりかたにしたかったため、キャラクターの対話形式で書いてみました.(私としては、初)

入門書なので技術レベル高い本というわけではないですが,自分の自作の独自言語で本が出せたので,私としてはまた今までとは違った嬉しさがあったりします.

プログラミングが必修化されて久しいですが,プログラミングの入門というと,多くはゲーム作りを題材にしています.
これはこれで良いとは思うのですが,プログラミングに対して「ゲームを作るためのもの」というイメージが強くなるため,他のことに使うという発想,例えば身の回りのなにかに役立てるということに繋がりにくい(=修得のためのモチベーションを得られにくい)という部分があるのでは?と思います.

 

プログラミングがもっと身の回りの問題解決に役立てられるということを知ることができれば,じゃあできるようになってみたいというモチベーションをもっと得られやすくなるんじゃあないかなと.

 

そこで算数なのですが,算数の問題を解くっていうのは,子供にとってはかなり身近なテーマだと思うわけです.

これがプログラミングによってできるのであれば,それはプログラミングをやることのモチベーションに繋がりやすいのではないかと.

そのように考えてみると,算数の問題を解くことにプログラミングを使うっていうのは,かなり魅力的なんですよね.
理由は,プログラムを書くことで,コンピュータの計算力に任せて力任せに解くような,要するに教科書的ではないけど「理論が単純で理解は簡単な」解き方ができるからです.(例えば総当りで解くとかそういうのです)

最大公約数とかだって,公約数を出したり素因数分解したりしなくても,1から順にループして割った数がゼロになるやつ,っていう総当り的なやりかたで簡単に解くことができます.

もちろん前者のやりかたよりも計算量はかかるわけですが,プログラム書いてコンピュータが頑張ればいいだけですし,今どきのPCなら1万くらいの数までやったとしても一瞬でしょう.

 

別に教科書的なやりかたを否定するわけではないですしそれはそれで必要だとは思うのです.

が,それとは発想が違った「計算力に任せて解く」っていうやりかた「も」知ることで,解きかたに選択肢を持てるようになるわけだし,別の視点からの解きかたを知ることが理解の助けになるかもしれないし,そもそもそれで問題解決できるという発想も持てるようになるわけだし,それはそれでいいんじゃないかと思うわけです.

 

まあこのへんの詳しい話は書籍中に書きましたのでそちらで.

 

独自言語を作っています.(「NLL」という言語です)

 

https://kozos.jp/nll/

昔のBASICに似た感じの文法で,行単位・コマンドベースで記述する感じです.

 

「とりあえず,やりたいことをやりたい」というプログラミングの入門者が,何かパッとプログラムを書くとして,知らなければならない文法事項や概念が多いと,本来考えなければならない処理の組み立てとかそういうこと以前のところで詰まってしまいます.

 

そこで,プログラムを書くために覚えなければならない文法事項や概念を最低限にすることで,いくつかの文法事項さえ覚えればあとは上から順に丁寧に読めば理解できる(はず),しかし演算機能は(入門者向けの言語だからといって簡略化することはせずに)普通の言語並みにあるので,書こうと思えば本格的なプログラムも書ける(はず)という方針で作ってみました.

つまり演算機能は普通並み,しかし文法事項は最低限,という言語です.

 

例えば変数にはグローバルとローカルの違いは無く,すべてグローバルです.

また関数(サブルーチン)には範囲という概念は無く,サブルーチン呼び出しがあればそこにジャンプして,RETURNがあればジャンプ元に戻るというだけです.これによって関数の範囲という概念を無くしています.

 

もちろん工夫すれば,ローカル変数のような書き方をすることはできます.

でも最初のうちはそういうことはせずに,変数はすべてグローバルとして考えればそれでプログラムは書ける,というようになっています.

 

グラフィック機能やサウンド機能もありますので,ゲームを作ったりすることもできます.