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
1.2k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
150
Coqで選択公理を形式化してみた
soukouki
0
290
「プログラミング」と「数学」の関係 〜カリー・ハワード同系対応と定理証明支援系Coq〜
soukouki
1
170
型クラスと依存型のカルパッチョ、代数的構造を添えて
soukouki
2
520
Coqのコントリビューターになった話
soukouki
0
170
次に流行る※プログラミング言語「Lean」
soukouki
3
1.6k
証明しながらプログラミング! - タクティックによるCoqプログラミング
soukouki
0
270
帰納型とパターンマッチングの紹介
soukouki
0
150
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Thoughts on Productivity
jonyablonski
69
4.5k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
4 Signs Your Business is Dying
shpigford
182
22k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
980
BBQ
matthewcrist
87
9.5k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
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、そしてまだ知 らない未知なる言語が、世の中にはたくさんあります。 それらの言語は、汎用的なプログラムを書けるようにしたり、特定の分野に限定して 楽に簡単に書けるようにしたり、はたまた研究のために生み出された実験的な言語で あったりします。 一つ一つの言語はその目的を果たすために、様々な表現を生み出し組み合わせて作ら れています。 皆さんもいろいろなプログラミング言語に触れて、その言語の面白く、そして愛すべ き点を見つけてみてください。そしてぜひ、私にその点を教えて下さい。