Персональные инструменты
Счётчики

Обсуждение:Java

Материал из Lurkmore
Перейти к: навигация, поиск

Содержание

[править] Математика

неймфаги запилите http://img265.imageshack.us/img265/6843/mathq.png

Шоэта? То, что так можно, вовсе не значит, что так нужно. Работать с примитивом как с объектом, а потом жаловаться на длинную запись.
Тут дело не в числах, а в перегрузке операторов. Которой нет.
А нафига она нужна? Чтобы потом появлялись жалобы вида «ололо 2+2!=4» как с автобоксингом?

[править] вы про каждую?

вы про каждую хуйню с лора статью создавать будете? епта жо чего ж крансоглазики тупы!!!111

А вы про каждую хуйню с двача статью создавать будете? епта, до чего-же… Tenebrosus Scriptor 21:54, 7 марта 2008 (MSK)
значимость, значимость…
Лора? Или двача? Tenebrosus Scriptor 02:03, 9 марта 2008 (MSK)
двач понятен всем, в отличие от вашей задротской хуйни, интересной паре десятков девственников
ЛМ не только для быдла. Tenebrosus Scriptor 15:53, 14 июня
Мне понятен. Быдло

2008 (MSD)

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

[править] Война правок

Лютобешенно реквестирую отменить правку жабофага WARRGH от 17:30, 20 сентября 2010. Выпилил, гад, тонну ненависти, как будто его любимая жаба и жабакодеры от этого лажать меньше станут. Фапать на жабу в каком-нибудь другом месте нужно, бля! Так что если никто не докажет мне обратного, откачу все нахрен сам.

И все же самая большая проблема в быстродействии это не тормоза жабы, а тормоза-быдлокодеры. С одной стороны, новомодные штуки типа ORM до ужаса распадлючивают народ, который вообще перестает думать о малейшей оптимизации и считают память бесконечной большой, а проц бесконечно быстрым. Потянуть тысячи объектов из базы через ORM, чтобы посчитать какую-то простую статистику? Легко! Точно так же ни один жабокодер не занимается мало-мальскими алгоритмическими оптимизациями, поэтому инициализировать соединение к БД по несколько раз на один запрос или инитить какую-то хуету на тэгах каждый раз, когда вызывается тэг в рамках генерации страницы — это общепринято. Куча уровней абстракций и простота языка позволила вырасти целому поколению дебилов, которые кодят быстро, но работает оно потом медленно. С другой стороны, толпы не менее дебильных индусов сбивают цену и заказчик не хочет переплачивать за оптимизацию. Зато потом такие индусо-поделки приходят на рефактор, после которого, как правило, памяти жрется в 10 раз меньше, а работает оно в 5 раз быстрее.

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

Пока пусть лежит здесь, со временем вернём в статью.

[править] Томми

Он же стал героем, вроде, из-за перегрева, говорили, а жаба там просто удачно оказалась?

Всем похуй.

[править] Ы?

А где про жабу, которая душит?

[править] Плохому танцору..

Современные виртуальные машины java по скорости не уступают нативным языкам[ЩИТО?][1], а функционала хватает практически на любую прикладную задачу. В особо тяжелых случаях можно прицепить либу на другом языке (хоть на ассемблере).

Проблема явы в том, что она обманчиво проста. На первый взгляд всё элементарно, но на самом деле в языке куча подводных камней. Особенно это касается оптимизации, правильно работающий код может работать в дофига-и-более раз медленнее чем мог бы из-за какой-нибудь не принципиальной на первый взгляд мелочи вроде выбора типа коллекции. Поэтому хороший ява кодер должен знать как работает любая нативная функция, а не тупо юзать их как черный ящик. Другой вопрос что это подразумевает необходимость курить исходники и мануалы, курить много, долго и муторно. А зачем, если «и так работает»? Вот и получается, что хороший язык присмотрели быдлокодеры, из-за которых слово «ява» стало чуть ли не ругательством.

«не принципиальной на первый взгляд мелочи вроде выбора типа коллекции» а няшная сишка или что-угодно-есчо к этому нечувствительны? это называется алгоритмической оптимизацией, что к языку или среде исполнения не имеет никакого отношения. Есть другие проблемы, технические. Например, оптимизация по кол-ву создаваемых экзэмпляров классов, что влияет на скорость и о чём очень навязчиво идеологи жабы советуют не думать («наша революционная JVM всё соптимизирует за вас»). Быдло и радо. А результат очевиден.
Няшная сишка чувствительна ко всему, но идея из предыдущего коммента полностью верна. Простой пример — синхронизация потоков. В «няшной сишке» нужно будет использовать нативный интерфейс ОС, или библиотеку типа pthreads, a специфика языка заставит хоть на сколько-нибудь изучить вопрос «что такое мьютексы с семафорами». А в Жабе можно просто взять и нахуячить слово synchronized везде, где левая пятка положит — и при унитарных тестингах это вполне себе будет работать. А при стрессовых интегральных — тормозить до ужаса и сыпать исключениями о зависших threads. Обычно интегральные тесты проходят на завершающих этапах разработки, а тут выясняется, что нужно до хрена переделывать, из-за вот такой вот фигни.
Недавно начал знакомиться с явой после долгого юзания си-шарпа. Ощущение - будто попал из эпохи нанотехнологий прямо в каменный век. Серьёзно. Си-Шарп - по сути форк Джавы. Вот только с момента того "ответвления" Си-Шарп приобрёл много ништяков, а Джава так и осталась на том же начальном уровне. Нет, конечно, можно закрыть глаза на отсутствие Linq, долгого отсутствия лямбд (в 8-й версии таки запилили), событий и даже, возможно, на отсутствие указателей, но, блеать, убрать беззнаковые типы - это совсем нужно было ебануться. Любой двоичный файл (будь то звуковой файл или ещё какой-либо RIFF-контейнер, например) так или иначе хранит некоторые значения в беззнаковых типах (например, размер чанка в RIFF-контейнерах). И я всё понимаю, можно вместо int заюзать long, потом преобразовать считанный uint32 в long, но это же пиздец... Мало того, что это неудобно, это и дополнительные лишние затраты памяти (8 байт вместо 4-х, причём 4 байта из этих 8 вообще не будут использоваться). О чём они думали?

[править] Кто писал эту статью?

Расстрелять!!!

1. Я за то, чтобы статьи писали люди, хоть немного разбирающиеся в вопросе.

2. Кто ещё JS сюда примотал?

Немного доработал на тему адеквата. Но нужны лулзы и много.

Почему убрали список разновидностей Java? Да и вообще нанесли в статью много мусора. Старая версия лучше.

Какой идиот выпилил кучу лулзов из статьи? Анальная боль быдлокодеров-обезьянок?

