トップページに戻る

AUTHOR: schwarz1009
TITLE: K&Rの勉強中
BASENAME: 2020/09/03/171747
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: 0
DATE: 09/03/2020 17:17:47
CATEGORY: C
CATEGORY: 読書
CATEGORY: Java
CATEGORY: JavaScript

作業所でC言語の勉強中

最近、僕がデザインの仕事をしている作業所で、
仕事がない時(たとえば今日)に、
ひとりでC言語の勉強をしている。
教科書に使っているのは、「プログラミング言語C」。
著者の名前の頭文字をとって「K&R」と呼ばれている、
C言語の原典である。
この中の、第一章である「やさしい入門」のページを読みながら、
作業所で使っているMacの中に無料のXcode
(コンパイラgccが含まれている)を入れて、
viでプログラムを書きながら、
サンプルプログラムをコンパイルして実行しながら、
C言語の基本中の基本を学んでいる。
読んでいると、最初の「やさしい入門」だけで、
プログラミングが一通りできるようになっている。
原典であるだけあって、
他の本に書いてあった内容もきちんと分かるように書いてある。
僕はそろそろやさしい入門を読み終わるのだが、
きちんとプログラミングのやり方が分かった気がする。
やさしい入門を読み終えたら、
その後のC言語の詳細な解説を読むか、
それとも僕が知りたいと思っているJavaやJavaScriptを勉強するかを
考えたい。
また、デザインの仕事がある時は、納期もあるので、そちらを優先して頑張る。
時間がない時の楽しみとしてとても楽しく、面白い。
サンプルプログラムを打ち込んだだけだが、
摂氏と華氏の対応表の計算をするプログラム、
2と-3のべき乗の一覧の出力をするプログラム、
入力した文字を出力するプログラム、
ファイル内の文字数や行数などを文字の種類ごとにカウントするプログラム、
ファイル内のもっとも長い行を表示するプログラム
などを作って実行した。
Mac上で開発するのは楽しい。
viを使うのは、Atomなどを特に入れているMacでないため、
最初から入っているviを使っているだけに過ぎない。
gccを入れるのは簡単で、
ターミナルにgccとコマンドを打ち込むと、
「gccは入っていません。
コマンドデベロッパーツールをインストールしますか?」
といった英語のエラーメッセージがでるので、
ダイアログに従うだけで導入できる。
複雑な操作は必要なく、
Windowsよりもはるかに簡単にC言語の開発環境が導入できる。
またAdobe製品も使えるので、
僕はMacでデザインもプログラミングも両方やっている。

分かることを全てコントロールするのが悪い

僕の問題点は、
「分かることを全てコントロール」することである。
なぜか、いつからか、分かること全てを支配して書くようになった。
もっと自由に分かるようにすれば、
きちんと分かるようになる。
また、古いものばかりをもう一度、もう一度と求めるのはよくない。
新しく、違ったものを求めなければ、
人間は意味がない。

人間の基本

人間の基本について言えば、
まず、ものである。
人間にとって、「もの」が賢い。
パソコンや工学技術を考えていると、
どうしても高度な機械にばかり目が行ってしまい、
ものを見失ってしまう。
もっと単純な、ものに目を向けること。
人間にとって一番の基本はものである。
ものを使ってものを作る時に、「道具」が必要となる。
人間にとっては、何をするにも道具である。
そのため、パソコンは単なる道具に過ぎない。
次にあるのは、「家屋」である。
ものを安全に保管し、
雨や風から守り、
自らの安全や安心を守るために、
家屋が必要である。
そして、その次に、家屋の中にあるさまざまなものがある。
特に大切なのは「冷蔵庫」である。
冷蔵庫の中には、たくさんの大切な食糧がある。
食料がなければ、人は生きられない。
次に大切なのは「水道」と「電気」。
そして、その後にあるのが、「金」である。
金があれば、人間は何でも手に入る。
金は社会においての基本であり、
社会においては「買うこと」と「給与を得ること」ができなければならない。
給与を得るためには、「仕事をすること」が必要となる。
仕事によっては、「専門技能」や「学歴」が必要となることもある。
これくらいが、人間生活の基本となる。
あとは、銀行や役所の手続きを覚えるとか、
「社会の形式や制度」があるだけに過ぎない。
しかしながら、人間には生きるだけではなく、
さまざまなことを「考える」必要がある。
ここで大切なのは、ものに加えて「言葉」と「数」である。
これくらいが、人間の基本である。
あとは、さまざまなものがたくさんある、というだけにすぎない。

