Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
22.66 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

 

coding

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

Короткий номер и Premium SMS

 

 

 

 

Думается, ты знаком с механизмом оплаты контента и услуг посредством мобильного телефона, когда для полу-

links

 

чения контента требуется отправить sms на какой-нибудь короткий номер с определенным текстом. Стоимость

Темаразработки

 

таких сообщений может варировать от 0,06 до $5. Эти дорогие sms и называются Premium SMS. Непосредственно

шпионскогоПОдля

 

короткий номер принадлежит операторам сотовой связи, так что, по идее, вопрос аренды нужно решать с каждым

Symbian раскрыта

 

оператором отдельно. Дабы сильно не заморачиваться с утрясанием всяких бюрократических вопросов, касающих-

наhttp://dtarasov.ru.

 

ся аренды короткого номера, предприимчивые люди обычно пользуются услугами агрегаторов вроде СМС-Трафик

Такжерекомендуется

 

(http://www.smstraffic.ru), которые берут на себя вопросы заключения договоров со всеми операторами. При этом

регулярнопосещать

 

обычно схема взаимодействия с агрегатором примерно следующая:

forum.nokia.com.

 

1) Заключается договор и доп.соглашения; для этого может понадобиться статус юридического лица (это в случае

 

 

более-менее «приличных» агрегаторов вроде СМС-Трафик, — другие могут деньги и на WebMoney переводить).

 

 

2) Заказчику присваивается пара номер/медиа-код. От номера обычно зависит стоимость сообщения, а медиа-код

 

 

— это текст сообщения, который однозначно идентифицирует заказчика. На один номер может быть подвешено

 

 

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

 

 

используется идентификация по медиа-коду. Именно поэтому обычно пишут что-то вроде «отправь 12345 на номер

 

 

1234»; 12345 — это, по сути, идентификатор конкретного арендатора короткого номера.

dvd

 

3) В конце месяца агрегатор переводит бабло на счет арендатора, оставляя себе процент в качестве комиссии.

Надискележат

 

Понятно, что арендовать короткий номер и грести деньги с отправленных на него sms может любой, и мошенники

исходныекоды

 

— не исключение. На рынке присутствуют несколько контор, которые позволяют арендовать короткий номер, не

основныхклассов

 

оставляя о себе приватной информации.

 

приложения.

 

 

ЗдесьмыподсоединяемсякбазеданныхcommDB исоздаемсписокточекдоступа. Послеэтогоустанавливаеминдекссписканапервуюпозицию(советуюизучитьописаниеCApSelect вSDK). Теперьможнотестироватьточкидоступа. Вкачестведвижкаработоспособноститочкидоступа используетсямодифицированныйдвижокTCP, исходныекодыкоторого можновзятьнаforum.nokia.com. Модификациязаключаетсявтом, что добавленкласс— observer (MtcpipIapCheckEngineObserver), содержа-

щийединственныйметодTestCompleted, вызываемыйдвижкомприиндикациипроцессаокончаниитестированияконкретнойточкидоступа. В

нашемслучаеотMTcpipIapCheckEngineObserver наследуетсяAppUi. Мы такженепубликуемздесьисходныйтекстдвижкаCIapCheckTcpEngine, носнимрекомендуетсяознакомиться(естьнанашемдиске). Отметим, чтовсялогикаиспользованияэкземпляраклассаCIapCheckTcpEngine вAppUi заключаетсявобработкевызоваTestCompleted, параметром которогокакразиявляетсяиндикаторуспешностиилинеуспешности использованияточкидоступа. КодTestCompleted выглядиттак:

void CMegaTroyAppUi::TestCompleted (TIapTestResult aTestResult)

MySQL. Послеизмененияизанесенияномеравбазунасерверенеобходимореализоватьпростенькийинтерфейсвзаимодействиясмобильнымтелефоном. Тутможнопойтиразнымипутями:

Простовыводитьплейн-текстомномеритекстсообщенияприобра-

щениикстраницевидаhttp://yourhost.ru/megascript.php;

МожноиспользоватьXML дляподдержкирасширяемости.

Вобщем, этоужеделовкуса. Главное, корректнообработатьотдаваемые серверомданныенасторонемобильногоприложения. Прощевсегоснова пойтинаforum.nokia.com илипошаритьсянанашемдискеиознакомиться скодомhttp-движка, позволяющегоосуществлятьGET-запросы. ИспользованиеэкземпляраклассадвижкаизAppUi выглядитпримернотак:

iHTTPEngine->GetRequestL(iUri,iIapId);

ЗдесьiUri — url скрипта, возвращающегономер, аiIapId — идентификаторточкидоступа, которуюмырешилииспользовать. Послеполучения ответаотсерверанужнопозаботитьсяотом, чтобысохранитьномерв файлиливлокальнуюпеременную, иотправитьsms.

