比較言語学のススメ -Ruby vs. Python に学ぶ言語のアイデンティティ-

7.7K Views

February 11, 25

スライド概要

「比較は物事の本質を知る手段の1つである」、これは私が大学時代に英語学を専攻して学んだ大切な金科玉条である。
この手段は自然言語だけではなく、プログラミング言語にも応用出来る。
今回は私のメイン言語の Ruby と第二言語の Python の共通点・相違点を比較によって明らかにし、Ruby という言語をより深く知るためのきっかけ作りを目的としている。
「外国語を1つも知らない者は、自らの母語について何も知らないに等しい」

profile-image

某教育系サービスの内製開発にソフトウェアエンジニアとして携わっています。 使用技術スタックは、バックエンドは Ruby on Rails、フロントエンドは React.js + TypeScript です。 プライベートでは Python も少し書きます。 学部生時代は英語学を専攻していたので、言語に強い興味を持っています。 LT 会のプレゼンテーションなどで使用したスライドを掲載しています。 宜しければご自由にご覧下さい。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

比較言語学のススメ -Ruby vs. Python に学ぶ言語のアイデンティティ作成者: 石田 隼人 英語版はこちら 最終更新日: 2025年03月16日 1

2.

自己紹介 • 各種アカウント • • • • • GitHub: @hayat01sh1da X: @hayat01sh1da LinkedIn: @hayat01sh1da Speaker Deck: @hayat01sh1da Docswell: @hayat01sh1da • 職業: ソフトウェアエンジニア • 趣味 • • • • • 言語学 カラオケ 音楽鑑賞 映画鑑賞 猫飼育 2

3.

免許 / 資格 • 英語 • TOEIC® Listening & Reading 915点: 2019年12月 取得 • エンジニアリング • • • • 情報セキュリティマネジメント: 2017年11月 取得 応用情報技術者: 2017年06月 取得 基本情報技術者: 2016年11月 取得 IT パスポート: 2016年04月 取得 • その他 • 珠算2級: 2002年06月 取得 • 暗算3級: 2001年02月 取得 3

4.

スキルスタック • 自然言語 • 日本語: 母語 • 英語: ビジネスレベル • 開発 • バックエンド: Ruby(Ruby on Rails), Python • フロントエンド: TypeScript + React.js, TypeScript +Vue.js • データベース: MySQL, PostgreSQL, MongoDB • アーキテクチャー: モノリス, モジューラーモノリス • ホスティング: AWS ESK • バージョン管理: Git, GitHub • CI/CD: GitHub Actions, ArgoCD • 監視: Datadog, Sentry 4

5.

職歴 期間 業種 職種 業務内容 2021年08月Present EdTech SaaS ソフトウェア エンジニア • バックエンド開発 • フロントエンド開発 • CI/CD 運用・保守 • 週次リリースマネージャー • トラブル対応 • ドキュメンテーション • 技術負債解消 • 技術ブログ記事執筆 • LT 登壇 2020年02月2020年12月 チャットボット系 SaaS バックエンド エンジニア • バックエンド開発 • ドキュメンテーション • 技術負債解消 • 代替 API 検証 5

6.

職歴 期間 業種 職種 業務内容 2018年06月 2020年01月 受託開発 ソフトウェア エンジニア • バックエンド開発 • フロントエンド開発 • トラブル対応 • QA • 技術ブログ記事執筆 2016年04月 2018年01月 SES システムエンジ ニア • 全社アカウント管理者 • Windows Server 運用・保守 • セキュリティ管理者助手 • 翻訳・通訳 6

7.

国際交流活動 • 大学時代 • • • • 英語学ゼミ(マスメディア英語) 国際交流サークル兼部(2年次) 内閣府主催国際交流プログラム(2013年 - 2016年) 日本語学の授業の S 単位取得(最終年次) • 海外生活 • オーストラリアでのワーキングホリデー(2014年04月 - 2015年03月) • • • 2ヶ月間のシドニーの語学学校通学 6ヶ月間の Hamilton Island Resort での就労 1ヶ月間の NSW 州の St Ives High School での日本語教師アシスタントボランティア活動 • その他活動 • • • • • 英語での日々の日記(2014年04月 - 現在) Sunrise Toastmasters Club 参加(2017年02月 - 2018年03月) Vital Japan 参加(2018年01月 - 2019年07月、2022年10月 - 2023年02月) 英語自己学習 Ruby 関連カンファレンス参加 7

8.

目次 1. 言語比較の意義 2. Ruby と Python の三大共通点 3. Ruby と Python の三大相違点 4. おわりに 5. 参考文献 8

9.

1. 言語比較の意義 9

10.

1. 言語比較の意義 私は大学生時代は英語学を専攻していた。 そこでの一番の大きな学びは「物事の本質は比較によって理解出来る」と いうことであった。 そのことを表す格言を以下に引用する。 "He who knows no foreign language knows nothing of his mother tongue." by Johann Wolfgang von Goethe (外国語を1つも知らないものは自身の母語について何も知らないのと等しい。 by ヨハン・ ヴォルフガング・フォン・ゲーテ、ドイツ人文豪) 10

