воскресенье, 24 июня 2007 г.

О сайте compilerjobs.com

же довольно давно я периодически захожу на сайт http://www.compilerjobs.com/. Там публикуются объявления о вакансиях по одной-единственной софтовой специализации - разработка компиляторов. На мой взгляд, простое чтение объявлений оттуда - хорошее лекарство от пессимизма по поводу невостребованности компиляторщиков и вообще падения интереса к этой тематике.


Скажем, сейчас на странице Hot Listings (свежие объявления) имеется 36 разделов, половина из которых представляют рекрутинговые агентства. В каждом таком разделе до полутора десятков объяв. Остальное - объявления от конкретных компаний, от никому не известных до таких монстров, как Microsoft, Intel, IBM и т.д. Компании зачастую тоже предлагают не одно, а несколько вакантных мест. А в "основном" разделе Compiler Job Listings - наверное раза в два больше; некоторые заявы не могут найти своего кандидата аж с 2003 года, а то и раньше...

Даже поверхностный анализ вакансий позволяет сделать несколько - пусть не таких уж неожиданных, но все равно полезных выводов, например:

- До половины вакансий связаны с адаптацией, как они это называют, GNU Toolchain. Это определенно самая популярная тема. Иными словами, требуется, скажем, написать генератор кода с GNUшного промежуточного представления для некоего нового (спец)процессора (возможно с оптимизацией, учитывающей особенности этого процессора), или просто добавить какие-то оптимизационные возможности в существующий генератор. Таких потребностей - генератор+оптимизатор на основе GCC - подавляющее большинство среди вакансий, что наглядно показывает реальную популярность и востребованность GCC.

Даже если в вакансии впрямую не говорится об адаптации, все равно в списке требований к кандидату упоминается "осведомленность в GCC internals" или что-то в этом роде.

- Далее: очень много объяв, приглашающих делать что-то, связанное с компиляцией для новых процессоров. Этот аспект частично пересекается с предыдущим, но его, по-моему, стоило бы выделить в отдельную позицию. То есть несмотря на (кажущееся) засилье интеловских чипов, очень много проектов требуют собственных архитектур, которые, как видно, плодятся повсеместно. Наиболее часто встречаются термины "потоковые процессоры", DSP-процессоры и даже game-процессоры.

- Еще одно наблюдение. Несмотря на явный крен в сторону back-end'ов, не редкость и объявления, касающиеся разработки парсеров (требуется знание yacc или чего-то в этом роде) или вообще создания компиляторов from scratch. Таких объяв немного, но они регулярно появляются и, кстати, часто довольно долго висят на сайте, не находя, видимо, интерсантов.

- Совсем нет объявлений, в которых требовались бы специалисты по анализу исходных текстов (статический/метрический анализ, поддержка UML, reverse engineering и подобное). Всем нужны именно компиляторы "в узком смысле": генерирующие код, подлежащий исполнению. Все. Практически сто процентов вакансий носят предельно конкретный, утилитарный характер: нужно сделать нечто, что работало бы. Research & development, кажется, отсутствует как явление.

И, наконец, крайне интересен географический аспект. Но сначала - нехитрое рассуждение, спорить с которым вряд ли кто станет. Компиляторы определенно принадлежат к той категории софта, который принято называть инновационным. В самом деле, в каких случаях возникает потребность в создании нового или адаптации сущнствующего компилятора? Либо есть некий новый процессор, на который нужно перенести существующие программы, либо кто-то придумал новый язык (или, что почти то же самое, новую технологию разработки), и этот язык нужно сделать инструментом, реализующим эту технологию, либо требуется существенно улучшить характеристики объектного кода (разработать/реализовать новые оптимизационные схемы), чтобы, скажем, перевести некий язык из категории лабораторных экспериментов в разряд инструметов промышленного назначения...

