Выпуск: XXI Кодировка: win Подписчиков: 86
Содержание:
  1.  Millenium по... .........................................................................................................
  2.  Мифология AMD ..................................................... железо .................................
  3.  Кто же изменит мир? .............................................................................................
  4.  Управление сценариями просмотра web-страниц

Millenium по... <CWDS team>

 Привет все! Как Вы смогли заметить у нас новый дизайн, мы искренне надеемся, что он вам понравится! Мы дарим вам также наш видео ролик almanach.zip (418 Kb). Пишите свои комментарии, как обычно нам. 21-ть первый выпуск, 21-ый век, мы решили сделать нечто особенное! И вот, новый дизайн, новая эпоха (поддержка NN :-) ), хорошие статьи остаются на месте! 

 


 
Мифология AMD. 18 месяцев спустя. <Роман Косячков>

 Тверже всего мы верим
в то, о чем меньше всего знаем.
Мишель де Монтень


Еще в сентябре прошлого года на одном сайте я опубликовал колонку редактора под названием "Предмет веры". Кратко перескажу содержание.
Колонка начиналась с притчи о том, как некий безбожник-полемист пришел в храм и обратился к батюшке с предложением подискутировать по одному очень частному богословскому вопросу. Батюшка предложение принял. Выбрали место и время. Встретились. Четко сформулировали этот частный богословский вопрос, и, по праву гостя, первым выпало защищать свою позицию безбожнику. "Для начала, - заявил методичный полемист, - я сформулирую несколько общих аксиом и, уже на их основе, буду высказывать свои предположения и их доказательства". "Не возражаю", - опрометчиво согласился батюшка. "Итак, аксиома первая, - приступил к делу безбожник, - и основная: бога нет".
До второй аксиомы, как вы понимаете, дело уже не дошло. На самом деле безбожник и священник вряд ли могут конструктивно подискутировать по частным проблемам богословия, и дискуссия между ними возможна только по принципиальным вопросам, таким как: +А есть ли бог?+. Эта притча с неким религиозным бэкграундом была рассказана в колонке с единственной целью - показать, что в огромном числе принципиальных дискуссий их предмет одновременно является для участников и предметом веры. Раз так, то конструктивная дискуссия просто невозможна. Развивая идею, высказанную в онлайновой колонке, хочу отметить, что подмена анализа фактов обсуждением псевдорелигиозных догм свойственна не только дискуссиям. К сожалению, тем же грешат практически все стороны человеческой деятельности, в той или иной степени, разумеется.
Вспомнил я об этой колонке вот по какому поводу. В конце января, получив пресс-релизы от Intel и AMD с итогами деятельности этих компаний за четвертый квартал 2000 года и за весь год в целом, я на основе их содержания сделал для себя ряд выводов и благополучно про эти пресс-релизы забыл. В конце концов, содержание подобных документов еженедельно доводит до читателей Сергей Леонов в +Каналах+, и не вижу никаких причин перебивать у него хлеб. Однако вспомнить о них пришлось. Дело в том, что на глаза постоянно попадалась аналитика, посвященная итогам года на микропроцессорном рынке, с выводами которой я никак не мог согласиться, поскольку они не были подкреплены самым главным - фактами. Зато предубеждений, домыслов и даже отсутствия здравого смысла было предостаточно. Ну ладно, +зашоренность+ и леность отдельных журналистов, не удосужившихся хотя бы внимательно прочитать вышеупомянутые пресс-релизы, вполне объяснима: компьютерная журналистика у нас все еще на этапе становления. Описывать отдельные устройства мы уже почти научились, со временем, возможно, научимся и компьютерный рынок анализировать, что, безусловно, намного сложнее. Для этого, как минимум, надо было в свое время закончить университет вместе с людьми масштаба К. Барретта или У. Сандерса, а затем не один десяток лет поработать в отрасли. На сегодняшний день таких IT-журналистов и аналитиков в России нет. Однако тема меня зацепила, и на сайте нашего журнала был проведен незамысловатый опрос: +Какая фирма, по вашему мнению, является лидером рынка микропроцессоров для PC по итогам 2000 года?+ Вариантов ответа было всего четыре: AMD, Intel, VIA и +Не знаю+. Результаты опроса оказались довольно неожиданными: более 40 процентов назвали лидером фирму AMD. И они действительно верят в этот миф. 


Лидер рынка
Понятие +лидер рынка+ довольно расплывчато. А действительно, по каким параметрам выявлять лидера? По годовым объемам продаж? По принадлежащей ему доле рынка? По рыночной стоимости компании? По чистой прибыли, полученной за год? По величине выплаченных акционерам дивидендов? По темпам роста? Этот перечень финансовых параметров можно продолжать долго. А может быть, надо использовать некие технологические параметры, причем для каждого рынка свои? Для микропроцессорного, к примеру, - сравнивать технологические процессы изготовления микросхем. Освоил 0,13 мкм в 2000 году - лидер рынка, не освоил - аутсайдер. Или: объявил первым микропроцессор с тактовой частотой 1 ГГц - молодец, а был вторым - извини. Может, лидерство стоит определять по числу членов фэн-клубов? Или по количеству наград в компьютерной прессе? Я не могу ответить однозначно, поэтому лидера рынка микропроцессоров для PC попробую выявить на основе здравого смысла.


