All streams
Search
Write a publication
Pull to refresh
481
0
Artyom Skrobov @tyomitch

Пользователь

Send message

ARM сегодня 25

Reading time1 min
Views23K
25 лет назад, 27 ноября 1990, из фирмы Acorn Computers выделилась команда, разработавшая микропроцессоры ARM1, ARM2 и ARM3. Из тех двенадцати сооснователей — четверо продолжают работать в ARM по сей день, среди почти четырёх тысяч сотрудников, собравшихся из 71 стран мира.

До 1994 вся ARM помещалась в большом сарае в деревне Swaffham Bulbeck, в 13км от Кембриджа; сейчас у компании больше сорока офисов, разбросанных по двадцати странам.


ARM не выпускает процессоры сама; но её партнёры за 25 лет выпустили 75 миллиардов чипов, реализующих одну из версий архитектуры ARM. Это на порядок больше, чем число кирпичиков в Великой китайской стене!

За пять лет — от первого выпущенного процессора ARM1 до основания компании ARM — было выпущено 130 тысяч чипов. Первым процессором, выпущенным ARM отдельно от Acorn, стал ARM610, разработанный специально для использования в Apple Newton — планшетном компьютере, опередившем своё время. Разочарованная коммерческим провалом Newton, Apple отказалась от идеи на долгие 17 лет; но и в следующем планшете от Apple, знаменитом iPad, также использовался процессор от ARM — Apple A4 на основе Cortex-A8. В нынешнем году чипы ARM выпускаются почти по полтысячи штук каждую секунду — около 13 миллиардов за прошедшие 11 месяцев!

Примерно четверть всех выпущенных чипов приходится на процессор ARM7TDMI, выпускаемый с 1998 г.



Но самое впечатляющее достижение — то, что в день рождения ARM на хабре появился полный неоправданного пессимизма пост «Сегодняшний мир — это amd64, armv7 и aarch64. Всё остальное мертво, Джим».
По мнению разработчика OpenBSD, две из трёх живых на сегодняшний день архитектур — это архитектуры ARM!
Читать дальше →

Полвека «универсальным машинным языкам» (1966—2016): прошлое, настоящее, будущее

Reading time27 min
Views19K
КДПВ

Прошлое


Повествование можно начать с 1962 г., когда в Кембриджском университете началась работа над CPL («Cambridge Programming Language») — «усовершенствованным вариантом» ALGOL-60. К работе над языком подключился аспирант Мартин Ричардс; главной сложностью в реализации нового ЯП ему показалась необходимость ручного портирования компилятора для разных компьютерных платформ. В частности, когда кембриджский EDSAC-2 заменили на Atlas-2, разработчики CPL потратили много времени на портирование своего компилятора для новой платформы.

Диссертация Мартина была посвящена «само-компилирующемуся» CPL: разработанный Мартином компилятор был написан на сильно упрощённом варианте CPL, компилятор которого несложно было написать на тогдашнем макроассемблере. Перенос CPL на новую платформу теперь можно было выполнить в два шага:
  1. Вручную пишем компилятор «упрощённого CPL»;
  2. Компилируем им компилятор «полного CPL».

На этом Мартин не остановился, и разработал BCPL — систему для разработки переносимых компиляторов. Компилятор BCPL генерировал псевдокод, названный Мартином «OCODE».
OCODE выглядел примерно так:
OCODE «расшифровка» («procode»)
94 5 L1 83 73 69 86 69
95 4
42 0
42 0 40 2 14
83
42 0 42 1 40 2 14 83
42 2
40 3 42 1 15
92
85 L5
90 L6
42 1 40 4 40 2 14 83
40 4 42 1 14 80 4 
90 5 40 4 40 5 88 L6
91 4
42 2 40 3 42 1 15 92
85 L7
90 L8 40 4 40 2 14
8 87 L9
40 4 42 2 11 92
85 L11
90 L10
42 0 40 6 40 2 14 83
40 4 40 6 14 80 6
90 L11
40 6 40 3 22 86 L10
91 6 90 L9
40 4 42 1 14 80 4
90 L7 40 4 40 5 88 L8
91 4 97 103 0
ENTRY 5 L1  'S' 'I' 'E' 'V' 'E'
SAVE 4
LN 0
LN 0 LP 2 PLUS
STIND
LN 0 LN 1 LP 2 PLUS STIND
LN 2
LP 3 LN 1 MINUS
STORE
JUMP L5
LAB L6
LN 1 LP 4 LP 2 PLUS STIND
LP 4 LN 1 PLUS SP 4
LAB L5 LP 4 LP 5 ENDFOR L6
STACK 4
LN 2 LP 3 LN 1 MINUS STORE
JUMP L7
LAB L8 LP 4 LP 2 PLUS
RV JF L9
LP 4 LN 2 MULT STORE
JUMP L11
LAB L10
LN 0 LP 6 LP 2 PLUS STIND
LP 4 LP 6 PLUS SP 6
LAB L11
LP 6 LP 3 LS JT L10
STACK 6 LAB L9
LP 4 LN 1 PLUS SP 4
LAB L7 LP 4 LP 5 ENDFOR L8
STACK 4 RTRN ENDPROC 0
; заголовок процедуры
; стековый кадр (два параметра и две локальные переменные)
; поместить на стек число 0
; поместить ещё один 0, прибавить к нему 2-ой элемент стека
; записать в массив на вершине стека значение под ним
; всё то же самое для 1-ого элемента массива
; поместить на стек число 2
; вычесть единицу из значения 3-его элемента стека
; записать результат в локальную переменную
; перейти к метке L5
; объявление метки L6
; взять 4-ый элемент стека, записать в массив по этому индексу 1
; прибавить к 4-ому элементу стека 1, записать результат обратно
; L5: перейти к метке L6, если 4-ый элемент стека <= 5-ому
; объявление, что на стеке сейчас четыре элемента
; вычесть единицу из значения 3-его элемента стека
; перейти к метке L7
; L8: сложить 4-ый и 2-ой элементы стека
; прочитать значение по этому адресу; если это 0, перейти к L9
; умножить 4-ый элемент на два
; перейти к метке L11
; объявление метки L10
; взять 6-ой элемент стека, записать в массив по этому индексу 0
; прибавить к 6-ому элементу стека 4-ый, записать рез-т обратно
; объявление метки L11
; перейти к метке L10, если 7-ой элемент стека меньше 4-ого
; на стеке сейчас шесть элементов; объявление метки L9
; прибавить к 4-ому элементу стека 1, записать результат обратно
; L10: перейти к L8, если 4-ый элемент стека <= 5-ому
; на стеке четыре элемента; окончание процедуры
(Для экономии места, последовательности команд записаны в одну строчку. Мартин в своём руководстве по BCPL поступает точно так же.)

