воскресенье, 11 июля 2010 г.

Pascal vs. C & C++ vs. Delphi. Perl.

Читая комментарий на предыдущий пост от Фенстера:
На каждом языке получается писать выразительно что-то одно, а другое не получается :)
Я начинаю это по-настоящему осознавать, т.к. начал изучать Perl (о первых впечатлениях ниже). Все равно остается не понятным, чем философски отличается Pascal от C? И тот, и другой генерят бинарник, только разве что я не знаю паскаль настолько хорошо, что не представляю, как там реализовать списки. И что, из-за этого создавать новый язык? Они реализуют разные парадигмы? (паскаль и си)
А еще: С++ и Delphi - в чем различия? Разве что делфай (я слышал произношения делфи и делфай, какой правильный - не знаю, если говорю не правильно, не обижайтесь) - это не столько язык, сколько среда разработки, по крайней мере у меня сложилось такое впечатление. Кстати, первая моя программа была написана не на паскале, и не на си, и не на фортране или бэйсике, а как раз не делфае! Что-то вроде ShowMessage("hello world!"); или типа того.
Я вообще понимал всегда язык как набор правил, позволяющих строить из букв осмысленные команды. Кому, зачем и почему понадобилось набор правил изменять? Почему цикл в паскале отличается от С, а С++ отличается от Java в некоторых конструкциях? Зачем надо менять синтаксис? По мне так оставили бы С++, подпилили бы его и сделали для него виртуальную машину, и в ключах компиляции (в той же IDE) просто бы указывали "хочу скомпилировать это под виртуальную машину!". Но почему-то вокруг куча языков, и для особого способа компилирования и исполнения непременно надо изобрести свой.. Интересно, как бы это все выглядело в идеальном мире? Тоже сотни языков и сред разработок, виртуальных машин и пр. или же все таки 3-5 языков было бы достаточно?

Теперь про Perl. Интерпретируемый язык, наверное даже скриптовый. Путаюсь в этих терминологиях, почему программы на перле называют скриптами? Потому что они маленькие что ли? А helloworld написанный на С тоже скриптом можно назвать?
Кроме того, в книге Learning Perl сказано, что программа на перле сначала вся компилируется, затем переводится в байт-код и потом уже исполняется. Но! Это происходит каждый раз, как запускается программа на перле, она каждый раз компилируется. Что это означает для программиста? Это означает, что если он хочет продать свою программу, он должен продать и исходник, и максимум, что он может сделать для его защиты - написать что-то вроде лицензии в ридми файле "исходник нельзя модифицировать и продавать, иначе найду тебя и выкручу соскИ!". Почему это так делается - не понятно, ведь есть же байткод, почему его нельзя сохранить где-нибудь, как это сделано в джаве? Поправьте меня, если я не прав, но если джава девелопер написал код, он его может перегнать в байт-код и продать его, при этом сохранив исходники у себя. И еще, я правильно понимаю, что существование байт кода автоматически подразумевает наличие виртуальной машины? Джаву тогда тоже можно назвать интерпретируемым языком? Но! не скриптовым?

Теперь про язык. Мне нравится, простой и программки пишутся короткие, наверное раза в 2 в среднем меньше, чем эквивалентные программы на С. Динамическая типизация дает свободу, но я к ней отношусь осторожно и аккуратно. Дело в том, что переменная может быть и числом и строкой одновременно, смотря в каком контексте она используется. Например, оператор х:
5 x 7
берет строку слева и делает её конкатенацию столько целых раз, сколько указано справа от него. Т.к. слева число, то оно переводится в строковое представление "5" и затем 7 раз конкатинируется: "5555555". Еще между строками определена операция конкатенации: .(точка). Например
"orange" . 5*3
на выходе даст "orange15". Что же будет при вычислении выражения
5 x 7 * 3 . 5
я не знаю. Толи 5555555 умножится на 3 и потом к результату в конец допишется 5, толи 5 сконкатенируется 21 раз и к концу припишется еще одна 5, в общем все возможные варианты. Но это все флейм какой-то скучный, наверняка есть приоритет операций и все однозначно определяется, надо просто посмотреть, но для обычного смертного данное выражение должно заставить задуматься. Мне выдался результат 166666655. Тупой пример, теперь не разберешься, как же это работает! :) А хотя в общем первый вариант оказался верным.

Как я понял, фишка перла в том, что он вместо нулевого терминирующего символа \0 в конце строки (как сделано в С) хранят просто тупо количество символов в строке. И это дает преимущества при работе с текстом, в принципе, он был даже и создан для этой работы.
Сразу вспомнилась статья Joel Spolsky, где он рассказывал анекдот про парня, который красил дорогу. Теперь ужасный
while (str[i++]) {}
вовсе не нужен, перл знает длину строки и бедный паренек получил возможность телепортации как раз к тому месту, где он закончил красить:
str[length]

