- 雑 にプログラミング言語を紹介します
- 後半になるにつれ雑度が単調増加します
- 独断と偏見と 知ったかぶり にまみれています
- 使ったことのない言語も混じっています
- 初心者向けではないものもあります
- RosettaCode から引っ張ってきた FizzBuzz のコードを貼っておきます
- 最初に学ぶ人が最も多い言語
- とりあえずこれをやっておけ感がある
- だが、文字列の扱いとかポインタとか意外と面倒な概念が多い
- 一通りやって他の言語に触れるのがオススメ
- ロ技研で講習会やります
- マイコン / 組み込み
- システムプログラミング (OSとかドライバとか)
- 大学の講義(コンピュータサイエンス/情報実験第一/他)
#include<stdio.h>
int main (void)
{
int i;
for (i = 1; i <= 100; i++)
{
if (!(i % 15))
printf ("FizzBuzz");
else if (!(i % 3))
printf ("Fizz");
else if (!(i % 5))
printf ("Buzz");
else
printf ("%d", i);
printf("\n");
}
return 0;
}
- アイティー企業でよく使われる言語
- 「オブジェクト指向型プログラミング言語」
- 上手に使えば、大規模なシステムでもメンテナンス性の高いコードが書けるようになります
- 上手な使い方は本で勉強するのがいいです
- AndroidアプリはJavaで書けます
- 業務システムプログラミング
- 業務ウェブサービス
- Android アプリ
- 社会にはJavaを書く仕事が多いです。履歴書に書けます。
- ただ、東工大生(の情報系)ならJavaぐらい書けて当然というイメージがあるので無意味な気がする…
public class FizzBuzz{
public static void main(String[] args){
for(int i= 1; i <= 100; i++){
String output = "";
if(i % 3 == 0) output += "Fizz";
if(i % 5 == 0) output += "Buzz";
if(output.equals("")) output += i;
System.out.println(output);
}
}
}
- C の進化系 / オブジェクト指向言語でもある
- 言語仕様が大きい
- 標準ライブラリも大きい
- ユーザーライブラリは無数にある
- これで同人ゲームを作る人が多い (with DirectX)
- 3DゲームならUnityとかUEを使おう (楽したいなら)
- 部室に本が沢山あります
- 2Dゲーム
- マイコンプログラミング
- 競技プログラミング
- ICPCとか
- 社会
- 某G社を始め、C++は社会で広く使われています
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> range(100);
std::iota(range.begin(), range.end(), 1);
std::vector<std::string> values;
values.resize(range.size());
auto fizzbuzz = [](int i) -> std::string {
if ((i%15) == 0) return "FizzBuzz";
if ((i%5) == 0) return "Buzz";
if ((i%3) == 0) return "Fizz";
return std::to_string(i);
};
std::transform(range.begin(), range.end(), values.begin(), fizzbuzz);
for (auto& str: values) std::cout << str << std::endl;
return 0;
}
- マイクロソフト謹製Javaっぽい言語
- 実用的で書きやすいし、機能も多いので言語としてはGood.
- 型周りがダメという人もいる
- だが、環境が Windows + Visual Studio 限定である (通常)
- 今後の発展に期待?
- WindowsのGUIアプリケーション
- デザイナで配置ができる
- ゲーム
- Unity
using System;
using System.Linq;
namespace FizzBuzz
{
class Program
{
static void Main(string[] args)
{
Enumerable.Range(1, 100)
.Select(a => String.Format("{0}{1}", a % 3 == 0 ? "Fizz" : string.Empty, a % 5 == 0 ? "Buzz" : string.Empty))
.Select((b, i) => String.IsNullOrEmpty(b) ? (i + 1).ToString() : b)
.ToList()
.ForEach(Console.WriteLine);
}
}
}
- Webブラウザで動く唯一の言語
- 最近Webブラウザを飛び出してきた
- デスクトップアプリケーション(nwjs atomshell)
- スマホアプリ(Titanium, React Native, ManifoldJS)
- サーバー (node.js io.js)
- IoT (モノのインターネット)
- ユーザーライブラリが無数にある
- Web系の仕事/作品やるなら必須
- 部室に本はほぼ無いです。購入希望者がいたら部長に言ってください。
- ネットで充分という説もある
- JavaScript sucks. (but) We need JavaScript.
- 某純粋関数型言語の公式サイトより
- JavaScriptに 不満 を抱く人が多い
- でもブラウザはJSしか使えない…
- JavaScript に 変換するための言語/ソフトがある
- JSにコンパイル出来る言語処理系 400以上
- 例
- CoffeeScript, TypeScript, PureScript, Babel, JSX, Closure Compiler, Facebook Flow, Elm, emscripten
var i, output;
for (i = 1; i < 101; i++) {
output = '';
if (!(i % 3)) output += 'Fizz';
if (!(i % 5)) output += 'Buzz';
console.log(output || i);
}
- 学習コストが低い言語
- プログラミング経験があれば短時間で書けるようになる
- 初めてのプログラミング言語としてもいいかも
- 研究で使われることもしばしば
- numpy/scipyという科学計算用のライブラリが有る
- MATLABの方が速い
- numpy/scipyという科学計算用のライブラリが有る
- ユーザーライブラリが多い
- 確か部室にオライリーの本があったはず
for i in range(1, 101):
if i % 15 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
- Ruby on Rails というサーバー用ライブラリで一世を風靡した時代もあった
- 今も一応案件があるので使われてるっぽいです
- 自分は書き捨てスクリプトをよくRubyで書いています
- 書き捨て→一回きり動かすために書く。ファイル一括操作とか
1.upto(100) do |n|
print "Fizz" if a = (n % 3).zero?
print "Buzz" if b = (n % 5).zero?
print n unless (a || b)
puts
end
- Webアプリケーションを作るための言語
- 超実用主義言語。メンテナンス性は…
- 書く人による、という話もある
- フレームワーク使えばちょっとはメンテナンス性上がります。
<?php
for ($i = 1; $i <= 100; $i++)
{
if (!($i % 15))
echo "FizzBuzz\n";
else if (!($i % 3))
echo "Fizz\n";
else if (!($i % 5))
echo "Buzz\n";
else
echo "$i\n";
}
?>
- iOSアプリ, Macアプリを作る言語
- Swiftは去年登場 (Obj-Cは1983...)
- 今からならSwiftを勉強したほうがいいと思います
/* Swift */
for i in 1...100 {
switch (i % 3, i % 5) {
case (0, 0):
println("FizzBuzz")
case (0, _):
println("Fizz")
case (_, 0):
println("Buzz")
default:
println(i)
}
}
- 今までも初心者向けじゃないかもしれませんが…
- 純粋静的型付関数型言語
- とりあえず怖い人が使っているというイメージが有る言語
- だが、関数型言語の中ではトップレベルにコミュニティがデカい
- 「モナドは実際スゴイ」「ナンデ!?副作用ナンデ?!」「圏論な」 などのマサカリめいた脅し文句がTwitterで跋扈している◆備えよう◆
- 圏論をやる必要はないです!
fizzbuzz :: Int -> String
fizzbuzz n = fromMaybe (show n) $
(guard (n `mod` 3 == 0) >> pure "Fizz") <>
(guard (n `mod` 5 == 0) >> pure "Buzz")
main :: IO ()
main = forM_ [1..100] $ putStrLn . fizzbuzz
https://gist.github.com/tanakh/8006086
- 非純粋静的型付関数型言語
- 実は処理速度がC/C++に迫る勢いである
- コンパイラを作るのにオススメ?
- 日本語の本として五十嵐 淳先生の「プログラミング in OCaml」があります
- 親戚に F# (Microsoft) という言語が居ます
- 次Ocaml言うたらキレるで
let (=>) cond f a = if cond then f a else a
let append s a = a^s
let fizzbuzz i =
"" |> (i mod 3 = 0 => append "Fizz")
|> (i mod 5 = 0 => append "Buzz")
|> (function "" -> string_of_int i
| s -> s)
- 非純粋動的型付関数型言語
- カッコがたくさん出てくる言語です
(define (fizzbuzz x y)
(println
(cond (( = (modulo x 15) 0 ) "FizzBuzz")
(( = (modulo x 3) 0 ) "Fizz")
(( = (modulo x 5) 0 ) "Buzz")
(else x)))
(if (< x y) (fizzbuzz (+ x 1) y)))
(fizzbuzz 1 100)
- 昔はLISPは人工知能向けの言語と言われた
- 現在では流石にこれ使って研究してる人はいないと思う……
- LISP言語
- Java VMの上で動きます
- core.* ライブラリは楽しい物が多いです
- core.logic, core.typed
- ClojureScript という AltJS もあります
- om というサーバーライブラリが有名
- 4clojure でコードを書きながら勉強が出来ます
(defn fizzbuzz [start finish]
(map (fn [n]
(cond
(zero? (mod n 15)) "FizzBuzz"
(zero? (mod n 3)) "Fizz"
(zero? (mod n 5)) "Buzz"
:else n))
(range start finish)))
(fizzbuzz 1 100)
- Javaの実行環境で動く言語
- 関数型プログラミング(とオブジェクト指向プログラミング)が出来る
- 最近本が何冊か出版された(初心者向けではない)
- Play Framework というサーバーライブラリが有名
- 「これから来る言語」と数年前から言われている
one-liner
for (i <- 1 to 100) println(Seq(15 -> "FizzBuzz", 3 -> "Fizz", 5 -> "Buzz").find(i % _._1 == 0).map(_._2).getOrElse(i))
- Google謹製言語
- 軽量 / 高速 / 安全
- Python/RubyなどのLL系言語っぽさがあるが、C言語っぽさもある。
- 最近じわじわと話を聞くようになってきた
- サーバーサイド周りをGoで書き直す話とか
package main
import "fmt"
func main() {
for i := 1; i <= 100; i++ {
switch {
case i%15==0:
fmt.Println("FizzBuzz")
case i%3==0:
fmt.Println("Fizz")
case i%5==0:
fmt.Println("Buzz")
default:
fmt.Println(i)
}
}
}
- C++の光景として開発された言語
- コンパイル時処理周り(型推論含め)が強い
- 速度も良いしコンパイルも速い (C++とかScalaではコンパイルが遅いのが問題)
- コミュニティが小さく情報が少ないのが問題、あとユーザーライブラリも少ない。
import std.stdio;
void main() {
foreach (immutable i; 1 .. n + 1) {
if (!(i % 15))
"FizzBuzz".writeln;
else if (!(i % 3))
"Fizz".writeln;
else if (!(i % 5))
"Buzz".writeln;
else
i.writeln;
}
}
- C/C++のスクリプティングで使われる
- ゲームでのスクリプティングで最も使われている(らしい)
- PHANTASY STAR ONLINE 2, ファイナルファンタジーXIV, アイドルマスター2 ....
- 東方花映塚のAIをLuaで記述できる「花AI塚」というものをロ技研の先輩が作った
- 動作速度が速い (LuaJIT)
for i = 1, 100 do
if i % 15 == 0 then
print("FizzBuzz")
elseif i % 3 == 0 then
print("Fizz")
elseif i % 5 == 0 then
print("Buzz")
else
print(i)
end
end
- UNIXのシェル(Windowsでいうコマンドプロンプトみたいなの)で動かすための言語
- いろいろなコマンドを組み合わせて(主に文字列)処理を描きます
- awk, grep, tr, cat, ...
- シェルでエレガントにデータ処理することを「シェル芸」、またその人を「シェル芸人」と呼ぶ。
#!/bin/bash
for ((n=1; n<=100; n++))
do
fb=''
[ $(( n % 3 )) -eq 0 ] && fb="${fb}Fizz"
[ $(( n % 5 )) -eq 0 ] && fb="${fb}Buzz"
[ -n "${fb}" ] && echo "${fb}" || echo "$n"
done
- 古典言語 (Ruby や Python比)
- 古典言語さながらに魔術を扱えます
- 古典ラテン語で記述できるライブラリが有る → Lingua::Romana:Perligata
- 2000年代前半の掲示板とかチャットとかはこれで実装されてました
- とほほのCGIとか
- Perl 6 は別物です
use strict;
use warnings;
use feature qw(say);
for my $i (1..100) {
say $i % 15 == 0 ? "FizzBuzz"
: $i % 3 == 0 ? "Fizz"
: $i % 5 == 0 ? "Buzz"
: $i;
}
- 統計向け言語
- 統計やテキストマイニングに非常に特化しており、その周りのライブラリが豊富
- プログラミング言語として他の言語と比較して見ると割りとアレ
xx <- x <- 1:100
xx[x %% 3 == 0] <- "Fizz"
xx[x %% 5 == 0] <- "Buzz"
xx[x %% 15 == 0] <- "FizzBuzz"
xx
- 数値計算に特化した言語
- MATLAB や Numpy/Scipy と方向性が似ている
- 構文は割りととっつきやすい
- グラフプロットする機能が便利
- 高速
- ベンチマークが公式サイトにあります
- FortranやJavaに迫る勢い
- 新しい言語なので情報が少ない
for i = 1:100
msg = "Fizz" ^ (i%3==0) * "Buzz" ^ (i%5==0)
println(msg=="" ? i : msg)
end
- 電話会社が作った言語
- スケーラビリティを重視
- 関数型っぽい作りになっている
- 「並行/並列/分散」に興味あるなら触ってみるといいかもしれない
- でもTSUBAMEには向いてません。多分。
- 派生で文法をRubyっぽくした Elixir という言語も有る。
fizzbuzz() ->
F = fun(N) when N rem 15 == 0 -> "FizzBuzz";
(N) when N rem 3 == 0 -> "Fizz";
(N) when N rem 5 == 0 -> "Buzz";
(N) -> integer_to_list(N)
end,
[F(N)++"\n" || N <- lists:seq(1,100)].
(ただ、このコードにErlangの醍醐味であるマルチスレッドはない)
- 機械語を人間が読めるようにしたもの
- つまり、CPUへの命令文を直接書く
- 普通のプログラミング言語はコンパイラを通して機械語に変換されます
- すなわち、普通は人間は書かない
- 何があっても高速化したい人、直接CPUの機能を使いたい人、情報工学科の人はこれに向き合わなければなりません
- 情報工学科は3種類のアセンブリを使う…
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 10
.globl _main
.align 4, 0x90
_main: ## @main
## BB#0:
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %edi
pushl %esi
subl $28, %esp
calll L0$pb
L0$pb:
popl %eax
movl $1, %esi
movl $-2004318071, %edi ## imm = 0xFFFFFFFF88888889
leal L_.str-L0$pb(%eax), %ecx
movl %ecx, -16(%ebp) ## 4-byte Spill
movl $1431655766, %ebx ## imm = 0x55555556
leal L_.str1-L0$pb(%eax), %ecx
movl %ecx, -24(%ebp) ## 4-byte Spill
leal L_.str2-L0$pb(%eax), %ecx
movl %ecx, -28(%ebp) ## 4-byte Spill
leal L_.str3-L0$pb(%eax), %eax
movl %eax, -20(%ebp) ## 4-byte Spill
.align 4, 0x90
LBB0_1: ## =>This Inner Loop Header: Depth=1
movl %esi, %eax
imull %edi
addl %esi, %edx
movl %edx, %eax
shrl $31, %eax
sarl $3, %edx
addl %eax, %edx
imull $15, %edx, %eax
cmpl %eax, %esi
je LBB0_2
## BB#3: ## in Loop: Header=BB0_1 Depth=1
movl %esi, %eax
imull %ebx
movl %edx, %eax
shrl $31, %eax
addl %edx, %eax
leal (%eax,%eax,2), %eax
cmpl %eax, %esi
je LBB0_4
## BB#5: ## in Loop: Header=BB0_1 Depth=1
movl %esi, %eax
movl $1717986919, %ecx ## imm = 0x66666667
imull %ecx
movl %edx, %eax
shrl $31, %eax
sarl %edx
addl %eax, %edx
leal (%edx,%edx,4), %eax
cmpl %eax, %esi
je LBB0_6
## BB#7: ## in Loop: Header=BB0_1 Depth=1
movl %esi, 4(%esp)
movl -20(%ebp), %eax ## 4-byte Reload
jmp LBB0_8
.align 4, 0x90
LBB0_2: ## in Loop: Header=BB0_1 Depth=1
movl -16(%ebp), %eax ## 4-byte Reload
jmp LBB0_8
.align 4, 0x90
LBB0_4: ## in Loop: Header=BB0_1 Depth=1
movl -24(%ebp), %eax ## 4-byte Reload
jmp LBB0_8
LBB0_6: ## in Loop: Header=BB0_1 Depth=1
movl -28(%ebp), %eax ## 4-byte Reload
.align 4, 0x90
LBB0_8: ## in Loop: Header=BB0_1 Depth=1
movl %eax, (%esp)
calll _printf
movl $10, (%esp)
calll _putchar
incl %esi
cmpl $101, %esi
jne LBB0_1
xorl %eax, %eax
addl $28, %esp
popl %esi
popl %edi
popl %ebx
popl %ebp
retl
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "FizzBuzz"
L_.str1: ## @.str1
.asciz "Fizz"
L_.str2: ## @.str2
.asciz "Buzz"
L_.str3: ## @.str3
.asciz "%d"
.subsections_via_symbols
- 朝令暮改言語
- 破壊的変更がしょっちゅう起こる
- 次世代の C++ になるかならないかといった感じ
- いかんせん仕様変更が激しいので…
- 言語オタク向け
fn main() {
for i in 1..101 {
let value = i.to_string();
println!("{}", match (i % 3, i % 5) {
(0,0) => "FizzBuzz",
(0,_) => "Fizz",
(_,0) => "Buzz",
_ => value.as_ref(),
});
}
}
- Alt(JavaScript|ActionScript|C++|C#|Java|PHP|Python)
- 色々な言語に翻訳できる
- NecoVMという機構でHaXeをそのまま実行することもできる
- 言語としてはJavaっぽい(AS派生)
- Generics、型推論、マクロなど高度な機能も
- コンパイラがOCamlで実装されています
static function main() {
for(i in 1...100){
var result = switch([i % 3, i % 5]){
case [0, 0]: "FizzBuzz";
case [0, _]: "Fizz";
case [_, 0]: "Buzz";
case _ : Std.string(i);
}
trace(result);
}
}
}
(RosettaCodeに無かったので自分で書きました……)
- 可読性を窓から投げ捨てて、極限まで簡潔に書けるようにした言語
- J言語はAPLをキーボードで打てるようにしたもの
- Project Euler という数学の問題をプログラムで解くサイトで見ます
- 寧ろそれ以外で見たことがない
A[I]←1+I←(0⍷A)/⍳⍴A←('FIZZBUZZ' 'FIZZ’ 'BUZZ' 0)[2⊥¨×(⊂3 5)|¨1+⍳100]
// APL言語
;:inv}.(":&.> [^:(0 = #@])&.> [: ,&.>/ (;:'Fizz Buzz') #&.>~ 0 = 3 5 |/ ])i.101
// J言語
- 命令が8つしか無い非実用言語
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
.<++++++++. --.+++. . --.>+.
- 自分はこれでC言語のポインタを理解しました
- 8つの命令を適当な文字列に置き換えて「プログラミング言語作ったったwwwww」というのが昔流行りました
- 今やってもそっぽ向かれるのでおすすめしません
+++++++++[>++++++++++[>+>+<<-]<-]>>>>++++++++++++++++++++++++++++++++++++++++++++++++[>+>+>+<<<-]<<<<>>[->->>>>+>>>>+><<<<<<<<++++++++++>>>>>>>>++++++++++<[-<<<<<<<->>>>>>>>-<]++++++++++<<<<<<<[->>>>>>>-<<<<<<<]>>>>[-]+>>>>[<<<<->>>>[-]]<<<<<<<<>>>>[<<<<>>> ->>>> -<+<<<<+<<++++++++++>>>>>>>>++++++++++<<[-<<<<<<->>>>>>>>-<<]++++++++++<<<<<<[->>>>>>-<<<<<<]>>>>[-]+>>>>[<<<<->>>>[-]]<<<<<<<<>>>>[<<<<>> ->>>> -<+<<<<+<>>>>[-]]<<<<>>>>[-]]<<<<>>>>>>>>>>>[-]+<<<[-]+++>>>>[-]+<<<<>+[-<->]+++<[->->>>[-]<<<<]>>>>[<[-]>[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++.+++++++++++++++++..[-]<<< >>>]<<<<[-]+++++>>>>[-]+<<<<>>+[-<<->>]+++++<<[->>->>[-]<<<<]>>>>[<[-]>[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++.+++++..[-]<< -->>]<<<<>>>[<<<<<<<<<<<>.>.>.<<<>>>>>>>>>>>[-]]<<<<<<<<<<<<<<<[-]+++++++++++++. .[-]>>]<<
- 56年前に事務処理用に開発された言語
- C言語の13年前です
- BASICよりも古い
- CやPerlがラテン語ならCOBOLはヒエログリフみたいなもんです
- ただしピラミッド・パワーによるものなのか金融系/勘定系のシステムで未だ使われているらしい…
- やめてくれ
IDENTIFICATION DIVISION.
PROGRAM-ID. fizzbuzz.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CNT PIC 9(03) VALUE 1.
01 REM PIC 9(03) VALUE 0.
01 QUOTIENT PIC 9(03) VALUE 0.
PROCEDURE DIVISION.
PERFORM UNTIL CNT > 100
DIVIDE 15 INTO CNT GIVING QUOTIENT REMAINDER REM
IF REM = 0
THEN
DISPLAY "FizzBuzz " WITH NO ADVANCING
ELSE
DIVIDE 3 INTO CNT GIVING QUOTIENT REMAINDER REM
IF REM = 0
THEN
DISPLAY "Fizz " WITH NO ADVANCING
ELSE
DIVIDE 5 INTO CNT GIVING QUOTIENT REMAINDER REM
IF REM = 0
THEN
DISPLAY "Buzz " WITH NO ADVANCING
ELSE
DISPLAY CNT " " WITH NO ADVANCING
END-IF
END-IF
END-IF
ADD 1 TO CNT
END-PERFORM
DISPLAY ""
STOP RUN.
- 科学計算のための言語
- COBOLよりも古く、1957年に登場
- 最も古いプログラミング言語?
- 物理学科や化学科では現役っぽいです
program fizzbuzz_if
integer :: i
do i = 1, 100
if (mod(i,15) == 0) then; print *, 'FizzBuzz'
else if (mod(i,3) == 0) then; print *, 'Fizz'
else if (mod(i,5) == 0) then; print *, 'Buzz'
else; print *, i
end if
end do
end program fizzbuzz_if