Hace unos días leía una entrada de jetbrains que hablaba acerca del futuro de PHP , es una lectura muy interesante que os la recomiendo, y sin hacer mucho spoiler, la idea final era la de crear una asociación sin ánimo de lucro (non-profit), la cual entre otras muchas cosas se encargaría de mejorar PHP.

Según lo que proponen en este artículo, es que las grandes empresas que se nutren de PHP, aporten un poquito de capital para poder mantener el lenguaje de una forma más activa, sin tener que depender tanto de una comunidad.

La verdad que la idea me parece genial y revisando el artículo, vi que hasta habían publicado una lista de grandes empresas que estarían dispuestas a invertir en esta idea, Laravel, Acquia (Drupal), Symfony, Jetbrain…

La cosa es, que aunque la lista no es mucho más larga, me sorprendía que no estuviera Facebook, que como ya sabemos está programado en PHP y está claro que ellos solo con la calderilla ya habría para varios años con un equipo interesante en cuanto a tamaño.

Así que me puse a investigar, y sabéis que? Facebook, sorprendentemente no está hecho en PHP, bueno… si pero no… En realidad está hecho en Hack.

¿Que es HACK?

Después de digerir esta noticia, que desconocía totalmente, me puse a investigar qué era esto de Hack y porque nunca había oído hablar de esto en mi vida.

Resulta que Facebook había estado trabajando un lenguaje basado en PHP el cual estuviera diseñado para crear sitios web complejos y a gran velocidad.

Esto quiere decir que Hack es hijo de PHP haciendo que muchos de los scripts sean compatible padre-hijo, sin embargo, algunas funcionalidades menos usadas de PHP no han sido portadas a este nuevo lenguaje.

¿Que diferencias hay con PHP?

Aunque Hack sea compatible con gran parte de las funcionalidades que PHP trae nativamente, este, trae consigo unas nuevas mejoras, haciendo que el código y la lógica de programación, aunque parecidos en algunas partes, sean diferentes.

1.- Intercalar HTML + PHP: Algo que les gusta mucho a los principiantes y sobretodo a los devs de WordPress, es intercalar HTML con PHP. Bien, siento deciros que esto no será posible en este nuevo lenguaje.


