サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
体力トレーニング
www.csg.is.titech.ac.jp/~chiba
クラスを用いたオブジェクト指向 JavaScript はプロトタイプ・ベースのオブジェクト指向言語ですが、Java のようなクラス・ベースのオブジェクト指向でプログラミングすることも可能です。 しかしプログラムの表面上の外見は複雑になります。 簡単にクラスを定義できるような構文上のサポートがないからです。 コンストラクタ Java 言語では、オブジェクトを作成するときに new 演算子を使いました。 実は JavaScript でも new 演算子が使えます。 今、Java 言語で書くと次のようになるクラスのオブジェクトを作りたいとしましょう。 class Position { int xpos, ypos; Position(int x, int y) { xpos = x; ypos = y; } } JavaScript 言語では、まず次のような関数を書きます。 この関数をコンストラ
1-2 字句解析2 正規表現によるパターンマッチ Lex は正規表現で定義された token を認識する関数 yylex() を自動的に合成する。yylex() は実際にどのようなアルゴリズムで、token を認識しているのだろうか? yylex()の中身は、有限状態オートマトンである。yylex()は文字を一文字づつ読みながら、正規表現に対応する状態遷移図に従って状態遷移していき、token を認識していく。 例えば、正規表現 a(b|c)* は次のような状態遷移図に対応する。 S が開始状態で、Fが終了状態である。 S から始めて全ての入力文字列を読み込み終えたときに、状態 F になっていれば、入力文字列は正規表現 a(b|c)* と一致するといえる。 途中で遷移不能な入力 (例えば状態 S のときに a 以外の入力) が来て状態 F に達しない場合、入力文字列は正規表現 a(b|c)
Index of /~chiba/lecture/clang NameLast modifiedSizeDescription Parent Directory - css/2012-05-02 19:51 - images/2012-05-02 19:52 - tools/2012-05-02 19:52 -
4-4 同期 これまでに実装したライブラリでは、生成されたスレッドは各々ばらばらに動くことしかできなかった。 スレッド間で協調して何かの処理をおこなえるようにするためには、スレッド間の同期 (synchronization) 機構をライブラリが提供してやる必要がある。 Spin wait 例えばスレッドを3つ作って、次の3つの関数をそれぞれ実行させたとする。 int sum1 = 0, sum2 = 0; void thread1(int* array) { int i; for (i = 0; i < N / 2; ++i) sum1 += array[i]; } void thread2(int* array) { int i; for (i = N / 2; i < N; ++i) sum2 += array[i]; } int thread3() { return sum1 + s
1-4 構文解析1 これまでの3回で、Lisp のインタプリタを作成した。今回からは C 言語のごく小さなサブセット Tiny C のコンパイラを作っていく。 最初の作業は構文解析である。 字句解析部が返してくる token を、個々の式や文ごとにグループ化し、木構造に変換する。 文法の定義 字句解析をおこなうプログラムが lex を使うと簡単に作成できたように、構文解析をおこなうプログラムも yacc を使うと簡単に生成できる。yacc は BNF (Backus Naur Form or Backus Normal Form) で記述された文法に沿って構文解析をおこなう C プログラムを合成する。 BNF で定義した文法は次のようなものである。 program : statement | program statement statement : VARIABLE '=' expres
1. TCP/IP による通信 Web サーバを作成するには、まず通信レイヤである TCP/IP を使ったプログラミングを習得しなければならない。 今回はまず、socket を使った TCP/IP 通信について解説する。 ストリーム (stream) Unix では、データの入出力はストリーム (stream) に対する操作として抽象化される。 ストリームを使わずに入出力をおこなうとすると、 例えばファイルの内容を読み出す(入力の)とき、次のようなプログラムを書くことになるだろう。 char buffer[256]; read_block("hello.c", buffer, 32, 256); ここで read_block() が OS が用意する関数(システムコール: system call) である。 上のプログラムを実行すると、hello.c というファイルの先頭から 32byte
1-5 構文解析2 前回は BNF による文法の定義の仕方を説明した。今回は、いよいよ yacc を使って構文木を組み立てる。 構文木 一般に元のプログラムをそのまま木構造に変換しものを、parse tree (構文木)という。Parse tree の場合、元のプログラムの token は省略されることなく、全て木に含まれる。一方、token の中には人間の見やすさのためや、文法をあいまいでなくするために存在するものもあり、そのような token は構文解析が済んだ後はコンパイルには不要である。 以降の処理に必要な token だけを残し、parse tree をより簡単にしたものを、abstract syntax tree (AST: 抽象構文木)という。構文解析する際、parse tree を作ってから、AST に変換してもよいが、コンパイルには parse tree は不要なので、今
OpenC++ is a version of C++ with a Metaobject Protocol. In other words, it is a tool of source-code translation for C++. Programmers can easily implement various kinds of translation so that they can define new syntax, new annotation, and new object behavior. OpenC++ is useful if they need, for example, Developing extensions to C++, to provide support for things like parallelism, distribution, con
千葉 滋 Feature 私のデバッグ、 bit、vol.29、no.1、pp. 24-25、共立出版、January, 1997. 私はここ数年デバッグなんてしたことがない。と、こ う書くと、いや、おまえがデバッグしているのを何度 も見たことがある、とか、彼にバグレポートを送った ことがある、とかいう声がたくさん返ってくることだ ろう。そんなタワケタことを書いている暇があったら、 あのバグを早く直せ、とお怒りの方ももしかしたらい るかもしれない(すみません)。それでも私は最近デ バッグなんてしたことがないのだ。少なくとも、この 場で経験談を披露するほどデバッグで苦労したことは ない。 デバッグというのは、もちろんプログラムのムシを取 ることなのだが、ムシにもいろいろある。見つかる場 所で分類すると次のようになるだろう。 (1) コンパイル時:文法エラーや型エラーなどの形で みつかるバグ。
Java Press vol. 35, pp.76--85, March 2004. Java プログラムの"舞台裏"大追跡 Javassist -- Java バイトコードを操作するクラスライブラリ -- 入門 先端J2EE サーバJBoss が,人知れず内部で行っていること 千葉 滋 東京工業大学・大学院情報理工学研究科 はじめに Java バイトコードを変換するライブラリとしては Jakarta BCEL が有名です。BCEL は Java クラスファイルのデータ構造を直接操作する場合には便利ですが、Java クラスファイルの内部仕様、つまり Java バイトコードに詳しくないと使いこなせません。一方、Java バイトコードにあまり詳しくない開発者でもバイトコード変換を実装できるようにするライブラリが Javassist です。 バイトコード変換 はっきりいって、つい最近までJava
情報処理 45巻1号、pp.28-33(平成16年1月号) 特集:モデリングとツールを駆使したこれからのソフトウェア開発技法 〜モデル駆動開発手法を中心として〜 「アスペクト指向ソフトウェア開発とそのツール」 千葉 滋 東京工業大学・大学院情報理工学研究科 オブジェクト指向は理想論? モデル駆動による開発手法では、まずはじめにモデリングありき、である。開発したいシステムをうまくモデル化できなければ、その先へ進めない。 一般に、モデリングはオブジェクト指向でおこなわれる。しかし、近年の研究により、オブジェクト指向では、必ずしも全てのシステムをうまくモデリングできないことが指摘されるようになってきた。 非常に直感的に説明すると、オブジェクト指向ではシステムを全体から部分へ階層的に分割する。システム全体は、いくつかのコンポーネントからなり、コンポーネントは、いくつかのサブコンポーネントからなり、
4-2 Non-blocking I/O 前回の課題で実装したスレッド・ライブラリは、暗黙のうちにスレッドを切り替える機能をもたず、プログラムの中で明示的に ThreadYield() を呼ばなければならなかった。 しかしながら、ある種の状況の下では、おおむね常にスレッドを切り替えてよい場合がある。 その代表的なものは I/O の実行待ちである。 例えばあるスレッドがコンソールからの入力を待っているとすると、その間、そのスレッドは何もやることがなく、プロセッサが遊んでしまう (したがって OS は、プロセス切り替えをおこない、他のプロセスを実行してしまう)。 このような状態を、スレッドがブロック (block) されている、という。 そのような間は、明らかにスレッドを切り替えて、他のスレッドを動かした方が効率がよい。 今回は、スレッド・ライブラリに、ストリーム(ファイル)を読むための関数
ノート: 卒論、修論などの標準的な書き方の解説。
4 プロセスの実行 Web サーバには CGI をサポートし、外部のプログラムを実行できるようになっているものが多い。 今回はプログラム中から他のプログラムを実行する exec システムコールについて解説する。 exec システムコール exec システムコールは、そのシステムコールを呼びだしたプロセス上で、別なプログラムの実行を開始するためのシステムコールである。 このため、そのプロセスでそれまで実行されていたプログラムは破棄され、システムコール呼び出しがリターンすることはありえない。 exec() を使う典型的なプログラムは shell である。 Shell はコマンドとして入力されたプログラムを実行するのに、fork() によって新しいプロセスを作り、そのプロセス上で exec() を実行、そのプログラムを実行する。 ↓ fork() ------- | | 親プロセス 子プロセス
シラバス 本コースは、プログラミングの基本について、ひととおりの技術を学び終えた受講者を対象とする。コースの目的は、実際のソフトウェアを開発する際に、具体的にどのようにプログラムを設計し、またどのように OS の機能を利用していけばよいか、感覚をつかんでもらうことである。このため、本コースは講義中心ではなく、いくつかのソフトウェアの作成演習をとおして、そのソフトウェアのプログラムはなぜそのように設計されているのか等を考えてもらう。 1. 簡単な C コンパイラ 言語仕様を簡略化したCコンパイラを作成し、言語処理系の基本構成を学ぶ。また関数呼び出しや配列参照など、C言語の各基本機能が実際にどのような機械語に変換されていくのかを学ぶ。 実際に作成する処理系は2つで、まずはじめに字句解析の練習として、ごく簡単なLispインタプリタを作る。 その後、構文解析、コード生成の演習のため、C言語風の手続
1-6 コード生成1 前回は yacc を使って構文木を組み立てた。今回は、こうして組み立てた構文木を元に、Intel x86 アーキテクチャ用のコード生成をおこなう。 IA32 (x86) の命令セット Intel Pentium や AMD Athlon などの x86 系と総称されるプロセッサは IA32 と呼ばれる、i8080 時代からの互換性をひきづった命令セットをもつ。 IA32 は数多くの命令を含むが、この講義で使うのはごく一部である。 レジスタ IA32 は8つの汎用 32bit レジスタをもつ。%eax, %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp である。 このうち %ebp と %esp は、それぞれ特別な用途に使われるので、コンパイラが生成するコードが自由に使ってよいのは、残りの 6 つである。 ただしいくつかの命令は、特定のレ
Javassist Java bytecode engineering toolkit since 1999 View on GitHub Download .zip Download .tar.gz Javassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to modify a class file when the JVM loads it. Unlike other similar bytecode editors, Javassist provides
http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/site
本演習では Eclipse というソフトウェアを利用して Java 言語によるプログラムを作成します。 Eclipse はプログラムを開発するためのソフトウェアで、プログラムの入力を支援する機能や、プログラム中のミスを効率よく修正するのに便利な機能が搭載されています。 なお Eclipse は西7号館の演習室のコンピュータにあらかじめインストールされています。 このページでは Eclipse を使って Java プログラムを書くのに必要な操作を説明します。 例として、演習室のコンピュータで Eclipse を起動し、教科書の 22 ページの Triangle.java というプログラムを作成して、実行するまでの過程を説明します。 このページを参考にして、課題 1 のプログラムを作成してください。 Eclipse の起動 ワークスペースのパーミッション変更 プロジェクトの作成 Turtle.
1. Reading and writing bytecode 2. ClassPool 3. Class loader 4. Introspection and customization 5. Bytecode level API 6. Generics 1. Reading and writing bytecode Javassist is a class library for dealing with Java bytecode. Java bytecode is stored in a binary file called a class file. Each class file contains one Java class or interface. The class Javassist.CtClass is an absatract representation of
論文の書き方 1997年1月 論文の書き方 1.論文書きの手順 (1)論旨の組み立て (2)アウトライン 「はじめに」の書き方 「問題意識」の書き方 「研究のアイデア」の書き方 「実験」の書き方 「まとめ」の書き方 2.文章技術 トピックセンテンス 逆茂木型の文章 論理の鎖 例中心主義 3.文章を書く心得 千葉 滋 (Shigeru Chiba)、東京大学
このページを最初にブックマークしてみませんか?
『Chiba's website』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く