воскресенье, 16 мая 2010 г.

Компиляторы, интерпретаторы ...

Сегодня порассуждаю на тему компиляторов. Почему? Потому что стало много вещей непонятных и это бесит, когда не понимаешь что-то :) Подумав про непонятное, пришел к выводу, что чтобы как-то подойти к этому издалека, будет полезно поговорить сначала про компиляторы, а потом плавно перейти к самому вкусному.

Компиляторов много, и их больше, чем 2 или 3 типа, как многие думают (если верить книжке trustworthy compilers):
есть классические компиляторы, которые берут текст программы (написанный на нормальном человеческом высокоуровневом языке программирования, например C, C++, Pascal) и переводят те команды в машинный код, которые понимаются непосредственно железякой. Это нативное компилирование, самое мне родное и понятное, я с таких языков и с таких компиляторов начинал программировать :)
На втором месте - интерпретаторы. Вместо трансляции высокоуровнего кода в бинарник, они берут исходный код и начинают выполнять его по инструкциям языка, в итоге бинарник не рождается, и чтобы что-то исполнить, всегда нужен исходник, написанный на высокоуровневом языке. (Вообще говоря странно, интерпретатор - это не разновидность компилятора, это вообще другая штука по своей природе. Меня учили, что компилятор - это такая штучка, которая один язык программирования переводит в другой, это типа транслятор такой. Интерпретатор же - ленивая хрень, она ничего никуда не транслирует, а просто выполняет)
Следующий вид - кросскомпиляторы. Они берут сурс код и генерят бинарник для других устройств, например для телефона. (телефоны они тупые, они не понимают бинарников компа, поэтому к ним нужен особый подход и вот такие компиляторы создают команды, которые понятны даже телефонам. На месте телефонов может быть любой другой девайс, не понимающий бинарники компа, например какой-нибудь странный микропроцессор).
JIT компиляторы (just in time) - хитрющие компиляторы, которые работают в процессе исполнения программы и компилируют методы при первом их вызове, и при этом компилируют их в бинарный код текущей платформы. Такие компиляторы являются врожденной частью Java и .NET.
AOT компиляторы (ну-ка догадайтесь, как расшифровывается?) - это прекомпиляторы, которые все делают "правильно" и заранее компилируют платформенно независимый код в бинарный код текущей платформы. Зачем они это делают? Для повышения скорости исполнения. Впринципе, походу, это те же самые классические компиляторы.. Но вот решили в отдельный класс отнести. Ну ладно, пусть будет. АОТ так же используются в Java и .NET.
Конверторы - компиляторы, как раз в моём классическом понимании - переводящие один язык программирования в другой. Собственно классический компилятор - это частный случай конвертора, если я не ошибаюсь... Зачем было выводить его в отдельный класс, не понимаю, конвертор и конвертор, но раз товарищи ученые хотят - пусть будет 2 разных класса компиляторов.
Бинарные компиляторы - они прикольные. Они переводят бинарный код одной платформы в бинарный код другой платформы, при этом не требуют исходников на высокоуровневом языке.
Есть Graph compilers - какие-то суперновые компиляторы, зачем нужны и че делают я не понял)
Еще есть incremental compilers (тоже не понял зачем они нужны. Написано, что были популярны в 70ые, видимо до моих лет они не дожили. Ну и слава богу:) не буду забивать себе голову).

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

Языки бывают с разной типизацией, я знаю 4 из них: языки со статической типизацией, с динамической, со строгой и со слабой. А еще есть типизируемые языки, нетипизируемые, сильнотипизируемые и слаботипизируемые. Это упасть и не встать))) И вот мы плавно подходим к тому, что меня бесит и что я не понимаю.. Языки программирования. Зачем их так много придумали? Почему они такие сильно разные? Кроме тех 8 типов, языки еще можно разделить на компилируемые, интерпретируемые и скриптовые. И еще плагины существуют, которые ясности точно не приносяти еще больше все запутывают.

Мне всегда было интересно, почему это Java не совсем скриптовый язык? (или совсем не скриптовый?)) ) А вот Python - настоящий скриптовый язык. Что вообще такое скрипт? Я всегда считал, что это макрос. Просто последовательность действий, самая обычная. И почему же это на Джаве нельзя написать последовательность действий и обозвать то, что получится - скриптом? А C++ это тоже не скриптовый язык? Что же в C++ и Java такого особенного, что они не могут написать макрос? В общем куча непонятностей) Обо всем об этом в следующий раз.