{

 

МЕХАНИЗМОТПРАВКИSMS

 

 

 

if(aTestResult == EIapNotUsable)

Этотфункционалуженеоднократноописывалсянастраницахнашего

{

журнала, поэтомулибоподнимистарыеномера, либоознакомьсясмате-

 

GetNextIapId(); //переходим к тестированию

риаламинасайтеhttp://dtarasov.ru.

 

следующей точки доступа

 

 

}

 

СЕРТИФИКАЦИЯПРИЛОЖЕНИЯ

 

 

else

Какговорилосьвыше, чтобыприложениямоглибеспрепятственноус-

{

танавливатьсявсмартфоныподуправлениемSymbian 9, необходимоих

 

HandleCommandL(EConnectToServer);

подписыватьцифровымсертификатом. Этамерабылавведенаврамках

 

//ломимся на сервер

технологииSymbian Platform Security, появившейсявSymbian OS 9.1 и

}

предназначеннойдлязащитыкакразотподобногософта. Еслипопы-

}

татьсявкратцесформулироватьсутьпроблемы, тоестьдвапути, чтобы

 

 

заставитьприложениеустановитьсявтелефонпользователя:

Каквидно, вслучаеуспеха, мыконнектимсяксерверуиобновляемномер.

1)УзнатьIMEI (универсальныйидентификатораппарата) телефоноввсех

 

 

пользователейивручнуюподготовитьсертификатсредствамиSymbian

 

КОННЕКТКСЕРВЕРУИЧТЕНИЕНАСТРОЕК

Offline Signed. Приэтомпрограммабудетустанавливатьсяисключительно

 

 

Чтобыиметьвозможностьудаленнозадатьхакерскойсофтиненомер,

насмартфоныизмножестваIMEI, указанныхприсозданиисертификата.

накоторыйнужнослатьнедешевоеsms, взломщикиреализуютнекое

2) ПодписатьприложениенасайтеSymbian средствамиExpress Signed

подобиеадминки(смотрикартинку).

илиCertified Signed. ОтличаетсяExpress Signed отCertified Signed

ПрощевсегосделатьэтосиспользованиемстандартнойсвязкиPHP +

тем, чтоподписьстоитсущественнодешевле(20$), атакженетребует

100

XÀÊÅÐ 03 /123/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

codingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тестированияпрограммывручнуюспециалистамитестовогоцентра.

подлинность, поэтомуихрисуютдажевфотошопе. ВместесPublisher ID

 

Необходимопростозасабмититьформусинформациейоприложении

взломщикполучаетдоступкExpress Signed — ивозможностьсабмитить

 

исамоприложение. Есливсесделатьправильно, тонавыходеполучим

свеженаписанныйтрояннаподпись. Здесьшагиследующие:

 

сертифицированноеприложение. Темнеменее, потомономожет

1)Софтиназаливаетсянаподпись.

 

попастьнааудитисертификациябудетаннулирована, еслитестерам

2) Указаннаяпрогаавтоматическиподписываетсясертификатомис

 

что-тонепонравится. Certified Signed подразумеваетсобойтестиро-

этогомоментаможетбытьустановленавлюбойсмартфон.

 

ваниевручнуюспециалистамитестовогоцентра. Вхакерскомслучае

3)Хакербыстренькоскачиваетсвойзло-софтссайтаSymbianSigned и

 

этовообщеневариант— врядлиимпридетвголовусертифицировать

начинаетраспространять.

 

трояны!

4)Троян, возможно, попадаетнааудит.

 

Очевидно, чтоизуказанныхспособовпервыйедвалиможетбыть

5)Специалистытестовогоцентрааннулируютсабмит, удаляяподписан-

 

применим— хакерпростонесумеетсобратьIMEI всехмобил, вкоторые

нуюпрограммуссайтаиблокируютPublisher ID.

 

желаетвнедриться. Единственныйпуть— сертификацияпосредством

Дажееслипункты4 и5 будутиметьместо(чтосовсемнефакт), то, в

 

Express Signed. Всеосложняетодинфакт— длятого, чтобывоспользо-

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

ватьсяExpress Signed, необходимоиметьуниверсальныйидентифи-

начатьегопопуляризацию. ДляраспространениязаразыPublisher ID не

 

каторпоставщикауслугPublisher ID. Стоитон$200 вгодиотпускается

нужени, дажееслиегозаблокируют, этоужемалоинтересно, ибоделали

 

исключительноюридическимлицам, представившимучредительские

егонаподставныедокументы. Такимвотнезауряднымспособомобхо-

 

документывTrustCenter. ПодробнееоPublisher ID можнопрочитатьна

дитсязащитаSymbian Platform Security. Кстати, тызаметил, чтововсех

 

http://dtarasov.ru. ПроцедурарегистрацииPublisher ID можетвыглядеть

этихслучаяхяописываюдеятельностьнекоего«хакера»? Этонеспроста,

примернотак:

посколькусамяподобнымивещаминикогданезанималсяитебене

1)Взломщикзаполняетанкетунаtrustcenter.de/order/publisherid/dev,

советую— мывсеголишьописываемто, каконослучается. Простобудь

 

