目次

開発言語

こりん・2020-07-29初出版・2022-03-07更新

ソフト開発者は時と共に多数なプログラミング言語とその環境に触れて行きます。

最近私は GolangRust を覚えてここ三ヶ月ほぼフルタイムで使っています。こういう 「近代」な言語を実際なプロジェクトに用いて今まで使ってきた物を反省しながらある事 に気付きました。それは、「プログラミング言語」と「開発言語」の根本的な違い。この 記事はその違いを説明し、ある言語をその観点から分析する連載の最初です。続きは:

「プログラミング言語」の概念の拡大

さて「開発言語」とは何か。そして、「プログラミング言語」とはどう違うのでしょうか。

「言語」と言ったものとくると、その遅速・短長・難易・美しさなどで比較されます。ネッ ト上ではよくあれこれの言語のシンタックスなどを比べる記事も見られます。しかし、現 場でやるような開発となると、そういう表面的な事はほぼ仕事と無関係。

少し用語の定義を確認しながらそのなぜかを探ってみましょう。

プログラミングの定義

プログラミングとは人間の発想や意志を情報化させる事である

どの形に情報化させたかとその後どう扱ったかは別として。この定義で以下な事は全部 「プログラミング」になります:

  • ファイル名を一括に変えるBashスクリプトを書く事
  • 授業の宿題でデータ図を出すPythonの関数を書く事
  • サイトの割付けの改善のためにCSSを弄る事
  • SQLクエリをDB端末に打つ事
  • コーディング・チャレンジ を解く事
  • 最新の技術を使ってあるモジュールを書き直して長さを半減する事
  • 新ハードウェアのためのLinuxカーネル向けのパッチを書く事
  • 研究に基づいた新アルゴリズムの試作品を大学で模索する事

そして意外にこういうのも:

  • 試験で整列アルゴリズムの疑似コードを手で書く事
  • 理屈ブロックを繋げて アニメーションを作る事
  • SpaceChem というゲームの遊び方
  • 織機 をカードで操作する事
  • 散歩中やシャワーを浴びながらプログラミング問題を頭の中で解く事

この定義ではプログラミングは誰にでも手を付けられるものになります。

ソフト開発の定義

その一方、「ソフトウェア開発」があります。

開発とは長い期間使われていくソフトを作る事。

プログラミング・検証・協力・出荷・保守の五行に基づく。

この定義で以下な事は「開発」になります:

  • 仕事でバッグの修正を引き受けて、問題を調査して解決、そしてPRを提出する事
  • 自己サイトをネット上に載せる事
  • 額を水平にしてくれるアプリ を公開して売る事
  • 任天堂などのゲームを生産する事
  • Linuxカーネルのパッチを吟味してマージする事
  • 太陽系を抜け出した人工衛星の内蔵ソフトに地球からアップデートを送る事
  • ConferenceやMeetupなどで他の開発者と会話する事

「開発の五行」を元に、ある言語がプログラミングだけではなく「開発」に適しているか どうか計れます。特に優れた言語は下記の問いにちゃんとした答えを備えます:

  • プログラミング
    • 発想を自然にエディタに写せるか、言語そのものが邪魔してくるか
    • 日常的な開発の流れはコンパイラとの建設的な対話か
    • 意志をコードに表すには何字を打たなければならないのか
    • 言語が GOTCHAだらけ なのか
    • 一度のコンパイルや型チェックは何秒かかるか
    • 毎日目にかけるシンタックスが美しいものか
  • 検証(テスト)
    • コードを間違えた瞬間からその発覚までどれくらいかかるか
    • 古いコードが勝手に壊れる事からどう守られているか
    • テストを不要にするコードの正しさを保証する仕組みが提供されているか
    • ベンチマーキングがやりやすいのか
    • 遅いコードが書きやすいのか
    • 一度のCIは何分かかるか
  • 協力
    • 他人に分かりにくいコードが書きやすいのか
    • 質問がある時は活気のある専用の掲示板が存在するか
    • コードの書き方自体は業界で一致しているか、競争する「小世界」があるか
    • 他人のコードを依存性として利用するのは簡単なのか
    • 住む街に専用のMeetupやConferenceが開催されているか
  • 出荷
    • ドキュメンテーションがよく整理され、使いやすいのか
    • ライブラリの公開の仕方が明らかなのか
    • 依存性が頼りになるか弱みになるか
    • プロダクション用の最適化されたバイナリを出すのは簡単なのか
    • バイナリをそのまま実行できるか妙なランタイム設定やフラグが必要なのか
  • 保守
    • 今日書くコードは一年先にそのままコンパイルできるか。十年先は?
    • 自信持ってリファクタリングができるか
    • ランタイム・クラッシュは日常的なのか
    • コンパイラや依存性を定期的に更新しなけらべいつ頃その言語環境に「置いて行かれてしまう」のか
    • レガシーコードとの接続では手が焼くか

似た点はもっとあるでしょうけれども、まず上の点に「現場にいる」開発者は異議ないで しょう。その反面、上の点は学生や研究者や科学者に関係あるでしょうか。ないのならば:

ソフト開発に向いていると向いていない言語がそれぞれある

Pythonで数百万行のOSは作るべきでしょうか。可能は可能ですがやるべきものではないと 思います。Pythonには他の長所があります。

研究や教育にしてもそう:High Performanceの物理学シミュレーションコードはJavaで書 くべきでしょうか。最初の言語として学生にC++は教えるべきでしょうか。またそれぞれ に他の長所はあると思います。

結論

「良い職人は失敗を道具のせいにしない」と言われますが、高層ビルを槌一つで建てよう とする時と犬小屋を起重機で組み立てようとする時を見極める力が我々開発者に不可欠で す。状況と道具が合っていなければ問題の範囲を再検討するか道具を入れ替えるかのどち らかだと思います。

全ての「開発言語」はプログラミング言語でもありますが必ずしもその逆はありません。 従って、言語のシンタックスを比較する事や「A語対B語」風なブログ記事を書く事や言語 を「トップ十」に並べる事に意味があるでしょうか。

個人的に言うと、自由に創らせて、創った物を長期に亘って容易に保守させてくれる言語 が好みです。

次回、Rustは上の「開発の五行」にどれ程当てはまるか分析して行きます。

ポスト一覧