вторник, 21 октября 2014 г.

Сравнительное обозрение языков программирования

Этот текст объединяет ранее уже публиковавшиеся наброски о сравнении исходных кодов эквивалентных приложений, но выполненных на разных языках программирования — занятие и интересное, и познавательное, и поучительное.
Это не есть прямое механическое объединение текстов, показанных ранее. Достаточно много дополнено, изменено, или уточнено. На сегодня в это сравнительное обозрение уже включено 15 языков программирования (или больше?).
Как и раньше, объём слишком большой, чтобы его выкладывать непосредственно в блог. Выкладываю только ссылки, где вы можете всё это свободно взять. По мере развития файлы смогут освежаться по редакции, а ссылки будут в корректном состоянии.
Был бы крайне признателен за замечания и предложения.

Номер последней редакции: 31
Объём (страниц): 63
Размер файла текста: 325687
Размер архива кодов: 341989 
Дата создания: 21 октября 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 

Как и всё опубликованное ранее, этот текст и все сопутствующие ему материалы представляется под лицензией, которая явно обозначена и в титуле - это: Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) :  

... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

На обиходном языке я понимаю эту лицензию так: вы можете делать с этими материалами всё что угодно ... если сами не станете жлобиться.
 

среда, 24 сентября 2014 г.

Параллелизм, конкурентность, многопроцессорность в Linux

Давно копившиеся заметки: "Параллелизм, конкурентность, многопроцессорность в Linux". Потому что параллелизм - это далеко не конкурентность, а с массовым распространением многопроцессорности всё становится куда запутаннее и веселее...

Вот такие вот, пока, наброски ... правда набросков уже накопилось на сотню страниц:

Номер последней редакции: 05
Объём (страниц): 97
Размер файла текста: 
185153 
Размер архива кодов: 
314749
Дата размещения: 23 сентябра 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 


В архиве примеры кода - как это делается на разных языках программирования: C, Python, Go ... временами C++. И то, как на N процессорных ядрах попытаться ускорить выполнение в N раз ... и что из этого получается.

В примерах кода там есть весьма неожиданные, временами, результаты.
Которые любопытно было бы обсудить...

суббота, 16 августа 2014 г.

Go конспект

Выкладываю для любителей черновик рукописи "Go конспект". Это не учебник по языку Go (хотя его можно использовать как справочник) и уж совсем не учебник по тому, как нужно писать программы - на то есть множество книг и публикаций.

Это сжатые заметки для программистов на языках C и C++ о том, как им быстро пересесть на язык Go, если в том возникнет необходимость. А возникнуть она может совершенно реально, потому как только за последний месяц (июль 2014) ко мне обратились целых 3 (!) крупных софтверных компании из аутосорсинга (т.е. тех, кто не выбирает проекты, а которым их предлагают) с предложениями-обсуждениями того, как быстро обучить их программистов языку Go. В поисках (моих) ответа на эти вопросы и появился этот конспект.

Почему Go? Потому что по моим наблюдениям (конечно очень субъективным) за рынком предложений, на сегодня есть 2 языка программирования, которые срочно должны осваивать молодые начинающие программисты, чтобы с успехом войти в индустрию разработки программного обеспечения, это - Pyton и Go. Но по Python уже существует достаточно много и литературы, и публикаций, и документации. По Go всего этого нет.

На момент написания - это отчётливый черновик. К тексту, естественно, прилагается достаточно обстоятельный архив примеров кода. И текст и архив будут серьёзно дополняться и правиться. Но это всё не так быстро, особенно относительно архива, потому что все примеры кода нужно придумать, написать, оттестировать и выверить ... или где-то найти. Все очередные редакции будут здесь обновляться. Если кого-то заинтересует эта затея - присоединяйтесь. Потому как на русском языке внятной информации по Go мизерно мало.

В тексте описывается от начала загрузки и инсталляции разных вариантов инструментов Go, и до практических примеров его использования. Пока это всё делается только для Linux реализации, хотя Go есть  многоплатформенный инструмент, под разные операционные системы. Возможно, если я на какой-то период преодолею идеосинкразию, я расширю это описание и на операционную систему Windows ... 7, скажем, или 8.

