【超高速】C/C++に代わる低級言語を開発したい 8 (364レス)
1-

1
(10): 2012/08/23(木) 23:03:00.69 AAS
70年代、Cは生まれ、それから30余年、現代においてもなお、低レベルなシステム開発に広く使われている。

しかし、2010年の今、もしもCが発明されていなかったとして、低レベルなシステム開発のためのプログラミング言語を
新たに作るとしたら、Cとは違う言語になるだろう。少なくとも、全く同じにはならないはずだ。

そこで、このスレッドでは、
低レベルなシステム開発のためのプログラミング言語
を一から考えたい。

既存の言語を使って何かをすることが目的ではなく、新たなプログラミング言語を考えることが目的であるから、
「既存のXX言語を使えばいい。」という類の発言は無意味である。

「既存のYY言語のZZ機能は、WWと言う点で有用だから採用したい。」という発言は歓迎だ。
現代の一流のプログラミング言語研究者が、最先端の研究成果を盛り込んで、
一から低レベルなシステム開発のためのプログラミング言語を作るとしたら、どのような言語になるだろうか、
という観点で考えたい。

◆前スレ
【超高速】C/C++に代わる低級言語を開発したい 7
2chスレ:tech
238
(1): 2015/03/19(木) 21:48:47.69 ID:QTBsG6tP(1)調 AAS
高級言語を使いこなすってC++を使いこなすより大変じゃないのか?
で結局パワーではC++に敵わない
239: 2015/03/20(金) 16:42:34.97 ID:sriWfzYS(1)調 AAS
>>238
C++ほど大変な高級言語はなかなか無いと思うぞ
240: 2015/03/20(金) 19:26:50.44 ID:e2IVv9/F(1)調 AAS
C++ほど変態な高級言語はなかなか無いと思うぞ
241: 2015/03/20(金) 22:14:20.35 ID:1BR7B8ZR(1)調 AAS
C++ほど変変な高級言語はなかなか無いと思うぞ
242
(1): 2015/03/21(土) 00:46:15.62 ID:m0LUk3nX(1)調 AAS
c++のunsigned long 型の変数を >=0で評価するとーの値が存在しないので必ずTureになって
forループが無限ループになるバグの説明が面白かった
アセンブラならループのインデックスを引いたあとキャリーフラグ調べて分岐じゃないか
ループ離脱の条件が単純比較じゃなくて条件式を容認してるからだろうけど
243: 2015/03/21(土) 02:54:48.44 ID:x0x7jBK5(1)調 AAS
Cの骨にテンプレートの肉を詰め、OOの毛皮を被った化物だよ
骨だけ使った料理もできるし肉を焼いてもいいし、毛皮からコートを作ったっていいが、
他人が作ったものはまだ蠢いているかもしれないから怖い。
244
(1): 2015/03/21(土) 07:42:06.13 ID:zBl3Ii3W(1/2)調 AAS
>>242
そもそもループカウンタにunsignedを使うこと自体、バグと言うべき話なのでわないかと・・・
245: 2015/03/21(土) 10:14:12.91 ID:9V6972Qg(1)調 AAS
必ずTureになるのが1番の問題
246: 2015/03/21(土) 11:05:05.60 ID:rA11USYH(1)調 AAS
×Ture
○True
247: 2015/03/21(土) 12:01:32.67 ID:/IY/BI0W(1)調 AAS
while(true)で評価するとーの値が変化しないので必ずTureになって
whileループが無限ループになるバグの説明が面白かった
ループ離脱の条件が条件式だけじゃなくてbreakやreturnを容認してるからだろうけど
248: 2015/03/21(土) 14:50:37.16 ID:TeX2vL/Q(1)調 AAS
高級な変態というと・・・女体盛りで大トロとかヒラメの縁側を使う感じか。
249
(1): 2015/03/21(土) 15:50:58.96 ID:xKri6eTm(1)調 AAS
>>244
増えていくカウンタなら問題はない
減っていくカウンタでも 0 でループアウトするように組むのなら問題ない、a >= 0 とするから問題になる
250: 2015/03/21(土) 20:43:28.09 ID:zBl3Ii3W(2/2)調 AAS
>>249
それはそうなんだが、勘違いしやすかったり、注意しないとバグの温床になりやすいことはしないのが基本だと思うんだが。
ループカウンタとして使うなら普通に int 使えよと。
251: 2015/03/22(日) 00:05:49.26 ID:SsX9i6KK(1)調 AAS
C++/CLIはC++の顔してて勝手にスレッド作りやがる
252: 2015/04/13(月) 21:56:18.38 ID:1Ez10RQf(1)調 AAS
FORTHという>>1の要件をほぼかなえる言語がある
これをベースにすればよい
253: 2015/06/10(水) 13:56:59.28 ID:/kHDwUM2(1)調 AAS
while( c )
{
 ...
 c -= 2;
}
254
(3): 2015/06/10(水) 23:35:06.95 ID:bjmIAJs7(1)調 AAS
好き / “アセンブリ言語のみで言語処理系を作った話 // Speaker Deck”
外部リンク:speakerdeck.com

