Today アクセスカウンター Yesterday アクセスカウンター

ホワット・ア・ワンダフル・ワールド

私は知識に何ものかを付け加え,また他の人々がより多くのものを付け加える手助けをした --- G.H.ハーディ

全記事一覧 << 2008/06 12345678910111213141516171819202122232425262728293031 2008/08 >>

プロフィール

あろは (alohakun)

  • Author:あろは (alohakun)
  • 若槻俊宏 (WAKATSUKI toshihiro)

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun

    abstract

    プログラミングという人間の知的行為を体系化し,単なる職人芸ではなく,サイエンスにするための研究をしています.

    具体的には,等価変換計算モデルに基づいた,仕様記述からのプログラム合成の研究をしています.

    もっと噛み砕くと,プログラムの正しさをどのように定式化し,どのような枠組みで,どのように変換を進めていけば,正しさを保証したまま,効率的なプログラムを手に入れることができるのか,ということについて研究しています.

    キーワード : equivalent transformation, computation model, programming paradigm, formal specification, program synthesis













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map









    FC2 BLOG RANKING

FC2カウンター

ブロとも申請フォーム

この人とブロともになる

ホーム

初心者にプログラミングを教える際の難しさ

2008/07/16(水) 13:36:46

今のプログラミング言語は,アルゴリズム (計算手順) を書き下す (だけの) ものなんですよね.

なので,初心者にプログラミングを教える際 「どうやってアルゴリズムを作れば良いのか ?」「熟練者は,どのように発想しているのか ?」 ということを教える際には,向きません.これがプログラミング教育の本質的な難しさです.

アルゴリズムを作るための方法論と,それを表現できるプログラミング言語が無いから,結局はたくさん本読ませて,問題解かせて,自分で勉強してがんばってね,数こなせば自然とわかってくるから,という前時代的な教育しかできないのです.これでは脱落者がたくさん出てしまっても無理はありません.

amachang さんががんばってます.執筆中のマインドマップを引用するってのは,ちょっと申し訳ない気もするのですが,面白い一文を発見.

IT 戦記 2008-07-15 プログラミング未経験者が JavaScript でプログラミングをするために必要なこと
僕はプログラミングというものをこういう風に思っています。


「状態と機能をたくさん持ったモノ」(例えば、パソコン)に、「こうだったら(状態)、こうする(機能)」という「ルール」を書いていって「便利なモノ」(例えば、ゲーム)を作る作業がプログラミングである。


これは全くその通りなのだと思いますけど,現在のプログラミング言語は,こういう人間の自然な思考(?)を素直に書き下すようにはできてないんですよね.

我田引水ですけど,僕は北大の一般教養で,今 TA やってます (問題解決プログラミング/人工知能プログラミングの両クラス合同演習).

# 人工知能とか大仰な講義名ですけど,学部一年レベルの講義なので,ようするに,ちょっと高度なアルゴリズムのことです.全学共通科目なので,工学部や情報系以外の学生もウェルカムな講義ですし (まぁ,ほぼ全員が理系だと思いますけど)

プログラミングどころか,パソコンのタッチタイプすらおぼつかない大学新入生相手に,いきなり ET という変なプログラミング言語を使って,アルゴリズムの作り方 (発想法) を教えています.

よくある「プログラミング」を教える講義,すなわち,アルゴリズムの書き下し方 (コーディング) を教えるのではありません.アルゴリズムの作り方,考えるための方法論を教えている (つもりの,ことを目指している) 講義です.

それは,例えばプログラミング言語 Ruby は,(いろいろ理由があると思いますが)学生が学習しやすい,とかいうレベルの話ではありません.

ET 言語は,ルールベースなので,通常のアルゴリズムを書き下す言語とは,根本的に異なるのです (もちろん,普通に,アルゴリズムを書き下すこともできますが.それは清書用で,むしろどうやって考えるか,考えるための道具の方が重要)

ルールというのは,amachang の定義を借りれば,

状態,{条件} --> こうする.

という,まさしく自然な発想をそのまま書き下すような表記になっています.

そして,具体例をたくさん書き並べていくだけで,それもある種のプログラムとして実行可能です (算術演算アトムの記法が,Lisp というか,S 式ライクで微妙ですが… まぁ,全くの初心者の場合,こう書くんだよ,と言うと,案外素直に覚えてくれるものです.逆に,脳が C とか VB とかに汚染されている子(笑)の場合は,ちょっと戸惑ったり苦労しているみたいです).

(factrial 0 *x) --> (= *x 1).
(factrial 1 *x) --> (:= *x (x 1 1)).
(factrial 2 *x) --> (:= *x (x 2 (x 1 1))).
(factrial 3 *x) --> (:= *x (x 3 (x 2 (x 1 1)))).

いろいろルールを書いていくうちに,何らかの法則性が見えてきたら,より一般的なルールを書くと.