Исходный код на BCPL:
LET sieve(workvec, vecsize) BE
{
  workvec!0 := 0
  workvec!1 := 0
  FOR i = 2 TO vecsize-1 DO workvec!i := 1
  FOR i = 2 TO vecsize-1 DO
    IF workvec!i DO
    { LET j = 2 * i
      WHILE j < vecsize DO
      { workvec!j := 0
        j := j + i
      }
    }
}
В более новых версиях OCODE добавилась поддержка чисел с плавающей точкой (соответственно, набор поддерживаемых опкодов почти удвоился), а также удалили опкод ENDFOR — вместо него генерируется пара LE JT.

Среди «универсальных машинных языков» OCODE уникален тем, что метки в нём определяются специальными инструкциями — т.е. для интерпретации программы её нужно сначала всю загрузить в память, и найти в ней метки.
— а отдельная программа, кодогенератор, превращала файл с таким псевдокодом в исполнимую программу для конечного процессора. OCODE сохранялся в виде текстового файла из десятичных чисел, разделённых пробелами и переводами строк: в то время, когда OCODE разрабатывался, привязка формата файла к конкретному размеру байта ограничивала бы переносимость такого файла.

Компилятор BCPL(1) поставлялся в виде OCODE, и чтобы перенести его на новую платформу, нужно было:
  1. Вручную написать интерпретатор псевдокода(2) (на любом языке, хоть на Бейсике);
  2. Адаптировать кодогенератор,(3) написанный на BCPL, для своей платформы;
  3. Запустить под интерпретатором (2) компилятор BCPL (1), скормить ему кодогенератор (3), и получить на выходе исполнимый файл кодогенератора(4);
    • Интерпретатор (2) нам с этого момента больше не нужен.
  4. Прогнать через кодогенератор (4) псевдокод компилятора (1), и получить на выходе исполнимый файл компилятора.


Такой подход означал, что для переноса компилятора на новую платформу требуется лишь самый минимум низкоуровневого программирования; и действительно, реализация BCPL была завершена к 1967 г. — раньше, чем была завершена реализация CPL, начатая на несколько лет раньше!

Достоинства BCPL применительно к системному программированию вдохновили Кена Томпсона на создание языка Би, а тот — коллегу Кена, Денниса Ритчи, на создание Си. Именно из BCPL пошла традиция обозначать {фигурными скобками} блоки программы, и именно на BCPL была написана первая программа «Hello, World!».
GET "libhdr"

LET start() = VALOF
{ writef("Hello*n")
  RESULTIS 0
}
Более важная нам причина, по которой BCPL вошёл в историю: OCODE — первая универсальная «архитектура набора команд» (ISA), т.е. «виртуальная машина», не привязанная ни к какой конкретной аппаратной платформе с её особенностями. BCPL, таким образом — первый язык программирования, соответствующий парадигме «Write once, run anywhere» (WORA): программу на BCPL можно распространять в скомпилированном виде, и её можно будет запустить на любой платформе, для которой существует OCODE-кодогенератор.
Читать дальше →

Как работает мозг?

Reading time8 min
Views120K
Этот пост написан по мотивам лекции Джеймса Смита, профессора Висконсинского университета в Мадисоне, специализирующегося в микроэлектронике и архитектуре вычислительных машин.