<html>
<head>
<title>Prueba de PHP</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?> 
<noscript id="wpfc-google-fonts"><link rel='stylesheet' id='breezycv-google-fonts-css' href='https://fonts.googleapis.com/css?family=Poppins:100,100italic,200,200italic,300,300italic,regular,italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic' type='text/css' media='all'/>
<link rel='stylesheet' id='google-fonts-1-css' href='https://fonts.googleapis.com/css?family=Roboto%3A100%2C100italic%2C200%2C200italic%2C300%2C300italic%2C400%2C400italic%2C500%2C500italic%2C600%2C600italic%2C700%2C700italic%2C800%2C800italic%2C900%2C900italic%7CRoboto+Slab%3A100%2C100italic%2C200%2C200italic%2C300%2C300italic%2C400%2C400italic%2C500%2C500italic%2C600%2C600italic%2C700%2C700italic%2C800%2C800italic%2C900%2C900italic%7CPoppins%3A100%2C100italic%2C200%2C200italic%2C300%2C300italic%2C400%2C400italic%2C500%2C500italic%2C600%2C600italic%2C700%2C700italic%2C800%2C800italic%2C900%2C900italic&#038;display=auto&#038;ver=6.7' type='text/css' media='all'/>
</noscript>
<script>document.addEventListener('DOMContentLoaded',function(){function wpfcgl(){var wgh=document.querySelector('noscript#wpfc-google-fonts').innerText, wgha=wgh.match(/<link[^\>]+>/gi);for(i=0;i<wgha.length;i++){var wrpr=document.createElement('div');wrpr.innerHTML=wgha[i];document.body.appendChild(wrpr.firstChild);}}wpfcgl();});</script>
<script id="sgr-js-extra">var sgr={"sgr_site_key":"6LezZMsZAAAAADUQx85P7p3kbKEJpp7LQJTyDMcz"};</script>
<script id="cookie-law-info-js-extra">var Cli_Data={"nn_cookie_ids":[],"cookielist":[],"non_necessary_cookies":[],"ccpaEnabled":"","ccpaRegionBased":"","ccpaBarEnabled":"","strictlyEnabled":["necessary","obligatoire"],"ccpaType":"gdpr","js_blocking":"1","custom_integration":"","triggerDomRefresh":"","secure_cookies":""};
var cli_cookiebar_settings={"animate_speed_hide":"500","animate_speed_show":"500","background":"#fca071","border":"#b1a6a6c2","border_on":"","button_1_button_colour":"#61a229","button_1_button_hover":"#4e8221","button_1_link_colour":"#fff","button_1_as_button":"1","button_1_new_win":"","button_2_button_colour":"#333","button_2_button_hover":"#292929","button_2_link_colour":"#444","button_2_as_button":"","button_2_hidebar":"","button_3_button_colour":"#3566bb","button_3_button_hover":"#2a5296","button_3_link_colour":"#fff","button_3_as_button":"1","button_3_new_win":"","button_4_button_colour":"#000","button_4_button_hover":"#000000","button_4_link_colour":"#333333","button_4_as_button":"","button_7_button_colour":"#61a229","button_7_button_hover":"#4e8221","button_7_link_colour":"#fff","button_7_as_button":"1","button_7_new_win":"","font_family":"inherit","header_fix":"","notify_animate_hide":"1","notify_animate_show":"1","notify_div_id":"#cookie-law-info-bar","notify_position_horizontal":"right","notify_position_vertical":"bottom","scroll_close":"","scroll_close_reload":"","accept_close_reload":"","reject_close_reload":"","showagain_tab":"","showagain_background":"#fff","showagain_border":"#000","showagain_div_id":"#cookie-law-info-again","showagain_x_position":"100px","text":"#333333","show_once_yn":"","show_once":"10000","logging_on":"","as_popup":"","popup_overlay":"1","bar_heading_text":"","cookie_bar_as":"banner","popup_showagain_position":"bottom-right","widget_position":"left"};
var log_object={"ajax_url":"https:\/\/www.drupalia.cat\/wp-admin\/admin-ajax.php"};</script>
<script id="breezycv-jquery-main-js-after">var ajaxurl="https://www.drupalia.cat/wp-admin/admin-ajax.php";</script>
<script id="elementor-pro-frontend-js-before">var ElementorProFrontendConfig={"ajaxurl":"https:\/\/www.drupalia.cat\/wp-admin\/admin-ajax.php","nonce":"04fb5b9451","urls":{"assets":"https:\/\/www.drupalia.cat\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/www.drupalia.cat\/wp-json\/"},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"es_ES","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/www.drupalia.cat\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}};</script>
<script id="elementor-frontend-js-before">var elementorFrontendConfig={"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Compartir en Facebook","shareOnTwitter":"Compartir en Twitter","pinIt":"Pinear","download":"Descargar","downloadImage":"Descargar imagen","fullscreen":"Pantalla completa","zoom":"Zoom","share":"Compartir","playVideo":"Reproducir v\u00eddeo","previous":"Anterior","next":"Siguiente","close":"Cerrar","a11yCarouselWrapperAriaLabel":"Carrusel | Scroll horizontal: Flecha izquierda y derecha","a11yCarouselPrevSlideMessage":"Diapositiva anterior","a11yCarouselNextSlideMessage":"Diapositiva siguiente","a11yCarouselFirstSlideMessage":"Esta es la primera diapositiva","a11yCarouselLastSlideMessage":"Esta es la \u00faltima diapositiva","a11yCarouselPaginationBulletMessage":"Ir a la diapositiva"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"M\u00f3vil vertical","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"M\u00f3vil horizontal","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tableta vertical","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tableta horizontal","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Port\u00e1til","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Pantalla grande","value":2400,"default_value":2400,"direction":"min","is_enabled":false}}},"version":"3.21.1","is_static":false,"experimentalFeatures":{"e_optimized_assets_loading":true,"additional_custom_breakpoints":true,"e_swiper_latest":true,"container_grid":true,"theme_builder_v2":true,"home_screen":true,"ai-layout":true,"landing-pages":true,"form-submissions":true},"urls":{"assets":"https:\/\/www.drupalia.cat\/wp-content\/plugins\/elementor\/assets\/"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":840,"title":"Hack%20Lang%2C%20porque%20existes%3F%20%7C%20Raul%20Jimenez","excerpt":"","featuredImage":"https:\/\/www.drupalia.cat\/wp-content\/uploads\/2021\/12\/Hack-porque-existes-1024x576.png"}};</script>
<script src="https://www.drupalia.cat/wp-content/plugins/simple-google-recaptcha/sgr.js?ver=1663335061" id="sgr-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/mjh5ne3d/2avnx.js" id="jquery-core-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/kbnhbf72/2avnx.js" id="jquery-migrate-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/cookie-law-info/legacy/public/js/cookie-law-info-public.js?ver=3.2.7" id="cookie-law-info-js"></script>
<script id="google_gtagjs-inline">window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'UA-49208618-1', {});</script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/q8zmqecg/2avnx.js" id="jquery-ui-core-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/7m8jnia9/2avnx.js" id="jquery-ui-mouse-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/l9nak5xx/2avnx.js" id="jquery-ui-slider-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/1fybw8jl/2avnx.js" id="jquery-ui-draggable-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/dj06hsyu/2avnx.js" id="jquery-touch-punch-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/7z1lf12b/2avnx.js" id="modernizr-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/la9b3udw/2avnx.js" id="bootstrap-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/8u5iy280/2avnx.js" id="owl-carousel-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/kb16krrd/2avnx.js" id="perfect-scrollbar-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/jnzpalho/2avnx.js" id="breezycv-jquery-validator-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/9i8e2j09/2avnx.js" id="imagesloaded-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/dhy9rh1w/2avnx.js" id="shuffle-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/kenhr6dr/2avnx.js" id="masonry-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/jp75f222/2avnw.js" id="magnific-popup-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/d4gich3e/2avnw.js" id="events-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/hmzwq/2avnw.js" id="mutate-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/9iaropl5/2avnw.js" id="breezycv-jquery-main-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/7z3r6qa4/2avo9.js" id="comment-reply-js" async="async" data-wp-strategy="async"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/components/prism-core.min.js?ver=1.23.0" id="prismjs_core-js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js?ver=1.23.0" id="prismjs_loader-js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/normalize-whitespace/prism-normalize-whitespace.min.js?ver=1.23.0" id="prismjs_normalize-js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/line-numbers/prism-line-numbers.min.js?ver=1.23.0" id="prismjs_line_numbers-js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/toolbar/prism-toolbar.min.js?ver=1.23.0" id="prismjs_toolbar-js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js?ver=1.23.0" id="prismjs_copy_to_clipboard-js"></script>
<script src="https://www.recaptcha.net/recaptcha/api.js?hl=es_ES&amp;onload=sgr_2&amp;render=explicit&amp;ver=1732169131" id="sgr_recaptcha-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.21.0" id="elementor-pro-webpack-runtime-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.21.1" id="elementor-webpack-runtime-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.21.1" id="elementor-frontend-modules-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/dsfzmzx4/2avnw.js" id="wp-hooks-js"></script>
<script src="//www.drupalia.cat/wp-content/cache/wpfc-minified/ffx7ukf8/2avnw.js" id="wp-i18n-js"></script>
<script id="wp-i18n-js-after">wp.i18n.setLocaleData({ 'text direction\u0004ltr': [ 'ltr' ] });</script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.21.0" id="elementor-pro-frontend-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor/assets/lib/waypoints/waypoints.min.js?ver=4.0.2" id="elementor-waypoints-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.21.1" id="elementor-frontend-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.21.0" id="pro-elements-handlers-js"></script>
<script src="https://www.drupalia.cat/wp-content/plugins/breezycv-widgets/shortcodes/assets/js/scripts.js?ver=1" id="breezycv_scripts-js"></script>
<script>(function(){
var expirationDate=new Date();
expirationDate.setTime(expirationDate.getTime() + 31536000 * 1000);
document.cookie="pll_language=es; expires=" + expirationDate.toUTCString() + "; path=/; secure; SameSite=Lax";
}());</script>
</body>
</html>

