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

<channel>
	<title>софт, хард &#38; интERнет &#187; Языки</title>
	<atom:link href="http://www.all-x.net/category/devel/languages/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.all-x.net</link>
	<description>Личный опыт укрощения компьютеров</description>
	<lastBuildDate>Thu, 22 Sep 2011 06:28:13 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>За что я люблю язык С</title>
		<link>http://www.all-x.net/2010/05/27/strlen/</link>
		<comments>http://www.all-x.net/2010/05/27/strlen/#comments</comments>
		<pubDate>Thu, 27 May 2010 12:09:36 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=717</guid>
		<description><![CDATA[<p>Пришлось тряхнуть стариной и написать несколько сотен строк кода на С. Лет десять уже этим не занимался, расслабился и огреб по полной программе:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span><span style="color: #339933;">*</span> res <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span> strlen<span style="color: #009900;">&#40;</span> str <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span> res<span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Код выглядит как настоящий, замыленным взглядом ошибку увидеть сложно. А уж какие эффекты появляются! Эта функция вызывалась из двух мест:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&#34;{'start':true}&#34;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&#160;
<span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&#34;{'stop':true}&#34;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Если вызывать только из первого места сколько угодно раз&#160;&#8212; всё работает. Если вызвать из второго места&#160;&#8212; падает при <em>втором</em> вызове. Если увеличить длину второй строки на один символ&#160;&#8212; опять же всё работает.</p>
<p>Рекомендую попробовать всем, кто использует языки с автоматическим управлением памятью. Незабываемые ощущения гарантированы!</p>
]]></description>
			<content:encoded><![CDATA[<p>Пришлось тряхнуть стариной и написать несколько сотен строк кода на С. Лет десять уже этим не занимался, расслабился и огреб по полной программе:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span><span style="color: #339933;">*</span> res <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span> strlen<span style="color: #009900;">&#40;</span> str <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span> res<span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Код выглядит как настоящий, замыленным взглядом ошибку увидеть сложно. А уж какие эффекты появляются! Эта функция вызывалась из двух мест:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;{'start':true}&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;{'stop':true}&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Если вызывать только из первого места сколько угодно раз&nbsp;&mdash; всё работает. Если вызвать из второго места&nbsp;&mdash; падает при <em>втором</em> вызове. Если увеличить длину второй строки на один символ&nbsp;&mdash; опять же всё работает.</p>
<p>Рекомендую попробовать всем, кто использует языки с автоматическим управлением памятью. Незабываемые ощущения гарантированы!</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=717&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/05/27/strlen/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Трудности перевода</title>
		<link>http://www.all-x.net/2010/02/04/encoding/</link>
		<comments>http://www.all-x.net/2010/02/04/encoding/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 22:32:18 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=676</guid>
		<description><![CDATA[<p>Несколько раз пришлось столкнуться с проблемами при чтении/записи кириллицы на Java. К примеру, есть файл в кодировке UTF-8, который читается с помощью <code>java.io.FileInputStream</code>. В результате русские буквы портятся. Бывает, что портятся не все, а только &#171;И&#187; и &#171;ш&#187;. Проблема проявляется только на Windows, классический случай&#160;&#8212; разработчик сидит на Linux: &#171;а у меня всё работает!&#187;.</p>
<p>Пришло время привести в порядок базовые знания.</p>
<p>В языке Java для строк используется тип <code>java.lang.String</code>. Символы в строке имеют тип Character&#160;&#8212; это 16-битные коды символов в кодировке <a href="http://unicode.org/">Unicode</a>.</p>
<p>Кодировка файлов может обеспечивать представление всех Unicode символов (UTF-8, UTF-16) или его подмножества (windows-1251). UTF-8 обеспечивает более компактное хранение наиболее распространенных символов (ASCII), но требует более сложного преобразования, поэтому существуют различные представления Unicode.</p>
<p>Что происходит, когда файл читается с помощью <code>java.io.FileInputStream</code>? Поток байтов преобразуется в последовательность Unicode символов. Стоп. Чтобы правильно преобразовать, надо знать кодировку файла. Но ни один из конструкторов <code>FileInputStream</code> не позволяет указать кодировку! Небольшое исследование выводит на инфрмацию о том, что используется умолчальная (дефолтная, стандартная) кодировка платформы. Что будет, если на самом деле в файле использована другая кодировка? Правильно, мусор. Как это победить? Есть такое свойство <a href="http://stackoverflow.com/questions/1128617/java-default-encoding"><code>file.encoding</code></a>, которое позволяет поменять стандартную кодировку, но оно не документировано (помните книжки типа &#171;Недокументированные возможности MS Word 6.0?&#187;).</p>
<p>Ладно, прочитали из файла строку в неправильной кодировке. В строке мусор. А мы этого не заметили и записали эту строку в другой файл. Конечно, через <code>java.io.FileOutputStream</code>. Тоже не имея возможности указать кодировку. В этом случае&#160;&#8212; к счастью. Потому что обратная функция почти все символы из мусора вернет в нормальное состояние. Кроме, если я не ошибаюсь, &#171;И&#187; и &#171;ш&#187;. А мы будем долго удивляться, откуда такая выборочная беда, ну ведь почти всё же правильно работает!</p>
<p>Лучше бы все символы поломались. Потому что понимание проблемы в этом случае пришло бы быстрее. Вот пример того, что получается при двойной неправильной перекодировке (потоки тут не используются, но суть та же):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.UnsupportedEncodingException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StreamEncoding
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">UnsupportedEncodingException</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> s <span style="color: #339933;">=</span> <span style="color: #0000ff;">&#34;Иллюзия&#34;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>  <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span> s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&#34;UTF-8&#34;</span> <span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&#34;windows-1251&#34;</span> <span style="color: #009900;">&#41;</span>
                                        .<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&#34;windows-1251&#34;</span> <span style="color: #009900;">&#41;</span>
                                      , <span style="color: #0000ff;">&#34;UTF-8&#34;</span>
                                      <span style="color: #009900;">&#41;</span>
                          <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Результат вывода:<br />
<code>�?ллюзия</code></p>
<p>Редкий случай&#160;&#8212; удалось понять суть проблемы. Обычно удаётся устранить проявления, но не докопаться до сути. Как же делать правильно?</p>
<ol>
<li>В своих программах для файловых операций использовать <code>java.io.InputStreamReader/Writer</code> и их конструкторы с указанием кодировки. Не использовать более простые <code>File(Reader/Writer)</code>, потому что они не позволяют указать кодировку. И уж тем более не использовать <code>File(Input/Output)Stream</code>.</li>
<li>Чужие программы иногда удается победить указанием свойства <code>file.encoding</code> в командной строке Java-машины. Очевидно, не всегда.</li>
</ol>
<p>А почему под Linux всё работало? Потому что файл был в кодировке UTF-8, а это стандартная кодировка платформы в Linux. Только не надо нос задирать, в следующий раз попадется windows-1251 и всё будет наоборот.</p>
]]></description>
			<content:encoded><![CDATA[<p>Несколько раз пришлось столкнуться с проблемами при чтении/записи кириллицы на Java. К примеру, есть файл в кодировке UTF-8, который читается с помощью <code>java.io.FileInputStream</code>. В результате русские буквы портятся. Бывает, что портятся не все, а только &laquo;И&raquo; и &laquo;ш&raquo;. Проблема проявляется только на Windows, классический случай&nbsp;&mdash; разработчик сидит на Linux: &laquo;а у меня всё работает!&raquo;.</p>
<p>Пришло время привести в порядок базовые знания.</p>
<p>В языке Java для строк используется тип <code>java.lang.String</code>. Символы в строке имеют тип Character&nbsp;&mdash; это 16-битные коды символов в кодировке <a href="http://unicode.org/">Unicode</a>.</p>
<p>Кодировка файлов может обеспечивать представление всех Unicode символов (UTF-8, UTF-16) или его подмножества (windows-1251). UTF-8 обеспечивает более компактное хранение наиболее распространенных символов (ASCII), но требует более сложного преобразования, поэтому существуют различные представления Unicode.</p>
<p>Что происходит, когда файл читается с помощью <code>java.io.FileInputStream</code>? Поток байтов преобразуется в последовательность Unicode символов. Стоп. Чтобы правильно преобразовать, надо знать кодировку файла. Но ни один из конструкторов <code>FileInputStream</code> не позволяет указать кодировку! Небольшое исследование выводит на инфрмацию о том, что используется умолчальная (дефолтная, стандартная) кодировка платформы. Что будет, если на самом деле в файле использована другая кодировка? Правильно, мусор. Как это победить? Есть такое свойство <a href="http://stackoverflow.com/questions/1128617/java-default-encoding"><code>file.encoding</code></a>, которое позволяет поменять стандартную кодировку, но оно не документировано (помните книжки типа &laquo;Недокументированные возможности MS Word 6.0?&raquo;).</p>
<p>Ладно, прочитали из файла строку в неправильной кодировке. В строке мусор. А мы этого не заметили и записали эту строку в другой файл. Конечно, через <code>java.io.FileOutputStream</code>. Тоже не имея возможности указать кодировку. В этом случае&nbsp;&mdash; к счастью. Потому что обратная функция почти все символы из мусора вернет в нормальное состояние. Кроме, если я не ошибаюсь, &laquo;И&raquo; и &laquo;ш&raquo;. А мы будем долго удивляться, откуда такая выборочная беда, ну ведь почти всё же правильно работает!</p>
<p>Лучше бы все символы поломались. Потому что понимание проблемы в этом случае пришло бы быстрее. Вот пример того, что получается при двойной неправильной перекодировке (потоки тут не используются, но суть та же):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.UnsupportedEncodingException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StreamEncoding
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">UnsupportedEncodingException</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> s <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Иллюзия&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>  <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span> s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span> <span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;windows-1251&quot;</span> <span style="color: #009900;">&#41;</span>
                                        .<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;windows-1251&quot;</span> <span style="color: #009900;">&#41;</span>
                                      , <span style="color: #0000ff;">&quot;UTF-8&quot;</span>
                                      <span style="color: #009900;">&#41;</span>
                          <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Результат вывода:<br />
<code>�?ллюзия</code></p>
<p>Редкий случай&nbsp;&mdash; удалось понять суть проблемы. Обычно удаётся устранить проявления, но не докопаться до сути. Как же делать правильно?</p>
<ol>
<li>В своих программах для файловых операций использовать <code>java.io.InputStreamReader/Writer</code> и их конструкторы с указанием кодировки. Не использовать более простые <code>File(Reader/Writer)</code>, потому что они не позволяют указать кодировку. И уж тем более не использовать <code>File(Input/Output)Stream</code>.</li>
<li>Чужие программы иногда удается победить указанием свойства <code>file.encoding</code> в командной строке Java-машины. Очевидно, не всегда.</li>
</ol>
<p>А почему под Linux всё работало? Потому что файл был в кодировке UTF-8, а это стандартная кодировка платформы в Linux. Только не надо нос задирать, в следующий раз попадется windows-1251 и всё будет наоборот.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=676&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/02/04/encoding/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google выкатил Simple</title>
		<link>http://www.all-x.net/2009/07/30/google-simple/</link>
		<comments>http://www.all-x.net/2009/07/30/google-simple/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 21:16:57 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=430</guid>
		<description><![CDATA[<p>Google <del>изобрел велосипед</del> придумал <del>BASIC</del> Simple. Это диалект BASIC для разработки приложений на платформе Android. Исходные файлы на Simple описывает компоненты&#160;&#8212; формочки и код, причем формочки в текстовом виде описаны в файле с кодом. Предполагается, что среды разработки будут скрывать текстовое описание GUI, предоставляя визуальный редактор.</p>
<p>Начнем с названия. Люди из этой компании вообще думают, как это искать? <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Игрался я с языком, который называется <a href="http://nice.sourceforge.net">Nice</a>. Как вы считаете, сколько результатов Гугл выдаст по запросу Nice Programming Language? 2.5 миллиона! И это для малоизвестного языка. А для только что объявленного Simple Programming Language уже почти 19 миллионов!</p>
<p>Естественно, <a href="http://code.google.com/p/simple/">проект расположился на Google Code</a>. Интересно стало посмотреть в исходники, тема трансляторов мне близка (<a href="http://treedl.org">TreeDL</a> хоть и дает всего 1.5 тыщи ссылок, зато релевантность существенно выше). Транслятор Simple написан на Java 6. Парсер рукописный, дерево гетерогенное, рукописное. Классы для узлов дерева содержат методы для генерации байт-кода JVM (У Microsoft на .NET был Basic, теперь и на JVM есть <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Решение достаточно эффективное, но плохо расширяемое.</p>
<p>Прежде чем на Windows удалось скомпилировать пустую программу, пришлось исправить три критические ошибки. Забавно, <a href="http://code.google.com/p/simple/issues/list?can=1&#038;q=&#038;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&#038;cells=tiles">первые четыре баг-репорта</a>&#160;&#8212; мои. Для версии 0.1.0 это, конечно, простительно, но осадочек остался. Нехорошо это&#160;&#8212; выкладывать сборку для платформы и ни разу ее не запустить... Впрочем, у проекта, похоже, один участник&#160;&#8212; Herbert Czymontek, он же simplecompiler.</p>
<p>Но самое главное&#160;&#8212; пока, судя по всему, есть только язык и транслятор с библиотекой. Средств визуального проектирования GUI нет. А пока их не будет, Simple своё название не оправдает. Впрочем, даже если они будут, не понимаю, чем BASIC проще нормальных языков. Ладно, поживем&#160;&#8212; увидим, деньги могут многое.</p>
]]></description>
			<content:encoded><![CDATA[<p>Google <del>изобрел велосипед</del> придумал <del>BASIC</del> Simple. Это диалект BASIC для разработки приложений на платформе Android. Исходные файлы на Simple описывает компоненты&nbsp;&mdash; формочки и код, причем формочки в текстовом виде описаны в файле с кодом. Предполагается, что среды разработки будут скрывать текстовое описание GUI, предоставляя визуальный редактор.</p>
<p>Начнем с названия. Люди из этой компании вообще думают, как это искать? <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Игрался я с языком, который называется <a href="http://nice.sourceforge.net">Nice</a>. Как вы считаете, сколько результатов Гугл выдаст по запросу Nice Programming Language? 2.5 миллиона! И это для малоизвестного языка. А для только что объявленного Simple Programming Language уже почти 19 миллионов!</p>
<p>Естественно, <a href="http://code.google.com/p/simple/">проект расположился на Google Code</a>. Интересно стало посмотреть в исходники, тема трансляторов мне близка (<a href="http://treedl.org">TreeDL</a> хоть и дает всего 1.5 тыщи ссылок, зато релевантность существенно выше). Транслятор Simple написан на Java 6. Парсер рукописный, дерево гетерогенное, рукописное. Классы для узлов дерева содержат методы для генерации байт-кода JVM (У Microsoft на .NET был Basic, теперь и на JVM есть <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Решение достаточно эффективное, но плохо расширяемое.</p>
<p>Прежде чем на Windows удалось скомпилировать пустую программу, пришлось исправить три критические ошибки. Забавно, <a href="http://code.google.com/p/simple/issues/list?can=1&#038;q=&#038;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&#038;cells=tiles">первые четыре баг-репорта</a>&nbsp;&mdash; мои. Для версии 0.1.0 это, конечно, простительно, но осадочек остался. Нехорошо это&nbsp;&mdash; выкладывать сборку для платформы и ни разу ее не запустить... Впрочем, у проекта, похоже, один участник&nbsp;&mdash; Herbert Czymontek, он же simplecompiler.</p>
<p>Но самое главное&nbsp;&mdash; пока, судя по всему, есть только язык и транслятор с библиотекой. Средств визуального проектирования GUI нет. А пока их не будет, Simple своё название не оправдает. Впрочем, даже если они будут, не понимаю, чем BASIC проще нормальных языков. Ладно, поживем&nbsp;&mdash; увидим, деньги могут многое.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=430&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/07/30/google-simple/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby: рассуждения о наследовании</title>
		<link>http://www.all-x.net/2008/04/07/ruby-inheritance/</link>
		<comments>http://www.all-x.net/2008/04/07/ruby-inheritance/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 20:17:54 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2008/04/07/ruby-inheritance/</guid>
		<description><![CDATA[<p>Конечно, классы в Ruby открыты для расширения. Но порядок интерпретации влияет на результат. Пример:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
<span style="color:#9966CC; font-weight:bold;">class</span> B <span style="color:#006600; font-weight:bold;">&#60;</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
<span style="color:#9966CC; font-weight:bold;">class</span> B
   <span style="color:#9966CC; font-weight:bold;">def</span> m
   <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Так работает. Но если поменять местами два последних определения, то возникает сообщение об ошибке: <code>superclass mismatch for class B (TypeError)</code>, поскольку указать базовый класс можно только при первоначальном определении класса.</p>
<p>Вообще, возможность добавления методов в существующий класс заставляет переосмыслить роль механизма наследования. На первый взгляд, в Ruby с открытыми определениями классов, динамической типизацией и <em>duck typing</em> наследование не требуется! </p>
<p>Программисты, &#171;думающие&#187; на C++/Java  часто используют наследование не по назначению. Обсуждая с коллегой вопрос &#171;зачем нужно наследование?&#187; я наткнулся на быстрый ответ: для переиспользования кода. В этом и есть корень зла&#160;&#8212; при отсутствии нормальных механизмов повторного использования кода в этом качестве начинают использовать наследование. Но в Ruby-то такие механизмы есть. Так зачем наследование?</p>
<p>Похоже, что в Ruby и подобных языках наследование вернулось к своему первоначальному назначению&#160;&#8212;  выразить намерение программиста, что один тип является подтипом другого. Кстати, если вспомнить принцип подстановки Лисков (<a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a>), то становится понятно, что <strong>под</strong>тип (<strong>sub</strong>type) тесно связан с <strong>под</strong>становкой (<strong>sub</strong>stitution).</p>
<p>Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.</p>
]]></description>
			<content:encoded><![CDATA[<p>Конечно, классы в Ruby открыты для расширения. Но порядок интерпретации влияет на результат. Пример:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> B <span style="color:#006600; font-weight:bold;">&lt;</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> B
   <span style="color:#9966CC; font-weight:bold;">def</span> m
   <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Так работает. Но если поменять местами два последних определения, то возникает сообщение об ошибке: <code>superclass mismatch for class B (TypeError)</code>, поскольку указать базовый класс можно только при первоначальном определении класса.</p>
<p>Вообще, возможность добавления методов в существующий класс заставляет переосмыслить роль механизма наследования. На первый взгляд, в Ruby с открытыми определениями классов, динамической типизацией и <em>duck typing</em> наследование не требуется! </p>
<p>Программисты, &laquo;думающие&raquo; на C++/Java  часто используют наследование не по назначению. Обсуждая с коллегой вопрос &laquo;зачем нужно наследование?&raquo; я наткнулся на быстрый ответ: для переиспользования кода. В этом и есть корень зла&nbsp;&mdash; при отсутствии нормальных механизмов повторного использования кода в этом качестве начинают использовать наследование. Но в Ruby-то такие механизмы есть. Так зачем наследование?</p>
<p>Похоже, что в Ruby и подобных языках наследование вернулось к своему первоначальному назначению&nbsp;&mdash;  выразить намерение программиста, что один тип является подтипом другого. Кстати, если вспомнить принцип подстановки Лисков (<a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a>), то становится понятно, что <strong>под</strong>тип (<strong>sub</strong>type) тесно связан с <strong>под</strong>становкой (<strong>sub</strong>stitution).</p>
<p>Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=137&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2008/04/07/ruby-inheritance/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby: всякая всячина</title>
		<link>http://www.all-x.net/2008/03/25/ruby-goods/</link>
		<comments>http://www.all-x.net/2008/03/25/ruby-goods/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 21:15:17 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2008/03/25/ruby-goods/</guid>
		<description><![CDATA[<p>Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.</p>
<p>1. При попытке установить gem на Ubuntu может возникать сообщение об ошибке:</p>
<pre class="wp_syntax">
extconf.rb:8:in `require’: no such file to load — mkmf (LoadError)
from extconf.rb:8
ERROR: While executing gem … (RuntimeError)
ERROR: Failed to build gem native extension.
</pre>
<p>Это означает, что не установлен пакет ruby###-dev, где ###&#160;&#8212; версия Ruby (текущая стабильная&#160;&#8212; 1.8). можно установить его, а можно сразу ruby-full, который гарантирует полную установку последней стабильной версии.</p>
<p>2. Просмотреть документацию локально установленных gems можно с помощью gem_server. После его запуска документация доступна по адресу http://localhost:8808.</p>
<p>3. gem renum дает возможность определять перечислимые типы:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">enum <span style="color:#ff3333; font-weight:bold;">:Status</span>, <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span> NOT_STARTED IN_PROGRESS COMPLETE <span style="color:#006600; font-weight:bold;">&#41;</span>
&#160;
enum <span style="color:#ff3333; font-weight:bold;">:Size</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&#160;
  Small<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&#34;Really really tiny&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  Medium<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&#34;Sort of in the middle&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  Large<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&#34;Quite big&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&#160;
  attr_reader <span style="color:#ff3333; font-weight:bold;">:description</span>
&#160;
  <span style="color:#9966CC; font-weight:bold;">def</span> init description
    <span style="color:#0066ff; font-weight:bold;">@description</span> = description
  <span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
<span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
<span style="color:#9966CC; font-weight:bold;">module</span> MyNamespace
  enum <span style="color:#ff3333; font-weight:bold;">:FooValue</span>, <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#ff3333; font-weight:bold;">:Bar</span>, <span style="color:#ff3333; font-weight:bold;">:Baz</span>, <span style="color:#ff3333; font-weight:bold;">:Bat</span> <span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>4. gem interface дает возможность определять интерфейсы в стиле Java (как набор методов) и проверять, что класс заданные интерфейсы реализует (конечно, типы параметров не специфицируются):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&#34;interface&#34;</span>
&#160;
   MyInterface = interface<span style="color:#006600; font-weight:bold;">&#123;</span>
      required_methods <span style="color:#ff3333; font-weight:bold;">:foo</span>, <span style="color:#ff3333; font-weight:bold;">:bar</span>, <span style="color:#ff3333; font-weight:bold;">:baz</span>
   <span style="color:#006600; font-weight:bold;">&#125;</span>
&#160;
   <span style="color:#008000; font-style:italic;"># Raises an error until 'baz' is defined</span>
   <span style="color:#9966CC; font-weight:bold;">class</span> MyClass
      <span style="color:#9966CC; font-weight:bold;">def</span> foo
         <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&#34;foo&#34;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">def</span> bar
         <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&#34;bar&#34;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      implements MyInterface
   <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>5. Две попытки снабдить Ruby средствами строгой типизации (но не статической!):<br />
gem strongtyping:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">      <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'strongtyping'</span>
      <span style="color:#9966CC; font-weight:bold;">include</span> StrongTyping
&#160;
      <span style="color:#9966CC; font-weight:bold;">def</span> foo<span style="color:#006600; font-weight:bold;">&#40;</span>a, b<span style="color:#006600; font-weight:bold;">&#41;</span>
         expect<span style="color:#006600; font-weight:bold;">&#40;</span>a, <span style="color:#CC0066; font-weight:bold;">String</span>, b, <span style="color:#CC00FF; font-weight:bold;">Numeric</span><span style="color:#006600; font-weight:bold;">&#41;</span>
         ...
      <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><a href="http://people.freebsd.org/~eivind/ruby/types/">types</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">typesig <span style="color:#CC0066; font-weight:bold;">String</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC0066; font-weight:bold;">Array</span>, <span style="color:#CC00FF; font-weight:bold;">Hash</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> example2<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">string</span>, array_or_hash<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#008000; font-style:italic;"># ... here, we know that string is a String, and array_or_hash</span>
  <span style="color:#008000; font-style:italic;"># is either an Array or a Hash (or a subclass thereof) ...</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Eivind Eklund, автор types, утверждает, что его кунг-фу сильнее. И на первый взгляд это действительно так.</p>
<p>Все перечисленное меня больше интересует как способ описать контракт, а не проверить что-то во время работы программы.</p>
<p>6. Кстати, о контрактах. gem rubydbc позволяет добавлять в код пре- и постусловия:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Foo
   <span style="color:#9966CC; font-weight:bold;">include</span> DesignByContract
&#160;
   pre<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:sqrt</span>, <span style="color:#996600;">&#34;value must be &#62;= 0&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#124;</span>v<span style="color:#006600; font-weight:bold;">&#124;</span> v <span style="color:#006600; font-weight:bold;">&#62;</span>= <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&#160;
   pre<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&#34;divisor must be != 0&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#124;</span>dividend, divisor<span style="color:#006600; font-weight:bold;">&#124;</span> divisor != <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
   post <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#124;</span>result, a, b<span style="color:#006600; font-weight:bold;">&#124;</span> a <span style="color:#006600; font-weight:bold;">-</span> b <span style="color:#006600; font-weight:bold;">*</span> result <span style="color:#006600; font-weight:bold;">&#60;</span> 1e<span style="color:#006600; font-weight:bold;">-</span>3 <span style="color:#006600; font-weight:bold;">&#125;</span>
   <span style="color:#9966CC; font-weight:bold;">def</span> div<span style="color:#006600; font-weight:bold;">&#40;</span>dividend, divisor<span style="color:#006600; font-weight:bold;">&#41;</span>
      dividend <span style="color:#006600; font-weight:bold;">/</span> divisor
   <span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
   <span style="color:#9966CC; font-weight:bold;">def</span> sqrt<span style="color:#006600; font-weight:bold;">&#40;</span>value<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span> value
   <span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
   post<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:sqrt</span>, <span style="color:#996600;">&#34;error is greater than expected&#34;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#124;</span>result, value<span style="color:#006600; font-weight:bold;">&#124;</span>
         result <span style="color:#006600; font-weight:bold;">*</span> result <span style="color:#006600; font-weight:bold;">-</span> value <span style="color:#006600; font-weight:bold;">&#60;</span> 1e<span style="color:#006600; font-weight:bold;">-</span>3
   <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>7. gem rspec&#160;&#8212; must have для тестов. А без тестов в Ruby никуда...</p>
]]></description>
			<content:encoded><![CDATA[<p>Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.</p>
<p>1. При попытке установить gem на Ubuntu может возникать сообщение об ошибке:</p>
<pre class="wp_syntax">
extconf.rb:8:in `require’: no such file to load — mkmf (LoadError)
from extconf.rb:8
ERROR: While executing gem … (RuntimeError)
ERROR: Failed to build gem native extension.
</pre>
<p>Это означает, что не установлен пакет ruby###-dev, где ###&nbsp;&mdash; версия Ruby (текущая стабильная&nbsp;&mdash; 1.8). можно установить его, а можно сразу ruby-full, который гарантирует полную установку последней стабильной версии.</p>
<p>2. Просмотреть документацию локально установленных gems можно с помощью gem_server. После его запуска документация доступна по адресу http://localhost:8808.</p>
<p>3. gem renum дает возможность определять перечислимые типы:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">enum <span style="color:#ff3333; font-weight:bold;">:Status</span>, <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span> NOT_STARTED IN_PROGRESS COMPLETE <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
enum <span style="color:#ff3333; font-weight:bold;">:Size</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&nbsp;
  Small<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Really really tiny&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  Medium<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Sort of in the middle&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  Large<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Quite big&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  attr_reader <span style="color:#ff3333; font-weight:bold;">:description</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> init description
    <span style="color:#0066ff; font-weight:bold;">@description</span> = description
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> MyNamespace
  enum <span style="color:#ff3333; font-weight:bold;">:FooValue</span>, <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#ff3333; font-weight:bold;">:Bar</span>, <span style="color:#ff3333; font-weight:bold;">:Baz</span>, <span style="color:#ff3333; font-weight:bold;">:Bat</span> <span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>4. gem interface дает возможность определять интерфейсы в стиле Java (как набор методов) и проверять, что класс заданные интерфейсы реализует (конечно, типы параметров не специфицируются):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;interface&quot;</span>
&nbsp;
   MyInterface = interface<span style="color:#006600; font-weight:bold;">&#123;</span>
      required_methods <span style="color:#ff3333; font-weight:bold;">:foo</span>, <span style="color:#ff3333; font-weight:bold;">:bar</span>, <span style="color:#ff3333; font-weight:bold;">:baz</span>
   <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
   <span style="color:#008000; font-style:italic;"># Raises an error until 'baz' is defined</span>
   <span style="color:#9966CC; font-weight:bold;">class</span> MyClass
      <span style="color:#9966CC; font-weight:bold;">def</span> foo
         <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;foo&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">def</span> bar
         <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;bar&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      implements MyInterface
   <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>5. Две попытки снабдить Ruby средствами строгой типизации (но не статической!):<br />
gem strongtyping:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">      <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'strongtyping'</span>
      <span style="color:#9966CC; font-weight:bold;">include</span> StrongTyping
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> foo<span style="color:#006600; font-weight:bold;">&#40;</span>a, b<span style="color:#006600; font-weight:bold;">&#41;</span>
         expect<span style="color:#006600; font-weight:bold;">&#40;</span>a, <span style="color:#CC0066; font-weight:bold;">String</span>, b, <span style="color:#CC00FF; font-weight:bold;">Numeric</span><span style="color:#006600; font-weight:bold;">&#41;</span>
         ...
      <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><a href="http://people.freebsd.org/~eivind/ruby/types/">types</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">typesig <span style="color:#CC0066; font-weight:bold;">String</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC0066; font-weight:bold;">Array</span>, <span style="color:#CC00FF; font-weight:bold;">Hash</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> example2<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">string</span>, array_or_hash<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#008000; font-style:italic;"># ... here, we know that string is a String, and array_or_hash</span>
  <span style="color:#008000; font-style:italic;"># is either an Array or a Hash (or a subclass thereof) ...</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Eivind Eklund, автор types, утверждает, что его кунг-фу сильнее. И на первый взгляд это действительно так.</p>
<p>Все перечисленное меня больше интересует как способ описать контракт, а не проверить что-то во время работы программы.</p>
<p>6. Кстати, о контрактах. gem rubydbc позволяет добавлять в код пре- и постусловия:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Foo
   <span style="color:#9966CC; font-weight:bold;">include</span> DesignByContract
&nbsp;
   pre<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:sqrt</span>, <span style="color:#996600;">&quot;value must be &gt;= 0&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>v<span style="color:#006600; font-weight:bold;">|</span> v <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
   pre<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;divisor must be != 0&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>dividend, divisor<span style="color:#006600; font-weight:bold;">|</span> divisor != <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
   post <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>result, a, b<span style="color:#006600; font-weight:bold;">|</span> a <span style="color:#006600; font-weight:bold;">-</span> b <span style="color:#006600; font-weight:bold;">*</span> result <span style="color:#006600; font-weight:bold;">&lt;</span> 1e<span style="color:#006600; font-weight:bold;">-</span>3 <span style="color:#006600; font-weight:bold;">&#125;</span>
   <span style="color:#9966CC; font-weight:bold;">def</span> div<span style="color:#006600; font-weight:bold;">&#40;</span>dividend, divisor<span style="color:#006600; font-weight:bold;">&#41;</span>
      dividend <span style="color:#006600; font-weight:bold;">/</span> divisor
   <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
   <span style="color:#9966CC; font-weight:bold;">def</span> sqrt<span style="color:#006600; font-weight:bold;">&#40;</span>value<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span> value
   <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
   post<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:sqrt</span>, <span style="color:#996600;">&quot;error is greater than expected&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>result, value<span style="color:#006600; font-weight:bold;">|</span>
         result <span style="color:#006600; font-weight:bold;">*</span> result <span style="color:#006600; font-weight:bold;">-</span> value <span style="color:#006600; font-weight:bold;">&lt;</span> 1e<span style="color:#006600; font-weight:bold;">-</span>3
   <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>7. gem rspec&nbsp;&mdash; must have для тестов. А без тестов в Ruby никуда...</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=131&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2008/03/25/ruby-goods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Первый взгляд на Ruby</title>
		<link>http://www.all-x.net/2008/01/13/ruby-1stlook/</link>
		<comments>http://www.all-x.net/2008/01/13/ruby-1stlook/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 23:40:47 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2008/01/13/ruby-1stlook/</guid>
		<description><![CDATA[<p>Новогодние каникулы оказались подходящим случаем для общего знакомства с <a href="http://www.ruby-lang.org">Ruby</a>. Особой склонности к языкам с динамической типизацией я не испытываю&#160;&#8212; применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.</p>
<p>Ruby&#160;&#8212; интерпретируемый язык (это не значит, что для него нельзя разработать компилятор. Но думать о Ruby проще как об интерпретируемом языке). Это накладывает отпечаток на схему организации и выполнения Ruby-программ. В этом смысле они ближе к shell-скриптам, чем к программам на &#171;серьезных&#187; языка типа C/C++/Java&#160;&#8212; Ruby интерпретатору подается программа (из файла или из стандартного входа), которая немедленно исполняется. Нет никаких деклараций, которые предварительно как-то обрабатываются (компилируются), а затем используются при выполнении программы&#160;&#8212; что вижу, о том и пою.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">%</span> ruby
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&#34;Hello, world!&#34;</span>
^D
Hello, world!</pre></div></div>

<p>Это не значит, что деклараций нет вообще. Ruby&#160;&#8212; объектно-ориентированный язык, естественно, он позволяет определять классы. Но правильнее думать о классах как о немедленных указаниях интерпретатору выполнить определенные действия&#160;&#8212; зарегистрировать класс с заданным именем. Так же дела обстоят и с определением методов&#160;&#8212; это указание зарегистрировать в текущем классе метод с заданным именем.</p>
<p>Я хочу сказать, что у Ruby довольно простая вычислительная модель. Наверное, при использовании ограниченного подмножества возможностей языка можно и не задумываться о ней. И согласиться с многочисленными отзывами о Ruby как о простом для изучения и использования языке. Но в тонкостях языка без понимания внутреннего устройства разобраться не получается.</p>
<p>В свое время мне довелось оптимизировать ассемблерный код, сгенерированный компилятором языка С (кажется, DECUS С на СМ-4, то есть PDP-11). C тех пор код на С и частично на С++ я автоматически перевожу на ассемблер. Это сильно помогает понять, что же будет происходить во всяких нетривиальных ситуациях. Вот и с Ruby наблюдается похожая ситуация. Обязательно разберитесь с вычислительной моделью!</p>
<p>Ruby&#160;&#8212; объектно-ориентированный (ОО) язык. К сожалению, одной этой фразы мало&#160;&#8212; под крышей ОО собрались весьма непохожие друг на друга языки. Так что будем разбираться дальше. Одно можно сказать наверняка&#160;&#8212; в соответствии с классическим определением ОО в Ruby есть объекты. Этим объектам можно посылать сообщения. Ссылку на объект можно сохранить в переменной. Посылка сообщения соответствует вызову метода. Ну вот, уже что-то общее с широко используемыми языками.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Klass
  <span style="color:#9966CC; font-weight:bold;">def</span> hello<span style="color:#006600; font-weight:bold;">&#40;</span> addressee <span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#996600;">&#34;Hello, &#34;</span> <span style="color:#006600; font-weight:bold;">+</span> addressee <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&#34;!&#34;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&#160;
k = Klass.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> k.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#ff3333; font-weight:bold;">:hello</span>, <span style="color:#996600;">&#34;world&#34;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># Послать сообщение :hello</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> k.<span style="color:#9900CC;">hello</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&#34;world&#34;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>        <span style="color:#008000; font-style:italic;"># то же самое, что вызвать метод hello</span></pre></div></div>

<p>Хорошие новости&#160;&#8212; сообщения могут иметь параметры и возвращать значение.</p>
<p>Литеральными значениями могут быть заданы числа, строки, массивы, хэши, диапазоны, символы и регулярные выражения. Всё это&#160;&#8212; полноценные объекты. Никаких примитивных типов, как в Java, всё по-честному.</p>
<p>Числа имеют произвольную длину. Если не помещаются в машинное слово&#160;&#8212; автоматически используется реализация длинной арифметики. А чтобы проще было писать длинные литералы, разрешается использовать подчеркивания, интерпретатор их игнорирует. Для чисел с плавающей точкой используется машинный double.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">PI_INTEGER = <span style="color:#006666;">3</span>_141_592_653_589_793_238_462_643_383_279_502_884</pre></div></div>

<p>В строках самая примечательная возможность&#160;&#8212; подстановка значения выражения, которое находится внутри <code>#{...}</code>. Как мне не хватало этого в Java! </p>
<p>Если не хотите думать об экранировании спецсиволов&#160;&#8212; используйте одинарные кавычки.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">addressee = <span style="color:#996600;">&#34;world&#34;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&#34;Hello, #{addressee}!&#34;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># напечатает Hello, world!</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">'Hello, #{addressee}!'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># Напечатает Hello, #{addressee}!</span></pre></div></div>

<p>Символы&#160;&#8212; это объекты, представляющие имена, используемые в программе. Отличаются от имен двоеточием в начале. В примере с посылкой сообщения, которое соответствует методу hello, был использован символ :hello. В Java пришлось бы использовать текстовую строку, что чревато описками. </p>
<ol>
<li>Для использования символа имя не обязательно должно быть определено.</li>
<li>C/Java символы в одинарных кавычках&#160;&#8212; это совсем не то, не путать.</li>
</ol>
<p>Про массивы, хэши, диапазоны и регулярные выражения скажу потом, когда понадобятся в примерах. Ничего концептуально нового там, вроде, нет.</p>
<p>Далее план такой (может и поменяться):</p>
<ol>
<li>Классы и модули</li>
<li>Методы и блоки</li>
<li>Обработка неизвестных сообщений</li>
<li>Псевдо-DSL</li>
<li>Инструменты (будут подпункты)</li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>Новогодние каникулы оказались подходящим случаем для общего знакомства с <a href="http://www.ruby-lang.org">Ruby</a>. Особой склонности к языкам с динамической типизацией я не испытываю&nbsp;&mdash; применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.</p>
<p>Ruby&nbsp;&mdash; интерпретируемый язык (это не значит, что для него нельзя разработать компилятор. Но думать о Ruby проще как об интерпретируемом языке). Это накладывает отпечаток на схему организации и выполнения Ruby-программ. В этом смысле они ближе к shell-скриптам, чем к программам на &laquo;серьезных&raquo; языка типа C/C++/Java&nbsp;&mdash; Ruby интерпретатору подается программа (из файла или из стандартного входа), которая немедленно исполняется. Нет никаких деклараций, которые предварительно как-то обрабатываются (компилируются), а затем используются при выполнении программы&nbsp;&mdash; что вижу, о том и пою.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">%</span> ruby
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Hello, world!&quot;</span>
^D
Hello, world!</pre></div></div>

<p>Это не значит, что деклараций нет вообще. Ruby&nbsp;&mdash; объектно-ориентированный язык, естественно, он позволяет определять классы. Но правильнее думать о классах как о немедленных указаниях интерпретатору выполнить определенные действия&nbsp;&mdash; зарегистрировать класс с заданным именем. Так же дела обстоят и с определением методов&nbsp;&mdash; это указание зарегистрировать в текущем классе метод с заданным именем.</p>
<p>Я хочу сказать, что у Ruby довольно простая вычислительная модель. Наверное, при использовании ограниченного подмножества возможностей языка можно и не задумываться о ней. И согласиться с многочисленными отзывами о Ruby как о простом для изучения и использования языке. Но в тонкостях языка без понимания внутреннего устройства разобраться не получается.</p>
<p>В свое время мне довелось оптимизировать ассемблерный код, сгенерированный компилятором языка С (кажется, DECUS С на СМ-4, то есть PDP-11). C тех пор код на С и частично на С++ я автоматически перевожу на ассемблер. Это сильно помогает понять, что же будет происходить во всяких нетривиальных ситуациях. Вот и с Ruby наблюдается похожая ситуация. Обязательно разберитесь с вычислительной моделью!</p>
<p>Ruby&nbsp;&mdash; объектно-ориентированный (ОО) язык. К сожалению, одной этой фразы мало&nbsp;&mdash; под крышей ОО собрались весьма непохожие друг на друга языки. Так что будем разбираться дальше. Одно можно сказать наверняка&nbsp;&mdash; в соответствии с классическим определением ОО в Ruby есть объекты. Этим объектам можно посылать сообщения. Ссылку на объект можно сохранить в переменной. Посылка сообщения соответствует вызову метода. Ну вот, уже что-то общее с широко используемыми языками.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Klass
  <span style="color:#9966CC; font-weight:bold;">def</span> hello<span style="color:#006600; font-weight:bold;">&#40;</span> addressee <span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#996600;">&quot;Hello, &quot;</span> <span style="color:#006600; font-weight:bold;">+</span> addressee <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&quot;!&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
k = Klass.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> k.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#ff3333; font-weight:bold;">:hello</span>, <span style="color:#996600;">&quot;world&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># Послать сообщение :hello</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> k.<span style="color:#9900CC;">hello</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;world&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>        <span style="color:#008000; font-style:italic;"># то же самое, что вызвать метод hello</span></pre></div></div>

<p>Хорошие новости&nbsp;&mdash; сообщения могут иметь параметры и возвращать значение.</p>
<p>Литеральными значениями могут быть заданы числа, строки, массивы, хэши, диапазоны, символы и регулярные выражения. Всё это&nbsp;&mdash; полноценные объекты. Никаких примитивных типов, как в Java, всё по-честному.</p>
<p>Числа имеют произвольную длину. Если не помещаются в машинное слово&nbsp;&mdash; автоматически используется реализация длинной арифметики. А чтобы проще было писать длинные литералы, разрешается использовать подчеркивания, интерпретатор их игнорирует. Для чисел с плавающей точкой используется машинный double.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">PI_INTEGER = <span style="color:#006666;">3</span>_141_592_653_589_793_238_462_643_383_279_502_884</pre></div></div>

<p>В строках самая примечательная возможность&nbsp;&mdash; подстановка значения выражения, которое находится внутри <code>#{...}</code>. Как мне не хватало этого в Java! </p>
<p>Если не хотите думать об экранировании спецсиволов&nbsp;&mdash; используйте одинарные кавычки.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">addressee = <span style="color:#996600;">&quot;world&quot;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;Hello, #{addressee}!&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># напечатает Hello, world!</span>
<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">'Hello, #{addressee}!'</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># Напечатает Hello, #{addressee}!</span></pre></div></div>

<p>Символы&nbsp;&mdash; это объекты, представляющие имена, используемые в программе. Отличаются от имен двоеточием в начале. В примере с посылкой сообщения, которое соответствует методу hello, был использован символ :hello. В Java пришлось бы использовать текстовую строку, что чревато описками. </p>
<ol>
<li>Для использования символа имя не обязательно должно быть определено.</li>
<li>C/Java символы в одинарных кавычках&nbsp;&mdash; это совсем не то, не путать.</li>
</ol>
<p>Про массивы, хэши, диапазоны и регулярные выражения скажу потом, когда понадобятся в примерах. Ничего концептуально нового там, вроде, нет.</p>
<p>Далее план такой (может и поменяться):</p>
<ol>
<li>Классы и модули</li>
<li>Методы и блоки</li>
<li>Обработка неизвестных сообщений</li>
<li>Псевдо-DSL</li>
<li>Инструменты (будут подпункты)</li>
</ol>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=113&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2008/01/13/ruby-1stlook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TreeDL&#160;&#8212; язык описания структуры деревьев</title>
		<link>http://www.all-x.net/2007/07/29/treedl/</link>
		<comments>http://www.all-x.net/2007/07/29/treedl/#comments</comments>
		<pubDate>Sun, 29 Jul 2007 17:40:26 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[TreeDL]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/07/29/treedl/</guid>
		<description><![CDATA[<p><a href='http://treedl.org' title='TreeDL'><img src='http://www.all-x.net/wp-content/uploads/2007/07/treedl.png' align='left' hspace='10' alt='treedl.png' /></a><br />
Эпиграф: не потому, что других идей нет, а потому, что эта&#160;&#8212; любимая. &#169; забыл чей</p>
<p>На прошлой неделе выпустил новую версию <a href="http://treedl.org">TreeDL</a> 2.3.2. Предыдущую версию за 16 месяцев скачали ну от силы 250 раз. За два дня после выхода этой по <a href="http://sourceforge.net/project/stats/?group_id=120633&#038;ugn=treedl&#038;type=&#038;mode=60day">статистике SourceForge</a> было скачано 120 файлов, причем новую версию скачали меньше 20 раз. Проект выскочил в Top500.<br />
При этом сообщений о выходе новой версии нигде не было. Анонс в список рассылки я отправил уже после этого ажиотажа, да и подписчиков там 4 человека всего. На вебе никаких новых ссылок на проект, вроде, не появилось. Интересно, откуда взялась такая активность? Есть предположение, что это какой-то робот ходит, но я о таких не слышал.</p>
<p>TreeDL&#160;&#8212; это мой проект, который появился для облегчения работы над основными проектами по разработке трансляторов.</p>
<p>Трансляторы и компиляторы&#160;&#8212; это программы, которые с одной стороны имеют довольно большой размер (чем сложнее входной язык, тем больше размер его анализатора и кодогенератора), а с другой стороны обладают достаточно регулярной структурой (все конструкции языка обрабатываются схожим образом). Эта регулярность дает возможность атоматизировать разработку. Самый известный пример&#160;&#8212; генераторы лексических и синтаксических анализаторов, начиная с классических lex/yacc.<br />
Помимо анализатора транслятор включает генератор кода (если это код на машинном языке, то транслятор называют компилятором). Если обработка языка сравнительно простая, то генерация кода происходит одновременно с разбором входной программы, такие трансляторы называют однопроходными. В более сложных случаях результатом анализа является внутреннее представление входной программы, чаще всего в виде дерева. Генератор кода обходит это дерево и создает результирующий код.<br />
Оказалось, что структуру дерева внутреннего представления неудобно описывать на языке программирования общего назначения (например, Java). Пришлось придумать небольшой специализированный язык (<a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">DSL</a>&#160;&#8212; domain-specific language) <strong>TreeDL</strong>, который дает возможность создавать компактное описание в виде набора структур с одиночным наследованием (классов с полями, но без методов). По этому описанию генерируется код на основном языке программирования. Дополнительно значительный выигрыш дает генерация всяких вспомогательных компонентов, связанных с деревом&#160;&#8212; обходчиков, фабрик, реализация интерфейсов для совместного использования с другими компонентами (например, TemplateModel для <a href="http://freemarker.org">FreeMarker</a>). Генерация кода дополнительных компонентов осуществляется подключением плагинов к транслятору TreeDL.<br />
TreeDL v2 активно используется в проектах <a href="http://www.unitesk.ru">UniTESK</a> и показал себя достаточно стабильным. При подготовке диссертации (<a href="http://www.ispras.ru/ru/news/phd3.html" class="broken_link" >защитился</a> в конце 2006 года) появились новые идеи, которые не вписываются в рамки нынешней реализации. Взялся-таки за разработку TreeDL v3, но времени мало, когда что-то созреет&#160;&#8212; непонятно. А совсем бросать&#160;&#8212; тоже жалко.</p>
]]></description>
			<content:encoded><![CDATA[<p><a href='http://treedl.org' title='TreeDL'><img src='http://www.all-x.net/wp-content/uploads/2007/07/treedl.png' align='left' hspace='10' alt='treedl.png' /></a><br />
Эпиграф: не потому, что других идей нет, а потому, что эта&nbsp;&mdash; любимая. &copy; забыл чей</p>
<p>На прошлой неделе выпустил новую версию <a href="http://treedl.org">TreeDL</a> 2.3.2. Предыдущую версию за 16 месяцев скачали ну от силы 250 раз. За два дня после выхода этой по <a href="http://sourceforge.net/project/stats/?group_id=120633&#038;ugn=treedl&#038;type=&#038;mode=60day">статистике SourceForge</a> было скачано 120 файлов, причем новую версию скачали меньше 20 раз. Проект выскочил в Top500.<br />
При этом сообщений о выходе новой версии нигде не было. Анонс в список рассылки я отправил уже после этого ажиотажа, да и подписчиков там 4 человека всего. На вебе никаких новых ссылок на проект, вроде, не появилось. Интересно, откуда взялась такая активность? Есть предположение, что это какой-то робот ходит, но я о таких не слышал.</p>
<p>TreeDL&nbsp;&mdash; это мой проект, который появился для облегчения работы над основными проектами по разработке трансляторов.</p>
<p>Трансляторы и компиляторы&nbsp;&mdash; это программы, которые с одной стороны имеют довольно большой размер (чем сложнее входной язык, тем больше размер его анализатора и кодогенератора), а с другой стороны обладают достаточно регулярной структурой (все конструкции языка обрабатываются схожим образом). Эта регулярность дает возможность атоматизировать разработку. Самый известный пример&nbsp;&mdash; генераторы лексических и синтаксических анализаторов, начиная с классических lex/yacc.<br />
Помимо анализатора транслятор включает генератор кода (если это код на машинном языке, то транслятор называют компилятором). Если обработка языка сравнительно простая, то генерация кода происходит одновременно с разбором входной программы, такие трансляторы называют однопроходными. В более сложных случаях результатом анализа является внутреннее представление входной программы, чаще всего в виде дерева. Генератор кода обходит это дерево и создает результирующий код.<br />
Оказалось, что структуру дерева внутреннего представления неудобно описывать на языке программирования общего назначения (например, Java). Пришлось придумать небольшой специализированный язык (<a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">DSL</a>&nbsp;&mdash; domain-specific language) <strong>TreeDL</strong>, который дает возможность создавать компактное описание в виде набора структур с одиночным наследованием (классов с полями, но без методов). По этому описанию генерируется код на основном языке программирования. Дополнительно значительный выигрыш дает генерация всяких вспомогательных компонентов, связанных с деревом&nbsp;&mdash; обходчиков, фабрик, реализация интерфейсов для совместного использования с другими компонентами (например, TemplateModel для <a href="http://freemarker.org">FreeMarker</a>). Генерация кода дополнительных компонентов осуществляется подключением плагинов к транслятору TreeDL.<br />
TreeDL v2 активно используется в проектах <a href="http://www.unitesk.ru">UniTESK</a> и показал себя достаточно стабильным. При подготовке диссертации (<a href="http://www.ispras.ru/ru/news/phd3.html" class="broken_link" >защитился</a> в конце 2006 года) появились новые идеи, которые не вписываются в рамки нынешней реализации. Взялся-таки за разработку TreeDL v3, но времени мало, когда что-то созреет&nbsp;&mdash; непонятно. А совсем бросать&nbsp;&mdash; тоже жалко.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=59&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/07/29/treedl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Маленькая задачка для C программистов</title>
		<link>http://www.all-x.net/2007/07/25/printf-fork/</link>
		<comments>http://www.all-x.net/2007/07/25/printf-fork/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 07:40:40 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/07/25/printf-fork/</guid>
		<description><![CDATA[<p>Мой коллега Александр Сортов поделился маленькой задачкой для C программистов:<br />
Попробуйте без компьютера сообразить, сколько слов &#171;before&#187; и &#171;after&#187; будет напечатано после выполнения этого кода?</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &#60;stdio.h&#62;</span>
&#160;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> pid<span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&#34;before&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  pid <span style="color: #339933;">=</span> fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&#34;<span style="color: #000099; font-weight: bold;">\n</span>after&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pid <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    _exit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&#34;<span style="color: #000099; font-weight: bold;">\n</span>&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>На первый взгляд, печатается &#171;before&#187;, далее из одного процесса получаются два, оба они печатают &#171;after&#187;. Всё не так просто&#160;&#8212; &#171;before&#187; может остаться в буфере и напечататься в обоих процессах. И наоборот, один из &#171;after&#187; так и останется в буфере, когда процесс завершится вызовом _exit ().<br />
Так что возможен и строго обратный результат&#160;&#8212; два &#171;before&#187; и один &#171;after&#187; <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Я попался на первоначальную версию, ответив 1 и 4:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &#60;stdio.h&#62;</span>
&#160;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&#34;<span style="color: #000099; font-weight: bold;">\n</span>before&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&#34;<span style="color: #000099; font-weight: bold;">\n</span>after&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></description>
			<content:encoded><![CDATA[<p>Мой коллега Александр Сортов поделился маленькой задачкой для C программистов:<br />
Попробуйте без компьютера сообразить, сколько слов &laquo;before&raquo; и &laquo;after&raquo; будет напечатано после выполнения этого кода?</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> pid<span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;before&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  pid <span style="color: #339933;">=</span> fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>after&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pid <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    _exit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>На первый взгляд, печатается &laquo;before&raquo;, далее из одного процесса получаются два, оба они печатают &laquo;after&raquo;. Всё не так просто&nbsp;&mdash; &laquo;before&raquo; может остаться в буфере и напечататься в обоих процессах. И наоборот, один из &laquo;after&raquo; так и останется в буфере, когда процесс завершится вызовом _exit ().<br />
Так что возможен и строго обратный результат&nbsp;&mdash; два &laquo;before&raquo; и один &laquo;after&raquo; <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Я попался на первоначальную версию, ответив 1 и 4:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>before&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>after&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=57&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/07/25/printf-fork/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ppm не работает на x64</title>
		<link>http://www.all-x.net/2007/06/21/ppm-x64/</link>
		<comments>http://www.all-x.net/2007/06/21/ppm-x64/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 10:18:57 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/06/21/ppm-x64/</guid>
		<description><![CDATA[<p>Теперь я знаю, что неработоспособность ppm в perl-MSWin32-x64&#160;&#8212; это не баг, а фича:</p>
<p>http://community.activestate.com/forum-topic/ppm4-mswin32-x64-404-erro</p>
]]></description>
			<content:encoded><![CDATA[<p>Теперь я знаю, что неработоспособность ppm в perl-MSWin32-x64&nbsp;&mdash; это не баг, а фича:</p>
<p>http://community.activestate.com/forum-topic/ppm4-mswin32-x64-404-erro</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=43&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/06/21/ppm-x64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Картинки внутри php файлов</title>
		<link>http://www.all-x.net/2007/06/14/kartinki-vnutri-php-faylov/</link>
		<comments>http://www.all-x.net/2007/06/14/kartinki-vnutri-php-faylov/#comments</comments>
		<pubDate>Thu, 14 Jun 2007 10:03:38 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.all-x.net/2007/06/14/kartinki-vnutri-php-faylov/</guid>
		<description><![CDATA[<p>В WordPress плагине <a href="http://meidell.dk/archives/2004/09/04/nested-comments/">Brian&#39;s Threaded Comments</a> используются не очень красивые значки &#39;-&#39; и &#39;+&#39; для свернутых и развернутых веток.</p>
<p>При попытке их поменять обнаружилось, что картинки хранятся непосредственно внутри файла BriansThreadedComments.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$images</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spacer.png'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&#34;iVBORw0KGgo...&#34;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&#34;content-type: image/png&#34;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #990000;">base64_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$images</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>То есть, для замены картинки её необходимо преобразовать в base64.</p>
<p>Если это разовое действие, то проще всего не устанавливать никаких программ, а воспользоваться web-сервисом, например, <a href="http://www.opinionatedgeek.com/dotnet/tools/Base64Encode/Default.aspx">base64encode</a>. На этом же сайте можно сделать и обратное преобразование&#160;&#8212; <a href="http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/Default.aspx">base64decode</a>.</p>
<p>Замечу, что в данном случае размер картинки должен быть 13*13 точек, при меньшем размере будет виден &#171;кусочек паркета&#187;.</p>
]]></description>
			<content:encoded><![CDATA[<p>В WordPress плагине <a href="http://meidell.dk/archives/2004/09/04/nested-comments/">Brian&#39;s Threaded Comments</a> используются не очень красивые значки &#39;-&#39; и &#39;+&#39; для свернутых и развернутых веток.</p>
<p>При попытке их поменять обнаружилось, что картинки хранятся непосредственно внутри файла BriansThreadedComments.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$images</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spacer.png'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;iVBORw0KGgo...&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;content-type: image/png&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #990000;">base64_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$images</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>То есть, для замены картинки её необходимо преобразовать в base64.</p>
<p>Если это разовое действие, то проще всего не устанавливать никаких программ, а воспользоваться web-сервисом, например, <a href="http://www.opinionatedgeek.com/dotnet/tools/Base64Encode/Default.aspx">base64encode</a>. На этом же сайте можно сделать и обратное преобразование&nbsp;&mdash; <a href="http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/Default.aspx">base64decode</a>.</p>
<p>Замечу, что в данном случае размер картинки должен быть 13*13 точек, при меньшем размере будет виден &laquo;кусочек паркета&raquo;.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=33&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2007/06/14/kartinki-vnutri-php-faylov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