Соглашусь с предыдущими ораторами — писал упертый жабоеб. Сплошные прославления.

[править] В разделе НЕНАВИСТЬ

Аноним интересуется: зачем курить исходники виртуальной машины?

JVM как и железо имеет свои характеристики.
ИМХО, этот раздел нужно выпилить кем, ибо любой из описанных в нём недоаргументов можно парировать, к примеру:
1. Javadoc, Tutorial’ы — так написанные, что и дэбил поймёт. Дохуя книг.
2. То жаба кого-то «лишает» программинга, то, блджад, имплементацию впадлу писать. Да и вообще, о чём можно говорить с таким количеством классов.
3. RTFM!!!11
4. Чьё-то «ЩИТО?» очень красноречиво…
5. Да, да, это вам не вижуал бэйсик. А так: swt, awt, swing…
6. Пруф говно, так как известны случаи когда солнечные пороли хуйню в исходниках (к примеру, класс Vector).

[править] Кто блять это писал?

Статья написана предвзято и убого. Афтар фапер настолько, что кленясь в вечной любви жабе, вставил даже пидарское (извините) сравнение жабы с Ц. Любой адекватный человек не будет сравнивать интерпретатор с компилятором. Я молчу что ц++код отлицается от явовского + сам по себе кривой. Вообщем — Переписать всё нафиг

Перепишите. Утверждаю. И что б побольше ненависти. Linefused 07:37, 30 сентября 2009 (MSD)
Почитай про JIT, потом пиши дальше свои «умности» --80.255.89.148 16:21, 2 ноября 2010 (MSK)
Запомни, школота! «JIT» значит лишь то, что компиляция динамическая. А то, что она неебически крутая.

[править] Целесообразность быдлокода

И такая целесообразность возникает для энтерпрайза, где выгоднее сбагрить проект индусам, которые быстро набыдлокодят и поставить его на сервера помощнее.

Обычно такая «целесообразность» является порождением непроходимой тупости менеджмента, ни хуя не понимающего в технической стороне вопроса. Менеджмент покупается на индусские предложения привлечённый относительно низкой (начальной) ценой и обещаниями крайне быстро сдать проект. А на практике разработка длится вчетверо дольше намеченного. Но уже поздно, деньги вложены, и менеджменту приходится продолжать поддерживать эту инициативу (и продолжать платить), потому что иначе — не будет ни проекта ни денег и нужно всё начинать с начала. Уплатив в итоге сумму, которой было бы вполне достаточно для оплаты труда квалифицированных специалистов, взыскательный менеджмент получает монструозную вундервафлю, 600% редундантную, заплатка на заплатке, с кучей багов и недоработок — но делать нечего, высшее руководство уже ругается, и приходится по-быстрому решать вопрос внедрения, зачастую закупая дополнительное оборудование, что опять увеличивает затраты. А учитывая, что индусский код по определению unmaintainable, поддержка и модификация купленной за бешеные бабки хуйни либо невозможны в принципе (то есть что бы внести нужное изменение, надо буквально всё переделывать), либо стоят ещё одни бешеные бабки и требуют туевой хучи времени. А «энтерпрайз» навсегда остаётся на крючке у ушлых индусов, создателей вундервафли, кроме которых в её коде понять никто ничего не может.

Ну пиздец, тупость менеджмента — это когда заказывают написать что-то очень большое на Си, срывают все сроки и ещё 10 лет отлавливают баги. Вот это тупость по настоящему. --80.255.89.148 16:24, 2 ноября 2010 (MSK)
Чего-то я не догоняю. Т.е. ты считаешь, что когда заказывают писать что-то большое быдлокодерам на любом языке, срывают все сроки и ещё 10 лет отлавливают баги (выплачивая за это большие деньги) - это пиздатый толковый менеджмент? И причём тут С?
Мне вот думается, что тупость менеджмента в данном случае заключается лишь в отсутствии яиц убить проект, не дожидаясь его завершения, и начать заново, с привлечением нормальных спецов. Но это даже не столько тупость, сколько суровая реальность. Читаем The Deadline: a novel about project management by Tom DeMarco.

Толкового менеджмента не существует, пока не доказано обратное. — Мимо проходил

[править] 4-5 раз

Большое потребление памяти: один только хелловорлд при запуске отъедает 10 МБ. Также с каждой инстанцией класса связаны метаданные и монитор (по предыдущей причине), в результате какой-нибудь массив значений RGB будет занимать в 4-5 раз больше памяти, чем в даже хотя бы в C#. На венде, которая свопит всё подряд, это приводит к известным результатам.

Если даже забыть о том, что такие значения надо хранить в виде скаляров, стоит заметить, что для sun hotspot 1.6 размер ссылки на объект равен размеру void* для того же окружения в С++, а размер инстанса Object — 2x(void*). Где тут в 4-5 раз?

Плюс размер каждого объекта дополняется до кратного восьми (на 32-битной HotSpot). Итого для хранения одного жабьего class XYZ { public byte x, y,z; } нужно 20 байт, а для struct XYZ { public byte x, y,z; } — 3 байта. Если хранить в скалярах, то жабокодеру нужно выделить массив байтов и принять, что в его отсчетах последовательно чередуются x, y,z. Каково? Ништяк ведь?
Я создал 1000000 объектов на 32bit JVM. Это заняло 8М памяти. Где тут выравнивания до неких сферических восьми? ЧЯДНТ? + учтите, что ваш struct обязательно будет выровнен в памяти под размер регистра на каждую переменную — итого будет не 3 байта, а 12 (x32) или 24 (x64). Ну и для работы с RGB данные НАДО упаковывать (экономия на указателях + локализация данных). В С/C++/C# это сделать проще (есть структуры), не спорю. А цифры писать от балды нехорошо.
Так, само по себе выравнивание теоретически возможно (только не до кратного восьми, а, скорее, до размера машинного слова). Только всё равно разницы в 4-5 раз не наблюдаю. Как и размера Object в 20 байт.
Сказал — в лужу пёрнул. Насчет выравнивая до 8 байт читать здесь: http://www.javamex.com/tutorials/memory/object_memory_usage.shtml Размер struct XYZ хоть в Си, хоть в Си шарп 3 байта, а выравнивание в структуре производится вовсе не так, как ты думаешь. Оно производится так, чтобы каждый объект был выровнен на нужную ему границу. Байты вообще в выравнивании не нуждаются, следовательно и вся структура XYZ не нуждается (выравнивать ее понадобится только если надо будет ее передать на стеке как аргумент в другую функцию — что нисколько не беспокоит, если мы не пишем рекурсию глубиной over 9000). Причем если надо, выравнивание для полей можно вообще отменить. Нахуй мне твои пустые объекты, да еще и без ссылок на них. Чтобы XYZ в массив или другой контейнер положить, нужна ссылка (4 байта) + инстанс объекта (8 байт) + данные (8) = 20. Проверил на 32-битной Java HotSpot™ Client VM (build 11.2-b01, mixed mode, sharing). Между первым и вторым nextInt() выделяется 21.5*k байт памяти. Так что получается даже не 4-5, а семь раз. Упаковка — костыль, не выполняющий никаких полезных функций. Код:
import java.util.*;4
 
	class XYZ {
		public byte x,y,z;
	} 
 
 