История компьютерных наук в целом сводится к тому, что учёные пытаются понять, как работает человеческий мозг, и воссоздать нечто аналогичное по своим возможностям. Как именно учёные его исследуют? Представим, что в XXI веке на Землю прилетают инопланетяне, никогда не видевшие привычных нам компьютеров, и пытаются исследовать устройство такого компьютера. Скорее всего, они начнут с измерения напряжений на проводниках, и обнаружат, что данные передаются в двоичном виде: точное значение напряжения не важно, важно только его наличие либо отсутствие. Затем, возможно, они поймут, что все электронные схемы составлены из одинаковых «логических вентилей», у которых есть вход и выход, и сигнал внутри схемы всегда передаётся в одном направлении. Если инопланетяне достаточно сообразительные, то они смогут разобраться, как работают комбинационные схемы — одних их достаточно, чтобы построить сравнительно сложные вычислительные устройства. Может быть, инопланетяне разгадают роль тактового сигнала и обратной связи; но вряд ли они смогут, изучая современный процессор, распознать в нём фон-неймановскую архитектуру с общей памятью, счётчиком команд, набором регистров и т.п. Дело в том, что по итогам сорока лет погони за производительностью в процессорах появилась целая иерархия «памятей» с хитроумными протоколами синхронизации между ними; несколько параллельных конвейеров, снабжённых предсказателями переходов, так что понятие «счётчика команд» фактически теряет смысл; с каждой командой связано собственное содержимое регистров, и т.д. Для реализации микропроцессора достаточно нескольких тысяч транзисторов; чтобы его производительность достигла привычного нам уровня, требуются сотни миллионов. Смысл этого примера в том, что для ответа на вопрос «как работает компьютер?» не нужно разбираться в работе сотен миллионов транзисторов: они лишь заслоняют собой простую идею, лежащую в основе архитектуры наших ЭВМ.

Моделирование нейронов


Кора человеческого мозга состоит из порядка ста миллиардов нейронов. Исторически сложилось так, что учёные, исследующие работу мозга, пытались охватить своей теорией всю эту колоссальную конструкцию. Строение мозга описано иерархически: кора состоит из долей, доли — из «гиперколонок», те — из «миниколонок»… Миниколонка состоит из примерно сотни отдельных нейронов.



По аналогии с устройством компьютера, абсолютное большинство этих нейронов нужны для скорости и эффективности работы, для устойчивости ко сбоям, и т.п.; но основные принципы устройства мозга так же невозможно обнаружить при помощи микроскопа, как невозможно обнаружить счётчик команд, рассматривая под микроскопом микропроцессор. Поэтому более плодотворный подход — попытаться понять устройство мозга на самом низком уровне, на уровне отдельных нейронов и их колонок; и затем, опираясь на их свойства — попытаться предположить, как мог бы работать мозг целиком. Примерно так пришельцы, поняв работу логических вентилей, могли бы со временем составить из них простейший процессор, — и убедиться, что он эквивалентен по своим способностям настоящим процессорам, даже хотя те намного сложнее и мощнее.
Читать дальше →

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

Reading time4 min
Views23K
Нынче инженером быть так модно, что к их числу себя причисляет кто попало. Слово «инженер» почти потеряло конкретный смысл. Если вы знаете кого-то, кто, по-вашему, инженером лишь притворяется — покажите им этот тест, чтобы вывести их на чистую воду.

Тест на инженера


Вы входите в комнату, и видите, что картина висит неровно. Вы…
  1. поправляете картину;
  2. спокойно проходите мимо;
  3. покупаете САПР и проводите следующие полгода за разработкой самовыравнивающейся картинной рамки, питающейся солнечной энергией. Всё это время вы проклинаете того придурка, который догадался вешать картины на обычные гвозди. Только индус мог бы удовлетвориться таким костылём!

Настоящий инженер не выберет ни один из этих вариантов. Он впишет на полях теста «правильное решение в каждом конкретном случае будет зависеть от обстоятельств, не приведённых в условии» (см. ниже про риск), а вслух он при этом пробурчит: «и кому только пришло в голову, что картинам обязательно висеть прямо? этим чудикам из отдела маркетинга?» (см. ниже про эстетику).
Читать дальше →

readyto.travel — как сэкономить 30% и более при покупке авиабилетов

Reading time2 min
Views13K
Привет, Хабр!
Хочу рассказать вам о readyto.travel — особенном поисковике авиабилетов, разработанном rtt.
Его отличительная черта — собственный алгоритм поиска маршрутов, который позволяет находить неочевидные дешевые и быстрые варианты перелетов.



За счет чего же это достигается?
Читать дальше →

Неопределённое поведение и теорема Ферма

Reading time4 min
Views56K
В соответствии со стандартами C и C++, если выполнение программы приводит к переполнению знаковой целой переменной, или к любому из сотен других «неопределённых действий» (undefined behaviour, UB), то результат выполнения программы может быть любым: она может запостить на Твиттер непристойности, может отформатировать вам диск…
Увы, в действительности «пасхальные яйца», которые бы заставляли программу в случае UB делать что-то из ряда вон выходящее, не встречались со времён GCC 1.17 — та запускала nethack, когда встречала в коде программы неизвестные #pragma. Обычно же результат UB намного скучнее: компилятор просто оптимизирует код для тех случаев, когда UB не происходит, не придавая ни малейшего значения тому, что этот код будет делать в случае UB — ведь стандарт разрешает сделать в этом случае что угодно!
В качестве иллюстрации того, как изобилие UB в стандарте позволяет компилятору выполнять неочевидные оптимизации, Реймонд Чен приводит такой пример кода:

int table[4];
bool exists_in_table(int v)
{
    for (int i = 0; i <= 4; i++) {
        if (table[i] == v) return true;
    }
    return false;
}

В условии цикла мы ошиблись на единицу, поставив <= вместо <. В итоге exists_in_table() либо должна вернуть true на одной из первых четырёх итераций, либо она прочтёт table[4], что является UB, и в этом случае exists_in_table() может сделать всё что угодно — в том числе, вернуть true! В полном соответствии со стандартом, компилятор может соптимизировать код exists_in_table() до
int table[4];
bool exists_in_table(int v)
{
    return true;
}

Такие оптимизации иногда застают программистов врасплох.
Читать дальше →

О срезании углов

Reading time2 min
Views40K
Давным-давно, когда разрабатывалась файловая система Unix, в ней появились «псевдо-файлы» . и .., чтобы упростить перемещение между каталогами. Кажется, .. был добавлен в Версии 2, когда файловая система стала иерархической (в первой версии она была устроена совсем по-другому). Но эти «псевдо-файлы» засоряли вывод ls, и то ли Кен, то ли Деннис добавил в код ls простую проверку:
if (name[0] == '.') continue;
На самом деле программы тогда писались на ассемблере, но суть проверки была в точности такой.
Правильнее было бы реализовать эту проверку более развёрнуто:
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
— но какая разница, главное что всё работало.

У этого было два далеко идущих последствия.
Читать дальше →

О биткойнах и деньгах

Reading time3 min
Views11K
В свете недавней бурной дискуссии о взятии курсом биткойна нового рубежа в $500, я хочу поделиться своими соображениями по поводу того, почему биткойн не нужен.
Поскольку я не настоящий экономист, а маску на стройке подобрал — то буду признателен комментариям тех, кто разбирается в вопросе лучше меня.

Итак, зачем нужны деньги?

1. Как средство расчётов


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

Более распространённый в современном мире вариант — когда нужность вызывается верой в то, что всем остальным этот предмет так же нужен. От американских долларов не откажется ни один торгаш, ни в одной стране мира — не потому, что США чем-то особенные, а потому, что любой торгаш знает, что любой другой торгаш у него эти доллары точно так же примет.
Такая вера в американские доллары образовалась исторически, и её сможет поколебать лишь одно — распространение мерчантов, отказывающихся принимать доллары.
Когда на онлайн-базарах будут объявления «поменяй свои баксы на биткойны, и вот тогда приходи» — тогда биткойны станут состоятельны как средство расчётов.

Но пока мерчанты принимают биткойны наряду с долларами — не важно, тысяча таких мерчантов существует или сто тысяч, всё равно: зачем заморачиваться с конвертацией, если можно не заморачиваться и купить сразу за доллары?
А пока что — сложно мне представить себе предпринимателя, торгующего чем-то законным и притом отказывающегося продавать это за доллары. Такие бывают?

2. Как средство накопления

Читать дальше →

Воображение, как у Эсмеральды

Reading time4 min
Views23K
(От переводчика: этот текст появился в блоге одного из разработчиков языка Go в новогоднюю ночь 2012. Текст ничуть не утратил актуальности за два минувших года; более того, вместо Go в тексте вполне мог бы стоять любой другой немейнстримовый язык. Собственно, именно об этом текст и повествует.)

Одна моя знакомая актриса — назовём её Эсмеральдой — как-то сказала, «Я всегда знала, что стану актрисой. Даже представить не могу, чтобы я была кем-то ещё!» Кто-то парировал: «Какая же тогда из тебя актриса?»

Я вспомнил об этой беседе, прочитав отзыв о языке Go: «Даже представить не могу, как можно программировать на языке без дженериков!» Мне так и хотелось парировать: «Какой же тогда из тебя программист?»

Эта заметка не о дженериках — против них я ничего не имею: возможно, однажды они в Go появятся, а возможно, нет. Эта заметка о воображении, или по крайней мере о том, что программисты обычно выдают за воображение: претензии. Один мой друг отметил, что самый распространённый ныне способ проводить свободное время — сотрясать воздух Сети своими жалобами. Для жалобщиков это умиротворяющая разрядка; но адресатов неиссякающего потока жалоб это весьма угнетает. На меня жаловались столько, что теперь мне самому стала нужна разрядка. Что я для этого делаю? правильно, пишу возмущённый пост в свой блог.

Читать дальше →

Python: декорируем декораторы. Снова