вводитданныекредитки.

вкурсеизнай, чтосамыесовременныетехнологииотСимбианнемогут

2)Науказанныйe-mail приходитписьмосперечнемнеобходимых

защититьтвоюмобилунастопроцентов.

 

документов, которыенеобходимопредоставитьдляидентификации

 

 

 

 

поставщикауслуг(разработчика).

 

HAPPY END

 

 

 

 

3)Злодейотправляетсканыдокументовкакого-нибудьлевогоюр.лица

Каквидно, задачанаписанияфункциональноготроянадляSymbian

 

(можноииндивидуальногопредпринимателя).

нетакаяужитривиальная, новполневыполнимая. Сейчасугроза

4) ВышеозначенныйгибридГитлераиБармалеяполучаетссылкуна

безопасностинетакявнавсилуотносительнойсложностиописанных

 

сертификат, устанавливающийсявбраузер. Онпонадобится, чтобы

процедурреализации. Вирусописателиещенеуспелинаплодитьмассу

 

получитьдоступкфункциямExpress Signed изличногокабинетанасайте

опасногоПО. Носовременемониегонаплодят, поэтомупользователям

 

SymbianSigned.com.

мобильныхустройствстоитвнимательнееотноситьсякустанавливае-

 

Все, Publisher ID получен. Тонкиммоментомздесьявляетсяотправкауч-

момуПО, темболее, изнепроверенныхисточников. Еслижечитатель

 

редительскихдокументовюридическоголица. Обычнохакерыизыскива-

заинтересованвразработкеилииспользованииподобных«продуктов»,

 

ютвозможностьотправкикаких-нибудьподдельныхиличужихдокумен-

тонапоминаем, чтоэтопротивозаконнаядеятельность, котораяможет

 

тов. Какпоказываетпрактика, уTrustcenter нетвозможностипроверитьих

привестикпечальнымпоследствиям! z

 

XÀÊÅÐ 03 /123/ 09

101

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

w Click

 

BUY

>>m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

coding

/ ALEKSEY.CHERKES@GMAIL.COM /

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

СКАЗ ОЛЕТАЮЩЕМ ЗМЕЕ

АГРЕССИВНАЯ ОПТИМИЗАЦИЯПРОГРАММНАPYTHON’E

Python применяется там, где скорость разработки программы и простота сопровождения кода важнее скорости его работы. Он нужен для быстрого создания надежных, легко изменяемых программ. Благодаря динамической типизации и большому количеству встроенных высокоуровневых типов данных, Python позволяет быстро создавать лаконичный, выразительный и надежный код. У этих достоинств есть и обратная сторона: низкая скорость выполнения программ.

аPython пишутнетолькомелкиескрипты. Этотязыкчасто

Нприменяетсявкрупныхпроектах— компьютерныхиграх илисистемахматематическихрасчетов. Еслинаписанная программаработаетслишкоммедленноилинетакбыстро,

какзадумывалось, передразработчикамивстаетзадачаповышения эффективностикода. Нетруднодогадаться, чтостатьяпосвященаобзору техникиинструментовоптимизациипрограмм, написанныхнаPython.

МАЛЕНЬКИЕХИТРОСТИ

ИнтерпретаторPython обладаетнекоторымиособенностями, которые могутвлиятьнаскоростьвыполненияпрограмм. Знаниеэтихособенностейпоможетвнаписанииболееэффективногокода.

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

Например, map(operator.add, l1, l2), скореевсего, будетработатьбыстрее, чемmap(lambda x,y: x+y, v1, v2). Такойподход значительноповышаетчитабельностькода.

СтрокивPython — этонеизменяемыеобъекты(immutable objects). Тыне можешьизменятьзначенияединождысозданнойстроки, — можнотолькосоздатьновуюиприсвоитьейизмененноезначениестарой. Конкатенациястрок''.join(seq) будетвыполнятьсягораздобыстрее, чем явныйциклсоператором+=. Впервомслучаеноваястрокасоздается одинразивнеесразузаписываетсянужноезначение. Вовтором— каждаяитерацияпорождаетновыйобъект, которыйнаследующейитерации ужененужен. Этогораздомедленнее, плюсвозрастаетнагрузкана сборщикмусора. Тожесамоекасаетсяоператора«%» дляформирования строкпошаблону. Онкудаэффективнеепрямогосуммирования. Многиефункции, порождающиепоследовательности, имеютальтернативнуюверсию, использующуюгенераторы. Например, прикаждом вызове range(n) впамятисоздаетсясписокдлинойn. Авотпри вызове xrange(n) впамятивообщенесоздаетсяникакихколлекций,

102

XÀÊÅÐ 03 /123/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

codingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

толькогенератор, которыйвычисляетэлементыпоследовательности «ленивым» образом. Помнипроgenerator expressions, — частопроних забываютипользуютсяlist comprehensions.

