5 интересных фактов об IT. А Вы знали ?
5 интересных фактов об IT. А Вы знали ?

5 интересных фактов об IT. А Вы знали ?

Другое 25.12.2019

CAFEBABE в JAVA, магическая математика в JS и другие особенности IT мира

java word cafebaby

1. Магическое слово в JAVA: CAFEBABE

Компилятор превращает исходный код Java в байт-код и сохраняет его в файле .class, который затем исполняется JVM, а знали ли Вы, что все классы Java начинаются со слова CAFEBABE? Давайте разберемся, что же это за магическое слово и почему именно оно используется в качестве первых 4-ох байт любого Java класса.

Если Вы мне не верите, проверьте это сами. В любом редакторе, который Вам нравится, напишите простой класс, например:

 

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, world!");
    }
}

 

После компиляции посмотрите на HelloWorld.class в hex:

 

$ javac HelloWorld.java
$ xxd HelloWorld.class

 

0000: cafe babe 0000 002e 001a 0a00 0600 0c09  ................
0010: 000d 000e 0800 0f0a 0010 0011 0700 1207  ................
0020: 0013 0100 063c 696e 6974 3e01 0003 2829  ........()
0030: 5601 0004 436f 6465 0100 046d 6169 6e01  V...Code...main.
0040: 0016 285b 4c6a 6176 612f 6c61 6e67 2f53  ..([Ljava/lang/S
0050: 7472 696e 673b 2956 0c00 0700 0807 0014  tring;)V........
0060: 0c00 1500 1601 000d 4865 6c6c 6f2c 2057  ........Hello, W
0070: 6f72 6c64 2107 0017 0c00 1800 1901 0005  orld!...........
0080: 4865 6c6c 6f01 0010 6a61 7661 2f6c 616e  Hello...java/lan
0090: 672f 4f62 6a65 6374 0100 106a 6176 612f  g/Object...java/
00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75  lang/System...ou

 

Вы заметили часть CAFE BABE? Если вы откроете любой файл Java .class с помощью шестнадцатеричного редактора – найдете это волшебное слово в начале.
На самом деле это и не слово вовсе, а шестнадцатеричное число, которое составляет 3405691582 в десятичном виде.

(CAFEBABE)16 = (3405691582)10

А как собственно это число появилось в каждом классе, нам сможет рассказать Джеймс Гослинг, автор объектно-ориентированного и кросс-платформенного языка программирования Java:

“Мы обычно ходили на обед в место под названием Михайловская аллея. Согласно местной легенде, в далеком прошлом там выступали Grateful Dead до того как стали знаменитыми. Когда вокалист группы Джерри Гарсия умер, они установили маленький буддийский храм. В то время мы стали называть кафе “Кафе Мертвым” (Cafe Dead), а со временем обратили внимание, что “Cafe Dead” по совместительству еще и HEX номер. Мне понравилось это магическое число, таким образом, пересматривая некоторый код формата файла, я решил использовать CAFEDEAD для формата постоянного объектного файла. После мне нужно было еще одно такое слово для классов, я опять же решил использовать «CAFE» (это казалось хорошей темой), и после некоторых поисков я нашел “BABE”, подходившее мне в качестве числа. Таким образом, CAFEBABE стал форматом файла класса, а CAFEDEAD был форматом файла постоянного объекта. Со временем файл постоянных объектов исчез, а вместе с ним и ушло использование CAFEDEAD – его в конечном итоге заменили RMI.”
js majic math

2. Магия чисел в JAVASCRIPT: 0.1 + 0.2 !== 0.3

0.1 + 0.2 !== 0.3 –

Эта странность встречается не только в JavaScript, а является широко распространенной проблемой всей компьютерной науки. Вывод будет такой — 0.30000000000000004.

Эта особенность называется компьютерной неточностью. При работе с числами, они переводятся в их двоичный эквивалент и именно здесь кроется начало проблемы, так как — 0.1 не 0.1 в двоичном эквиваленте, а близкое к нему значение.

По той же самой причине происходят и увеличения чисел:

console.log(999999999999999)  // -> 999999999999999
console.log(9999999999999999) // -> 10000000000000000

console.log(10000000000000000)       // -> 10000000000000000
console.log(10000000000000000 + 1)   // -> 10000000000000000
console.log(10000000000000000 + 1.1) // -> 10000000000000002

 

3. Plankalkül – первый язык программирования высокого уровня.

Plankalkül – первый высокоуровневый язык программирования создан немецким инженером Конрадом Цузе в в 1943—1945 г.г., а опубликован только в 1948 году. В переводе на русский его название означает “планирующее исчисление”. Во время Второй Мировой Войны Цузе работал в отрыве от учёных других стран, совершенно самостоятельно и за это время он создал не только язык программирования, но и написал на нём 49 страниц программ для оценки шахматных позиций.

На сегодняшний день в мире около 690 языков программирования.

windows con

4. Запрет на создание папки CON

Вы можете назвать папку или файл в Windows почти как угодно. Почему “почти”, спросите ВЫ? Попробуйте назвать папку “con”.

try to call con folder on windows

Суть дела кроется в далеком детстве Билл Гейтса, когда он учился в младших классах маленькому Биллу тяжело было найти общий язык с одноклассниками. Усложняло его пребывание еще и то, что одаренный мальчик хорошо учился. По этим причинам его часто дразнили и придумывали разные клички, одной из которых была “con”, что означало – “ботаник”. Впоследствии Билл возненавидел эту кличку и при проектировании OS Windows решил добавить это слово в исключение. Но правда это или выдумка до сих пор остается загадкой.
При проектировании MS-DOS Биллом были заложены названия папок, которые можно было создавать только один раз и использовались они для нужд системы. Таким образом помимо папки CON нельзя создавать еще ряд папок с названиями: PRN, NUL, AUX, LPT0, LPT1, COM1, COM2.

5. Магические сложения в JAVASCRIPT

Как вы думаете, что получится если попробовать сложить такие значения:

'b' + 'a' + + 'a' + 'a' 
// "baNaNa"

А знаете почему?
Выражение преобразуется в

'b' + 'a' +  (+ 'a') + 'a'

где + 'a' вернет NaN.

А как вы думаете, что получится в результате:

(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]

Вы быть может не поверите, но в результате получится fail.
И так перейдем к объяснениям: повторяющаяся часть (![]+[]) вернет строку 'false', так как ![] = false, а [+[]] – это ни что иное как [0], так как +[] – преобразуется в число, таким образом мы берем первый элемент строки ('false'[0]). Мы разобрались, что +[] = 0, тогда !+[] = true, +!+[] = 1, а все (![]+[])[+!+[]] это 'false'[1]. Результатом ([![]]+[][[]]) является строка "falseundefined" ([![]] = [false], [][[]] = undefined), a [+!+[]+[+[]]] = 10, тогда "falseundefined"[10] = "i". Последняя буква (![]+[])[!+[]+!+[]] – это "false"[2].

5. От скрипта для сбора статистики просмотров до языка программирования PHP

История, на сей день широко используемого языка программирования PHP, начинается в далеком 1994 году, когда Расмус Лердорф хотел выяснить кто и как часто читает его резюме. Он рассылал его в виде ссылки на html-страницу, в код которой был помещен небольшой скрипт на Perl, собиравший статистику о посещениях. Расмус назвал этот скрипт “Personal Home Page Tools” так как код подключался именно на Home page, что сокращенно звучало как “PHP Tools”. Другие разработчики заинтересовались его изобретением и через некоторое время Расмус выложил свой код для всеобщего использования и усовершенствования.

Во время работы в университете Расмус переписал PHP на C и усовершенствовал. Теперь он имел возможности работать с формами на сайте, получать из них данные, обрабатывать и отправлять другим системам. В конце 1996 года PHP уже использовался не менее чем на 15 000 web-сайтов во всем мире, а в середине 1997 года это число превысило 50 000.

Источники: Progopedia, Habr, Fulltienich, php.net, dzone

Поделиться

Отправить ответ

avatar
  Получать новые комментарии  
Уведомлять о новых комментариях