public class manyXYZ {
 
   public static void main(String[] args) {
		Scanner in = new Scanner(System.in); 
 
		int k = in.nextInt();
		XYZ q[] = new XYZ[k];
		for(int i=0; i<q.length; i++){
		    q[i] = new XYZ();
		}
 
		int idx; // Делаем что-нибудь, чтобы компилятор не соптимизировал чего не надо
		while( (idx = in.nextInt())	!=0	) {
			System.out.println(++q[idx].x);
			System.out.println(q[idx].y^=2);
			System.out.println(q[idx].z--);
		}
   }
 
}
Так, проверил для GCC C++ (установки по-умолчанию, архитектура x86) — структура занимает 3 байта. Аналогичный класс в жабе — 16 байт, + 4 на ссылку на инстанс.
Объясните, граждане, нахуя мне массив RGB значений на жаве? А ворочать несколько сотен тысяч записей из базы на любом языке накладно.
Справедливости ради надо отметить, что в большинстве реализаций C++ при множественном наследовании в объекте может оказаться (а может и не оказаться) больше одного указателя на vtable, и тогда теоретически жаба использует память экономнее чем C++, а в гнутой жабе пустой объект содержит только один указатель. Но всем похуй.

Насчёт выравнивания. Разные есть виды. Есть под размер линейки кэша (для отсутствия чтения данных из двух линеек сразу — в таком случае будет пенальти). Это случай сан JVM под х86. Бывают и другие варианты: взять хотя бы http://www.opennet.ru/base/dev/porting_code.txt.html (раздел выравнивание) Для большинства RISC структура в С++ занимать 3 байта не может — ибо при попытке чтения данных (в лоб) по нечётным адресам процессором обязательно будет сгенерирована ошибка. Так что или эмуляция чтения по «неудобным» адресам со стороны компилятора (ценой падения производительности), или выравнивание. итого действительно при таком идиотском хранении данных в жабе разница получается для x86 (при упоре С++ компиляции на минимальное потребление памяти) в 6.67 раз. Для других архитектур/настроек возможны варианты. Взять хотя бы: http://www.linuxquestions.org/questions/linux-software-2/g-on-64bit-machine-alignment-issue-684971/ В целом, утверждение там справедливое. Добавлю только сноску, что данные надо упаковывать. Под упаковкой я в данном контексте понимаю не boxing/unboxing, а представление данных в виде массива. Например xyz0.x = a[0], xyz0.y = a[1], xyz1.z = a[5].

Первая ссылка вообще про C а не про ++/#, на которых так не пишут. Как выравнивать поля структур и побыстрее копировать это дело компилятора, а не мое, а я указываю компилятору /O2 или -O2 и размер получается 3 байта. Тип с тремя примитивами нормальный, обычное ООП, а у подобной упаковки читабельность и типобезопасность на уровне ассемблера. Идиотский здесь только язык, который такой только потому, что у создателей почесалось левое яйцо и они выпилили значимые типы из языка найух.
С не С — пример был о вариантах выравнивания структур. С остальным согласен. Порой идеализация ООП и фанатизм в следовании его идей при дизайне языка доставляет неприятностей.

[править] Не тормозит

Мне тоже этот пункт в статье не нравится. Режет глаза дешёвой демагогией.

Типа, раз уж HelloWorld занимает 10МБ (а то и 20), то какому-нибудь офисному приложению на Swing или серверу на Tomcat нужно не меньше петабайта. В то время, как на практике стандартных 64МБ им может вполне хватать.

Предлагаю что-то типа: "Потребление (фиксированного количества) памяти виртуальной машиной на внутренние нужды. В результате программа на Java не может занимать, условно говоря, меньше 15МБ памяти". И стартуют программы на Java медленнее по той же причине: сначала нужно запуститься виртуальной машине. В принципе, есть приёмы, как уменьшать и минимальный расход памяти, и время запуска (и размер дистрибутива с включённой уже в него private джава-машиной).

С RGB пример не очень удачный. Нужно приводить не что-то абстрактное, а реальную задачу. Иначе можно и проще аргументировать: "В джаве нет ключевого слова struct, поэтому джава - говно".

Допустим, нужно написать утилиту, которая получает файл с изображением и как-то обрабатывает.

class ImageUtil {
	public static void violateImage(String fileName) throws Exception {
		BufferedImage image = ImageIO.read(new File(fileName));
 
		Graphics2D g = image.createGraphics();
		try {
			g.setColor(Color.RED);
			g.drawString("Fucked", 10, 10);
		} finally {
			g.dispose();
		}
 
		ImageIO.write(image, "bmp", new File(fileName + ".violated.bmp"));
	}
}

При загрузке изображения 2000x2000.bmp расход памяти составит примерно 3 * 2000 * 2000 ~ 12МБ, то есть 3 байта на пиксель. Cпециально проверил.

Самостоятельно реализуем что-то типа

class RgbImage {
	private byte[] rgbs;
 
	RgbImage(byte[] rgbs) {
		this.rgbs = rgbs;
	}
 
	public int getRed(int index) {
		return rgbs[index * 3] & 0xFF;
	}
 
	public int getGreen(int index) {
		return rgbs[index * 3 + 1] & 0xFF;
	}
 
	public int getBlue(int index) {
		return rgbs[index * 3 + 2] & 0xFF;
	}
 
	public int getRgb(int index) {
		return (getRed(index) << 16) | (getGreen(index) << 8) | getBlue(index);
	}
 
	public Color getColor(int index) {
		return new Color(getRed(index), getGreen(index), getBlue(index));
	}
 
	// getRaster(int), getDataBuffer(), getBufferedImage(), createGraphics(), другие методы
}

Также на пиксель уходит 3 байта. Так что, про RGB я бы вообще выпилил. Можно попробовать придумать задачу, и сравнить две реализации: на C с использованием struct, и на Java. И воскликнуть: "Вот какой в джаве неудобный синтаксис".

1) Добавил про внутренние нужды.
Особо лучше не стало. "... один только хелловорлд при запуске отъедает 10 МБайт" - непрофессионально звучит, будто школьник пытается переспорить товарища. И вообще, мысль не понятна. Для десктопа или сервера лишние 10МБ - несущественны. Может иметь значение для мобильных и других платформ с ограниченной памятью, но там и цифры по расходу, думаю, другие.
2) Ты создаёшь массив байтов! А попробуй-ка создать массив объектов класса RGBColor.
Класс/объект в C++ и в джаве - очень разные вещи. Сравнивать, сколько они занимают памяти - некорректно. Классы в джаве и C# - уже ближе. Но не уверен, что объект (не struct) в C# занимает меньше, чем в джаве (скорее всего, примерно столько же). Можно сказать, наверное: "В джаве отсутствуют удобные средства прямого мапинга памяти на логические структуры (а-ля struct в C). Поэтому в большинстве случаев используются объекты. Объекты занимают в несколько раз больше памяти, чем сырые данные, - отсюда больший расход. Там, где критично, приходится писать костыли для эмуляции struct.

[править] Shootout

Типичный бенчмарк ни о чём. Где хотя бы исходники тестов? Что конкретно мерялось — куча, память процесса?

Не, это очень нетипичный бенчмарк, который а) не заявляет о себе что он правильный б) задачи хотя бы отдаленно похожи на реальные в) проверяется выхлоп программы г) и любой желающий может засабмитить свою реализацию (хаскелянты, например, недавно на несколько миллисекунд переплюнули цепэпэ на pidigits). Измеряется полная память процесса, а не то сишники положили бы все данные в статическую памяти, и потребление памяти — ноль :))
Возьмем жабу. Версия ЖВМ? Серверная или клиентская? Код «прогревался» перед тестами? Разница в результатах даже если эти факторы менять — в разы. Не говоря уже о GC и прочем. Версия и тип ЖВМ указаны, но этого мало. А мерять память процесса для такого рода задач, которые в реальных программах представляли бы собой одну утилитную функцию, немного неверно. ибо интерпретаторы/виртуальные машины заведомо проиграют. Чарт там к тому же хз что показывает — координатные оси в попугаях. исходники реализаций есть (правда, сходу фиг найдёшь) — тут вопрос снимается. А в целом, неблагодарное это дело, такого рода фаллометрия.
Все там написано, и что код прогревался 65 раз. Даже если ограничиться бенчмарками, на которых цэпэпэ потребляет >100 Мб памяти, ситуация не намного лучше: [[1]], и жаба (даже -Xint) все равно памяти кушает больше, чем иные интерпретаторы. Хотя могу сказать, что один бенчмарк там на 100% высер — thread-ring. Программа ничего не делает, а потом выводит одно число.
То, что кушает больше, понятно. Жава и рациональное использование памяти — слабо совместимые понятия. Таковы уж принципы работы JVM и ограничения языка, что чтобы не занимать много памяти в процессе работы, нужно сильно постараться. | Прогревать JVM до запуска теста в принципе невозможно, ибо там меряется время выполнения процесса (или я ошибаюсь?). То есть если прогрев и имеет место (по коду жава-приложений это не видно), то время прогрева добавляется к тотальному результату. | А так убедил — тесты эти, пожалуй, одни из лучших из того, что есть, если повнимательней на них взглянуть. Но всё равно это всего лишь тесты. Реальность иная (и не обязательно в пользу Жавы).
Я не знаю, как кэширует и кэширует ли вообще серверная JVM код, но можно посмотреть время выполнения при малых N [[2]] и убедиться, что время старта не может определять двухкратное отставание по скорости при больших N. Эффективно использовать память на JVM можно: достаточно оттранслировать паскаль или цэ в JVM, они там выделят массив байтов и будут расходовать экономно.

[править] Примечания

  1. В общем и целом — никакая интерпретирующая среда никогда не сможет исполнять код в точности с той же скоростью, с которой он выполняется будучи откомпилированным. Я гарантирую это! Да, для определённых задач и определённых участков исполняемого кода, джавовские JIT-компиляторы могут выдать сопоставимое быстродействие. Но! Аффтар, не забывайте о том, что наряду с вашим конкретным приложением, так же исполняется и вся JVM. Все эти бенчмарки, где Джава якобы работает так же, а по материалам самого Солнышка — в десять раз быстрее (разумеется!), чем компилируемые языки, считают только чистое время исполнения кода задачи в лабораторных условиях — с супероттьюненной под конкретную задачу JVM и отключённым сборщиком мусора. А в плане всего комплекса реальных задач Джава всегда будет медленнее. Просто обычно бывает неважно — ждёт пользователь 3 сотых секунды, или 3 стотысячных — человеческое восприятие этого всё равно не различает. Но если речь идёт, к примеру, о массовой обработке транзакций (сотни тысяч в минуту), Джава — не лучший выбор, а зачастую и вообще не выбор, ибо не потянет, даже на очень крутой машине.

[править] Перенаправление с java сделайте!

Хуй найдешь ведь.

[править] В жабе нет указателей?

А это что?

import java.util.*;
 
public class Moo {
    public static void main(String[] args) {
    	int[] x = {1,2,3};
    	int[][] y = new int[8][];
 
        System.out.println(x);
        y[0][0]++;
    }
}

выводит (под вендой):

Exception in thread "main" java.lang.NullPointerException
        at Moo.main(Moo.java:10)
Петровичу больше не наливать. Где в жаве тип «указатель на …»? NullPointerException — атавизм, правильне было бы назвать NullReferenceException.
Уж ежели приспичит…
public class Ptr<O> {
   public O ptr;
}

То, что в жабе называется ссылками, в паскалях и оберонах называется указателями. В оберонах и ди указатель при необходимости неявно разыменовывается. Очевидно, что авторы жабы поменяли терминологию маркетинга ради. (А я сам нехило удивился, что в жабе можно распечатать указатель.) А собственно ссылок в жабе нет. В языках, где есть ссылки, можно написать функцию/процедуру, которая меняет содержимое своих аргументов местами. В жабе этого сделать нельзя.

1) То, что в жаве называется ссылкой, прямого аналога в паскале не имеет. Указатель подразумевает адресную арифметику. В жабе её нет. 2) Если непонятно, как в жабе через ссылку поменять состояние обжекта — то почитай книжки по сабжу сначала. Если не поможет — помогу демонстрационным хэлловорлдом. 3)То, что распечатывается — это хэш-код, который, строго говоря, зависит от реализации. Ну и даже от Сан в 64х жабе что распечатается, когда указатели там 64-битные, а sizeof(int) = 4? Что за мода такая — выдавать детали реализации за спецификации?
Ололол, Undefined Behaviour в жабе. А вот это можно перевести на жабу?
procedure swapint(var x,y : integer);
  var temp : integer;
  begin t:=x; x:=y; y:=t; end;
var a,b : integer;
begin
  a:=4; b:=7;
  swapint(a,b);
  writeln(a,' ',b);
end.
Указатель нихуя не подразумевает адресную арифметику. В паскале изначально указатели были, но адресной арифметики не было и ее прикручивали как попало. Алсо, читаем статью про указатели Фортрана: http://hilbertastronaut.blogspot.com/2009/03/dark-secrets-of-art-c-pointers-and.html. 3) нихуя не хэш-код. для двух разных объектов с одинаковым содержимым он разный. распечатывается указатель. можешь с помощью GDB приаттачиться и посмотреть.
1) Батенька, в жаве нет передачи аргументов по ссылке. Чтобы сделать Swap, нужно создать class {int x, int y}, передать его инстанс в функцию и менять значения уже там 2) Указатель может указывать на что угодно в памяти. Это просто адрес. В жаве ссылка или null или указывает на Object требуемого типа. Третьего не дано. 3) читай спеки для начала. Единственное требование к хэш-функции — одинаковые значения для equal Objects. По-умолчанию разные инстансы Object друг для друга не equals. Срочно в библиотеку! Стоит начать с жава-доков Object#equals(Object), Object#hashCode. Море новой информации гарантирую.
С адресами работают в ассемблерах и машинных кодах. Указатель, еще раз, вовсе не обязан быть адресом в памяти — стандарт языка Си этого не требует. Указатели на функцию член класса с виртуальным наследованием и вообще могут занимать в 3-5 раз больше, чем void*, в зависимости от реализации.
Стандарт языка Си о функциях-членах ничего не знает. Как и о ссылках. Если говорить о C++, то концептуальная разница между ссылкой и указателем описана в книжке Страуструпа «Язык программирования С++». Да и в целом — яблоки с апельсинами сравнивать не надо. Достаточно отметить, что указателей в Жаве нет. Насчёт стандарта С (лучше С++) — цитату было бы неплохо (просто для личного развития).
Лол, а указатели на функции-члены — не указатели, что ли? Пример указателей на данные, не являющихся адресами — дальние указатели в x86, где старшие 16 бит являются селектором.
Когда в жаве я смогу из какого-нибудь рандомного int получить указатель на что-нибудь, тогда в жаве появятся указатели. А пока что ступайте в сад со своими хэш-кодами и указателями на члены-функции в C++.
Указатель - это число, с которым доступны любые арифметические и битовые операции. Со ссылкой доступно только разыменование и присваивание и то с учетом ограничений типов. — 00:24, 5 сентября 2015 (MSK)

[править] Scanner

Также в ACM’е каждый жабокодер вынужден писать свой класс для чтения чисел из файла, так как встроенный в языкпоставляемый со стандартной библиотекой Scanner работает слишком медленно.

А про Integer.parseInt() et al. британские учёные молчат?
parseInt только преобразует строку в число, а надо еще открыть поток и распарсить — ваш К. О.
О ужас! Как же я на Турбо-Паскале с этим справлялся, будучи школьником?.. 3-х строчный код токенизации по словам текстового файла надо приводить? | Ну и в целом, стоимость парсинга файла — O(n), а значит, на стоимость решения вычислительно сложных задач не влияет (при отсутствии мегабайтных входных файлов или наличии буферизации чтения файла) | Да и в целом — жаба сама по себе тут не при делах. Все вопросы — разработчикам конкретной версии стандартной библиотеки.
Стоимость парсинга N чисел от 1 до N не O(N), а O(N*log N) — такие задачи встречаются часто, так что влияет. А на Паскале эта проблема не возникала потому, что read является частью языка, и компилятор заменяет read вызовами написанных на асме процедур.
«а надо еще открыть поток и распарсить — ваш К. О.». Специально для нашего К. О. — выделять лексемы руками из текстового файла и парсить их через Integer.parseInt(). Какие проблемы? Стоимость такой операции что на Жабе, что на Паскале что на Луне — асимптотически одинаковая. А если Scanner глаза мозолит — то язык тут ни при чём. | Ну и стоимость парсинга всё же O(n), где n — размер файла
O(1) still sucks for large values of 1. — К. О.
Гражданин К. О., если стоимость самой задачи N*N, то чтение файла со стоимостью O(1) в пределе на бесконечности роли играть не будет. Повторюсь также, что это проблемы конкретной реализации Scanner или твои, если в какой-то поставке JVM он тебя не устраивает. Язык тут ни при чём. Если ты хотел сказать, что у жабы для O(1) большая константа на операцию чтения, то можно побенчмарчить — парсинг файла на C (твоя реализация) и парсинг файла на жабе (моя). Если разница будет в 100 раз не в пользу жабы, тогда соглашусь.
Отлично, сравниваем scanf vs. readln vs. Scanner. Задача — прочитать сто миллионов чисел и вывести из них наибольшее. Файл надо сгенерить отдельной программой на жабе, чтобы убедиться, что все три программы читают одни и те же числа. Алсо, речь шла о сановской JVM/JRE, то есть самой правильной.
Ок. Только сравнивать readln (unicode) со scanf (ASCII) некорректно. Поэтому формат файла — сколько угодно чисел, разделённых пробелами (если угодно, разделителем строки '\n'). Некорректные файлы не рассматриваются. Я пишу свой парсер в наиболее на-скору-руку виде на жабе. Со Scanner и scanf сам давай.
Вот моя программа. Запускай с JVM опцией -server. Разделитель между словами — пробел. Кол-во чисел изначально неизвестно.

   import java.io.BufferedInputStream;
   import java.io.File;
   import java.io.FileInputStream;
   import java.io.IOException;
   
   public class Max
   {
       public static void main(final String[] args) throws IOException
       {
           int max = Integer.MIN_VALUE;
           final BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File("c:/stuff/a.txt")));
           int i;
           final StringBuilder b = new StringBuilder();
           while ((i = in.read()) >= 0) {
               // conversion is safe just because it is know the file is ASCII.
               final char c = (char) i;
               
               if (c == ' ') {
                  if (b.length() > 0) {
                       final int num = Integer.parseInt(b.toString());
                       b.delete(0, b.length());
                       if (max < num) {
                           max = num;
                       }
                   }
               } else {
                   b.append(c);
               }
           }
   
           if (b.length() > 0) {
               final int num = Integer.parseInt(b.toString());
               b.delete(0, b.length());
               if (max < num) {
                   max = num;
               }
           }
   
           try {
               in.close();
           }
           finally {
               System.out.println(max);
           }
       }
   }

Угу. Это уже неправильно: мало того, что работать будет только с пробелами, если последнее число не имеет пробела после себя, то оно не будет обработано. Где генератор тестового входа? А вообще, речь шла о том, что именно Scanner работает медленно, и на контестах сишники пользуются обычным scanf, а явисты пишут немало кода.