Полезнотакжедержатьвголовебазовыеалгоритмы, накоторыхоснованаработасколлекциями. Конечно, комфортныйсинтаксисPython усыпляетбдительность, нонужностараться:). Словариимножества реализованынадеревьях, поэтому, например, прибольшомN проверкапринадлежностиэлементаколлекции(a in b) проходитвсреднем быстреедлясловарейимножеств, чемдлясписковиликортежей, для которыхвэтихслучаяхвыполняетсяполныйперебор. Добавлениеили удалениеэлементовспискавхвостевыполняетсябыстрее, чемвсередине, таккакдляэтогоненужноперестраиватьсписок.

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

Очевидно, чтооперацияимпорта— оченьмедленная, ведьинтерпретаторунужнополностьювыполнитьвесьзапрашиваемыймодуль. Обычно всеоперацииимпортамодулейпрописываютвначалескрипта. Но бываютслучаи, когдамодульиспользуетсяредко. Тогдаможнонеуказыватьеговначалескрипта, чтобыоннеотъедалвремяприинициализации, анаписатьприблизительноследующее:

module_name = None

def delay_import(): global module_name

if module_name is None: import module_name

Модульmodule_name будетимпортированвовремявызовафункции

delay_import().

Самоеглавное— расширениянаС. Онимогутбытьоченьэффективными. Классическийпример— модульNumPy (реализациянаСматриц имногомерныхмассивов, плюсбиблиотекавсегонеобходимогодля математическихвычислений). Попроизводительностионаспокойно догоняеткоммерческийMatLab. НотаккакPython гораздоболеегибок,

чемскриптовыйязыкMatLab, тосвязкуNumPy + Python можнорассмат- риватькакоченьудачныйopen-source проект, которыйнедаетспатьпо ночамжаднымкапиталистам. Еслитыдумаешь, чтописатьPython-рас- ширениянаС— долгоеинудноезанятие, советуюобратитьвниманиена проектPyRex. Этокомпилируемыйязык, похожийнаPython. Коднаэтом языкеможносмешиватьскодомPython воднойпрограмме, аписатьс егопомощьюмодулирасширенийпочтитакжепросто, какискриптына самомPython!

ПРОФИЛИРОВАНИЕ

Профайлер— этоинструментдлязамеравременивыполненияразличныхучастковкода. ВPython «изкоробки» доступносразутривида профайлеров(batteries included!). Этомодулиprofile (илиcProfile), timeit иhotspot.

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

Модульprofile позволяетанализироватьпроизводительностькодав сложныхпроектах. Оннетребуетдляработыпочтиникакихизменений

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

Использоватьмодульоченьпросто. Всамомзаурядномслучаедостаточноимпортироватьмодульprofile ивызвать profile.run('main_ function()'), передаввкачествепараметрафункцию, скоторой начинаетсяработа. Нижеприведенболеесложныйпримериспользованияпрофайлера. Скриптвыводитнаконсольтабличкудляпятисамых затратныхповремениработы(безучетадочернихвызовов) функций. Метод strip_dirs() обрезаетполныепутивименахфайлов:

import profile import pstats

def main():

# твоя программа pass

profile.run('main()', 'main_prof') stats = pstats.Stats('main_prof') stats.strip_dirs() stats.sort_stats('time') stats.print_stats(5)

Сыраястатистика, собраннаявовремяданногозапуска, сохраняетсяв файлеmain_prof. Классstats анализируетинформацию, прочитанную изтакихфайлов, ивыдаетвболеепонятномдляпростыхпарнейвиде. Разрешаетсяобъединятьинформациюизнесколькихтакихфайлов

— дляобщегоанализаинформации, собраннойза несколькозапусков

(функцияstats.add()).

МодульcProfile делаеттожесамое, чтоимодульprofile. Обамодуля обладаютпочтиодинаковыминтерфейсомивбольшинствеслучаев взаимозаменяемы. Разницавтом, чтоcProfile реализованкакрасширениенаязыкеС, втовремякакprofile написанисключительносредствамисамогоPython. ПоэтомуcProfile обладаетменьшейпогрешностьюи большейскоростьювыполнения, ноегосложнеепортироватьнаальтернативныеплатформы. Модульprofile, наоборот, теоретическиможет запуститьсяналюбоминтерпретатореPython.

Модульtimeit нужендляудобногозамеравремениработыодиночныхвыражений. Онпринимаетвыражениекакстроку, многократно выполняетегоивыводитобщеевремяработы. Модульоченьудобендля

организацииразличныхэкспериментовсзамеромпроизводительности. Рассмотримнебольшойпример:

from timeit import Timer

x = 123

t1 = Timer('x * 2', 'from __main__ import x')

t2 = Timer('x + x', 'from __main__ import x')

number_of_calls = 10**7

time1 = t1.timeit(number = number_of_calls) time2 = t2.timeit(number = number_of_calls) print time1 / time2

Врезультате, насвоеймашинеяполучил1.26. Выходит, мояверсия интерпретатораскладываетчислоссамимсобойприблизительнона1520% быстрее, чемумножаетэточислона2. Сложениедляцелыхчисел выполняетсябыстрееумножения.

