tiobe programming community index for january 2012 top 20
TRANSCRIPT
C#が3位になったことを記念して
型付け(強い/弱い、動的/静的)
手続型/宣言型
命令型/構造化/オブジェクト指向/関数型
チューリング完全/非チューリング完全
2
言語機能
セマンティクス
文法
言語機能のシンプルさ
ライブラリの豊富さ
進化の速度
後方互換性の重視
利用されている分野
3
Java 「一度作ればどこでも動く」
豊富なライブラリ
多数のオープンソースフレームワーク
言語設計は大変堅実
オブジェクト指向があれば他の言語機能はあまりいらない
デスクトップアプリは尐々弱い
JavaFXに期待
4
構造化オブジェクト指向総称型命令型登場時期:1995年強い静的型付け
class Deriv extends Base{
public Deriv(){
System.out.println("Deriv::Deriv()");
}
public Deriv(int i){
super(i);
System.out.println("Deriv::Deriv(int)");
}
public static void main(String args[]){
System.out.println("main");
Deriv d1 = new Deriv();
Deriv d2 = new Deriv(1);
}
}
C
中級言語
ポインタ
「自分の足を撃つ自由」を絶対に手放さない言語
組み込みやOS構築用ではいまだ主流
初心者がまず覚えることが多い
教育に向いているかはかなり疑問
データと処理の構造化機能は十分にある
5
構造化命令型登場時期:1972年弱い静的型付け
char *strCpy(char *s1, const char *s2)
{
char *p = s1;
while(*s1++ = *s2++);
return p;
}
C#
先進的でよくまとまった機能
先進的で豊富なライブラリ
後方互換性も極力保つ
強力なIDEサポート
学ぶとMicrosoftに魂を売ることに
とはいえMonoとかISO/IEC 23270とかもある
大金をかけて設計され作られたツールというものは、かなり便利で使いやすいものです
6
構造化オブジェクト指向総称型命令型登場時期:2000年強い静的型付け4.0から動的型導入
class app {
static void Main() {
var names = { "Burke", "Connor", "Frank",
"Everett", "Albert", "George",
"Harris", "David" };
var query = from s in names
where s.Length == 5
orderby s
select s.ToUpper();
foreach (string item in query)
Console.WriteLine(item);
}
}
C++ Cと同等の低レベルから、非常に高レベルまで記述可能
それらを利用した豊富なライブラリ
1980年代から一貫した後方互換性
動作はもちろん、内部的な処理を複雑にすることすらしない
その結果、大変に複雑
新しい書き方、古い書き方、安全な書き方、速度重視の書き方などどんな書き方も禁止されていないが、その中から最適なものを選ぶのは人間
仕様を完全に満たしたコンパイラは存在しないといわれる
暗黒魔術が得意
7
構造化オブジェクト指向命令型総称型登場時期:1979年安全でない強い静的型付け
using namespace std;
#define foreach BOOST_FOREACH
int main() {
std::map<int , std::pair<string, string> > container;
container.insert(make_pair(0, make_pair("Python", "Guido van Rossum")));
container.insert(make_pair(1, make_pair("Perl", "Larry Wall")));
container.insert(make_pair(2, make_pair("Ruby", "Yukihiro Matsumoto")));
foreach (auto& item, container) {
auto& val = item.second;
cout < < val.first << " : " << val.second << endl;
}
return 0;
}
Objective-C
Apple専用言語
iOS開発で他の言語が禁止されたので、一躍主要言語に
一応オープンソース版もある
Smalltalkに感動した技術者が、CにSmalltalkの機能を組み込んでできた言語
文法的には精錬されてないと思う
Cocoaフレームワークは十分に先進的な機能を持つ
8
オブジェクト指向構造化命令型登場時期:1983年弱い静的型付け
void main() {
NSAutoreleasePool *pool =
[[NSAutoreleasePool alloc] init];
id text = [[Text alloc] autorelease];
[text setMessage:@"Hello World"];
[text printMessage];
[pool drain];
}
PHP
HTML生成専用言語
スクリプト的な書き方ができる
最近はオブジェクト指向も使える
動的言語の柔軟性もあるので、十分に近代的なライブラリは書ける
オブジェクト指向関連の文法はいまひとつこなれていない
9
オブジェクト指向構造化命令型登場時期:1995年弱い動的型付け
<html>
<head><title>output.php</title></head>
<body>
<?php
$name = $_POST['name'];
print ("次のデータを受け取りました<br />");
print ("名前:$name<br />");
?>
</body>
</html>
(Visual)Basic
BASIC
1980年代に大成功した教育用言語
~Visual Basic 6
GUI開発の敷居を大幅に引き下げた
Visual Basic .NET~
C#とほぼ同じ
XMLリテラルなどVB
10
登場時期:1964年
Dim r = 20.0
Dim pi = Function(birthday As Date)
If birthday.Year > 1990 AndAlso
birthday.Year < 2000 Then
Return 3
Else
Return 3.14
End If
End Function
Console.WriteLine(pi(Date.Today) * r * r)
Python
シンプルで拡張性の高い構文
書き方はひとつだけ
インデント
豊富なライブラリ
「電池が付属しています」
海外で特に普及
Googleの公式採用言語のひとつ
学術系で広まっている
11
構造化オブジェクト指向命令型登場時期:1990年強い動的型付け
from person import Person
class Employee(Person):
def __init__(self, name, age, company):
print '[Employee.__init__]'
Person.__init__(self, name, age)
self.company = company
def showinfo(self):
print '[Employee.showinfo]'
print '%s (%d) %s' % (self.name,self.age,self.company)
Perl
Ruby、Pythonへと続く高級スクリプト言語の祖
「あることをするのにいくつものやり方がある」
多くの記号を見慣れれば大変読みやすい
Perl5からはオブジェクト指向も利用可能
夢のPerl6
互換性を完全に捨てて、理想を追求したPerl
作り始めて10年以上。いつ完成するかは誰も知らない。
12
構造化オブジェクト指向命令型登場時期:1987年弱い動的型付け
$str = "ABCDEFGあいうえお";
for ($i = 0; $i < length($str); $i++) {
$c = substr($str, $i, 1);
if ($c =~ /[\x80-\xff]/) {
$c = substr($str, $i++, 2);
}
print "[$c] ";
}
JavaScript
Web世界のネイティブ言語
HTML5アプリの実装言語
大金をかけて高速化されている
シンプルでセンスのよいセマンティクス
プロトタイプベースのオブジェクト指向
ファーストクラスの関数オブジェクト
文法がどうもいまひとつなのが難点
13
構造化オブジェクト指向命令型登場時期:1995年弱い動的型付け
function Dog() {
this.state = "sitting";
this.showState = function(){
alert("I am " + this.state + ".");
};
}
var hachi = new Dog();
function LazyDog() {
this.state = "sleeping...";
}
LazyDog.prototype = new Dog();
var pochi = new LazyDog();
pochi.showState();
Delphi/Object Pascal Pascalをオブジェクト指向化したもの
C++やObjective-Cよりシンプルな文法
初期にはLisaやMacintoshの主要開発言語
現在はBorlandのDelphi言語が有名
クラスライブラリのVCLと共に一世を風靡
Windows用GUIクラスライブラリとしてMFCよりかなり使いやすい
当時の主要開発者は今はMicrosoftに移り、C#と.NET Frameworkなどを作っている
14
オブジェクト指向構造化命令型登場時期:1985年静的型付け
type TMyClass = class(TSuperClass)
private
Fa: Integer;
public
procedure SetValue(v: Integer);
function GetValue: Integer;
end;
implementation
procedure TMyClass.SetValue(v: Integer);
begin
Fa := v
end;
function TMyClass.GetValue: Integer;
begin
result := Fa
end;
Ruby 驚き最小の法則(Matzにとって)
多彩な文法表現力による、自然言語に近い可読性
説明用擬似コードの代わりによく使われる
言語自体はシンプル
ライブラリで言語拡張に近い表現が可能なので、ライブラリ作成者の工夫でどれだけでも可読性を上げられる
スクリプト言語の中でもひときわ遅いと言われる
IDEサポートは弱い
マルチスレッドが弱い
15
構造化オブジェクト指向命令型登場時期:1995年強い動的型付け
class Greeter
def initialize(name)
@name = name.capitalize
end
def salute
puts "Hello #{@name}!"
end
end
g = Greeter.new("world")
g.salute
LISP
先進的機能
関数型言語の祖
原則的に変数の書き換えはしない
ファーストクラスの関数オブジェクト
その起源は論文上での記述言語
機械語を意識するより便利な機能を追求する文化
長らく人工知能の記述言語によく使われていた
文法的には、とにかく括弧が多い
16
関数型登場時期:1958年動的型付け
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
Pascal
シンプルな構文
プログラム教育用言語
高速コンパイラ作成に向く(LL(1)文法)
Turbo Pascal
変数のスコープ
コンパイラの記述ができるほど強力な機能
17
構造化命令型登場時期:1970年静的型付け
program Hello(output);
begin
writeln('Hello, world!')
end.
Transact-SQL
MicrosoftとSybaseが拡張したSQL
手続き型言語として使える
SQLとの連携は便利
言語としての見所はなし
SQLはよい言語なのだが
18
構造化命令型宣言型静的型付け
DECLARE @Counter INT
SET @Counter = 10
WHILE @Counter > 0
BEGIN
PRINT 'The count is ' + CONVERT(VARCHAR(10), @Counter)
SET @Counter = @Counter - 1
END
PL-SQL
Oracleが拡張したSQL
手続き型言語として使える
SQLとの連携は便利
言語としての見所はなし
SQLはよい言語なのだが
19
構造化命令型登場時期:1988年静的型付け
DECLARE
hw VARCHAR2(100) := 'Hello World!';
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!') ;
DBMS_OUTPUT.PUT_LINE('VARIABLE hw = '||hw) ;
END;
Ada
米国国防総省が作った言語
当時としては大変先進的
大規模開発に向く
可読性を重視
コンパイル時、実行時の強い型検査
後にオブジェクト指向機能も追加(Ada 95)
ISOに認定された初のオブジェクト指向言語
20
構造化オブジェクト指向命令型登場時期:1983年安全な強い静的型付け
i : Integer := 2;
begin
for i in 2 .. 100 loop
if issosuu(i) = 1 then
Ada.Integer_Text_IO.Put(i);
Ada.Text_IO.New_Line;
end if;
end loop;
end Sosuu;
Logo
教育用言語
各国語に翻訳されている
方言多数
タートルグラフィック
構造化機能はある
21
構造化命令型登場時期:1967年動的型付け
手順は 三角前へ 100右へ 120前へ 100右へ 120前へ 100
おわり
R
統計処理用言語
プログラムに慣れていない人向け
ベクトル計算に特化した言語
統計処理、グラフ記述用ライブラリが豊富
日本語にも対応
セマンティクスは比較的先進的
高階関数などの機能
オブジェクト指向にも一応対応している
22
関数型オブジェクト指向構造化命令型登場時期:1996年動的型付け
s <-100000
x <-runif(s)
y <-runif(s)
sum(x^2+y^2<=1)*4/s
Lua
コンパクトな言語仕様
実行環境の容量はでPerl/Ruby/Pythonなどより二桁下
厳選されているので、記述力は十分にある
スクリプト言語にしては大変高速な動作
C関数の呼び出しも簡単
他アプリケーションへの組み込みに向く
ゲームとか
23
構造化命令型登場時期:1993年動的型付け
function sum(num1, num2)
local total = num1 + num2
return total
end
当ドキュメントにあるソースコードはネット上に公開されているものを利用しました。
24