加速する日本人のアセンブラ離れ 84
ストーリー by Oliver
ケーキがあってもパンを食べればいい 部門より
ケーキがあってもパンを食べればいい 部門より
kitaj 曰く,"Technology Todayによれば,日本ではアセンブラ言語への関心が薄れてきているらしい.その理由は「高級」言語の高級とは技術的に高度であることだと勘違いしていることと、情報処理技術者試験のCASL程度では実務に全く役立たないからとのこと.perlやruby,VB,javaのような便利なプログラミング言語が充実してきたこと,CPUが昔と比べて随分複雑になったことも原因かもしれない.昔は「アセンブラでコンピュータの仕組みを理解し,PASCALで構造化プログラミングを覚えてから,Cで実用プログラムを書く」とか言ったものだが,もはやそのような時代ではないのだろうか.MASMやTASMで.ifとか.whileのようなマクロを書いていたあのころが懐かしい…"
実務で直接使わなくても、やはり一度は床を這いずり回る様なアセンブラプログラミングを体験し、フォン・ノイマン型の仕組みと制約を我が身に感じなければいけないと思っているのだが、old-typeなのだろう。情報技術者の一般教養としてアセンブラは現在でも必要なのか?独学の為の教材としてはどんなものがあるのか?
Re:アセンブラより重要なものがある (スコア:3, すばらしい洞察)
俺は信じられないなあ。
フラットで一般的なモデルであるメモリイメージの概念の理解は必要ではあっても、
フラットでもなければ一般化もされてないCPUイメージは関係ない(!)ですよね。
それこそ言語の高級度とか抽象度の問題を「理解」していれば、
その無関係さはみんな気付きそうなもんだと思う。
というか、汗かけるかどうかとかいう次元じゃなくて
上記の抽象化された次元の視点(手前味噌で御免)のほうが
役立つと思うんだよな。今たまたまデスクトップよりモバイル
という時代になった(ほんとかよ)からって
慌てて汗そのものに手を出すってのも、
随分浅薄な心の動きだなと思う>そういう主張する人々
分解すれば本質わかるってものじゃないのは
大昔から諺とかで言い尽くされているはずなんだが。
少なくとも、「低級方面の本質」とは別に
「高級方面の本質」が存在するわけで、
たとえば今時OOP判らないなんて奴ぁどうしてくれようか?
とか思っちゃうわけです。そっちもまた「本質」なのですから。
ところでアセンブラが欲しいなら
gccのアレとかNASMとか
色々なFREEのアセンブラが有るわけですよね。
わざわざMやTに依存する必要なし。
これから実際のアセンブラをやりたいといっても
MやTなどの正に現存するアセンブラ(の文法とか)に
拘泥するようじゃ、先が見えてる(文字通り)わけで。
The Art of Assembly Language Programming (スコア:2, 参考になる)
機械語がどのように実行されるかを理解しないでの デバッグは困るだろうし、 setjmp/longjmpの動作も理解できないでしょう。
やはり、今でもこれくらいでなくちゃ。
The Art of Assembly Language Programming
http://webster.cs.ucr.edu/Page_asm/ArtOfAsm.html
アセンブラより重要なものがある (スコア:2, 参考になる)
アセンブラを経験したほうがよいか、という問いかけなら答えはもちろんYESだと思いますが、Javaよりアセンブラのほうが役に立つか、とか、C++の前にはかならずアセンブラとCを勉強すべきか、とか聞かれればNOでしょうね。習得すべき言語はたくさんあり、時間は限られているので、結局は選択の問題になります。
私はアセンブラを知らなくて困ったことはありません。
部門名はきっと逆で、 (スコア:2, 参考になる)
もちろんその結果(プログラムの)太りすぎに悩む訳ですが。
戯れ言はそのくらいにして。
今でも、機械語レベルでのメモリアクセスについてある程度分かっていないと、
Cのプログラムはうまく書けないし、人の書いたものも読むことが
難しいように思えます。
特に初心者プログラマがポインタの概念を理解するのに手間取るのを
見ていると、アセンブラ勉強しとけよ!と言いたくなりますね。
書けなくてもいいけど (スコア:2, 参考になる)
PDAや組み込みといった、極小のプログラミングが
要求された場合、コンパイラが生成したコードを
チェックできる力量は欲しいと思う。
なかなか、最新のMPU相手に、直接手で書いて効率
を上げるのはむづかしいと思う今日この頃。
Re:アセンブラより重要なものがある (スコア:2, 参考になる)
C言語とポインタと言えば、
配列とポインタの完全制覇
も参考になります。
-----
fgd@最近勉強し直しちゃったのよ
Re:アセンブラより重要なものがある (スコア:2, 参考になる)
「コンパイル」という作業がなぜ必要かわからない学生はいるようです。
コンピュータは高級言語をそのまま解釈して実行していると思ってたらしいです。
#別にそれまでインタプリタばかり使っていたわけじゃないんですが。
コンピュータはマシン語を解釈して実行するってことが実感としてないんじゃないかなと思います。
#といってる私も今学生ですが、こういう同級生が何人もいたんで。
#私の周りのごく一部だけに当てはまる話かもしれませんが。
だから、アセンブラorマシン語をちょっとでも触れる必要はあると思います。
高級言語しか使っていないと、こういうことを考える人が出てきてもおかしくないと思うから。
--S0R5
アセンブラ vs 高級言語 (スコア:2, 参考になる)
個人的にはmc68000のアセンブラを長い間やっていたので、Cのポインタやインクリメントといったことを覚えるのになんの苦労もなかったですね。
ただし、アセンブラを覚える必要があるか?というと、「本物のプログラマ」だったら何種類かのアセンブラは使えるようにならないとね。
もちろん、私は本物ではないのでいまではJavaScriptですら、組みたいとは思っていませんが....
nobuo * Who's gonna die first? *
理解を助ける言語 (スコア:2)
アメリカでは結構カリキュラムに組み込まれている場所が多いよ。
最近はOOPをしこむ為にJavaもどんどん教えるようになったなあ、、、。
There is no spoon.
Re:昔は… (スコア:2, 参考になる)
>
> 1.BASIC でプログラムを始めて
> 2.速度に不満を覚えてアセンブラに手を染める
>
> というパターンでした. こんなパターンでアセンブラいじり始めた人も
> きっと多いはず.
懐かしいですね。私も昔、Hu-BASIC とか N80/88-BASIC (ふ、ふるい)で、何
がしかゲームを作っていたのですが、画面周りは遅すぎるので、ハンドアセン
ブルで作ったコードをBASICから呼び出していました。
今じゃ、OOPができる言語でも、そこそこ動いてくれるので特にアセンブラで
チューニングなんてことはしません。富豪的プログラミングですか。
でも、DVDの再生とか、そのあたりはいまだにアセンブラの世界ですし、Cは
アセンブラしらんと理解しにくいだろうし、なくならない分野ですよね。
アセンブラは高級言語である。 (スコア:2, 参考になる)
高級な頭を必要とするからだったかな。
「情報科学者」というくくりを出すなら必須でもいいと思いますが、
プログラマーに必須かっていえばなくてもいいかな。
-- Che Che - Bye Bye
Re:アセンブラより重要なものがある (スコア:2)
Re: 日本人だけ? (スコア:2, 参考になる)
Chapter 0 にはこうかいてある。
> ... the vast majority of UNIX users (including one of the authors of
> this book) do not even know the PDP-11 assembly language.
つまり、Brian W. Kernighan 氏は PDP-11 のアセンブラ言語を知らなかった
のである(PDP-11 用 C コンパイラの開発者である Dennis Ritchie がアセン
ブラを知らないわけがないので)。awk の開発者ほどの人でもそうなんだから
(しかもこれは20年以上前の話だ)。
というわけで元記事の指摘は「何をいまさら」。
無論、コンパイラ屋やOS屋、組み込み屋にとっては必須の知識。だが一般のプ
ログラマにとって必要とは思わない(人材不足のおり、アセンブラやれなどと
いうと辞められてしまう)。
Re:アセンブラより重要なものがある (スコア:2, 参考になる)
仕事仲間にはアセンブラの素養を持たない人も多くいますが,それで困ったことは全然ありません.必要のない人は知らなくても困らないし,必要の生じた人は皆あっという間にマスターしてしまうので...
むしろオブジェクト指向やデザインパターンなど「高級」な概念を身につけていない人から直接/間接的に迷惑を被ったことの方が圧倒的に多いので,「アセンブラなんかやっている暇が合ったら,そっち方面の勉強をしてくれ!」といいたい.
プログラマ歴20年のおじさんである私でも,この話題は古臭く感じるなあ.「アセンブラ」を「C」に置き換えた方が,いまどきのテーマかも.
------
Yoshige
コンパイラになったつもりで (スコア:2, 参考になる)
プロセス制御用ミニコンに実機コンパイラはなかった。
工場の大型計算機でクロスコンパイルしたバイナリを入れて出荷した後は、
現地でのプログラム修正手段はパッチしかなかった(今の/usr/bin/patchではない)。
ハンドアセンブルしたコードをコンパイラが生成したコードに埋め込むのである。
当然ソースコードは常に保守するのだが、
パッチのあたったコードと完全に同じコードが生成できるように
ソースを維持することが求められた。1バイトたりとも違いは許されなかった。
修正したソースコードはコンパイラに通しバイナリにした後、実機コードと比較された。
製品として出荷されたシステムは1バイト単位で管理されていた。
たいていの場合、ソースの保守は新入りの仕事である。
当時のシステムの多くはもう存在しないが、完全になくなったわけではない。
今も世界のどこかでパッチをあてているプログラマがいるはずだ。
昔は… (スコア:1)
私の場合は
ちなみに,パソコン買って,最初に打込んだプログラムはセルフアセンブラだったりしました (^^;;
最近は,というと,この前,ARM のブートストラップローダをアセンブラで書いたぐらいかなぁ.
追加の情報源 (スコア:1)
http://www.nk.rim.or.jp/~jun/lxasm/asm00.html
http://www.web-sites.co.uk/nasm/
Re:アセンブラより重要なものがある (スコア:1)
ノイマン型の機械がどの様に動作するのかを知るにはもっとも効果的だしこれを知っているか知らないかでCのポインタの理解にかかる時間はとてつもなく違うと思うのだが。
何しろ機械の上ではこれ以上分解できない生のコードなのだから。
ってこう思うこと自体Old typeなのかもしれない。
もうすぐ四十郎
Re:アセンブラより重要なものがある (スコア:1)
Re:アセンブラより重要なものがある (スコア:1)
確かに知っててもらわないと仕事する上で困るけど,それは言語というより設計手法として意識されるのではないだろうか.
たとえCやアセンブラ使ってもOOP知らないとくさったプログラムになってしまうと思うんだ.
そういう意味からするとアセンブラというのはプログラムを書く対象をどこまで理解できるか,またたとえ高級言語で書いたとしてもプログラムの動作イメージを理解できるか,といった部分にかかってくる一つの指標となるのではないだろうか.
もちろんアセンブラなど知らなくて上記のような事ができる人が多いと思う.
masashi
機械語に触れて世界が広がった (スコア:1)
NaruTo は小学生の時、
「ある日家にパソコンが来た」だったが、
ろくに勉強せず、「ナイコン族」を
尻目にゲームばっかしして遊んでいた。
大学生の頃に CASL を一応やった。
しかし、今一ピンと来ていなかった。
大学院に居たときに
「Programmer's Page」という雑誌
(「DB Magazine」はこれの子孫(爆))
で「石から初めるプログラミング」で
機械語の設計をしてみるという記事があり、
そこで
「1Byte がアセンブラの 1命令ではなく、
さらに中で数bit毎に分かれている」
と初めて知った。(爆)
それから16進数の数字の羅列が
「プログラム」だと感覚的に理解し、
(読めるようになったわけではない)
かつて BASIC のプログラムで「DATA」文で
数字を並べていた部分の前に注釈(REM)として
「機械語ルーチン」と書いてあった意味を
やっと理解できたし、
ゲームのプログラムをトレースして
画像の一部を上書きするルーチンを
Skip する改造をしてみたり、
VZ Editor で、アセンブラが生成した数字の羅列を
マクロに埋めこんで利用したり
(VZ のマクロに機械語ルーチンを呼び出す機能があった)
できるようになった。
これでも、もう8年ほど前の話になるので、
今では「アセンブラ」・・・というより、
「機械語」に触れて世界が広がる・・・て場面は
少なくなったかもしれませんが・・・。
マクロの基本は検索置換(by y.mikome)
Re:昔は… (スコア:1)
当時は16bitの国民機PC9801がありましたけど、親にねだっても買ってもらえるわけでなく、
MSXをなんとか買ってもらい遊んでました。
z80のOR AとかLD、JPなど懐かしく思います。:-)
今ではPerlとshでほとんどすんでしまうようなプログラムしか書かないケド。
- indy
Re:アセンブラより重要なものがある (スコア:1)
- indy
今から教養として触ってみるとして。 (スコア:1)
普及率でいえば x86 なんでしょうけど、それもなんだかなぁと思わないでもない。
おれ自身はその昔 Z80 でハンドアセンブルしたり M80 の上っ面をなめたりしたことがあるきりです。
趣味でもお仕事でも x86 でプログラムを書いたことはないので、メモリモデルがどうのセグメントがこうの、という話は知らずにすんでます。
Re:アセンブラより重要なものがある (スコア:1)
アセンブラ自体を知っていたりする必要性はそれほど無いのかもしれない。情報技術者の一般教養として求められるのは仕組みであって、アセンブラも少し勉強すればその理解がより深いものになる、といった感じでは?
私は ょゎょゎ なんで、インラインアセンブラをちょろっと使っていた程度ですが。面倒だし。(笑)
C言語で、特にポインタの理解に関してはアセンブラの知識が役に立ったのはたしか。でも、必須とまでは言えないかも。
HIRATA Yasuyuki
Re:今から教養として触ってみるとして。 (スコア:1)
あとで、うまくいかなかったのはコンパイラのバグと判明したらしいんですけれど。
もしかしてハンドコンパイルというのかなあと思いましたが、その昔はそこそこあった出来事だそうで、すごいなあと思いました。
ボクはもうPerlをちょこっとしかわからない(困ったら兄に泣きつく(笑))ので、もう尊敬するお話です。みなさんすごいですね。
-------- SORAMINE Yukino
Re:アセンブラより重要なものがある (スコア:1)
選択の結果、低級を選択する人の割合が少なくなり、高級を選択する人の割合が多くなったということでしょう。
#絶対数ではどうなのか&&外国と比べてどうなのかは分からないけど。
> 私はアセンブラを知らなくて困ったことはありません。
個々の人を見た場合、その人が高級指向なのか低級指向なのかは他人がとやかくいう問題でもないしどちらでも構わないんですけど、例えば日本という地域で括ってみた場合に(昔と比べて)高級試行に偏っているということですよね。
今の時代、アセンブラが役に立つ場面って大抵ニッチな市場で需要がないのも確かですけど、だからといって日本全体でそういう市場を切り捨てていくのもどうかと。
Re:今から教養として触ってみるとして。 (スコア:1)
元ネタには『現実のパソコンを見てみると、ほぼ9割がインテル系のCPUが搭載されていて、インテル系のアセンブラをマスターできれば実務にも直結するが』と書いてあるけど、どうなんでしょう? > 実際にアセンブラを使われてる方
Windows|PC-UNIX on x86 で実務にアセンブラを使うことなんてめったになさそうなんですけど。。
言語、っていうかマイコン (スコア:1)
「Z80互換マイコンが載った評価ボードを買っておいで」と言うほうが、真意が伝わりやすいと思いました。
… 中古のMSXを買ってくるほうが手軽でいいかな?
Re:アセンブラより重要なものがある (スコア:1)
>フラットでもなければ一般化もされてないCPUイメージは関係ない(!)ですよね。
>それこそ言語の高級度とか抽象度の問題を「理解」していれば、
>その無関係さはみんな気付きそうなもんだと思う。
メモリイメージの概念を理解するのに一番優しいのがアセンブラだと言う認識なんだが、それではだめなのかな?
経験上、抽象度の高い言語しか知らない新人が持っている低抽象度言語への心理的負担を砕くのはやはり一番低いところを見せると教える方が楽だというのがあるのだ。
私は言語なんざ問題領域の記述に一番適しているものがそのときのベストチョイスなだけで、コードを書くのはどの言語も変わりないと思っているけど。
(でもクライアントの要望の方が優先されるのでしなくても良い苦労をすることはある)
4bitマイコンのソフトをアセンブラ以外で?? (スコア:1)
要らない人には要らない様に見えるけど、コーディングしてるときの安心度が微妙に違うような気がする。
Re:昔は… (スコア:1)
小学生の頃、ジャポニカ学習帳にハンドアセンブルしてました。Z80。
相対ジャンプのところを四角書いて空けておいたりしてて今見るとカワイイっす。
日本人だけ? (スコア:1)
これって日本だけなんですかね?
欧米でもアセンブラと縁のない人は増えてそうな気もしますが...
個人的にはPC上で普通に動くものなら移植性の高い高級言語のほうがいいと思いますけどね。
ごにい(ろぐいんするのなんかげつぶりだろう)
Visual Assembler (スコア:1)
Visualにしたからといってアセンブラに人が集まるとは思えないけどなぁ。
#VC++とかC++Builderってアセンブラついてないんでしたっけ?
Re:書けなくてもいいけど (スコア:1)
仕事でVC++を使っていますが、デバッガの「混合モード」(C++とコンパイル後のアセンブラコードの混在表示)とレジスタの内容を見て、「あ、ここが間違い」ってことが結構ありました。コンパイラの誤動作を発見したこともあります。
こういう場合、必須ではないのでしょうが、便利だと感じています。
相対ジャンプ (スコア:1)
Re:アセンブラは高級言語である。 (スコア:1)
「Cは構造化アセンブラである」とも言いますね。だれの言葉でしょうか?
たしかに、Cのポインタが難解だと言われているのは、アセンブラの単純明快な間接アドレス表現をオブラートでつつみまくったからかもしれない。(というか、ハンドアセンブルから入ったぼくにとって、MASMのラベルですでに、なぜこんな混乱をまねくようなことをわざとするのだ、と不思議に思ったものです)。
ちなみに、ぼくは、Cのポインタが難解だという人のことを理解できないでいます。なぜあんな単純なものがわからないのか。
Re:4bitマイコンのソフトをアセンブラ以外で?? (スコア:1)
その点、VB って、とっても不安だったりする。(笑)
Re:昔は… (スコア:1)
1. BASIC
2. FORM(Tiny FORTRAN Compiler)
3. アセンブラ
です。
#当初使ってた機種がばればれですね。(^^;
その後、VIC-1001に使用機種が変わって、
私の場合、1982年ごろにCSALのターゲット仮想コンピュータCOMETの前身である COMP-X仮想計算機をハンドアセンブルで作ったことがあります。
これが、後のJAVAや、FORTH等の仮想計算機の理解に大変役立ちました。
また、スームーススクロール機能や、これを応用した。カウンタを作ったりして遊んでました。
#あんまり完成したアプリケーション(含むゲーム)プログラムは作ったことないです。(^^;
コンピュータの動きを知るには、マシン語(ニーモニック表記)を理解することが、
一番良い方法のはずなので、みんなには、かならず一度はアセンブリ言語に手を染めてもらいたいと思っています。
#最近のプロセッサは、複雑になり過ぎた嫌いがあるので、大変でしょうが…。がんばってください。
masamic
Re:書けなくてもいいけど (スコア:1)
でも、「極限」ってのは、バイナリ直読みのことだよねぇ。やはり。
Re:機械語に触れて世界が広がった (スコア:1)
> 画像の一部を上書きするルーチンを
> Skip する改造をしてみたり、
昔のものは原画はモロ書きで、後から上書きするっていうのが多かったですからねぇ。隠しコマンドで外れるっつーのもありましたな。(しみじみ
オフトピックですが一応突っ込んどくのが礼儀かな、と。……もしひとりで勝手に勘違いしてたらごめんなさい。(m0m
勝つて言はず、敗れて語らず、
謙譲を崇ぶ者は君子也、怨怒を起す者は小人也。
Re:言語、っていうかマイコン (スコア:1)
そのほうが手になじむような気がする。
IO関係とか実際にはハードに依存するわけだし。
Re:アセンブラより重要なものがある (スコア:1, すばらしい洞察)
OOP がスケールしないようなところに OOP を当てはめようとしてもダメだし、アセンブラがスケールしないところにアセンブラを適用しようとしても、やっぱりダメ。
そういう愚を避けるためには、幅広い知識が必要だし、結局は経験と勉強がモノをいう、というだけの話だと思います。エンジニアリングには王道はないんですな。
Re:アセンブラより重要なものがある (スコア:1, すばらしい洞察)
Re:アセンブラより重要なものがある (スコア:1)
そうですかぁ?
アドレシングモードがどうだとかこうだとか、
あとCPUごとに概念自体のバリエーションが多すぎとか、
結構優しくないと思うんですが…
高低について高所恐怖症のようなアナロジーが
引き合いに出されたように読めた(勘違いだったら御免)んで
こっちとしては深海のイメージで捉えてるということに
しときます(笑)。一番下って深海で凄く怖いじゃんというか
更に下のハードはどうよ?というか(^^;
>しているものがそのときのベストチョイスなだけで、コードを書くのはどの言語も変わりない
ええと。自己矛盾してますよー
本当に変わりないならチョイスする必要もないんだけど。
Re:アセンブラより重要なものがある (スコア:1)
>Javaにはポインタ自体ありません
それこそ完全制覇本などの無数の本/人に言われてることだけど、
ポインタと参照は似ているような似ていないような概念なんで、
あっさり「Javaにゃポインタありません」と言って大丈夫な文脈と、そうでない文脈とが、あると思います。
>アセンブラを知らないと理解しにくいポインタは使うべきでない
というのが、
>「アセンブラを知らないと理解しにくいポインタ」は使うべきでない
という意味なら同意します。
>「アセンブラを知らないと理解しにくい」ポインタは使うべきでない
ならば大反対します。
どっちの意味(というか旨く表現できないなあ御免)ですか?
少なくとも、
ポインタつーか参照(C++ローカル用語のじゃなく)は、
ないと話にならんでしょう。
さもないとデータをコピーしまくる羽目になり、
効率も落ちるし「同一性」問題にも悩まされる。
Cとか(まして汗とか)のポインタそのものは
厄介な面も有るけど、一般的に参照そのものが
持つ程度のパズル性(?)は、これを解ける能力がない奴に
プログラム(本番)をさせたくないなあ。
ほんとにそうなの? (スコア:1)
ほんとに汗離れで高級偏重と呼べる状態なんですか?
高級言語のほうにしたって、
主だった高級言語は異国で生まれてるわけだし、
それを活かした方法論とかも多くが異国から。
あとユーザーベースは…どうなんでしょうね…
あんまり語るに値するという感じも受けないんですが。
高級言語のほうも低級のほうに負けず劣らず落ち目、
と解釈するほうが、まだしも現実的なんじゃないか?
という妄想に駆られるんですが、どうなんでしょう?
というか昔の日本は、そんなに言うほど
低級分野において「優れて」いたんですか?
言いかえれば異国と交流して優れてると判定できる状態
だったのですか?
参考書 (スコア:1)
いざ、勉強しようとして本屋へ行ったところ、参考書がみつからなかったことがある。しかたなく、図書館をいくつか回ってやっと、(当時)10年くらい前に出版されたボロボロの本をみつけたのだが、最近はどうなっているのだろうか。少なくともこの状況が改善されている雰囲気はなさそうだ。
もちろん、古い本だから必ずしも駄目だということはなく。また、みつからなかったのは私の生活環境と探し方に問題があった可能性も大きいのだが。
char *A;
モータースポーツ部 [slashdot.jp]
Re:アセンブラより重要なものがある (スコア:1)
# mishimaは本田透先生を熱烈に応援しています
Re:アセンブラより重要なものがある (スコア:1)
しかたがないのでアセンブラを離れて言うと、Cのポインタがわかりにくくなるのはポインタが指す実体を関数間で持ち回っているような場合ですね。関数Aで宣言したポインタを関数Bに渡して、そこでポインタが指す実体をアロケートして返す、というような。
C++ならそういうことをする必要はあまりないと思います。