11.

1. 言語比較の意義 自然言語においては、英語をはじめとした外国語を勉学・生活・仕事で使 うことによって日本語との違いを嫌でも意識することになるので、自身と 母語のアイデンティティについて深く考察することになる。 ※ 詳細は拙作「現代英語を知ろう Vol.5 -ことばの側面-」を参照。 11

12.

1. 言語比較の意義 プログラミング言語においては、『プログラマが知るべき97のこと > 26. 言 語だけでなく文化も学ぶ』においても Anders Norås 氏が同様のことに言及 している。 Andy Hunt と Dave Thomas は、多くの人に影特を与えた著書「逮人プログラ マ」の中で、「毎年、新たなプログラミング言語を1つは学ぶこと」と勧め ています。私はそのアドバイスに従い、過去何年かの間に実際に数多くの 言語を学んできました。そして、その中で「言語を学ぶというのは、ただ 文法、構文を学ぶことではなく、その背景にある文化も学ぶこと」という 重要な教訓を得ました。 12

13.

1. 言語比較の意義 昨今はソフトウェアエンジニアの責務の広さ・深さともに大きくなってい るため、我々が複数言語を扱えることは事実上の必須要件のようになって いると感じている。 折角複数言語を扱うのであれば、言語比較を通じて第一言語への理解を深 めることには、スキルセット以上に大きな意義があるはずだ。 LT という特性上時間の制約を大きく受けるため、今回は我々(私とオーディ エンスの皆様)の第一言語である Ruby が何者であるかを意識するきっかけを 作るのがゴールである。 13

14.

2. Ruby と Python の三大共通点 14

15.

2. Ruby と Python の三大共通点 Ruby と Python には以下3つの大きな共通点がある。 1. オブジェクト指向である 2. 動的型付け言語である 3. 開発者体験重視である 15

16.