Номер последней редакции: 1.42
Объём (страниц): 124
Размер файла текста: 601866
Размер архива кодов: 120492 
Дата редактирования: 17 апреля 2017

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

Этот текст и все сопутствующие ему материалы представляется под лицензией, которая явно обозначена в тексте: Creative Commons Attribution-ShareAlike 3.0 (полный текст можете почитать здесь Creative Commons Attribution - ShareAlike 3.0 Unported) :
... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

На обиходном языке я понимаю эту лицензию так: вы можете делать с этими материалами всё что угодно ... если сами не станете жлобиться.

вторник, 17 июня 2014 г.

Сетевое программирование в Linux


Представляется новая рукопись на тему "Сетевое программирование в Linux". Первоначальный вариант этого текста (и сопровождающий его архив примеров кода) подготовлен как сжатый конспект курса лекций ("экспресс курс") по сетевому программированию, который мне предложили прочитать для программистов-разработчиков одной из крупных международных софтверных компаний.

Здесь же будут редактироваться ссылки на последнюю актуальную редакцию текста и архива, с указанием номера редакции. Желающие смогут обновлять свой экземпляр по мере обновления материала. Архив примеров кодов будет, естественно, пополняется и растёт вместе с отработкой текста.

В тексте 3 больших, очень разнородных, раздела:
1. О сети вообще (архитектура; стек протоколов Linux; сеть IP: адресация, маршрутизация; инструменты диагностики и управления).
2. Программирование сокетов (приложений пространства пользователя).
3. Программирование драйверов (модулей ядра) сетевых интерфейсов и протоколов.

Совместное рассмотрение сетевой архитектуры в ядре Linux и в слое прикладных программ позволяет совершенно по-новому, цельно взглянуть на архитектуру сетевых приложений, и делает совершенно прозрачным весь тракт прохождения информации сквозь сеть.

Номер последней редакции: 23
Объём (страниц): 102
Размер файла текста: 765978  
Размер архива кодов: 473598
Дата размещения: 27 июля 2014
На редакции 22 завершилось чтение экспресс-курса, поэтому все последующие редакции - это достаточно чистовой материал, с мелкими последующими подчистками и дополнениями.

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

Этот текст и все сопутствующие ему материалы представляется под лицензией, которая явно обозначена в тексте: Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) :  

... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

понедельник, 12 мая 2014 г.

Разработка программных проектов в Linux (цикл обновлений)



"Инструменты Linux" (этот же текст известен в некоторых публикациях в Интернет как "Инструменты в Linux для программистов из Windows") - это рукопись, которая в последней своей редакции была показано здесь в блоге достаточно давно: 25 ноября 2012г. Тогда это была редакция 2.70, от 28.10.2012г., объёмом в 170 страниц. За прошедшее время были сделаны существенные дополнения текста. Но, кроме того, в настоящее время начат активный цикл внесения правок, изменений, серьёзных дополнений. Это связано с тем, что крупная международная софтверная компания обратилась с желанием провести обучение работников их русскоязычных филиалов по этому предмету. Такой тренинговый курс займёт 3-4 месяца, а это значит, что всё это время текст (и код примеров, что ещё важнее) будет постоянно обновляться. 
Начиная с редакции 105 изменяется заголовок текста на "Разработка программных проектов в Linux", потому как, по пожеланиям читателей, рукопись дополнена целыми разделами и главами с подробными описаниями инструментов и технологий, используемых в работе над программными проектами.

Поскольку изменения вносятся активно и часто, то вместо того, чтобы размещать ссылки на каждую очередную редакцию текста (и архива кодов), на этой странице будут редактироваться ссылки на последнюю актуальную редакцию текста и архива, с указанием номера редакции этой правки и числа страниц текста (для ориентации). Желающие смогут обновлять свой экземпляр по мере обновления материала.

Номер последней редакции: 114
Объём (страниц): 307
Размер файла текста: 2493316 
Размер архива кодов: 2623890
Дата размещения: 09 августа 2014 

© 2011 — 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

