元ネタ
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」
http://blog.sumyapp.com/2013/07/no-recommend-rails/
なぜかみんな「シーってイケてる技術だよね」「シーっだったらこんなこともいとも簡単にできちゃうんだよね」みたいな印象を持っている。もちろん、それは間違いではない。フォートランは早い。ライブラリもたくさんある。弾道計算なんて昔は数人月かけて作ったものだが、いまはmath.hなんて使えば、1人日で出来てしまうほどのものだ。
自動車のABS(アンチロック・ブレーキ・システム)なんかとは全く違う。ABSはあくまでブレーキがロックしてしまう事象を発生しないようにアシストしてくれるシステムである。
Hello worldと出力しようとした場合下記のようなコードが必要になる。
#include<stdio.h>
int main(){printf("hello world!");}
これをコンパイルすると、
.file "hellowrld.cc"
.section .rodata
.LC0:
.string "hello world!"
.text
.align 2
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.globl __gxx_personality_v0
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zPR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x6
.byte 0x3
.long __gxx_personality_v0
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-54)"
.section .note.GNU-stack,"",@progbits
これは尋常ではない。まるで核ミサイルの発射スイッチのようである。
核の発射スイッチはむしろまだ単純だ。押したら破裂する。結果が明白である。
.text
.global _start
_start:
movl $len, %edx
movl $msg, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
movl $0, %ebx
movl $1, %eax
int $0x80
.data
msg:
.ascii "Hello World\n"
len = . - msg
こう書けばすむ話である
movl call leave
どれもプログラマにとっては当たり前のキーワードだが、%eaxって何?って人がほとんどなのではないだろうか?
一体、「高級言語勉強してます」といった人の内どれだけが、この自動生成された各種のコードを理解しているのだろうか?
「高効率」「最先端」みたいなキーワードに踊らされている初心者が多すぎるのではないだろうか?
K&Rの頃はまだよかった。まだその程度の機能量ですんでいた。
C99なんて狂気の沙汰だ
自動化は「既にルーチン化できるようになったもの」に対して行うべきだ。未知のものを自動化するのは狂気だ。
この記事にぐさっときた人、プログラミング初心者にとっておすすめしたいのはこの書籍だ。
というわけで、本記事のまとめ。
- つけびして
- 煙り喜ぶ
- 田舎者