Денежки любят счет. Так посчитаем их в чужих карманах!
Денежки будем считать с некоторой оговоркой. Дело в том, что и Intel, и AMD выпускают не только микропроцессоры, но и микросхемы флэш-памяти, системные чипсеты, а Intel - еще и материнские платы, коммуникационное оборудование и т. п. Однако восемь-девять долларов дохода из каждых десяти эти компании получают все-таки на микропроцессорном рынке, то есть именно производство микропроцессоров определяет профиль их деятельности.
За 2000 год Intel продала продукции на 33,7 млрд. долларов, а фирма, оспаривающая у нее лидерство, то есть AMD, - на 4,6 миллиарда. Разница - в 7,3 раза. Чистая прибыль за тот же период достигла у Intel 12,1 млрд. долларов (на 49 процентов больше, чем в 1999 году, когда дела у AMD шли еще очень плохо!) против 983 млн. долларов у AMD, причем около 189,2 млн. долларов было получено AMD за счет продажи своего телекоммуникационного подразделения и погашения облигаций (тем самым AMD в 2000 году ушла с рынка телекоммуникационного оборудования). На каждый доллар поставленного потребителям оборудования Intel получила 35 центов чистой прибыли, а AMD - 21 цент. Если исключить из расчета прибыль от продажи телекоммуникационного отделения, то эта цифра составит для AMD всего лишь 17 центов на доллар, то есть прибыльность бизнеса у AMD вдвое ниже, чем у Intel. Дам маленький комментарий: этот результат был вполне предсказуем. AMD на протяжении всего года проводила агрессивную ценовую политику, предлагая на рынке процессоры сравнимой с продукцией Intel производительности за существенно меньшую цену. Косвенно этого шага потребовала и дороговизна системных плат под процессоры семейства К7, цены на которые достигли сопоставимого с системными платами для процессоров Intel уровня только во второй половине 2000 года, да и то далеко не везде. Таким образом, во многом за счет усилий самой фирмы AMD цена систем на основе процессоров семейства К7 поддерживалась в течение года на вполне конкурентном уровне. Другой важной причиной, толкающей AMD на ценовую войну с Intel, стала необходимость заметного увеличения своей доли на рынке микропроцессоров для PC.
Удалось ли AMD решить эту задачу? В провальном 1999 году она сумела продать всего лишь 18,8 млн. микропроцессоров. В 2000 году эта цифра заметно выросла - 26,5 млн. процессоров, то есть более чем в 1,4 раза. Хороший результат, ничего не скажешь. Однако стоит посмотреть на него внимательнее. Первые три квартала 1999 года были для AMD далеко не лучшими, и только четвертый квартал, когда сказался эффект поступления на рынок процессоров Athlon в заметных количествах, оказался прибыльным. Именно в этом квартале AMD удалось продать более 6 млн. микропроцессоров. Примем этот квартал за исходную точку. Можно было бы ожидать, что по мере увеличения объемов выпуска процессоров последнего поколения ежеквартальный объем продаж микропроцессоров AMD в 2000 году заметно возрастет. Однако этого не произошло. В среднем ежеквартально фирме AMD удавалось продавать чуть более 6,5 млн. процессоров. Рост по сравнению с 4-м кварталом 1999 года, безусловно, есть, но он совсем не впечатляет. В течение года шло замещение устаревших процессоров семейства К6 на процессоры семейства К7, которых выпускалось в начале года чуть более миллиона штук в квартал, а к концу года, видимо, более 5 млн. штук в квартал (AMD планировала к концу года достичь объема выпуска современных моделей процессоров около 7,2 млн. штук в квартал). На сегодняшний день AMD, по ее собственным уверениям, контролирует около 17 процентов рынка микропроцессоров для PC. То есть 6,8-6,9 млн. штук в квартал составляют 17 процентов рынка на конец 2000 года. Сколько же она имела в конце 1999 года со своими шестью миллионами? Столько же, а может быть, и больше. Объем рынка микропроцессоров за 2000 год заметно вырос, процентов на 10-15, по различным оценкам, однако этот рост был покрыт преимущественно продукцией Intel. Более того, в 2000 году спрос на процессоры Intel существенно превышал предложение. Эту разницу лишь в некоторой степени смягчили процессоры от AMD, несмотря на то что фирма имела в течение всего года свободные производственные мощности и даже предлагала их на рынке. То есть одной из своих главных целей - заметного увеличения занимаемой доли рынка - AMD добиться не удалось. А что удалось? Удалось практически полностью заместить процессоры семейства К6 процессорами семейства К7, что привело к стабильной прибыли на протяжении всего года, а также к сохранению некоего +статус-кво+ с Intel. Удалось также добиться признания практически у всех крупнейших производителей персональных компьютеров. Это, безусловно, серьезные достижения. Без всякого сарказма.
А сколько процессоров для PC поставила за 2000 год фирма Intel? Это довольно сложный вопрос, так как сама она подобных официальных данных традиционно не публикует. В ежеквартальных пресс-релизах уже который год присутствует одна и та же стандартная фраза: +Объем поставок микропроцессоров достиг в N-м квартале рекордного уровня+. И всё. Однако попробуем хотя бы оценить объем поставок. Фирма AMD заявляет о своем контроле над 17 процентами рынка микропроцессоров для PC. Предположим, что приведенная цифра мало менялась в течение года. Тогда на оставшихся производителей приходится не более 83 процентов. Пусть VIA и другие мелкие производители микропроцессоров контролируют 3 процента рынка, тогда на долю Intel приходится не менее 80 процентов, что составляет около 125 млн. чипов в год. Это в 4,7 раза больше, чем поставляет на рынок AMD. Оценка, конечно, довольно грубая, хотя бы потому, что не известно, включает ли фирма AMD в понятие +микропроцессоры для PC+ процессоры для мобильных компьютеров (ноутбуков) и серверов. Будем считать, что включает. Что ж, попробуем посчитать по-другому. Независимые источники оценили объем поставок микропроцессоров для PC за 4-й квартал 2000 года в 40 млн. штук. Отнимаем известную долю AMD, VIA и остальных и получаем приблизительно 31-32 млн. процессоров от Intel за четвертый квартал, весьма сложный из-за замедления темпов роста экономики в США и в мире в целом. И за весь 2000 год получаем весьма похожую величину: 124-128 млн. микропроцессоров. Оперировать цифрами можно и дальше, только какой в этом смысл? Лидера рынка микропроцессоров для PC по финансовым показателям можно разглядеть невооруженным глазом. Если захотеть его увидеть.


