プログラムと型のはなし

黒曜

(@kokuyouwind)

プログラミング未経験者でもわかる!(かもしれない)

この発表の内容

  • 黒曜がRubyKaigiで「プログラムの型の推測」で登壇予定

    • 前提知識がけっこう必要

      • プログラムとは?

      • 型とは?

      • なにが嬉しいの?

  • 大雑把に上記を解説する

    • もっと詳しい話が気になったら 1 on 1 とか入れてね

Q. 「プログラム」って何?

A. 仕事をするための「作業手順書」

例: 契約申し込みに対応(人間 ver)

Leaner見積
契約します

ありがとう
ございます!

1. 契約申し込み

契約リスト

2.契約リストに追記

3. 今後の案内をメール送信

例: 契約申し込みに対応(手順書)

契約

アザス!

1.

契約リスト

2.

3. 

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

    2. 今後の案内をメール送信

例: 契約申し込みに対応(手順書)

契約

アザス!

1.

契約リスト

2.

3. 

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

    2. 今後の案内をメール送信

これが「プログラム」!!!

例: 契約申し込みに対応(コンピュータ)

Leaner見積
契約ボタンポチッ

手順書通り
仕事するよ

1. 契約申し込み

契約リスト
(電子データ)

2.契約リストに追記

3. 今後の案内をメール送信

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

    2. 今後の案内をメール送信

「プログラム」と「プログラミング」

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

    2. 今後の案内をメール送信

プログラム
(手順書)

プログラマー

手順書を作る作業
(プログラミング)

契約申し込みプログラム: 詳細記録 ver.

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

      1. 会社名

      2. 契約日時

      3. 申込者 氏名

      4. 申込者 メールアドレス

    2. 今後の案内をメール送信

契約申し込みプログラム: エラー

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

      1. 会社名

      2. 契約日時

      3. 申込者 氏名

      4. 申込者 メールアドレス

    2. 今後の案内をメール送信

契約申し込み

この情報が
足りなかったら
どうなる?

契約申し込みプログラム: エラー

  1. 契約申し込みが来たら、以下の通り対応

    1. 契約リストに追記

      1. 会社名

      2. 契約日時

      3. 申込者 氏名

      4. 申込者 メールアドレス

    2. 今後の案内をメール送信

この情報を書く
列がなかったら
どうなる?

契約リストに追記

契約申し込み

人間だったら臨機応変に対応できるが、
コンピュータは手順書(プログラム)通りのことしかしない。

もしうまく解釈できない・作業できないことがあると、
コンピュータは 実行時エラー で作業を停止する。

ここで「型」の出番!

Q. 「型」って何?

A. プログラムのつなぎ目を
「パズルのピース」のようにする仕組み

型のついたプログラムのイメージ

契約申し込みで
送られるデータ

会社名

申込者氏名

申込者メアド

契約日時

会社名

申込者氏名

申込者メアド

契約日時

契約申込み
プログラム

契約リストに
保存できるデータ

会社名

申込者氏名

申込者メアド

契約日時

契約申し込みで
送られるデータ

会社名

申込者氏名

申込者メアド

契約日時

会社名

申込者氏名

申込者メアド

契約日時

契約申込み
プログラム

契約リストに
保存できるデータ

会社名

申込者氏名

申込者メアド

契約日時

型エラーのないプログラム

ぴったりハマる

プログラムの接合部
(データの受け渡し)で
エラーがないことが
保証される

型エラーのあるプログラム

契約申し込みで
送られるデータ

申込者氏名

申込者メアド

契約日時

会社名

申込者氏名

申込者メアド

契約日時

契約申込み
プログラム

契約リストに
保存できるデータ

会社名

申込者氏名

申込者メアド

ぴったりハマらない

プログラムの問題に
「作業をする前」に
気付ける

実際のプログラムにおける「型」

# 契約申込みが来たときの手順
def makeContract(
  company_name,  date,
  user_name, user_email
)
  # 契約リストに追記
  Contract.create!(
    company_name:, date:, 
    user_name:, user_email:
  )
  # 今後の案内をメール送信
  ContractNotificateMail
    .deliver_now!(
      user_name:, user_email:
    )
end

プログラム本体

# 契約手続きに必要な情報の型をそれぞれ明記
def makeContract: (
  string company_name,
  Date date,
  string user_name,
  string user_email
)

# 契約リストの保存できる型を明記
class Contract
  attr_accessor company_name: string
  attr_accessor date: Date
  attr_accessor user_name: string
  attr_accessor user_email: string
end
  

プログラムに対する型定義

型を書くのが結構めんどい

(既存のプログラムに全部手で書いてくのは結構無理ゲー)

黒曜のRubyKaigiの登壇テーマ

ChatGPT などのLLMsを使って、
プログラムから型を推測できないか?

# 契約申込みが来たときの手順
def makeContract(
  company_name,  date,
  user_name, user_email
)
  # 契約リストに追記
  Contract.create!(
    company_name:, date:, 
    user_name:, user_email:
  )
  # 今後の案内をメール送信
  ContractNotificateMail
    .deliver_now!(
      user_name:, user_email:
    )
end

プログラム本体

# 契約手続きに必要な情報の型をそれぞれ明記
def makeContract: (
  string company_name,
  Date date,
  string user_name,
  string user_email
)

# 契約リストの保存できる型を明記
class Contract
  attr_accessor company_name: string
  attr_accessor date: Date
  attr_accessor user_name: string
  attr_accessor user_email: string
end
  

プログラムに対する型定義

というツールを趣味で作ってます

本編は沖縄ですが、
社内リハも多分するので聞きに来てね!

予備スライド

実際のプログラム

僕は機械語しか
わからないよ!

001011010111010110100

011010110110101101010

110101001010100101100

101001001001010111011

101101101010010101010

機械語のプログラム
(手順書)

こんなもの書けんわ!!!

「プログラミング言語」と「コンパイル」

人間が書きやすい言語(プログラミング言語)
で書いたプログラム

コンピュータが読める言語
(機械語)
で書かれたプログラム

Ruby

001010

専用の手順で
変換するよ!
(コンパイル)

「プログラミング言語」いろいろ

Ruby

日本生まれの言語
人間が書きやすいが、
機械語との乖離が大きく
翻訳(コンパイル)は大変

Ruby

目的や歴史によって、いろんなプログラミング言語がある

JavaScript

JavaScript

Webブラウザで
よく使われる言語
非常にシンプルなので
機械語に翻訳しやすいが、
人間が書くときに
エラーが混入しやすい

TypeScript

TypeScript

JavaScriptに「型」を
付けられるようにした言語
型の仕組みでエラーを
防ぎやすい。
機械語ではなく
JavaScriptに翻訳して使う

プログラミング未経験者でもわかる(かもしれない) プログラムと型の話

By 黒曜

プログラミング未経験者でもわかる(かもしれない) プログラムと型の話

2024/03開催の社内LT大会の発表資料です。

  • 188