книги хакеры / журнал хакер / 123_Optimized
.pdf
|
|
|
|
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 |
|