JIT-КОМПИЛЯЦИЯ

Еслитысчитаешь, чтотвойкодработаетслишкоммедленно(обязательноубедись, чтоэтонепаранойя!), тонеторописьбратьсяза

XÀÊÅÐ 03 /123/ 09

103

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

 

coding

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

links

wiki.python.org/ moin/PythonSpeed/ PerformanceTips

большаястатьяпро оптимизациюна официальномсайте. Must read!

www.python.org/doc/ essays/list2str.html

– «Python Patterns

— An Optimization Anecdote». Неболь-

шаястатьяГвидован РоссумаобинтересномслучаеоптимизацииPython кода.

wiki.python.org/ moin/PythonSpeed

– короткая, ноочень емкаястатья.

УтилитаGprof2Dot позволяетвизуализироватьвыходныеданныепрофайлераввидеграфа

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

Иногдадостаточносделатьфинтушами: зачемусложнятьмедленно работающийкод, еслиможнопростозаменитьвиртуальнуюмашину, на которойонвыполняется, наболеебыструю? Деловтом, чтостандартная реализацияязыка(СPython) передвыполнениемподпрограммкомпилируетихвсвоевнутреннеепредставление— байт-код(что-товроде высокоуровневогоассемблера). Этостандартныйподходреализации интерпретаторов. Ониспользуетсяприреализациимногихдругихтех-

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

Нобайт-код— этоещенемашинныеинструкции, которыеподаютсяпроцессору. Еготоженужноинтерпретировать! Почемубынесделатьтак, чтобывыполняемаяпрограмманекомпилироваласьинтерпретаторомв байт-код, апереводиласьнепосредственновпроцессорныекоманды? Такойподходширокоиспользуется (например, в.Net) иназываетсяJITкомпиляцией.

104

XÀÊÅÐ 03 /123/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

codingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Сравнениескоростиработыразныхматематическихпакетов. Python + NumPy работаеттакжебыстро, какиMatLab. ЗаточистыйPython — в дваразамедленнее

СуществуетмодульрасширениядляCPython, которыйдобавляет возможностиJIT-компиляциивинтерпретатор. Имяему— PsyCo. Для инициализациидостаточнонаписатьвсеготристрочкивглавноммодулепрограммы— дальнейшееиспользованиеабсолютнопрозрачнодля программиста. Именнопоэтомумодульлегковключаетсявужеготовые проекты. Рассмотримвариантегоиспользования. Вставьэтоткодвначалосвоегоглавногомодуля, иPsyCo заработаетпополнойпрограмме:

import psyco psyco.full()

from psyco.classes import *

# Текст программы

Этотмодульобладаетболеебогатымивозможностямидлянастройки. Например, функцияprofile() позволяетPsyCo произвестиревизию имеющихсяфункцийиавтоматическиопределитьте, длякоторых оптимизациябудетиметьсмысл. Длякаждойфункции производится приблизительнаяоценкаотношенияпроизводительностисоптимизациейибезнее. Пользовательможетзадатьпороготношения, прикоторомоптимизациябудетприменяться. Можешь, например, сказать: «Не запускайJIT-компилятордляфункцииfoo, еслиожидаемоеповышение производительностиниже20%». Кромеэтого, PsyCo позволяетзадавать ограничениянаиспользуемуюпамятьивестилогсвоейработы.

ВстандартнойбиблиотекеPython естьнебольшойскриптpystone.py, тестирующийпроизводительностьинтерпретаторанабазовыхоперациях(вызовметодов, поискимен, сравнениестрокит.п). Япопробовал сравнитьегопроизводительностьс PsyCo ибез. Таквот, включение PsyCo ускоряетработутестаболеечемна450%! Конечно, этосинтетическийтест, внемпростомногократнопрогоняетсяодниитотжеметод.

ВреальныхпроектахPsyCo стабильнодаетповышениепроизводительностиприблизительнона20% ивыше.

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

if __name__ == '__main__': try:

import psyco

Ещев2001 годунаPython 1.5 быланаписанавсялогикаодногоизсамых кровавых3d-шутеров— Blade of Darkness, чтокосвенноподтверждает егопроизводительность. Смотрисам, 370 тысячстроккода, исходники открыты!

psyco.full()

# необходимая инициализация except ImportError:

pass

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

НасегодняшнийденьPsyCo пересталинтенсивноразвиваться, таккак разработчикизанялисьболеемасштабнымдетищем— проектомPyPy. Несмотрянаэто, PsyCo нетеряетсвоейактуальности.

СТРАТЕГИЯ