среда, 12 мая 2010 г.

Apple vs. Flash

Начинаю новый блог, полностью посвещенный ИТ. Зачем? Не хочу перемешивать ИТ-ишные разговоры с обычными разговорами о бытовухе ) Этот блог скорее всего буду писать так же для себя в надежде на то, что это будет меня пинать под зад как можно чаще:) Типа.. "Damn dude, u r not advanced in this. Take that fucking book и учи матчасть!" Буду тут делиться впечатлениями по поводу чтения различных книжек, блогов, подкастов, новостей и т.д. Еще планирую рассуждать по поводу различных багов, кусков кода. Разбираться с чем-то новым, иногда будут посты уровня "bubble sort" или "select * from costumers where ..." )) в общем nothing special at all, посмотрю, что из этого выйдет. Комментарии приветствуются, с удовольствием обсужу любую тему, о которой я упомяну)

Let's rock:) Недавно Apple на официальном сайте опубликовал новость thoughts on flash , в которой объяснила, почему flash нет в iPhone и ему подобных продуктах. Я прочитал, даже проникся и даже поверил, что flash - жрет батарейку, не стабилен и не безопасен. Ну конееечно Стив Джобс не хочет, чтобы кто-то обходил App Store стороной (если флэш разрешить, то фактически я могу написать на нем приложение и продавать, не заливая его в app store. Как это? Я сам хз, как я понял, написав прогу на flash, можно сказать IDE "нука скомпилируй это для айфона", и, по аналогии как появляются бинарные файлы при знакомом мне компилировании, на выходе получится .ipa файл, который понимается айоном).

Так вот, несколькими днями позже(или даже в тот же день) глава Adobe тоже высказал свои мысли в адрес Apple (на сайте the Wall street journal видео есть. Прикольно газеты теперь в интернете сущесвтуют, по крайней мере буржуйские). "Ну началоось", - подумал я))

Флэш повсюду, куда ни зайди -- он везде. Вырубите флэш у себя в браузере, и многие сайты перестанут быть такими, какими вы привыкли их видеть. Поэтому мне было не совсем понятно, как эппл скажет "Мы не хотим флэш!". Очень смелое и наглое утверждение) Это как Google Chrome в своё время сказал "Так. Забудьте все, что было до Java 6. Мы не будем работать с этим старьем, мы поддерживаем только Java 6 Update 12 или выше". Ну прикиньте да?)) Дерзко и четко))
Но я уважаю то, что сделал гугл. До джавы 6 рантайм весил 16 метров, в джаве 6 появился java kernel, весящая 4 метра, и вместо 16 метров в память будет грузиться только 4 (если особо умный applet потребует специфические функции, kernel их подгрузит в процессе). Все работает быстрее там и легче) Может что-то еще, я не копал глубоко) В общем хром - это дополнительный пинок под жопу пользователям поставить последнюю джаву. Если будет много пользователей с последней джавой, будет больше апликейшинов, требующих последнюю джаву, и тем больше будет пользователей с последней джавой и т.д. Кароч Sun должна проставиться гуглу ))
Стив Джобс делает типа вроде как тоже шаг настречу HTML5, оставляя позади флэш. Но сейчас, вслед за Джобсом, любовь к HTML5 проявляют microsoft (прочитал на ixbt), и CBS переводит стрим видео из флэш в H.264 (да, я сам узнал об этом сайте сегодня))) посмотрел на нем интервью Evangeline Lilly (Кейт из Lost'а), занес сайт в bookmarks, буду смотреть на досуге=) ). Интересно, что будет дальше с Flash)

На самом деле у меня 2 различных мнения по поводу поддержки flash: с одной стороны, я сейчас ничего не знаю ни об objective c, ни про flash, поэтому: если бы flash был на айфоне, я бы непременно начал изучать его и пофиг вообще на все остальное: флэш популярен и работы флэш девелоперам хватает, а вместе с тем еще можно и эппликейшены клепать под айфон - вообще супер)) С другой стороны .. а что с другой стороны? С другой стороны objective c, с которым найти работу в Новосибирске сложно (её практически нет, если верить ngs.ru. Если кто знает более грамотный сайт для поиска работы тут - поделитесь:) ) .. В общем только сейчас понял, что на самом деле мне не выгодно, что iPhone и flash не дружат. Хотя еще часа 2 назад был уверен, что это cool, типа нафиг этот флэш вообще, не stable и не security enough он.. )

Вот пожалуй и все, о чем мне захотелось сегодня написать )