Технологические гонки. За лидером
В 2000 году AMD записала себе в актив немало технологических достижений. Это перевод значительной части выпускаемых микропроцессоров на производство с проектными нормами 0,18 мкм и с так называемыми медными соединениями, а также существенная модернизация процессоров (новая корпусировка под Socket A, интегрированный кэш второго уровня, выпуск +бюджетного+ процессора Duron и т. п.). Весомым стало объявление и поставка на рынок микропроцессоров Athlon с тактовой частотой 1 ГГц, а к концу года и 1,2 ГГц. Всё это так. Однако и компания Intel не потеряла год даром. И производство по проектными нормам 0,18 мкм стало основным для всех семейств процессоров, включая +бюджетный+ Celeron, и процессоры Pentium III преодолели гигагерцовый рубеж. Помимо этого произошли еще два важнейших события: объявлена микропроцессорная архитектура NetBurst, и в ноябре 2000 года выпущен первый микропроцессор на ее основе (Pentium 4) с тактовой частотой 1,3, 1,4 и 1,5 ГГц. Если же говорить о технологиях производственных, то в 2000 году Intel сумела так качественно подготовить производство Pentium 4, что темпы увеличения объемов производства этого процессора примерно вшестеро превзошли аналогичный показатель для процессоров семейства P6. Выпустив в конце 2000 года несколько сотен тысяч чипов Pentium 4, Intel планирует в первом квартале 2001 года довести их производство до 1 миллиона, а к концу 2001 года - до 15-20 млн. штук ежеквартально, превзойдя, таким образом, объем выпуска процессоров Pentium III. И еще одним важным технологическим достижением стало завершение разработки новой 0,13-микронной технологии изготовления микросхем. Ее внедрение в производственный процесс произойдет в этом году. Intel первой в отрасли завершила работу над технологией и довела ее до готовности к промышленному применению. О внедрении технологии энергосбережения SpeedStep для мобильных процессоров, о мобильных Pentium III, потребляющих менее 1 Вт, особенно распространяться не буду, так как AMD в 2000 году на этом рынке практически ничем себя не проявила, как и на рынке процессоров для серверов. Впрочем, в 2001 году ситуация изменится: уже появился мобильный Duron (правда, с довольно большим энергопотреблением), и вот-вот появится возможность создавать двухпроцессорные конфигурации на основе процессоров Athlon, то есть AMD каким-то образом заявит себя и на рынке серверов. Однако это история не прошлого, а уже текущего года.
Несколько слов о сравнительной производительности микропроцессоров от Intel и AMD. Полемика о том, какой процессор быстрее при равной тактовой частоте - Athlon или Pentium III, не утихала весь год. Athlon предпочтительнее выглядел на большинстве распространенных бенчмарков, а Pentium III брал свое при исполнении ряда приложений, причем самыми весомыми для большинства пользователей-энтузиастов (людей, как правило, молодых) оказались дополнительные
7-10 FPS в +Quake III+ при низких разрешениях и мощном 3D-ускорителе. В целом разница в производительности укладывалась в несколько процентов, что, на мой взгляд, удивительно, так как конкурировали между собой процессоры с архитектурой 1995 года (P6) и 1999 года (К7). Эта разница должна быть больше. Поэтому при выборе процессора главную роль играли цена систем на его основе и их доступность на рынке, а также стабильность работы систем с различным оборудованием и личные субъективные предпочтения. Одно время AMD предлагала на рынке процессоры с более высокой тактовой частотой, чем у процессоров Intel, но к концу года ситуация сменилась на обратную. Сейчас доступны процессоры Pentium 4 с тактовой частотой до 1,5 ГГц, тем не менее полемика по поводу производительности продолжается. В ряде тестов Pentium 4 уступает и Pentium III, и Athlon - несмотря на более высокую тактовую частоту. На других тестах, связанных преимущественно с потоковой обработкой мультимедийной информации и оптимизированных под SSE2, Pentium 4 превосходит по производительности процессоры предыдущего поколения в разы. Эта полемика скорее всего прекратится сама собой по одной простой причине: Pentium 4 может делать то, на что другие микропроцессоры для PC неспособны в принципе. И по мере
появления приложений, использующих возможности Pentium 4 на +полную катушку+, этот факт будет все более и более очевидным. Впрочем, и сегодня от Pentium 4 можно получить заметный прирост производительности при исполнении +тяжелых+ приложений, таких как современные 3D-игры: в той же +Quake III+, хотя игра пока не оптимизирована под SSE2, можно получить лишних 40-50 FPS.
Так что лидера рынка микропроцессоров для PC в 2000 году на основании технологических достижений назвать тоже нетрудно. Сделайте это сами.
Подведем итоги
В упомянутой +Мифологии AMD+ я рассказывал, как раз за разом заявления AMD о конкурентоспособности ее процессоров оказывались мифом. В истекшем году обвинять фирму в чем-либо подобном нет никаких оснований. Она производит хорошие процессоры и продает их по хорошей цене. Однако родились новые мифы, теперь уже о лидерстве AMD на микропроцессорном рынке. Правда, в нынешней ситуации есть одна тонкость. Автором мифов о самой себе фирма чаще всего уже не является, а мифотворчеством занимается так называемое community AMD, то есть сообщество ее стойких поклонников. И этот факт может только радовать, будучи явным признаком здоровья компании. Пожелаем ей удачи. В гонке за лидером.

 

 


Кто же изменит мир? <Игорь Гордиенко>

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