В редакциях начиная с 79 в тексте явно обозначена лицензия, под которой распространяется данный текст и все сопутствующие  ему материалы Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) :  

... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

вторник, 8 апреля 2014 г.

Драйверы и модули ядра Linux (цикл обновлений)

Последнее обновление "Программирование модулей ядра Linux" было показано здесь в блоге 1 ноября 2013 года, редакция 173 (380 страниц).
Весной-летом был проведен активный цикл внесения правок, изменений, серьёзных дополнений, и ревизии относительно последних версий ядра Linux. Это было сделано в связи с прочтением большого, 48 часового курса лекций по этому материалу для программистов-разработчиков международной софтверной компании Global Logic и преподавателей и аспирантов ведущих киевских университетов. Все вопросы, обсуждения, замечания, пожелания, возникающие в процессе, отражались в тексте, а коды примеров выверялись и корректировались под последние версии ядра Linux (3.13, 3.14, 3.15). 

Итогом стала последняя свежая редакция, которая, как легко видеть, "выросла" с 380 страниц до 422. Желающие смогут свободно обновить свой экземпляр.


Номер последней редакции: 222
Объём (страниц): 422
Размер файла текста: 1318467 
Размер архива кодов:  858802  
Дата размещения: 10 июля 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Google: текст и архив 

В редакциях начиная с 181 в тексте явно выписана лицензия, под которой распространяется данный текст и все сопутствующие  ему материалы Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) :  

... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

четверг, 13 марта 2014 г.

Ещё несколько экзотических ЯП


Недавно (от 10 февраля, здесь же в блоге) я помещал сравнение ("Сопоставление: 10 языков программирования"): реализации одной и той же задачи, но на разных языках программирования. Чтобы на них можно было взглянуть сравнительно.

Теперь предлагается, в некотором смысле, продолжение темы: та же задача, реализованная ещё на нескольких языках, реже упоминаемых. Я назвал их "экзотическими", но это никакое преуменьшение их достоинств, а просто констатация того факта, что в практических публичных проектах они применяются не так широко. И на то бывают разные основания:
- какой-то из языков ещё слишком нов (Go);
- какой-то используется в отдельных областях (Lisp, Scheme);
- какой-то - в академической среде, образовании и научных исследованиях (Haskell);
Основания бывают разные...

Для этих языков понадобились более подробные описания, в отличие от 10-ти более традиционных, потому что для этих, новых, они не установлены в системе, и начинать нужно с того, что их инсталлировать. В меру возможностей описано: где и что взять, как установить, как создать работающую среду ... ну, и как прогнать предлагаемый пример. Всё работает. Кому будет интересно - эти приложения можно использовать в качестве стартового приложения для написания своих собственных проектов.


На сегодня в сравнение вошли следующие языки:

  • Go
  • Scheme
  • Scala
  • Ocaml
  • Haskell

P.S. Пока это всё... Не исключено, что я этот обзор расширю, включив новые языки ... но это всё зависит от многих обстоятельств: время, здоровье, вдохновение... Не станем загадывать.


Я не копирую текст сюда, прямо в блог, для прочтения, потому как объём его уже на сегодня 29 страниц OpenOffice - многовато будет для онлайн чтения...

Вот файлы на Yandex: архив и текст.
А вот это - то же, но лежащее на Google-диск: архив и текст.

пятница, 21 февраля 2014 г.

Языки программирования: скорость

В параллельном тексте (предыдущее сообщение ... и ещё будет) делается  сопоставления внешнего вида идентичных кодов на разных языках программирования. Пользуясь случаем, любопытно бы сравнить и скорость выполнения полученных кодов.

Конечно, такое сравнение очень условно, оно зависит: от класса и конкретного вида решаемой задачи, реализации языкового инструмента (компилятора, интерпретатора), версии этой реализации, степени используемой оптимизации (для компиляции) и т.д. Но это и не есть сравнение скоростей, это есть сравнение порядков скоростей, которые могут отличаться, как увидим, на 2-3 порядка.

Для сравнений выбрана задача вычисления чисел Фибоначчи, которую часто используют в этом качестве - она позволяет регулировать вычислительную сложность задачи в очень широких пределах.