Reading time5 min
Views35K
В прошлом году на Хабре уже была очень развёрнутая статья в двух частях о декораторах. Цель этой новой статьи — cut to the chase и сразу заняться интересными, осмысленными примерами, чтобы успеть затем разобраться в примерах ещё более мудрёных, чем в предыдущих статьях.
Целевая аудитория — программисты, уже знакомые (например по C#) с функциями высшего порядка и с замыканиями, но привыкшие, что аннотации у функций — это «метаинформация», проявляющаяся только при рефлексии. Особенность Питона, сразу же бросающаяся в глаза таким программистам — то, что присутствие декоратора перед объявлением функции позволяет изменить поведение этой функции:



Как это работает?
Читать дальше →

«Интернет по-русски» (Компьютерра, март 1997)

Reading time34 min
Views32K
Всю первую половину 1990-х Интернет в России оставался забавой для гиков: «чтобы запустить используемые протоколы, одного высшего образования мало». Позже, когда Интернет уже стал доступнее и популярнее, его поджидала другая напасть — чехарда с поддержкой кириллицы. Различных кодировок было достаточно, чтобы потеряться.

В марте 1997 Компьютерра избрала данную проблему своей «темой номера», начав рассказ с того, откуда столько кодировок появилось и почему они все используются, и заканчивая рекомендациями о том, как со всем этим жить дальше. Я перепечатываю текст из журнала как есть, не сокращая. Я специально перепроверил, что гуглу этот текст доселе неведом; но по-моему, такой «памятник славянской письменности» из доюникодной эпохи — достоин того, чтобы сохраниться в электронном виде.

(Пользуясь поводом, упомяну и свой двухгодовалой давности топик о Кате Лажинцевой, официальном создателе CP-1251.)

Олег Татарников

Крестоносцы

Ты так гонишься за тенью, что теряешь наличие.
Из книги Иова


Концепции Интернета, первоначально разработанные в унитарной, централизованной армейской системе министерства обороны США, быстро вышли из «диктаторских пут» и воспринимаются сегодня как идеи всемирной общедоступной информационной магистрали. Любые попытки ограничения доступа, цензуры и внешнего воздействия на Сеть однозначно воспринимаются мировым сообществом в штыки. За широким внедрением Интернета в нашу жизнь не стоит никакая организация: это самоорганизующаяся система, и главный ее двигатель — все человечество. В этом основное отличие всемирной Сети от коммерческих сетей, в этом ее привлекательность для миллионов и ее сила. В таком свете неприглядно выглядят сторонники массовой «коизации» информационного обмена в России, стремящиеся загнать всех российских пользователей в прокрустово ложе единой кодировки. Тем более что носители этой идеологии составляют абсолютное меньшинство российских пользователей Интернета, пусть даже и самое активное. Причем благие намерения, которыми они при этом руководствуются, никак не служат оправданием для насильственного ограничения свобод и причинения дополнительных неудобств огромной армии пользователей, число которых продолжает стремительно расти. Ибо известно, куда таковыми намерениями обычно мостятся дороги.

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

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

«Релкомизация всей страны»

Reading time18 min
Views15K
Подборка статей о пиратстве в 1990-е, отчего-то воспринятая Хабром в штыки, заканчивалась оптимистичными прогнозами лидеров IT-индустрии о том, что развитие сетей уже в скорейшем будущем позволит заменить большинство ПК простенькими «тонкими клиентами», и ресурсоёмкие приложения будут работать не на компьютере пользователя, а на центральных серверах. Прогресс пошёл не совсем в этом направлении — даже веб-приложения ныне требуют существенных ресурсов на стороне пользователя — но интересно взглянуть, что писали о прогрессе ПК всего за пару лет до той статьи о «замене персональных компьютеров сетевыми»:

(КомпьютерПресс, январь 1995)

Слухи о рождении домашнего компьютера немного преувеличены

Н.Иванов

В летнее время, под тенью акации,
Приятно мечтать о дислокации.

Фаддей Козьмич Прутков

В последнее время в российской прессе, не только компьютерной, но и общечеловеческой, все чаще можно встретить словосочетание «домашний компьютер». Шум, поднятый вокруг «компьютера для народа», несколько напоминает кампанию повальной информатизации и всеобщей компьютерной грамотности начала перестройки. Та кампания была вызвана невиданными успехами советских инженеров, которым удалось-таки скопировать Intel 8080 и освоить серийный выпуск клона (прошу не рассматривать это как упрек в адрес вышеупомянутых инженеров — все мы выпали из одного гнезда). Вы помните, что 3-4 года назад в каждом магазине культтоваров можно было по дешевке приобрести уродца, программируемого на Бейсике, со стримером «Электроника-302» и черно-белым монитором высокого разрешения, который к тому же можно было использовать в качестве телевизионного приемника. Правда, массовый покупатель не пошел на поводу у пророков компьютерной эры, отдав предпочтение колбасе, а профессионалы собирали из подручных средств компьютеры и помощнее (если им не удавалось утащить с работы буржуазную АТ-шку). В общем, первая волна одомашнивания «умных машин» разбилась о стену безразличия.

Нынешняя ситуация существенно отличается от тогдашней. Во-первых, в связи со значительным подорожанием колбасы платежеспособный спрос постепенно смещается в сторону наукоемких товаров. Во-вторых, промышленный и деловой рынок, кажется, насытился компьютерами, и предложение естественным образом ищет выход в другие сегменты рынка. В-третьих, новая волна инспирирована не успехами отечественной науки и движется не из Зеленограда и Подлипок, а откуда-то из-за океана. Журнал Fortune (25 июля 1994, с. 113) замечает, что в 1993 году «беспрецедентный рост продаж «домашним» пользователям застал промышленность врасплох». Постепенное возвращение России в лоно мировой экономики способствует тому, что российский рынок все быстрее откликается на изменения рынка западного. Таким образом, предпосылки для второй компьютерной революции, которая позволит каждой кухарке управлять компьютером, более существенны. Что же мы можем ожидать на наших прилавках, и как к этому относиться?
Читать дальше →

Пираты XX века

Reading time21 min
Views35K
В 1990-х годах рынок ПО в свежеобразованной России развивался активно, но несколько однобоко: основную часть программ на ПК составляли зарубежные программы со снятой (или изначально отсутствовавшей) защитой от копирования; зачастую одни и те же отечественные умельцы переводили программу на русский язык (порой — затирая исходные копирайты), разбирались с защитой от копирования, и в итоге продавали программу по цене носителя и безо всякой поддержки. Это отличалось от современной варез-сцены, полуподпольной и целиком виртуальной: российские продавцы чужого ПО нисколько не скрывались, наоборот — они давали рекламу в журналах, выпускали вполне физические дискеты и (позднее) CD-диски, и в компьютерных магазинах ими были заставлены целые полки. Понятно, что отечественная разработка ПО в такой среде была не слишком жизнеспособна: уже упомянутый Лексикон — программа вполне достойного качества, которую свежеобразованные российские бизнесмены попытались поставить на коммерческие рельсы — покупался «легально» хорошо если одним пользователем из ста.

(Когда я только поступил на матмех, наш профессор нас предупреждал: "Даже не рассчитывайте, что в России вы сможете программированием зарабатывать себе на жизнь. Из отечественных софтверных компаний прибыль имеет только 1С, да и та лишь потому, что нормативные документы меняются каждый год, и украденная версия софта через год становится бесполезной. Наверное, это такая государственная политика по поддержке программистов — менять каждый год требования к бухгалтерии.")

Поэтому естественно, что журналы 1990-х годов активно обсуждают сложившуюся неблагоприятную для программистов ситуацию, и предлагают способы на неё повлиять. Все сходятся в том, что засилье пиратства — черта переходного периода, вызванная временным недостатком интереса западных правообладателей к российскому рынку; и что уже через несколько лет рынок ПО в России разовьётся в аналогичный европейскому. Но и сейчас, пятнадцать лет спустя, отношение обывателя к авторскому праву на ПО мало изменилось. Значит, некоторые рекомендации той поры остаются актуальными до сих пор.

В прошлый раз я пообещал опубликовать статью Ольги Усковой — ныне обладательницы стольких наград и почётных званий, что ими удалось наполнить целую статью на Википедии:



(КомпьютерПресс, январь 1995)
В предлагаемой статье поднимет тему маркетинга программных продуктов в России вице-президент фирмы Cognitive Technologies О.А.Ускова.

Как продавать программы в России,

или Ягодки коммерческого директора


Полтора года назад в России бытовало представление, что программа — это такая штука, которую ученые чудаки или наивные инофирмы бесплатно предоставляют находчивым российским пользователям. Иметь лицензированную копию считалось так же стыдно, как покупать билет в общественном транспорте или соблюдать правила дорожного движения. Обсуждение психологических аспектов этой проблемы пришлось бы начинать со времен Ивана Грозного…
Читать дальше →

Лексикон и пираты

Reading time15 min
Views62K
Легенда гласит, что прототип Лексикона — многооконный редактор Е-9 — был задуман молодым сотрудником ВЦ АН СССР Женей Веселовым в отпускные дни доперестроечного 84-го на крымском пляже, а с целью ускорения тестирования автор одно время выставлял обнаружившим ошибки пользователям по бутылке пива. Хотя метод оправдал себя и программа быстро стала работоспособна, с сожалением приходится отметить, что маркетинговая политика последующих правообладателей не столь свежа — пива больше не дают. Вскоре печатающий по-русски и понятный без изучения на специальных курсах Лексикон широко распространился по стране, став «русским народным текстовым редактором». Прошли и вновь грядут технические революции в области компьютеров, исчез СССР, а с разменявшим второй десяток лет Лексиконом для ДОС по российским и сопредельным городам и весям и сегодня работают тысячи людей.
Так рассказывает Григорий Шмерлинг, присоединившийся к разработке Лексикона несколько позже, и под конец бывший «Руководителем Проекта „Лексикон“».

Вне всякого сомнения, Лексикон — легендарный программный продукт. Но таким он стал не сразу; а и став, оставался им не слишком долго.



В 1990 Лексикон упоминается в числе «известных прикладных систем» наряду с Lettrix — резидентным драйвером американской разработки, который перехватывал вывод текста на принтер, и подменял его на графический вывод с применением пользовательских шрифтов. Название LEXICON в той статье набрано латиницей, и непонятно, осознавал ли её автор, что Лексикон создан его соотечественниками, а не «экспроприирован у буржуев» вместе с большей частью ПО того времени. Никакой организованной «модели распространения» у Лексикона тогда не было — каждый списывал его у соседа вместе с ворохом других «полезных программ», не задумываясь ни на минуту, откуда эти программы взялись и не ожидает ли их разработчик мзды за их использование.
Какой разработчик? Где? Где-то там за океаном? Ух, капиталисты зажравшиеся! (потрясает кулаком)

Статья "Как продавать программы в России, или Ягодки коммерческого директора" Ольги Усковой из Cognitive Technologies (в следующий раз я хочу выложить её статью целиком) относится к 1995 г., но начинается в подобном духе: «Полтора года назад в России бытовало представление, что программа — это такая штука, которую ученые чудаки или наивные инофирмы бесплатно предоставляют находчивым российским пользователям. Иметь лицензированную копию считалось так же стыдно, как покупать билет в общественном транспорте или соблюдать правила дорожного движения. Обсуждение психологических аспектов этой проблемы пришлось бы начинать со времен Ивана Грозного...»

Тем временем команда Веселова с Лексиконом кочевали в поисках финансирования от одного оптимистично настроенного кооператива к другому, и в итоге они заключили союз с советско-венгерским СП «Микроинформ», до той поры занимавшимся торговлей компьютерным оборудованием и проведением компьютерных курсов. Плодотворное сотрудничество программистов и бизнесменов увенчалось выпуском в 1992 г. нарядных коробок с Лексиконом версии 8.96, переименованной по этому поводу в Лексикон 1.0. Лишь с этого момента разработка Лексикона стала коммерческим предприятием, и нелегальное копирование начало беспокоить разработчиков (вернее, их спонсоров в Микроинформе). Изначально же мотивы Веселова были куда проще — «захотелось написать что-нибудь получше только для того, чтобы легче было вводить и редактировать собственные программы и статьи. Получился редактор Е-9, названный так потому, что в нем было девять окон, и он превратился потом в „Лексикон“ путем добавления десятого окна и меню в стиле Lotus 1-2-3.»
Читать дальше →

«Вычислительная техника и её применение» (ноябрь 1990)

Reading time10 min
Views42K
Дома у меня, как оказалось, сохранилась небольшая стопка потёртых компьютерных журналов, от 10-летней давности и старее. Погружение в эти страницы — не только приятная ностальгия, но и весьма интересный инсайт в ценности и чаяния того времени. Кроме того, хотелось бы сохранить всю эту информацию в более долговечной форме, чем бумажные страницы.

Я собираюсь выложить здесь подборку материалов из этих журналов, с указанием издания и авторов; поскольку до сих пор все эти тексты не существовали в цифровом виде, то НЛО вряд ли будет иметь ко мне претензии за копипаст.

Самый старый из сохранившихся номеров — "Вычислительная техника и её применение" за ноябрь 1990. Тема номера — Norton Commander. На обложке — три неопределённых компьютера с логотипами IBM, AT&T и Apple. Сзади — ещё один неопределённый компьютер с некой САПР на экране, цитата В.М.Глушкова, и адрес редакции — «СССР, Москва, Центр, проезд Серова, 4» — даже без индекса. Цена 20 коп.



Авторы выпуска: (интересно, живут ли они на Хабре?)

КЛЯУС Сергей Витальевич — научный сотрудник, занимается разработкой программного обеспечения АСУ, СУБД и систем передачи данных.

СЛОБОДЧУК Вячеслав Викторович — научный сотрудник, занимается исследованием и разработкой локальных вычислительных сетей.

ЖАРИКОВ Л.Н., СУХОРУКОВ Ф.Д. — программисты.
Читать дальше →

Почтовые индексы — на свободу! (Реверсинг в картинках)

Reading time4 min
Views28K
Пару лет назад я писал об использовании базы PAF (Postcode Address File) британской Королевской почты (Royal Mail) для приведения почтовых адресов, вводимых пользователями, к стандартному виду. Поскольку PAF — основная интеллектуальная собственность Royal Mail, то заполучить её не так-то просто: годовая подписка стоит от £400 в зависимости от полноты базы и от частоты апдейтов. Спустя неделю-другую после оформления подписки по почте приходит солидная красная коробочка с CD-диском:


На диске — EXE-файл, который запрашивает «серийный номер» и распаковывает базу (набор CSV-файлов) на диск. Серийный номер присылают отдельно, чтобы злоумышленник, перехвативший посылку, не смог бы воспользоваться базой. (Вот выдумают же — текстовый файл с серийным номером!) Номер у каждого клиента свой, чтобы в случае «утечки» было ясно, к кому предъявлять претензии. Впрочем, организовать «утечку» самих данных серийный номер никак не мешает, и на WikiLeaks в 2009 г. появилась база Postzon (одна из составляющих PAF). В комментариях к ней отмечено, что "данная база составлена на средства налогоплатильщиков, и активисты, в их числе газета The Guardian и сэр Тим Бернерс-Ли, уже давно пытаются убедить Royal Mail открыть свободный доступ к PAF; но до сих пор эти попытки не увенчались успехом". Впрочем, через год после появления Postzon на WikiLeaks аналогичная по содержанию база появилась в открытом доступе от имени британской картографической службы Ordnance Survey и под названием OS Code-Point Open — таким образом и Royal Mail сохранила лицо, не уступив требованиям активистов, и утёкшие данные официально получили статус общедоступных. Тем не менее, полностью PAF до сих пор необщедоступна. (Пока я готовил эту статью, Postzon и с WikiLeaks куда-то пропала; но гугл всё помнит.)

Спустя год после получения PAF мне понадобилось в неё снова заглянуть, но листочек с серийным номером, присланный отдельно от диска, за год успел куда-то затеряться. Тут мне и стало интересно — насколько сложно будет обойти проверку серийного номера в продукте таком солидном и так яростно защищаемом от «освободителей информации»? Через полчаса данные были у меня на винте, а сама программа-распаковщик мне показалась неплохим демонстрационным примером для начинающих реверс-инженеров. Никакая IDA не потребуется — только бесплатные и быстроустанавливаемые инструменты.

Суровые ассемблерщики, которых боится даже Касперский, наверняка сочтут данный пример игрушечным, и, позёвывая, пролистают весь остаток статьи. Ну и ладно — туториалы в стиле «как нарисовать сову» меня раздражают намного больше, чем те, в которых разжёвываются простые вещи.
Читать дальше →

Что такое -1.#IND и -1.#J?

Reading time3 min
Views37K

Любой опытный программист знает, что стандарт представления значений с плавающей точкой (IEEE 754) оставляет несколько зарезервированных значений, соответствующих не-числам (NaN, not-a-number). Стандартная библиотека Visual C печатает не-числа следующим образом:
Печатается Означает
1.#INF Положительная бесконечность
-1.#INF Отрицательная бесконечность
1.#SNAN Положительное сигнальное не-число (signaling NaN)
-1.#SNAN Отрицательное сигнальное не-число (signaling NaN)
1.#QNAN Положительное несигнальное не-число (quiet NaN)
-1.#QNAN Отрицательное несигнальное не-число (quiet NaN)
1.#IND Положительная неопределённость
-1.#IND Отрицательная неопределённость
Положительная и отрицательная бесконечности могут получаться при переполнении в результате арифметического действия — например, при делении на ноль, или при взятии логарифма от положительного нуля. (По стандарту IEEE, любое значение с плавающей точкой имеет определённый знак — не только не-числа существуют в положительном и отрицательном вариантах, но и нулей тоже два.)
Сигнальные и несигнальные не-числа...

Поиск часто встречающихся элементов в массиве

Reading time5 min
Views121K
Задача: в массиве длиной N найти элемент, который повторяется больше N/2 раз.

Казалось бы, чего тут думать? Возьмём Dictionary<значение элемента, число появлений>, за один проход по массиву сосчитаем появления каждого элемента, потом выберем из словаря искомый элемент. Решение за O(N), куда может быть ещё быстрее?

Есть один нюанс: для словаря нам потребуется O(N) дополнительной памяти — в несколько раз больше размера исходного массива, и это при реализации словаря хоть хэш-таблицей, хоть деревом. Что будем делать, если наша цель — обработка сигнала неким устройством с маленькой памятью? Массив — замеры уровня сигнала, из которых один — «настоящий» передаваемый уровень, а остальные — шум и помехи. Неужели придётся для определения «настоящего» уровня возиться с хэш-таблицами и деревьями?

К счастью, нет: достаточно O(1) дополнительной памяти, и по-прежнему одного прохода по массиву.
Читать дальше →

Насколько плохим код должен быть?

Reading time6 min
Views74K
Эрик Липперт — ветеран Microsoft, проработавший в компании 16 лет и стоящий за разработкой VBScript, JScript и C#.

На прошлой неделе в комментариях к одной из статей разгорелся спор о роли низкоуровневой оптимизации в программировании, и я вспомнил относящуюся к этому статью Эрика. Она была написана в конце 2003, и хотя реалии с тех пор несколько изменились — принципы остались теми же самыми. Можете мысленно заменить ASP и VBScript на PHP, JavaScript, или на другой скриптовый язык по вашему вкусу.

Эту статью я уже пытался перевести в 2005, но русский текст тогда получился неуклюжий, так что этот перевод — новый и ранее не публиковался, в соответствии с требованиями НЛО. В Переводе блога Эрика Липперта этого текста тоже нет — наверное, для них он слишком стар.


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

Например, за семь лет в Microsoft я получил десятки вопросов, аналогичных по своей сути этому, заданному в конце 1990-х:
У нас есть код на VBScript, и в одной часто вызываемой функции мы определяем оператором Dim несколько переменных, которые нигде в функции не используются. Не замедляется ли каждый вызов функции из-за объявления этих переменных?
Какой интересный вопрос! В компилируемом языке, таком как Си, объявление локальных переменных общим размером n байт всего лишь вычитает n из указателя стека при входе в функцию. Если n будет чуть больше или чуть меньше, затраты времени на вычитание никак не изменятся. Наверное, в VBScript точно так же? Оказалось, что нет! Вот что я написал автору вопроса:
Читать дальше →

Проект «робот-грузчик»: определение ориентации

Reading time8 min
Views17K
Месяц назад я писал об определении моим роботом-грузчиком собственного положения. (Жаль, ту статью я запостил в неудачное время в ночь на субботу, так что её мало кто увидел.) Как я отметил, показания колёсных датчиков позволяют роботу определять своё положение достаточно точно — медленно накапливающаяся ошибка корректируется, как только робот сканирует баркод на любой из полок склада. С другой стороны, накапливающуюся ошибку направления корректировать было нечем.

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

Я решил проверить: что видит на потолке склада мой робот?

Читать дальше →

Information

Rating
5,382-nd
Registered
Activity