<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rkovalev</id>
	<title>Wiki - Факультет компьютерных наук - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rkovalev"/>
	<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Rkovalev"/>
	<updated>2026-09-21T12:21:11Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17993</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17993"/>
		<updated>2015-12-15T14:39:26Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
В качестве языка программирования мы используем C++, в качестве инструмента профилирования - perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство различных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, уверенно бьющий femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения и размер словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17992</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17992"/>
		<updated>2015-12-15T14:39:12Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
В качестве языка программирования мы используем C++, в качестве инструмента профилирования - perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство различных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, уверенно бьющий femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения и размер словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17991</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17991"/>
		<updated>2015-12-15T14:38:43Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
В качестве языка программирования мы используем C++, в качестве инструмента профилирования - perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство различных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17990</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17990"/>
		<updated>2015-12-15T14:38:17Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
В качестве языка программирования мы используем C++, в качестве инструмента профилирования - perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство различных энтропийных алгоритмов сжатия, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17989</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17989"/>
		<updated>2015-12-15T14:37:46Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
В качестве языка программирования мы используем C++, в качестве инструмента профилирования - perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17988</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17988"/>
		<updated>2015-12-15T14:36:47Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные энтропийные алгоритмы сжатия и научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Для измерения производительности мы будем применять perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17987</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17987"/>
		<updated>2015-12-15T14:35:33Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что это за проект? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [https://github.com/gtoubassi/femtozip femtozip] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные алгоритмы сжатия и научитесь создавать свои, а также научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Для измерения производительности мы будем применять perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17986</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17986"/>
		<updated>2015-12-15T14:35:16Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что это за проект? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать энтропийный алгоритм сжатия с внешним словарём и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [[https://github.com/gtoubassi/femtozip femtozip]] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные алгоритмы сжатия и научитесь создавать свои, а также научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Для измерения производительности мы будем применять perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17985</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17985"/>
		<updated>2015-12-15T14:34:04Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что это за проект? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать такой алгоритм сжатия и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [[https://github.com/gtoubassi/femtozip femtozip]] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные алгоритмы сжатия и научитесь создавать свои, а также научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Для измерения производительности мы будем применять perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17984</id>
		<title>Компактное сжатие малых записей для быстрого доступа (проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BB%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=17984"/>
		<updated>2015-12-15T14:33:37Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: Новая страница, с помощью формы Новый_проект&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_проекта&lt;br /&gt;
|name=Компактное сжатие малых записей для быстрого доступа&lt;br /&gt;
|mentor=Руслан Ковалёв&lt;br /&gt;
|mentor_login={{URLENCODE:Rkovalev|WIKI}}&lt;br /&gt;
|semester=Весна 2016&lt;br /&gt;
|course=1&lt;br /&gt;
|summer=on&lt;br /&gt;
|number_of_students=10&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Довольно часто возникает ситуация, когда имеется относительно большое число (например, миллиард) относительно небольших записей (например, длиной в сотню байт и меньше), доступ к которым осуществляется произвольным образом и имеет существенные требования по производительности (например, мы можем представить себе таблицу в высоко нагруженной базе данных). &lt;br /&gt;
&lt;br /&gt;
В таких ситуациях алгоритмы сжатия с внешним словарём оказываются существенно эффективнее потоковых алгоритмов, строящих словарь в процессе непосредственно сжатия. В проекте предлагается реализовать такой алгоритм сжатия и посоревноваться в скорости распаковки и степени сжатия с известным алгоритмом [[https://github.com/gtoubassi/femtozip femtozip]] на разных наборах данных.&lt;br /&gt;
&lt;br /&gt;
=== Чему вы научитесь? ===&lt;br /&gt;
Вы узнаете, как устроены современные алгоритмы сжатия и научитесь создавать свои, а также научитесь измерять и оптимизировать производительность кода на C++.&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
Владение C++&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Для измерения производительности мы будем применять perf&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
На вводных занятиях мы рассмотрим устройство разных алгоритмов сжатия без потерь, их достоинства и недостатки.&lt;br /&gt;
&lt;br /&gt;
=== Направления развития ===&lt;br /&gt;
Алгоритм, победивший femtozip, ценен сам по себе. Можно оптимизировать скорость распаковки и запаковки, степень сжатия, скорость построения словаря.&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
4-5: реализовано энтропийное кодирование&lt;br /&gt;
6-7: в энтропийном кодировании учитываются каким-либо образом условные вероятности&lt;br /&gt;
8-10: алгоритм сравним с femtozip по скорости и степени сжатия или опережает его&lt;br /&gt;
&lt;br /&gt;
=== Ориентировочное расписание занятий ===&lt;br /&gt;
СБ 9:00-12:00&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17247</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17247"/>
		<updated>2015-09-25T14:18:04Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что это за проект */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [https://ru.wikipedia.org/wiki/DynInst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
=== Слайды ===&lt;br /&gt;
[https://yadi.sk/i/O7AslJNLjKSw6 Лежат здесь.]&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются заинлайненные функции.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17245</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17245"/>
		<updated>2015-09-25T13:06:39Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что требуется */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [https://ru.wikipedia.org/wiki/DynInst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются заинлайненные функции.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17244</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17244"/>
		<updated>2015-09-25T12:58:35Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются заинлайненные функции.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17243</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17243"/>
		<updated>2015-09-25T12:58:04Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Требования на зачет в конце 1-го модуля */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17242</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17242"/>
		<updated>2015-09-25T12:56:47Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17241</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17241"/>
		<updated>2015-09-25T12:46:59Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что это за проект */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов в человекочитаемом формате.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить возвращаемое значение функции.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер поддерживает многопоточные приложения.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17240</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17240"/>
		<updated>2015-09-25T12:46:40Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что требуется */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать простой неинтерактивный дебагер, который будет выводить в файл историю вызовов функций в программе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов в человекочитаемом формате.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить возвращаемое значение функции.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер поддерживает многопоточные приложения.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17239</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17239"/>
		<updated>2015-09-25T12:46:13Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [http://www.dyninst.org/dyninst DynInst] или аналогичной. Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать простой неинтерактивный дебагер, который будет выводить в файл историю вызовов функций в программе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов в человекочитаемом формате.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить возвращаемое значение функции.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер поддерживает многопоточные приложения.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17236</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17236"/>
		<updated>2015-09-25T10:09:18Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать JIT компиляцию регулярных выражений, поддерживаемых re2, в машинный код x86-64.&lt;br /&gt;
&lt;br /&gt;
=== Слайды ===&lt;br /&gt;
[https://yadi.sk/d/ymlaks89jK69x Лежат тут.]&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно написать библиотеку, которая использует [https://github.com/google/re2/ re2] для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций для виртуальной машины в re2 и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Полученная конструкция работает корректно (re2 и re2jit на поддерживаемых регулярных выражениях дают один и тот же результат). &lt;br /&gt;
&lt;br /&gt;
Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17235</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17235"/>
		<updated>2015-09-25T10:08:21Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать JIT компиляцию регулярных выражений, поддерживаемых re2, в машинный код x86-64.&lt;br /&gt;
&lt;br /&gt;
[https://yadi.sk/d/ymlaks89jK69x А ещё у проекта есть презентация.]&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно написать библиотеку, которая использует [https://github.com/google/re2/ re2] для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций для виртуальной машины в re2 и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Полученная конструкция работает корректно (re2 и re2jit на поддерживаемых регулярных выражениях дают один и тот же результат). &lt;br /&gt;
&lt;br /&gt;
Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17232</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17232"/>
		<updated>2015-09-24T20:18:33Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Linux предоставляет ряд средств для отладки пользователем своих процессов. Например, можно посмотреть в память или регистры другого процесса или даже поменять там что-то. При помощи этих средств реализованы, к примеру, gdb и strace.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать простой неинтерактивный дебагер, который будет выводить в файл историю вызовов функций в программе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов в человекочитаемом формате.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить возвращаемое значение функции.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер поддерживает многопоточные приложения.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17231</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17231"/>
		<updated>2015-09-24T20:17:27Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Linux предоставляет ряд средств для отладки пользователем своих процессов. Например, можно посмотреть в память или регистры другого процесса или даже поменять там что-то. При помощи этих средств реализованы, к примеру, gdb и strace.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать простой неинтерактивный дебагер, который будет выводить в файл историю вызовов функций в программе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов в человекочитаемом формате.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет выводить возвращаемое значение функции.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17229</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17229"/>
		<updated>2015-09-24T20:02:03Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Что требуется */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать JIT компиляцию регулярных выражений, поддерживаемых re2, в машинный код x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно написать библиотеку, которая использует [https://github.com/google/re2/ re2] для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций для виртуальной машины в re2 и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Полученная конструкция работает корректно (re2 и re2jit на поддерживаемых регулярных выражениях дают один и тот же результат). &lt;br /&gt;
&lt;br /&gt;
Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17228</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17228"/>
		<updated>2015-09-24T20:00:22Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Требования на зачет в конце 1-го модуля */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно написать библиотеку, которая использует [https://github.com/google/re2/ re2] для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций для виртуальной машины в re2 и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Полученная конструкция работает корректно (re2 и re2jit на поддерживаемых регулярных выражениях дают один и тот же результат). &lt;br /&gt;
&lt;br /&gt;
Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17227</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17227"/>
		<updated>2015-09-24T19:55:55Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17226</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17226"/>
		<updated>2015-09-24T19:53:25Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, aver(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17225</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17225"/>
		<updated>2015-09-24T19:52:22Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, sum(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;) / sum(T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17224</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17224"/>
		<updated>2015-09-24T19:50:46Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, sum(1 - T&amp;lt;sub&amp;gt;re2jit&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;re2&amp;lt;/sub&amp;gt;)) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17223</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17223"/>
		<updated>2015-09-24T19:50:05Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, sum(1 - T_re2jit / T_re2)) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17222</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17222"/>
		<updated>2015-09-24T19:49:26Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, Sum(1 - Time(jit) / Time(re2))) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17221</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17221"/>
		<updated>2015-09-24T19:47:06Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, Sum(Time(re2) - Time(jit)) / Sum(Time(re2))) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17219</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17219"/>
		<updated>2015-09-24T19:45:07Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Итоговая оценка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;4 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;8 баллов&#039;&#039;&#039;. Все инструкции re2 VM компилируются в JIT.&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, (Time(re2) - Time(jit)) / Time(re2)) за обгон re2 на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17216</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17216"/>
		<updated>2015-09-24T19:43:19Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Требования на зачет в конце 1-го модуля */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] регулярные выражения компилируются в инструкции виртуальной машины, реализующей алгоритм Томпсона. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины и может при помощи [http://yasm.tortall.net/ libyasm], [http://sljit.sourceforge.net/ sljit] или [http://www.gnu.org/software/libjit/ libjit] компилировать в x86_64 и запускать какое-то непустое подмножество этих инструкций (LLVM плохо, т.к. компиляция должна быть максимально быстрой). Пример того, как можно запустить JIT код, описан в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction этой статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;3 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;7 баллов&#039;&#039;&#039;. Байткод компилируется в машинный код, машинный код работает правильно.&lt;br /&gt;
* &#039;&#039;&#039;+1 балл&#039;&#039;&#039;. Реализована поддержка юникода и capturing groups (захватывающих скобок).&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, (Time(re2) - Time(jit)) / Time(re2)) на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17208</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17208"/>
		<updated>2015-09-24T17:00:28Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Требования на зачет в конце 1-го модуля */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
В [https://github.com/google/re2/ re2] реализована компиляция регулярных выражений в инструкции виртуальной машины. Нужно написать библиотеку, которая использует re2 для синтаксического разбора регулярных выражений, получает из неё представление регулярного выражения в виде инструкций этой виртуальной машины, умеет при помощи [http://yasm.tortall.net/ libyasm] компилировать и запускать какое-то непустое подмножество этих инструкций. Например, так, как это описано в [http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction статье].&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;3 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;7 баллов&#039;&#039;&#039;. Байткод компилируется в машинный код, машинный код работает правильно.&lt;br /&gt;
* &#039;&#039;&#039;+1 балл&#039;&#039;&#039;. Реализована поддержка юникода и capturing groups (захватывающих скобок).&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, (Time(re2) - Time(jit)) / Time(re2)) на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17176</id>
		<title>Компьютерные системы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17176"/>
		<updated>2015-09-20T23:18:42Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Проектная работа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Список литературы =&lt;br /&gt;
&lt;br /&gt;
# Э. Таненбаум, Х. Бос. Современные операционные системы. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-496-01395-6&lt;br /&gt;
# Э. Таненбаум, Т. Остин. Архитектура компьютера. 6-е издание. СПб.: Питер, 2015. ISBN 978-5-496-00337-7&lt;br /&gt;
# Д. Паттерсон, Дж. Хеннесси. Архитектура компьютера и проектирование компьютерных систем. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-459-00291-1&lt;br /&gt;
# Р. Лав. Ядро Linux: описание процесса разработки. 3-е издание. М.: OOO И.Д. Вильямс, 2015. ISBN 978-5-8459-1944-1&lt;br /&gt;
# Р. Э. Брайант, Д. Р. О&#039;Халларон. Компьютерные системы: архитектура и программирование. СПб.: БХВ-Петербург, 2005. ISBN 5-94157-433-9&lt;br /&gt;
# С. А. Раго, У. Р. Стивенс. UNIX. Профессиональное программирование. 3-е издание. М.: Символ-Плюс, 2014. ISBN 978-5-93286-216-2&lt;br /&gt;
&lt;br /&gt;
= Ссылки на материалы =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/tree/master/00-lectures Слайды лекций]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/ Репозиторий с материалами семинарских занятий]&lt;br /&gt;
&lt;br /&gt;
= Проектная работа =&lt;br /&gt;
&lt;br /&gt;
[[Эмулятор микроконтроллера ATtiny13A]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-сервер с функциональностью CGI]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Memcached|Сервер Memcached]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Shell|Интерпретатор командной строки (shell)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Cachesim|Эмулятор кеш-памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:MC|Файловый менеджер (mc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Htop|Менеджер процессов]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:RT11-fuse|Драйвер файловой системы RT-11]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:debuger|Неинтерактивный отладчик]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:jit|JIT компилятор регулярных выражений]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:fuse-p7zip|Файловая система из 7z-архива]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:rpmdb-alien-repos-sync|Синхронизация базы данных RPM из стороннимх пакетных менеджеров]]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17175</id>
		<title>Компьютерные системы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17175"/>
		<updated>2015-09-20T23:18:21Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Проектная работа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Список литературы =&lt;br /&gt;
&lt;br /&gt;
# Э. Таненбаум, Х. Бос. Современные операционные системы. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-496-01395-6&lt;br /&gt;
# Э. Таненбаум, Т. Остин. Архитектура компьютера. 6-е издание. СПб.: Питер, 2015. ISBN 978-5-496-00337-7&lt;br /&gt;
# Д. Паттерсон, Дж. Хеннесси. Архитектура компьютера и проектирование компьютерных систем. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-459-00291-1&lt;br /&gt;
# Р. Лав. Ядро Linux: описание процесса разработки. 3-е издание. М.: OOO И.Д. Вильямс, 2015. ISBN 978-5-8459-1944-1&lt;br /&gt;
# Р. Э. Брайант, Д. Р. О&#039;Халларон. Компьютерные системы: архитектура и программирование. СПб.: БХВ-Петербург, 2005. ISBN 5-94157-433-9&lt;br /&gt;
# С. А. Раго, У. Р. Стивенс. UNIX. Профессиональное программирование. 3-е издание. М.: Символ-Плюс, 2014. ISBN 978-5-93286-216-2&lt;br /&gt;
&lt;br /&gt;
= Ссылки на материалы =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/tree/master/00-lectures Слайды лекций]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/ Репозиторий с материалами семинарских занятий]&lt;br /&gt;
&lt;br /&gt;
= Проектная работа =&lt;br /&gt;
&lt;br /&gt;
[[Эмулятор микроконтроллера ATtiny13A]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-сервер с функциональностью CGI]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Memcached|Сервер Memcached]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Shell|Интерпретатор командной строки (shell)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Cachesim|Эмулятор кеш-памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:MC|Файловый менеджер (mc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Htop|Менеджер процессов]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:RT11-fuse|Драйвер файловой системы RT-11]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:debuger|Трассировщик вызовов функций]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:jit|JIT компилятор регулярных выражений]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:fuse-p7zip|Файловая система из 7z-архива]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:rpmdb-alien-repos-sync|Синхронизация базы данных RPM из стороннимх пакетных менеджеров]]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17174</id>
		<title>Компьютерные системы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17174"/>
		<updated>2015-09-20T23:17:43Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Проектная работа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Список литературы =&lt;br /&gt;
