На каждом языке получается писать выразительно что-то одно, а другое не получается :)Я начинаю это по-настоящему осознавать, т.к. начал изучать 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]