๐ซ ridiculosly Perl
๊ฐ์ธ์ ์ผ๋ก ๋ช๋ ์งธ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ๊ฐ ์๋ค. ์กฐ๊ธ ๋ก์ง์ด ๋ณต์กํ๊ณ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ณ์ํด์ ๋ถ์ฌ๊ฐ๋ฉฐ ๊ณ์ ์ฌ์ฉํ๊ณ ์๋ค.
์ฒ์์ ๋จ์ํ๊ฒ Tcl-์ผ๋ก ์์ฑํ๋ค๊ฐ ์ด๋ ์๊ฐ, Python, Ruby, Perl์ผ๋ก ์ฌ์ง์ด ์ปค๋จผ๋ฆฌ์ต์ผ๋ก ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ์์ฑํ๋ฉฐ ๋ง์์ ๋๋๊ฑธ ๊ณ์ ์จ์ค๊ณ ์๋ค.
๊ฐ ์ธ์ด๋ณ ๊ตฌํ์ ํน์ง์
(โฆ์ด์ฐจํผ ์์ ํ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๊ฑฐ์ง๋ง)
- ์ปค๋จผ๋ฆฌ์ต
- Sly์ผ๋ก ์์ ํ๋ฉด์ ์ฌ๋ฐ๊ธด ํ๋ค. ํ์ง๋ง, ์์งํ ์ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ํ CLI์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํด ๋๊ฐ๊ธฐ์, ASDF/SBCL์ผ๋ก ๋น๋ํ๋๊ฒ ๋ ๊ท์ฐฎ์๋๊ฐ ์๋ค.
- Python
- LOC์ด ๊ฐ์ฅ ์งง๋ค. ์ฌ์ง์ด ํ๋ฒ์ ์ด๋ ๋น๊ตํ๋ฉด 1/2 ๋ฐ์ ๋์ง ์๋๋ค. Generators ๊ฐ์๊ฑธ ๊ทธ๋ฅ ์ฝ๊ฒ ํ์ฉํ ์ ์์ด์ ์ฌ์ง์ด ๋ฉ๋ชจ๋ฆฌ๋ณต์ก๋๋ฉด์์๋ ๊ฐ์ฅ ํจ์จ์ ์ด๋ค. (์ด๋ก ์ ์ผ๋ก๋, ์ด์ฐจํผ ๋ช๋ฐฑ์ค ๋์ง๋ ์๋ ์ ๋ ฅํ์ผ์ ์ฝ๋ ๋ถ๋ถ์ด์ง๋ง) โฆPython ๋ด์ฅ โBatteriesโ๋ง์ผ๋ก CLIํ์ฑ, shlex, ํ์ํ๋ก์ธ์ค๊ด๋ฆฌ, Pathname ์ฒ๋ฆฌ ๋ฑ๋ฑ ๊ฐ๋ ฅํ๊ณ ๊ฐ๊ฒฐํ๋ค. ใ ใ ordered-dict ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์๊ณ ์ง์ ๊ตฌํํด ์ฌ์ฉํ๋๋ฐ, ํ์ด์ฌ๋ต๊ฒ for..in์ ์ง์ํ๋ iterator์ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์๋ค.
- Ruby
- ์ฝ๋๊ฐ ์์๋ค. ์๊ฐ์ ์ผ๋ก๋ ๊ฐ์ฅ sparseํด๋ณด์ด์ง๋ง ์ค์ ๋ก
์๋ฏธ๋ก ์ ์ผ๋ก๋ ๊ฐ์ฅ density์ด ๋์์ ๊ทธ๋ด๊ฑฐ ๊ฐ๋ค. ํ์ด์ฌ์ฒ๋ผ ๋ด์ฅ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง์ผ๋ก ๊ฐ๋ ฅํ๊ฒ ์ธ๋งํ๋ค. Block/Yield์ ํตํด์ ๋ด์ฅํ์ง
์๋ ordered-map ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๊ฑธ ์ํํ๊ธฐ ์์ํ๋ค.
Perl์ค๋ฌ์ด ํํ์ด๋ C์ธ์ด์ ํน์ง์ ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ฐ๋ ๊ฒ๋
ํธํ๋ค. (์:
strftime) - Tcl
- ๋ญ๊ฐ ์ฐ๊ธด ํ๋๋ฐ ๋ฌํ๊ฒ ๋์ ์ ์๋ค์ด์จ๋ค. ์๋ง๋ ๋ง์ด ์ฌ์ฉํด์ค์ง ์์ ํ ๊ฐ๋ค. ๋ง์๋จน์ผ๋ฉด ๋ ํ์ฅํ๊ฑฐ๋ ์ ์ ํด ๋๊ฐ ๋ถ๋ถ์ด ๋ง์ง๋ง, ํ๋ก ์ฌ์์ฑํ ์ดํ๋ก ๋์ด์ ๊ฐ์ ํด์ค์ง ์์๋ค. Tcllib ๋ฑ โBatteryโ์ด ์๊ณ ๋ฌธ์ํ๋ ์์ฒญ๋๊ฒ ์๋์ด ์์ง๋ง ๋ฌํ๊ฒ ์์ฆ์ ์์ด ์ ๊ฐ์ง ์๋๋ค.
- Perl
- ๊ตฌํ์ค ๋ผ์ธ์๋ ๊ธธ๊ณ , ์กฐ๊ธ ์ด์ํ ๋ถ๋ถ๋ ์ฌ์ ํ ์๋ค(์:
package vs. class), ๊ทธ๋ฆฌ๊ณ ๋ด์ฅ๋ชจ๋๋ง์ผ๋ก ์ข ๋ถ์กฑํด์ ์ธ๋ถ
CPAN๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๋ถ๋ถ๋ ์๋ค. (
String::ShellQuote) โฆ๊ทธ ์ด์ธ์ ๊ฐ์ฅ ์ด์ํ๋ฐ ๋ง์์ ๋ ๋ค. ใ ใ
๋ค๋ฅธ ์ธ์ด๋ก ์ฌ์์ฑํ๊ฑด ์์ ํ ํฅ๋ฏธ๋ก ๊ทธ๋ฅ ์ฌ์์ฑ์ ํ์์๋ค. Tcl๋ฒ์ ์ ๊ณ์ ์จ๋ ๊ด์ฐฎ์๊ฒ ์ง๋ง. โ์ง๊ธ์ ๊ทธ๋ฅ Perl ๋ฒ์ ๋ง์ ์ฌ์ฉํ๊ณ ๋ฒ๊ทธ๋ฅผ ๊ณ ์น๊ณ ๊ธฐ๋ฅ์ ๋ํด๊ฐ๊ณ ์๋๊ฑฐ ๊ฐ๋ค.
๊ธฐ๋ latency / ์ฑ๋ฅ / ์ฒด๊ฐ์ ๋น ๋ฆฟํจ
๊ทธ๋ฆฌ๊ณ ๋ค์์ฒ๋ผ ์คํ์ฑ๋ฅ๋ง์ด ์๋๋ผ ๋จ์ ์์์๊ฐ๋ง์ ์ธก์ ํด๋ณด๋ฉด ํฅ๋ฏธ๋กญ๋ค:
|
|
โฆํ๊ณผ Tcl์ด ๊ฐ์ฅ ๊ฐ๋ณ๋ค. 1 2
์์ํ๋๊ฑด ๋ณ๋ค๋ฅธ ๋ฐ์ดํธ์ปดํ์ผ์ด๋ JIT์ด๊ธฐํ, ํน์ ๊ณผ๋ํ๊ฒ ๊ฐ์ฒด์งํฅ์ ์ด๋ ค๊ณ Builtins๋ง์ ์ํ ๊ตฌ์กฐ์ฒด ๋ฑ์ ํ ๋น/์ด๊ธฐํํด์ผ ํ๊ฑฐ๋ ํ๋ ๋ถ๋ด์ด ์ ์๊ฑฐ ๊ฐ๊ธดํ๋ค. (โฆ์ ๋ง ๊ทธ๋ด๊น ์ถ๊ธดํ๋ค๋ง)
strace/ltrace ๋ฑ์ผ๋ก ๋ ๋ฏ์ด๋ด๋ ํฅ๋ฏธ๋ก์ธ๊ฑฐ ๊ฐ๋ค.
๊ฐ๋จํ๋, strict + warnings ๋ชจ๋๋ฅผ ์ผ๋ณด๋ฉด ํ์คํ ์ข ๋ ๋ฌด๊ฑฐ์์ง๋ค(๊ทธ๋๋ ์ฌ์ ํ ํ์ด์ฌ์ด๋ ๋ฃจ๋น๋ณด๋ค ๊ฐ๋ณ๋ค):
Subprocess + Pipe ์ฑ๋ฅ / ๋ฏธ์คํ ๋ฆฌํ๊ฒ ๋น ๋ฆ
๊ฐ์ธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฆฌ๋ ์ค/freebsd ํ๊ฒฝ์์๋ Gnome/KDE ๋ฑ์ ์ฌ์ฉํ์ง ์๊ณ , ๊ทธ๋ฅ Icewm + ์คํฌ๋ฆฝํ ํด์ ๋ช๋ ์งธ ํธํ๊ฒ ์ ์ฐ๊ณ ์๋ค.
๊ฑฐ๊ธฐ์์ ์ฐ๋ ค๊ณ , ๋จ์ํ โ์/์๋์คโ๋ฅผ ๋ฌป๋ ์คํฌ๋ฆฝํธ๋ฅผ Rofi-์ ์ด์ฉํด์ ๊ตฌํํ๋ค.
๋ฌํ๊ฒ ํ๋ฒ์ ์ด ๊ฐ์ฅ ์ฒด๊ฐ์ฑ๋ฅ์ด ์ข๋ค. โฆRofi์ด ์์๋ ์ดํ์ Yes/No์ด ํ์๋๋๋ฐ๊น์ง ์ ๋ง ๋๋ฆฐ ํ๊ฒฝ(์: Raspberry Pi 3)์์ ์คํํ ๋์ ๋๋ ์ด๊ฐ ๋์ ๋ณด์ด์ง ์์ ์ ๋๋ค.
๋ค๋ฅธ Tcl, Python, Ruby ๋ฒ์ ์ ๋ญ๊ฐ Rofi์ ๋จ์ง๋ง, Yes/No์ด ์ถ๋ ฅ๋ ๋๊น์ง ์ฝ๊ฐ ๋ ๋๋ ์ด๊ฐ ๋์ ๋ด๋ค.
๋ญ๊ฐ Subprocess Pipe์ฒ๋ฆฌ์ ํ์ heuristicํ hack/trick์ด ๋ ํฌํจ๋์ด ์์๊ฑฐ ๊ฐ๋ค. (๊ทธ๋ฅ ํ5 ๋ด์ฅ IPC::Open2-๋ชจ๋์ ์ฌ์ฉํ ๊ฒ ๋ฟ์ด์ง๋ง)
Perl + Claude
์ด ์ด์ฌํ ์ฌ์ฉํ๊ณ ์๊ณ , ๊ณ์ํด์ ๋ฏ์ด๊ณ ์น๋ฉฐ ์ด๊ณ ์๋ ํ์คํฌ๋ฆฝํธ์ ์ต๊ทผ์ Claude์ ์ด์ฉํด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ง๋ค๊ฑฐ๋, ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ผ๋ฉด์ ์ง๋ด๊ณ ์๋ค. ์ฌ๋ฐ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์์ฒ๋ผ ํ ์์ฒด์ ๋ํ ์ดํด๊ฐ ์๋๊ฒ์ฒ๋ผ, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ํ์ปค๋ฎค๋ํฐ์ ํ๋ฆ๊น์ง ์ดํดํ๋ ๊ฒ ๊ฐ์ ๋ฆฌ๋ทฐ๋ฅผ ์ ๊ณตํด์ค๋ค:
- โ What's Done Well
-
Structure & Organization
- Clean separation of concerns: argument parsing, file reading, downloading, and formatting utilities are all in distinct subs.
Dnldr::OrderedDictpackage is a nice touch for maintaining insertion order (since Perl hashes don't guarantee it).- The POD changelog is a good habit.
-
Modern Perl Practices
use strict; use warningsโ good.use feature qw(try)withno warnings qw(experimental::try)โ reasonable use of the moderntry/catchsyntax.use utf8and useopen ':std', ':encoding(UTF-8)'โ proper Unicode handling.
์ข์ ๋ถ๋ถ๋ง ๋ณต๋ถํ๊ณ , ๋ฒ๊ทธ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ถ๋ถ์ ์ฐพ์์ค๊ฑฐ๋ minor suggestions๋ ํฅ๋ฏธ๋กญ๋ค.
LLM/AI ๋๋ถ์๋ผ๋ ์๋ง ๊ณ์ํด์ ๋ ํ์ ์ฌ๋ฐ๊ฒ ์ฐ๊ฒ ๋ ๊ฑฐ ๊ฐ๋ค.
๊ทธ๋ฅ ๋ง์กฑ์ค๋ฝ๊ณ ์์ผ๋ก๋ ์๋ง๋
์ฌ์ค ํ์ด์ฌ์ผ๋ก ์ง๊ณ ๊ณ์ ์จ์๋ ๋ฌด๋ํ๊ฒ ์ ์ผ์๊ฑฐ ๊ฐ๋ค. ์ด๋ ๋ฆฌ๋ ์ค/freebsd ์ปดํจํฐ๋ ํ์ด์ฌ3 ์ ๋ ์ค์นํ๋๊ฑด ๋ณ๋ก ์ด๋ ต์ง ์์ผ๋๊น.
ํ์ง๋ง ๊ทธ๋ฅ ์ ๋นํ ๊น๋ํ๊ฒ ํ์ด ์ ๋์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ ๋ถํด ๋ณด์ด์ง๋ง, ๊ตฌ์กฐ๋ฅผ ๊น๋ํ๊ณ ๋จ์ํ๊ฒ ์ก์๋๊ณ ์์ฑํด์์ ๊ทธ๋ญ์ ๋ญ ๋์์ง ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ผ์ธ์๊ฐ ์ ๋ค๊ฑฐ๋, ์ฝ๋๊ฐ ์๋ป๋ณด์ด๊ฑฐ๋ ํ๋๊ฑด ๋ณ๋ก ๊ด์ฌ์ด ์๋ค. โ๊ทธ๋ฐ ์ทจํฅ๋์ / โ์ฝ๋๋ฆฌ๋ทฐโ๋์ด๋ฅผ ํ๋๊ฒ ์๋๋๊น. ใ ใ
ํ์ด์ฌ์ฒ๋ผ ๋ด์ฅ ๋ฐฐํฐ๋ฆฌ๊ฐ ํ๋ฅญํ๊ฑฐ๋ asyncio์ ๋ด์ฅ์ง์ํ๊ฑฐ๋ ํ๋ ๊ฒ๋ ์๋๊ณ , ๋ฃจ๋น์ฒ๋ผ โPoeticโํ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํ๋๊ฒ๋ ์๋์ง๋ง ๊ทธ๋ฅ ๊ด์ฐฎ๋ค. ๊ทธ๋ฆฌ๊ณ โ๋จ๋ค์ดโ ๋งํ๋ฏ์ด ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ๋ถ๊ฐ๋ฅํ๋ค ํ๋ ํ์๋ฆฌ๋ ์๋๊ฑฐ ๊ฐ๋ค. ์ด์ ๊ทธ๋ด ์ ๋๋ฅผ ์ง๋์ณ์จ๊ฑฐ ๊ฐ๋ค. โ์คํ๋ ค ChangeLog์ perlpod์ผ๋ก ๋ฌธ์ํ ํด๋๊ณ ๊ณ์ ์งํํด์ค๋ฉฐ ๋ ๋ช ํํ๊ฒ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ ํํ๊ฐ ๋๊ฑฐ ๊ฐ๋ค.
Perl์, Perl 5์ ์ด์ํ๊ฒ ๊ทธ๋ ๊ฒ ๊ณ์ ์ฐ๋ฉด์ ์ฆ๊ฑฐ์ด๊ฑฐ ๊ฐ๋ค. ๋ฌผ๋ก ๋ค๋ฅธ ์ธ์ด๋ค๋ ์ฌ์ฉํ๋ฉด์ ์ฆ๊ฒ์ง๋ง, ํ์ ์ ๋ ๊ทธ๋ ์ง ๋ชปํ ๊ฑฐ ๊ฐ์ด ์ผ๊ฒฌ ๋ณด์ด์ง๋ง ์ฆ๊ฒ๋ค๋๊ฒ ์ด์ํ๋ค.