Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
3つの言語 3つの世界
Search
soukouki
July 02, 2021
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
3つの言語 3つの世界
A-pxlのLT会で発表したスライドです.
Ruby, Scheme, Elmについての簡単な紹介です.
C, C#のような言語を主に触ってきた方を対象にしています.
soukouki
July 02, 2021
More Decks by soukouki
See All by soukouki
ローカルLLMバイブコーディングのすすめ
soukouki
0
130
ゲーム画面をブラウザから見られるサイトを作った話
soukouki
0
120
Simutrans CityView (日本語版)
soukouki
0
170
Simutrans CityView (English)
soukouki
0
130
10分で学ぶ すてきなモナド
soukouki
1
220
Misskey自鯖を建ててみた
soukouki
1
130
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
soukouki
0
610
自作Cコンパイラ 8時間の奮闘
soukouki
0
2k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
290
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Curse of the Amulet
leimatthew05
3
15k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Docker and Python
trallard
47
4.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
450
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、そしてまだ知 らない未知なる言語が、世の中にはたくさんあります。 それらの言語は、汎用的なプログラムを書けるようにしたり、特定の分野に限定して 楽に簡単に書けるようにしたり、はたまた研究のために生み出された実験的な言語で あったりします。 一つ一つの言語はその目的を果たすために、様々な表現を生み出し組み合わせて作ら れています。 皆さんもいろいろなプログラミング言語に触れて、その言語の面白く、そして愛すべ き点を見つけてみてください。そしてぜひ、私にその点を教えて下さい。