ИзвестныйспециалиствобластикомпьютерныхнаукДональдКнут говорит, чторанняяоптимизация— кореньвсехзол. Незряэтислова такчастоцитируютвспециальнойлитературеисвободноминтернете! Напрактикеполучается, чтоузкиеместавпрограммномкоденаходятсясовсемнетам, гдеихобычноищут. Действительно, сложность компиляторовсталанастольковысока, чторедкоудаетсяугадать, какой именномашинныйкодбудетсгенерировандажедлятакихнизкоуровневыхязыков, какС. Болеетого, усложниласьисаматехника, на которойвыполняютсяпрограммы. Имеяассемблерныйкод, итотрудно безиспытанийсказать, насколькоэффективносовременныйпроцессорбудетвыполнятьтеилииныеегокуски. Внашемслучаепоявляется ещеодиносложняющийфактор— этоинтерпретатор. Оптимизирован онможетбытьмногимиспособами, иоднаитажепрограмманаразных реализацияхPython будетработатьсовершеннопо-разному.

Я (вместе с Дональдом Кнутом) советую тебе не заморачиваться на оптимизации раньше времени. Всегда пиши лаконичный и наглядный код. Представь, что ты создаешь код в первую очередь не для машины, а для человека, который будет его читать. Ускорить хорошо продуманную и спроектированную программу гораздо легче, чем кривую, но «оптимизированную». Если ты все же недоволен скоростью работы своего кода, обязательно сперва погоняй программу профайлером. Выяви самые узкие места, и начинай их устранять только после того, как точно убедишься в эффективности выбранных методов. И не забудь, что оптимизацию всегда нужно начинать с переработки алгоритмов. Сокращение времени итерации циклов ничто, если есть возможность на порядок уменьшить их количество. Поэтому лучшим инструментом повышения эффективности были и остаются мозги! z

XÀÊÅÐ 03 /123/ 09

105

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

w Click

 

BUY

>>m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

phreaking

ЕВГЕНИЙ «VSHMUK» БЕЙСЕМБАЕВ

/ DIVER@EDU.IOFFE.RU /

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

VERILOG

КАК ОБРАЗ ЖИЗНИ

>> ИЗУЧАЕМ ЯЗЫКИОПИСАНИЯЖЕЛЕЗАНАПРИМЕРЕVERILOG

ВпрошлыхсвоихстатьяхянеразупоминалпроПЛИС(ПрограммируемыеЛогическиеИнтегральныеСхемы). Еслинечитал, товкратценапомню: ПЛИС

— этотакойчип, наосновекоторогоможносоздатьсобственныймикропроцессор, идеальнозаточенныйподтвоизадачи. ДляегоописаниямыиспользовалиспециальноразработанныйязыкVerilog, такназываемыйHDL (Hardware Description Language). Обосновахпрограммированиянатакомнепривычном языкесегодняипойдетречь.

erilog былпридуманв1985 году, вСША. ВскореИнститут V ЭлектроинжененроввзялегозастандартIEEE 1364, ина текущиймоментсуществуетнесколькорасширенийязыка

(Verilog-2001, SystemVerilog — http:/ /en.wikipedia.org/wiki/ SystemVerilog), кучасвязокиинтерфейсовкС-подобнымязыкам. В общем, разновидностейVerilog’апридуманонемало. Каждаякорпо- рация-производительПЛИСзатачиваетязыкикомпиляторподсвои нужды, поэтому, прочитавобинтересномприемевучебнике, будьготов ктому, чтокакой-нибудьAltera Quartus этотприемнепереварит, итебе придетсяпридумыватьчто-тосвое.

НогиуэтогоязыкарастутизизвестноготебеC, — онсчитаетсяменее громоздкимиболеепростымвреализации.

ГлавныйконкурентVerilog’а — VHDL, напоминающийязыкиADA и Pascal — такжеявляетсястандартом, ноиспользоватьмыегонебудем, можешьпронегопочитатьотдельно. Приэтомуязыковбольшесходств, чемразличий, поэтому, оседлаводинизних, тысможешьслегкостью переключитьсянадругой, еслионвдругприглянетсябольше.

ЧТОЕСТЬHDL?

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

СовсемнеобязательноHDL описываетмикросхемуилиПЛИС. Нанем, посути, можнонакодить, чтоугодно— скажем, устройство, которое никогданебудетреализовановпринципе. Илистарыйламповый телевизор. Илимаятниковыечасы. Дажезапаяннуюсдвухсторон металлическуюкружкуможнотакилииначеописатьнаHDL, потомукак онажелезная(hardware) итыееможешьпотрогать:). Все, чтоможно представитьблок-схемой, пишетсязапросто.

Главнаясложность, скоторойсталкиваетсяпрограммист, начинающий писатьнаHDL, — емунеобходимоосознать, чтовеськодбудетвитогеисполнятьсяодновременно. Какшестеренкивчасахвращаютсясинхроннопособытиюмаятника, такиоперациивнутрипроцессоравыполняютсясразуже, параллельно, успеваядонаступленияследующеготакта!

Грубоговоря, вэтомиестьотличиеалгоритмическихязыковтипаСили Pascal отHDL-подобных. Еслипервые«указывают» некоторомуабстрак- тномуроботу-исполнителюпоследовательностьдействий, товторые описываютвнутренностисамого«исполнителя», поведениекоторого будетзависетьотэтихсамыхвнутренностей.