ほかにもいろいろとある

本当のことを言うと、ほかにもいろいろある。
たとえば、物理法則もあれば、
学校で学ぶ常識や教養もあれば、
社会の約束事や決まりもある。
職業もたくさんあるし、
絵や音楽を楽しむ人間も多い。
ひとつのことを極めて研究すれば、
どんなことでも賢い。
そもそも、人間とはそういうものである。
よって、プログラミングを意味がないと言う必要はない。

JavaとJavaScriptは別言語

ちなみに、JavaとJavaScriptが同じ名前がついているため、
「Javaには二種類ある」と思っている人が多いが、
実際はどちらもまったく違う言語である。
開発元も違う。
Javaはサン・マイクロシステムズという
商用UNIXベンダーの開発した言語であり、
JavaScriptはWebブラウザを作っていたネットスケープという会社が、
ブラウザの組み込みスクリプトとして開発した言語である。
よく似た名前がついたのは、
単にサンとネットスケープが業務提携をしていたからに過ぎない。

JavaとJavaScriptの違い

また、両者の言語は似通った点が多いと思っている人が多いが、
実際はJavaはクラスベース、JavaScriptはプロトタイプベースであり、
JavaはVMの上で動くオブジェクト指向言語で、
どんなプラットフォームでも共有のバイトコードが動くことを目指したものである。
言語として流行したのも現在から比べれば少し前である。
モバイルでもデスクトップでも同じバイトコードが動くことから、
モバイル向けによく使われる。
モバイルOSのAndroidのアプリはJava言語の派生であるKotlinがよく使われている。

JavaScriptはクライアントで動く

JavaScriptはブラウザの中で動く組み込み言語であり、
サーバーでPHPやJavaサーブレットが動くのに対して、
クライアント、すなわち個々のコンピュータ’(ブラウザ)の中で動くことが
特徴である。
簡単に言えば、WebサーバでPHPが動いてHTMLを吐き出し、
そのHTMLをダウロードして表示する際に、
WebブラウザでJavaScriptが動く。
JavaScriptはHTMLの中にスクリプトをそのまま記述して、
DOMというツリー構造でHTMLを操作できることから、
Webと相性がいい。

JavaScriptは最新技術が多い

最近はJavaScriptはとても最新技術が豊富で、
Node.jsなどに見られるようにクライアントだけではなく
サーバーサイドでも使われることが多く、
ほかにもjQuery, TypeScript, Vue.js, React, Angular, Electronなど
たくさんの技術がIT企業各社が競うように開発されており、
「好きな言語はJavaScript」と言ったエンジニアがWebの調査でも多くなっている。
このように、JavaとJavaScriptはまったく異なる言語である。
Javaと似たような名前をつけたネットスケープの功罪は大きい。

どちらも買収された

ちなみに、サンやネットスケープは既に買収されており、
Javaはサンを買収したデータベース企業のオラクルが作っている。
JavaScriptは標準化されているためWebブラウザ各社が
それぞれのブラウザ向けのエンジンを開発しているが、
公式的な情報は、ネットスケープというブラウザをオープンソース化した、
Mozilla.orgに頼ることが多い。
Mozilla.orgはネットスケープがマイクロソフトにブラウザ戦争で負けたため、
その時流行っていたLinuxカーネルのオープンソース開発を参考にして、
商用ソフトウェアをオープンソースプロジェクトにした
先駆のようなプロジェクトである。
サンもネットスケープも、マイクロソフトに競争で負けたところが大きい。
マイクロソフトはC#/VBや.NETを作ってJavaに対抗し、
JavaScriptについてはIEやEdgeの独自エンジンを作って
GoogleやMozillaのエンジンに対抗している。

サンとネスケはハッカー企業

また、これではサンとネットスケープは負け犬企業に見えるが、
どちらもハッカーが多いことで名高い「ハッカー企業」である。
特に、サンにはビル・ジョイという
UNIX界で神のようになっているviの開発者が雇われていた。
また、ネットスケープの従業員だったジェイミー・ザウィンスキーが
AOLに買収された時のことを語るとても面白い文書が、
おそらくネットに出回っていると思うので、
興味を持った方は検索するなどして参考にしてほしい。

Javaの長所はクラスライブラリ

