суббота, 29 августа 2009 г.

[comp.flame] Продолжение темы о нетбуках, нативных языках и старых временах

Заметка “Вернут ли нетбуки старые-добрые времена?” к моему удивлению и удовольствию вызвала активное обсуждение. Что приятно. Но я не раскрыл в ней всех причин, подтолкнувших меня к ее написанию. Благодаря комментарию Skynin, я решился развить эту тему.

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

Давно наблюдаю, как "нативные" программисты живут в каком-то
кошмаре "конца света", "последних времен" (Хорошие времена были...
прошли... Кали-Юга...) и потому светлом и напряженном ожидании
пришествия спасения в виде "C++ + Qt". (у "функциональщиков" схожее
ощущение - императищина гниет, ...). С психологической точки зрения
вызвано ощущением - "маргинальности", и "аутсайдерства".

Чувство маргинальности, несомненно, присутствует. А вот чувство аутсайдерства -- нет :) Но больше меня волнует тенденция постоянного расслоения программистов по прикладным специализациям. В начале 90-х мне казалось, что программист легко может менять языки программирования и проекты – сначала заниматься задачами реального времени на автокоде Эльбруса, затем делать бухучет на FoxBase в MS-DOS, затем ГИС под Windows, затем драйвера под Linux… Но время идет. И теперь сложно даже представить, сколько усилий Web-программисту потребуется, чтобы переквалифицироваться в драйверописатели или АСУТП-шники (и наоборот). В 90-е годы далеко не каждый программист был способен на это – только самые лучшие. Они и сейчас могут это сделать. Но сейчас барьер при переходе из одной области в другую очень высок и он все время растет. Поэтому, чем дольше я специализируюсь в своей нише, тем больше беспокойство я испытываю, когда думаю, что какой-нибудь большой приплыздец случится… В общем, специалист подобен флюсу, как говаривал Козьма Прутков.

Ну а теперь вернемся к нейтиву и не нейтиву (то бишь native code vs managed code). Прежде чем продолжать разговор, нужно определиться, что будет считаться нативным кодом, а что не будет. Я не спец по определениям, поэтому здесь у меня возникли изрядные трудности. Java уже давно не простой интерпретатор, а .NET (насколько я помню) никогда им и не был. И для Java, и для .NET существует возможность предварительной компиляции в нативный код (для Java в виде GNU-того компилятора, для .NET, если не ошибаюсь, встроенный во фреймворк Ngen). В тоже время для нейтива разрабатывались подходы, когда после компиляции строится объектный код некоей виртуальной машины, преобразуемый в родной код конкретной платформы при развертывании приложения. Так что граница между нейтивом и не нейтивом уже давно сильно размыта. А в контексте данного разговора я проведу ее следующим образом:

Нейтив подразумевает запуск на исполнение родного для конкретной платформы кода без помощи вспомогательной прослойки в виде какого-нибудь фреймворка или виртуальной машины. Запущенное приложение обращается к функциям ОС, а не к функциям базового фреймворка. Приложение содержит в себе все необходимые части и сторонние динамически-загружаемые библиотеки и не требует для своей работы установки какого-либо базового фреймворка/виртуальной машины.

Сразу подчеркну, что я не являюсь противником управляемого кода. Более того, я даже в чем-то любитель управляемого кода (порядком и с удовольствием попрограммировал на Ruby). Управляемый код очень хорош во многих случаях. Например, скрипты. Одним из самых важных достоинств моей системы сборки Mxx_ru для меня является то, что ее исходный код всегда присутствует и доступен для быстрой правки, если вдруг на какой-то машине что-то пошло не так. Еще один пример: server-side системы режима 24x7. Организовать в них “горячую замену” кода на управляемом динамически-типизированном языке (типа Erlang, Ruby или Python) гораздо проще, чем на статически-типизированном. Или, к примеру, возможности для метапрограммирования, которые есть в Ruby и Python как-раз из-за того, что это управляемые языки. Хотя, чем больше используется управляемого кода, тем больше ресурсов потребляют приложения. Этого не отнять.

В принципе, всему есть свое место – и нейтиву, и не нейтиву. Если без фанатизма. А вот фанатизм, имхо, таки присутствует. Что наблюдается в ползучем распространении Java/.NET, Ruby, Python, JavaScript, Flash, …, you name it. А так же тем, что в области нейтива за последние 15-20 лет не возникло ни одного успешного C++киллера (ну не считаю я таковыми ни Eiffel, ни Ada, ни OCaml, ни D, ни Haskell).