2.- HipHop Virtual Machine (HHVM): Otro de los cambios más significativos es que ya no usaremos la máquina virtual de zend para hacer funcionar nuestro código, Facebook ha desarrollado su propia máquina virtual  basada en la compilación Just-In-Time (JIT) que transforma primero en bytecode HipHop intermedio (HHBC), y que luego se traduce dinámicamente en código máquina x86-64, se optimiza y se ejecuta de forma nativa. PHP 8 ha introducido esto como novedad también.

3.- Operaciones Asincrónicas: Nos permiten operar con el sistema «multi-tasking», es decir que se ejecuten varias funciones en paralelo, algo muy parecido a como funciona NodeJS.


async function do_cpu_work(): Awaitable<void> {
print("Start CPU work\n");
$a = 0;
$b = 1;
$list = vec[$a, $b];
for ($i = 0; $i < 1000; ++$i) {
$c = $a + $b;
$list[] = $c;
$a = $b;
$b = $c;
}
print("End CPU work\n");
}
async function do_sleep(): Awaitable<void> {
print("Start sleep\n");
\sleep(1);
print("End sleep\n");
}
async function run(): Awaitable<void> {
print("Start of main()\n");
await Vec\from_async(vec[do_cpu_work(), do_sleep()]);
print("End of main()\n");
}
<<__EntryPoint>>
function main(): void {
\HH\Asio\join(run());
}