&lt;br /&gt;
# Э. Таненбаум, Х. Бос. Современные операционные системы. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-496-01395-6&lt;br /&gt;
# Э. Таненбаум, Т. Остин. Архитектура компьютера. 6-е издание. СПб.: Питер, 2015. ISBN 978-5-496-00337-7&lt;br /&gt;
# Д. Паттерсон, Дж. Хеннесси. Архитектура компьютера и проектирование компьютерных систем. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-459-00291-1&lt;br /&gt;
# Р. Лав. Ядро Linux: описание процесса разработки. 3-е издание. М.: OOO И.Д. Вильямс, 2015. ISBN 978-5-8459-1944-1&lt;br /&gt;
# Р. Э. Брайант, Д. Р. О&#039;Халларон. Компьютерные системы: архитектура и программирование. СПб.: БХВ-Петербург, 2005. ISBN 5-94157-433-9&lt;br /&gt;
# С. А. Раго, У. Р. Стивенс. UNIX. Профессиональное программирование. 3-е издание. М.: Символ-Плюс, 2014. ISBN 978-5-93286-216-2&lt;br /&gt;
&lt;br /&gt;
= Ссылки на материалы =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/tree/master/00-lectures Слайды лекций]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/ Репозиторий с материалами семинарских занятий]&lt;br /&gt;
&lt;br /&gt;
= Проектная работа =&lt;br /&gt;
&lt;br /&gt;
[[Эмулятор микроконтроллера ATtiny13A]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-сервер с функциональностью CGI]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Memcached|Сервер Memcached]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Shell|Интерпретатор командной строки (shell)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Cachesim|Эмулятор кеш-памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:MC|Файловый менеджер (mc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Htop|Менеджер процессов]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:RT11-fuse|Драйвер файловой системы RT-11]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:debuger|Простой неинтерактивный дебагер]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:jit|JIT компилятор регулярных выражений]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:fuse-p7zip|Файловая система из 7z-архива]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:rpmdb-alien-repos-sync|Синхронизация базы данных RPM из стороннимх пакетных менеджеров]]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17173</id>
		<title>КС:2015:Проект:debuger</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=17173"/>
		<updated>2015-09-20T23:17:04Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: Новая страница: «== Что это за проект ==  === Введение === Linux предоставляет ряд средств для отладки пользовате…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Linux предоставляет ряд средств для отладки пользователем своих процессов. Например, можно посмотреть в память или регистры другого процесса или даже поменять там что-то. При помощи этих средств реализованы, к примеру, gdb и strace.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать простой неинтерактивный дебагер, который будет выводить в файл историю вызовов функций в программе.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу, которая умеет трейсить вызовы функций и выводить их имена в файл.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;3 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;7 баллов&#039;&#039;&#039;. Трейсер выводит имена вызываемых функций, а также, используя отладочную информацию в отлаживаемом бинарнике, выводит значения параметров, с которыми эта функция была вызвана, номер строки и название файла исходого кода, из которых было скомпилировано место вызова.&lt;br /&gt;