1) Последнее число без пробелов обработано будет, можешь проверить. 2) Добавить какие угодно разделители — это разве проблема? if (c < '0' && c > '9'), если угодно. Формат «олимпиадных» текстовых файлов этого не требует. В других случаях код будет другим, опять же скоростной. 3) Речь потом зашла о скорости парсинга текстового файла — мой код парсит файл настолько эффективно, насколько эффективна работа жёсткого диска по чтению текстового файла. 4) Scanner, в его реализации от мозгов от Сан, — это убогое поделие, целиком завязанное внутри на регулярные выражения. использовать его для вычитки файлов больше пары килобайт будет только истинный быдлокодер. Программисту дан мозг для того, чтобы им пользоваться. 5) Предлагай свой код со scanf — посмотрим-полюбуемся (в хорошем смысле) 6) Генератор — создай файл, запиши туда 3 числа, а дальше — loop(ctrl+a? ctrl+c, ctrl+v) до нужного размера. За 20 итераций получишь нужного размера файл. Содержимое его для целей тестирования скорости парсинга неважно. 7) написание этого немало кода заняло минут 10. Много? Написание с использованием Scanner, scanf итп заняло бы раза в 2 меньше. Но, если scanf отдаёт нуль при кривом файле, то кто бы написал код быстрее? 8) Тестировать будем скорость? | Предварительные выводы от меня: 1) использование Scanner в его реализации от Sun для обработки простых текстовых файлов большого размера — показатель истинного быдлокодия и невыработанного навыка RTFM 2) проблемы это не вызывает практически никакой. Да и появился он в жабе этак шестой (может, пятой). До сканера жили жабакодеры и жить будут 3) к жабе, как к тормознутому _по определению_ созданию, кривая библиотека от одного (пусть и основного) дистрибьютора не имеет прямого отношения 4) Фразу про Scaner, если возвраСЧать в статью, то наверное, с переформулировкой — ибо его использование в контексте ACM неоправданно в принципе.
А хотя, можно даже не переформулировать, ибо всем ясно, на какой JVM запускают тесты. Я верну.

Тестирования производительности для подтверждения или опровержения «O(1) still sucks for large values of 1. — К. О.», похоже, не будет. А жаль. Всё как всегда — виновата жаба :) К. О. is so К. О.

Нефиг юзать тормознутый Scanner, чоткие пацаны юзают StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(new FileInputStream(new File("a.in"))));

[править] В защиту метвых

J2ME в натуральных Siemens’ах обеспечивала написанным под Siemens мидлетам доступ ко всей файловой системе, в отличии от других производителей, ограничения стали появляться только в New SGold платформе.

[править] Java — это нэ толко ценый мэх.. но и анальная кара для недоучек

Заебали уже про память, JIT, указатели которые не указатели и прочие чисто языковые особенности. А Spring, JUnit, Struts, EJB (особенной третий), мульоны других фреймворков? Жава дала кучу идей тому же шарпу, да и всяким рубям с пехапе. Кстати, аннотации весьма кошерны. Ваш WebSphere-кун.

  • Спринг - говно.
Это ты говно недоученное, а спринг уже стандарт в J2EE6, называется только CDI
Угу, и только не Спринг это вовсе, и нихуя не "стандарт".

В смысле - с чисто академической точки зрения DI и AOP - офигенные штуки (в теории). А на практике получается так:

В реальной практике а не на каникулах в школе получается децл по другому:
две технологии: контейнеры и ORM были в джаве практически всегда и долбоебы не понимающие зачем нужен спринг или хибернейт фактически не понимают зачем нужен энтерпрайз.
Подпись - долбоёб-школьнег на каникулах, который фактически не понимает зачем нужен энтерпрайз, зато где-то увидел умную аббревиатуру "Object-relational Mapping".
По делу есть что сказать, убогий?
в больших приложениях (где использование Спринга теоретически можно обосновать) Спринг всегда создаёт больше проблем, чем решает, так как навязанная им структура компоновки очень быстро превращается в огромный пиздец, с которым очень трудно работать, а в маленьких и простых приложениях Спринг просто не нужен.
спринг, как и любой контейнер, нужен в первую очередь для реализации модульности, убирания жестких связей между

твоими классами и нужно это всегда в любом проекте где код пишут более одного человека и нужно покрытие тестами.

безусловно, только спринговая модульность и убирание жёстких связей создаёт большой пиздец, о котором написано выше.
В чем выражается "пиздец"? Жаба-Обезьян из Бангалора не осилил xml?
  • Aннотации в том виде, в котором их используют рукожопые энтэрпрайзеры - говно. Додуматься ж надо сервлеты через аннотации описывать.
сервлеты появилась возможность описывать через аннотации только в j2ee6, используют ее пока только ради красивого понта.
Уебанам и в голову прийти не может, что может потребоваться 2 инстанса сервлета (возможно, с разными настройками) в одном приложении.
это плохой кейс, так не делают.
ты так не делаешь? "отучаемся говорить за всех" ;)
да бля я так не делаю, и все нормальные программисты, работающие за деньги а не за еду так не делают. Потому что нет причин так делать.
Аналогичны все остальные потуги (веб-сервисы, ежыбы). Единственное где они нормально юзаются - JUnit 4, но при этом классический 3.8.2 и то получше выглядит. А стратс 1 весьма недурён!
дедушка, ты когда уже сдохнешь?
  • Да и этот ваш WebSphere - говно. Очень тяжёлая ресурсовая жаба с неоправданно переусложнённым интерфейсом и deployment-архитектурой, где есть cells, nodes, servers, hosts, virtual hosts, node agents (и у всего этого ещё есть алиасесы и хрен знает ещё что), дибильные stubs для EJB-деплоймента и т.п. и т.д. Налицо желание буржуинов из IBM обеспечить себе экслюзивный заработок на фигне, которую для экспертного владения надо изучать несколько лет. В православном WebLogic'е тот же самый функционал доступен после двух-трёх кликов.
Перед вами выступал
Дядя Вова-наркоман
В твоем веблоджике все ровно точно также, с той лишь разницей что сфера работает а веблоджик глючит.
- Быдлокодер-кун сорвал покровы с тупых обличителей! Браво! Бис! Овация! (и нихуя в Веблоджике всё не так же, а гораздо проще и быстрее, а твоя быдлосфера глючит не меньше).
Слышь дятел, вся линейка Oracle (Weblogic->Suite->ESB) стоит где-то раз в 5 дороже аналогичной от IBM, это значит что за веблоджик платят больше. А твою вебсферу сейчас знает каждый второй Ашот с рынка. Причем оракл не жмется и дает качать практически все продукты в отличие от голубых, которые бесплатно дают только пососать член.

[править] Исключения