Зачемжеописыватьэтивнутренности, спросишьты, когдаможноописатьповедение?

Отвечаю. Допустим, цельжизникакого-нибудьробота— перевозить поддоныспеченькамиизпечкивупаковочныйцех. Естественно, приделыватькнемуманипуляторы, например, дляперевозкибутылок лимонада, смыслаособогонет. АтвойIntel Core, вкоторыйтызагружаешьсвежескомпиленнуюсишнуюпрогу, какразиявляетсямегауниверсальнымроботом, которыйможетделатьабсолютновсе. Невсегдаине

106

XÀÊÅÐ 03 /123/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

phreakingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

АнализисполнениякодавQuartus 8.0

Последовательные операторы

Внутри процессов типа always надо использовать обыкновенные и

// Начали копирование в reg1.

привычные тебе «последовательные» операторы. Привожу краткий

//Мгновенно перескочили на следующую строчку.

список того, что ты можешь использовать в Verilog’е.

reg3<=reg4;

1.Оператор ожидания. На этом операторе мы «висим» и ждем чего-

// Делаем что-то, не связанное

нибудь.

//с чтением или записью в reg1.

 

......

wait reg1==reg2; //Стоим на месте,

// Где-то тут завершилась запись в reg1.

// пока условие не будет истинно

 

@ (A or B)

4. Условный. Тут сложностей нет.

//Оператор события.

 

//Ждем, пока A или B не изменится