И тут самое время задаться вопросом: “Если C++киллера так и не появилось, то нужен ли он вообще и зачем?” В эту же тему очередная цитата из комментария Skynin:

Если программист готов бесплатно "заморачиваться эффективным и компактным приложением" – пусть изменит мир.

Собственно, в этом все дело. Мне действительно хочется, чтобы мир изменился. Поскольку то, что в нем происходит сейчас мне не кажется нормальным. Складывается впечатление, что производители делают “то, что можно сделать”, а не то, что “хотелось бы иметь” пользователям. Пара примеров.

Летом в стиральной машине полетел насос. Вызвали мастера, он его заменил. Спросил, сколько лет машине. Семь, отвечаем. Ну понятно, говорит, почти евростандарт – современные бытовые приборы (холодильники, стиральные машины, телевизоры и т.д.) расчитаны на семь лет эксплутации. Мол производителям выгоднее менять линейку продукции раз в несколько лет, а покупателям проще выбрасывать 4-5 летнюю технику и покупать совершенно новую, чем выпускать модели, способные работать по 15-20 лет.

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

В области персональных компьютеров для меня явно выделялись две стадии – когда их мощность была явно недостаточной и когда их мощность уже достигла видимости достаточности. Первая стадия очень хорошо просматривалась во время гонок 86, 286б 386, 486, 486DX-2, 486DX-4, P-I-66, P-I-100,…, P-I-200-MMX, P-II, P-III. До 486-х скорость была явно недостаточна. Скажем 200-страничный документ в Word-е на 486 еще как-то можно было написать, а вот на 386 – уже фигушки. И где-то до P-II рост производительности компьтеров явным образом наблюдался. Переход на новую железку сразу сказывался на повышении скорости работы и ее комфортности (музыку в фоне можно было слушать, несколько процессов параллельно работали не тормозя друг друга, потом видео появилось). Но где-то с рубежа P-II или P-III стало заметно, что такого серьезного прироста скорости/комфортности работы при смене компьютера уже нет (очевидно, из-за нового софта). Начался выход персоналок в категорию “достаточно производительных”. Если до P-IV имело смысл менять железо раз в год-полтора, то сейчас это не так. Для многих классов задач возможностей существующих машин уже хватает и даже с запасом. Т.е. игры или HPC все еще насилуют процессоры/память/видеокарты по полной программе, но вот для “бытовых” нужд (электронная почта, интернет, skype, офис,…) вполне хватает даже P-IV с 2Gb RAM.

Т.е. в области персоналок уже складывается ситуация, когда пользователю не нужно менять железо раз в год для того, чтобы его почтовый клиент не тормозил. Производительность перестает быть главным критерием выбора нового компьютера/ноутбука. А раз так, то не начинается ли пора, когда человек покупает себе машинку не на 2-3 года, а на 5-6-7-и-более лет? И если она начинается, то нужно ли разработчикам задумываться о том, чтобы экономить ресурсы пользователя?

Мне кажется, что нужно. Причем, под ресурсами здесь понимается не только использование процессора и памяти пользовательской машины. Но и объем скачиваемого дистрибутива (вы бы выбрали аудиоплейер с дистрибутивом в 2Mb или в 22Mb, или в 222Mb?) и объем сопутствующих виртуальных машин/фреймворков.

А если нужно экономить ресурсы, то как это сделать? Например, использовать нативные языки программирования. Которые, (нормальными руками) позволяют делать быстрые и компактные программы. Не требующие сторонних многомегабайтных дистрибутивов. Быстро стартующие, оперативно откликающиеся, экономно расходующие ресурсы (я набираю этот текст в Windows Live Writer-е, который на Core2Duo 2.4MHz с 4Gb памяти стартует секунд 10, а затем отжирает 55Mb памяти и работает не очень шустро, да и подглючивает). /Примечание. На более совершенном, чем C++, языке это вполне возможно и с такими же трудозатратами, как на управляемых языках. На C++ возможно то же, но это сложно. Так что речь не о C++./

Еще один вопрос: а верю ли я сам в то, что подобный разворот событий произойдет? Что пользователи будут покупать компьютеры на 10 лет? Что они будут работать в одной и той же версии своей любимой программы в течении нескольких лет (т.е. эпизодически это уже и сейчас происходит, но не массово)? Что пользователи будут смотреть, жрет ли программа 10Mb во время работы или 100Mb?

