[Hack] ์†Œ๊ฐœ

[์›๋ณธ ๋งํฌ]

Hack์€ PHP๋ฅผ ๋งˆ๊ฐœ์กฐํ•œ ๋”์ฐํ•œ ํ˜ผ์ข…์ด๋‹ค.
PHP์˜ ํƒœ์ƒ์ ์œผ๋กœ ๊ตฌ๋ฆฐ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž์ฒด์ ์œผ๋กœ ๋ถˆ๋ฒ•๊ฐœ์กฐ์‹œ์ˆ ์„ ๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ PHP์™€ ํ˜ธํ™˜๋˜์ง€๋Š” ์•Š๋Š” ๋ณ„๊ฐœ์˜ ์ƒ๋ช…์ฒด๋‹ค.

ํŽ˜์ด์Šค๋ถ๊ณผ ์Šฌ๋ž™ ๋ฉ”์ธ ๋ฐฑ์—”๋“œ์— ์“ฐ์ด๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•˜๋‹ค.
ํŽ˜๋ถ์ด php ์“ด๋‹ค๊ณ  php ์–ต๋น ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์€๋ฐ, ์‚ฌ์‹ค ์Ÿค๋“ค์ด ์“ฐ๋Š”๊ฑด hack์ด๋ผ์„œ php ์“ด๋‹ค๊ณ  ํ•˜๊ธฐ๋„ ์• ๋งคํ•˜๋‹ค.

2011๋…„์— ๋‚˜์™”๊ณ , ํŽ˜์ด์Šค๋ถ์—์„œ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.




์ผ๋ฐ˜ PHP์™€์˜ ์ฐจ์ด

์ผ๋‹จ JIT์„ ๋นก์„ธ๊ฒŒ ๋Œ๋ฆฐ๋‹ค๋Š” ์ ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋งŽ์ด ๋œ๋‹ค. ์ตœ๊ทผ ๋ฒ„์ „์— ์™€์„œ๋Š” PHP๋„ JIT ์ตœ์ ํ™”๋ฅผ ๋Œ๋ ค์„œ ์ด์ œ๋Š” ์•„์ฃผ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์•„๋‹ˆ์ง€๋งŒ, ๊ณผ๊ฑฐ์—๋Š” ๊ทธ๋žฌ๋‹ค.

ํ˜„์žฌ๋„ ์ผ๋ฐ˜ PHP์™€ ๋น„๊ตํ•˜๋ฉด ๊ทผ์†Œํ•˜๊ฒŒ ๋น ๋ฅธ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.
์•„๋ž˜๋Š” PHP7๊ณผ ๋น„๊ตํ•œ ๋ฒค์น˜๋งˆํฌ๋‹ค.

https://www.wpoven.com/blog/hhvm-vs-php-7-performance-showdown-wordpress-nginx/

2019-01-28์— ์ถœ์‹œ๋œ v4.0.0 ๋ฒ„์ „๋ถ€ํ„ฐ PHP ์ฝ”๋“œ ํ˜ธํ™˜์„ฑ์„ ํ๊ธฐํ•˜๊ณ  ๋…์ž ๋…ธ์„ ์„ ๊ฑท๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.
์–ด๋А์ •๋„ ์œ ์‚ฌ์„ฑ์€ ์žˆ์ง€๋งŒ ๋‹ค๋ฅด๋‹ค.




HHVM ์„ค์น˜

Hack์€ HHVM์ด๋ผ๊ณ  ํ•ด์„œ ์ž์ฒด์ ์ธ ๊ฐ€์ƒ๋จธ์‹  ํ”Œ๋žซํผ ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค. HH๋Š” ๋†€๋ž๊ฒŒ๋„ ํž™ํ•ฉ์˜ ์ถ•์•ฝ์ด๋‹ค.
windows๋Š” ์ง€์›ํ•˜์ง€ ์•Š๊ณ , ๋ฆฌ๋ˆ…์Šค์™€ Mac๋งŒ ์ง€์›ํ•œ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์€ ์šฐ๋ถ„ํˆฌ 22๋‹ค.
์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

