- PVSM.RU - https://www.pvsm.ru -

11 неожиданных особенностей языков программирования

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

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

Пустые строки в Oracle SQL

11 неожиданных особенностей языков программирования - 1
Image courtesy Nic Hughes CC BY 2.0

Oracle считает строки нулевой длины эквивалентными NULL. Это существенное отличие от других БД и ANSI/ISO стандарта SQL, который подразумевает, что пустая строка — ранее известное значение, а NULL — неизвестное, и они не могут быть эквивалентны. Это может принести головную боль при написании кода для нескольких RDBMS или переписывании кода.

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

Цитаты:

«Да, это одна из „прекрасных“ фич Oracle DB» — Lukas Eder [1]
«Пустая строка эквивалентна NULL не больше, чем числу 0» — Ben Blank [2]
«ЧТО!? Я так рад, что мы не используем Oracle. Это пугает» — Jeff Davis [3]

+ как универсальный оператор конкатенации в JavaScript

11 неожиданных особенностей языков программирования - 2
Image courtesy MicroAssist CC BY-SA 2.0

Оператор + перегружен в JavaScript, и выполняет роль как математического сложения чисел, так и конкатенации строк. То есть если один из операндов строчный, а другой числовой, то условно вместо 1+1=2 вы получите ‘1’+1=’11’: JavaScript без предупреждения приведет число к строке.

Причина тому — недостаточный контроль за совместимостью типов. Например, в Python + используется ровно для тех же целей, но у вас ни за что не получится сложить число и символ.

Цитаты:

«Проблема в том, что скрытое приведение типов в выражениях непредсказуемо» — Anonymous [4]
«JavaScript должен выбрасывать исключение в таком случае» — crgwbr [5]
«+ для конкатенации строк — кошмар» — Matteo Riva [6]

Модули Perl должны возвращать true

11 неожиданных особенностей языков программирования - 3
Image courtesy anthony kelly CC BY 2.0

Каждый модуль в языке Perl должен возвращать true. Если же этого не происходит, то разработчик рискует сильно подпортить себе карму и столкнуться с ошибкой компиляции.

Причина этого ясна и понятна, если понимать, что такое модуль в Perl. Программа компиляции, рассматривая подключённые к коду модули, в первую очередь проверяет их выполняемость. Даже если в модуле нет кода инициализации, Perl все еще ожидает получить на выходе True.

Цитаты:

«Эта штука всегда оставляет у меня тошнотворное чувство» — Drew Hall [7]
«Это не имеет практического применения, учитывая непрерывно возникающее раздражение» — Schwern [8]

Триграфы в C и C++

11 неожиданных особенностей языков программирования - 4
Image courtesy REUTERS/Gary Hershorn

Языки C и C++ поддерживают триграфы — трёхсимвольные обозначения, которые автоматически конвертируются в односимвольные. Так, например, комбинация ??! выдаст вам |. Если вы хотите максимально запутать необразованного врага, решившего прочитать ваш код, используйте вместо квадратных скобок комбинацию ??( и ??).

Смысл триграфов вовсе не в желании разработчиков языка обфусцировать код, а в том, что когда-то давно многие клавиатуры просто не содержали распространённых ныне символов, например фигурных скобок.

Цитаты:

«Google не поможет, если вы ищете что-то по запросу ??!??!» — Isaac [9]
«Все так ненавидят триграфы, что C99 принес диграфы как альтернативу… еще больше обфускации» — dododge [10]
«Радость триграфов — делает C нечитаемым с 1977 года» — Martin Beckett [11]

Чувствительность к регистрам PHP

11 неожиданных особенностей языков программирования - 5
Image courtesy Gregg O'Connell CC BY 2.0

В то время как большинство языков программирования чувствительны к регистру, в PHP названия функций, классов и методов к нему нечувствительны. Но что наиболее сильно поражает разработчиков — то, что имена переменных, констант и свойства классов всё же регистрозависимы.

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

Цитаты:

«Ну, это PHP. Не удивляйтесь» — Grzechooo [12]
«Вот почему PHP-программисты используют подчеркивания вместо CamelCase, называя свои функции» — paperstreet7 [13]
«Я не имею ни малейшего представления о том, как создавать языки программирования...» — создатель PHP Rasmus Lerdorf [14]
«Есть ли в PHP что-то, не вызывающее недоумения?» — Lambda Fairy [15]