* &#039;&#039;&#039;+1 балл&#039;&#039;&#039;. Трейсер умеет выводить текущий стек вызовов.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Поддерживаются многопоточные программы.&lt;br /&gt;
* &#039;&#039;&#039;+2 балла&#039;&#039;&#039;. Трейсер умеет отслеживать переключение контекста в корутинах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17172</id>
		<title>КС:2015:Проект:jit</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:jit&amp;diff=17172"/>
		<updated>2015-09-20T22:33:36Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: Новая страница: «== Что это за проект ==  === Введение === JIT компиляция (Just In Time, ещё называют динамической) - это…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
JIT компиляция (Just In Time, ещё называют динамической) - это компиляция виртуальной машиной программы на интерпретируем байткоде в машинный код в процессе её выполнения. Позволяет увеличить скорость выполнения интерпретируемой программы. Применяется, в частности, в виртуальных машинах pypy и java hotspot.&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается реализовать быструю библиотеку регулярных выражений, которая умеет компилировать регулярные выражения непосредственно в инструкции x86-64.&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроена JIT компиляция.&lt;br /&gt;
&lt;br /&gt;
2. Научитесь профилировать код и искать узкие места в производительности.&lt;br /&gt;
&lt;br /&gt;
3. Научитесь писать интерпретаторы с JIT.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать библиотеку регулярных выражений, которая умеет по регулярному выражению в диалекте POSIX extended построить автомат, скомпилировать этот автомат в байткод и затем его выполнить. Также программа должна уметь дампить байткод и считывать его из дампа.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &#039;&#039;&#039;3 балла&#039;&#039;&#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &#039;&#039;&#039;7 баллов&#039;&#039;&#039;. Байткод компилируется в машинный код, машинный код работает правильно.&lt;br /&gt;
* &#039;&#039;&#039;+1 балл&#039;&#039;&#039;. Реализована поддержка юникода и capturing groups (захватывающих скобок).&lt;br /&gt;
* &#039;&#039;&#039;+N баллов&#039;&#039;&#039;. N = 8 * max(0, (Time(re2) - Time(jit)) / Time(re2)) на предложенных тестах.&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17154</id>
		<title>Компьютерные системы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17154"/>
		<updated>2015-09-17T14:33:31Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Список литературы =&lt;br /&gt;