sudo apt-get update &&
sudo apt-get install --yes software-properties-common apt-transport-https &&
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94 &&
sudo add-apt-repository 'deb https://dl.hhvm.com/universal release main' &&
sudo apt-get update &&
sudo apt-get install --yes hhvm &&
hhvm --version

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด hhvm cli๊ฐ€ ์„ค์น˜๋˜๋ฉด ๋œ ๊ฒƒ์ด๋‹ค.




ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ

ํด๋” ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— hhconfig๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

mkdir my_project
cd my_project
touch .hhconfig

hhconfig๋Š” ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ hack ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์ด๋‹ค.
nodejs์˜ package.json์ด๋‚˜ go์˜ go.mod, rust์˜ cargo.toml๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.




Hello World ํ”„๋กœ๊ทธ๋žจ

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ .hack ํ™•์žฅ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค.

use namespace HH\Lib\IO;

<<__EntryPoint>>
async function main(): Awaitable<void> {
  await IO\request_output()->writeAllAsync("Hello World!\n");
}

์ˆœ์ˆ˜ php์™€ ๋น„๊ตํ•ด์„œ ๊ฝค ์ด์งˆ์ ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์ž‡๋‹ค.
EntryPoint ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ํ†ตํ•ด ์ง„์ž…์ ์„ ๋ช…์‹œํ•˜๊ณ , ํ•ด๋‹น ์ง„์ž…์  ํ•จ์ˆ˜์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์ €๊ธฐ์„œ ์ถœ๋ ฅํ•˜๋Š” ํ…์ŠคํŠธ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ client์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต๊ฐ’์ด ๋œ๋‹ค.




ํƒ€์ž…์ฒดํฌ

hh_client cli๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์ฒด์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ํƒ€์ž…์ฒดํฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฌธ์ œ ์—†์œผ๋ฉด ์ด๋ ‡๊ฒŒ ๋œจ๊ณ 

๋ญ”๊ฐ€ ์•ˆ๋งž๋Š”๊ฒŒ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋–จ๊ตฐ๋‹ค.

๋กœ๊ทธ๊ฐ€ ๊ฝค ์นœ์ ˆํ•œ ํŽธ์ด๋‹ค.




์‹คํ–‰ํ•˜๊ธฐ

hack ์ฝ”๋“œ ์‹คํ–‰๋ฒ•์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

ํŠน์ • ํŒŒ์ผ์„ ๊ทธ๋ƒฅ ์ฝ˜์†”๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฒ•์ด ์žˆ๋Š”๋ฐ

๊ทธ๋Ÿผ ์ฝ˜์†”์— ์ฐ๊ณ  ์ผํšŒ์„ฑ ํ”„๋กœ์„ธ์Šค๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

์„œ๋ฒ„๋กœ ๊ตฌ๋™ํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ์˜ต์…˜์„ ์ฃผ๋ฉด ๋œ๋‹ค.

hhvm -m server -p 8080

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๊ฐ€ ๋œจ๊ณ 

ํŒŒ์ผ๋ช…์œผ๋กœ ๋”ฐ๋ผ๊ฐ€์„œ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.




์‹ ํƒ์Šค

PHP์™€ ๋…์ž ๋…ธ์„ ์„ ๊ฑท๊ณ ๋Š” ์žˆ์ง€๋งŒ, ๋ณ€์ˆ˜ ์„ ์–ธ์ด๋‚˜ ๊ธฐํƒ€ ์‹ ํƒ์Šค๋ฅผ ์ด๋ฃจ๋Š” ๊ณจ์กฐ๋Š” ์—ฌ์ „ํžˆ PHP์™€ ๋™์ผํ•˜๋‹ค.
์•„๋ž˜๋Š” ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜ 2๊ฐœ ๋‘๊ณ  ํ•ฉ์ณ์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋‹ค.



์ฐธ์กฐ
https://docs.hhvm.com/hack/getting-started/getting-started
https://slack.engineering/taking-php-seriously/