Истинный ноль в Ruby

11 неожиданных особенностей языков программирования - 6
Image courtesy DaveBleasdale CC BY 2.0

В Ruby 0 == TRUE. Это неожиданно, расходится с большинством других языков, включая Python и C, где 0 всё-таки FALSE, и часто сбивает с толку новичков в Ruby.

Причина в том, что в Ruby только boolean false и нулевое значение (nil) вычисляются в FALSE; все остальное имеет значение TRUE. 0 рассматривается как любое другое число.

Цитаты:

«Это может быть странным, если бы я не считал это неплохим» — Chris Lutz [16]
«Вот почему я люблю Ruby. Мне не приходится иметь дело с таким zero-false злом» — Edditoria [17]
«0==true // аргх, компилятор C в моей голове взорвался!!» — kenny [18]

Пробелы в Python

11 неожиданных особенностей языков программирования - 7
Image courtesy Paul Kitchener CC BY 2.0

Вместо пунктуации или ключевых слов Python использует отступ для обозначения блока, к которому принадлежит строка кода. Неправильное количество пробелов или смешивание пробелов и табуляции может привести к ошибкам.

Создатели языка стремились сделать код более читабельным и уменьшить количество нажимаемых клавиш за счет того, что многие редакторы и IDE расставляют отступы автоматически.

Цитаты:

«Нет, правда: это то, что мешает мне когда-либо полюбить Python» — wazoox [19]
«Я обожаю отступы в Python, но есть ньюанс: при копировании и вставке кода из Интернета это часто приводит к необходимости дополнительной очистки» — Greg [20]
«Если вам нужны навязанные отступы, вы слишком ленивы» — Joris Meys [21]

Массивы в C подчиняются арифметике указателей

11 неожиданных особенностей языков программирования - 8
Image courtesy BlueGum CC BY-ND 2.0

Кроме того, что можно получить ссылку на элемент массива как a[i], можно получить ее как i[a].

Причина в том, что массивы в C — указатели на блоки памяти, поэтому a[i]=*(a+i)=*(i+a)=i[a].

Цитаты:

«… это бесценно, когда вы участвуете в конкурсе обфускации C...» — Confusion [22]
«Я не расцениваю это как особенность, это просто взгляд на ядро C. Все для указателей и максимально быстрого получения доступа к памяти. В некотором смысле это красиво» — Michael Neale [23]

Предопределённые переменные Perl

11 неожиданных особенностей языков программирования - 9
Image courtesy Emily Mathews CC BY 2.0

Если внимательно ознакомиться с описанием языка Perl, можно найти достаточно большое количество предопределённых переменных с, мягко говоря, странными названиями (правда, имеющими достаточно длинный английский эквивалент).

Они служат для выдачи информации или обеспечения доступа к различным аспектам программы. Так, например, $@ — сообщение об ошибке, $$ — идентификатор процесса, $^V — используемая версия Perl. Новичкам приходится часто заглядывать в документацию.

Цитаты:

«Очень раздражает» — MatrixFrog [24]
«Классная штука для однострочников, кстати» — niXar [25]
«Я думаю, что худшие из них — $@ и @$. Работают оба, но я до сих пор не знаю, что делает второй...» — Artem Russakovskii [26]
«Между прочим, есть еще серьезная проблема с этими переменными: они не гуглятся!» — malvim [27]

Автоматическая вставка точки с запятой в JavaScript

11 неожиданных особенностей языков программирования - 10
Image courtesy Nate Angell CC BY 2.0

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

Изначально вставка точки с запятой предназначалась для удобства, чтобы сделать C-подобный синтаксис JavaScript проще для новых разработчиков.

Цитаты:

«У вас точно будут проблемы, если вы разрабатываете язык с расчетом на то, что ваши пользователи идиоты» — Rob Van Dam [28]
«Совет: выясните нужное место для точки с запятой и поставьте ее. Это лучше всего» — Doug Crockford [29]
«Вставка точки с запятой — одна из злейших частей JavaScript» — fennec [30]

Автоупаковка в Java и кеширование Integer

11 неожиданных особенностей языков программирования - 11
Image courtesy Erich Ferdinand CC BY 2.0

Java автоматически упаковывает примитивы в объекты, например, int в Integer. В целом ничего страшного, но Integer кешируется, если его значение лежит между -128 и 127. Это может привести к непредвиденным результатам в случае сравнения автоупакованных объектов, так как программа будет присваивать значение TRUE, если оба объекта имеют значение от -128 до 127, и FALSE во всех остальных случаях.

Autoboxing уменьшает количество кода, а кеширование Integer повышает производительность. Но нужно помнить о подводных камнях.

Цитаты:

«Вот результат преждевременной оптимизации» — Joschua [31]
«Это не распространенная ошибка, но хороший повод использовать нативные типы Java для чисел, логических переменных и так далее» — Ravi Wallau [32]
«Я так рад, что пишу на C#» — Will [33]

Автор перевода: Илья Бубнов
___

P. S. Выбрать направление и начать обучаться по одной из технологий, о которых рассказывалось выше, можно на сайте GeekBrains [34].

Автор: GeekBrains

Источник [35]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/116130

Ссылки в тексте:

[1] Lukas Eder: http://blog.joda.org/2014/09/oracle-rdbms-empty-string-null.html?showComment=1410175914480#c1336877383159329725

[2] Ben Blank: http://stackoverflow.com/questions/1995113/strangest-language-feature/1996406#comment1922810_1996406

[3] Jeff Davis: http://stackoverflow.com/questions/1995113/strangest-language-feature/1996406#comment1927564_1996406

[4] Anonymous: http://www.reddit.com/r/programming/comments/amh6o/strangest_language_feature_stack_overflow/c0idwfc

[5] crgwbr: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1969514_1995298

[6] Matteo Riva: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1913516_1995298

[7] Drew Hall: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995117#comment1916903_1995117

[8] Schwern: http://stackoverflow.com/questions/5293246/why-the-1-at-the-end-of-each-perl-package#comment5971579_5293272

[9] Isaac: http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do#comment24150853_7825055

[10] dododge: http://www.reddit.com/r/programming/comments/amh6o/strangest_language_feature_stack_overflow/c0ietyj

[11] Martin Beckett: http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do#comment9537589_7825055

[12] Grzechooo: http://www.reddit.com/r/lolphp/comments/y7dun/the_php_way_variables_are_casesensitive_but/c5zhyvv

[13] paperstreet7: http://stackoverflow.com/questions/2749781/why-are-functions-and-methods-in-php-case-insensitive#comment34501947_6302488

[14] Rasmus Lerdorf: http://www.dasgenie.com/scrap/archives/000060.html

[15] Lambda Fairy: http://stackoverflow.com/questions/1995113/strangest-language-feature/2006635#comment10858303_2006635

[16] Chris Lutz: http://stackoverflow.com/questions/1995113/strangest-language-feature/2039268#comment1965942_2039268

[17] Edditoria: http://www.codecademy.com/forum_questions/5066722a8fd3f20002013b82

[18] kenny: http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about#comment210770_372873

[19] wazoox: https://news.ycombinator.com/item?id=5231632

[20] Greg: http://programmers.stackexchange.com/a/92057

[21] oris Meys: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment3860294_1995278

[22] Confusion: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1937772_1995156

[23] Michael Neale: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment3634860_1995156

[24] MatrixFrog: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1923956_1996314

[25] niXar: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995134#comment1942254_1996314

[26] Artem Russakovskii: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1923011_1996314

[27] malvim: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment3633600_1996314

[28] Rob Van Dam: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1924259_2003277

[29] Doug Crockford: http://youtu.be/hQVTIJBZook?t=13m1s

[30] fennec: http://stackoverflow.com/questions/1995113/strangest-language-feature/1995278#comment1923016_2003277

[31] Joschua: http://stackoverflow.com/questions/1995113/strangest-language-feature#comment3822538_2001861

[32] Ravi Wallau: http://stackoverflow.com/questions/18850930/java-integer-auto-auto-boxing#comment27813387_18850962

[33] Will: http://stackoverflow.com/questions/1995113/strangest-language-feature#comment1926765_2001861

[34] на сайте GeekBrains: https://geekbrains.ru/courses?utm_source=habrahabr&utm_medium=affiliate&utm_campaign=sale_habrahabr_25.03.2016

[35] Источник: https://habrahabr.ru/post/280169/