Save 37% off PRO during our Black Friday Sale! »

3つの言語 3つの世界

24f2b4b72c52a14b1d863a6731734f69?s=47 soukouki
July 02, 2021
23

3つの言語 3つの世界

A-pxlのLT会で発表したスライドです.
Ruby, Scheme, Elmについての簡単な紹介です.

C, C#のような言語を主に触ってきた方を対象にしています.

24f2b4b72c52a14b1d863a6731734f69?s=128

soukouki

July 02, 2021
Tweet

Transcript

  1. 3つの言語 3つの世界

  2. オーム社の、 「7つの言語 7つの世界」 のパロディです。

  3. 自己紹介 29期生で学部1年の sou7 / soukouki です。「そうくん」「そうせぶん」 なんて読んでいただけると嬉しいで す。「そう」だけだとたまに反応し ないことがあります。 twitter:@sou7___

    (アンダーバーは3つ!) discord:sou7#0094 github:soukouki atcoder:soukouki atcoder茶色です。よわよわー。
  4. たくさんの言語を触るのは楽しい! いろいろな言語を触ってみるのが好きなのですが、これまでに触ってきた言語の中か ら、お気に入りのものを3つほど紹介したいと思います。

  5. たくさんの言語って? 特に1年生はプログラミング言語と言っても、あまりピンとこない人も多いと思いま す。プログラミング入門でC言語を触ったり、A-pxlの勉強会でC#を触れたりくらいで しょうか。 しかし、世の中にはそれこそ星の数ほど言語があるのです!。私が今までに触れた言 語は、その中の極々一部、限られたものですが、紹介したいと思います。 今回紹介する言語は、Ruby、Scheme、そしてElmと呼ばれる言語です。(Schemeは言 語として扱われないことが多いですが、今回は実態を考えて1つの言語として扱いま す。)

  6. Ruby 最初に紹介する言語はRubyです。 1995年に登場したもので、強い動的型付け、ダックタイピングが特徴な言語です。

  7. コードを読んでみよう! 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)
  8. C言語やC#言語しか触ったことがないと、へんてこな感じに見えるかもしれません。 Rubyには配列に関するたくさんのメソッド(ものを引数に取る関数みたいなもの)があ り、配列に関する処理がサクサク書けます。

  9. Prog0 演習第7回B1問題での例 以下の仕様に従い、実行例のように動作するプログラムを作成せよ。 要素数100のint型配列input, odd, evenを宣言する キーボードから最大100個の整数値を入力し、配列inputに格納する 入力値のうち奇数は配列oddにも格納する 入力値のうち偶数は配列evenにも格納する 配列input,

    odd, evenに格納された数値の個数は別途変数に格納しておくこと 0が入力されたら入力を打ち切る 入力終了後、配列input, odd, evenの要素を順に表示する
  10. 面倒くさそう!

  11. 実際、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"); }
  12. でもRubyで書けば・・・ ・・・とその前に、Rubyで書きやすいように一部仕様を変えて、 数字の区切りを空白だけ、改行したら入力終了とすると、なんと4行で書けるようにな ります!

  13. arr = gets.split.map(&:to_i) puts "Input: "+arr.join(" ") puts "Odd: "+arr.select(&:odd?).join("

    ") puts "Even: "+arr.select(&:even?).join(" ") 短い!サイコー!高階関数サイコーーー!!
  14. Scheme 次に紹介するのは、Schemeです。 Schemeは正確に言うと言語ではなく、LISPと呼ばれる言語の方言の一つです。です が、LISPの方言は方言ごとの差異が大きく、それぞれが異なる特徴や仕組みを持つた め、今回はその中の1つの方言を紹介します。

  15. LISP ∋ Scheme LISPは、なんと1958年に初めて設計さたもので、今も広範囲に使用されている高水準 プログラミング言語の中ではFORTRANに次いで2番目に古いのです! 名前の由来はlist processorで、独特な構文を持つのが特徴です。 Scheme ∈ LISP

    Schemeは1975年に登場した、LISPの方言です。2013年に最新のバージョンが発表され ています。 名前の由来はSchemer(陰謀を企てる者)で、Schemeの前にもPlanner(計画する者)や Conniver(策略を巡らす者)などといった言語がありました。 (君たち物騒すぎない?)
  16. コードを読んでみよう! (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)) なに・・・これ・・・?
  17. さっきのRubyより、更にへんてこに見えるかもしれません。 <がんばってなんかうまいこと説明する>

  18. Schemeのいいところ・・・? 言語仕様が単純です! あとfor文もwhile文もない! (イケてない人) プログラムの基本はifとfor そんなことはない!!! あとは・・・なんだろう・・・とりあえずなんか良い!

  19. Elm Elmは純粋関数型言語(!)の、強い静的型付けが特徴の言語です。 この言語はJavaScriptへ翻訳し(トランスパイル)、そのJavaScriptを動かすことで動作し ます。 2012年にイヴァンさんが修士論文として発表したのが最初で、とてもきれいな構文で 楽しく書けます。

  20. 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
  21. 純粋であるがゆえに・・・ 勘の良い方は気づいたかもしれませんが、実はこのコード、これまでと違ってFizzBuzz の実行結果を表示するコードがありません。 Elmでは、副作用のある動作ができない仕組みになっていて、一度作った値に対して、 後から変更を加えることができません。 具体的に言うと、 value = 123 value

    = 456 (値を再代入しようとしている) のようなコードが書けません。 console.log や printf のような標準出力に文字を出力するものも、外部の値を変更す ると捉えられるので書けません。
  22. ただ単に使いづらいだけに感じる人も多いと思いますが、これが実は心強い機能なの です。 1つ目に、デバッグが簡単です。思ったとおりに動かないときには、関数と引数だけ を確認してやればいいのです。引数以外の外部の値を参照できないので、関数と引数 を見ればどう動いているのかがわかります。 2つ目に、テストを簡単に書けます。引数以外の外部の値を参照できないので、関数 に同じ値を渡してやると、必ず同じ結果が得られます。また、値を変更することもで きないので、戻り値をチェックしてやればうまく動いているかが確認できます。 3つ目に、コードがシンプルになります。色んな所に代入し、あっちこっちに処理が 移るような、複雑で理解が難しいようなプログラムを書けません。Elmのような言語を

    使えば、シンプルで簡潔なプログラムに矯正してくれるのです。 4つ目に、関数型言語を書いているとイケてる風に感じます。最近は関数型言語が流 行りなので[要出典]、流行りを追ってみましょう()
  23. この仕組みに関して、私は真に驚くべき説明を見つけたが、この余白はそれを書くに は狭すぎる。 (詳しくは割愛します、気になる人は後で聞きに来てください!)

  24. おわりに これまでに3つの言語を紹介してきましたが、今回は省いたScalaやRust、そしてまだ知 らない未知なる言語が、世の中にはたくさんあります。 それらの言語は、汎用的なプログラムを書けるようにしたり、特定の分野に限定して 楽に簡単に書けるようにしたり、はたまた研究のために生み出された実験的な言語で あったりします。 一つ一つの言語はその目的を果たすために、様々な表現を生み出し組み合わせて作ら れています。 皆さんもいろいろなプログラミング言語に触れて、その言語の面白く、そして愛すべ き点を見つけてみてください。そしてぜひ、私にその点を教えて下さい。