&lt;br /&gt;
# Э. Таненбаум, Х. Бос. Современные операционные системы. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-496-01395-6&lt;br /&gt;
# Э. Таненбаум, Т. Остин. Архитектура компьютера. 6-е издание. СПб.: Питер, 2015. ISBN 978-5-496-00337-7&lt;br /&gt;
# Д. Паттерсон, Дж. Хеннесси. Архитектура компьютера и проектирование компьютерных систем. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-459-00291-1&lt;br /&gt;
# Р. Лав. Ядро Linux: описание процесса разработки. 3-е издание. М.: OOO И.Д. Вильямс, 2015. ISBN 978-5-8459-1944-1&lt;br /&gt;
# Р. Э. Брайант, Д. Р. О&#039;Халларон. Компьютерные системы: архитектура и программирование. СПб.: БХВ-Петербург, 2005. ISBN 5-94157-433-9&lt;br /&gt;
# С. А. Раго, У. Р. Стивенс. UNIX. Профессиональное программирование. 3-е издание. М.: Символ-Плюс, 2014. ISBN 978-5-93286-216-2&lt;br /&gt;
&lt;br /&gt;
= Ссылки на материалы =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/tree/master/00-lectures Слайды лекций]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/ Репозиторий с материалами семинарских занятий]&lt;br /&gt;
&lt;br /&gt;
= Проектная работа =&lt;br /&gt;
&lt;br /&gt;
[[Эмулятор микроконтроллера ATtiny13A]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-сервер с функциональностью CGI]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Memcached|Сервер Memcached]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Shell|Интерпретатор командной строки (shell)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Cachesim|Эмулятор кеш-памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:MC|Файловый менеджер (mc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:RT11-fuse|Драйвер файловой системы RT-11]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:allocator|Быстрый аллокатор оперативной памяти (аналог jemalloc / tcmalloc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:lock-free|Многопоточная структура данных без блокировок (LF очередь / RCU / ???)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:coroutines|Библиотека корутин на C]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:tcp-over-udp|Простой протокол надёжной доставки данных (подмножество TCP) поверх UDP]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:debuger|Простой неинтерактивный дебагер]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:jit|JIT компилятор регулярных выражений]]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17153</id>
		<title>Компьютерные системы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=17153"/>
		<updated>2015-09-16T22:42:17Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: /* Проектная работа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Список литературы =&lt;br /&gt;
&lt;br /&gt;
# Э. Таненбаум, Х. Бос. Современные операционные системы. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-496-01395-6&lt;br /&gt;
# Э. Таненбаум, Т. Остин. Архитектура компьютера. 6-е издание. СПб.: Питер, 2015. ISBN 978-5-496-00337-7&lt;br /&gt;
# Д. Паттерсон, Дж. Хеннесси. Архитектура компьютера и проектирование компьютерных систем. 4-е издание. СПб.: Питер, 2015. ISBN 978-5-459-00291-1&lt;br /&gt;
# Р. Лав. Ядро Linux: описание процесса разработки. 3-е издание. М.: OOO И.Д. Вильямс, 2015. ISBN 978-5-8459-1944-1&lt;br /&gt;
# Р. Э. Брайант, Д. Р. О&#039;Халларон. Компьютерные системы: архитектура и программирование. СПб.: БХВ-Петербург, 2005. ISBN 5-94157-433-9&lt;br /&gt;
# С. А. Раго, У. Р. Стивенс. UNIX. Профессиональное программирование. 3-е издание. М.: Символ-Плюс, 2014. ISBN 978-5-93286-216-2&lt;br /&gt;
&lt;br /&gt;
= Ссылки на материалы =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/tree/master/00-lectures Слайды лекций]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hseos/hseos-course/ Репозиторий с материалами семинарских занятий]&lt;br /&gt;
&lt;br /&gt;
= Проектная работа =&lt;br /&gt;
&lt;br /&gt;
[[Эмулятор микроконтроллера ATtiny13A]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-сервер с функциональностью CGI]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Memcached|Сервер Memcached]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Shell|Интерпретатор командной строки (shell)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:Cachesim|Эмулятор кеш-памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:MC|Файловый менеджер (mc)]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:RT11-fuse|Драйвер файловой системы RT-11]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:allocator|Аллокатор памяти]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:lock-free|Многопоточная структура данных без блокировок]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:coroutines|Сопрограмма]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:tcp-over-udp|TCP поверх UDP]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:debuger|Простой дебагер]]&lt;br /&gt;
&lt;br /&gt;
[[КС:2015:Проект:jit|JIT компилятор]]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_106-1&amp;diff=1307</id>
		<title>Алгоритмы и структуры данных. Подгруппа 106-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_106-1&amp;diff=1307"/>
		<updated>2015-01-18T23:35:09Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://bitbucket.org/velavokr/hse-2015-106-1-algorithms-and-data-structures/src Все материалы семинаров будут выкладываться на bitbucket]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_106-1&amp;diff=1305</id>
		<title>Алгоритмы и структуры данных. Подгруппа 106-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85._%D0%9F%D0%BE%D0%B4%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_106-1&amp;diff=1305"/>
		<updated>2015-01-18T23:17:26Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: Новая страница: «[https://bitbucket.org/velavokr/hse-2015-106-1-algorithms-and-data-structures/src/c91e7f275f74?at=master Все материалы семинаров будут…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://bitbucket.org/velavokr/hse-2015-106-1-algorithms-and-data-structures/src/c91e7f275f74?at=master Все материалы семинаров будут выкладываться на bitbucket]&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=1304</id>
		<title>Алгоритмы и структуры данных 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2016&amp;diff=1304"/>
		<updated>2015-01-18T23:15:30Z</updated>

		<summary type="html">&lt;p&gt;Rkovalev: 106-1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
&#039;&#039;&#039;13 января:&#039;&#039;&#039; Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и &#039;&#039;O&#039;&#039;-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 января:&#039;&#039;&#039; &#039;&#039;О&#039;&#039;-, &#039;&#039;o&#039;&#039;-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.&lt;br /&gt;
&lt;br /&gt;
== Семинары ==&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
# [http://e-maxx.ru/bookz/files/cormen.pdf Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ]&lt;br /&gt;
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупты, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])&lt;/div&gt;</summary>
		<author><name>Rkovalev</name></author>
	</entry>
</feed>