Facebook представил (https://code.facebook.com/posts/264544830379293/hack-a-new-p.../) новый язык программирования Hack (http://hacklang.org/), основанный на синтаксисе языка PHP и предназначенный для выполнения с использованием виртуальной машины HHVM (http://hhvm.com/) (HipHop Virtual Machine). Приложения на языке Hack могут бесшовно взаимодействовать и сочетаться с существующим кодом на языке PHP, так как окружение HHVM поддерживает выполнение и немодифицированных PHP-скриптов. Код Hack распространяется (https://github.com/facebook/hhvm/tree/master/hphp/hack) под свободной лицензией PHP.Отличия Hack от PHP сводятся (http://docs.hhvm.com/manual/en/hacklangref.php) к поддержке статической типизации и ряда расширенных возможностей, заимствованных из других языков программирования. Например, в Hack поддерживаются такие возможности, как обобщения (generics (http://docs.hhvm.com/manual/en/hack.generics.php) по образу C# и Java), null-значения (http://docs.hhvm.com/manual/en/hack.nullable.php), коллекции (http://docs.hhvm.com/manual/en/hack.collections.php) (типы Vector, Map, Set, Pair), Lambda-выражения (http://docs.hhvm.com/manual/en/hack.lambda.php) (аналог PHP closures), механизмы асинхронного программирования (категории функций async и await (http://docs.hhvm.com/manual/en/hack.async.php)), составные shape-структуры (http://docs.hhvm.com/manual/en/hack.shapes.php), средства для переопределения имён типов (type aliasing (http://docs.hhvm.com/manual/en/hack.typealiasing.php)). Указание типов осуществляется через систему аннотаций (http://docs.hhvm.com/manual/en/hack.annotations.php), например указывается "function increment(int $x): int {" вместо "function increment($x) {".
Из возможностей PHP, поддержка которых прекращена (http://hacklang.org/manual/en/hack.unsupported.php) в Hack, можно отметить операторы goto, break N, continue N, global, "if:...endif", AND, OR, XOR (нужно использовать "&, |, ^"), ссылки ("function foo(&$x)"), символ приглушения вывода "@", использование "if/then/else without" без обрамления блока символами "{}", elseif (правильно "else if"), средства динамического вызова (eval, $$x и т.п.), переменные в переменных ($a = "hello"; $$a = "world"; echo "$a + $hello"), задание имени функции через переменную ($func = 'myFunc'; $func(1,2);), объекты ArrayAccess. Отдельно можно подчеркнуть, что имена функций в Hack вызываются с учётом регистра символов, в то время как в PHP регистр не учитывался.Hack реализован на уровне виртуальной машины HHVM, поддерживающей JIT-компиляцию. HHVP в полной мере поддерживает обычный PHP 5, но при выполнении программ на языке Hack обеспечивается существенно более высокая производительность, так как благодаря наличию информации о типах в процессе JIT-компиляции удаётся сгенерировать более оптимальный и компактный машинный год. Бесшовная поддержка PHP в HHVM существенно упрощает портирование на язык Hack - проект может переводиться на статические типы поэтапно, смешивая код и сочетая файлы ".php" и ".hh" (в одном файле может смешиваться статическая и динамическая типизация).
Кроме того, доступны (http://hhvm.com/manual/en/install.hack.conversion.php) инструменты для автоматической трансляции PHP-кода на язык Hack. Предоставляются (http://hacklang.org/manual/en/install.hack.bootstrapping.php) средства мгновенной проверки типов через использование специального локального сервера (hh_server), отслеживающего изменения в файловой системе и сообщающего данные о возможных ошибках. Подготовлены плагины для интеграции поддержки Hack в Vim и Emacs.
URL: https://code.facebook.com/posts/264544830379293/hack-a-new-p.../
Новость: http://www.opennet.dev/opennews/art.shtml?num=39368
По-моему теперь выбор языка для будущих проектов очевиден.
Си? Джава? Питон?
Нет, не очевиден...
Вообще-то nodejs.
nodejs уже язык, а не платформа?
Накидал тесты по циклам в секунду
https://github.com/EuPhobos/utils/tree/master/tpsnodejs уступает php5-cli
а php5-cli уступает go
а go уступает java
Отличный пример теста с отрицательной ценностью. Тестирует сферического коня в вакууме xD
Видать я заражён форониксом
Конечно же Си.
> По-моему теперь выбор языка для будущих проектов очевиден.конечно: DLang.
Но мода как всегда выберет другой путь :(
> Но мода как всегда выберет другой путь :(ну и фиг с ней. D зато вон живёт, развивается, готовится в gcc 4.9 пойти. vibe.d, опять же. а моды приходят и уходят.
вот только vibe.d под gdc пока не собирается (к сожалению)
> вот только vibe.d под gdc пока не собирается (к сожалению)а не надо дубом собирать, дуб унылый. и gdc надо брать из гита, там уже 2064, а для вайба, насколько помню, минимальные требования — 2063.
впрочем, я на dmd вертел, надо на свежем gdc попробовать.
А чем тебе дуб не угодил?
> А чем тебе дуб не угодил?yet another build system. оно-то понятно, что это такое же развлечение, как тетрисы, калькуляторы и плееры, но я когда вижу очередную «новую удобную систему сборки с программистками в бикини», начинаю рефлекторно нашаривать маузер.
p.s. у меня тоже давно есть своя система сборки, само собой. и переучиваться на чужие мне неохота: я не для того свою делал.
> вот только vibe.d под gdc пока не собирается (к сожалению)кстати, категорически протестую. только что таки уговорил дуб запуститься, собрал в виде примера echoserver: работает. собрал http_server: работает. естественно, собирал при помощи gdc.
так что смело можно пробовать. срез gdc несколькодневной давности, для gcc 4.8.
p.s. вайб тоже из git'а.
> конечно: DLang.Для вебни то? А по-моему, заменить пых на вот это было бы довольно разумно?
>> конечно: DLang.
> Для вебни то? А по-моему, заменить пых на вот это было бы
> довольно разумно?а по-моему, vibe.d намного круче сабжевой фиготени. а когда там hotswap полностью заработает — и ещё «намножее».
> а по-моему, vibe.d намного круче сабжевой фиготени.А это что? URL?
>> а по-моему, vibe.d намного круче сабжевой фиготени.
> А это что? URL?научу пользоваться поисковиками. дорого.
в D уже можно вместо сегфолта просто поймать исключение на этом:class A { public int b; }
void main()
{
A a = null;
a.b = 0;
}?
> в D уже можно вместо сегфолта просто поймать исключение на этом:а зачем? это однозначно фатальная ошибка, и она *должна* приводить к сегфолту.
для того, чтобы фатальная ошибка влияла только на текущий поток и его стек, а не на всё приложение.
> для того, чтобы фатальная ошибка влияла только на текущий поток и его
> стек, а не на всё приложение.это фатальная ошибка всего приложения, и падать должно всё приложение. изволь не писать говнокода.
> это фатальная ошибка всего приложения, и падать должно всё приложение.не согласен. fault-tolerancy должен присутствовать.
>изволь не писать говнокода.
какое отношение имеет говнокод к возможности ловить и обрабатывать ошибки?
>> это фатальная ошибка всего приложения, и падать должно всё приложение.
> не согласен. fault-tolerancy должен присутствовать.
>>изволь не писать говнокода.
> какое отношение имеет говнокод к возможности ловить и обрабатывать ошибки?if (a is null) throw new Exception("too bad i'm dead");
assert();
enforce();
in {}не пишем говнокода. попытка работать с null — фатальная ошибка и признак того, что говнокод таки написали.
>if (a is null) throw new Exception("too bad i'm dead");assert();
enforce();
in {}отлично. вот хотелось бы это самое на уровне языка, чтоб писанины меньше было. В идеале - опционально.
> отлично. вот хотелось бы это самое на уровне языкаэто и есть «на уровне языка». не ленимся, прописываем контракты: это полезно и наглядно. а в случае assert(), in {} и invariant {} — ещё и опционально (т.е. отключаемо в «релиз-версии» одним флагом компилятора).
ленимся? не прописываем? чем раньше такой говнокод сегфолтнется — тем лучше.
>> отлично. вот хотелось бы это самое на уровне языка
> это и есть «на уровне языка». не ленимся, прописываем контракты: это полезно
> и наглядно. а в случае assert(), in {} и invariant {}
> — ещё и опционально (т.е. отключаемо в «релиз-версии» одним флагом компилятора).мы плюсисты ассертим все что нужно и как нужно, да и смарт поинтеры в ходу. а вот попробуй это похапистам вписать в мозг (тред о php vs vibe.d).
> ленимся? не прописываем? чем раньше такой говнокод сегфолтнется — тем лучше.
да по мне что ассерт, что сегфолт - плохо перехватываемые события, и таки да, чем раньше сбойнет - тем лучше. а код без ошибок и кодеры пишущие исключительно верно без багов - утопия. увы.
> а вот попробуй это похапистам вписать в мозг (тред о php vs vibe.d).очень хорошо вписывается при помощи простых денежных стимулов. один сегфолт — минус премия. на code review не видно контрактов? минус премия. минус три премии — выход вон там.
>> ленимся? не прописываем? чем раньше такой говнокод сегфолтнется — тем лучше.
> да по мне что ассерт, что сегфолт - плохо перехватываемые событияни то, ни другое «перехватывать» не надо. если это произошло — это баг и катастрофа. не ленимся, пишем unittest'ы, прогоняем их — для этого больше не надо отдельные фрэймворки держать.
> ну и разговор не о том, что контракты это круто/некруто, а об
> элементарном nullreference exception.это баг. исключения не предназначены для отлова багов.
> это баг. исключения не предназначены для отлова багов.Ээээ... А для чего они предназначены?
>> это баг. исключения не предназначены для отлова багов.
> Ээээ... А для чего они предназначены?для разруливания ошибочных ситуаций. ошибочная ситуация — это не баг. нет файла на диске — это не баг, это ошибочная ситуация. передача null туда, где его не ожидают — это баг, а не ошибочная ситуация.
>>> это баг. исключения не предназначены для отлова багов.
>> Ээээ... А для чего они предназначены?
> для разруливания ошибочных ситуаций. ошибочная ситуация — это не баг. нет файла
> на диске — это не баг, это ошибочная ситуация. передача null
> туда, где его не ожидают — это баг, а не ошибочная
> ситуация.нет файлв нв диске тоже проверяется, и. т.д.
Тут обращение к недействительному указателю, объект может быть уничтожен по разным причинам, к примеру из за нештатного отмонтирования фс ( физически выдернули флешку ), городить огород с откатом транзакций в потоках в этом случае будет сложной задачей...
Ставить ещё одну проверку на null к той, которую ставит компилятор - избыточный код.
вроде бы и не пятница, а бухие уже тут…
Бред.
Нафиг вообще тогда exception-ы, если можно проверять код возврата? (Для умных - тех кто знает, где может и не может прилететь null).
Зачем плодить море спец. проверок, если можно унифицировать, поставив один catch с case-ом и поиметь ОДНООБРАЗНУЮ обработку ошибок?
Разве это не упрощает разработку?
Или только hardcore?
спасибо, мнение говнокодеров очень важно для меня.
Вот не люблю я опеннетовских аналитегов, упёртые дураки ещё хуже стандартных...
Девочки, не ссорьтесь.Есть два принципиально разных подхода к обработке исключительных ситуаций во входных данных.
1. Для интерактивных приложений - вывести сообщение и/или подставить default.
2. Для потоков - немедленно упасть, если не понимаешь, что это за данные.Не дело web-форме падать по кривому почтовому индексу и не дело процессинговому центру подбирать подходящий номер кредитки.
Если тебе не сказали явно, что делать в исключительной ситуации - не умничай. Тот, кто придёт за тобой, знает где искать segfault, но за***ся искать, откуда прилетел illegal input event.
> Вот не люблю я опеннетовских аналитегов, упёртые дураки ещё хуже стандартных...ну не я же виноват, что ты дурак.
>> а вот попробуй это похапистам вписать в мозг (тред о php vs vibe.d).
> очень хорошо вписывается при помощи простых денежных стимулов. один сегфолт — минус
> премия. на code review не видно контрактов? минус премия. минус триПоходу, ты проект в одно рыло собрался писать. Как может, так и пишет. И это твоя задача подогнуть бизнес-процесс так, чтобы учесть эту особенность.
Ты ему минус премия, а он свалил от тебя на поддержку 1С. И денег больше, и нет до***ба начальника.
Через 3 года в Штатах у программёров ожидается конкурс 0.75 человек на место, при оптимистическом прогнозе по иммигрантам и выпускникам технических кафедр. Остальные страны на очереди.
> Походу, ты проект в одно рыло собрался писать.походу, в одно рыло будет лучше, чем разгребать потом говнокод. сроки релиза те же самые (потому что разгрёб говнокода неминуемо приводит к оооогромным срывам), зато код нормальный.
> И это твоя задача подогнуть бизнес-процесс так, чтобы учесть эту
> особенность.например, избавляться от идиотов как можно раньше.
> Через 3 года в Штатах у программёров ожидается конкурс 0.75 человек на
> место, при оптимистическом прогнозе по иммигрантам и выпускникам технических кафедр. Остальные
> страны на очереди.(пожимает плечами) их проблемы. ремесленников всегда было пучок за пятачок, а мастера всегда в цене.
>> отлично. вот хотелось бы это самое на уровне языка
> это и есть «на уровне языка». не ленимся, прописываем контракты: это полезно
> и наглядно. а в случае assert(), in {} и invariant {}
> — ещё и опционально (т.е. отключаемо в «релиз-версии» одним флагом компилятора).ну и разговор не о том, что контракты это круто/некруто, а об элементарном nullreference exception.
>средства ... проверки типов через использование ... сервера, отслеживающего изменения в файловой системеЭто как?
FAM/Gamin?
И как это поможет проверке типов?
Сервер увидел, что погромист поменял тип переменной - сразу посмотрел, где код от этого сломается, и выдал предупреждение.
Ну как-как, скорее всего простейший демон, который через какой-нить inotify ловит изменившиеся файлы и запускает на них проверку, а результаты сливает через IPC или сеть в клиента, который уже цепляется к IDE и гадит туда списком ошибок.У Scala примерно тоже самое делается через SBT.
Они там специальную тулзу написали watchman, в лине работает через inotify. Ловит изменения в указанном каталоге. Юзаю её для мелкой автоматизации, весьма удобно.
Может я что-то в этой жизни пропустил? В PHP из bash перекочевала структура "if ... endif"? )))
Если даже они убрали родной PHP'шный "if() {}", то кому нужен этот язык без if'ов...
Ошибся, endif это альтернативный синтаксис if ...
if ():endif;
Ну зачем, если есть java, нужна статика выберай
Не нужно закрытое нутро runtime жабы.
google OpenJDK - все нутро открыто.закрыты только плагины, которые не являются обязательной частью.
> google OpenJDK - все нутро открыто.продемонстрируйте пожалуйста. есть система. на системе компиляторы/интерпретаторы всех языков кроме явы. как мне получить яву, не ставя бинарь?
есть система. на системе компиляторы/интерпретаторы всех языков кроме cи. как мне получить си, не ставя бинарь?
> как мне получить си, не ставя бинарь?(trollface.png) http://ru.wikipedia.org/wiki/Раскрутка_компилятора
> как мне получить си, не ставя бинарь?Ты прикинь, а первые компьютеры программировали не имея компиляторов :).
молодцы, чо. что ж вы предыдущему вопрошающему это не рассказали?
Потому что Facebook может себе позволить.
пхп становится самым настоящим комбаином. Нужна статика есть java,D,Go. Нужна динамика есть Python, Ruby.
а если нужно всё вместе - PHP :D
> а если нужно всё вместе - PHP :Dа если нужно всё вместе - перепишите пхп, напишите свою вм для переписанного пхп и т.д.
По-моему название языка неподходящее. Гуглить по нему материалы будет проблематично.
Не хуже, чем у Go.
скорее будет наоборот, кинешься искать фильм "хакеры" - нет, вот на тебе маны по пхпоно и сейчас - сунешься за маном по сяшной функе в гугл (ну например когда обычных манов под рукой нет), ан нифига, 3 мана по пхп и 7 новостей, что в этой функе в пхп критическая уязвимость
> скорее будет наоборот, кинешься искать фильм "хакеры" - нет, вот на тебе маны
> по пхп
> оно и сейчас - сунешься за маном по сяшной функе в гугл
> (ну например когда обычных манов под рукой нет), ан нифига, 3
> мана по пхп и 7 новостей, что в этой функе в
> пхп критическая уязвимостьC oracl-ом ещё веселее, ссылает на docs.oracle но там справка по mysql, при этом особо и в глаза сразу не бросается.
Когда я вижу запись &$x, у меня что-то внутри подпрыгиваеет.
&$x[i->j]:!x?y
> Когда я вижу запись &$x, у меня что-то внутри подпрыгиваеет."Уже и в роботов PHP напихали" (с)
круто
Без условно, медведя можно научить кататься на велосипеде. Но вот будет ли от этого медведю удовольствие и польза?
> Без условно, медведя можно научить кататься на велосипеде. Но вот будет ли
> от этого медведю удовольствие и польза?Конечно, в цирке за это кормят, не будет кататься будет меньше еды...
> Без условноЗначение знаешь?
>> Без условно
> Значение знаешь?Не, курить!
Без условно!
Если кто-то будет теперь захваливать PHP -- я знаю какую ссылку ему кидать.)
> Если кто-то будет теперь захваливать PHP -- я знаю какую ссылку ему
> кидать.)что значит "захваливать", и как это выглядит?
> что значит "захваливать", и как это выглядит?Это примерно то, что ты делаешь с питоном.
а что я делаю с питоном?и вообще, это не я! оно само!
> и вообще, это не я! оно само!Вот, лучший пруф что у питонистов рантайм умнее программиста.
Как расширение это может и хорошо, но в целом это мало кому нужное замусоривание языка.
Это решает (не язык даже, а весь стек) многие детские проблемы php, но при этом синтаксически с ним совместим. Те, кто при словах python и ruby начинают плакать и звать маму, смогут загрузить этот nethack, и постепенно привыкать к хорошему.
Если это не будет выходить за пределы расширения, то терпимо. Но все равно есть опасность выпустить джина из бутылки, особенно когда пойдет по сети прикладной код и/или придется публиковать API.Возникает другой вопрос: если фб не может себе позволить разработку языка, а ограничивается лишь хаками, то это несколько странно.
Проблемы тормозов вполне решаемы.
Ничего плохого в строгой проверке типов нет, но это не решение.
фб не могут себе позволить переписывать весь код с похапэ на Новый Стильный Язык. вот и лепят костыли.
> фб не могут себе позволить переписывать весь код с похапэ на Новый
> Стильный Язык. вот и лепят костыли.Проверку типов можно сделать интерфейсами и заворачиванием в объекты, единственная проблема это контроль типа возвращаемого значения. Но и это решаемо: например обернуть возвращаемое значение в принимающую функцию с нужным типом. Для скорости переписать на C и сделать для всех pecl.
Оно конечно понятно: контроль типа, хорошее средство для борьбы с ошибками. Чем раньше программа завалится - тем лучше. Идеально, это когда валится на этапе компиляции. Для того чтобы это разрешать успешно - настроить свой редактор на linting. Благо средства для этого есть, хотя проблему контроля возвращаемого/принимаемого значения не решает к сожалению. Но это уже другой вопрос - лучше тогда уж делать компилятор нормальный, с раскруткой термов и контролем, если это возможно - и то не всегда... Эту проблему надо решать с другой стороны имхо.
судя по их уродливому API - у них тонны дерьма на php которое уже давно никто не понимает - отсюда и желание не переписать это на нормальном языке - а ускорить существующее
похоже на то, но и как-бы намекает о внутренних противоречиях...Переписать на нормальном языке будет наверное дороже, ибо нормальные языки требовательны к себе.
Только ускорить пытаются как-то не там и собственно не так... Вполне достаточно расширений на СИ, благо pecl никто не отменял. Другое дело, что php-internals это еще та каша, где хорошо постарался Zend API - до сих пор расхлебывают. Это о том, что жадность ни к чему хорошему не приводит...
При слове python лично я беру ружье, при слове ruby - ставлю растяжки. А как у вас?
> При слове python лично я беру ружье, при слове ruby - ставлю
> растяжки. А как у вас?руби хороший. как ребёнок-даун, который безобидный такой, пытается услужить, подражать взрослым. а питон — это даун агрессивный, который пытается всем рассказать, что они живут неправильно и надо брать пример с него, дауна.
> руби хороший. как ребёнок-даун, который безобидный такой,
> а питон — это даун агрессивный,А ариша просто даун. Поэтому в его мире всё и все - дауны.
> А ариша просто даун.Он не даун. Он Капитан Очевидность. Но у некоторых от этого случается ужасный батхерт. Ну извините, такова наша реальность, что узнавать о себе правду - не всегда приятно.
а вот это явно бидонист был. они — в том числе — отличаются высокой культурой дискуссий.
Расширение файлов ".hh" давно занято языком C++, будет путаница.
Надо было назвать *.hph
cpp -> cc
hp -> hphАббревеатура
> Аббревеатурапикард.webp
Там на самом деле есть статическая типизация, или как в Dart?
отличное развитие
если язык развиваеется - значит, у языка есть будущее
> использование "if/then/else" без обрамления блока символами "{}"скоро как в питоне обяжут отступы делать ровно 4 пробелами
Я бы везде обязал единый синтаксис.
> Я бы везде обязал единый синтаксис.Начни с себя - серая униформа зэка ждет тебя!
когда же они сделают php парсером в LLVM?
ссылки то нафига убрали?!!
Над PHP столько издевательств, не легче уже изначально разработать язык с нужным функциональными качествами, вместо этих попыток из того что есть попытаться сделать что то хорошее
ну, если ты готов ударными темпами переписать на этом новом языке весь код fb…
> ну, если ты готов ударными темпами переписать на этом новом языке весь
> код fb…В одиночку этого не добиться. А у тех кто делает тот же Hack вполне себе могут позволить написать язык с нуля. Если говорить о Hack то он появился в результате того что это нужно самой Facebook так что не думаю что их нужды разделит кто то еще кроме самой Facebook. И открытость кода еще не гарантирует его популярность. Спасибо конечно за труды, если этот код может кому то принести пользу кроме самой Facebook.
> В одиночку этого не добиться. А у тех кто делает тот же
> Hack вполне себе могут позволить написать язык с нуля.Вот только остановить фэйсбук который уже есть и работает им никто не даст. И ждать пока они его весь перепишут на свой кульный ЯП тоже всем обломно. Ничего личного, это бизнес.
Аннотации типов для локальных переменных не работают, пичалька.<?hh
function lal(string $name) {
string $hello = 'Hello';
/*array<string>*/ $words = [$hello, $name];
return implode(' ', $words);
}echo lal('world') . PHP_EOL;
Fatal error: syntax error, unexpected T_VARIABLE in /tmp/hh/lal.hh on line 4
Где benchmark этого hack?
facebook.com, не?
kPHP скопипасили у вконтакта
Facebook вообще клон ВКонтакта, даже тему скопипастил
Даже поддержку ООП?
Мне не совсем понятно зачем надо было делать этот новый ЯП с несколькими своими недофичами относительно похэпэ. Нельзя было аннотациями phpdoc пользоваться?
А я вот люблю, и рэп, и хип хоп, но хаком все равно не стану пользоваться) ПХП как то постабильней да и побогаче в плане поддержки модулей.
Терпеть не могу хип-хоп и рэп. Поэтому даже на страницы проектов заглядывать не буду. Я понимаю, что это модные жарны в музыке среди молодёжи, но на мой взгляд такие названия - неудачный ход для раскрутки. Тоже монжо сказать и про Хак.
Сначала придумаем языки с динамической типизацией, а потом героически решим проблему с производительностью кода, убрав эту самую динамическую типизацию. #hiphop #asm.js и пр.
"must say that overall I am really impressed with this blog. It is easy to see that you are passionate about your writing. If only I had your writing ability I look forward to more updates and will be returning.
"
Короче переизобрели Java... На что люди только не идут лиж бы не переписывать код :D