Сознание людей сплющили схемы сегодняшней действительности. Как известно, возрастной консерватизм - не только симптом зреющего склероза, но и непреложное условие социальной стабильности. Более того, лишенные консерватизма, взрослые люди, как правило, оказываются в заведениях (прибегаю к эвфемизму), корректирующих или же тормозящих психические отправления.
С большой вероятностью лет через пять компьютеры внедрятся в такие неприметные, обыденные вещи, как дверные ручки, позволяя распознать человека и запомнить, кто и когда вошел и вышел; распылители воды для душа, которые воспроизведут любимый температурный режим для каждого обитателя жилья; осветительные приборы, настраивающие комфортный спектр и яркость, и т. д. Интуитивно очевидные применения компьютерных технологий можно обнаружить где угодно. Но не менее очевидно и то, что предвосхищать и проектировать подобные вещи могут только творческие личности, лишенные предубеждений и консерватизма. Может быть, и неудивительно, но самыми подходящими персонами такого рода оказываются дети дошкольного возраста.
Профессор Эллисон Дрюин (Allison Druin), специалист по высоким технологиям для детей (вот так специальность!), и профессор Джеймс Хендлер (James Hendler), специалист в области искусственного интеллекта и роботехники, сотрудники университета штата Мэриленд (в Колледж-Парк), сделали ставку на своих маленьких воспитанников.
В комнате для игр царит творческий беспорядок. На полу валяются картонные ящики, из которых ребятишки строят лабиринты, домики, крепости. На стенах висят пульты управления и электронные графические панели, пояснительные таблицы и диаграммы. Суть дела в том, что во все игрушки и в костюмчики детишек встроены электронные модули беспроводной связи. Когда малыши пробираются в возведенных ими самими сооружениях, внешние модули взаимодействуют с модулями, встроенными в одежду, и с сервером. Таким образом, система строит искусственный мир: включается свет, звуковая сигнализация, выстраиваются каналы голосовой связи.
В эксперименте сделана попытка предоставить малышам возможность самим устраивать порядок вещей. Они могут прицеплять компьютерные модули к любым предметам на поле для игр - к коробкам, палочкам, мячам, к чему угодно, превращая игрушки в объекты межкомпьютерных взаимодействий. Коробки превращаются в домики, которые сами знают, сколько малышей в них собралось. Стены домика внезапно оживают, зажигается свет, играет музыка, звучит волшебная сказка.
Важным элементом опыта стал робот Pets2, не только активный, но и эмоциональный. Он может жестами и мимикой выражать настроение; он способен приобретать новые привычки. Для программирования робота исследователи используют некий формальный язык, но дети могут это проделывать с помощью наглядного графического интерфейса. Чем они с удовольствием и занимаются. Все это выглядит как составление целых историй о похождениях робота, которые он потом старательно воспроизводит.
У Pets2 мягкое тело приятной теплой раскраски. Руки, ноги и черты лица можно менять. Вообще, внешне робот выглядит так, что хочется его обнимать и тормошить. Всякие попытки подружить детей с роботами из металла и пластика оказались безуспешными.
Массовое производство Pets2 со сменными руками, глазами, носами начнется уже в этом году. Придумывание историй и сказок в диалоге, возможность, которой обладает Pets2, поможет развить воображение и логическое мышление малышей. А мягкие и умные куклы расширят способности детей-инвалидов к самовыражению и постижению мира.
По мнению Дрюин, интеллектуальными свойствами должны обладать и доска на стене, и парты, замечающие, например, синтаксические и грамматические ошибки, подсказывающие факты из истории или географии. Можно представить и сеансы коллективного творчества, когда образ на общем экране синтезируется из происходящего в электронных тетрадях учеников. Учителю достается роль модератора процесса. Тут кроется главная идея свободолюбивой американской педагогики: не понуждать школьников смирно отсиживать урок, но прививать удовольствие к учебе.
Исследователи не пытаются вытащить из детей некие однозначные парадоксальные ответы. Прежде всего создается атмосфера, стимулирующая желание обсуждать и решать вопросы независимо от взрослых. Примерно через полгода пребывания в такой обстановке малыши становятся такими уверенными в себе, что им кажется, будто +вещи подчиняются их желаниям+. Описанные опыты важны тем, что они прямо и неизбежно изменяют наш мир.
Работая над колонкой, я не мог избавиться от ощущения, что в методологии эксперимента не учтена какая-то важная деталь. В конце концов, я уразумел, в чем дело. Среда, в которую погружены маленькие участники опыта, спроектирована, однако, взрослыми людьми, причем весьма консервативными, каковыми являются любые профессора, в любой стране мира. И возникает очередная и явная версия проблемы о +курице и яйце+. Ирония в том, что именно таким образом наш мир защищается от слишком революционных идей, заставляя опираться на опыт предыдущих поколений. Как бы они тому ни противились+

 


Управление сценариями просмотра web-страниц <Павел Храмцов>
 

Основы подхода к программированию на JavaScript

ПРИМЕРЫ СКРИПТОВ

Единство в многообразии


 

Современные гипертекстовые информационные системы условно можно представить в виде совокупности нескольких компонентов: систем хранения гипертекстовых объектов, систем отображения гипертекстовых объектов, систем подготовки гипертекстовых объектов и систем программирования просмотра совокупности гипертекстовых объектов. С этой точки зрения, технология World Wide Web только к 1996 году получила законченный, функционально полный вид. Первыми были разработаны системы хранения и просмотра (1989-1991), которые продолжают развиваться и в настоящее время. После 1990 года стали появляться первые системы подготовки документов. Наконец, в 1995 году были предложены первые языки управления сценариями просмотра. В данной статье речь пойдет как раз об одном из них - JavaScript.

Программирование процедуры просмотра гипертекстовой базы данных не является изобретением Netscape, Microsoft или Sun. Практически все локальные гипертекстовые системы в той или иной степени имеют программные средства манипулирования гипертекстовыми объектами.

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

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

