Войдите или зарегистрируйтесь
Вы сможете писать комментарии и посты, ставить лайки и другое
Поиск
Тёмная тема

Посты с тегом: языки программирования

Терминология в PHP: нелепость за нелепостью

Пыха - это всегда что-то с чем-то. Как яркий пример, можно вспомнить бездумный порядок аргументов в функциях: array_slice() - тут массив первым аргументом, array_key_exists() - здесь массив вторым аргументом и т.п. Но я сейчас про термины. В программировании есть устоявшиеся термины.

Например, перегрузка функций! Это когда функция может принимать разное количество аргументов и/или разные типы аргументов:

// C++
int add(int a, int b) {
  return a + b;
}

double add(double a, double b) {
  return a + b;
}

А что в PHP? А в PHP перегрузка (overloading) - это по факту перехват обращений к несуществующим свойствам и методам через магические методы!

// PHP :)
class Magic {
    public function __call($name, $args) {
        return "дернули метод $name";
    }
    public function __get($name) {
        return "дернули поле $name";
    }
}

Зачем было использовать именно этот термин - перегрузка?! Пыха-стайл блин 😂

Далее у нас термин замыкание. Обычно это функция вместе с её лексическим окружением (то есть переменными, которые видны в месте её определения). И эта функция может запоминать эти переменные "подолгу", и у другой функции-замыкании эти значения переменных уже будут свои.

Вот пример на питоне:

# Python
def make_counter():
    count = 0
    def add():
        nonlocal count
        count += 10
        return count
    return add

counter = make_counter()
print(counter())  # 10
print(counter())  # 20

Возвращаемый add будет помнить count из своего окружения. Такое же в JS, Kotlin и Go.

А что документация PHP нам говорит?
https://www.php.net/manual/en/functions.anonymous.php
Anonymous functions, also known as closures, allow the creation of functions which have no specified name. They are most useful as the value of callable parameters, but they have many other uses.
Согласно документации, замыкание в пыхе - это тупо анонимная функция 😂 Нафига так было писать?

Честности ради можно сказать, что классическое замыкание в PHP можно повторить.

// PHP
function makeCounter() {
    $count = 0;
    return function() use (&$count) {
        $count += 10;
        return $count;
    };
}

$counter = makeCounter();
echo $counter();  // 10
echo $counter();  // 20
Показать полностью...
+2
3

Кривой нейминг в JavaScript: atob() и btoa()

В ЖСе есть два глобально доступных метода для работы с Base64 - это atob() и btoa(). Этот нейминг - явно калька с более старших языков. В Си в стандартной библиотеке есть, например, методы atoi и atof:

#include <stdlib.h>

char str[] = "123";
int num = atoi(str); // 123

atoi - означает ascii to integer, а atof - ascii to float (хотя по факту там double).

И как вы думаете, что делает функция atob в javascript? ASCII to Base64? Т.е. обычную строку в Base64 строку? Нет! Она делает ровно наоборот: переводит Base64 строку в "обычную" строку. А btoa в свою очередь переводит обычную строку в Base64!

console.log(btoa('Famabara')); // 'RmFtYWJhcmE='
console.log(atob('RmFtYWJhcmE')); // 'Famabara'

Кому в голову пришло перепутать названия? Люблю JS.
+2
48

Неочевидно опасное undefined behaviour в языке Си

Чтобы мозг не раскисал, учу Си. Язык простой и одновременно довольно сложный. А ещё в нём есть куча undefined behaviour - неопределённое поведение компилятора для пограничных случаев, которых на самом деле масса.

Вот пример простейшей функции:
int get_zero(void) {
  int num;
  return num & 0;
}
Переменная num не инициализирована, значит там могут сидеть любые "мусорные" биты.
& - это оператор побитового И, который сравнивает последовательно биты двух чисел и ставит в соответствующий бит возвращаемого числа 1, только если оба бита - это 1, иначе поставит туда 0.

Вроде всё просто и кажется, что функция всегда должна вернуть 0, ведь "побитовый и" с нулём всегда вернёт ноль.
123 // 00000000 00000000 00000000 01111011
0   // 00000000 00000000 00000000 00000000
Сравнение битов двух чисел выше всегда вернёт 0, т.к. второе число тоже 0. Неважно, какие там будут биты у первого числа, всегда в итоге 0.

Но проблема кода здесь связана со спецификацией Си. Код небезопасен, потому что теоретически компилятор может делать всё что угодно! Программа может "упасть", компилятор может удалить код и прочее. Компилятор имеет право делать что угодно в этом случае. Undefined behaviour - это поведение программы, для которого стандарт языка не накладывает никаких требований, стандарт не говорит, что должно или не должно произойти!

Т.е. писать код таким образом в Си - опасно. Даже переполнение обычного signed int (он же просто int) в Си - это уже undefined behaviour!
int x = 2147483647; // Максимальное значение
x = x + 1; // Опачки - undefined behaviour - рисково!
Вот такое приходится учить. А кто-то жалуется на сложности Golang.
+2
156

Почему рейтинг языков программирования Tiobe – это полная чушь

Давайте посмотрим на этот чудесный рейтинг:
https://www.tiobe.com/tiobe-index/
Вот скрин на апрель 2025 года:
Рейтинг сразу изумляет. На первом месте Пайтон, ну ок, верю. Далее Си и Си++. Уже что-то не то.
Потом Джава и Сишарп, ну ок, но как-то сомнительно. ЖС только на 6-м месте (тайпскрипт, кстати, только на 36-м, ха-ха). Седьмое место у Го - ок.

Но далее - Visual Basic на 8-м месте! Чтоооо?
9-е место - Delphi/Object Pascal. Смешно.
10-е место - SQL.
11-е место - Фортран!!!

Таблица далее:
Показать полностью...
+4
26

Хитрость spread-синтаксиса в JS

А вы знали, что теоретически spread-синтаксис в JS можно применять почти к любому типу.
Вот пример "обычного" использования:
// Массив спредится
console.log([...[1, 2, 3]]); // [1, 2, 3]
// Строка спредится
console.log([...'Famabara']); // ['F', 'a', 'm', 'a', 'b', 'a', 'r', 'a'] 
Но если попытаться заспредить number, то будет ошибка:
console.log([...555]); // Uncaught TypeError: 555 is not iterable
Не является iterable.
Так давайте сделаем iterable!
Number.prototype[Symbol.iterator] = function * () {
  yield 'Фамабара';
  yield 'лучше';
  yield 'всех';
}

console.log([...555]); // ['Фамабара', 'лучше', 'всех']
Мы успешно заспредили number! Толку от этого никакого, на сам факт забавен.
Можно джунов за собесах мучить :)
+4
199
1