Так вот, откуда же в основном идут заявы? По моим впечатлениям (если хотите, сходите на этот сайт и проверьте), примерно 90-92 процента вакансий - из Америки, процентов 5-7 - из Англии, остальное - из Индии. Единицами периодически попадаются объявы из Китая(!). Это практически все.
Континентальной Европе компиляторщики не нужны.
Вакансии появляются редко-редко (вот именно что случайно). За шесть последних лет помню разве что объяву из Голландии, от Associated Compiler Experts. Она до сих пор там висит, с 2004 года. Я немного знаю эту компанию, и у меня есть вполне конкретные предположения насчет обстоятельств - и исторических, и текущих - их интереса к компиляторам... В общем, опуская детали, можно быть уверенным, что присутствие ACE в этом списке является тем исключением, которое подтверждает общую тенденцию.

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

вторник, 19 июня 2007 г.

Lisp на "Эльбрусе" (первая предыстория)

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

Надо понимать: в университете нас учили Алголу и Фортрану, начав работать, я программировал на низком уровне для БЭСМ-6, потом два-три года на PL/I (ЕС ЭВМ), потом пришел Паскаль, потом на горизонте замаячила Ада... Все, в общем, шло в русле одной хорошо известной и понятной императивной парадигмы. Скромный и элегантный Лисп со своей нестандартной "ориентацией" стоял в уголке сознания, внимания к себе особо не требуя, но и не давая о себе забыть. Да и особого повода серьезно им заняться не было: и текущей работы полно, и других интересных вещей вокруг много.

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

Конкретным толчком послужили исходные тексты системы Reduce-2, которые я случайно обнаружил на излете своей работы на ЕС.

Тем, кто эти баснословные времена не застал, надо объяснить специально. Тогда не было совершенно ничего похожего на теперешнюю свистопляску и накал страстей вокруг "открытого кода", "свободного или проприетарного ПО", копирайтов и "копилефтов" и прочего. Программы товаром не являлись, отдельно от компьютеров, для которых были предназначены, не распространялись и потому отдельной ценности (кроме, разве что, аспектов секретности) не имели. Под "программой", как правило, понималась ее исходная форма. Исходники очередных версий операционной системы "Эльбруса" вместе с компиляторами и прочими программами мы регулярно привозили от разработчиков (инсталляция системы на машине пользователя безусловно подразумевала этап компиляции) и могли сколько угодно их распечатывать, изучать и обсуждать. Хотя с исходниками ОС ЕС ситуация была не столь благостной (все-таки, система-то ворованная), но тексты отечественных программ для ЕС никто не думал ни от кого скрывать. Так что на системных дисках и там попадалось кое-что интересное.

Там я и наткнулся на Reduce-2 - программу символических манипуляций над формулами. Можно было производить различные операции над формулами, брать производные и интегралы, и все это аналитически, без реальных вычислений, по формальным математическим правилам! - тогда это поражало воображение. И написана эта программа была, как вы догадываетесь, на Лиспе. И исходники - вот они... Красивая и по виду не очень сложная программа.

Идея созрела довольно быстро: перенести исходники на "Эльбрус", по-быстрому (ох уж это "по-быстрому"! - сколько раз в жизни дебильный оптимизм меня подводил...) реализовать Лисп на "Эльбрусе", руководствуясь той книжечкой, оттранслировать Редьюс и играть с ним, так сказать, по месту основной работы.

Почему нельзя было перенести вместе с Редьюсом и сам Лисп - уже не помню: то ли не было его исходников, то ли написан он был на чем-то, чего не было на "Эльбрусе"... В общем, сказано - сделано. Через общий для двух машин накопитель на магнитных лентах (кто-нибудь помнит эти двухметровые шкафы, неспешно дергающие толстые бобины туда-сюда? Там был даже специальный механизм, который засасывал конец ленты с одной бобины, чтобы автоматически намотать его на приемную кассету. А в PL/I на уровне языка был определен специальный вид файлов и соответствующих операций обмена, ориентированный на работу с лентопротяжками...) Reduce оказался у меня на "Эльбрусе".