Полученные результаты описываются в тексте. Пока в сравнении охвачены языки:

  • C
  • C++ (GCC)
  • C++ (Clang, LLVM)
  • Java
  • Perl
  • Python
  • Ruby
  • JavaScript
  • PHP
  • Lua
  • bash
  • Go
  • Ocaml
  • PureBasic
  • Scheme
  • Haskell

Ну вот пока и всё...
Текст и архив примеров кодов можно взять здесь:

- на Google:
Это текст (в формате OpenOffice), и архив к нему. 

- на Yandex:
текст и архив

понедельник, 10 февраля 2014 г.

Сопоставление: 10 языков программирования



Сравнить исходные коды эквивалентных приложений, реализованных на различающихся языках программирования — занятие и интересное, и познавательное, и поучительное:

  • Начинающие программисты могут бегло взглянуть на имеющийся в их распоряжении арсенал средств и, в какой-то мере, утвердиться в том, в каком направлении им желательно развиваться.
  • Имея в руках работающие приложения выполненные в разных технологиях, можно, экспериментируя, рассмотреть принятые техники доведения программного кода до работающего приложения, которые в разных языках существенно различаются.
  • Практик-профессионал, рассматривая код на языке, далёком от сферы его интересов, сможет выделить там отдельные специфические приёмы, а затем и смоделировать их в своей привычной инструментальной среде (подобным образом в обиход программирования много привнесли LISP, APL или FORTH).
  • Специалист по обработке данных может позаимствовать отдельные идеи и структуры данных даже из совершенно экзотического для его целей языка.
  • Студенты смогут оценить цельность базовых принципов программирования, только оттеняемую контрастом разнообразия реализаций.
  • Соискатель работы перестанет теряться во множестве загадочных наименований, фигурирующих в требованиям к вакансиям, когда работодатель сам достаточно часто плохо понимает что ему нужно.

Вот такая сравнительная реализация одной и той же задачи показана в тексте. Сравниваются реализации на 10-ти языках программирования. На сегодня это:
  • C
  • C++
  • Java
  • Perl
  • Python
  • Ruby
  • JavaScript
  • PHP
  • Lua
  • bash
Возможно, позже я добавлю ещё что-то...
Текст достаточно большой (31 страница), а исходный код примеров ещё больше - чтобы размещать это здесь, в блоге. Поэтому даю только ссылки, по которым всё это можно взять:

на Google:
Это текст (в формате OpenOffice), и 
архив кода к нему. 

Мне Yandex кажется удобнее, потому как там текст OpenOffice можно сразу по месту открыть и посмотреть: то ли это что надо, и стоит ли его скачивать?

P.S. 13 марта 2014 г. на дисках были обновлены редакции текста и архивов. Ссылки изменены. Добавлять новую запись в блог не захотелось.
Изменения не радикальные, но всё же...


вторник, 4 февраля 2014 г.

Язык C: заметки на полях

По языку C написано множество руководства и учебных пособий. Ещё одной особенностью C является то, что первоначально исчерпывающие руководства по языку написаны его авторами (Б. Керниган, Д. Ритчи), выдержавшими 34 переиздания в США. Это очень способствовало краткости и однозначности толкований понятий языка, и простоте его освоения.

Есть ли смысл, при такой истории и таком объёме существующих описаний, снова обращаться к деталям языка C? Есть, и на то существует несколько оснований, исходящих из различных точек зрения:
  • За 40 лет язык претерпел несколько модернизаций, последние действующие стандарты (C89, C99) вносят ряд существенных нововведений (самый яркий пример чему — комплексная арифметика), не отображаемых в "классической" литературе по C, которая писалась, как правило, много лет назад.
  • Язык C изначально разрабатывался как язык системного программирования систем принадлежащих к классу UNIX. С широким распространением операционной системы Linux, основным "полигоном" использования C стали проекты GNU и другие свободные проекты для этой системы. Они все рассчитаны на использование компилятора GCC, который имеет ряд собственных расширений языка.
  • Поддержка символьных представлений UNICODE, и способ кодирования UTF-8 для них, которая стала единственной поддерживаемой по умолчанию всеми дистрибутивами Linux. Поддержка широких символов (описана в <wchar.h>) слабо освещена в литературе, потому, что для англоязычных авторов она не есть особенно актуальной, а русскоязычные авторы во многом обходят эту часть языка стороной.
  • Помимо компилятора GCC, в последние годы начинает широко практиковаться использование компилятора Clang (из проекта LLVM — Low Level Virtual Machine), ряд расширений GCC поддерживается Clang, другие — нет.
  • Есть вещи, которые не являются, собственно, частью самого языка, но есть традицией, сложившейся в практике использования этой языковой среды. Примером этого является, например, использование в ядре Linux циклических двунаправленных списков везде где нужны списочные структуры (вместо односвязных списков, линейных списков и др.), что и будет рассмотрено далее.
     
