Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
3つの言語 3つの世界
Search
soukouki
July 02, 2021
0
68
3つの言語 3つの世界
A-pxlのLT会で発表したスライドです.
Ruby, Scheme, Elmについての簡単な紹介です.
C, C#のような言語を主に触ってきた方を対象にしています.
soukouki
July 02, 2021
Tweet
Share
More Decks by soukouki
See All by soukouki
自作Cコンパイラ 8時間の奮闘
soukouki
0
970
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
140
Coqで選択公理を形式化してみた
soukouki
0
190
「プログラミング」と「数学」の関係 〜カリー・ハワード同系対応と定理証明支援系Coq〜
soukouki
1
91
型クラスと依存型のカルパッチョ、代数的構造を添えて
soukouki
2
470
Coqのコントリビューターになった話
soukouki
0
160
次に流行る※プログラミング言語「Lean」
soukouki
2
1.4k
証明しながらプログラミング! - タクティックによるCoqプログラミング
soukouki
0
220
帰納型とパターンマッチングの紹介
soukouki
0
120
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
Automating Front-end Workflow
addyosmani
1366
200k
How to Ace a Technical Interview
jacobian
276
23k
Bash Introduction
62gerente
608
210k
What's new in Ruby 2.0
geeforr
343
31k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Thoughts on Productivity
jonyablonski
67
4.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
The Cost Of JavaScript in 2023
addyosmani
45
6.7k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Transcript
3つの言語 3つの世界
オーム社の、 「7つの言語 7つの世界」 のパロディです。
自己紹介 29期生で学部1年の sou7 / soukouki です。「そうくん」「そうせぶん」 なんて読んでいただけると嬉しいで す。「そう」だけだとたまに反応し ないことがあります。 twitter:@sou7___
(アンダーバーは3つ!) discord:sou7#0094 github:soukouki atcoder:soukouki atcoder茶色です。よわよわー。
たくさんの言語を触るのは楽しい! いろいろな言語を触ってみるのが好きなのですが、これまでに触ってきた言語の中か ら、お気に入りのものを3つほど紹介したいと思います。
たくさんの言語って? 特に1年生はプログラミング言語と言っても、あまりピンとこない人も多いと思いま す。プログラミング入門でC言語を触ったり、A-pxlの勉強会でC#を触れたりくらいで しょうか。 しかし、世の中にはそれこそ星の数ほど言語があるのです!。私が今までに触れた言 語は、その中の極々一部、限られたものですが、紹介したいと思います。 今回紹介する言語は、Ruby、Scheme、そしてElmと呼ばれる言語です。(Schemeは言 語として扱われないことが多いですが、今回は実態を考えて1つの言語として扱いま す。)
Ruby 最初に紹介する言語はRubyです。 1995年に登場したもので、強い動的型付け、ダックタイピングが特徴な言語です。
コードを読んでみよう! def fizzbuzz(n) (1..n).each do |i| if i%15 == 0
puts "FizzBuzz" elsif i%3 == 0 puts "Fizz" elsif i%5 == 0 puts "Buzz" end end end fizzbuzz(15)
C言語やC#言語しか触ったことがないと、へんてこな感じに見えるかもしれません。 Rubyには配列に関するたくさんのメソッド(ものを引数に取る関数みたいなもの)があ り、配列に関する処理がサクサク書けます。
Prog0 演習第7回B1問題での例 以下の仕様に従い、実行例のように動作するプログラムを作成せよ。 要素数100のint型配列input, odd, evenを宣言する キーボードから最大100個の整数値を入力し、配列inputに格納する 入力値のうち奇数は配列oddにも格納する 入力値のうち偶数は配列evenにも格納する 配列input,
odd, evenに格納された数値の個数は別途変数に格納しておくこと 0が入力されたら入力を打ち切る 入力終了後、配列input, odd, evenの要素を順に表示する
面倒くさそう!
実際、C言語では頑張ってコードを書かないといけません。 #include<stdio.h> int main() { int input[100], odd[100], even[100]; int
input_max=0, odd_max=0, even_max=0; for(int i=0; i<100; i++) { int n; scanf("%d", &n); if(n==0){ break; } input[input_max] = n; input_max++; if(n%2 == 0) { even[even_max] = n; even_max++; } else { odd[odd_max] = n; odd_max++; } } printf("Input:"); for(int i=0; i < input_max; i++) { printf("%3d", input[i]); } printf("\nOdd: "); for(int i=0; i < odd_max; i++) { printf("%3d", odd[i]); } printf("\nEven: "); for(int i=0; i < even_max; i++) { printf("%3d", even[i]); } printf("\n"); }
でもRubyで書けば・・・ ・・・とその前に、Rubyで書きやすいように一部仕様を変えて、 数字の区切りを空白だけ、改行したら入力終了とすると、なんと4行で書けるようにな ります!
arr = gets.split.map(&:to_i) puts "Input: "+arr.join(" ") puts "Odd: "+arr.select(&:odd?).join("
") puts "Even: "+arr.select(&:even?).join(" ") 短い!サイコー!高階関数サイコーーー!!
Scheme 次に紹介するのは、Schemeです。 Schemeは正確に言うと言語ではなく、LISPと呼ばれる言語の方言の一つです。です が、LISPの方言は方言ごとの差異が大きく、それぞれが異なる特徴や仕組みを持つた め、今回はその中の1つの方言を紹介します。
LISP ∋ Scheme LISPは、なんと1958年に初めて設計さたもので、今も広範囲に使用されている高水準 プログラミング言語の中ではFORTRANに次いで2番目に古いのです! 名前の由来はlist processorで、独特な構文を持つのが特徴です。 Scheme ∈ LISP
Schemeは1975年に登場した、LISPの方言です。2013年に最新のバージョンが発表され ています。 名前の由来はSchemer(陰謀を企てる者)で、Schemeの前にもPlanner(計画する者)や Conniver(策略を巡らす者)などといった言語がありました。 (君たち物騒すぎない?)
コードを読んでみよう! (define (fizzbuzz n) (define (fizzbuzz-i li n) (if (>=
n 1) (fizzbuzz-i (cons (fizzbuzz-ii n) li) (- n 1)) li)) (define (fizzbuzz-ii n) (cond ((= (modulo n 15) 0) "FizzBuzz") ((= (modulo n 3) 0) "Fizz") ((= (modulo n 5) 0) "Buzz") (else (number->string n)))) (fizzbuzz-i '() n)) (display (string-join (fizzbuzz 15) "\n" 'suffix)) なに・・・これ・・・?
さっきのRubyより、更にへんてこに見えるかもしれません。 <がんばってなんかうまいこと説明する>
Schemeのいいところ・・・? 言語仕様が単純です! あとfor文もwhile文もない! (イケてない人) プログラムの基本はifとfor そんなことはない!!! あとは・・・なんだろう・・・とりあえずなんか良い!
Elm Elmは純粋関数型言語(!)の、強い静的型付けが特徴の言語です。 この言語はJavaScriptへ翻訳し(トランスパイル)、そのJavaScriptを動かすことで動作し ます。 2012年にイヴァンさんが修士論文として発表したのが最初で、とてもきれいな構文で 楽しく書けます。
fizzbuzz : Int -> String fizzbuzz n = String.join "
" <| List.map fizzbuzzI <| List.range 1 n fizzbuzzI : Int -> String fizzbuzzI n = case (Basics.modBy 3 n == 0, Basics.modBy 5 n == 0) of (True, True) -> "FizzBuzz" (True, False) -> "Fizz" (False, True) -> "Buzz" (False, False) -> String.fromInt n
純粋であるがゆえに・・・ 勘の良い方は気づいたかもしれませんが、実はこのコード、これまでと違ってFizzBuzz の実行結果を表示するコードがありません。 Elmでは、副作用のある動作ができない仕組みになっていて、一度作った値に対して、 後から変更を加えることができません。 具体的に言うと、 value = 123 value
= 456 (値を再代入しようとしている) のようなコードが書けません。 console.log や printf のような標準出力に文字を出力するものも、外部の値を変更す ると捉えられるので書けません。
ただ単に使いづらいだけに感じる人も多いと思いますが、これが実は心強い機能なの です。 1つ目に、デバッグが簡単です。思ったとおりに動かないときには、関数と引数だけ を確認してやればいいのです。引数以外の外部の値を参照できないので、関数と引数 を見ればどう動いているのかがわかります。 2つ目に、テストを簡単に書けます。引数以外の外部の値を参照できないので、関数 に同じ値を渡してやると、必ず同じ結果が得られます。また、値を変更することもで きないので、戻り値をチェックしてやればうまく動いているかが確認できます。 3つ目に、コードがシンプルになります。色んな所に代入し、あっちこっちに処理が 移るような、複雑で理解が難しいようなプログラムを書けません。Elmのような言語を
使えば、シンプルで簡潔なプログラムに矯正してくれるのです。 4つ目に、関数型言語を書いているとイケてる風に感じます。最近は関数型言語が流 行りなので[要出典]、流行りを追ってみましょう()
この仕組みに関して、私は真に驚くべき説明を見つけたが、この余白はそれを書くに は狭すぎる。 (詳しくは割愛します、気になる人は後で聞きに来てください!)
おわりに これまでに3つの言語を紹介してきましたが、今回は省いたScalaやRust、そしてまだ知 らない未知なる言語が、世の中にはたくさんあります。 それらの言語は、汎用的なプログラムを書けるようにしたり、特定の分野に限定して 楽に簡単に書けるようにしたり、はたまた研究のために生み出された実験的な言語で あったりします。 一つ一つの言語はその目的を果たすために、様々な表現を生み出し組み合わせて作ら れています。 皆さんもいろいろなプログラミング言語に触れて、その言語の面白く、そして愛すべ き点を見つけてみてください。そしてぜひ、私にその点を教えて下さい。