И я принялся писать интерпретатор Лиспа. Именно тогда и очень скоро я понял, как надо изучать новые языки: чтобы до конца понять его семантику, надо его реализовать! Только после этого приходит настоящее понимание. Конечно, я утрирую, и глупо требовать подобного от всех, но доля истины в этом определенно есть. В самом деле, приходится предельно конкретно и совершенно строго (в виде программы) описывать смысл каждой конструкции языка: что она означает, что происходит при ее выполнении и как это отражается на всей программе и на компьютере в целом.

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

Это все хорошо и правильно, и действительно дало мне понимание Лиспа, значительно более глубокое, нежели при чтении. Плохо другое: я быстро понял, что мне не хватает информации. Реализовать язык в объеме книжки удалось достаточно быстро. Правда, я делал прямую честную (вариант: тупую) реализацию, в которой все конструкции непосредственно интерпретировались. Богатые архитектурные возможности "Эльбруса" я практически никак не использовал, мне просто хотелось быстро получить работающую систему. Однако та маленькая книжечка явно не тянула на строгое описание языка, и некоторые конструкции в исходниках Reduce так и остались для меня загадкой. Да ведь к тому же диалектов Лиспа уже тогда образовалось достаточно, и у Reduce и у книги были определенно "разные" Лиспы. Несколько позже я где-то раздобыл знаменитую программу Elisa - остроумный имитатор диалога пациента и психоаналитика. Программа работала в диалоговом режиме, и в качестве пациента выступал человек за клавиатурой. Так в этой программе я увидел вызовы функций, которых не было ни в книге, ни в Reduce...

Удивятся: за чем же дело стало, неужели трудно найти нормальное описание Лиспа? Друзья, рассказать, как было с технической информацией (да и с любой другой) в восьмидесятых? Прежде всего, не было Интернета. Во-вторых, часто не было возможности купить нужную книгу - дефицит (знаете такое слово?). Каждой осенью издательства публиковали тематические планы выпуска книг на следующий год. В день выхода этих планов магазины технической книги брались штурмом, и попав туда, нужно было быстро разжиться экземпляром плана, бланками заказов, после чего умудриться за рекордное время заполнить бланки, вписав в них реквизиты выбранных книг и свой адрес, и успеть их сдать быстрее других (счет шел на минуты), пока магазин не исчерпает лимит приема заказов (еще одно канувшее слово...), выделенный ему сверху. Одна радость - стоили книги совсем недорого. Заказать нужную книгу зарубежом было труднее, чем слетать на Луну (второе технически вполне реально, первое было невозможно просто по определению).

Если книга все-таки как-то доставалась, проблемой было сделать копию. Немногочисленные "ксероксы" и "множительные машины 'Эра'" охранялись как ядерные боеголовки, а чтобы получить разрешение на копирование, нужно было пройти несколько кругов бюрократического ада, детально и доходчиво объясняя вдумчивым и молчаливым сотрудникам первых отделов свою крайнюю нужду в этой вот книге, составленной целиком из иностранных букв и загадочных знаков...

Конечно, не все было уж так безысходно. Найти и получить нужную книгу при желании или нужде и некоторой настойчивости было вполне реально, как и обойти идиотские препоны. Люди, работавшие на "Ксероксах" (специальная должность имелась!) были зачастую неплохими ребятами, к тому же не могли похвастаться высокими окладами... В крайнем случае можно было и переписать самое нужное (я в своей юности не одну запрещенную статью и книгу руками, как в восемнадцатом веке, переписал, и на пишущей машинке перепечатывал, и ничего...)

