はてなキーワード: アセンブラとは
CPUをVHDL,Verilog,System-Verilogで書いたりした時もあった。
USB,HDMI,電池の充電制御,WiFi,自動車など色々やったが、コンピュータが遠くなっていく感じがある。
FPGAでCPUを書いてOSを起動させたとして、自分の普段の仕事環境が良くなるわけではない。
ソフトウェアでは次々と開発環境が良くなっていくし、自分で使いやすいようにカスタマイズもできる。
でもハードはそうではない。MS Officeは動くがメモリが4GBでカクカク。
作ったハードも自分達が使うわけじゃない。例えば100Gイーサ開発してもその恩恵は得られず1Gbpsが関の山だったりする。
Python,Go,R,C++,Rubyくらいになると書けるがどう動いてるかわからなくなってブラックボックス化する。
社会的には正しいのだが、自分が関わったハードと自分が書いたC/C++のコードを上位から呼び出すのはわかるが、
ハードが変わったらブラックボックスになる。ロジアナやオシロで見てわかるレベルであればいいが。
PandasのTime seriesが時間を扱えるのかと思っていると、ピコ秒が扱えない。
これは1例に過ぎないが、Amazonや本屋で新刊が出ると買って勉強し、ライブラリの公式ドキュメントも読んでいくが、仕事に直結しない。
クラウド使ってディープラーニングのやり方は沢山情報はあるが、CPU内蔵GPUでメモリ4GB+FPGAでやる情報なんてない。
https://en.wikipedia.org/wiki/X86_assembly_language#Execution_modes
Real mode (16-bit)
Protected mode (16-bit and 32-bit)
Long mode (64-bit)
Virtual 8086 mode (16-bit)
System Management Mode (16-bit)
https://software.intel.com/en-us/articles/introduction-to-x64-assembly
General Architecture
Since the 64-bit registers allow access for many sizes and locations, we define a byte as 8 bits, a word as 16 bits, a double word as 32 bits, a quadword as 64 bits, and a double quadword as 128 bits. Intel stores bytes "little endian," meaning lower significant bytes are stored in lower memory addresses.
今どきアセンブラとか使ってないと何度言えば
成分分析機にかけて、成分を割り出して
パウダーで合成して作り出すってどうなの?
っておもうけど
食べに行って参考にするのも大差ない
同じように
他人のプログラムをリバースしてマシン語を取り出して改造するのはどうなの?という
もちろんアセンブラでもらっているとかなら別だが
計算量N*Nと2Nが
N=2以上であれば2Nのほうが速く終わるが
メモリがたりなくなりSSDがたりなくなりさらにHDDに書き出してとなると
どんどん遅くなっていく
逆にすさまじく小さい場合何が起きるかはN=1のときの例外として考えてみてほしい
ちなみに、コンパイルオプションには速度優先コンパイル(コードが長くなっても高速なアセンブラを書く)とサイズ優先(速度が遅くなっても短いコードを書く)がある。
各種書名検証、連鎖証明、まんがいち秘密鍵が漏洩した場合の対処
さまざまなコンパイルフラグ DEFINE、アセンブラレベルでの柔軟性、ヒープ対処
レアケースだし、環境に依存するから特定のメーカー向け意外にはOFFになっている
バケツソート(バブルソートを含むとする)のような単純なソートプログラムを例にとっても
N=1,Bigのときは例外となる。プログラム教育ではこういう例外は良くおきるので準正常系のようなものだが、慣例的に例外と呼ぶ
どうように1,1,1,1、のような偏りの大きいデータにたいしてもソートプログラムは特異な処理時間を必要とする。
ソートは、そのデータの量や質、大きすぎる、小さすぎる、偏りが大きすぎる、小さすぎる
などによって、一般的に言われている特性とはことなる特性を示す。
データや偏りが小さいときはコンパイラなどの最適化により、さらに異なる特性を示すことがある。
一般的にはコンパイラの最適化は気にする必要がないが、こういう例外にはなりやすいので、納品などがある場合は1度確認しておいたほうがよい(アセンブラレベルでコード確認など方法は任意
https://b.hatena.ne.jp/entry/s/jp.quora.com/hotondo-no-puroguramingu-gengo-de-kansuu-no-return-ga-1-tsu-shika-deki-nai-no-ha-naze-desu-ka を呼んだんだけど、回答・ブコメともにとんでもないことを書いている人がたくさんいてびっくりした。本質的に多値返しは直積型の返しと同じで、これはタプル・構造体と本質的に同じ、というのは多くの人が指摘している通りではあるのだが…。
動的型付け言語に慣れてらっしゃる方が多いのかもしれないけれど、配列というのは「同じ型をまとめた型」であるべき。動的型でいろいろ突っ込める配列は本質的には「直和型の配列」と思った方がいいよね。多値返しという意味では(記憶領域の面で)余分なコストがかかりうる直和型を選択する意味はないですよね?回答でもなんか配列返しに言及している某有名人がいたが、あれれ?という感じ。
もっとも、immutableな配列をtupleと呼ぶPythonという言語があるせいで引っ張られている感は否めないけども、配列とは本質的に異なる型が存在しているのは明らかですよね?配列と構造体って違うよね…?(言葉の定義の問題と言われそうだけれど、型システムの分野での言葉の定義は存在しているわけで、反論になっているとは思えない。『俺は明日からこのわんわんなく動物をネコと呼ぶから』と言っているようなもんでは。)
確かにナイーブにはレジスタに入れて返すのが素直だというのは同意するけど、でもそれ構造体と一緒だよね?昔のCではこれはできなかったというのは知らなかったので勉強にはなりました(未検証だけど)。
あと構造体返しの関数がどう機械語で実装されているのか知らなさそうな人がいるのにはちょっとびっくり。それでなんでレジスタがどうとか言えちゃうのかしら。構造体の値を返す関数ならばポインタは返さないですよ。そのポインタはどこを指してるんですか。実装しづらいとか何とか言ってる人たち、ちゃんとアセンブラ読んだことあるんですか…?本質的に何の困難もないです(ちなみに少なくともlinux amd64ではスタックに領域を確保してそのポインタを関数の引数の一部として渡します。まあヒープに置く場合でも余計なmoveが出ないようにしたいとかあるかもだけど、そんなでかいデータは普通無名構造体では扱わないでしょう)。
確かに、返り値の型が(A, A)のような場合はドキュメント読まないとわからなくなってしまうので可読性が下がるし構造体を使うべしというのは(ほぼすべての場合において)同意(多値は使いづらいというのは構造体は使いづらいという意味ではないですよね?)。でもさ、某有名人もgoで挙げているけれど多値って普通(A, B)みたいに違う型の値を返したくなることの方が多くないですか。この場合どっちがどっちかは自明だよね?ただの無名構造体だよ。多値返しは設計が甘いとかわけわからんことを言っている人もいたけれど、なんかこちらが不安になってきた。
…本当に意味不明で驚いた。id:megumin1氏が言っているように、tupleのパック・アンパックに余分なコストをかける必要はない(まあアドレス渡しになるから複数本のレジスタで返すのと比べたら余分なmovが入りうるという話はあるけど、この人が多値返しというので何を想定しているかわからないので何とも。)。何遍呼んでも多値返しとtuple返しの違いが判らなかった。おそらく前述のようにimmutableなlistのことをtupleと思っているのかな?と予想はするが…。
はてな界隈ってエンジニア的な印象があったんだけど、ここら辺の話ってそんななじみないのかな…?てか某有名人氏も型システムとかあんまりご存じないのかな…?むしろこれは増田が無知なんだろうか…?