(factrial *n *x) --> (:= *n1 (- *n 1)), (factrial *n1 *x1), (:= *x (x *n *x1)).

# ちょっとトリビアルすぎる例ですが… 実際の講義では,非常に簡単で具体的な例題 (長さ 3 のリストの 2 番目を取り出すルールを書け,とか) から,徐々に一般的で複雑な例題に (任意の長さの整数リストの各要素の値を n 倍したリストを作るルールを書け,のように) 発展していきます.

実際には,D ルールには優先順位がある (同じ状態と条件に対して適用可能なルールが複数存在する場合,先に定義されたルールが,後に定義されたルールよりも優先的に採用される) のですが,条件を順序に依存しないようにちゃんと書けば,順番さえ任意です.

ルールベースのプログラミング言語は,条件を工夫したり,効率化するためのルールを追加していくことで,試行錯誤しながら,自然とルールを積み上げ,アルゴリズムを構築していくことが可能な枠組みになってます.
雑談TB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

Vx32: Lightweight, User-level Sandboxing on the x86

2008/07/16(水) 08:00:51

面白そう.

Plan9日記 2008-06-28 ■[9fans] 9vx

9vxはPlan9カーネルをユーザランドに移植したもので、その上でPlan9の実行バイナリを無変更で実行できるというもの。対応しているホストOSはLinux、MacOS X、FreeBSD。実行速度はQEMUはもちろんVMWareよりも高速。9vxを実装するために、vx32というIA32用のsandboxingライブラリを使っている。sandboxを作る手法はいろいろあるけど、vx32はデータをsandboxするためにセグメンテーション、コードをsandboxするために動的コード変換を使っている。vx32のサンプルプログラムには9vxの他にもLinuxのシステムコールをトラップしてjail化するものとか含まれているので、Plan9ネタに限定せず,興味がある人はいるのでは?

ちなみにvx32の作者であるBryan Ford氏、どこかで見た名前だなと思ったら、OSKitの人だった。

これですね.

Vx32: portable, efficient, safe execution of untrusted x86 code

普通のサンドボックス技術では,例えば VMWare みたいにシステム丸ごとエミュレートするか,JVM (CLR) みたいに仮想機械で抽象機械語を実行,という形になるので,オーバーヘッドが大きい.

一方 vx32 は,バイナリにライブラリとしてリンクするだけで,普通に x86 コードを安全にネイティブ実行できるというモノ (アプリケーションレベル仮想機械) なのでオーバーヘッドが圧倒的に少なく (VMWare などとの違い),任意のプログラミング言語が使える (Java や C# との違い),ということらしい.たぶん.

試しに Ubuntu binaries を落としてみたんだけど,よくわからんでした.


$ ls /opt/vx32/bin/
vx32-addr2line vx32-cpp vx32-gcov vx32-objdump vx32-strings
vx32-ar vx32-gcc vx32-ld vx32-ranlib vx32-strip
vx32-as vx32-gcc-4.1.2 vx32-nm vx32-readelf
vx32-c++filt vx32-gccbug vx32-objcopy vx32-size

$ /opt/vx32/bin/vx32-gcc -v
Using built-in specs.
Target: vx32
コンフィグオプション: ./configure --target=vx32 --prefix=/opt/vx32
スレッドモデル: single
gcc バージョン 4.1.2

$ /opt/vx32/bin/vx32-gcc test.c
test.c:1:18: error: stdio.h: そのようなファイルやディレクトリはありません
test.c: In function 'main':
test.c:2: 警告: incompatible implicit declaration of built-in function 'printf'

$ /opt/vx32/bin/vx32-gcc test.c
test.c: In function 'main':
test.c:1: 警告: incompatible implicit declaration of built-in function 'printf'
/opt/vx32/lib/gcc/vx32/4.1.2/../../../../vx32/bin/ld: crt0.o: No such file: その ようなファイルやディレクトリはありません
collect2: ld はステータス 1 で終了しました


なんか根本的に間違ってる予感 (また後で)

安全で,OS に依存しない実行環境を作れるので,plan9 など他の OS のバイナリをそのまま安全に実行できるようにしたり (安全っていう点が,WINE などの互換 API ライブラリとは異なる ?),カーネルやバイナリ無変更で Linux system call jail を実現したりできるらしい.

Vx32: Lightweight, User-level Sandboxing on the x86

パッと見た欠点は,Windows では使えなさそうな点と,IA-32e モード (AMD 64 モード) を使うバイナリは実効できない点なのかな.
vx32 は,x86 のコードセグメンテーション機能を活用しているので,x86 以外の CPU には対応できないアーキテクチャということらしい.

wikipedia : VX32
C 言語/コンパイラ/BinaryHacksTB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

最近のコメント

リンク

このブログをリンクに追加する

最近のトラックバック

人生の残り日数

日本人男性の平均寿命は 28700日.

RSSフィード

カテゴリー