<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>datenkobold.de &#187; Programmierung</title>
	<atom:link href="http://www.datenkobold.de/weblog/kategorie/programmierung/feed" rel="self" type="application/rss+xml" />
	<link>http://www.datenkobold.de/weblog</link>
	<description>das Weblog von Steffen Bauch</description>
	<lastBuildDate>Fri, 09 Dec 2011 21:58:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Speicheroptimierung mit pahole</title>
		<link>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole</link>
		<comments>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole#comments</comments>
		<pubDate>Tue, 22 Dec 2009 09:05:03 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[pahole]]></category>
		<category><![CDATA[Speicheroptimierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=517</guid>
		<description><![CDATA[Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt. Werden bei der Programmierung in C zusammengesetzten Datentypen wie struct [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt.</p>
<p>Werden bei der Programmierung in C zusammengesetzten Datentypen wie <code>struct</code> verwendet ist es m&#246;glich, dass aus Gr&#252;nden des Alignments zwischen den Teilelementen der Struktur nicht genutzte F&#252;llbytes eingef&#252;gt werden. Zur&#252;ckzuf&#252;hren ist das Einf&#252;gen dieser F&#252;llbytes auf die Rechnerarchitektur und die Art und Weise wie ein Prozessor auf den Hauptspeicher zugreift. Wenn ein Prozessor Daten aus dem Hauptspeicher liest, dann erfolgt der Zugriff mit der Verarbeitungsbreite des Prozessors. Ist der Prozessor ein 32-bit Prozessor, dann werden in einem Schritt 4 Byte gelesen. Diese Annahme gilt f&#252;r alle weiteren Beispiele.</p>
<p>Ein Datenelement ist dann richtig im Speicher angeordnet, wenn seine Speicheradresse einem ganzzahligen Vielfachen seiner Gr&#246;&#223;e entspricht. F&#252;r diesen Fall kann der Prozessor das Datenelement optimal einlesen (ohne &#220;berlappung und notwendige Verschiebung) und das Datenelement wird als aligned bezeichnet. Werden nun Elemente mit unterschiedlichen Speichergr&#246;&#223;en wie unsigned short (2 Byte), unsigned char (1 Byte) oder unsigned int (4 Byte) in einem Verbunddatentyp gemischt verwendet ist es m&#246;glich, dass F&#252;llbytes eingef&#252;gt werden um das Alignment zu gew&#228;hrleisten.</p>
<p>Zur weiteren Erkl&#228;rung soll nun folgende Datenstruktur betrachtet werden:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> alpha<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> beta<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> gamma<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> delta<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In dieser Datenstruktur wird zwischen den Elementen beta und gamma ein F&#252;llbyte eingef&#252;gt um gamma entsprechend den Alignment-Anforderungen auszurichten. Das F&#252;llbyte ist notwendig, da alpha und beta zusammen 3 Byte, also beispielhaft die Adressen 0 bis 2 belegenen und gamma als Datentyp mit 4 Byte Speicherbedarf auf Adresse 4 ausgerichtet wird. Die Adresse 3 bleibt dann ungenutzt und geht als verf&#252;gbarer Speicher verloren. Diese L&#246;cher in den Strukturen sind nicht optimal und k&#246;nnen teilweise durch Umordnen der Elemente entfernt werden. Das manuelle Berechnen dieser L&#246;cher ist zwar m&#246;glich, durch geeignete Werkzeuge allerdings auch automatisierbar.</p>
<p>Das Linux-Werkzeug pahole (Poke-a-Hole) ist ein Hilfsmittel um Datenstrukturen zu analysieren, Alignement-L&#246;cher zu identifizieren und Umordnungsvorschl&#228;ge anzugeben. Ziel ist die Reduzierung von Strukturgr&#246;&#223;en im Speicher und dadurch die Reduzierung des Speicherbedarfs von Programmen w&#228;hrend der Laufzeit. Ein wichtiger Effekt ist au&#223;erdem die bessere Ausnutzung von Caches und dadurch eine Beschleunigung des Programms bei Speicheroperationen. Durch die Entfernung der F&#252;llbytes entsteht eine geringere Belastung des Speicherbusses.</p>
<p>Da pahole kein Tool zur statischen Quellcodeanalyse ist, sondern den mit Debug-Informationen ausgestatteten Object-Code untersucht, sind neben dem Build-Werkzeug <code>cmake</code> zum Kompilieren noch weitere Bibliotheken zur Unterst&#252;tzung des DWARF2-Debug-Formates notwendig. Die Installation erfolgt unter Ubuntu mit:</p>
<pre>
sudo aptitude install libdw-dev libelf-dev cmake
</pre>
<p>Der Programmcode von pahole ist aufgrund des Ursprungs in der Linux-Kernel-Entwicklergemeinde im Kernel-Git-Repository verf&#252;gbar, man erh&#228;lt den Quellcode mit folgendem Befehl:</p>
<pre>
git clone git://git.kernel.org/pub/scm/linux/kernel/git/acme/pahole.git
</pre>
<p>Unter Ubuntu 9.10 Karmic Koala ist unter Umst&#228;nden wie in diesem <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=534529">Bugreport</a> beschrieben vor dem Kompilieren noch ein Patch notwendig. Dabei ist der <code>find_library</code> Ausdruck f&#252;r <code>EBL_LIBRARY</code> in <code>cmake/modules/FindDWARF.cmake</code> durch <code>set (EBL_LIBRARY -ldw)</code> zu ersetzen.</p>
<p>Das Kompilieren und die Installation erfolgt dann im Verzeichnis pahole mit den Befehlen:</p>
<pre>
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install
</pre>
<p>Das zu untersuchende Programm <code>hello</code> oder Object-File <code>hello.o</code> ist dann mit dem Compiler im Debug-Modus, also <code>gcc -g</code> zu kompilieren. Der Befehl</p>
<pre>
pahole hello
</pre>
<p>beziehungsweise</p>
<pre>
pahole hello.o
</pre>
<p>gibt dann einen Bericht in folgender Art f&#252;r alle verwendeten, nicht-anonymen Strukturen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">short</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>         alpha<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     0     2 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              beta<span style="color: #339933;">;</span>         <span style="color: #808080; font-style: italic;">/*     2     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* XXX 1 byte hole, try to pack */</span>
&nbsp;
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>               gamma<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     4     4 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              delta<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     8     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* size: 12, cachelines: 1, members: 4 */</span>
	<span style="color: #808080; font-style: italic;">/* sum members: 8, holes: 1, sum holes: 1 */</span>
	<span style="color: #808080; font-style: italic;">/* padding: 3 */</span>
	<span style="color: #808080; font-style: italic;">/* last cacheline: 12 bytes */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der hinzugef&#252;gte Kommentar enth&#228;lt f&#252;r jedes Element die Adresse in Bezug auf den Anfang der Struktur und die Gr&#246;&#223;e des Elementes. Zus&#228;tzlich werden L&#246;cher in den Strukturen und die Gesamtgr&#246;&#223;e der Struktur angegeben.</p>
<p>Neben der Identifikation der ungenutzten Speicherbereiche kann mit dem Befehl</p>
<pre>
pahole -RC test_data hello
</pre>
<p>auch ein Hinweis f&#252;r die Reorganisation der Elemente ausgegeben werden. Im vorhandenen Beispiel w&#228;re dies die Anordnung des Elementes delta nach beta und vor gamma um das Loch von einem Byte zu f&#252;llen.</p>
<p>Abschlie&#223;end bleibt anzumerken, dass die Relevanz dieser Optimierungen auf modernen 64-bit Architekturen h&#246;her ist, da durch die gr&#246;&#223;ere Verarbeitungsbreite L&#246;cher in den Strukturen h&#228;ufiger auftreten und diese auch gr&#246;&#223;er sind.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arithmetik ohne Begrenzungen</title>
		<link>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen</link>
		<comments>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen#comments</comments>
		<pubDate>Sun, 28 Jan 2007 22:37:48 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Arithmetik]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Mathematik]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen</guid>
		<description><![CDATA[Selbst wenn man nur einfache Probleme in Theoretischer Informatik, Zahlentheorie oder Diskreter Mathematik bearbeitet und durch Programme in C zu erschlie&#223;en versucht, gelangt man schnell an die Grenzen der darstellbaren Wertebereiche f&#252;r ganze Zahlen. Das Implementieren einer eigenen Bibliothek f&#252;r gro&#223;e Zahlen ist zwar m&#246;glich, mit GMP (GNU Multi Precision Arithmic Library) gibt es aber [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/mathematik-ist' rel='bookmark' title='Mathematik ist.'>Mathematik ist.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Selbst wenn man nur einfache Probleme in Theoretischer Informatik, Zahlentheorie oder Diskreter Mathematik bearbeitet und durch Programme in C zu erschlie&#223;en versucht, gelangt man schnell an die Grenzen der darstellbaren Wertebereiche f&#252;r ganze Zahlen. Das Implementieren einer eigenen Bibliothek f&#252;r gro&#223;e Zahlen ist zwar m&#246;glich, mit <a href="http://www.swox.com/gmp/">GMP</a> (GNU Multi Precision Arithmic Library) gibt es aber bereits eine freie und gut gepflegte Implementierung.</p>
<p>Eine einfache, experimentelle Erkundung des <a href="http://de.wikipedia.org/wiki/Collatz-Problem">Syracuse-Problems</a> k&#246;nnte so aussehen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
&nbsp;
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">!=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d &quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	a <span style="color: #339933;">=</span> syracuse<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> syracuse<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">%</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mit der GNU MP Bignum Library wird daraus:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;gmp.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> mpz_syracuse<span style="color: #009900;">&#40;</span>mpz_t n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    mpz_t a<span style="color: #339933;">;</span>
    mpz_init<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    mpz_inp_str <span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> mpz_cmp_si<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	mpz_out_str <span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	mpz_syracuse<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> mpz_syracuse<span style="color: #009900;">&#40;</span>mpz_t n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mpz_divisible_ui_p<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	mpz_divexact_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	mpz_mul_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	mpz_add_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Damit kann man dann auch f&#252;r sehr gro&#223;e nat&#252;rliche Zahlen die Zahlenfolge bestimmen, kompiliert wird wie gewohnt, allerdings muss man mit -lgmp linken.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/01/syracuse.png" alt="syracuse" title="syracuse" width="400" height="300" class="aligncenter size-full wp-image-396" /></p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/mathematik-ist' rel='bookmark' title='Mathematik ist.'>Mathematik ist.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statische Codeanalyse mit Uno</title>
		<link>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno</link>
		<comments>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno#comments</comments>
		<pubDate>Thu, 21 Dec 2006 23:20:43 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Codeanalyse]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Softwaretest]]></category>
		<category><![CDATA[Uno]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=312</guid>
		<description><![CDATA[Statische Codeanalyse ist eine Art von Softwaretest, bei der Quellcode bestimmten formalen und algorithmischen Pr&#252;fungen unterzogen wird um Fehler in Software zu finden. Die &#220;berpr&#252;fung erfolgt hier im Gegensatz zur dynamischen Analyse nicht zur Laufzeit und wird deswegen als statische Analyse bezeichnet. Uno ist ein Tool, mit dem man nach drei der h&#228;ufigsten Fehlerarten in [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/cache-attack-auf-aes' rel='bookmark' title='Cache Attack auf AES'>Cache Attack auf AES</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Statische Codeanalyse ist eine Art von Softwaretest, bei der Quellcode bestimmten formalen und algorithmischen Pr&#252;fungen unterzogen wird um Fehler in Software zu finden. Die &#220;berpr&#252;fung erfolgt hier im Gegensatz zur dynamischen Analyse nicht zur Laufzeit und wird deswegen als statische Analyse bezeichnet.</p>
<p><a href="http://spinroot.com/uno/">Uno</a> ist ein Tool, mit dem man nach drei  der h&#228;ufigsten Fehlerarten in C-Quellcode suchen kann:</p>
<ul>
<li>Nutzung uninitialisierter Variablen</li>
<li>Dereferenzierung von NULL-Pointern</li>
<li>Bereichs&#252;berschreitung bei der Array-Adressierung</li>
</ul>
<p>Entsprechende Beispiele und ein Download des Werkzeuges sind auf der Seite von Uno zu finden. Eine kurze Probe hier hat gezeigt, da&#223; sich sowohl einfache Beispiele konstruieren lassen bei dem Dereferenzierungsfehler gefunden werden, als auch Beispiele, bei dem das Werkzeug die Fehler &#252;bersieht.</p>
<p>Hier wird der Fehler gefunden:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">123</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">345</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">uno:#1: possible global use or deref before def:
[R ptr global_nullptr_deref.c 9]
in fct main global_nullptr_deref.c 4</pre></div></div>

<p>und hier nicht:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
    ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">123</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">345</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Generell ist die quelloffene Verf&#252;gbarkeit von leistungsf&#228;higen Werkzeugen zur Codeanalyse nicht gegeben, die Werkzeuge &#252;bersehen Fehler oder liefern zuviele Falschpositive. Professionelle Tools wie <a href="http://www.coverity.com/">Coverity</a> stehen wiederum nicht zur freien Verf&#252;gung. Wer sich mehr mit diesem Thema besch&#228;ftigen will, findet allerdings auf der Seite von <a href="http://www.stanford.edu/%7Eengler/">Dawson Engler</a>, dem Gr&#252;nder von Coverity, einen guten Einstiegspunkt mit ein paar interessanten Ver&#246;ffentlichungen, auch zur probalistischen Analyse von Quellcode.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/cache-attack-auf-aes' rel='bookmark' title='Cache Attack auf AES'>Cache Attack auf AES</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microcontroller-Bastelei</title>
		<link>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei</link>
		<comments>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei#comments</comments>
		<pubDate>Sun, 01 Jan 2006 13:40:53 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Asuro]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Fnordlicht]]></category>
		<category><![CDATA[Mikrocontroller]]></category>
		<category><![CDATA[Robotik]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=437</guid>
		<description><![CDATA[Hardware-Bastelei und Programmierung liegt ja zur Zeit total im Trend. Die einen basteln Fnordlichter, manche spielen mit dem Butterfly oder der halvedDisc, wieder andere bauen Mini-Roboter wie den Asuro. Allem gemeinsam ist, dass die Intelligenz der Ger&#228;te durch Microcontroller verwirklich wird. Bei mikrocontroller.net findet man gute Dokumentation, unter anderem ein umfassendes Tutorial zur Atmel-Programmierung in [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/fox-board-g20' rel='bookmark' title='FOX Board G20'>FOX Board G20</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Hardware-Bastelei und Programmierung liegt ja zur Zeit total im Trend. Die einen basteln <a href="http://koeln.ccc.de/prozesse/running/fnordlicht/">Fnordlichter</a>, manche spielen mit dem <a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3146">Butterfly</a> oder der <a href="http://halveddisc.htwm.de/">halvedDisc</a>, wieder andere bauen Mini-Roboter wie den <a href="http://asurowiki.de/index.php">Asuro</a>.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2009/08/atmega8.jpg" alt="atmega8" title="atmega8" width="200" height="126" class="aligncenter size-full wp-image-438" /></p>
<p>Allem gemeinsam ist, dass die Intelligenz der Ger&#228;te durch Microcontroller verwirklich wird. Bei <a href="http://www.mikrocontroller.net/">mikrocontroller.net</a> findet man gute Dokumentation, unter anderem ein umfassendes <a href="http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial">Tutorial zur Atmel-Programmierung in C</a>.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/fox-board-g20' rel='bookmark' title='FOX Board G20'>FOX Board G20</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unmaintainable Code</title>
		<link>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code</link>
		<comments>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code#comments</comments>
		<pubDate>Sat, 03 Dec 2005 10:56:50 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[CodingStyle]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=276</guid>
		<description><![CDATA[#include &#60;stdio.h&#62; float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main&#40;&#41;&#123;for&#40;;s%L&#124;&#124; &#40;h-=o,T= -2&#41;,s;4 -&#40;r=O*O&#41;&#60;&#40;l=I*I&#41;&#124;++_==L&#38;&#38;write&#40;1,&#40;--s%L?_&#60;L?--_ %6:6:7&#41;+&#34;123456 \n&#34;,1&#41;&#38;&#38;&#40;O=I=l=_=r=0,T+=o/2&#41;&#41;O=I*2*O+h,I=l+T-r;&#125; Wem so etwas Spa&#223; macht, sollte einfach mal das Unmaintainable Code Howto von Roedy Green anschauen. &#196;hnliche Artikel:Arithmetik ohne Begrenzungen Statische Codeanalyse mit Uno The Code Linux


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">float</span> o<span style="color: #339933;">=</span><span style="color:#800080;">0.075</span><span style="color: #339933;">,</span>h<span style="color: #339933;">=</span><span style="color:#800080;">1.5</span><span style="color: #339933;">,</span>T<span style="color: #339933;">,</span>r<span style="color: #339933;">,</span>O<span style="color: #339933;">,</span>l<span style="color: #339933;">,</span>I<span style="color: #339933;">;</span>int _<span style="color: #339933;">,</span>L<span style="color: #339933;">=</span><span style="color: #0000dd;">80</span><span style="color: #339933;">,</span>s<span style="color: #339933;">=</span><span style="color: #0000dd;">3200</span><span style="color: #339933;">;</span>main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">%</span>L<span style="color: #339933;">||</span>
<span style="color: #009900;">&#40;</span>h<span style="color: #339933;">-=</span>o<span style="color: #339933;">,</span>T<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>s<span style="color: #339933;">;</span><span style="color: #0000dd;">4</span> <span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span>r<span style="color: #339933;">=</span>O<span style="color: #339933;">*</span>O<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span><span style="color: #009900;">&#40;</span>l<span style="color: #339933;">=</span>I<span style="color: #339933;">*</span>I<span style="color: #009900;">&#41;</span><span style="color: #339933;">|++</span>_<span style="color: #339933;">==</span>L<span style="color: #339933;">&amp;&amp;</span>write<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">--</span>s<span style="color: #339933;">%</span>L<span style="color: #339933;">?</span>_<span style="color: #339933;">&lt;</span>L<span style="color: #339933;">?--</span>_
<span style="color: #339933;">%</span><span style="color:#800080;">6</span><span style="color: #339933;">:</span><span style="color: #0000dd;">6</span><span style="color: #339933;">:</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #ff0000;">&quot;123456 <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;&amp;</span><span style="color: #009900;">&#40;</span>O<span style="color: #339933;">=</span>I<span style="color: #339933;">=</span>l<span style="color: #339933;">=</span>_<span style="color: #339933;">=</span>r<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>T<span style="color: #339933;">+=</span>o<span style="color: #339933;">/</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>O<span style="color: #339933;">=</span>I<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>O<span style="color: #339933;">+</span>h<span style="color: #339933;">,</span>I<span style="color: #339933;">=</span>l<span style="color: #339933;">+</span>T<span style="color: #339933;">-</span>r<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wem so etwas Spa&#223; macht, sollte einfach mal das <a href="http://mindprod.com/jgloss/unmain.html">Unmaintainable Code Howto von Roedy Green</a> anschauen.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jahr der Informatik</title>
		<link>http://www.datenkobold.de/weblog/2005/11/jahr-der-informatik</link>
		<comments>http://www.datenkobold.de/weblog/2005/11/jahr-der-informatik#comments</comments>
		<pubDate>Thu, 24 Nov 2005 18:16:36 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Wissenschaftsjahr]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=265</guid>
		<description><![CDATA[Nach einer Pressemitteilung der Bundesregierung soll nach dem Einsteinjahr 2005 im n&#228;chsten Jahr das Jahr der Informatik 2006 stattfinden. Ich find das schick. Ab dem 29. November &#246;ffnet dann auch informatikjahr.de im Web, im Moment ist es leider nur eine “Waitpage”. &#196;hnliche Artikel:Datenspuren 2005 Dresden-Events Herbst 2005 Prof. Tanenbaum in Dresden


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/04/datenspuren-2005' rel='bookmark' title='Datenspuren 2005'>Datenspuren 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/dresden-events-herbst-2005' rel='bookmark' title='Dresden-Events Herbst 2005'>Dresden-Events Herbst 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/05/prof-tanenbaum-in-dresden' rel='bookmark' title='Prof. Tanenbaum in Dresden'>Prof. Tanenbaum in Dresden</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Nach einer Pressemitteilung der Bundesregierung soll nach dem Einsteinjahr 2005 im n&#228;chsten Jahr das Jahr der Informatik 2006  stattfinden. Ich find das schick. Ab dem 29. November &#246;ffnet dann auch <a href="http://www.informatikjahr.de">informatikjahr.de</a> im Web, im Moment ist es leider nur eine “Waitpage”.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/04/datenspuren-2005' rel='bookmark' title='Datenspuren 2005'>Datenspuren 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/dresden-events-herbst-2005' rel='bookmark' title='Dresden-Events Herbst 2005'>Dresden-Events Herbst 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/05/prof-tanenbaum-in-dresden' rel='bookmark' title='Prof. Tanenbaum in Dresden'>Prof. Tanenbaum in Dresden</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/11/jahr-der-informatik/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free Pascal lebt</title>
		<link>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt</link>
		<comments>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt#comments</comments>
		<pubDate>Tue, 17 May 2005 13:26:00 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[Pascal]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=171</guid>
		<description><![CDATA[Nach 5 Jahren Entwicklungsarbeit wurde jetzt Free Pascal 2.0 ver&#246;ffentlicht. Free Pascal ist ein zu Turbo Pascal und Delphi kompatibler Compiler f&#252;r Pascal und seine objektorientierten Erweiterungen. Als Entwicklungsumgebung kann man zum Beispiel Lazarus benutzen. &#196;hnliche Artikel:Speicheroptimierung mit pahole


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole' rel='bookmark' title='Speicheroptimierung mit pahole'>Speicheroptimierung mit pahole</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Nach 5 Jahren Entwicklungsarbeit wurde jetzt <a href="http://www.freepascal.org/">Free Pascal 2.0</a> ver&#246;ffentlicht. Free Pascal ist ein zu Turbo Pascal und Delphi kompatibler Compiler f&#252;r Pascal und seine objektorientierten Erweiterungen. Als Entwicklungsumgebung kann man zum Beispiel <a href="http://www.lazarus.freepascal.org/">Lazarus</a> benutzen. </p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole' rel='bookmark' title='Speicheroptimierung mit pahole'>Speicheroptimierung mit pahole</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Informatikbuch</title>
		<link>http://www.datenkobold.de/weblog/2005/03/das-informatikbuch</link>
		<comments>http://www.datenkobold.de/weblog/2005/03/das-informatikbuch#comments</comments>
		<pubDate>Sun, 13 Mar 2005 22:42:19 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Buchempfehlung]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Literatur]]></category>
		<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[TAOCP]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=94</guid>
		<description><![CDATA[[avhamazon locale="DE" asin="0201485419" linktype="pic" picsize="medium"] “The Art of Computer Programming” von Donald E. Knuth ist eines der Standardwerke der Informatik. In drei B&#228;nden werden die Themen Fundamentale Algorithmen, (Semi-)Numerische Algorithmen und Suchen und Sortieren umfassend behandelt. Nach Angaben des Autors ist das Werk mit ingesamt sieben B&#228;nden geplant. Um dieses sehr gro&#223;e Projekt umzusetzen, hatte [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/04/graphentheorie' rel='bookmark' title='Graphentheorie'>Graphentheorie</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/open-source-jahrbuch-2007' rel='bookmark' title='Open Source Jahrbuch 2007'>Open Source Jahrbuch 2007</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/03/abelpreis-2005' rel='bookmark' title='Abelpreis 2005'>Abelpreis 2005</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>[avhamazon locale="DE" asin="0201485419" linktype="pic" picsize="medium"]</p>
<p><a href="http://www-cs-faculty.stanford.edu/~knuth/taocp.html">“The Art of Computer Programming”</a> von Donald E. Knuth ist eines der Standardwerke der Informatik. In drei B&#228;nden werden die Themen Fundamentale Algorithmen, (Semi-)Numerische Algorithmen und Suchen und Sortieren umfassend behandelt. Nach Angaben des Autors ist das Werk mit ingesamt sieben B&#228;nden geplant. Um dieses sehr gro&#223;e Projekt umzusetzen, hatte Knuth sich bereits 1992 emeritieren lassen.</p>
<p>Mittlerweile sieht es so aus als ob ein vierter Band &#252;ber kombinatorische Probleme (Backtracking, Graphentheorie, Optimierung) erscheinen wird. Auf den Seiten von Professor Knuth finden sich bereits <a href="http://www-cs-faculty.stanford.edu/~knuth/news07.html">erste Vordrucke</a>. Als Gesamtwerk steht TAOCP auf jeden Fall auf meiner Wunschliste!</p>
<p><strong>Update (Sommer 2009):</strong><br />
Die Teile 0-4 (Fascicles) des vierten Bandes sind im Buchhandel erh&#228;ltlich und sollen zu gegebener Zeit als Gesamtband ver&#246;ffentlicht werden.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/04/graphentheorie' rel='bookmark' title='Graphentheorie'>Graphentheorie</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/open-source-jahrbuch-2007' rel='bookmark' title='Open Source Jahrbuch 2007'>Open Source Jahrbuch 2007</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/03/abelpreis-2005' rel='bookmark' title='Abelpreis 2005'>Abelpreis 2005</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/03/das-informatikbuch/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

