Заочно учитсо(сам по толстым книгам) - заочно женитсо!
Документ есть, а жены нет![]()
|
Заочно учитсо(сам по толстым книгам) - заочно женитсо!
Документ есть, а жены нет![]()
Chev'yuk, аналогия (приведение типа) не катит![]()
// громкие нестихающие апплодисменты
Довелось недавно побывать на одной академической тусовке. Так вот там обсуждался вопрос относительно необходимости изучения студентами компьютерных специальностей ассемблера х86. Постановка вопроса была такова:
а) студенты не понимают, зачем это им надо;
б) когда мы (преподы) их мотивируем в этом вопросе (изучения ассемблера х86), студенты только улыбаются;
в) на этом где-то в Одессе (на Украине) программируют?
так может нам вообще изъять изучение ассемблера х86 из программы?
А каково ваше мнение? Должен ли студент компьютерщик обладать знаниями asm х86?
И если, да, то какое место эти знания будут занимать в его профессиональном багаже?
Да уж, студенты компьютерных специальностей у нас просто гуру все.
Они, безусловно, лучше всех знают что нужно изучать, а что нет.
Практически нет. По крайней мере не на x86. Программирование на ассемблере ушло в embedded-системы, там свои процессоры. Раньше, помнится, на ФАВТе (КИСС) немного грузили ассемблером для i8051, что правильно.
Мне ассемблер за 10 лет пригодился несколько раз, но, в основном, не для того, чтобы что-то писать, а для отлавливания проблем в модулях без отладочной информации. Для этих же целей пришлось немного подучить PowerPC ассемблер.
Писать на асме пришлось только однажды.
[/QUOTE]
Я считаю, что знание какого-либо ассемблера очень полезно, особенно для тех, кто собирается программировать на C/C++. Конечно, было бы лучше, если бы x86 ассемблер сдох вместе со своей ублюдочной архитектурой, но раз пока не сдыхает, лучше его знать, чем не знать.
хм, пусть мне программер, не знающий асссемблера объяснит такую вещь:
компилим и запускаем программку на двух разных машинах - на 32-битном камне/ОС и на 64-битном.Код:#include <stdint.h> int main(void) { int64_t x=0x8000000000000000LL; int64_t y= -1; int64_t z=x/y; return (int)z; }
И получаем очччень разные результаты. Для не знающих ассемблера.
А всего-то - простая арифметика, которая есть даже в джаве.
int64_t можно заменить на long long, нужно именно 64-х битное число.
можно проверить и с 32-битным и 16-битным - на любителя.
The future is already here - it is just unevenly distributed. (c) W. Gibson
homo ludens, а при чём тут ассемблер-то? В жабе у тебя это скорее всего просто не откомпилируется из-за слишком большой константы. На C допустимые границы типов тоже декларированы, просто поведение не определено. Ну а что в C отовсюду торчат уши платформы (т.е. прежде всего компилятора, а не железа) - так это фича языка такая.
А при том, что проблемы возникают на уровне исполнения. Там где целочисленное деление будет выполняться одной командой ассемблера (на 64-х битных машинах) - там будет divide overflow. Там где архитектура этого не позволит и пройзойдет "софтовое" вычисление - разделится нормально.
Имхо это и на джаве должно проявляться, хотя здесь не проверял.
В таком варианте вылет будет на обоих архитектурах.Код:int main(void) { int x=0x80000000; int y= -1; int a=x*y; // all ok int z=x/y; // divide overflow return z; }
А вот если сделать аналог на int16_t / short - то вылета нет.
Это еще к вопросу об ублюдочной архитектуре.![]()
The future is already here - it is just unevenly distributed. (c) W. Gibson
homo ludens, если бы это была такая актуальная проблема - всё бы о ней знали. имхо можно даже не фтыкать в подробности.
// громкие нестихающие апплодисменты
имхо если не фтыкать в подробности - то можно вообще никому ничего не знать, а только привычно ругать Билла Гейтса.
Я просто привел пример простейшего глюка, разобраться в котором без представления об ассемблере невозможно, можно только смотреть на экран с надписью "Floating point overflow" (! - в программе с целыми числами) и понимать свое бессилие перед компом.
Причем потенциально эта ситуация может быть воспроизведена во многих языках высокого уровня. Сам правда не воспроизводил.
------------ добавил через несколько минут
проверил на perl - тоже вылетает. как и следовало ожидать.
Последний раз редактировалось homo ludens; 07.12.2007 в 07:51. Причина: добавил проверку
The future is already here - it is just unevenly distributed. (c) W. Gibson
ну может быть... просто мне как бы не приходилось никогда делить такие числа...
// громкие нестихающие апплодисменты
У меня возникает вопрос - вот человек решил изучать программирование. Ведь он не в уме будет программы писать, а для _конкретного_ аппаратного устройства (к примеру, архитектура i386). Для этого первое с чем он должен ознакомиться (имхо) - с программной моделью: процессор, память, прерывания, система команд - т.е. это база. Как можно говорить что человек "програмист" - если он даже не представляет ЧТО он там програмирует ?
Я считаю, что обзор архитектуры и ассемблера обязателен для изучения, причем в самом начале. Другой вопрос - что не нужно вдаваться в дебри, и писать лабораторки на тему - прямое чтение с HDD через порты и DMA. Достаточно написания простейших програмок типа манипуляций с числами, поиск строк и т.д. - на 1-2 часа.
Вобщем, пока мы программируем для x86, а не для процессоров, выполняющих байт-код MSIL или JVM - изучать платформу нужно, на уровне понимания.
А писать на чистом асме сейчас кроме низкоуровневых вещей, задач оптимизации и т.д. просто нет смысла, так как есть много разных инструменов, позволяющих решить задачу быстрее и с меньшим количеством ошибок. Но иметь представление КАК оно все работает на нижнем уровне - обязательно. Иначе все этим "программисты" - это как та толпа индусов, которые кроме рисования форм ничего не умеют
Если смотреть с другой стороны, то дефицит толковых программеров привел к тому, что среди _наемных_ специальностей тут одни из самых высоких зарплат![]()
я тоже специально ничего не искал и пример взял не из интернета. Моя программка, которая стабильно считала формулы со случайными числами на 32-хбитных компах начала регулярно вылетать на 64-х. Полез искать - и нашел вот такую "фичу".
Программка, которая все время делит случайные числа с проверкой на ноль будет вылетать так же. Так же как и программка, которая делит числа введенные в форме.
Зарплаты высокие потому что бум, мода и популярность. У строителей они бывали повыше при близкой квалификации.
Уйдет мода, люди перестанут платить деньги за софт, время жизни которого - год. Такое уже было в этой области.
Имхо сегодня завершается трансформация понятия программист.
Не так давно считалось, что программист - это человек из computer science с соответствующим образованием прикладного математика, считающий знание лямбда-исчисления обязательным.
Сегодня это - просто инженер, пользующий рекомендованные авторитетами шаблоны программирования и рисующий GUI-формочки.
Отличие здесь в том, что первый был в состоянии разработать инструментарий для себя и других, а второй - только пользоваться чужим.
С точки зрения первого - лишних знаний не бывает в принципе. С точки зрения второго - надо успеть выучить технологию, пока на нее еще есть спрос.
Позиция принципиально разная и во многом определяет будущее развитие специалиста.
Все вышесказанное разумеется имхо.
The future is already here - it is just unevenly distributed. (c) W. Gibson
Хотелось бы быть программистом по первому определению и разрабатывать инструментарий и.т.п Но пока чувствую себя именно вторым программистом
(может потому что всего лишь 4 курс фавта ?)
Социальные закладки