2. Ruby と Python の三大共通点 ① オブジェクト指向である オブジェクト指向の三原則は以下の通りである。 1. 継承: 親クラス(基底クラス)の抽象度の高いメソッドや属性を子クラスが継承。子クラスは 親クラス(基底クラス)の性質を受け継ぐため、差分のみ実装をすれば良いので再利用性によ るコーディング効率化が可能 2. ポリモーフィズム(多様性): メソッド呼び出しというメッセージを受け取るレシーバーに よ っ て 挙 動 が 異 な る こ と (e.g., Doctor#practice は 「 ~ を 開 業 す る 」 と い う 行 為 を 、 Athlete#practice は「~を練習する」といった具合) 3. カプセル化: 内部の詳細な処理やデータを隠蔽し、I/F を通じたレシーバー間のメッセージ (メソッドコールや属性へのアクセス)に起因する外側から見た振舞いのみに関心を持つ仕様 のこと。内部処理への強結合を仕様レベルで防ぐことで保守性を担保出来る側面を持つ 16

17.

2. Ruby と Python の三大共通点 ② 動的型付け言語である コンパイル時にデータ型が決定するのが「静的型付け」、実行時にデータ 型が変数のデータによって決定するのが「動的型付け」である。 前者は C ・Java・TypeScript、後者は Ruby・Python・JavaScript・PHP などが 当てはまる。 Ruby や Python などの動的型付け言語は実装者である人間が干渉できないた め、実行時まで変数にどんな型のデータが入っているかが分からない。 そのため、それが一見して分かるような変数の命名は特に重要である。 『プログラマが知るべき97のこと > 107. 名前重要』において Ruby の生みの 父であるまつもとゆきひろ氏(以降、Matz)が言及しているが、適切な命名は 適切な設計の鑑である。 17

18.

2. Ruby と Python の三大共通点 ③ 開発者体験重視である Ruby や Python は実行が容易である、動的プログラミング(e.g., `eval` 関数・ `Module#class_eval`)が可能であるなど、その強力な特長を活かした良質な コーディング体験を開発者に提供してくれる。 雑に書いたプログラムですら動いてしまうので、「大いなる力には大いな る責任が伴う」の格言通り、一定以上の力量を持って駆使しなければ可読 性の低下と煩雑なデバッグ体験などのトレードオフに痛いしっぺ返しを食 らうことになる。 要件に基づいて仕様を明らかにし、そこから逆算して必要な実装をクラ ス・メソッドあたりの責務のスコープを最小限に絞って行う必要がある。 ここまで話せばテストコードの重要性は言わずもがな、自明であろう。 18

19.

3. Ruby と Python の三大相違点 19

20.

3. Ruby と Python の三大相違点 Ruby と Python には以下3つの大きな相違点がある。 1. Private フィールドの概念の有無 2. 遅延評価での返り値キャッシュ手法 3. レシーバーと引数 20

21.

3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 Ruby には `private` キーワード以下を Private フィールドして扱う機構が存 在する。 一方、Python には Private フィールドの概念そのものがない。 21

22.

3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 22

23.

3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 「2. Ruby と Python の三大共通点 > ① オブジェクト指向である > 3. カプセル 化」で言及した内部の詳細な処理やデータを隠蔽する機構がオブジェクト 言語の大きな特徴だが、Python にはこれが存在しない。 これはクラス外でもデータの書き換えやメソッドコール・オーバーライド が可能なので、バグが混入する可能性が高く危険である。 また、`def _method` や `def __method__` のように定義して暗黙的にプライ ベートメソッドとして扱うことは出来るが、機構に保障されていないので 安全ではない。 また、ライブラリのメソッドは `_` で始まる命名が多いため、思わぬオー バーライドを誘発することも Python ユーザーには嘆かれていることは X と Quora で観測している。 23

24.

3. Ruby と Python の三大相違点 ② 遅延評価での返り値キャッシュ手法 言語によって利用可能な記号が異なる。 その1つが `||` である。 Ruby において当該記号は返り値のメモ化(キャッシュ)でよく使われる。 一方、Python では当該記号は使えないため、Ruby のようにメソッド定義で 遅延評価でのキャッシュを行うことは出来ない。 Python では、次スライドのようにメソッドの返り値をインスタンス変数に 代入することでキャッシュすることしか出来ない模様。 24

25.

3. Ruby と Python の三大相違点 ② 遅延評価での返り値キャッシュ手法 25

26.

3. Ruby と Python の三大相違点 ③ レシーバーと引数 Ruby と Python を交互に書いていて、同じ用途・同じ名前の組込みメソッド をコールする際にレシーバーと引数を逆に書いてしまうことがよくある。 その一例が Ruby の `Array#join`、Python の `String#join` だ。 • `Array#join` in Ruby: 結合対象の配列をレシーバーに、区切り文字を引数に 取る • `String#join` in Python: 区切り文字をレシーバーに、結合対象の配列を引数 に取る 26

27.

3. Ruby と Python の三大相違点 ③ レシーバーと引数 27

28.

3. Ruby と Python の三大相違点 ③ レシーバーと引数 英語として解釈すると以下のようになる。 • `Array#join` in Ruby: The target elements join together with the delimiter you provide. • `String#join` in Python: The delimiter you provide joins the target element together. 英語においては、情報の発信者⇆受信者間で既出の情報である旧情報(Given Information)を出来るだけ前に、新出の新情報(New Information)を出来るだ け後に置く文末焦点の法則(End-Focus)というものが存在する。 つまり、強調したい情報は文末に置かれる。 28

29.

3. Ruby と Python の三大相違点 ③ レシーバーと引数 その意味で、配列を結合して文字列を生成するにおいて、Ruby は delimiter(区切り文字)に、Python は結合対象の配列の要素にそれぞれ関心を 持っていることになる。 開発者体験の観点で、結合対象の配列の要素を最初に、区切り文字を最後 に認知する方が「何が何で結合されるか」を理解しやすくて好ましい。 自然言語同様、第二言語や外国語の習得難易度は母語(第一言語)に依存する ため、個人的な感覚かも知れない。 しかし、Ruby の方が英語を専門にしていた人間の感覚からしても自然言語 により近い「書き味」と「可読性」を提供しているのだ。 29

30.

5. おわりに 30

31.

5. おわりに 5分間という限られた時間の中ではあったが、Python という比較対象を明 らかにすることで、普段開発で使っている Ruby がどのような特徴や性質 を持つプログラミング言語かを各自で考えるきっかけになっただろうか。 『プログラマが知るべき97のこと > 43. プログラミング言語は複数習得す べき』の中ではパラダイム(仕組み・枠組み)が異なる言語を習得すること が推奨されている。 自然言語でいえば、アルタイ語派の日本語を話す我々がゲルマン語派の 英語を習得するようなものである(「?」な方は拙作「 現代英語を知ろう Vol.1 -英語という言語- > 2. 言語と語族と習得難易度の関係 」を参照)。 両者の文法・語彙・コロケーションが全く異なるので習得難易度は高い。 同じことがプログラミング言語でも言えるということだ。 31

32.

5. おわりに (言語であるかは怪しいが) GitHub Actions でワークフローを組む際に Shell Script を書くことがある。 いつも書いている Ruby の感覚でオブジェクト指向の要領で書こうとすると大抵 無理が来る。 配列などは多用せず、単純な処理を共通化する程度の実装が推奨されている。 これもパラダイムの違いによるものだ。 Go や Rust など、データ指向言語は扱ったことがないが、こういった言語を扱う 機会があれば同じテーマでまた発表したいと考えている。 すでに習得済みの方がいれば、比較言語学の成果を共有して頂けるととても参 考になるので嬉しく思う。 32

33.

6. 参考文献 33

34.

6. 参考文献 • プログラマが知るべき97のこと • 最終アクセス日: 2025年02月10日 • He who knows no foreign language knows nothing of his mother tongue - La Academia Language School • 最終アクセス日: 2025年02月10日 • オブジェクト指向とは? 基礎から用語の意味まで分かりやすく解説 - エン ジニア type • 最終アクセス日: 2025年02月10日 • コンパイラ言語とインタプリタ言語の違いとは?各言語のメリットも解説 - RENTEQ BLOG • 最終アクセス日: 2025年02月10日 34

35.

EOD 35