Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
プログラミング言語論 A
(Concepts on Programming Languages)
趙 建軍 (チョウ)
(Jianjun Zhao)
http://stap.ait.kyushu-u.ac.jp/~zhao/course/2020/Concepts of Programming Languages.html1
第2回
講義の紹介 (Introduction)
2020.05.14
2
講義内容と目的
目的
◼ プログラミング言語に関するアイデアを一通り習得すること
内容
◼ プログラミング言語パラダイム
◼ プログラミング言語の諸要素
◼ プログラム理論
◼ プログラムの意味論
3
プログラミング言語の分類 (1)
記述と抽象度のレベル (Abstraction)◼ 機械語◼ アセンブリ言語◼ 高級言語
4
プログラミング言語の分類
5
プログラミング言語の分類 (2)
実行の形式◼ コンパイラ言語◼ インタプリタ言語◼ スクリプト言語
6
HIR LIR
HL O
pts
Reta
rget
LL O
pts
Code G
en
HL O
pts
LL O
pts
LL O
pts
HL O
pts
Phoenix + Tools : 10kft View
Native
Image
VB
C++
C#
Phx Core LibCore structures, Utils; AST, CodeGen Srvcs
I/O
Sync
Trans
mgr
Master
Program DB
+
Profiles
Lint
Designer
Visualizer
Modeler
Editor+
Browser
Xlator
Formatter
Rea
de
rs: C
IL, M
SIL
, HIR
, x86
Core
Program
Representation
[ AST+]
Custom
Extended
Pgm Rep
[AST++]
Phx APIs
Profiler
Obfuscator
Security
Checker
Refactor
Phx APIs
EXEJ#
7
プログラミング言語の分類 (3)
用途◼ 科学技術計算用言語◼ ビジネス用◼ 人工知能用言語◼ ネットワークプログラミング用◼ 特殊用途用(シミュレーション用、データ
ベース管理、…)
8
9
プログラミング言語の分類 (3)
10
プログラミング言語の分類 (4)
11
プログラミング言語の分類 (4)
12
プログラミング言語の分類 (5)
命令型プログラミング言語(Imperative)
手続き型Procedural
C, Ada, Pascal, Algol,
FORTRAN, . . .
オブジェクト指向型Object-oriented
Scala, C#, Java, Smalltalk,
SIMULA, . . .
スクリプト型Scripting
Perl, Python, PHP, . . .
13
プログラミング言語の分類 (5)
命令型プログラミング言語(Imperative)
手続き型Procedural
C, Ada, Pascal, Algol,
FORTRAN, . . .
オブジェクト指向型Object-oriented
Scala, C#, Java, Smalltalk,
SIMULA, . . .
スクリプト型Scripting
Perl, Python, PHP, . . .
14
プログラミング言語の分類 (5)
命令型プログラミング言語(Imperative)
手続き型Procedural
C, Ada, Pascal, Algol,
FORTRAN, . . .
オブジェクト指向型Object-oriented
Scala, C#, Java, Smalltalk,
SIMULA, . . .
スクリプト型Scripting
Perl, Python, PHP, . . .
15
プログラミング言語の分類 (5)
宣言型プログラミング言語(Declarative)
関数型Functional
Haskell, SML, Lisp, Scheme, . . .
論理型Logic
Prolog, KL1, . . .
データ流れData-flow
Id, Val, . . .
16
プログラミング言語の分類 (5)
宣言型プログラミング言語(Declarative)
関数型Functional
Haskell, SML, Lisp, Scheme, . . .
論理型Logic
Prolog, KL1, . . .
データ流れData-flow
Id, Val, . . .
17
プログラミング言語の分類 (5)
宣言型プログラミング言語(Declarative)
関数型Functional
Haskell, SML, Lisp, Scheme, . . .
論理型Logic
Prolog, KL1, . . .
データ流れData-flow
Id, Val, . . .
18
歴史(History)
時期 プログラミング言語
1951–55 Experimental use of expression compilers
1956–60 FORTRAN, COBOL, LISP, Algol 60
1961-65 APL notation, Algol 60 (revised), SNOBOL, CPL
1966-70 APL, SNOBOL 4, FORTRAN 66, BASIC, SIMULA,
Algol 68, Algol-W, BCPL
1971–75 Pascal, PL/1 (Standard), C, Scheme, Prolog
1976–80 Smalltalk, Ada, FORTRAN 77, ML
19
歴史(History)
時期 プログラミング言語
1981–85 Smalltalk-80, Prolog, Ada 83
1986–90 C++, SML, Haskell
1991-95 Ada 95, TCL, Perl
1996-2000 Java
2001–05 C#, Python, Ruby, Scala
2006–17 Go, R, ......
20
21
22
23
24
Quiz Time!
25
von Neumann (1903-1957)
Home Country: (1) Russia
(2) Hungary
(3) Germany
von Neumann is (1) Mathematician
(2) Computer Scientist
(3) Economist
26
von Neumann (1903-1957)
Home Country: (1) Russia
(2) Hungary
(3) Germany
von Neumann is (1) Mathematician
(2) Computer Scientist
(3) Economist
27
アンケート
使用したプログラミング言語:
名前だけ聞いたプログラミング言語:
28
パラダイム (paradigm)
In science and philosophy, a paradigm is a distinct set
of concepts or thought patterns, including theories,
research methods, postulates, and standards for what
constitutes legitimate contributions to a field.
29
パラダイム (paradigm)
パラダイム (paradigm) とは、科学史家・科学哲学者のトーマス・クーンによって提唱された、科学史及び科学哲学上の概念。
一般には「模範」「範」を意味する語である
トーマス・クーン:科学革命の構造(The structure
of scientific revolutions) (パラダイム転換)
30
Programming Paradigm
Programming paradigms are a way to
classify programming languages based on
the features of various programming
languages.
Languages can be classified into multiple
paradigm
31
プログラミング言語パラダイム (1)
プログラマにプログラムの見方を与えるものと言える。例えば:
◼ オブジェクト指向プログラミングにおいて、プログラムとはオブジェクトをつくりそれを管理するものである。
◼ 関数型プログラミングにおいては、状態を持たない関数の評価の連続である。
32
プログラミング言語パラダイム (2)
命令型言語パラダイム
関数型言語パラダイム
論理型言語パラダイム
オブジェクト指向型言語パラダイム
33
プログラミング言語パラダイム (3)
34
プログラミング言語パラダイム (3)
35
計算モデルの必要性
世の中の情報システム(コンピュータや生物)は非常に複雑
この情報システムがどのような原理に基づくかを知るには数学的基盤を持つ抽象的な枠組みを導入する必要がある
36
計算モデルの必要性
計算機のハードウェア◼ 複雑すぎて扱えない
CやPascalなどで書かれたプログラム◼ 数学的な厳密さを持つとは限らない
プログラムを入力から出力を得るものとする◼ 例:数学的な関数
◼ ただし、実際に入力を与えても、その答え(出力)が導けるとは限らない
37
計算モデルとは
コンピュータによる計算機構を抽象的に捉(とら)えた数学的な枠組みであり, これにより計算に関する様々な議論が可能になる◼ 計算するとはどういうことであるかの説明
◼ 計算モデルが変わるとプログラミング言語の設計も変わる
プログラミング言語パラダイムの最重要かつ主要な構成要素
38
計算モデル
情報システムの抽象的な枠組み=計算モデル
39
代表的な計算モデル
(逐次)計算モデル◼ 抽象機械計算モデル
◼ 関数型計算モデル
◼ 論理型計算モデル
◼ 項書き換え型計算モデル
(並列分散)計算モデル◼ プロセス代数(プロセスカルキュラス)
◼ イベント機械モデル(ペトリネット)
40
プログラミング言語の諸要素
文法 BNF
制御構造 構造化プログラミング
変数、値、データ型 型代数、オブジェクト指向
抽象データ型
サブルーチンと呼出し クラス、継承、カプセル化
実行 部分計算、ネットワーク対応
検証、アサーション
入出力 イベント駆動
41
プログラム理論
プログラムの正しさ (correctness)
正当性と停止性 (Termination)
2つのプログラムが等しいということ◼ 入力と出力の関係が等しいこと◼ プログラムの計算の仕方も含めて等しいこと
プログラムによって計算できること、できないこと◼ 数学的に定義できる関数◼ プログラミング言語によって表現できる関数
42
プログラムの意味論
プログラミング言語は言語である
言語は何かを表現するためのもの
表現しているものがその文の意味
プログラムは何を表現しているのか
プログラムは、計算機に何を要請しているのか
プログラムが正しいということは、何を期待しているのか
43
プログラミング言語の意味論
操作的意味論 (Operational Semantics)
◼ プログラムの状態をどのように変化させていくのか
公理的意味論 (Axiomatic Semantics)
◼ プログラムの実行によってどんな性質が満たされるのか
表示的意味論 (Denotational Semantics)
◼ プログラムが意味するものを、具体的に対応付ける
44
プログラミングの基本的な理解Fundamental Understanding of Programming
Tony Hoare (ACM Turing Award)
プログラミングの基本的な理解 (1)
Q1: What is this program for? (このプログラムは何ですか?)
A: Its specification tells you its function
(その仕様はあなたにその機能を伝える)
Q2: How does it work?
(このプログラムはどのように機能するか?)
A: Annotation at interfaces explains how
(インタフェースでのアノテーションは説明できる)
プログラミングの基本的な理解 (2)
Q3: Why does it work?
(なぜこのプログラムは機能するか?)
A: The theory of programming explains why
(プログラミングの理論から説明できる)
Q4: Are the answers accurate?
(答えは正確ですか?)
A: A verifying compiler provides a reliable check
(検証コンパイラは信頼できるチェックを提供する)
Quiz
int 型の変数n1, n2, n3, n4の値が、それぞれ15, 15, 20, 30であるとする。このとき、以下の各式を評価した値を示せ。
◼ 1 && 0 ( ? )
◼ n1 != n4 ( ? )
◼ n2 <= n3 ( ? )
◼ n1 / 5 != 3 ( ? )
◼ 1 || 0 ( ? )
◼ (n1 == n2) || 0 ( ? )48
Quiz-questions
int 型の変数n1, n2, n3, n4の値が、それぞれ15, 15, 20, 30であるとする。このとき、以下の各式を評価した値を示せ。
◼ 1 && 0 ( 0 )
◼ n1 != n4 ( 1 )
◼ n2 <= n3 ( 1 )
◼ n1 / 5 != 3 ( 0 )
◼ 1 || 0 ( 1 )
◼ (n1 == n2) || 0 ( 1 )49