Настоящая проблема была в другом: я понял, что сила моего желания "добить" реализацию недостаточно велика, чтобы тратить время и силы на поиск полного описания языка, а потом - не реализацию всех стандартных функций. Понять семантику ключевых понятий и механизмов Лиспа оказалось тогда достаточно, чтобы почувствовать себя вполне удовлетворенным. В самом деле, EVAL и APPLY у меня работали, подмножество функций первой необходимости в объеме "чистого" Лиспа - тоже. Я мог вполне обоснованно продолжать считать себя крутым программером. :-) К тому же впереди меня ждал жутко амбициозный проект "Эверест", для которого надо было придумывать собственный базовый язык (за основу была взята недавно вышедшая Ада, но сам язык - он назывался Глобус-2 - был задуман заметно более мощным)... В общем, тогда я посчитал, что задача полной реализации Лиспа мне, в принципе, по силам, свою крутизну я себе доказал, ну и отлично, перейдем к более насущным делам.

Но в объеме той книжки мой Лисп вполне работал, и тесты проходил. Только вот реально поиграть с ним было никак невозможно: "скушать" Reduce он был не в состоянии...

А документацию по Лиспу я в итоге достал! Это отдельная, короткая, но очень интересная в своем роде история. Давайте об этом в следующей части.

понедельник, 18 июня 2007 г.

Программисты на С++ живы-здоровы

опозданием увидел заметку о высказывании Страуструпа (см. заголовок).
Вот сокращенный перевод (наскоро):



Понедельник, 25 апреля 2005 г.
Создатель C++ утверждает, что после краткого периода увлечения новыми ЯП, такими как Java и C#, разработчики возвращаются к использованию C++. Бьярн, который в настоящее время работает профессором университета в Техасе, считает что сообщения о смерти C++ были преждевременными. "C++ сейчас используется больше, чем когда-либо. В мире сейчас более трех миллионов программистов на C++. Подъем наблюдается повсеместно - все больше и больше проектов использует C++. Раньше повсюду преподавали Java, но сейчас снова изучают C++". По его мнению, это может быть не слишком заметно из-за отсутствия "пропагандистской кампании". Например, Sun Microsystems расхваливают использование Java в программе Mars Rover ("Марсоход"). Однако, [мало кто знает, что] C++ там тоже используется, в частности в реализации алгоритмов анализа и планирования маршрута в автономной системе управления Марсоходом.


Но не все согласны со Страусом:

Данные аналитика компании Evans Data, которая проводит регулярные обследования разработчиков, не подтверждают информацию об увеличении использования C++. Компания утверждает, что доля разработчиков, использующих C++, за последние шесть лет неуклонно снижается, - от 76% весной 1998 года до 46 процентов осенью 2004 года. При этом, однако, темпы снижения популярности С++, "существенно замедлились" за последние несколько лет. Janel Garvin, глава Evans Data, говорит, что использование Java несколько снизилось за последние несколько лет. "Популярность Java в Северной Америке постоянно возрастала, пока не достигла пика в 2001 или 2002 году",- сказал Гарвин. - С тех пор использование Java незначительно уменьшилась, однако по-прежнему остается высоким".

James Governor, аналитик компании RedMonk, считает, что утверждение о первенстве Java и языков, разработанных Microsoft (Visual Basic и C#), неверно. "Утверждение, что есть только два языка - Java и Microsoft - полная чушь.- сказал он.- C++ все еще играет заметную роль, а значение скриптовыех языков, таких как PHP и Python, растет, а не уменьшается".


А ведь, действительно, Си++ никогда не "продвигался", как это было и происходит, например, с Java или C#! Ну, можно сказать, что на популярность плюсов оказала сильнейшее влияние популярность Си, на котором он основан,- но ведь и Си никто не продвигал!..

Интересно, что было бы, если бы какая-нибудь могучая компания задумала запустить рекламную кампанию по продвижению Си++...

Несколько предварительных замечаний

амый первый пост - просто в качестве проверки и как бы предисловия. Начну с цитаты из одной своей давней статьи ("Редкая профессия"):

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

Это совсем не самореклама (что рекламировать-то - мало ли кто чего программирует?), а просто чтобы было понятно, чем я занимаюсь. А кроме компиляторов (и интерпретаторов, и всяких языко-ориентированных тулзов и прочего подобного) я, строго говоря, делать ничего и не умею. Ну, разве что лекции читать, да статьи писать.

Так что в этом блоге (если, конечно, времени хватит и если запал не исчезнет) я буду писать строго в рамках очерченных предметов. Если быть более точным, то вот темы, которые мне интересны:

- Компиляторы языков высокого уровня, в основном их "фронтальные" части. Генерация кода и оптимизация тоже интересны, но не настолько. Да и сказать что-то умное по этому поводу мне заметно сложнее, чем некоторым моим друзьям и коллегам. (Надеюсь, они будут иногда захаживать сюда :-)). Инструменты генерации синтаксических распознавателей (прежде всего, Yacc/Bison и COCO).