Браузеры гипертекстовых страниц традиционно называют скриптами (scripts), по аналогии с исполняемыми файлами, написанными для командных интерпретаторов типа sh. Собственно, как это было и раньше в локальных системах, в программировании просмотра гипертекстовых документов World Wide Web существуют два подхода: создание интерпретируемых браузером скриптов или компиляция байт-кода. Первый подход не выходит за рамки традиции World Wide Web, согласно которой для разработки гипертекстовой страницы нужен только обычный текстовый редактор, и сам гипертекстовый документ должен легко читаться человеком-оператором. Второй подход позволяет повысить эффективность исполнения программы и защищенность кода от несанкционированных модификаций. Как первый, так и второй способы опираются на объектно-ориентированный подход к программированию. По поводу байт-кодов, или, как их еще называют, мобильных кодов, написано в контексте технологии программирования Java достаточно много, поэтому сосредоточим свое внимание на скриптах, а точнее, на скриптах, написанных на языке JavaScript.

Основы подхода к программированию на JavaScript

Идея JavaScript очень проста. Все операции, которые можно исполнять в программе на JavaScript, описывают действия над хорошо известными и понятными объектами, которыми являются элементы рабочей области программы Netscape Navigator и контейнеры языка HTML. Собственно объектная ориентированность JavaScript на этом и кончается. Никаких классов объектов, а тем более, наследования в JavaScript нет. Есть только объекты с набором свойств и набор функций над объектами, которые называются методами. Кроме методов существуют и другие функции, больше похожие на функции из традиционных языков программирования, которые позволяют работать со стандартными математическими типами или управлять процессом выполнения программы. Еще в JavaScript есть события - аналог программных прерываний. Эти события также ориентированы на работу в World Wide Web, например загрузка страницы в рабочую область Navigator или выбор гипертекстовой ссылки. Используя события, автор гипертекстовой страницы и программы, ее отображающей, может организовать просмотр динамических объектов, например бегущей строки, или управление многооконным интерфейсом.

Для встраивания скриптов в тело HTML-документа используется контейнер SCRIPT. Не все браузеры способны распознавать и исполнять скрипты, поэтому само тело скрипта помещается в контейнер комментария. Рассмотрим пример 1.

В этом примере в заголовок документа (контейнер HEAD) включен контейнер SCRIPT. До недавнего времени атрибут LANGUAGE в этом контейнере не являлся обязательным. Но с момента выхода VBSCRIPT появился смысл в указании типа языка - Navigator не понимает скриптов на других языках. Отсутствие атрибута может привести к ошибкам при отображении гипертекстовых страниц.

Далее, в тексте страницы определен комментарий, в который включен текст скрипта. Начинается комментарий со строки:

<!- The JavaScript Function Definition

И кончается строкой:

// The end of JavaScript Functions Definition ->

Внутри контейнера SCRIPT определены две функции пользователя: help_win() и main_menu(). Смысл этих функций достаточно прозрачен. Help_win() предназначена для организации контекстно зависимого help, а main_menu() осуществляет допуск пользователя к главному меню Website. Обе функции используют один и тот же метод open (встроенную в JavaScript функцию, которая определена над объектом window) для того, чтобы открыть новое окно Netscape Navigator и загрузить в него гипертекстовые документы. При этом функция main_menu порождает стандартное окно (с кнопочками, иконками и т.п.), а функция help_win() - окно без стандартных атрибутов. У этого окна имеются только линейки прокрутки (scroll bars).

Вызов функций осуществляется после нажатия на соответствующие кнопки, которые определены в HTML-форме help_call. Таким образом, функции будут выполняться только в том случае, если произойдет событие, описанное атрибутом onClick в контейнере INPUT соответствующего поля формы.

Если быть более точным, то приведенный пример - это фрагмент, реализующий регистрацию пользователя. К моменту его выполнения окно главного меню уже открыто, поэтому при выборе кнопки NEXT окно не создается, а текст загружается в уже открытое окно.

Примеры скриптов.
Калькулятор

Теоретизировать на предмет написания скриптов на JavaScript можно долго. Но самый продуктивный способ получить представление о языке - это разбор примеров. Если посмотреть на список этих примеров, который можно найти в соответствующей директории Yahoo, легко убедиться, что больше всего там различного сорта калькуляторов. Разберем программу такого же типа, только это будет не калькулятор, а программа обучения устному счету.

Приведенный пример 2 содержит датчик случайных чисел (функции init и rand), таблицу, реализующую функции кнопок клавиатуры, и блок проверки результата вычислений. После загрузки программы пользователь должен выбрать тип вычислений (+,-), интервал вычислений (в пределах 10, 20, 100) и нажать кнопку "?" для генерации примера. После ввода числа с отображаемой клавиатуры пользователь нажимает на символ "=", что означает исполнить, и система проверяет правильность ответа. Если ответ правильный, то программа выдает "Молодец!", если нет - "Думай!". В системе Windows 3.x нет встроенного датчика случайных чисел, поэтому стандартная функция rand в этой версии JavaScript не реализована. Используемый в данной программе датчик был позаимствован из телеконференции по JavaScript. В скрипте, кроме этого, применяются объект типа "дата" и его методы, а также встроенные функции контроля вводимых данных. Как явствует из примера, обращение к полям HTML-формы представляет собой обращение к структуре, корнем которой является объект "окно", в котором определен объект "документ", внутри которого определена форма, а также ее поля и атрибуты полей. Не у всех полей можно менять значения атрибутов, так, например, атрибут VALUE в кнопке не меняет своего значения, если только не перезагрузить страницу.

Бегущая строка

Другой часто встречающийся пример - бегущая строка. Строка может бежать либо в поле статуса (низ экрана), либо внутри поля формы. Рассмотрим пример 3.1.

