IT ニュース&コラム 2019/12/16 通巻803号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ 手続き型プログラミングと宣言型プログラミングを使い分ける ■■ ソフトウェアを作る方法といえば、プログラミング言語で〜をしてから〜するという 処理(手続き)を書くことだと思いますが、手続きを書くだけではソフトウェアは できません。 その処理の対象データやオブジェクトの静的な構造やシステムの構造など、 データ構造を書く必要があります。 単純なデータ構造の場合は、データ構造と呼べない でしょうが、変数と値というデータは存在します。 そのため、ソフトウェアが大きく なるとデータをデータ構造として扱わなければならなくなってきます。 プログラミング言語でもデータ構造を書くことはできるのですが、たとえば C言語の 構造体の初期化子で Key Value 構造(名前と値からなる構造)を書くとすると、 Key と Value が離れてしまいデータがかなり読みづらくなってしまいます。 下記の場合 Key は name など、Value は Taro などです。 struct { char* name; int age; } data[2] = { { "Taro", 21 },{ "Jiro", 20 }, } データ構造を書くためのデータ形式として、CSV, XML, YAML, JSON などがあります。 YAML で上記と同じデータを書くと次のようになります。 - name: Taro age: 21 - name: Jiro age: 20 位置関係が整理されたことでデータ構造が理解しやすくなりましたね。 たとえば name の値が Taro の構造体の age の値は 21 です。 name が冗長だと問題にしてしまうと、読みにくくなります。 冗長は禁止という単純明快なルールに副作用があったということは、JSON の普及 によって状況証拠ですが証明されつつあります。 ちなみに、YAML の場合、行頭のハイフンがオブジェクトの区切り(配列の要素)に なっています。 コンマがオブジェクトの区切りに慣れている人にとっては、 こんな小さな - に注意しなければならないのか!今まで通りで問題のないコンマで いいだろ、とお怒りになるかもしれませんが、それは古いプログラミング特有の 知識かもしれません。 文書では以前からリスト(並べたもの)の行頭にある小さな 点が項目を分ける重要な役割を持っているのです。 多くの人が読む文書の書き方に 合わせてきたといういい方向の仕様の進化だと思います。 データ形式でも処理を書くことはできます。 文字列形式の値の部分にプログラミング 言語のコードを書けばいいのです。 プログラミング言語の種類は別の値に書けば いいです。 もちろん、そのデータを処理するコードを、データを入力するコードに 書かなければ処理は動きませんが。 language: bash code: ls dist > list.txt ここからが本題です。プログラミング言語 TypeScript(JavaScript) でデータ構造を 次のように書いたとします。 var taro = { name: "Taro", age: 21 } var jiro = { name: "Jiro", age: 20 } var family = [ taro, jiro ] family が最も下に書かれていますが、taro を family の下に書くことはできません。 なぜなら変数 taro に値が入っていないからです。 TypeScript なら family = [ undefined, jiro ] になるでしょう。 (その前にコンパイルでエラーになると思います) このように、プログラミング言語でふつうにデータを記述すると、 書く内容の順番に制限が発生してしまうのです。 しかし、taro を family の下に書く方法はあります。 それは、プロパティや メソッドにデータ定義を書くことです。 class DataClass { Family() { return [ this.Taro(), this.Jiro() ] } Taro() { return { name: "Taro", age: 21 } } Jiro() { return { name: "Jiro", age: 20 } } } ただし、プロパティやメソッドにデータ定義を書く場合、上記のままでは2つの 問題があります。 その問題の内容と解決方法について、次回説明します。 上記 YAML のサンプルで書いたように、データを書く位置が適切であることは、 データを理解する上で重要なことです。 読んでいる文章が概要から入らずに どこか重箱の隅の話から始まると、何の話だか分からなくなりますよね。 このように書く順番によって影響を受けない形式でソフトウェアを(その一部でも) 書くことを、宣言型プログラミングと呼びます。 宣言型プログラミングの定義は いろいろありますが、手続き型と宣言型という分け方をした場合、最も特徴的なのは、 書く順番によるかよらないかです。 書く位置によって内容が変わってしまうのは、 一般的な文章ではありえません。 一般的な文章では順番による内容については、 番号付きリストを書くか、接続詞を書くことで、順番に意味があることが明示されて います。 暗黙的に順序に意味があるのは、プログラミング言語のしかも関数の定義 内容のように処理の部分に固有のことです。 手続き型のプログラミング言語には「変数を定義する前に変数の値を参照できない」 という単純明快なルールがあり、それが制限になっているのですが、 じっくり読んでいけば分かる、だけでは開発効率が悪くなります。 プログラミング以外でも、単純明快なルールの副作用によって問題が発生して 効率が落ち、貴重な開発者の士気を下がると、ライバルとの競争に負けます。 たとえば、「専門用語の定義を、専門用語を使う前に書かなければならない」 という単純明快ルールは、内包による理解しかできなくなってしまいます。 外延やサンプルによる強力な理解方法が取れなくなってしまいます。 多少読みにくくなるけどルールを守るように変えるのは簡単だから合わせてよ、 と言えるのは、普段のパワポの資料を MS Word97 で書いてよ、と言われている ような無茶なことです。 参考 ・宣言型プログラミング - Wikipedia ・YAML ・定義に関する2つのアプローチ─「外延」と「内包」 http://d.hatena.ne.jp/gginc/20080206/1202275749 ■■ 注目ニュース 一覧 ■■ ◇ BluetoothとUSB Type-Cのハイブリッド版も。PFU、高性能キーボードHHKBを一新。 https://japan.cnet.com/article/35146639/ … 無線とUSBのどちらでもが普通になりそう。ペアリングの方法も変わりそう。 ◇ 中国が Huaweiと5G契約しないと貿易協定を締結しないと外国の首脳を脅迫していたと判明。 https://gigazine.net/news/20191211-faroe-islands-threatened-china-huawei-5g/ … アメリカの真似をしているだけともとれる。 ◇ 物理の法則に反して電気は通すが熱は通さない物質を物理学者が特定。 https://gigazine.net/news/20191202-electronic-thermal-conductivity-metallic-vanadium-dioxide/ … 法則より10分の1しか熱を通さない。プロセッサーの発熱量を抑える可能性は不明。 ◇ カバンに入れたまま決済できるスマホのタッチレス対応。ドコモとソニーが実証実験。 https://japan.cnet.com/article/35146447/ … カードやスマホをかざすことから、アプリの操作に変わるメリットは。 ◇ モバイル版 Office がデザイン言語 Fluent で刷新。 https://japan.cnet.com/article/35146467/ … 見た目でグーグルとの違いはほとんどない。マイクロタスクという概念は有効だが。 ◇ イランのネット利用制限、大統領が強化を示唆。 https://japan.cnet.com/article/35146615/ … ネットによる民主主義が外国からの侵略と見えてしまうのだろう。 ◇ AWSが量子コンピューティングサービス Amazon Braket 発表。研究センターやラボも。 https://japan.cnet.com/article/35146275/ … 研究機関に隣接する場所に設置。メンテナンスが必要か。 ◇ 7nmプロセスで独自設計の次世代ARMプロセッサ Graviton 2 をAmazon Web Servicesが発表。 https://gigazine.net/news/20191204-aws-graviton-2/ … クラウド固有の状況に合わせたサーバーのプロセッサー。 ◇ Alphabetの新CEO、サンダー・ピチャイ氏ってどんな人? https://japan.cnet.com/article/35146542/ … 以前から実質のCEO。引っ張るタイプというより火消しに優れた人のようだ。 ■■ ソフトウェアデザイン館 Sage Plaisir 21 ■■ ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm