Посоветуйте язык программирования
Jan. 11th, 2015 02:41 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я всю жизнь программировал только на бейсике, на разных его версиях. Так получилось. Когда писал кандидатскую, набралось очень много таблиц с данными (это были морфологические признаки морских ежей), и я задолбался обсчитывать их на калькуляторе. Поэтому быстренько освоил бейсик (тогда персональные компьютеры IBM только начали появляться, и к ним прилагался язык GW-Basic). Освоил - и сразу почувствовал себя человеком. С тех пор не переучивался, сейчас пишу все свои программки на VBA в MS Access. То есть в программировании я дилетант, но опытный. Программированием пользуюсь сейчас для имитационного моделирования эволюционных процессов в популяциях. Подумываю об одной новой модели, но понимаю, что на VBA она будет работать невыносимо медленно. Насколько я понимаю, программа, написанная почти на любом другом языке, компилируемом, будет работать в разы быстрее. Вопрос такой: какой из этих языков мне будет быстрее и проще всего освоить? Времени, сил и желания преодолевать трудности и вникать в программистские проблемы - не имеется. Мне бы этот язык просто скачать (можно купить, если не слишком дорого), освоить за пару-тройку дней - и вперед. Т.е. главное, чтобы он был максимально простым в освоении для того, кто знает бейсик, без всяких интеллектуальных "понтов", но работал хотя бы раз в 10 быстрее.
no subject
Date: 2015-01-11 04:53 pm (UTC)Другая типичная ошибка - забывать слово const и использовать string вместо const string&, а еще злоупотреблять присваиванием строк. Хотя это работает, это работает кошмарно медленно и жрет очень много памяти. В глубоком цикле такая ошибка может привести к высвоповыванию или даже к срабатыванию OOM killer, не говоря уж о том, что из-за этого жалкие несколько килобайт текста могут обрабатываться несколько минут.
На Java и других GC-языках тоже есть типичная ошибка - делать у объектов слишком большое время жизни. Из-за того, что объект не надо удалять, программист слабо следит за тем, в какой именно области видимости объект создан. В результате ссылка на объект может жить в сотни раз дольше, чем реально надо, и память забивается такими вот "вроде бы нужными" объектами, которые GC не удаляет, потому что формально они еще используются. Обычно это бывает, если программист ленится передавать переменную через параметры функции и потому делает переменную членом класса. Такая практика - вообще очень большое зло, но на языках без GC программист очень быстро получает по лбу граблями от деструктора этой переменной и перестает так делать, а на языках с GC можно писать так годами и не понимать, почему это плохо.
no subject
Date: 2015-01-11 06:06 pm (UTC)не понял, если честно. это как?
no subject
Date: 2015-01-11 06:45 pm (UTC)int x = 5;
f1(x);
f2(x);
делает переменную x членом класса и пишет примерно так:
this.x = 5;
f1();
f2();
В результате переменная x уничтожается гораздо позже, чем это реально требуется по логике кода. И обычно, увы, это вовсе не int, а некий довольно тяжелый объект класса.
no subject
Date: 2015-01-11 07:55 pm (UTC)no subject
Date: 2015-01-11 09:49 pm (UTC)class Foo {
public:
Foo() : x(nullptr) { }
~Foo() { if (x) delete x; }
void do() {
x = new int(42);
...
}
private:
int* x;
};
Понятно, что это кончается либо утечкой памяти, либо обращением по NULL, смотря как написано. Следующим этапом код переписывают на умные указатели - и получают примерно те же грабли с обращениями по NULL, проще не становится. Тогда до жирафа довольно быстро доходит, что локальные переменные должны быть локальными, и не фиг им делать в классе.
Java от таких граблей защищает достаточно надежно, поэтому человек может писать такую хрень годами, не догадываясь, что так делать не надо. Пакость в том, что такие члены класса обычно очень хорошо закопаны среди кучи похожих и действительно нужных, поэтому кодер, даже зная, что так писать не надо, все равно так писать будет. Против быдлокода лекарство вообще есть только одно - дать как следует в быдлокод вляпаться. Тогда человек наконец понимает, что качественный код - это в первую очередь экономия его же собственного времени, и что писать как попало вовсе не быстрее.
no subject
Date: 2015-01-12 12:32 am (UTC)особенно сладко будет тому, кто потом будет это г... отлаживать:)
no subject
Date: 2015-01-12 08:49 am (UTC)no subject
Date: 2015-01-11 07:12 pm (UTC)1. пусть есть временная переменная tmp, ей что-то присвоено
2. ссылку на эту переменную отдают какому-то долгоживущему объекту obj, прикапывают в каком-нибудь его поле obj.member
3. мы выходим из области видимости для tmp
на этом шаге в языке без GC tmp уничтожается
на этом шаге в языке с GC tmp остается т.к. на него есть ссылка из obj
4. мы пытаемся использовать obj.member
на этом шаге в языке без GC возможен краш
на этом шаге в языке с GC краша не будет, но будет обращение к вроде как валидному объекту, который давно не нужен и, скорее всего, никак не соответствует происходящему
no subject
Date: 2015-01-11 08:01 pm (UTC)если тэмп часть объекта такого не будет пока он живёт.
no subject
Date: 2015-01-11 08:20 pm (UTC)no subject
Date: 2015-01-11 08:28 pm (UTC)не, ну знаете... с дури можно х сломать...
no subject
Date: 2015-01-11 08:39 pm (UTC)no subject
Date: 2015-01-12 12:37 am (UTC)no subject
Date: 2015-01-12 04:38 am (UTC)no subject
Date: 2015-01-12 04:40 am (UTC)no subject
Date: 2015-01-12 04:45 am (UTC)В качестве прикола - почему автору никто Clipper не посоветовал?:)
no subject
Date: 2015-01-12 07:49 am (UTC)ничего удивительного. это проблемы с компилятором.