В любом случае, я даю ссылки на заметки, написанные мною для себя, по итогам практической работы с C протяжённостью в несколько десятилетий. Если кому-то это будет интересно и полезно - пользуйтесь!


- на Google:
Это текст (в формате OpenOffice), и архив примеров к нему.
- на Yandex:
текст и архив примеров

P.S. Варианты на Google и Yandex могут отличаться - они обновляются не синхронно, в разное время. Но эти отличия не могут быть существенными.


среда, 8 января 2014 г.

Python: примеры и тесты, итоги

Начатые здесь в блоге наброски "Python: примеры и тесты..." завершились публикацией нескольких частей изложения на сайте IBM DeveloperWorks. То, что начиналось здесь как наброски, было очень сильно переработано, расширено, проверено... Некоторые высказанные ранее утверждения были опровергнуты или исправлены.

Вместо того, чтобы копировать опубликованный текст с места на место, я просто дам ссылки на расположение статей:

Часть 1. Версии и совместимость
В этой части подробн6о рассмотрены причины несовместимостей кодов для Python 2 Python 3, и способы смягчить эту несовместимость. Важно для дальнейшего рассмотрения.

Часть 2. Типы данных
Это не совсем точное название, это не общее описание типов данных в Python. Описание типов данных обстоятельно дано в учебниках по Python, и занимает далеко не одну часть... Это описание специфики, привносимой динамической типизацией Python, и особенно интересно для программистов, выросших на "классических" языках со статической строгой типизацией, таких как C, C++, или Java.

Часть 3. Функциональное программирование
Это обсуждение того, как приёмы функционального программирования использовать в Python. С примерами того... А заодно, рассуждения о том, что Python не язык функционального программирования, как иногда утверждается впадая в крайности.

Часть 4. Параллельное исполнение
Здесь показываются классические способы создания параллельных ветвей в коде Python, средствами операционной системы: потоки и процессы, порождаемые вызовом fork().

Часть 5. Мульти-платформенные многопоточные приложения
В этой части показаны причины неудовлетворительности реализаций классическими способами, описанными в предыдущей части. Показываются решения, независимые от платформы (Linux, Windows, ...).

Часть 6. Способы интеграции Python и С/С++ приложений
Перечислены несколько альтернативных вариантов интеграции кода Python и C/C++, имплементации реализации C/C++ кода в Python проект. Здесь же показан первый и простейший из этих способов: ручная реализация интерфейса.

 Часть 7. Особенности взаимодействия с C++. Пакет distutils, библиотека Boost.Python, проект Cython
Ещё некоторые варианты имплементации кода C или C++ в проект Python.

Часть 8. Особенности взаимодействия с C++. Проект SWIG и обратная интеграция Python в С/C++ приложения
Последний из иллюстрируемых способов имплементации C/C++ кода в проект Python. Здесь же показана обратная задача: как встроить Python код в проект C/C++... а также обсуждено зачем такое делать.


Часть 9. Разработка GUI-приложений
Здесь перечислены некоторые инструменты для построения оконных приложений на Python. Рассмотрены, с простейшими примерами приложений, Tkinter, PyQt, PySide, PyGTK.

Часть 10. 2D Графика и GUI-сценарии
Здесь продолжается рассмотрение графических инструментов. Рассмотрены wxPython, PyGames и PyZrnity.