Salida:


Start of main()
Start CPU work
End CPU work
Start sleep
End sleep
End of main()

4.- Anotaciones especiales: Otra curiosidad, que hace cambiar nuestra forma de programar son las anotaciones especiales. Si nos damos cuenta del código anterior veremos una anotaciones especial en la función main() «<<__EntryPoint>>» 


<<__EntryPoint>>
function main(): void {
\HH\Asio\join(run());
}

Esto básicamente lo que hace es, decirle al HHVM que cuando se ejecute este archivo, empiece desde ese punto saltándose así las funciones que hayamos declarado previamente, un poco siguiente la linea de NodeJS.

La lista de diferencias es más larga, pero creo que con estos ejemplos nos hacemos una idea de que, aunque en términos generales, nuestros conocimientos de PHP nos servirán para trabajar con Hack, al final tendremos que aprenderlo como si fuera un lenguaje nuevo.

¿Cual es el sentido de crear Hack?

Después de entender un poco qué es esto de Hack, vamos a intentar resolver la pregunta inicial, porque existe hack?

Facebook, se caracteriza por sacar siempre novedades en cuanto a tecnología se refiere y en términos generales son siempre bien recibidos por la comunidad, dado que mejor que ellos, no sabe nadie lo que es trabajar con millones de usuarios al mismo tiempo.

Uno de los puntos de porque Hack no se ha hecho popular como así lo hicieran otras tecnologías de Facebook, es porque este cambio no es trivial y aunque digan que es «open source» yo creo que seguirá siendo mantenido por facebook, pero por cuánto tiempo?

Desde mi punto de vista creo que tendrían que haberse puesto en contacto con la comunidad PHP y haber buscado una solución conjunta.

El problema de PHP no es el lenguaje en sí, sino que necesita una vuelta de tuerca y centrarse en el futuro, en mejorar el lenguaje para lo que está por venir que son las IAs y en la cual está perdiendo cuota de mercado.

Tal y como comencé este artículo hay una propuesta para crear una asociación PHP y creo que ahi deberia de estar facebook, y ayudar a mejorar todos juntos.

Y tú qué piensas acerca de esto? estas a favor de Hack? comentame y dime.

Extra

Una extra que me gustaría comentar, es el nombre que usaron para el nuevo lenguaje, sin duda alguna, es muy poco acertada, porque creedme que buscar información sobre Hack lang en internet con la palabra clave Hack, es bastante difícil.