>Выполняются исключения медленно, если хранить в них данные о стеке (чего можно избежать). Покажите мне такую JVM, которая исключения обрабатывает так же быстро, как традиционные механизмы управления.

Плюсую. Покажите мне КАК можно избежать хранения данных о стеке в Sun Hotspot JVM.
Вспоминается старый боян про армянское радио --

Армянское радио спрашивают: Какое средство лучше всего использовать для предотвращения нежелательной беременности?
Армянское радио отвечает: Газированную воду
Армянское радио спрашивают: ДО того или ПОСЛЕ того?
Армянское радио отвечает: ВМЕСТО.

Так вот -- пиши на няшной сишке.

[править] Чемпионы ACM ICPC

Самим не смешно приводить статистику из 3 точек? На ICPC жаба кажется еще с 2004 года есть. По правилам там не делается различия между программами, использующими 50% или 30% от лимита времени, поэтому тем, кто с самого начала пишет прямой код (а становятся чемпионами только такие) нет разницы на чем писать, так как эталонные решения тоже на жабе. Необходимость набрать немного больше ручками в формате ACM (5 часов, 3 человека) не представляет сложности, так как один человек набирает один раз и потом копируется. Другое дело — топкодер (75 минут, 1 человек), там такое не прокатит, поэтому входные данные передаются как параметры функции (недостаток этого — нельзя сделать доступной сдачу решений на большом числе языков)

[править] java vs limbo

Собственно, сабж. На limbo написана целая операционная система, быстрая и экономная к памяти, когда же на java даже hello world съедает сотни памяти. inb4: некрофил, упорот, плантард, «хайль юникс, хайль линакс, хайль иксэмэли, хайль ява!»

Почитал про лимбу. Похоже отличается от жабы главным образом, синтаксисом. Я что-то пропустил?
Ну во первых, в лимбо нет никаких ООП-извращений, но есть няшные классы типов (как в го или хаскеле) и есть CSP, с его помощью потоки общаются между собой через каналы. Во вторых, там регистровая виртуальная машина, когда же в яве — стековая. Регистровые виртуальные машины работают эффективнее стековых, по крайней мере на современных машинах. В третьих, там другая реализация управления памятью, и лимбо требует меньше ОЗУ, чем ява. В четвёртых — 9P (да, плантарды довольны). В пятых... ладно, пока остановимся на синтаксисе.
Вот только спрос на операционные системы, написанные ради понта, равен нулю. — 00:26, 5 сентября 2015 (MSK)

[править] Магическое число

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

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

[править] Энтерпрайз

Энтерпрайз смотрит на жабаёбов как на говно

Энтерпрайз - что это за херня вообще? Есть редирект "Энтерпрайз", который редиректит на эту статью, но в самой статье слово не встречается ни разу. В данном обсуждении слово встречается четыре раза, и ни из одного упоминания неясно, что это. Очевидно, профессиональный жаргон, но какого хрена?
Вообще-то это слово имеет полно значений (так как его наиболее распространённый перевод - "предприятие"), прежде всего негодуют фанаты стар трека и авианосцев. По-хорошему тут нужен дизамбиг, но блджад, я же не могу сделать дизамбиг, если в душе не ебу, какое отношение имеет слово "энтерпрайз" к жабе! —оdɓǝ⨿ ņıqɯʎнɐƍ∃ 12:40, 11 октября 2012 (MSK)

Так и правь статью про энтерпрайз — дизамбиг не нужен.
А чего это у авианосца за палочки по краям? Вёсла штоле?
во избежание недоразумений нужно говорить "ынтерпрайз" — тогда все будет понятно и однозначно. Фильм The Office Space все видели?

А с бортов там чего свисает? Удочки штоль?

[править] О Лурк укажи путь личинке быдлкодера

недавно вот оформил доменное имя и купил хост - потом установил вордпресс и ощутил себя невьебенным программером - а потом почитал статью про CMS на Лурке и понял - что я - унылое говно - и код мой - индуский так вот подскажите пжлст учебник по жабе и по пыхпыху дабы на этой планете было одним быдлопрограмерром меньше с уважением - А

Качай самые последние с сайтов proklondike и progbook, чего уж там... и на форум RSDN загляни.
 : Коллега! Мну тут посоветовали: Bruce.Eckel.Thinking.In.Java

К. Сьерра, Б. Бейтс - Изучаем Java OReilly.Head.First серия: и сервлеты и патерны и сама Жаба. Последние книги со "слайдами", т.е. наглядными картинками.

[править] Поцчему нет ни слова

о дырах в JVM, количество которых растёт экспоненциально с каждым новым оракловским патчем для устранения дыр? Ведь это же рай для эксплоитов!

Воистину чудесны труды Гослинга, да будет с ним Эккель, пророк его, и да собран будет всякий мусор на земле.
Гослинг сказал:
Я дал вам этот [язык] чтобы каждому было даровано место в Бодишопе и каждый смог получать [плату] более соседа своего и друга своего.
Если скажут тебе, что математика и иная наука важнее моего учения, не слушай этого, ибо я дал тебе всё в полноте и в полной мере. Воистину чудесен мой язык и неповторим. И ученые мужи и простаки и немощные и падшие духом будут равны в Бодишопе и прибудут в довольствии и будут [досыта] есть и пить еду из иных земель и будут передвигаться на искусных колесницах и будут в радости и покое, пока ум их и дух их пребывает в моём учении и свидетельствуют они из книг Эккеля, пророка моего, и да собран будет всякий мусор на земле.

[править] Дейкстра о Жабе

http://www.cs.utexas.edu/users/EWD/transcriptions/OtherDocs/Haskell.html

Finally, in the specific comparison of Haskell versus Java, Haskell, though not perfect, is of a quality that is several orders of magnitude higher than Java, which is a mess (and needed an extensive advertizing campaign and aggressive salesmanship for its commercial acceptance). It is bad enough that, on the whole, industry accepts designs of well-identified lousiness as “de facto” standards. Personally I think that the University should keep the healthier alternatives alive.

[править] Компилятор ?

Цитата из раздела "Не тормозит":

Компилятор Java уверен, что программист — дебил, поэтому за программиста производит улучшения кода на этапе компиляции. Так например что-то вроде int c = 1000; for (int i = 0; i < 100000; i++) { c++; … } будет приведено к чему-то вроде int c; for (c = 1000; c < 101000; c++) { … }, в то время как компилятор C уверен что программист знает что делает, и добросовестно скомпилирует самый дебильный код.

Сами вы компилятор, и сами вы дебилы.

P.S. Я не сторонник Java, не дорос ещё. Но то, что я знаю точно - код под JVM интерпретируется. И JIT тут не при делах, ибо это не фреймворковский ЯП.

Читни книги Таненбаума, байт-код ещё раз компилируется, после чего страницы памяти отображаются в адресное пространство JVM.