これ見て元気だせ
自分でも出来そうな気がするだろ
実際、大学あたりではcコンパイラの実装までやらせてるんじゃないの?
255: 2015/06/11(木) 02:58:17.97 ID:wwX+zBdZ(1)調 AAS
>>254
簡単そうに書いてるけど、これ相当わかってる人でレベルが高い。
俺には1段階理解するだけで大変。自分で実装できる気がしない。
256: 2015/06/11(木) 18:03:31.89 ID:mzhQ9y6C(1)調 AAS
>>254
たぶんこの人だね
外部リンク:www.s.u-tokyo.ac.jp
257: 2015/06/13(土) 22:22:22.81 ID:ueb0hiNe(1)調 AAS
 あー、ドアドアの人? と思ったら違ったヽ(´ー`)ノ

 むかーし(20年ちょっと)、アセンブラに構造化マクロを追加して『生産性が超上がる!』って
謳ったPDS(今で言うフリーソフト)があったけれど、当時意味分からなかったなあ。
 と言うかGCCの吐くアセンブラコードを読んで、自分で書くより綺麗でスッパリ諦めた(^^;
258: 2015/06/14(日) 01:34:40.73 ID:et+uySKI(1)調 AAS
少し前、x265のエンコードダーをアセンブラで記述してる人達の話題で
プログラムを組む上で何が問題なのかって話題があって
OSのシステムコールを行うとレジスターが壊れるのが気に入らないって事だった
オレは重要なアルゴリズムに係わる高度なコーディング作業をしているのだから
システムコール如きへの配慮で煩わしい事をさせるなってことかな
システムコール用のレジスタ退避マクロなり
システムコールをラップしてレジスタを退避復旧したり
もう少し便利なアセンブラの処理系を作ってみたりしないのかな〜
既存コードとの互換性問題とかあるのかな
アセンブラ関係のTool類はかなり保守的で目新しい道具類がガンガン使われる様子は少な目??

>>254の記事を読むと、コンパイラ系統ってリストへの変換ー>実行コード(アセンブラ)への還元って事が凄くよく判るんだよね
物凄く大雑把に言うと、LISP処理系への構文糖衣≒コンパイルする対象(プログラム塊) な構図
259: 2015/06/20(土) 16:36:37.21 ID:lPLujLwf(1)調 AAS
Objective-ASM
260: 2015/10/31(土) 22:45:31.32 ID:z7pRF+TT(1)調 AAS
>>54
どこがスレ違いなんだ。
それどころか、このスレを建てること自体が間違ってるだろ。
それを指摘するのは正しいことだろ。
261
(1): 2015/10/31(土) 23:17:02.36 ID:d1AV3Byr(1)調 AAS
54 :デフォルトの名無しさん [sage] :2013/04/07(日) 22:40:29.84
262: 2015/11/01(日) 07:59:19.09 ID:xEvp3/ht(1/2)調 AAS
VS2013のC++x64でアセンブラコードみてるんだけど
かなり良さそうなコード吐き出している
問題はC++の仕様が大きいので他人の書いたコードが理解できないこと
C++の仕様の大きさが問題ならC++のコードを吐き出すプリプロセッサ?
みたいなものを企画してあとはC++にお任せが一番楽そうだね
unionを使った偽装もキャストって呼ぶんだな
&を使うリファレンスも別名とか名称変更とか説明があってやっと理解できた
C++もC並みにフリーダムだからお行儀の悪いコードが書けてしまう

提案になってないな
アイデアとしては、cpuやハードを直接叩く記述をする場合明確に宣言させて隔離とか
_low_level_fuc みたいなキーワード導入してその内部のみ色々悪さが出来るとか
これは運用の問題なので今のC++でも可能なんだろうけど
pythonのサブセット、お行儀の悪いpythonとかpychonとかoppayとかwww
C++の複雑さって仕様が大きくなって新たなキーワードを導入して何でもかんでも
詳細にテキストで記述しようとした結果じゃないかな
本来ライブラリなりフレームワークなりにお任せすべき部分までやらかしていると
263: 2015/11/01(日) 08:07:06.43 ID:xEvp3/ht(2/2)調 AAS
Cの複雑さってint,char,とか扱う型の種類とサイズが多い事も理由っぽいので
ここはきっぱりアルゴリズムを記述する為に扱える数値の種類を1,2種類に限定して
そのほかはデーターベースの記録管理みたいに色々なコストをかけて
型変換なりレンジチェックなり圧縮なり手間隙かければ良いのでは?
いっそ64bitサイズの何かで統一してしまう
charもintも実数も全部64bitの何かw
264: 2015/11/01(日) 09:17:05.73 ID:v5UlfxKI(1)調 AAS
>>261
単に型なしのオブジェクト言語使えばいいのでわないかと
265: 2015/11/11(水) 11:53:35.17 ID:iOpec/0o(1)調 AAS
型無しのオブジェクト言語って言えばluajitがかなり高速なんだよな、確か。
あれの仕様を上手く転用できないかな。
266: 2015/11/11(水) 20:22:43.34 ID:1hY3wyl+(1)調 AAS
多分スクリプトとアセンブラの悪いとこ取りじゃね
267: 2015/12/14(月) 21:02:53.45 ID:LOQs7wcg(1)調 AAS
Rustいつのまにかstableリリース出てたのか・・・
Swiftみたいな負の遺産に塗れたクソ言語に比べりゃ大分>>1の理想に近いと思うんだけど
モジラってOSSの見切り早いし将来性が不安だわ
268: 2016/04/08(金) 01:45:14.02 ID:sej0xQjF(1)調 AAS
void*最強って話か?w

コンパイラが勝手にトレードオフして機能の一部をFPGAに突っ込んでくれよ
269: 2016/05/24(火) 08:42:53.66 ID:67ul01kR(1)調 AAS
高速とは無縁だけど多倍長整数ってあるよね
これをビット単位でやるの、管理も緩く1ビットで1バイト使って管理
速度で無いけど全部の計算表現できるよね
文字列とかは考慮してないけど
色々考えた結果、変数の精度、byte,word,duble word,q...
ここら辺がいかにCPUの効率都合に合わせた制限だってよく判る
制限して精度に条件が付いても効率と速度が欲しいって言う

たった1ビットの多倍長数が扱えるだけで何でも表現できるなと思った。ww
270: 2016/05/24(火) 15:58:40.37 ID:AJNPSyjI(1)調 AAS
せめてBCDにしれwww
271: 2016/06/02(木) 01:23:18.32 ID:RwzROqD7(1)調 AAS
何で10進数にしたがるかね
272
(1): 2017/03/25(土) 08:50:12.87 ID:Wiqnaowk(1)調 AAS
RustがC++に並ぶぐらい速くなってるみたいだけどRustのサブセットみたいなの作ったら良いのかね
273: 2017/04/03(月) 00:12:39.32 ID:Eo4f9wsY(1/2)調 AAS
修理するより買い換えた方が安いって話は多いが
もはや解読不可能になったコードのメンテナンスに金は出すくせに
新しく作り直すのはNGってのは恐ろしいな
大手では比較的作り直しもするようだが
274: 2017/04/03(月) 00:14:37.85 ID:Eo4f9wsY(2/2)調 AAS
もしあらゆる面でC++に勝る言語が出来たとしても、それが流行るかどうかは怪しい
275: 2017/04/03(月) 00:53:32.18 ID:OlsWZk+G(1)調 AAS
>>272
なんでサブセット?
276: 2017/08/25(金) 04:46:53.19 ID:QVMMnsrU(1)調 AAS
ネタがないんだね
Cに代わるっておそらく劣化Cになるだろうし
C++は現状仕様が巨大過ぎて大変な状態らしい
最後は、ライブラリーを移植するとき仕様差による移植性の低下をどうカバーするか問題がでる
(ライブラリーなんて一から書いてられないから)
ー> 結果現行のC++でも良いじゃん

設計とかコード書くときの作法が問題じゃねーのみたいに収束するのかな

あとは、コードの様子を解析するツールやAIっぽい機能を備えた解析などを行うアシストツールが必要になりそう

10進数の需要って金銭関係や丸め切り捨ては四捨五入で行いたい方面に需要があるんかな、やっぱ
277
(1): 2017/08/25(金) 11:22:12.03 ID:KodDhcxm(1)調 AAS
最近のC++は何を勘違いしたか高級言語気取っててウザイ。
278: 2017/08/25(金) 21:39:31.76 ID:BZOsNf+t(1)調 AAS
高級っぽく見える言語だな
279: 2017/08/26(土) 11:55:56.79 ID:lejZryYl(1)調 AAS
トンキンではC++関係者は不審者に見えるらしいw
280: 2018/03/25(日) 14:11:56.44 AAS
>>3
>◆新言語でのリソース管理方針◆
>
>・確保したリソースを明示的に後始末しなくても問題が発生しない
>・何らかのメリットのために確保したリソースを明示的に後始末してもよい

こういう魔法みたいなことってどうやったらできるんだろうね

もちろん効率重視なのは言うまでもない前提条件として
数十〜数百マイクロ秒単位で使用元・使用先スレッドがガチャガチャ入れ替わる環境で
281: 2018/05/23(水) 20:03:50.70 ID:Au5e7VGg(1)調 AAS
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

BTGPU
282: 2018/07/05(木) 01:37:35.74 ID:RfoszcD2(1)調 AAS
DKB
283: 2018/10/20(土) 20:00:04.70 ID:YPDT0Cqq(1)調 AAS
Cは8進10進16進数が扱えるのに、何で2進数が扱えないんだろう。
ちょっとの工夫でどうとでもなるけど、やっぱ標準であると嬉しいなあ。
284: 2018/10/21(日) 14:55:24.25 ID:YTn6F4Fk(1)調 AAS
16進数の方が分かりやすいからじゃないの
1010000とか書かれても1の位置がどこかすぐに分からないし
0x50なら一目で分かるけど
285: 2018/10/21(日) 17:25:58.13 ID:3rYBWp0g(1)調 AAS
gccはじめメジャーなコンパイラなら大抵は2進数リテラルは扱えるから
よく使う処理系基準でいいでしょ
286: 2018/10/21(日) 20:17:45.60 ID:IbAoaMml(1)調 AAS
C++では0bが使えるようになったけど、Cはまだなのか
つか素直にC++使おう
287: 2018/10/21(日) 21:24:49.94 ID:y1FMkoBF(1)調 AAS
最近のc++は糞化拡張が止まらないから。
あくまでアセンブラの代替として使いたいのであって、ハード寄りのコードを書きたいのであって、
速度重視、メモリ効率重視が根底にあるのに、c++の仕様拡張してる奴らはただの言語オタクでうざい。
288
(1): 2019/05/25(土) 11:08:30.63 ID:jbgB9jQg(1)調 AAS
Rustが正解に近い。

メジャー化してエコシステムが充実すればいける。
289: 2019/06/03(月) 11:49:30.62 ID:561P/qAZ(1)調 AAS
armcc, armclang, Linaro GCC

ARMR コンパイラ armcc ユーザガイド
外部リンク[jsp]:infocenter.arm.com
armcc は、標準 C および標準 C++ のソースコードを ARM アーキテクチャベースプロセッサのマシンコードにコンパイルする、最適化 C および C++ コンパイラです。
290: 1 2019/08/13(火) 23:00:51.64 ID:oTlgbS6H(1)調 AAS
Rustが正解であることが確認されました。

10年弱に渡りお付き合いいただきありがとうございました。
291: 2019/08/21(水) 20:28:24.91 ID:6xsUkfpB(1)調 AAS
言語が
理解習得し易い
誤認間違い難い
というのもお願いしたい
292: 2019/08/31(土) 17:50:09.35 ID:54Etlgy2(1)調 AAS
MIT「えっまた俺なんかやっちゃいました?」

julia、軌道に乗る
293: 2019/08/31(土) 22:20:26.54 ID:XxwPKKvU(1)調 AAS
>>277
大本の思想がランタイム速度落とさずにできるかぎり高級機能入れてこう
ってなところがあるんで自然といえば自然。
ある種の人体実験場みたいなところがc++の意義って気もする。
294
(1): 2019/09/01(日) 01:01:46.09 ID:JdN5NInb(1)調 AAS
>>288
バスト占い思い出した
295: 2019/09/01(日) 13:35:22.25 ID:gzRpR9B4(1)調 AAS
c++が示したことってのは結局
ランタイム速度
高級機能を追加
の2点だけ追求すれば馬鹿プログラマは寄ってくるってことなんだわ。
296: 2019/09/14(土) 20:38:11.35 ID:IbeHy12P(1)調 AAS
どうみても今はコード書かない言語オタクが好き勝手に拡張してる。

C++にくだらん機能追加したいなら名前変えろよ。
C++系言語で普及した言語はJavaやC#などいっぱいある。
297: 2020/02/17(月) 23:02:27.37 ID:R0DiDWe7(1)調 AAS
Low* (Low star)という言語は型システムがすごいのでぜひ取り入れていくべき
298: 2021/10/27(水) 10:06:43.69 ID:XE3bmMwX(1)調 AAS
演算子オーバーロードって難読化だよね
299
(1): 2021/10/28(木) 12:18:05.54 ID:VQB5DVZJ(1)調 AAS
まあ、もともとCは最適化はあまりやらなくて、プログラマの意思をなるべく素直に伝えるという思想だしな。だから、a=a+1;とa++;は演算後の値は同じでもプログラマの意図は違う。前者は加算命令、後者はインクリメント命令に落ちてほしい。

コンパイラのエラーチェックも最小限で、チェックはlint使えって感じだし。

Rust屋の主張するメモリ安全なんかも「うっせえわ!黙って言う通りにやれ!」って感じ。

あぁ、キャリー/ボローフラグが使えたら良いなあって時はあるかな。
300: ハノン ◆QZaw55cn4c 2021/10/30(土) 16:29:48.11 ID:nIglmucm(1)調 AAS
>>299
>キャリー/ボローフラグが使えたら良いなあ
ですよね、ローテート/シフトのときは特に
301: 2021/11/06(土) 14:48:01.13 ID:b1XdA94q(1)調 AAS
int と size_t がいつも混在して面倒になる
302: 2021/11/26(金) 11:52:34.78 ID:ARqZ/fb1(1)調 AAS
勝手な整数拡張をやめてくれるある意味cより低級なcが欲しい
パフォーマンス的にワード長で扱うのが良いというのもわかるが
あえてintより小さい型で計算したい時というのはそれなりの理由があるからやるわけで
その型内でオーバーフローしたら切り詰めずに素直に落ちろ
303: 2022/04/19(火) 01:58:13.78 ID:TThcYTpA(1)調 AAS
しかしそこまで低級なところに降りていくとマクロアセンブラみたいなのが使いやすい感じになっちゃうんだよね。
言語上の表現がどういう機械語に対応付くのか意識するともう直接書いた方がええわ……となる。
304
(1): 2022/04/19(火) 14:30:56.58 ID:1/h8QBeL(1)調 AAS
呼び出し前後のレジスタ退避と回復だけやってくれれば意外とアセンブラはほぼforthだよね
305
(1): 2022/04/21(木) 17:35:30.02 ID:+ZjRtsOn(1)調 AAS
forthは言語とマクロ用言語が同一言語なアセンブラだな
gforthみたいなリッチ実装はコンパイル済の定義を参照するとx86の標準文法を曝け出しちゃってなんだかなぁ、と思う
306: 2022/04/21(木) 20:15:20.64 ID:O4XEE7U4(1/2)調 AAS
>>304
forthは呼び出し規約の抽象化じゃなくて、型と引数という概念を捨てて自由になった
マシン依存性を排除するためにレジスタを抽象化した汎用dスタックに全ての命令が型と個数の解釈をモラルを守って作用することで成り立ってる
(暗黙の)引数渡しに関してはオーバーヘッドは大きくないので普通はマシンの最大スカラー型
floatはさすがにfスタックがあるけど

dスタックだけで複雑なデータ操作は厳しいから、最大スカラー型である事が保証されてるrスタック(生ハードウェアスタック)が一時領域に便利なのが闇

制御構造も戻りアドレスや添字を積むだけだから、うっかり積み残しがあると戻りアドレスやデータが添字代わりにインクリメントされ続けたり不可解な事に

あとは拡張性が売りの癖に制御構造のポータブルな拡張が難しいのがな…
もちろん制御構造と整合性のある単純な命令くらいは添えられてるのであくまで例だけど
指定回数ループをbreakするには最低で添字と戻りアドレスをpopする必要があるけど、たいてい実装拡張として積まれてるデータは不定、何回popしたらセグフォるか試すことになる

規格の制御構造には不備があるから(これは本当)うちの拡張を推奨ってのが普通の世界
制御構造すら定番がなくて、同じ言語といえるのかという疑問すら湧く
307: 2022/04/21(木) 21:15:26.12 ID:O4XEE7U4(2/2)調 AAS
>>305
コメント無くなってたり、埋め込んだ定義が等価な表現に置き換わってたりするから、seeは既存のコードを参照してるのでなくて、ブロブからforthコードへのディスアセンブラ(再構築)

ワードを渡せば' でそのワードの指すアドレスは取れるけど、そこから何バイト読むかのオフセット指定をseeは取らない、かなりヒューリスティックだと思う

seeで標準される開始-終了アドレスに、読みすぎてそうなら適当に足すか、途中で切れてるようなコードなら適当に足してaddr nbyte discloseと呼べば大体復元できると思う
dis、+disとかも入ってたっけ

まあ、具体的なレジスタやメモリの名前が分かるだけでforthコードとそんな変わらないという悲しさはあるが
308: 2022/07/30(土) 16:21:32.91 ID:paa5jUiA(1)調 AAS
Nim++
309: 2022/08/03(水) 08:36:38.78 ID:G37dUWbH(1)調 AAS
低級言語ならx64特化して構造化アセンブラみたいな感じで
ちょっとオシャレだけどやってる事はほぼむき出しのレジスタ操作みたいな?
310: 2022/08/03(水) 11:55:01.67 ID:GLMdE3Py(1)調 AAS
masm64でinvokeしまくれば
311: 2022/08/04(木) 05:27:08.29 ID:Xs8BUVRi(1)調 AAS
例えばループが多重化してループカウンタが複数必要な場合
作法としてRCXを使うけど、処理系が最適化で空いてるレジスタを割り当てたり
退避復帰をしつつRCXを使うとか
固定領域を確保してカウントに使用するとか自動でやってくれるみたいな
プログラムコードは雰囲気コーディングだけど最終出力は忖度された何かみたいな感じ
312: 2022/08/04(木) 18:25:34.25 ID:+TMVVsOn(1)調 AAS
アセンブリ並みの変態低級言語作る?
313: 2022/08/06(土) 14:07:02.72 ID:eSBCWCwI(1)調 AAS
Nim++
314: 2023/09/21(木) 12:59:48.22 ID:7twnyTUv(1)調 AAS
もうそろそろ、おしで祭りや
315: 2023/11/01(水) 03:29:10.04 ID:5z6NYMjm(1)調 AAS
Nim#
316: 2023/11/05(日) 10:42:59.68 ID:ol9bMVcc(1)調 AAS
Rust++
317
(1): 2023/11/05(日) 16:32:02.05 ID:M+aCXIKU(1)調 AAS
最近のCPUのアセンブラはほとんどCと変わらないようだけど
318: 2023/11/06(月) 06:07:34.02 ID:bdWb9xgB(1)調 AAS
昔のCはアセンブラとほとんど変わらなかったから
差は縮まっていない
なにも変わってない
319
(1): 2023/11/06(月) 16:20:14.87 ID:cmjYyIPB(1)調 AAS
最近はむしろC標準が直接サポートしてない命令が増えてるからな
ローテイトなんていまだにないし
320: 2023/11/11(土) 12:31:46.21 ID:fuGMacjx(1)調 AAS
>>319
良いのが入荷
動画リンク[YouTube]

321
(1): 2024/02/11(日) 03:12:32.56 ID:morq3qnL(1)調 AAS
>>294
Aカップが好きなアセンブラ君、食わず嫌いはいけません高級言語は恐くありませーん
Bカップが好きなBASIC君、少しは毛が生えたけどまだまだ修行が足りません関数に興味はないのですか
Cカップが好きな君は正解に限りなく近い。有象無象の言語はたくさん出てきたけれど結局Cが手ごろサイズで限りなく正解に近いです
Jカップが好きな君は煩悩に振り回されっぱなしです。たまには太陽だけでなく月にも興味を持ちなさい
322: 2024/04/19(金) 10:13:34.89 ID:uD5nyH4z(1/2)調 AAS
>>1
仮想アセンブラを作ることになるが、かえって誤ったハードウェアと勘違いしそうw
323: 2024/04/19(金) 10:14:46.38 ID:uD5nyH4z(2/2)調 AAS
>>317
アセンブラがわからないのに語る変なやつw
324: 2024/05/02(木) 01:06:39.68 ID:f54xPIPf(1)調 AAS
>>321
どうでもいい話だけど、J が Java のことを言ってるようにも見えるので
実際には J 言語てのがあるんだけどね
J はJava や JS とは全く関係ない、APL (という言語) の派生言語で
APL と違って特殊キャラクタを使用せず ASCII のみで記述可能にしたもの
325
(1): 2024/12/11(水) 21:59:47.09 ID:bqdEzJrv(1)調 AAS
>>1
そうして生まれたのがRust
Cと同じことが出来つつCの諸問題を解決した
インラインアセンブラも備えているのでCを置き換えられるようになった
326
(1): 2025/03/24(月) 12:24:27.59 ID:tWxitKr9(1)調 AAS
>>325
let bits = vec![false; 32];
これでbitsのサイズが4バイトになってくれるような仕組みはRustにありますか?
327
(3): 2025/03/24(月) 13:15:17.83 ID:a0wY9RFf(1)調 AAS
>>326
外部リンク:docs.rs がいいかな

use bit_vec::BitVec;

fn main() {
 // 32bit全てfalseで作成
 let mut bv = BitVec::from_elem(32, false);
 // 7bitおきにtrueセット
 for index in (0..32).step_by(7) {
  bv.set(index, true);
 }
 // 0, 7, 14 , 21, 28番目のbitがtrueになった
 assert_eq!(bv.get(0), Some(true));
 assert_eq!(bv.get(1), Some(false));
 assert_eq!(bv.get(7), Some(true));
 assert_eq!(bv.get(28), Some(true));
 // イテレータでtrueになってる位置のリスト
 let v = bv.iter().enumerate().filter_map(|(i, bit)| bit.then_some(i)).collect::<Vec<_>>();
 assert_eq!(v, [0, 7, 14, 21, 28]);
 
 // 内部構造は標準でVec<u32>を使っているのでu32が1つ分
 assert_eq!(bv.storage(), [0b_10000001000000100000010000001]);
 // バイト列にすると4バイト
 assert_eq!(bv.to_bytes().len(), 4);
 assert_eq!(bv.to_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001000]);
}
328
(1): 2025/03/24(月) 13:30:34.57 ID:S5TsEiko(1)調 AAS
CはPDP-11のアセンブラの高級言語化でしたっけ?
消えたアーキテクチャとは言え未だ有用ではありますが、現役アーキテクチャの8086-64やARMのソレとかの命令セットはどうなっているんでしょ?
多分基本命令そのものは大差ないと思うけど、マルチメディア拡張? MMXみたいな専用命令はCで直接記述出来ないですよね。
他にも、最近のナウいアーキテクチャは文字列をそのまま扱えるとか聞いて想像の範疇超えてます。
高級言語も楽で良いけど、そういうのは楽なアセンブラの上に構築出来ればそれで良いなあ。
329
(1): 2025/03/24(月) 19:01:49.54 ID:/lNBwDBZ(1)調 AAS
25年位前のレスのコピペかよω
330
(1): 2025/03/25(火) 03:40:11.48 ID:ztarSHRB(1/2)調 AAS
>>327
なんか左右逆で気持ち悪い(bigendian/littleendianともちょっと違う)
bv.set(31, true);
bv.set(32, true);
assert_eq!(bv.to_bytes(), [
0b_10000001, // 0-
0b_00000010,
0b_00000100,
0b_00001001,
0b_10000000]); // 32-
assert_eq!(bv.storage(), [
0b_10010000001000000100000010000001,
0b_1]);
331: 2025/03/25(火) 08:18:52.12 ID:viWlYIzm(1)調 AAS
>>329
すまない、オッサン通り越してお爺さんだから思想も古いんだ。
332: 2025/03/25(火) 08:41:39.56 ID:ztarSHRB(2/2)調 AAS
>>327
ありがとう。参考になりました。

多倍長整数の論理演算でbit立てる方法があったので、
それを使ったら簡単で速度もそこそこ出たので満足しました。
>>327 さんのものは不採用です。
333: 2025/03/25(火) 09:02:37.24 ID:4yBAp1pH(1)調 AAS
>>330
ビットはそういうものだよ
普通にビット演算すればわかる

let mut bits: u32 = 0;
for n in [0, 7, 14, 21, 28, 31] {
  bits |= 1 << n;
}
// u32に詰めているからこうなる
assert_eq!(bits, 0b_10010000_00100000_01000000_10000001);

// bit順(index=0..)にバイトで得る
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
334: 2025/03/25(火) 12:13:35.71 ID:2SmtLJ6z(1)調 AAS
assert_eq!(bits.storage(), [0b_10010000_00100000_01000000_10000001]);
の結果から想像するに
assert_eq!(bits.reverse_bits().to_be_bytes(), [0b_10000001, 0b_00000010, 0b_00000100, 0b_00001001]);
ではなく
assert_eq!(bits.to_be_bytes(), [0b_10000001, 0b_01000000, 0b_00100000, 0b_10010000]);
の方を期待するのは可笑しいのかなー
正直びっくりエンディアンですわ
335: 2025/03/25(火) 19:08:05.91 ID:d+t8RnIb(1)調 AAS
byteやword単位のリトルエンディアンじゃなくて
1bit単位のリトルエンディアンだと思えば自然
336
(1): 2025/03/27(木) 07:21:00.91 ID:vU3T1Sq/(1/7)調 AAS
Rustのオペレーターオーバーロードについて質問です
とりあえずtraitを使って
let a: X = X::new();
let b: X = X::new();
let c = a + b;
は出来たのですが
let a = &X::new();
let b = &X::new();
let c = a + b;
だと定義が無いと言われるのでtraitに&のバージョンを追加したら出来ました
ところが
let a = &mut X::new();
let b = &mut X::new();
let c = a + b;
だとまた出来ないのでtraitに&mutバージョンを追加したら出来ました
ところが
let a = &X::new();
let b = &mut X::new();
let c = a + b;

let a = X::new();
let b = &mut X::new();
let c = a + b;

let a = &X::new();
let b = X::new();
let c = a + b;
が全部出来ません
こういうのはすべての組み合わせをtraitで作っておく必要があるのでしょうか?
それとも一つの表現で全部定義してくれる仕組みは?
337
(1): 2025/03/27(木) 09:14:29.90 ID:vU3T1Sq/(2/7)調 AAS
これかな
外部リンク:stackoverflow.com
338: 2025/03/27(木) 09:22:10.62 ID:UV4Rce1I(1/2)調 AAS
>>336 >>337
ここに回答があるよ
外部リンク:stackoverflow.com
339: 2025/03/27(木) 09:56:58.93 ID:vU3T1Sq/(3/7)調 AAS
ああこれinternalなのね
macro_rules! add_impl とか
macro_rules! forward_ref_binop
(unop とか op_assign とかもあるけど)
340: 2025/03/27(木) 09:59:54.17 ID:vU3T1Sq/(4/7)調 AAS
これでいいのかな
外部リンク:crates.io
341: 2025/03/27(木) 10:02:25.16 ID:vU3T1Sq/(5/7)調 AAS
ああこっちか
外部リンク:crates.io

>>328
それは >>327 の中にリンクがあったので既視です??
342
(1): 2025/03/27(木) 11:15:21.43 ID:vU3T1Sq/(6/7)調 AAS
よさげだったけど&mutのが出来なかったorz
343: 2025/03/27(木) 11:35:25.37 ID:vU3T1Sq/(7/7)調 AAS
結局自前でmacroコピペして&mutの定義も追加したらいけたわthx
344: 2025/03/27(木) 11:46:57.39 ID:HDQeQZ5r(1)調 AAS
Copyトレイトは無闇に付けたくないな
345: 2025/03/27(木) 11:59:13.89 ID:JG6/gkrB(1)調 AAS
Trait爆発ですね判ります
346: 2025/03/27(木) 12:14:45.69 ID:UV4Rce1I(2/2)調 AAS
>>342
Addでは不変参照しか使わないから& mutは不要
& mutが必要となるのはAddAssignだがこれは& mut selfになる
347
(1): 2025/03/28(金) 09:26:28.67 ID:VPiwRdmL(1)調 AAS
Rust使ってても暗黙のCopyとかに無関心だと【超高速】名乗れなくない?
348: 2025/04/05(土) 10:41:53.71 ID:wy4OM/NR(1)調 AAS
包丁も食材も上手く使えないと料理は不味い
349
(1): 2025/04/06(日) 07:52:19.40 ID:IvdHyMZx(1)調 AAS
料理が上手なヤツはRustは使わない
350
(2): 2025/04/06(日) 23:21:04.80 ID:p+WNSwb1(1)調 AAS
>>347
暗黙のコピーが発生しまくる諸言語とは異なり
RustではCopyトレイト実装型のみ暗黙のコピーが行われるので最もRustが好ましい

具体的にCopyトレイト実装型とは整数値やポインタおよび不変参照であり
それらを用いた複合型は明示的にCopyトレイト実装することもできる

ちなみに整数値などがなぜ暗黙のコピーが起きても構わないかというと
CPUにとってそれらをポインタ経由で間接的に扱う方が遅くなるからであり値をコピーして用いたほうが速いため
351: 2025/04/07(月) 10:58:45.39 ID:fwcAlCQF(1)調 AAS
はあ…
352: 2025/04/07(月) 12:23:44.19 ID:yN1PvO54(1)調 AAS
>>349
マにだって料理が得意な奴はいるだろ
353: 2025/04/07(月) 14:31:02.06 ID:w0rhHNCz(1)調 AAS
>>350
お前レベル低過ぎ
黙ってろ
354: 2025/04/07(月) 14:50:26.71 ID:k98JYePi(1)調 AAS
>>350で合ってるでしょ
コストの係るものは明示的に.clone()しないとコピーできないし
コストの係らないものはCopyトレイトのおかげで.clone()しなくてもコピーされるよ
355
(1): 2025/05/02(金) 09:39:27.39 ID:k5bGwZZ0(1)調 AAS
Rustの最大の教訓は、どんな言語でも有名になればバカ(必ずしも頭が悪いわけではなく、本来その言語が想定しない用途に使おうとする奴も含む)が使うってことだろう
Rustの仕様はそれほど効率が重要でない分野でテキトーに使おうとすると無駄なコピーが増えたりしてかえって非効率になりがちな面がある
356: 2025/05/02(金) 18:23:29.41 ID:kIVCyVUc(1)調 AAS
>>355
Rustは明示的にclone()を呼んだりCopy実装しないとコピーされないから大丈夫だよ
暗黙にコピーされないから無駄なことをしていればコード見るとすぐバレちゃう
まともなコードは必要な極一部を除いてほとんど参照で渡されるね
ちなみに数値や不変参照(ポインタ)はCopy実装されてるため暗黙にコピーされるけどそれが一番速いから問題なし
357
(1): 2025/05/03(土) 12:05:28.26 ID:ekVKJoF2(1)調 AAS
最適化されることを主張するなら証拠を示すべきなのは当然だが、
コピーの最適化を前提にするのなら例えば安易にCopy実装したりcloneしたりすんな、
みたいな意識高い言説は多くの場合無意味になっちゃうわけだけど、Rustおじはそれでいいのだろうか
358: 2025/05/03(土) 13:36:23.13 ID:BbjMJMxS(1/3)調 AAS
>>357
頭悪いから違いを理解できないのか?
まずCPUのMOVE命令は全てコピーだ
だから数値や参照(アドレス)がCopy実装されていても何のペナルティも存在しない
むしろ数値や参照を参照で扱う方が間接となり遅い
次にCPUのMOVE命令は全てコピーだがコピー元が使われてなければ純粋なムーブと見なすことができる
そのため最適化が可能で例えば2回のムーブは1回に減らすことができる
これはスタック上の変数を扱う場合も同様でレジスタへMOVEした後にレジスタ間の演算で終わるならスタック上の領域は不要で最適化できる
359: 2025/05/03(土) 13:38:21.80 ID:BbjMJMxS(2/3)調 AAS
RustやC++のムーブも同じで一次的にはコピーをして元を使わないため最適化できる場合が多い
一方でプログラマがコピーやクローンを明示的にした場合は元が生きていて全く異なる
そもそも元も後で使いたいからコピーしているわけだ
だからムーブとは異なり最適化でコピーが消えることはない
もちろん後で使いたい場合はコピーして渡すのではなく参照を渡すのが正解だ
360: 2025/05/03(土) 13:39:26.21 ID:BbjMJMxS(3/3)調 AAS
したがってプログラマはコピーを可能な限り避けるべきである
暗黙のコピーが行われるプログラミング言語では意識せずコピーしてしまう
プログラムを見ただけですぐにコピーしてあることがわかる方が望ましい
RustではCopyトレイト実装した型のみ暗黙のコピーが起きる
前述のように数値などはその方が有利なので最初からCopy実装されている
ヒープを用いない型ならばプログラマは自由にCopy実装できるがコード上でそれが明示され読む側は気付ける
サイズが大きく参照で扱った方がよい型をCopy実装していればおかしいことがわかる
一方でヒープを用いていればCopy実装はできないがClone実装はできる
これはコード上でfoo.clone()とコピーすることを明示的に記述する必要がある
したがって参照を使えばよいのに無駄なコピーをしていればすぐにわかる
361: 2025/05/04(日) 11:58:45.22 ID:RkNPiBO2(1)調 AAS
区別できないバカなのか?
ムーブの時などを含めて実態がコピーになるといってもコピー元は二度と使われないのだから最適化できる

一方でclone()などはコピー元をその後も使うためにコピーしている
コピー元を二度と使わないならclone()の必要がない
そしてコピー元をその後も使うから最適化の前提さえ成立しない
362: 2025/05/05(月) 10:09:59.16 ID:20YqVkB+(1)調 AAS
RustはC++より描き易いけどC++からの置き換えには不適
RustはCより面倒だけどCからの置き換えには最適
363: 2025/05/06(火) 06:06:18.29 ID:JTtajrxW(1)調 AAS
低レベル言語の開発だよね?
皆さんの会話が高級すぎて戸惑いを隠せない。
OS記述も十分に低レベルだけど、ハードウエア操作はもっと低レベルじゃないかな?
364: 2025/05/06(火) 10:06:47.77 ID:K1Pjz07i(1)調 AAS
Rustで低レベルするとunsafeだらけになる
(悪いとは言ってない面倒臭いとは思う)
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.833s*