Здесь приведен фрагмент страницы компании "Демос", разработанный Дмитрием Алтуховым (ady@demos.su). Как видно из этого примера, прокрутка осуществляется за счет изменения содержания отображаемой переменной msg1. Запускается бегущая строка в момент загрузки страницы по событию onLoad. Из комментария к примеру следует, что автор не несет ответственности за проблемы, которые может данный скрипт породить при его отображении браузером на компьютере пользователя. Собственно проблема вызвана применением функции setTimeout. Изначально предполагалось, что браузер, который поддерживает JavaScript, будет исполняться в среде многопоточных операционных систем. В этом случае к моменту порождения нового потока старый уже завершится, и setTimeout будет, таким образом, порождать последовательно исполняемые потоки. Однако при реализации JavaScript в Netscape Navigator 2.0 не все было выполнено аккуратно, и setTimeout стала просто "пожирать" ресурсы компьютера. Системы Windows 3.x вообще не являются многопоточными, и в них просто происходит переполнение стека при выполнении данного скрипта. Весь вопрос заключается только в том, как быстро "упадет" система, а это зависит от объема исполняемой по setTimeout функции. Самое лучшее, что можно посоветовать, если вдруг на экране появляется прокрутка, - поскорее покинуть такую страницу. Справедливости ради, следует отметить, что прокрутку можно организовать и другими способами, поэтому ее появление не обязательно должно вызывать крах системы или браузера.

Прокручивать можно и вертикальные фрагменты. Достигается это за счет использования полей типа TEXTAREA (пример 3.2).

Собственно все организовано так же, как и в предыдущем примере, только прокрутка осуществляется в поле формы; для этого поля введен параметр переноса текста на новую строку, ширина поля подобрана под размер выводимых строк. Прокрутка осуществляется как по событию onLoad, так и при нажатии на кнопку Start/Stop. В этом случае не надо немедленно покидать страницу с прокруткой - достаточно просто ее остановить.

Идущие часы

Другой, часто встречающийся пример на странице со скриптами JavaScript - идущие часы (пример 4).

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

Часы реализованы в строках, которые следуют за комментарием "//Clock". В них также применяется функция setTimeout и объект DATE. Прежде чем отобразить время, программа получает текущее значение времени через объект DATE. Считается, что после выполнения программы все объекты будут удалены из памяти, что реально не всегда происходит. Для отображения времени используются методы, которые определены для объекта DATE. Значения часов минут и секунд объединяются в строку при помощи операции конкатенации "+", и результат отображается в поле формы.

О бегущей строке мы уже говорили достаточно подробно, поэтому теперь предлагаю обратить внимание на функцию alert в форме kuku. Это встроенная в JavaScript функция, которая предупреждает пользователя о том, что он запускает на сервере программу.

Минимизация-максимизация окна и его удаление

Выполнение вычислений и работа с таблицами весьма популярны, но не столь значимы, как управление окнами браузера. Рассмотрим пример такого управления. Идея состоит в том, чтобы средствами JavaScript реализовать "свертывание" и "развертывание" окна браузера. Примеры 5.1 и 5.2 демонстрируют связанные друг с другом HTML-страницы.

Пример 5.1 сворачивает окно. Для этой цели сначала создается маленькое окно с иконкой, а потом текущее окно удаляется. На самом деле в данном случае надежность работы этого скрипта будет зависеть от алгоритма интерпретации и назначения текущего окна программой интерпретации. В Netscape Navigator 2.0 текущим оставалось окно, в котором исполняется скрипт, поэтому наша программа будет работать правильно. Маленькое окно становится текущим только после удаления большого окна.

Максимизация окна показана на примере 5.2. Данный фрагмент по алгоритму точно совпадает с предыдущим, но выполняет прямо противоположную функцию - разворачивает (восстанавливает) свернутое окно. При этом маленькое окно также удаляется. Собственно, первая страница - это файл iconize.htm, а вторая - test_icon.htm.

Использование окон для построения HELP

В заключение вернемся к первому примеру. В нем был описан вызов, который приводит к открытию окна контекстного help и загрузки в него HTML-страницы. На этой странице есть форма с кнопкой close, при нажатии на которую текущее окно закрывается. Так как в этом случае текущим является окно с help, то закрывается именно оно. Все это замечательно, если не используются фреймы в help. При применении фреймов текущим окном будет не главное окно, а окно фрейма. Если help состоит из нескольких фреймов, то простое выполнение функции window.close() не приведет к ожидаемому результату - закрытию всего окна. Корректнее всего будет загрузить в окно-предшественник (имя по умолчанию - _parent) пустую страницу, сделать ее текущей и после этого удалить. Вся страница, удаляющая окно _parent, состоит из контейнера SCRIPT (пример 6).

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

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

Единство в многообразии

Следует отметить, что JavaScript - это не единственный язык управления сценариями просмотра документов. Microsoft подготовила свою версию аналогичного языка - VBScript на основе Visual Basic. Кроме того, управлять сценарием просмотра можно и из Java-апплетов, что, конечно, сложнее, но зато более надежно и безопасно. При этом программист получает все преимущества наследования и прочие атрибуты объектно-ориентированного программирования. В конце концов, для создания фреймов и окон можно использовать атрибуты соответствующих контейнеров HTML, которые позволяют делить рабочую область экрана на фрагменты, перекрывать объекты и восстанавливать первоначальный вид страницы. Таким образом, к настоящему времени существует по меньшей мере три способа управления сценариями просмотра гипертекстовых баз данных Web, каждый из которых по-своему хорош. Какой из них выбрать - это дело автора Website.

 

Павел Храмцов - руководитель группы РНЦ "Курчатовский Институт". С ним можно связаться по электронной почте: paul@kiae.su

Пример 1.