Не сильно, но хотелось бы. Ведь в конце-концов должны же мы начать считать свои и чужие деньги. Вон за океаном, многие не думали про бесплатный сыр в мышеловке, брали и давали кредиты без оглядки. Сейчас оказались в заднице, и не только они. А все по той же причине – позволяли себе то, что можно было позволить, а не то, что следовало бы…

При чем же здесь нетбуки? Да так – отличный повод разработчикам начать задумываться о ресурсах пользователя ;) Ну и поворчать о старых-добрых временах ;)

7 комментариев:

Rustam комментирует...

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

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

eao197 комментирует...

Ну да, вот такой он, OCaml -- бисексуальный :)

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

И в связи с этим так же хочется, чтобы нативные языки развивались (а не только Scala, F# и Fortress). А то ведь может оказаться, что какая-нибудь новая версия аутглюка будет требовать для своей нормальной работы 8-ми ядерного процессора.

Но тема "что лучше в условиях многоядерности -- нейтив или не нейтив?" еще требует своего отдельного раскрытия :)

Skynin комментирует...

Хороший пост. Кусочно комментировать - обидеть.

Поэтому, продолжу за автора:
Было: http://ru.wikipedia.org/wiki/Canon_Cat процессор Motorola 68000 (тот же что и в Macintosh) на тактовой частоте 5 МГц, 256 КБ ОЗУ - Набор приложений был записан в ПЗУ объёмом 256 КБ. В него входили: стандартный пакет офисных программ, орфографический словарь на 90 000 слов, программа связи и средства программирования на Форт и языке ассемблера.

Пытались:
http://www.rebol.com/ Рекомендую посмотреть на - VM в 640К и @GUI Example"

Пытается: http://www.menuetos.net/ MenuetOS is an Operating System in development for the PC written entirely in 32/64 bit assembly language, - и вся ОСь с гуями - что-то в пару мегабайт.

Но имеем - http://www.computerra.ru/sgolub/453790/ Голубятня: Писюковый Недоцахес

eao197 комментирует...

2Skynin:

> Хороший пост.

Спасибо.

> Но имеем - http://www.computerra.ru/sgolub/453790/ Голубятня: Писюковый Недоцахес

Очень бы хотелось сделать вид, что я знаю, как писать хороший и надежный софт. Но я не знаю.

У железячников я не могу представить себе картину, когда разработчик какого-нибудь прибора добавляет в прибор какой-то новый элемент и заявляет, что новый вариант работает, ни разу не включив его. Зато у программистов я многократно сталкивался с ситуцией, когда говорят "я исправил ошибку, теперь все нормально", но сами даже ни разу не компилировали(!) исправленную программу.

Rustam комментирует...

Да Голубицкому похоже уже пора лечится :(

Miroslav комментирует...

какие ресурсы надо экономить ? сколько это принесет пользы и кому ?
может я немного занят но я "не въехал" где об этом в посте написано.
где маргинальность ? в общем имхо тема не раскрыта и требует продолжения после неспешного обдумывания.

eao197 комментирует...

2Rubanets Myroslav: да разные ресурсы нужно экономить. Скажем, у меня на нетбуке 1Gb памяти. Часть ее отжирает ОС, еще часть браузер, еще что-то плейер, еще что-то какой-нибудь Windows Live Writer или Zoundry Raven. И все, памяти больше не осталось. Система вышла в своп. Переключение из Windows Live Writer в браузер требует поднятие части страниц из свопа. Что замедляет мою работу и раздражающее действует мне на нервы.

Тоже самое с потреблением процессора. Если плейер начнет отъедать не 3-5% времени, а 15-20%, то это скажется на какой-нибудь другой операции (например, скроллинге в Adobe Acrobat Reader).

Или, скажем, размер дистрибутива. Захотел я программулину новую попробовать (видеоплейер, скажем). А он весит не 10Mb, а 85Mb. У меня это около 45-минут на полностью свободном канале. Или, например, я плачу за трафик и стоимость 1Mb меня не сильно устраивает (GPRS тот же).

Выгоды именно для меня. Покупаю я себе, скажем за $500 нетбук, и работаю на нем следующие 5-6 лет не парясь на тему апгрейда и морального устаревания. Когда износится донельзя, тогда и заменю. Но не из-за того, что новая версия mp3 плейера стала требовать нового железа.

А тема маргинальности действительно не раскрыта :)