僕は、Javaの長所はクラスライブラリだと思う。
Javaにはサンによって開発された豊富なクラスライブラリがあり、
コマンドラインで使うのであっても、
Swingで使うのであっても、
あるいはモバイルやエンタープライズで使うのであっても、
共通のクラスライブラリが使える。
これはKotlinでも同じ。
そのため、「Javaを勉強しておけば何でもできる」と言われる。
欠点も同じで、
クラスライブラリの中の文字列が長すぎるところが欠点。
このため、EclipseやIntelliJのようなIDE(統合開発環境)を使うことが
ほぼ必須となっている。
しかしながら、MicrosoftのVS-Codeなどを使えば、
PythonやPHPなどと同じエディタでJavaの開発ができて便利だ。

JavaScriptの長所はDOM

また、JavaScriptの長所はDOMである。
嫌われることもあるが、
DOMを使ってツリーとノードでHTMLを操作するのは、
直観的で扱いやすい。
そもそもがHTMLの操作のために使うため、
ドキュメントの表示と操作に終始し、
このためコマンドラインの入出力を覚える必要がなく、
またGUIを用いなくてもHTMLでブラウザで表示できる。
欠点も同じくDOMで、
DOMの操作はものすごく分かりづらい。
しかしながら、
前述したJavaの応用技術(フレームワーク)を使うことで、
DOMの操作は大幅に簡略化し、
デザイナブルにHTMLを操作することができる。

ライブラリとDOMを覚えればいい

そういうわけで、Javaをやりたいなら、
むしろ簡単である。
言語の仕様は少し読めば分かる。
覚えるべきことは、Javaのクラスライブラリと、
JavaScriptのDOM操作である。
他にはたくさんのフレームワークがあるが、
これは各自自分の会社で使うものを覚えればいい。
Vue.jsは中立性が高いためおすすめ。
AngularはGoogle、ReactはFacebookによるフレームワーク。
また、Node.jsは最近のサーバーサイドでは
少しずつ標準化されつつあり、
Ruby on Railsは少しずつ、
Node.jsやその周辺(Express.jsなど)に敗北しようとしている。
やはり、クライアントサイドをJavaScriptで作るなら、
サーバーサイドも同じJavaScriptで作りたい、
というNode.jsの思惑が強い。
逆にJavaScriptにコンパイルできるRubyライクなCoffeeScriptもあるが、
普及には至っていない。

Javaの使い道はエンタープライズ

また、Javaの大きな使い道として挙げられるのが
エンタープライズである。
特に、最近ではIBMのメインフレームですらJavaが動くが、
オープン系のシステムでは、
以前からJava EEを用いたサーブレットを使って
WebサーバとDBサーバの間に位置するAPサーバを書くのが普通だった。
サーブレットコンテナにはオープンソースのTomcatなどがある。
サーブレットを使うことで、
PHPと同じようにJavaでサーバーサイドを書くことができる。

JavaScriptの使い道はいろいろ

また、JavaScriptの使い道は、
まさに「いろいろ」である。
しかしながら、多くがHTMLやCSSのようなWeb技術とともに使われる。
HTMLの操作をダイナミックに行ったり、
レスポンシブデザイン(パソコンのWebでもモバイルでも同じ見た目を保つ)
のようなことに使われることが多い。
特に「凝ったWebデザインを行う」上ではJavaScriptは必須の言語だが、
HTMLを単に表示するだけであれば必要のない「邪魔な技術」である。

もっとC/C++を学びたい

このようにJavaについて書いてみたが、
見ると、むしろ、必要になってから覚えればいい言語である。
しばらく、C/C++の勉強がしたい。
C/C++は面白い。
昔から、C/C++を使うと、
WindowsやLinux向けの「ネイティブアプリケーション」が開発できる。
そして、Linuxであれば、
Linuxカーネルの開発に「参加」することもできる。
実際、Linuxカーネルの開発は難しいが、
Cで大規模なアプリケーションを作るための方法はもう知った。
要するに、別の関数を呼び出せばいいのである。
externを使って別のソースファイルにある関数を呼び出す方法も分かった。

C++はライブラリが難しい