if (reg1==2'b11) begin

@ (posedge C or negedge D)

reg2<=0;

 

end

В последнем примере слова posedge и negedge внутри списка чувстви-

else begin

тельности обозначают ожидание фронта и среза сигналов. То есть,

reg2<=reg2+1’b1;

как только значение С начнет меняться с 0 на 1 или D — с 1 на 0, тут

end

же сработает событие. Зачем это надо? Любой процессор получает

 

тактовую частоту на вход. Это те самые гигагерцы, на которые ты

5.Оператор выбора. Сложностей тоже нет.

смотришь при покупке и дальнейшем разгоне твоего камня. Для

 

синхронности операций внутри ядра все должно начинаться на каж-

parameter WRITE = 2'b11, READ = 2'b10, NONE = 2'b00;

дый новый фронт сигнала тактовой частоты. А в Verilog’е это будет

//Прописали константы

записываться как «always @(posedge sysclock)...».

case (reg1)

2.Присваивание. Следующая операция не начнется до его заверше-

WRITE: reg2<=reg2+1'b1;

íèÿ.

READ,NONE: begin

 

reg2<=0;

reg1=reg2;

end

 

default:

3.Неблокирующее присваивание. Советую тебе обратить внимание

reg2<=0;

на эту штуку. Дело в том, что операция установки регистра занимает

endcase

определенное время. Но зачем нам стоять на месте и ждать, пока

 

копирование завершится (оператор «=»), если мы можем парал-

6.Оператор цикла. Есть виды for, while, repeat, forever.

лельно выполнять еще кучу несвязанных с регистром дел? Тогда мы

• forever оператор — выполняем оператор бесконечно.

используем неблокирующее присваивание, при котором перескок

• repeat (кол-во раз) оператор — повторяем оператор нужное коли-

на следующую операцию идет сразу после того, как регистр начнет

чество раз.

устанавливаться. Хочешь по-настоящему быструю систему? Всегда

• while (выражение) оператор — повторяем оператор, пока выраже-

используй неблокирующий оператор.

ние истинно.

 

• for (начальное,условие,приращение) оператор — обыкновенный

reg1<=reg2;

öèêë «for», êàê è â Ñè.

XÀÊÅÐ 03 /123/ 09

107

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

 

phreaking

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Блок-схематвоегоисходникавКвартусе. Оченьнагляднаяштука

длявсехзадачнужентакоймонстр. ТогдатыберешьHDL ипишешьсвой проц, которыйпочтиничегонеумеет, ното, чтоумеет— делаетбыстро, эффективноибезпотреблениясотенваттмощности!

ЧТОТЫДОЛЖЕНЗНАТЬ

Учти, именноHDL-языкисейчасстановятсявсеболеевостребован- ными. Корпорациивплотнуюприблизилисвоипроцессорыкпорогу частоты, итеперьдляувеличенияпроизводительностиимприходится оптимизироватьипараллелитьих. Тыможешьсамтренироваться создаватьсвоиустройства, простокупивилиспаявотладочнуюплату сAltera Cyclone искачавбесплатныйкомпиляторQuartus сaltera.com. Крутойкриптоанализаторилибрутфорсер, работающийвразыбыстрее

Четырехзначный

алфавит

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

4’b10zz

//Старший бит порта драйвит единицу, третий драйвит ноль, а два младших — отключены от шины

РазныеПЛИСразныхкомпаний

современныхпроцессоровиприэтомленивостоящийнаполочке, еще никомувхозяйственемешал!

Дляпростогопрограммированиябылобынеплохо, чтобыты, несмотря надругойпринципHDL, неплоховладелСиилиАссемблер. Знание болеевысокоуровневыхязыковтожеподойдет, нобудьготовктому, что некоторыетонкостиработыпроцессоровокажутсясюрпризом. Скомпилированныйфайл-«прошивку» тебезахочетсязалитьвПЛИСи потестировать, каконоработаетнареальномжелезе. Поэтомузнание основэлектроники, умениеконфигурироватьпортымикросхемтакже будутнелишними.

Итак, цельсозданияязыковописанияжелезапонятна. Разберемсинтаксис. Какяужеговорил, Verilog оченьпохожнаязыкС.

БАЗОВЫЙСИНТАКСИС

1.Комментарии,имена,константы,числа.

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

108

XÀÊÅÐ 03 /123/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

phreakingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Сообщениякомпиляторавмоментсборки

//Это комментарий /*

Здесь фантазии по поводу светлого будущего */

ВVerilog’еимя(идентификатор) — этопоследовательностьбуквицифр, знаков«$» и«_», причемначинатьсяонообязанонесцифры. Регистр имеетзначение.

Еслиначальныйсимвол— «\», тоследомзанимможетидтилюбая последовательностьсимволов. Все, чтодопробела, будетсчитатьсякор-

ректнымименем. Например: «Character», «cHaracter», «$Character», «\c+Ha^racter».

КонстантывVerilog’еимеютособуюформузаписи. Сначалаидетразрядностьчисла, потомкавычка(‘), заним— основаниесистемысчисления (b, o, d, h) исамицифры. Примеры:

бываюттипыinteger, time, real идругие. Новближайшеевремяэто тебенепонадобится, поэтомусчитай, чтопеременнаявVerilog’еиесть регистр.

Кстати, массивыздесьтожеесть!

reg [2:6] Array [0:5]; //6 пятибитных векторов.

3.Сигналы(wire).

Этоособыйвидобъектов, аналогомкоторомувалгоритмическихязыках, полагаю, являютсяуказатели. Такназываемое«соединение-цепь» или ярлык, связывающийчастисхемымеждусобой.

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

reg [7:0]device_config;

"7"h7F" //семибитное число 127, записанное в шестнадца-

 

wire port_0_direction = device_config[0];

теричной (h — hex) форме.

 

wire port_1_direction = device_config[1];

"7"b1111_1111' //то же самое число, записанное в двоич-

 

...Пропущено...

 

ной форме. Знак "_" игнорируется.

 

if (!port_0_direction)

device_data[0] <= par_

"10"b1111_1111" // число 127, занимающее не 7 бит, а 10.

 

port_0[7:0];

 

То есть, равно 000_1111_1111.

 

 

 

//Теперь, если попытаться записать его в какой-нибудь

 

Связьport_0_direction теперьтождественноравнамладшемубитуре-

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

 

гистраdevice_config[0]. Сталоудобнее: ненадозапоминать, чтотамикак,

"18" // число, записанное в стандартной форме, будет при-

 

вбольшомрегистреdevice_config, аглавное— мыможемвнужныймо-

ведено к десятичному Integer.

 

ментпрограммнойлогикойпереброситьэтотсигналнадругойрегистр:

"0.5" // будет приведено к типу float.

 

 

 

port_0_direction = device_config[0] & device_config[2];

 

 

 

 

2.Регистры.

 

 

 

 

То, чтотыпривыкназыватьпеременной, вVerilog’еназываетсярегист-

Теперьport_0_direction будетравен1, толькоеслиединицеравны0 и2

ром. Например:

битырегистраdevice_config.

 

 

 

СвязимогутбытьтакжетипаМонтажноеИ(wand), МонтажноеИЛИ(wor),

reg [7:0] character;

tri0, tri1 — имногодругих, ноонирежеиспользуются.

4.Процессыalways&initial.

Такмыобъявилирегистршириной8 бит(отнулядосеми) сименем character. Какивпеременную, врегистрможнокластьзначениеичитать егооттуда:

reg [7:0] var1;

reg [15:0] var2 = 16’b1001_0110_1011_1101;

...skip...

var1 [7:0] = var2[15:8];

Здесьмыкладемврегистрvar1 старшуюполовинурегистраvar2, которыйвдвараза«шире». Витоге, тамбудетлежатьчисло8’b1001_0110, то есть0x96h.

Примечание: строгоговоря, вVerilog’етожеестьнормальныечеловеческиепеременные, причемрегистр— этопеременнаятипаreg. Также

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

reg[7:0] counter;

 

always

//always обязан содержать хотя бы

// один оператор ожидания, что мы и видим

@(posedge Sysclock)

//Событие без ";"

// является условием запуска следующей за ним опер. группы begin

counter = counter + 1'b1;

end

XÀÊÅÐ 03 /123/ 09

109

 

Соседние файлы в папке журнал хакер