- Императивные языки как таковые. C/C++, Ada, C#, Java, Oberon/Zonnon, Eiffel (порядок перечисления случаен). Стандартизация языков, развитие языков. Современные инфраструктуры исполнения, прежде всего Java/JVM и Microsoft.NET/CLR/MSIL. Собственно виртуальные машины (на техническом уровне) - предмет особого интереса.

- Семантические интерфейсы (хороший и почти единственный из реальных пример - интерфейс ASIS для языка Ada). В особенности интересует все, что относится к "плюсам". Есть несколько старых проектов для C++ в этой сфере (успешно канувших в Лету, к сожалению, Sage++, например), если удастся найти что-то свежее - обязательно напишу. К этой теме непосредственно относится понятие промежуточного представления программ. Я, правда, предпочитаю название "семантическое представление" - об этом тоже надо будет подробнее написать, для меня это очень важная тема.

- Инструменты статического анализа исходных текстов - как академические проекты, так и коммерческие системы. К определенному моему удивлению, за последнее время, специально этим не заморачиваясь, обнаружил около десятка (а то и больше) фирм, выпускающих довольно интересные и мощные, судя по описанию, системы, целиком ориентированные на различные виды статического анализа программ. Постараюсь о некоторых из них написать подробнее, тем более, что даже после поверхностного чтения их сайтов возникло чувство, что там можно было бы наворотить и покруче :-). В этом пункте отдельного упоминания заслуживает тематика, связанная с (ре)инжинирингом программ, нотацией UML и ее подмножествами (Object Constraint Language, например). Помимо чисто исследовательского интереса, здесь видятся кое-какие вполне коммерческие перспективы...

- Функциональные языки. Наверное, придется ограничиться Lisp/Scheme как наиболее концептуально чистыми. Речь идет как о языках и функциональной парадигме как таковых, так и об инструментах. Один из первых постов будет об идее реализации Lisp для .NET.

- Продвинутые архитектуры компиляции, прежде всего, с ориентацией на глубокую интеграцию компиляторов и сред разработки. В 2005 году на эту тему даже статью написал, правда, вполне поверхностную. А тема сама по себе крайне интересная, да и реальные системы есть (как предмет анализа и образец) - прежде всего, Visual Studio и Eclipse.

Ну вот, примерно так... Потом, может, еще чего добавлю. Вообще-то, далеко не все упомянул. Проект ONBASS, в котором я сейчас, вроде бы, участвую (по договору с London Metropolitan University), вообще о другом, но тоже интересном. Потом как-нибудь.

Да, а та статья, цитату из которой я привел в начале, оказывается, исчезла с сайта PC Magazine/Russian Edition. Архив номеров за 1997 год просто отсутствует. А может, не нашел? Журнал был за номером 12, кажется (спецвыпуск, с медведем на обложке).

Ну ничего: если наберусь наглости, буду выкладывать куски из той статьи здесь - будет, кстати, повод восстановить пропущенные в печатном варианте куски, да и добавить кое-что (картинки, например). Сама статья, несмотря на свою давность, читается вполне ничего. :-)

А если дело совсем хорошо пойдет, то... продолжение напишу! За десять-то лет столько всего интересного произошло, уж вы поверьте... :-)