C++の欠点は、ライブラリが難しいことである。
特に、Windowsを使うのであれば、
Windows APIやMFCを覚えなければならないが、
独自のハンガリアン記法を使ったり、
メッセージマップとか、ドキュメント・ビューとか、
とにかくWindowsに依存した独自の技術が多い。
デバイスコンテキストまで理解するのはとても難しい。
また、UNIXではWindowsとやることが全く違う。
UNIXのコマンドラインは美しくエレガントなのに、
X11やGTKでプログラミングを行うのは全く異なる。
ほかにも、「C++の言語仕様は巨大すぎる」と言われる。
ALGOL60に対するALGOL68のように「言語仕様が膨れ上がっている」。
これらが、C/C++が初心者からは敬遠される理由である。

Cをやるなら色んな技術を学ぶ

Cをやるならどうするか。
答えは、「色んな技術を学ぶ」ことである。
C/C++には、具体的な技術が多い。
たとえば、小さなところではスタックやキュー。
大きくなると、OSやコンパイラなどの理論がある。
そもそも、C言語はOSやコンパイラを書くための
システム・プログラミング言語と呼ばれる一群である。
もっと賢い分野をやりたいなら、PythonやRubyの方が向いている。
CならOS技術かコンパイラ技術から始めればいい。

結局、Cぐらいが面白い

僕が思うに、今やっているK&Rの本が面白いのである。
C言語について精通すると、
パソコンのことがよく分かる。
なので、面白いC++の本を探したい。
言語設計者の本もいいかもしれないが、
Cの原典が薄めなのに比べて、
C++の原典は分厚い。
簡単には歯が立たない本であると言える。

本当のことを言うと、今僕が持っている本はいい

また、本当のことを言うと、
僕はけっこういい本を持っている。
特に、MINIX本エキスパートCプログラミングがあるが、
これらを読んだ方が良い。
MINIX本も相当分厚いが、
リーナス・トーバルズが読んだ本である。
また、エキスパートCプログラミングはあまり分厚くなく、
エンジニアが分かるべきことがユーモラスに紹介されている。
特段良いことがなければ、
エキスパートCプログラミングを読みたい。

意外と、科学計算が面白い

また、K&Rを読んだ感想として、
意外と科学計算が面白いということ。
Cは計算してそれを出力することが得意な言語だ。
最近の科学計算はPythonを使うようだから、
「Pythonによる科学計算」のような入門本を買うと、
きっと面白いと思う。

文学をやるならドイツかそれ以外か

僕が思うに、
パソコンのことをこのように書くと、
逆にパソコンのことがしたくなくなる。
そんなにオタクのように分かっても、
何も分からない。
むしろ、文学がいい。
文学をやりながらパソコンをやると、
意外とパソコンも面白い。
自分で言葉に直してパソコンを勉強すると、
自分の考えることとパソコンの分野が重なって面白い。
文学をやるなら、
ずばり「ドイツ」にするか、「ドイツ以外」にするかだ。
ドイツとは、ドイツの文学や哲学のこと。
ドイツ以外とは、フランスやイギリス、ロシアなどのこと。
どっちかだけやればきちんと分かる。
あえて言えば、ドイツは極めて難しい。
ほかの文学の方が、はるかに楽しい。

怒りの発散が世界を楽にする

僕の経験から言って、
この世界は、「怒り」が必要である。
なぜか、イライラしているのに、
それを自分が必死で抑えようとしている。
イライラを外に出して、発散すること。
それだけで、頭はすぐに楽になる。
際限のない哀しみが恐怖となって、
「怒りの恐怖症」を生み出しているのである。

怒りが消えると多重人格が治る

怒りが消えると、多重人格が治る。
こういう多重人格は、
単純に、怒っている人格に対して
別の人格がなだめているだけである。
怒りの人格が主人格であることが多い。
怒りの人格を消してしまえば、
そのまま、全ての精神異常は消え去る。
なだめている人格はそのまま自分になり、
怒りの人格は消え去る。

心理学は子供の行動と発達

心理学をやりたいのであれば、
子供の行動と発達を考えればできる。
というか、そうするしかない。
心理学は、子供がどのように行動して、
子供がどのように学び、自ら賢くなっていくか、
ということを考える。
むしろ、言ってしまえば、ヘーゲルである。
ヘーゲルが分かってしまうと、
心理学なんか、そもそもやる必要がない。
ヘーゲルが、そういうことを全て述べている。
あれ以上詳細に述べることはできない。
ほかにあるとすれば、サルトルである。
サルトルはきちんと考えて心理学を分かっている。
サルトル以上、そもそも考えることができない。