[править] И не слова про майнкрафт

Такая большая статья - и не слова о Майнкрафте Школота негодует!

И не только майнкрафт. Ил-2 штурмовик ещё. И ещё с десяток игр, которые используют жаву фактически как скриптовый язык. Всё-таки LUA, порой слишком абстрактен и функционален.

[править] Скучно было

#include <cstdlib>
#include <jni.h>
 
extern "C" JNIEXPORT jobject JNICALL Java_Hello_malloc(JNIEnv* env, jclass, jlong size)
{
    jbyte* ptr = (jbyte*) std::malloc((size_t) size);
 
    ptr[0] = 15;
    ptr[1] = 8;
 
    return env->NewDirectByteBuffer(ptr, size);
}
 
extern "C" JNIEXPORT void JNICALL Java_Hello_free(JNIEnv* env, jclass, jobject buffer)
{
    std::free(env->GetDirectBufferAddress(buffer));
}
import java.nio.ByteBuffer;
 
class Hello
{
    private static native ByteBuffer malloc(long size);
    private static native void free(ByteBuffer ptr);
 
    static {
        System.loadLibrary("Hello");
    }
 
    public static void main(String[] args)
    {
        ByteBuffer bytes = malloc(10);
 
        System.out.println(bytes.get(0));
        System.out.println(bytes.get(1));
 
        // А освобождать не буду потому, что это Жаба! Кудах-тах-тах, пок-пок-пок, крестопетух — не человек!
    }
}

Прикол в том, что вместо ByteBuffer можно указать byte[] и всё будет работать. Правда, в bytes[0] и bytes[1] будет что-то явно левое. То есть bytes будет самым настоящим и никак не контролируемым указателем хуй поймёшь куда и на что. Жаба вообще никак не проверяет, что ей там реально подсовывают.

Как то писал распределённый кросс-платформенный (Unix трёх типов, Linux, Win от 95 до 7) сервер приложений на джаве (на чём ещё просто не придумали). Так мы подобным образом и произвольный код (собственно приложения) запускали и вроде-как-пайпы-в-памяти через сеть перебрасывали, общую разделяемую память (кучу) приложениям давали (физически лежала, кусками на разных машинах)... Тот кто говорит, что на джаве нельзя программировать низкоуровневые приложения - не шарит в (системном) программировании от слова вообще. Это можно хоть на LOGO делать - была бы причина.


[править] Век живи, век учись

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

throw SomeException.error.BAD_PASSWORD

А еще кажется, что некоторые программисты бросают эксепшены так, как будто нахуй посылают. Мол, нет того и этого – иди нахуй.

[править] ООП хорошо подходило

ООП хорошо подходило для сочетания двух условий - "у нас есть задачи дискретно-событийного моделирования" и "у нас есть Algol60 и больше нихуя". К Алголу60 оказалось очень легко прикрутить несколько полезных (для той задачи) хаков, которые (на тех компьютерах) еще и были дешевы в смысле скорости. Сначала они хотели сделать препроцессор (что логично - Страуструп через много лет тоже начал с этого и собирался этим и ограничиться), но им понадобились и некоторые другие расширения Алгола и ограничиться препроцессором не удалось.

И все эти "Концепции ООП" появлялись именно таким способом: вот интересный (и дешевый в реализации) эффект — как мы можем его использовать? Началось все с того, что понадобилось придумать новый (быстрый) способ передачи параметров в процедуры. Стандартные алголовские способы: по значению и по имени были медленными по разным причинам. Тогда Хоар изобрел ссылки и null. Раз уж структурная эквивалентность оказалось сложной в реализации, сравнивать стали адреса, по которым "объекты" располагаются — появилось identity. Обратили внимание на то, что блок памяти B, структурированный в начале так же, как и блок A можно обрабатывать процедурами, написанными для работы с A — появился "префиксинг" (даже синтаксически объявление класса родителя было префиксным), под который потом подвели идеологию и назвали "наследованием" (ну и понятно, почему сначала никаких "множественных наследований" не было — что такое "множественный префиксинг"?). К рекордам добавили процедуры, диспетчеризующиеся по одному аргументу. Почему именно по одному? Потому что по n > 1 — сложно в реализации.

Прекрасно решили свои задачи дискретно-событийного моделирования, на тех компьютерах что у них были, и успокоились. Но пришел Алан Кей и все испортил. Кей и прочие смолтокеры захотели сделать не такой вот "натянутый" на структурное программирование ООП, а идеологически чистый и непротиворечивый. Для этого они подвели базу под все эти технические срезания углов. Получилась чистая реализация идей, придуманных для быстроты и простоты реализации, только медленная и сложная. Они не смогли все это заставить вертеться с приемлемой скоростью до 90-х годов, когда стало уже поздно. Чтоб ввести Симула-лайк ООП в мейнстрим понадобилось только (временно) отказаться от сборщика мусора. Однако, вся философия и методология ООП, паттерны и юнит-тесты и т.д., придуманные смолтокерами не пропали, а были адаптированы мейнстримом.

Смолток — это не "изначальное древнее ООП", а возрождение умирающего старого и реформация неправильного ООП, загнувшееся, правда, раньше нем неправильное, пока по настоящему древнее ООП все продолжало умирать. Ну и, понятно, философия ООП, которая превратила все картины, загораживающие дырки на обоях, в "краеугольные камни" концепции и "имманентные особенности человеческого мЫшленья".

[править] ООП нужно

ООП нужно, т.к. это правильный подход для симуляций, игр и прочих задач, которые по самой постановке должны решаться «снизу вверх». То есть для тех случаев, когда мы не знаем, как система должна вести себя в целом, но знаем как должны себя вести её компоненты.

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

[править] Вот, собственно, и вся

Вот, собственно, и вся суть ООП. В учебнике у нас

class Shape extends Drawable

и

triangle.draw()

а в реальности

DrawingManager.createDrawingManager().setDrawingTarget(TargetManager().create().makeDrawingTargetFromScreen(ScreenManager.getInstance().getCurrentScreen())).build().getContext().drawShape(triangle).finalize()
Ну что за бред тут школоло написало? В java нет стандартного класса Drawable, зато есть java.awt.Shape, но в нём нет метода draw. Т.е., очевидно что какой-то яблочник решил поговнокодить под андроид, но почему-то решил вылить свои помои в статье про java, а не в статье про android. Это раз. Два у нас будет то, что такое извращение просто дико притянуто за уши, ибо в нормальном коде все ининцализации проходят где-нибудь в отдельном методе, а все доставалки должны быть упрятаны в тот самый метод draw. Так что отрисовать Drawable, действительно достаточно написать Shape.draw(). Но у говнокодеров своя жизнь...