はてなキーワード: コンパイラとは
素人で調べたところだと、
こんな感じで普通の人が知るのは難しそうだ。
お絵描きやプログラミングなど、創作系の趣味において、自分が欲しいものがなかったり、あっても不満だったりすると、「自分で作ってしまおう」というのは一番ありがちな動機
自分で作ろうと思った時に選択するツールがアナログ画材なのか、液タブなのか、AIなのかの違いなんてその時点での目的の達成しやすさの違いでしか無いじゃん?
曲作りたいなら打ち込みかもしれないけれど、モテたいが目的なら自分でギターを弾くじゃん?
手作業の温かみなんて求めてハンドアセンブルで手動最適化なんてせず、コンパイラの自動最適化のほうがよっぽど高度に最適化してくれるじゃん?
基本情報・応用情報試験みたいなのとか、CPUの仕組み、コンパイラの実装、分散システムやデータベースとかそういうエンジニアリングガチ勢みたいなのをイメージして大学でCSを学ぶとけっこうショックを受けるぞ。
俺の知ってるCSは、チューリングマシンの表現能力とか停止性問題とかYコンビネーターとかチャーチ数とかの世界で、コンパイラといってもε-CLOSUREみたいな話をじっくりやる感じ。
具体的な話が全然出てこない数学の一ジャンルってイメージかもな。
競技プログラミングみたいなアルゴリズムもそれほど時間をかけない。ベイズ推定をギリやるかどうか。
そういう知ればすぐ身につくものよりも、めちゃくちゃ考えて濃厚なパラダイムを時間をかけて吸収するような学問だった。
で、そんなCSを学んで直接役に立つのは多くの人の場合計算量のオーダーとかくらいかも。
モナドみたいな概念に抵抗なくなるとか、ラムダ式の意味を深く理解できるというのもあるけど、それSIとかWebやスマホアプリの開発業務で必要かというとね。
賢い人は、ちゃんとSNSのユーザー同士の関係性とかレコメンデーションみたいのにもCSの知識を応用できると思うけど、一般人は賢い人が作ったライブラリを使う側だよね。
構文解析は勉強したことないとまずわからないよね。でも趣味でやる人たちもいるくらいだから、ひと通り学べばどうってことはないんだけど。(コンパイラを作るとかなら話は別だけど)
無粋なツッコミをしとくと
この辺はいわゆるコンピュータサイエンスの範疇じゃないよね。特に4つ目。
コンパイラを作るための理論とかはコンピュータサイエンスの範疇と言っていいだろうけど
申し訳ないが、コンピュータサイエンスを履修せずにプログラマーになった人に多いのは
まずそもそも困っていることに気付けていないのでスタートラインに立ててない
スラムダンクでいうところの「下手くその 上級者への道のりは 己が下手さを知りて一歩目」というやつだ
ちなみにコンピュータサイエンスってのはオーダの話だけではなくて
例えばメモリとCPUキャッシュ、スワップなどのスピードやその使い方、コンパイラによる最適化、OSのリソース共有、状態管理の考え方なんかも含まれる
性能をもっと上げたいっていうときにオーダだけじゃなくてそういうことを網羅的に考える必要がある
ところがそもそもコンピュータサイエンスを履修してないと「性能向上が必要かどうか」を分かって無い人が多い
「これ、1秒で処理終わってるけど、本来なら1msec以内に終わるはずじゃない?」
というのに気付けてない場合が多い
1秒で処理が終わればユーザ体験は満足してしまうので気付けないんだが、ユーザが増えてくるとユーザ体験が途端に悪くなってくる
そのときに「プログラミング上のミスがあって性能が劣化している」ということに気付くか、「性能限界だからさらなるリソースが必要」と誤解するかによってビジネス上の戦略まで変わってくる
それだけではなくてクリーンアーキテクチャみたいな話も「機能が増えたんだから実装に時間がかかってバグが増えるのは当たり前」というところに落とし込んでしまうか
「もっとアーキテクチャを整理して考えれば機能追加も楽になるはず」という考えに至るか、というところで大きな差がある
この辺りでビジネス上の戦略まで変わってしまうからGoogleやMicrosoftなんかは積極的にコンピュータサイエンスを履修してる人を雇う
もう少し簡単に言うと、コンピュータサイエンスを履修してないプログラマーに多いのが
「今は動いているけれど触るとどうなるかわからない」
というソフトウェアを作りがちなところだと思う
レビューしてても
というコメントをするが、大抵
「動いているのでいいでしょwww」
みたいな感じで返してくるからどうしようもない
Danbooruの素性に注目が集まっているが、ここでは議論しない。
promptを英語で書く必要があり、闇雲に入力しても意図した画像が出てこない。
promptチェッカーのような、正しいpromptが書けているのかどうかをコンパイラで確認できず、自身で画像を見て反映されているか判断する必要がある。
promptに記載した内容が1枚の画像に全て反映されているわけではなく、複数枚の画像を出力してみて、promptがなんとなく反映されているかな、といったものになる。
Danbooruのタグが使えるということが正しいように広まっているが、半分正解で半分間違っている。
「bow」というタグがあるが弓を表しているわけではなく、女の子キャラクターの髪の毛が弓なりの形状をしていることを示すのに、Danbooruではタグ付けされている(ように見える)。
「hair_bow」というタグもあり、こちらも髪留めリボンのことを示す。「Waifu Diffusion」に書いて出てくるのはこちらになる。一般的に使われるのもこちらだろう。
面倒なのがここからなのだが、「Waifu Diffusion」は修飾子がどこにかかっているのか曖昧な判断をする。
弓を描きたいわけではないので、何かしら髪にまつわる単語が「bow」の近くにあることになるが、「Waifu Diffusion」はリボンを描く。
どうも「Waifu Diffusion」は英文法を知っているわけではなさそうだ。
また「hair_bow」をつけたキャラクターの代表的なのが東方の霊夢なのか、霊夢要素がそこかしこに現れる。
もう一つ例を出そう。
Danbooruのタグに「small_breasts」という胸の小さいタグがあるが、「Waifu Diffusion」は胸の大きな描写をする。
「xxxx, small_breasts, xxxx」といったようなpromptを書くと、胸の小さいキャラを描きたいのだなと判断すると思うが、
「Waifu Diffusion」は胸という単語があるから胸を描画した、となる。
どうもアンダースコアでつながっている単語を1単語とは認識してない。
「breasts」という単語が入っている限り、巨乳が描かれ、さらに胸をさらけ出した描画がなされるので重々注意されたし。
小さい胸のキャラクターを描きたい場合は「breasts」という単語をpromptに入れてはいけない。
上記のこともあり、Danbooruタグはあまり効かない。!!!やカッコ( ) で括った単語は強調されるらしいが、あまり意味がない。
またDanbooruのタグの詳細を見てみるとわかるが、1kを超えるような数の多いタグは曖昧なものが多くなり、詳細な分類がなされたものは数が少なくて効かない。
「floating_hair」というイラストでよくある髪束をウネウネさせるタグがあるが、「Waifu Diffusion」は認識せず、キャラクターは空を飛ぶ。
「short_hair_with_long_locks」という、ショートだが頬の横の髪が長いというタグがあるが、まず認識されない。
では日本人女性が現実でしている髪型に対応する英語があるかというと、Googleで検索して出てくるような和製英語を入力しても描画されない。
アイドル系だとツインテールがメジャーだと思うが、英語圏の人は「twintail hair は pigtail hair」だというが、pigtail hairは日本人の感覚からすると編み込みが多くリボンが沢山付き、どうも違うとなる。
他に、現状「Waifu Diffusion」では指を描くのがかなり苦手だ。
promptを工夫すれば出来るのかもしれないが、色々試した結果、顔との両立が出来ない。
先の事例と同様に、手を隠すといったpromptは指定しようとしても、promptに指や手といった単語が入っているだけで問答無用で画面に出てくる。
「Stable Diffusion」では本当に効くかどうかはさておき、検索できるサイトがいくつか出てきている。
しかし「Waifu Diffusion」で、アニメを描きたい場合の参考はない。
「Waifu Diffusion」を作った人達のDiscordにtext-to-imageがあり、画像とpromptが載っているが、多くがクオリティの低いものであり、高速で流れるチャット欄から見つけるのは困難だ。
Danbooruデータベースで学習しているということで、実際にダウンロードして中を見てみたが、
玉石混交というか、説明がしにくいが、少なくとも自分の描きたいものとは違っていた。
テイストが揃ってないので、同じ単語が示す物でも画像ごとに違い、そりゃアーティスト名で絞りたくなるよなってのは気持ちはわかる。
(「Waifu Diffusion」でDanbooruのアーティスト名を入れても、狙ったテイストにはならないが。絵が多いアーティスト名でもならない。)
また「Waifu Diffusion」はキャラクターの顔については崩れないので凄いと言われるが、
実際に使うと、「full body」といった全身を描きたいと思っても顔のアップばかりが出力され、全身が描けたと思っても顔が崩れて描写されない。
アニメのような演出をしようと思った場合、エフェクトをどう指定するか、という問題にぶち当たる。
アニメならではの光の演出があるわけだが、どう指定するのかわからない。
最近のイラストで多い、逆光で顔の前面は薄い影で、なぜか鼻の高い所にはハイライトが入っているが、前髪の影は額に落ちているという、
どこから光が入っているんだ?というのも指定できるのだろうか?
まだ3Dでやっているような顔前面セル塗りの方が指定しやすかろう。
「Waifu Diffusion」には70ワードという制限があり、細かく指定していくと軽く超えていく。
超えた分は無視され、絵を文字で表現するとなるのは難しいのを実感する。
img2imgによって、ポーズの指定、髪の毛をどこで括るかといった指定はしやすくなるが、それでもpromptが必要となる。
Danbooruタグが反映されない問題が解決されたとしても、タグの細分化はされているようでいて、実際使うとなると足りてない。
使いこなせる人はいるのだろうか?
自分は上段に座しているつもりで偉そうな上から目線の半分的外れな説教だの、はたまたその体すら為していない放言だのを安全な位置から投げつけたいだけのカスしかここにはいない。
このタイトルを見て、意識高い系文系イキリ勘違い野郎に何事か物申してやろうと考えたそこの画面の前でニチャニチャしているパソカタオタク(パソコンカタカタキモオタク: 声は小さいがタイプ音はでかい)のことである。
あるいは増田のことかもしれない。増田は日頃増田に生息している訳ではないが。
お分かりの通り、これは釣り記事である。そもそも意識高い系文系イキリ勘違い野郎が増田に記事を書くわけがない。が、一応タイトルに嘘はない。
ので意識高い系文系イキリ勘違い野郎を志す意識高い系文系イキリ勘違い野郎予備軍のことを思って以下を書く。
ちなみに、この記事のタイトルは増田が一番嫌いなタイプのそれである。自分で設定したのに今、額に青筋が浮かんでいる。
本項ではWebエンジニアになるにあたって増田がやったことを列挙する。
1. プログラミングを独学する
2. スクールに入る
3. アルバイトをする
なるほど、至極単純である。では順に詳細を見ていく。
ここに関しては特に言うこともない。
ネットの記事を見ながらCだのDだのC++だのを実際に吐くまで勉強した。
その経験を踏まえて意識高い系文系イキリ勘違い野郎予備軍にアドバイスするならば、独学の上で最も身になるのは"C++を用いて簡単なスクリプト言語のインタプリタを実装する"ことである。
インタプリタの実装という作業はプログラミング言語そのものに対する解像度を飛躍的に向上させる。
不可思議なお約束の塊であった文法や意味論が因数分解されるように頭の中で整理され、ブラックボックスであった標準ライブラリの内部について想像が及ぶようになる。
道具たるプログラミング言語に対する理解は、当然その使途であるプログラミングそのものを助ける。
ところでパソカタオタク諸兄姉は「なぜ今C++などという時代遅れのクソ言語を」と思ったかもしれない。
確かにC++はもはや洗練から程遠い聳えるバベルの塔である。しかし、こと言語実装の習得においてはこれほど適している言語もない。
C++はGC付きの他言語と比較して抽象度が低く、全てを自身で管理しなければならないが故に"便利な魔法"にあまり頼れないのである。
また、C++で導入された様々な思想、イディオムは他の言語にも大きく引き継がれている。
例えば洗練という意味でC++の対極に位置するRustという言語は、もはや本質的にはC++そのものである。
Rustの代名詞である所有権、ライフタイムはそれぞれC++の反省から生まれた言語要素であるし、move semanticsはC++11におけるmove semanticsと同様のものである。
GC付き言語の利用者にとってしばしば混乱の原因となりそうな`str`と`String`も`std::string_view`と`std::string`を知ってさえいれば迷いの発生する余地はない。
他のより抽象化された言語についても、C++との対応を考えることでその言語や標準ライブラリそのものの実装について十分に理解を深めることができる。
なぜならば過去の多くのスクリプト言語やコンパイラはC/C++によって実装されていることが多いからである。
そんなわけで、増田は"C++を用いて簡単なスクリプト言語のインタプリタを実装する"ことを勧めている。
増田が入ったスクールは、多くのそれが半年あたり70万程度の授業料を取る(らしい)のに対して同期間で28万程度と非常にリーズナブルであった。
ただし、卒業までは最低4年と長期間を要するし、増田は卒業後も2年さらに通った。
おいそこの意識高い系文系イキリ勘違い野郎予備軍、カスみたいなプログラミングスクールに入るな。
ところでそろそろ察せられるだろうが、増田の前職とは学生を指している。
大学は情報工学を教えてくれるが、別段それを学んだからといってプログラミングができるようになるわけではない。あくまでそれらは相補的なものである。
一方で、独学では分野に偏りが出がちだし、なにより独学にも金が要るので学生の身分にとってプログラマのバイトは良い選択肢である。
アルバイトはITエンジニアの経験に含めなくて良いのか怪しいが、増田のバイトの業務内容はWebエンジニアと言いきってよいか悩ましい類だったので嘘は吐いていない。
ちなみに増田は増田に書き込むような人間であるからして社会性というものが欠落している。
ちなみに月収は大学院2回生の収入0時代からの差分で算出して+50万なのでつまるところそれが現在の月収である。
増田にとって低くはないが、決してITエンジニアとして高い方であると主張することはできない程度の額である。
釣りのためにタイトルに含めた以上最低限の説明のはしたが、増田は金の話をすると脳の血管がブチギレそうになるのでこれ以上その話はしない。
ここまで読んだならわかると思うが、増田は意識高い系文系イキリ勘違い野郎(タイプ音がでかい)ではなく、パソカタオタク(パソコンカタカタキモオタク: 声は小さいがタイプ音はでかい)である。
そして、意識高い系文系イキリ勘違い野郎予備軍に言うべきことがあるとすれば、そもそもこの記事をここまで読んでいる時点でITエンジニアには向いていないので止めといたほうがよい。
また、ひょっとすると思い違いをしているかもしれないが、ITエンジニアというのは大抵 (増田は社会経験がほぼないので一般論を言うことは出来ないが) 意識高い系イキリキラキラ野郎サイドではなくパソカタオタクばかりである。
というよりTwitterにいる意識高い系イキリキラキラ野郎は多くの場合意識高い系文系イキリ勘違い野郎予備軍を養分にする人でなしである。騙されてはならない。
また、一つ理解しなければならないのは意識高い系文系イキリ勘違い野郎予備軍諸兄姉が張り合わなければならないのは、プログラミングスクールの同期でも、「#駆け出しエンジニアと繋がりたい」している有象無象でもなく、幼少から寝食や友人や遊びを自ら捨ててパソカタにのめり込んでいた、そして現在進行系でのめり込んでいる歴10年や20年をゆうに超えるSSRパソカタオタクであるということである (そしてそれはNRパソカタ増田も同様である)。
彼らが「スクールで半年学びました」で並び立てるような人間でないのは単純な算数でわかるほど明らかである。悪いこと言わんからキラキラWebエンジニアを目指すのはやめとけ。
あるいはそれでも目指すのであれば自分が何を捧げられるのかを考えた方がいい。
年齢的にリーダーシップを求められており、実際に5名のチームのリーダーをしています。
~~~ここから自慢話~~~
プログラミングが好きで、平均的な社員の2倍、3倍くらいの速さでコードを書ける自信があります。
また、他の社員では手を出せないような難しいパフォーマンスの追求もしています。
マルチスレッド特有のなかなか再現できないバグだってあっという間に解決できます。
コンパイラやインタプリタに関する特許を出願したこともあります。
会社でのメインの仕事は組み込みですが、AWSやAzureといったクラウドを調べながら使えます。AndroidやiOSのアプリも開発したことがあります(それぞれJava、Objective Cの時代ですが)。
10年近く前ですがWebのサーバサイド、クライアントサイド、DB設計もしたことがあります。
昔自社のデータセンタにアプリケーションサーバ、メールサーバ、DBサーバを立てたことがあるので、Linuxも少しわかります(LPIC Level 1)。
現在の職場でも、転職して来て数年が経ちましたが、ランクの中では上位5%~15%の評価を常に受け続けています。
~~~ここまで自慢話~~~
わたしとしてはずっとプログラマでも不満はないのですが、最近、チームを任されるようになりました。
チームリーダーとして仕事をしていくうえで気が付いたのですが、わたしはひとの面倒を見たり指示したりするのが好きではありません。
SESの未熟な派遣社員から訳の分からない報告(技術的にも日本語的にも支離滅裂!)を聞くたびにうんざりします。すぐにヒートアップする後輩と1時間ビデオ会議すると、いやな気持になります。
ビデオ会議の時間が近づいてくるとため息が出ます。カフェインで気分を上げて乗り切っています。
メンバーにうまく指示することでわたし一人では実現できない成果を挙げられることは分かっています。
ソフトウェアエンジニアリングにおいて、プログラミングなんてのは数ある工程のたった一つにすぎず、上流工程のほうがより重要だということも分かっています。
また、わたしがいちプログラマとして働くよりもリーダーとして働くほうが、上司や会社が満足することも分かっています。
一方で、わたしはプログラマとして働くほうが好きなので、プログラマとして働きたいです。
上流工程やマネジメントは誰かが面倒を見てくれてわたしはプログラミングに専念できる…しかも現状の年収(600万ちょい)や確定拠出年金(毎月5万ちょい)を維持でき、本音を言えばあと数年以内に100万円は年収を上げられる、安定している職場に転職したいのですが、わたしは地方在住ということもあって、なかなか見つかりません。
日本にはそんな職場はないのではないかとうすうす感じています。
けれどもこのままリーダーとして働くのも嫌です。
妻や子もいながらイヤだイヤだばかりで子供っぽいですが、それでも嫌です。
しかしながら、今後の加齢により知識の習得が遅れること、体力低下や老眼により長時間の集中が難しくなることを考えると、プログラミングだけで生きていくのは難しくなる一方です。
技術の陳腐化ペースがわたしの学習ペースを上回ってしまい、古い技術しか持ち合わせていないロートルになってしまうことを恐れています。
小学生のころからプログラミングを学んでいる子どもたちが優秀な後輩――そして競争相手になることを恐れています。
日本にはプログラマ35歳定年説というものがありますが、アメリカでも40歳までにはほとんどのプログラマが他の職種に転じるそうです。
わたしも、チームリーダーの道に切り替えるほうが結局は楽なのだと予想はしています。
今でも、嫌な気持ちを押し殺してチームリーダーとして日々メンバーの教育を実行し、メンバーの習熟度に応じて適切な粒度でWBSを作成し、進捗が遅れているメンバーがいればわたしから状況確認に行き、重要な目標・スケジュール・技術的ポイントがあれば彼らが忘れないように繰り返し伝えています。
自分が優秀なチームリーダーだとは思いませんが、経験を考慮すると人並みの働きはできています。
上司からは温厚(しかしメンバーを鼓舞する姿勢に欠ける)と評価されていますし、後輩からはプライベートの相談を受けることがあります。つまり嫌な気持ちを隠すことはできています。
このまま数年チームリーダーを務めれば世間でいう"主任"と"係長"の間のランクに昇格して100万円くらいは年収が増える見込みです。そこから10年以内には"係長"相当のランクに上がってさらに50万円は年収を増やしたいと思います。
リーダーとして何かを達成したいと思いませんし、そもそも同僚に関心がありません。
リーダーにはビジョンと人間への関心が不可欠だと何かで読みましたが、わたしはどちらも持っていません。
このまま数十年にわたり興味を持てない仕事を続ける自信がありません。そこまで心が強くはありません。
また、根本を欠いた状態で仕事を続けているといずれどこかで行き詰まるのではないかと不安です。
立場が人を作る、とは言いますが、わたしはリーダーになりたくありません。
こうしたキャリアの葛藤はよくある話ですが、ネットで解決方法を調べると、「低賃金に甘んじつつ現在の仕事を続ける」「嫌な仕事でも家族のために頑張る」「エンジニアならGAFAに転職する」……つまり、以下の3つに集約されるようです。
このうち「どちらの希望条件も満たせる実力をつける」に関しては、私は安定感のある伝統的な日本企業においては、プログラマの待遇としてはほぼ上限に達していると認識しています(研究所に勤務しているような例外を除く)。そのためわずかな"例外"に食い込むか外資系大企業に入り込むかのいずれかの選択になります。しかし30を過ぎ子育てにも追われる中、そこまで大きなキャリアアップに挑戦する気力はわたしにはありません。つまり大きな挑戦をせずに、居心地の良い場所に水平移動したいのです。情けない話ですが。
残る選択肢は「待遇よりも仕事内容を選ぶ」「仕事内容よりも待遇を選ぶ」のいずれかですが、みんなどうやって折り合いをつけているんでしょう。
私は今はプログラミングが好きですが、いずれ飽きてしまう可能性を考慮すると「仕事内容よりも待遇を選ぶ」の選択が最適なのかなと思っています。