>Это сейчас практически не проблема — памяти ощутимо много
Нет, это проблема. Инлайнинг и анлоллинг ведёт к дублированию кода. Большой код может хуже помещаться в кеш инструкций и поэтому его выполнение будет медленнее. Например, ядро Linux сейчас по умолчанию компилируется с -Os, а не -O2 (опция CONFIG_CC_OPTIMIZE_FOR_SIZE).
Я же об этом и говорю (правда написал едко). Сам при разработке использую только vim в качестве редактора (и абсолютно не жалею, что не пользуюсь IDE, где суммарный размер панелек на экране превышает размер окна с кодом).
Сэкономили пусть даже 15 байт за одну компанию, зато очень и очень потеряли в скорости обработки данных (как при выборке — полный просмотр, так и при вставке/редактировании — цикл). В общем, поменяли шило на мыло.
>> Полиморфизм — взаимозаменяемость объектов с одинаковым интерфейсом.
Или, говоря более простым языком (и в контексте языков с «традиционным» ООП), полиморфизм — это возможность использования экземпляра класса-наследника там, где требуется экземпляр базового класса. (Это определение можно легко расширить и на интерфейсы, если учесть, что интерфейс — это чисто абстрактный класс.)
Но существуют «немного другие» модели ООП, где наследования нет и поэтому определение из Википедии более корректно, так как оно верно для обоих случаев.
То, что вы назвали полиморфизмом, на самом деле — принцип работы виртуальных функций.
> Метод, переопределяемый в производном классе, называется виртуальным.
> необходимо фундаментально проработать теорию, чтобы хоть что-то сделать
Оно действительно так и есть. Чтобы сделать что-нибудь интересное и нетривиальное, исправить баг в чужой программе или разобраться как работает большая система, нужны и знания, и опыт. Если же вы хотите заниматься программированием «для души», то возьмите любую книгу, которую вам интересно читать, и пишите в пределах рассказанного там.
Для «свободного полёта» в изучении никак нельзя без той самой базы, которую нужно изучать фундаментально. Конечно, вы слышали рассказы «я изучил PHP самостоятельно и работаю в классной студии!», «я сам изучаю С++» и прочее, однако эти люди скорее всего уже имели некоторые базовые знания (или они во время изучения много работают самостоятельно, читают дополнительную литературу и получают те же самые базовые знания, однако это огромный труд). Обычно после «самостоятельного» изучения знания остаются в голове отрывками и полной картины нет. То есть человек может писать программы, иногда даже немаленького размера, однако объяснить как и почему некоторые вещи работают просто не может.
> Я не сталкивался с ресурсами, которые на нормальном русском языке
К сожалению, качественной литературы на русском языке очень мало. По некотором специфичным темам есть только англоязычная литература. А официальная документация на компилятор/интерпретатор и сами спецификации языков всегда на английском. Поэтому, если действительно хотите программировать на серьёзном уровне, придётся выучить технический английский.
> объясняют что такое фреймворк
Это уже детали…
> с чего необходимо учится программировать, что такое алгоритмы
А вот с этого нужно начинать.
> что делать, если я хочу заниматься только веб-программированием и ничем иным, и меня не интересуют всяческие паскали, спп и ассемблеры.
А об этом нужно забыть. Сейчас ни языки программирования, ни машины не достигли ещё такого уровня абстрактности и производительности, чтобы вы могли спокойно забыть о том, что именно делает машина во время исполнения вашего кода. Волей-неволей вам со временем придётся спуститься на уровень ниже и, например, понять, что в памяти хранятся только числа, а остальные данные представляются в виде отображения человекопонятных символов на числа (без этого вы ней сможете разобраться с проблемой кодировок текста, например). Вы как веб-программист можете не знать всех подробностей работы машины, но слепо отмахнуться от них не можете.
Учиться лучше всего по классическим учебникам. Причём то, что вы изучите на начальном этапе может быть слабо связано с тем, чем вы будете заниматься ежедневно на работе. Потому что задача обучения — развить навык решения задач и научить некоторым стандартным приёмам. Без этого нельзя уходить в специфичную область, так как там обычно взаимодействуют десятки технологий и сотни стандартных инженерных решений, которые нужно понимать подсознательно чтобы эффективно с ними работать. А именно самостоятельному применению стандартных решений и узнаванию их в чужих системах и можно научиться решая «неинтересные академические задачи».
Если хотите проработать курс по такому фундаментальному учебнику — читайте SICP: mitpress.mit.edu/sicp/ или этот качественный перевод на русский: newstar.rinet.ru/~goga/sicp/sicp.pdf
Но для написания хороших сайтов JavaScript не является обязательным! Для хорошего сайта главное — это контент, и во вторую очередь дизайн, и уже только потом всякие «удобности». Например, я бы абсолютно не расстроился, если бы на хабре для написания комментариев открывалась отдельная страница, а не яваскриптом формочка отображалась; это абсолютно не важно, так как посетитель приходит на сайт за контентом. Если это объяснить детям, они это поймут, не глупые ведь.
А JavaScript это действительно «самый недооценённый язык в мире». Все думают, что он очень простой, но на самом деле в нём слилось столько различных концепций и парадигм, и для полноценного понимания всего этого нужен существующий опыт или время на полноценное изучение. К сожалению, многие, кто пишет на JavaScript, тоже не знают действительную мощь языка и даже половину его возможностей.
У вас почему-то все языки императивные и со строгой типизацией (Pascal, C, C++). Какой в этом смысл? Паскаль как песочница для алгоритмов возможно ещё ничего (хотя есть лучшие альтернативы). Но Си… Мне честно очень интересно, все ли понимают, что такое указатель? Как работает механизм препроцессора? Что такое статическая память? Как объявить переменную типа «указатель на массив из пяти int»? Си это сложный язык и изучать его поверхностно просто вредно. Ученику может быть многое непонятно если он не знает как работает микропроцессор (например, что отрицательные числа представляются в дополнительном коде; как происходит вызов функций). Программирование может превратиться в программирование перестановками en.wikipedia.org/wiki/Programming_by_permutation Про сложность C++ вообще не хочется вспоминать. «C/C++» вообще нельзя писать, это два разных языка с разной идеологией. То, что хорошо в Си, может быть плохим тоном в C++, и наоборот. C++ это не Си, в который добавили ключевое слово class.
Я думаю, что хорошим первым языком является Scheme. Посмотрите SICP и HtDP. Изучение Паскаля и Си на 90% является изучением синтаксиса и борьбой с компилятором чтобы тот «разрешил» наконец запустить программу. Синтаксис Scheme настолько простой и однородный, что его можно объяснить за 10 минут. Уже через 30 минут обучаемый под руководством преподавателя может написать небольшую процедуру, вычисляющую что-то околоматематическое. Scheme действительно позволяет изучать алгоритмы и различные приёмы программирования, не втягивая кучу ненужных деталей, которые только мешают увидеть «большую картину» (а это, в том числе, синтаксис, управление памятью, строгая типизация).
SICP скорее всего не подходит как первый курс для всех (он сложен для тех, кто не собирается получать инженерную профессию). А немного переработанный HtDP вполне подойдёт.
TINETEXT может быть длиной до 255 байт; для хранения самой длины достаточно одного беззнакового байта (0-255); суммарная длина 255 + 1 = 256.
MEDIUMTEXT может быть длиной до 16777215 = 2^24-1; для хранения длины достаточно трёх байт без знака; суммарная длина 16777215 + 3 = 16777218. А у вас 16777219. Откуда взяли цифру?
(Это не упрёк автору, это хорошая практика разработки. Хотя с другой стороны, новичок в базах данных, который видит это разнообразие типов впервые, обязан всё равно читать документацию. В общем, не совсем ясно, может ли такая простыня из цифр быть кому-нибудь полезна...)
Если бы мне на почту регулярно падало что-то размером 200-600 Кб, это бы вызывало у меня только отрицательные эмоции. Рассылайте ссылки на файлы, электронная почта не предназначена для передачи больших объёмов данных.
Да, я не C#-разработчик, просто статью прочитал :) Для меня lambda — это как в Lisp, полноценный способ «создать процедуру». А в C# видимо терминология наоборот (по историческим причинам, видимо). Или в C# лямбда-выражения более «урезаны» (например, как в python, разрешено только одно выражение)?
Это называется инкапсуляция.
Спасибо за хорошую статью!
en.wikipedia.org/wiki/Sequence_points
То есть там не миллисекунды, а сотые доли секунд.
Нет, это проблема. Инлайнинг и анлоллинг ведёт к дублированию кода. Большой код может хуже помещаться в кеш инструкций и поэтому его выполнение будет медленнее. Например, ядро Linux сейчас по умолчанию компилируется с -Os, а не -O2 (опция CONFIG_CC_OPTIMIZE_FOR_SIZE).
Не говорите ерунды.
:)
М-да… Хоть бы сами выяснили что это такое, прежде чем постить. Хотя бы здесь: ru.wikipedia.org/wiki/Полиморфизм_в_языках_программирования
>> Полиморфизм — взаимозаменяемость объектов с одинаковым интерфейсом.
Или, говоря более простым языком (и в контексте языков с «традиционным» ООП), полиморфизм — это возможность использования экземпляра класса-наследника там, где требуется экземпляр базового класса. (Это определение можно легко расширить и на интерфейсы, если учесть, что интерфейс — это чисто абстрактный класс.)
Но существуют «немного другие» модели ООП, где наследования нет и поэтому определение из Википедии более корректно, так как оно верно для обоих случаев.
То, что вы назвали полиморфизмом, на самом деле — принцип работы виртуальных функций.
> Метод, переопределяемый в производном классе, называется виртуальным.
Может в PHP оно и так, но вообще — нет.
Оно действительно так и есть. Чтобы сделать что-нибудь интересное и нетривиальное, исправить баг в чужой программе или разобраться как работает большая система, нужны и знания, и опыт. Если же вы хотите заниматься программированием «для души», то возьмите любую книгу, которую вам интересно читать, и пишите в пределах рассказанного там.
Для «свободного полёта» в изучении никак нельзя без той самой базы, которую нужно изучать фундаментально. Конечно, вы слышали рассказы «я изучил PHP самостоятельно и работаю в классной студии!», «я сам изучаю С++» и прочее, однако эти люди скорее всего уже имели некоторые базовые знания (или они во время изучения много работают самостоятельно, читают дополнительную литературу и получают те же самые базовые знания, однако это огромный труд). Обычно после «самостоятельного» изучения знания остаются в голове отрывками и полной картины нет. То есть человек может писать программы, иногда даже немаленького размера, однако объяснить как и почему некоторые вещи работают просто не может.
К сожалению, качественной литературы на русском языке очень мало. По некотором специфичным темам есть только англоязычная литература. А официальная документация на компилятор/интерпретатор и сами спецификации языков всегда на английском. Поэтому, если действительно хотите программировать на серьёзном уровне, придётся выучить технический английский.
> объясняют что такое фреймворк
Это уже детали…
> с чего необходимо учится программировать, что такое алгоритмы
А вот с этого нужно начинать.
> что делать, если я хочу заниматься только веб-программированием и ничем иным, и меня не интересуют всяческие паскали, спп и ассемблеры.
А об этом нужно забыть. Сейчас ни языки программирования, ни машины не достигли ещё такого уровня абстрактности и производительности, чтобы вы могли спокойно забыть о том, что именно делает машина во время исполнения вашего кода. Волей-неволей вам со временем придётся спуститься на уровень ниже и, например, понять, что в памяти хранятся только числа, а остальные данные представляются в виде отображения человекопонятных символов на числа (без этого вы ней сможете разобраться с проблемой кодировок текста, например). Вы как веб-программист можете не знать всех подробностей работы машины, но слепо отмахнуться от них не можете.
Учиться лучше всего по классическим учебникам. Причём то, что вы изучите на начальном этапе может быть слабо связано с тем, чем вы будете заниматься ежедневно на работе. Потому что задача обучения — развить навык решения задач и научить некоторым стандартным приёмам. Без этого нельзя уходить в специфичную область, так как там обычно взаимодействуют десятки технологий и сотни стандартных инженерных решений, которые нужно понимать подсознательно чтобы эффективно с ними работать. А именно самостоятельному применению стандартных решений и узнаванию их в чужих системах и можно научиться решая «неинтересные академические задачи».
Если хотите проработать курс по такому фундаментальному учебнику — читайте SICP: mitpress.mit.edu/sicp/ или этот качественный перевод на русский: newstar.rinet.ru/~goga/sicp/sicp.pdf
А JavaScript это действительно «самый недооценённый язык в мире». Все думают, что он очень простой, но на самом деле в нём слилось столько различных концепций и парадигм, и для полноценного понимания всего этого нужен существующий опыт или время на полноценное изучение. К сожалению, многие, кто пишет на JavaScript, тоже не знают действительную мощь языка и даже половину его возможностей.
У вас почему-то все языки императивные и со строгой типизацией (Pascal, C, C++). Какой в этом смысл? Паскаль как песочница для алгоритмов возможно ещё ничего (хотя есть лучшие альтернативы). Но Си… Мне честно очень интересно, все ли понимают, что такое указатель? Как работает механизм препроцессора? Что такое статическая память? Как объявить переменную типа «указатель на массив из пяти int»? Си это сложный язык и изучать его поверхностно просто вредно. Ученику может быть многое непонятно если он не знает как работает микропроцессор (например, что отрицательные числа представляются в дополнительном коде; как происходит вызов функций). Программирование может превратиться в программирование перестановками en.wikipedia.org/wiki/Programming_by_permutation Про сложность C++ вообще не хочется вспоминать. «C/C++» вообще нельзя писать, это два разных языка с разной идеологией. То, что хорошо в Си, может быть плохим тоном в C++, и наоборот. C++ это не Си, в который добавили ключевое слово class.
Я думаю, что хорошим первым языком является Scheme. Посмотрите SICP и HtDP. Изучение Паскаля и Си на 90% является изучением синтаксиса и борьбой с компилятором чтобы тот «разрешил» наконец запустить программу. Синтаксис Scheme настолько простой и однородный, что его можно объяснить за 10 минут. Уже через 30 минут обучаемый под руководством преподавателя может написать небольшую процедуру, вычисляющую что-то околоматематическое. Scheme действительно позволяет изучать алгоритмы и различные приёмы программирования, не втягивая кучу ненужных деталей, которые только мешают увидеть «большую картину» (а это, в том числе, синтаксис, управление памятью, строгая типизация).
SICP скорее всего не подходит как первый курс для всех (он сложен для тех, кто не собирается получать инженерную профессию). А немного переработанный HtDP вполне подойдёт.
MEDIUMTEXT может быть длиной до 16777215 = 2^24-1; для хранения длины достаточно трёх байт без знака; суммарная длина 16777215 + 3 = 16777218. А у вас 16777219. Откуда взяли цифру?
Кстати, я же говорил что нужно читать документацию, верно? Тут ведь всё написано dev.mysql.com/doc/refman/5.0/en/storage-requirements.html (первый абзац после таблицы Storage Requirements for String Types)
(Это не упрёк автору, это хорошая практика разработки. Хотя с другой стороны, новичок в базах данных, который видит это разнообразие типов впервые, обязан всё равно читать документацию. В общем, не совсем ясно, может ли такая простыня из цифр быть кому-нибудь полезна...)