ときどきの雑記帖 RE* (新南口)
水の星へ愛をこめて
ツクツクボウシ
7月の頭くらいに今年はセミの鳴き声が聞こえない(セミが鳴いていない) てな話があったけど、 ミンミンゼミやらアブラゼミは盛大に鳴くようになった一方で ツクツクボウシにはまだ遭遇していない(たぶん)
ヒグラシとかクマゼミはこの辺(どこ)にはおらんし
Zガンダム@テレ玉
「反撃」
OPが「水の星へ愛をこめて」に。
- こいつはオレのいとこなんだ
- ブレックス准将暗殺
- ヤザン(ギャプラン使用で)登場
最後、クワトロが議場にいたけどどういう立場でだろう。 ブレックス准将の代理? 「法案を採択」というセリフがあるからなにかの議員のような気もするけど よくわからんな。
次回、「コロニーが落ちる日」
が、ナレーションでは「コロニーの落ちる日」と言ってるな
HARDOFF
行動圏内にあったBOOKOFFが最近HARDOFFに変わったのだけど、 実はHARDOFFって行ったことがなかったので 行ってみた。
PSPやらNintendo DSが結構いい値段ついてて驚いたんだけど、 自分が売るときはまた話が違うんだろうねえ(笑
MKAELONG
Linux創設者、Googleエンジニアのコードを「ゴミ」と一蹴 | XenoSpectrum
「『ゴミ』というのは本気で言っている。こんなものは誰も私に送るべきではないし、ましてやマージウィンドウの終盤に送るなど論外だ」と断じた。
しかし、Torvalds氏はこれを「狂っていて無意味」「世界を積極的に悪くするもの」とまでこき下ろした。なぜか。
「世界を積極的に悪くするもの」というのに ちょっと引っかかるものを感じたので 原文にあたってみた
Linus Torvalds Rejects RISC-V Changes For Linux 6.17: “Garbage” - Phoronix
And by “garbage” I really mean it. This is stuff that nobody should ever send me, never mind late in a merge window.
That thing makes the world actively a worse place to live. It’s useless garbage that makes any user incomprehensible, and actively WORSE than not using that stupid “helper”.
ん-、たしかにactivelyは「積極的に」とかそれに似たような言い回しになるみたいだけど、 「積極的に悪くする」はなんか違う気がするんだよなあ
If you write the code out as “(a « 16) + b”, you know what it does and which is the high word. Maybe you need to add a cast to make sure that ‘b’ doesn’t have high bits that pollutes the end result, so maybe it’s not going to be exactly pretty, but it’s not going to be wrong and incomprehensible either.
In contrast, if you write make_u32_from_two_u16(a,b) you have not a f%^5ing clue what the word order is. IOW, you just made things WORSE, and you added that “helper” to a generic non-RISC-V file where people are apparently supposed to use it to make other code worse too.
make_u32_from_two_u16(a,b)
みたいな動きをするマクロが
Windowsにあったよねえと思ったら同じものを連想した人が
Windows「えっ Linux って MAKELONG 無いんですか?」 https://t.co/wiFeKAN4Wz
— mattn (@mattn_jp) August 13, 2025
そうそう MAKELONG マクロ (minwindef.h) - Win32 apps | Microsoft Learn。 でその記述を見ると
指定された値を連結して LONG 値を作成します。
DWORD MAKELONG( WORD a, WORD b );
そうそうこれこれ。 と思いつつよく読むと…
パラメータ a
新しい値の下位ワード。
パラメータ b
新しい値の上位ワード。
え? そうだったっけ? と念のため英語版でも確かめると
MAKELONG macro (minwindef.h) - Win32 apps | Microsoft Learn
-parameters
-param a
The low-order word of the new value.
param b
The high-order word of the new value.
あらま。 使ってたのははるかな昔のことだとは言え どこで記憶が書き換わったんだろう😓
- Re: [GIT PULL] RISC-V Patches for the 6.17 Merge Window, Part 1 - Linus Torvalds
- Linus Torvalds Rejects RISC-V Changes For Linux 6.17: “Garbage” - Phoronix Forums
新山さん
新山祐介 (Yusuke Shinyama): “論文: プログラマでない人々は複雑なロジックを手続き的に記述…” - Mastodon 🐘
論文: プログラマでない人々は複雑なロジックを手続き的に記述するのに慣れていない。 彼らの多くは「もし~の場合は~」のようなイベントハンドラ的な書き方を好む。 プログラミングがより一般に普及するためにはこうした言語が必要かもしれない。
同様のことを以前考えていたことがあったので読んでみよう
Studying the Language and Structure in Non-Programmers’ Solutions to Programming Problems
この辺もあとで(ry
- 新山祐介 (Yusuke Shinyama): “大規模ソフトウェアを設計するときに考慮すべきこと: 複雑さが…” - Mastodon 🐘
- 新山祐介 (Yusuke Shinyama): “人はバグから何を学べるのか? 「防げたかもしれない」バグに遭…” - Mastodon 🐘
補数
intelの1980年版MCS-48ユーザーマニュアルに2バイト整数の引算プログラムの例があったので、8048のモニタープログラムに組み込んで確かめてみました。確かに引算ができるようです。せめて8051と同じようにSUBC命令があればこんなに苦労しないのにね。 pic.twitter.com/95mX46xAKC
— みかんとひよどり (@hiyodori5) August 11, 2025
for
for (;;) は嫌いなんだよね。while (1) は一般的な言語規約から動作が理解できるけど、for (;;) はそれ専用の規約なので
— Kazuho Oku (@kazuho) August 14, 2025
「昔は for (;;) のほうが効率的な機械語出力した」
— Kazuho Oku (@kazuho) August 14, 2025
みたいな意見あるけど、for(;;)専用の処理をコンパイラに実装する手間を考えると、while(1)を最適化するほうがずっと楽だろみたいな。だから言語規約にfor(;;)を入れたのは誤りだったんじゃないかと
for (x = 0;; ++x) ... みたいなの書く時に、条件式に1って書くのめんどいやろみたいなのがあって、条件式も初期化や増分同様に省略させろやってなって結果 for (;;) が誕生したみたいなのはありうるとは思います(が、それは for(;;) が読みにくいことを否定する理由にはならない)
— Kazuho Oku (@kazuho) August 15, 2025
逆に for (;;) 派。
— yoh2 (@yoh2_sdj) August 15, 2025
完全に感性の問題だけど、条件式が存在しないことで無条件にループするということを直接表現しているように感じるので。
while (1) や while (true) は、真が真である間ループするといった余分な表現が一段階あるように見える。
重ねて言うけどあくまで個人的な感性の問題ね。
ふと、最初の(とまではいかなくても初期の) Cコンパイラーはどんなコンパイルしてたのだろうと気になったので(ry
prestruct
まずは一番古そうなこれ legacy-cc/prestruct/c00.c at master なんだけど…
init("int", 0);
init("char", 1);
init("float", 2);
init("double", 3);
init("struct", 4);
init("auto", 5);
init("extern", 6);
init("static", 7);
init("goto", 10);
init("return", 11);
init("if", 12);
init("while", 13);
init("else", 14);
init("switch", 15);
init("case", 16);
init("break", 17);
init("continue", 18);
init("do", 19);
init("default", 20);
ん、キーワードにfor
がない?
じゃあそれよりはちょっと新しいこれ legacy-cc/last1120c/c00.c at master では? とみてみると…
last1120c
init("int", 0);
init("char", 1);
init("float", 2);
init("double", 3);
/* init("long", 4); */
init("auto", 5);
init("extern", 6);
init("static", 7);
init("goto", 10);
init("return", 11);
init("if", 12);
init("while", 13);
init("else", 14);
init("switch", 15);
init("case", 16);
init("break", 17);
init("continue", 18);
init("do", 19);
init("default", 20);
やっぱりforがない?
ここで、なんとなく記憶の隅に引っかかるものがあったので 過去に書いたものを調べてみると、 やっぱり2023年の9月に書いていた
その内容はというとこう
ついでにx86用に変更されたC72の vegesm/c72: The first C compiler ported to x86 から。
Differences to modern C
This version of C is from around 1972. While the general syntax is pretty much the same as today, there are tons of missing features:
- no preprocessor, no for loops
- bitwise NOT and XOR is not implemented
- no short-circuiting AND and OR
- even though there is a keyword for float and double, floating point calculations are not implemented, you can not even write a floating point literal
- the type system is very weak: pointers, chars, ints can be freely converted into one another
- types of the function parameters are not checked, anything can be passed to any function
- compound assignment operators are reversed, they are =+, =*
- only integer global variables can be defined, and the syntax is strange:
/* defines globalvar to have the value of 2 */ globalvar 2; /* equivalent to int globalarr[]={1, 2, 3}; */ globalarr[] 1, 2, 3;
returnのあとのカッコについては書かれていないけど なかなかに興味深い違いですな。 プリプロセッサーがないという話は先にも出てきたけど for文もないと。 それじゃあとコンパイラーのソースコードで検索してみたら確かに見つからなかった (正確には元々のコンパイラーの実装には関係ない部分にはあった)。
ということで現状参照できる最古級のコンパイラーにはforがないようなので、 v7のpccじゃない方を見てみると
v7
struct kwtab {
char *kwname;
int kwval;
} kwtab[]
{
"int", INT,
"char", CHAR,
"float", FLOAT,
"double", DOUBLE,
"struct", STRUCT,
"long", LONG,
"unsigned", UNSIGN,
"union", UNION,
"short", INT,
"auto", AUTO,
"extern", EXTERN,
"static", STATIC,
"register", REG,
"goto", GOTO,
"return", RETURN,
"if", IF,
"while", WHILE,
"else", ELSE,
"switch", SWITCH,
"case", CASE,
"break", BREAK,
"continue", CONTIN,
"do", DO,
"default", DEFAULT,
"for", FOR,
"sizeof", SIZEOF,
"typedef", TYPEDEF,
"enum", ENUM,
0, 0,
};
さすがに(?)これにはキーワードとしてforがあった。 さらにどんな処理をしているのかを追いかけると
case FOR:
o1 = contlab;
o2 = brklab;
contlab = isn++;
brklab = isn++;
if (o=forstmt())
goto syntax;
label(brklab);
contlab = o1;
brklab = o2;
return;
「本体」はforstmtなる関数らしい。 そしてその関数はどんなものかというとこう
/*
* Process a for statement.
*/
forstmt()
{
register int l, o, sline;
int sline1, *ss;
struct tnode *st;
if ((o=symbol()) != LPARN)
return(o);
if ((o=symbol()) != SEMI) { /* init part */
peeksym = o;
rcexpr(tree());
if ((o=symbol()) != SEMI)
return(o);
}
label(contlab);
if ((o=symbol()) != SEMI) { /* test part */
peeksym = o;
cbranch(tree(), brklab, 0);
if ((o=symbol()) != SEMI)
return(o);
}
if ((peeksym=symbol()) == RPARN) { /* incr part */
peeksym = -1;
statement();
branch(contlab);
return(0);
}
l = contlab;
contlab = isn++;
st = tree();
sline = line;
if ((o=symbol()) != RPARN)
return(o);
ss = funcbase;
funcbase = curbase;
statement();
sline1 = line;
line = sline;
label(contlab);
rcexpr(st);
line = sline1;
if (ss < maxdecl)
ss = maxdecl;
curbase = funcbase = ss;
branch(l);
return(0);
}
三つの「式」のそれぞれについて、 「式が空だったらコード生成しない」 (というかあったら対応するコードを生成する)感じっすね。
for文のコンパイルで生成されるコードを簡単に書くとこんな感じか
init:
初期化 *1 /* init part */
cont:
if cond()==false goto brk *2 /* test part */ 条件が「逆」になるはず
for 本体
増減式 *3 /* incr part */
jmp cont
brk:
いずれにしても、「三つの式が全部なかったら」という特別な判断はしていないですね。
- pre K&R Cコンパイラ - Plan9日記
- popeyeotaku/c6t: An Implementation of the Pre-K&R C compiler from Research Unix V6
- UNIXのCコンパイラ(cとpcc)のソースコード リンク集 #compiler - Qiita
- Unix v6 の C コンパイラが面白かった話 - 兼雑記
- cman.pdf
- legacy-cc/prestruct at master
- mortdeus/legacy-cc
- Primeval C: two very early compilers
- 本の虫: デニス・リッチーによって書かれた最初のCコンパイラーがGitHubで公開
ついでにpccも見ておくか
pcc
| forprefix .e RP statement
={ deflab( contlab );
if( flostat&FCONT ) reached = 1;
if( $2 ) ecomp( $2 );
branch( $1 );
deflab( brklab );
if( (flostat&FBRK) || !(flostat&FLOOP) ) reached = 1;
else reached = 0;
resetbc(0);
}
(幅を「節約するためちょっといじってます。他のコード片も同様」)
forprefix:
FOR LP .e SM .e SM
={ if( $3 ) ecomp( $3 );
else if( !reached ) werror( "loop not entered at top");
savebc();
contlab = getlab();
brklab = getlab();
deflab( $$ = getlab() );
reached = 1;
if( $5 ) ecomp( buildtree( CBRANCH, $5, bcon( brklab) ) );
else flostat |= FLOOP;
}
;
まあ同じっちゃ同じ?
おまけでwhileも
while
| whprefix statement
={ branch( contlab );
deflab( brklab );
if( (flostat&FBRK) || !(flostat&FLOOP)) reached = 1;
else reached = 0;
resetbc(0);
}
whprefix:
WHILE LP e RP
={ savebc();
if( !reached ) werror( "loop not entered at top");
if( $3->op == ICON && $3->lval != 0 ) flostat = FLOOP;
deflab( contlab = getlab() );
reached = 1;
brklab = getlab();
if( flostat == FLOOP ) tfree( $3 );
else ecomp( buildtree( CBRANCH, $3, bcon( brklab) ) );
}
;
「whileの条件式が0でない定数だったら」というのを見ていて、 その場合は無条件分岐(ループ)としてコンパイルしてるっぽいすね
forが;使ってるの、パーサーをらくするためにexpressionじゃなくてstatementにしてる(仕様上の意味じゃなくて)んだろうなとは思ってるけど、じゃぁ最後も要るやろとは思って謎い
— にゃははー仙人 (@Flast_RO) August 15, 2025
構文解析を楽にするためというのはそんな感じだけど、
forの本体の前には)
が必ず来るから
それで判断すれば三つ目の式の後に;
がなくても困らない
(むしろ;
)
が連続して出現するのをチェックしなくて済むから楽)。
って感じ?
おまけのおまけ
一連のfor絡みの投稿でこんなのが流れてきてた
ループ関連の構文で言うとPythonのfor-elseが欲しい派ですが…(´・ω・`)
— てらモス🌹 (@termoshtt) August 15, 2025
let result = for i in iter {
— てらモス🌹 (@termoshtt) August 15, 2025
break value;
} else {
default_value
};
ってしたいやん(´・ω・`)?
前回書かなかったけど、Zigのforにもelseがつくっぽい
Like Python, Zig allows else on loops. Unlike Python, loops are expressions, which leads to a nicely readable imperative searches:
pub const Word = for (.{ u8, u16, u32, u64, u128, u256 }) |W| { if (@bitSizeOf(W) >= bitset_capacity) break W; } else unreachable;
for(;;)は嫌いなんだよね、泣いてるみたいだから
— とみながたけひろ (@takehiro_t) August 15, 2025
while('_')って書くといいよ
おおーそうする!
という会話を思い出した(全然違う https://t.co/LUsWymxcNm
while(U'ω') ;
— yoh (@yohhoy) August 15, 2025
なるほど while (0xbeef) とかいいのか https://t.co/DZ2ymqPY4d
— _ko1 (@_ko1) August 15, 2025
C系の for(;;) {} はあんま好みじゃないけど https://t.co/4LmrKOrraz Go言語の for {} で無限ループになるのはどーなんだというキモチはちょっとある https://t.co/bSm71wNC0g Rust言語の loop {} なら納得感があるのはキーワードのせいか
— yoh (@yohhoy) August 15, 2025
新刊近刊
作って理解する仮想化技術
【新刊】2025年9月19日発売『作って理解する仮想化技術── ハイパーバイザを実装しながら仕組みを学ぶ』本体3,200円+税,森真誠 著,品川高廣 監修,複数の仮想マシンが動作するハイパーバイザを一から実装https://t.co/kSvi6BWwGs pic.twitter.com/t5TD6LxTKW
— 技術評論社販売促進部 (@gihyo_hansoku) August 14, 2025
先輩データサイエンティストからの指南書 | 技術評論社 https://gihyo.jp/book/2025/978-4-297-15100-3
Tidy Together
『Tidy First?』の続編『Tidy Together』
— kawasima@99卒 (@kawasima) August 15, 2025
Tidy First? ではRefactoringが当初と違う意味で使われるから、Tidyingという言葉を使うことにしたけれども、やっぱりRefactoringを使い続けることにするっ!だそうです。https://t.co/MecteI3Zdp
amazonの洋書で見つかったけど(ただし(まだ?)買えない) 12月発売予定?
ハッカーたちはいかにして「飼いならされた」のか
原書を読む余裕はないけどいちおうメモ
秀和
【Good Code Bad Code を含む、翻訳した4冊の本に関するお知らせ】@stzn3 sanと翻訳して秀和システムさんから出版してた 以下4冊の本ですが、残念ながら新社への引き継ぎと販売が継続がなされないことになりました
— freddi(Yuki Aki) (@___freddi___) August 14, 2025
- Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考
-…
秀和システム新社からお知らせが来ました...
— shiz(しず)@翻訳本執筆 (@stzn3) August 14, 2025
現時点では、弊社において新たな契約を締結し、当該翻訳出版物の販売を継続する予定はございません
復活させたい
- Good Code, Bad Code
- セキュアなソフトウェアの設計と開発
- クリエイティブプログラマー
- ストリートコーダー
- Looks Good To Me
Xユーザーのshiz(しず)@翻訳本執筆さん: 「@masuipeo こんな形になってしまいましたが、監訳していただき本当にありがとうございました。 残念なことに、増刷された分は販売不可で全部廃棄されるようです…」 / X https://x.com/stzn3/status/1956131658396262489 –>
こんな形になってしまいましたが、監訳していただき本当にありがとうございました。
— shiz(しず)@翻訳本執筆 (@stzn3) August 14, 2025
残念なことに、増刷された分は販売不可で全部廃棄されるようです…
なかなか難しいですねえ。 おそらく(原書の出版社との)契約絡みの理由なんだろうけど
雑誌:今月号のSoftware Designの62ページ。PC-8001って16x16ドットフォントデータで6900文字も内蔵されてましたっけ?
— 古籏一浩 (@openspc) August 14, 2025
そんな凄いマシンでしたっけ?識者の人教えて… pic.twitter.com/SFrhqoJqlt
なにかの影響でもう出ているのかと思ったけど18日発売で変わってないらしい
ソフトウェアデザイン 2025年9月号 | Software Design編集部 |本 | 通販 | Amazon
著者(寄稿者)献本だろうか。 そういや平成の初めころは初戦グランデで 18日発売のコンピューター雑誌を1日か2日くらい早売り してたなあ(遠い目)
いつ頃までやってたのかは知らんけど。
それはさておき
このポストをみて、ふと思った。これが感覚的な「あれ。おかしくない?」なんですよね。(LLMにはこれがない)
— あうぇっど (@Awed_Urshy) August 14, 2025
たぶんこれを書いている人は現役世代ではなく、JIS X 0208:1978(というか当時だとJIS C 6226)の仕様を調べて約6900字というところで、止まって記事書いてしまってるんじゃなかろうか。… https://t.co/KSx9kxG9KR
実際の記事を読んでみたいけど18日に買えるかどうかは微妙だな…
Logic Gate
Logic Gate🤓 pic.twitter.com/gOuQEQNOGi
— RossRadio (@cqcqcqdx) August 13, 2025
聖地
ボン・千賀さんから退出し外に出た時、日本人と話し方からおそらく中国人のマケインファン二人組が立ち止まり...
— マッチョん (@matchon0000) August 14, 2025
日「ここが浮気の聖地だよ」
中「ウワキノセイチ!ウワキノセイチ!」
大興奮してました#マケイン
0x
0xDEADBEEF という名前のステーキ屋さんやるか
— 魔法少女くにゅくにゅ a.k.a. 椚座 淳介 (@kunukunu) August 14, 2025
脳内に突然降ってきた
— t157 (@t157) August 14, 2025
組込みエンジニアリング御用達カフェの名前
Embedded 0xCAFE
お肉は0xC0BEBEEFの0xA5ですか!
— ほげゆい (@hogeyui) August 14, 2025
メモ
HDCPってなんだったったけ? だったので
HDCPとは|HDMI接続に注意!動画視聴、対応・非対応解説 – Aladdin X
ケーブルそのものの規格の類ではないのね
ポール星人
#ウルトラセブン
— 東野さとし(さんちゃん) (@sandae2356) August 14, 2025
「光の国が恋しいだろうね。ウルトラセブン!でも自業自得というもんだ。M78星雲には冬がない。冷たい思いをするがいい、ウルトラセブン!」
「我々が敗北したのは、セブン、君に対してではない。地球人の忍耐だ。人間の持つ使命感だ。そのことを良く知っておくがいい!」… pic.twitter.com/z7msK252MD
横から見るとこんなだったのか!
RX-78
バンダイのRX-78がシャープからのOEMはもとよりいろいろとMZすぎているのだけど、ニデコが関東甲信越地区総代理店になってるのもシャープ絡みってことなのかな…。 pic.twitter.com/lQiepEsALL
— Oh!石 (@oec_Nibbleslab) August 14, 2025
知らなかった>シャープのOEM
渋谷のハンズにあったというのも(たぶん)初耳
8.29
【お知らせ】
— 【馬刺し専門店】敬馬|keima (@bakachikara1007) August 15, 2025
初めて8.29🐴🥩配ります。 pic.twitter.com/ZlsXe6lIwP
829 → 「ばにく」?
pigeonhole
「鳩の巣原理」ってよく考えたら誤訳なんじゃないか(左: pigeonhole、右: 鳩の巣) pic.twitter.com/EzVnQCDFkG
— さのたけと (@taketo1024) August 15, 2025
Wikipedia を見たら訳語に関する記載がありました:
— さのたけと (@taketo1024) August 16, 2025
> 鳩の巣原理という訳語は pigeonhole が持つ「鳩小屋の仕切り巣箱」という意味に着目したものであるが、pigeonhole の第一義は仕切り箱や分類棚であるからこれは誤訳なのだと上野健爾は指摘している。
上野健爾『ジーゲル: 人と数学』現代数学社
調べてみたらpigeonholeは動詞でもあるし、 スラングっぽい使い方もあるらしい。
- Pigeonholed は、色眼鏡で見る?|ながらバイリンガル@senatsu
- 英語「pigeonhole」の意味・使い方・読み方 | Weblio英和辞書
- 「pigeonhole」の意味・使い方・表現・読み方 - 英辞郎 on the WEB
Adam Leventhal: “Then I threw the lines into Ph…” - Mastodon