<HTML>
<!-
Author: Pavel Khramtsov
Date: March 5, 1996
->
<HEAD>
<TITLE>Registration</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!- The JavaScript Functions Definition function help_win()
{Help = window.open("reg_help.htm","Help","scrollbars=yes,resizable=yes")
}
function main_menu()
{Main_menu = window.open("main_m.htm","Main_menu")
}
// The end of JavaScript Functions
//Definition ->
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<TABLE>
<TR><TH><IMG SRC="radleg3.gif"></TH>
<TH><H2>ISTC. Project RADLEG(#245)</H2>
RRC "Kurchatov Institute"<BR>
<I>Dec, 25, 1995</I>
</TH></TR>
</TABLE>
</CENTER>
<HR>
<CENTER>
<h2>Registration Form</h2> <hr>
......
Текст страницы
.....
<hr>
<FORM NAME=help_call>
<TABLE BORDER=0>
<TR>
<TD><INPUT NAME=next TYPE=button
VALUE=Next onClick="main_menu()">
</TD> <TD><INPUT NAME=help TYPE=button VALUE=Help onClick="help_win()"></TD>
</TR>
</TABLE>
</FORM>
<hr>
</CENTER>
</BODY>
</HTML>


Пример 2.

<HTML>
<!- Author: Pavel Khramtsov
Date: February 23, 1996
URL: http://144.206.192.100/radleg/ mo_input.htm
->
<HEAD>
<TITLE>Проверка устного
счета.</TITLE>
<SCRIPT LANGUGE="JavaScript">
<!-
var max_value = 0; var operand1 = 0
var operand2 = 0; var result = 0
var flag = 0; var sign = "+"
var input = ""; var v_date = new Date()
var number = v_date.getTime()
function init(factor){
var today = new Date()
return (factor*today.getTime()
/1000)%30000
}
//Инициализировать датчик
//случайных чисел
IX = init(2); IY = init(3); IZ = init(4)
//2, 3, and 4 below were arbitrarily cho-
//sen. They put some distance between
// the initial values of IX, IY, and IZ
//Датчик случайных чисел.
function random(){
IX = Math.floor(171 * IX % 30269)
IY = Math.floor(172 * IY % 30307)
IZ = Math.floor(170 * IZ % 30323)
return ( IX/30269.0 + IY/30307.0
+ IZ/30323.0 ) % 1.0 }
//Выбрать сложение или вычитание
function set_sign(x){
if( x == "+"){
flag = 0; sign = "+"
}
if( x == "-"){
flag = 1; sign = "-"
}
return true
}
// Определить первый операнд
function f_operand(){
operand1 = random()*max_value
return parseInt(operand1)
}
// Определить второй операнд
function s_operand(){
if(flag == 0){
operand2 = random()*
(max_value-operand1)
}
else {
operand2 = random()*
operand1
}
return parseInt(operand2)
}
// Проверить введенные данные
function input_sign(x){
if(x == 10){
if(flag == 0){
if(operand1+operand2 ==
parseInt(input)){
window.document.test. r0.value = "Молодец!"
}
else {
window.document.test.r0.value = "Думай!?"
window.document.test.input = ""; input = ""
}
}
if(flag == 1){
if(operand1-operand2 ==
parseInt(input)){
window.document.test.r0.value ="Lі-іі-ір!"
}
else{
window.document.test.r0.value = "Думай!?" window.document.test.input = ""; input = ""
}
}
return true
}
input += x
window.document.test.result.value = input
return true
}
// Генерация варианта
function main_calc(){
operand1 = f_operand()
window.document.test.op1.value = operand1
operand2 = s_operand()
window.document.test.op2.value = operand2
window.document.test.s_sign.value = sign
input = ""; window.document.test.input = ""
window.document.test.r0.value = " ???"
return true
}
// ->
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<H1>Математический тест</H1>
<HR>
<FORM NAME=test>
<TABLE BORDER=0>
<TR>
<TD><INPUT NAME=i10 TYPE=button VALUE="0-10" onClick="max_value=10"></TD>
<TD><INPUT NAME=i20 TYPE=button VALUE="0-20" onClick="max_value=20"></TD>
<TD><INPUT NAME=i100 TYPE=button VALUE="0-100" onClick="max_value=100"></TD>
<TD><INPUT NAME=i+ TYPE=button VALUE="+" onClick="set_sign("+")"></TD>
<TD><INPUT NAME=i- TYPE=button VALUE="-" onClick="set_sign("-")"></TD>
</TR>
</TABLE>
<HR>
<TABLE BORDER=0>
<TR>
<TD><INPUT NAME=op1 SIZE=2 MAXLENGTH=2></TD>
<TD><INPUT NAME=s_sign SIZE=1 MAXLENGTH=1></TD>
<TD><INPUT NAME=op2 SIZE=2 MAXLENGTH=2></TD>
<TD>=</TD>
<TD><INPUT NAME=result SIZE=3 MAXLENGTH=3></TD>
<TD><INPUT NAME=award TYPE=button VALUE="?" onClick="main_calc()">
<TD><INPUT NAME=r0 VALUE="???">
</TR>
</TABLE>
<HR>
<TABLE BORDER=2>
<TR>
<TD><INPUT NAME=b1 TYPE=button VALUE="1" onClick="input_sign("1")"></TD>
<TD><INPUT NAME=b2 TYPE=button VALUE="2" onClick="input_sign("2")"></TD>
<TD><INPUT NAME=b3 TYPE=button VALUE="3" onClick="input_sign("3")"></TD>
</TR>
<TR>
<TD><INPUT NAME=b4 TYPE=button VALUE="4" onClick="input_sign("4")"></TD>
<TD><INPUT NAME=b5 TYPE=button VALUE="5" onClick="input_sign("5")"></TD>
<TD><INPUT NAME=b6 TYPE=button VALUE="6" onClick="input_sign("6")"></TD>
</TR>
<TR>
<TD><INPUT NAME=b7 TYPE=button VALUE="7" onClick="nput_sign("7")"></TD>
<TD><INPUT NAME=b8 TYPE=button VALUE="8" onClick="input_sign("8")"></TD>
<TD><INPUT NAME=b9 TYPE=button VALUE="9" onClick="input_sign("9")"></TD>
</TR>
<TR>
<TD><INPUT NAME=b0 TYPE=button VALUE="0" onClick="input_sign("0")"></TD>
<TD COLSPAN=2><INPUT NAME=bs TYPE=button VALUE="OK" onClick="input_sign("10")"></TD>
</TR>
</TABLE>
</FORM>
</CENTER>
<HR>
</BODY>
</HTML>

 



Пример 3.1
<HTML>
<!- ady@demos.su, Saturday, January 20, 1996 7:23:31 PM->
<!- Demos WWW cover page ->
<HEAD>
<TITLE>Welcome to Demos Company - Moscow, Russia</TITLE>
<!- yet another scroller.
(C) 1996 Dmitry Altukhov, ady@demos.su ->
<!-
Use this code for whatever purposes... provided that you retain the copyright notice.
I accept no responsibility for any disasters caused by this monster.
Cannot guess any other cool places for scrollers. And MSIE marquee emulation in JS?!
Er... Mozilla clears windows too slow in JS...
->
<SCRIPT LANGUAGE="JavaScript">
<!- roll it
var rate, pos=0;
function roll(){
var loop, top, msg1;
var msg="Hello World";
for(var i=0; i<10; i++){
msg = msg + (" Hello World");
}
//move on, make a scrolly... and who said that
//scrollers suck?! ;-)
top=(130/msg.length)+1;
for(loop=0; loop<top; loop++) msg+=""+msg;
msg1=msg.substring (pos, pos+130);
window.defaultStatus=msg1;
if (pos++ == 130) pos=0;
//come on, the poor thing can"t roll any faster... buy a Ferrari. ;-)
rate=setTimeout("roll()",30);
}
// that"s all folks ;-)
// end ->
</SCRIPT>
</HEAD>
<BODY BACKGROUND="back.gif" BGCOLOR="#FFFFFF" TEXT="#000040" LINK="#000080"
VLINK="#400080" ALINK="#FF0000" onLoad="roll()">
.....
</BODY>
</HTML>

 



Пример 3.2
<HTML>
<!- Author: Pavel Khramtsov
Date: February 25, 1996 ->
<HEAD>
<TITLE>Text Block Scrolling</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var line_beak = "\n"; var screen = ""
//123456789012345678901234567890
screen+= "Будем прокручивать"
screen += "Данный фрагмент текста"
screen += "В поле типа"
screen += "TEXTAREA"
screen += "Формы term"
for(i=0;i<6;i++) screen += " "
var i=0; var j=40; flag = 0
function scroll(){
if( flag== 0){
display_str = ""
for(k=0;k<11;k++){
display_str += screen.substring(i,j)
i+=40; j=i+40; if(i>400) i = 0
}
window.document.term.work_field.value = display_str; i += 40; if(i>400) i =0
}
id = setTimeout("scroll()",1000); return true
}
function change_button(){
if(flag==0){
flag = 1; return true
}
if(flag == 1){
flag = 0; return false
}
}
</SCRIPT>
</HEAD>
<BODY onLoad="scroll()">
<CENTER>
<H1>Text Block Scrolling.</H1>
<HR>
<FORM NAME=term>
<TEXTAREA NAME=work_field COLS=40 ROWS=10 WRAP=ON></TEXTAREA>
<P>
<INPUT NAME=alarm VALUE="Start/Stop" TYPE=button onClick="change_button()">
</FORM>
</CENTER>
<HR>
</BODY>
</HTML>


Пример 4

<HTML>
<HEAD>
<TITLE> type_Document_Title_here </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!-
var i=0; adv_message = " "
advert = "Russian Research Center \"Kurchatov Institute\""
adv_message += advert; adv_message += " "
adv_length = advert.length
function move_clock(){
// Clock
day = new Date()
clock_screen = day.getHours()+":"
+day.getMinutes()+":"+day.getSeconds()
document.kuku.f_clock.value = clock_screen
// Rolling Field
document.kuku.adv_string.value =
adv_message.substring(i,i+45)
document.kuku.i_field.value = i; i++
if( i == adv_length + 44 ) i = 0
id = setTimeout("move_clock()",100)
}
// end ->
</SCRIPT>
</HEAD>
<BODY onLoad="move_clock()">
This is the start point:<BR>
<a href="#next"> This the document start point.</a>
kukuku
<a name=next>
<FORM NAME=kuku onSubmit="alert("You submit data to server")" METHOD="GET">
<INPUT TYPE=SUBMIT NAME=SABMIT VALUE=SUBMIT> Make a clock here:
<INPUT NAME=f_clock maxlength=8 size=8>
<P>
<INPUT NAME=adv_string maxlength=45 size=45>
<INPUT NAME=i_field size=10> </FORM> </BODY>
</HTML>

 


Пример 5.1

<HTML>
<!- Author: HTMLed User
Date: May 16, 1996
->
<HEAD>
<title>Iconize</title>
<script language="JavaScript">
function make_icon(){
window.open("test_icon.htm","test_icon",
"resizable=yes,scrollbars=no,width=50,
height=70"); window.close()
}
</script>
</HEAD>
<BODY>
<h1>minimize page</h1>
<form name=icon>
<input name=icon_button type=button value=icon onClick="make_icon()">
</fomr>
</BODY>
</HTML>

 


Пример 5.2

<HTML>
<!-
Author: Pavel Khramtsov
Date: May 16, 1996
->
<HEAD>
<script>
function max_window(){
window.open("iconize.htm","new",
"toolbar=yes,scrollbars=yes,directories=yes, status=yes,menubar=yes,resizable=yes,
location=yes,width=700,height=500")
window.close()
}
</script>
</HEAD>
<BODY>
<center>
<a href="" onClick="max_window()">
<imgsrc=back.jpg></a>
</center>
</BODY>
</HTML>


Пример 6

<HTML>
<HEAD>
<TITLE>page terminator</TITLE>
</HEAD>
<BODY>
<SCRIPT>
window.close()
</SCRIPT>
</BODY>
</HTML>

 

 


 
iMAIL баннер

 

 www.chris-master.narod.ru 
Hosted by uCoz