한글라이즈 재제작기
- 12. Go 코딩
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
우리가 새로운 언어를 습득해 나갈 때
아마 이런 과정을 거치게 될 것 같은데
- 15. Go 코딩
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
저
Go 코딩은 매일 하고 있지만
아직 본격적으로 실무에 써보진 못 했습니다.
- 33. 말소리를 음성 문자로 옮겨 적음.다음사전
의미를 옮기는 번역(translation)과는 달라요.
전사(transcription)
좀 더 정확히는
"전사"라고 부르는데
- 34. 말소리를 음성 문자로 옮겨 적음.다음사전
의미를 옮기는 번역(translation)과는 달라요.
전사(transcription)
다음사전에서 찾아보면 말소리를 음성 문자로
옮겨 적는 걸 뜻한다고 합니다.
- 35. 말소리를 음성 문자로 옮겨 적음.다음사전
의미를 옮기는 번역(translation)과는 달라요.
전사(transcription)
한글라이즈의 역할은
외국어 단어의 의미를 해석해서
- 36. 말소리를 음성 문자로 옮겨 적음.다음사전
의미를 옮기는 번역(translation)과는 달라요.
전사(transcription)
우리말로 번역하는 게 아니라
발음만 한글로 표기하는 것이죠.
- 64. •ピカチュウ ▶ 피카츄
•靑島 ▶ 칭따오
•Chevrolet ▶ 쉐보레
어디까지나 권고사항
피카추
칭다오
셰브럴레이
하지만 외래어 표기법은
어디까지나 권고사항일 뿐이라서
- 65. •ピカチュウ ▶ 피카츄
•靑島 ▶ 칭따오
•Chevrolet ▶ 쉐보레
어디까지나 권고사항
피카추
칭다오
셰브럴레이
이미 다른 표기가 널리 퍼져 있는 브랜드라면
국립국어원에서도 그쪽의 손을 들어주고 있습니다.
- 66. 제1항
외래어는 국어의 현용 24 자모만으로 적는다.
제2항
외래어의 1 음운은 원칙적으로 1 기호로 적는다.
제3항
받침에는 ㄱ, ㄴ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ만을 쓴다.
제4항
파열음 표기에는 된소리를 쓰지 않는 것을 원칙으로 한다.
제5항
이미 굳어진 외래어는 관용을 존중하되,
그 범위와 용례는 따로 정한다.
외래어 표기법
자음 반모음 모음
국제 음성
기호
한글 국제 음성
기호
한글 국제 음성
기호
한글
모음 앞 자음 앞
또는 어
말
p ㅍ ㅂ, 프 j 이 i 이
b ㅂ 브 ɥ 위 y 위
t ㅌ ㅅ, 트 w 오, 우 e 에
d ㄷ 드 φ 외
k ㅋ ㄱ, 크 ɛ 에
g ㄱ 그 ɛ̃ 앵
f ㅍ 프 œ 외
v ㅂ 브 œ̃ 욍
θ ㅅ 스 æ 애
ð ㄷ 드 a 아
s ㅅ 스 ɑ 아
- 67. 제1항
외래어는 국어의 현용 24 자모만으로 적는다.
제2항
외래어의 1 음운은 원칙적으로 1 기호로 적는다.
제3항
받침에는 ㄱ, ㄴ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ만을 쓴다.
제4항
파열음 표기에는 된소리를 쓰지 않는 것을 원칙으로 한다.
제5항
이미 굳어진 외래어는 관용을 존중하되,
그 범위와 용례는 따로 정한다.
외래어 표기법
자음 반모음 모음
국제 음성
기호
한글 국제 음성
기호
한글 국제 음성
기호
한글
모음 앞 자음 앞
또는 어
말
p ㅍ ㅂ, 프 j 이 i 이
b ㅂ 브 ɥ 위 y 위
t ㅌ ㅅ, 트 w 오, 우 e 에
d ㄷ 드 φ 외
k ㅋ ㄱ, 크 ɛ 에
g ㄱ 그 ɛ̃ 앵
f ㅍ 프 œ 외
v ㅂ 브 œ̃ 욍
θ ㅅ 스 æ 애
ð ㄷ 드 a 아
s ㅅ 스 ɑ 아
외래어 표기법은 이런
규칙집으로 이뤄져 있습니다.
- 68. 제1항
외래어는 국어의 현용 24 자모만으로 적는다.
제2항
외래어의 1 음운은 원칙적으로 1 기호로 적는다.
제3항
받침에는 ㄱ, ㄴ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ만을 쓴다.
제4항
파열음 표기에는 된소리를 쓰지 않는 것을 원칙으로 한다.
제5항
이미 굳어진 외래어는 관용을 존중하되,
그 범위와 용례는 따로 정한다.
외래어 표기법
자음 반모음 모음
국제 음성
기호
한글 국제 음성
기호
한글 국제 음성
기호
한글
모음 앞 자음 앞
또는 어
말
p ㅍ ㅂ, 프 j 이 i 이
b ㅂ 브 ɥ 위 y 위
t ㅌ ㅅ, 트 w 오, 우 e 에
d ㄷ 드 φ 외
k ㅋ ㄱ, 크 ɛ 에
g ㄱ 그 ɛ̃ 앵
f ㅍ 프 œ 외
v ㅂ 브 œ̃ 욍
θ ㅅ 스 æ 애
ð ㄷ 드 a 아
s ㅅ 스 ɑ 아
국립국어원 홈페이지에서
누구나 자유롭게 볼 수 있죠.
- 69. 제1항
외래어는 국어의 현용 24 자모만으로 적는다.
제2항
외래어의 1 음운은 원칙적으로 1 기호로 적는다.
제3항
받침에는 ㄱ, ㄴ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ만을 쓴다.
제4항
파열음 표기에는 된소리를 쓰지 않는 것을 원칙으로 한다.
제5항
이미 굳어진 외래어는 관용을 존중하되,
그 범위와 용례는 따로 정한다.
외래어 표기법
자음 반모음 모음
국제 음성
기호
한글 국제 음성
기호
한글 국제 음성
기호
한글
모음 앞 자음 앞
또는 어
말
p ㅍ ㅂ, 프 j 이 i 이
b ㅂ 브 ɥ 위 y 위
t ㅌ ㅅ, 트 w 오, 우 e 에
d ㄷ 드 φ 외
k ㅋ ㄱ, 크 ɛ 에
g ㄱ 그 ɛ̃ 앵
f ㅍ 프 œ 외
v ㅂ 브 œ̃ 욍
θ ㅅ 스 æ 애
ð ㄷ 드 a 아
s ㅅ 스 ɑ 아
하지만 워낙 복잡해서 아무리 잘 따르려 노력해도
틀리는 경우가 많습니다.
- 70. •정기적으로 각 외래어의 한글 표기 결정
•언론에 보도되는 이름 중심
정부·언론 외래어 심의 공동위원회
그래서 바른 말 쓰기를
특히 중요하게 여기는 정부와 언론 쪽에선
- 71. •정기적으로 각 외래어의 한글 표기 결정
•언론에 보도되는 이름 중심
정부·언론 외래어 심의 공동위원회
외래어 표기법이
잘 지켜지고 있는지 평가하고
- 72. •정기적으로 각 외래어의 한글 표기 결정
•언론에 보도되는 이름 중심
정부·언론 외래어 심의 공동위원회
정기적으로 공식 외래어 표기를 발표하는
위원회를 두고 있어요.
- 73. •정기적으로 각 외래어의 한글 표기 결정
•언론에 보도되는 이름 중심
정부·언론 외래어 심의 공동위원회
"정부·언론 외래어 심의 공동위원회"라는 곳인데
코드리뷰어 집단이라고 생각하면 될 것 같습니다.
- 74. 제92차 정부·언론외래어심의공동위원회 심의 결정안
(인명 52건, 일반용어 1건-재심의 2건)
• 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아
여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자
인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을
강조하는 디자인으로 유명함.
• 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA)
회장(1974~1998). 브라질 인.
• 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사.
일본 간사이(關西)학원 원장(2007. 4.~ ).
- 75. 제92차 정부·언론외래어심의공동위원회 심의 결정안
(인명 52건, 일반용어 1건-재심의 2건)
• 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아
여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자
인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을
강조하는 디자인으로 유명함.
• 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA)
회장(1974~1998). 브라질 인.
• 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사.
일본 간사이(關西)학원 원장(2007. 4.~ ).
이건 외래어 심의위가 발표한
표기 심의 결정안 중 하나인데
- 76. 제92차 정부·언론외래어심의공동위원회 심의 결정안
(인명 52건, 일반용어 1건-재심의 2건)
• 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아
여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자
인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을
강조하는 디자인으로 유명함.
• 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA)
회장(1974~1998). 브라질 인.
• 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사.
일본 간사이(關西)학원 원장(2007. 4.~ ).
아버라, 암살러
그루블
심의위에서도 드물게
틀리는 경우가 있습니다.
- 77. 제92차 정부·언론외래어심의공동위원회 심의 결정안
(인명 52건, 일반용어 1건-재심의 2건)
• 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아
여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자
인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을
강조하는 디자인으로 유명함.
• 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA)
회장(1974~1998). 브라질 인.
• 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사.
일본 간사이(關西)학원 원장(2007. 4.~ ).
아버라, 암살러
그루블
원 단어의 발음을 잘못 유추하는 바람에
표기를 잘못 정하는 경우가 종종 있다고 해요.
- 87. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
- 88. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
8년 전, 종성 님은 블로그에
이런 글을 쓰셨어요.
- 89. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
정기적으로 회의를 열어
용례를 정하는 것으로는 한계가 있다.
- 90. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
외래어 표기 심의 방식이 자동화되어
- 91. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
한글로 표기하고 싶은 외국어를 입력하자마자
한글 표기가 나와야 한다.
- 92. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005)
잠깐 샛길로 빠지면, 제가 대학교 다닐 때
제일 좋아했던 강의는 〈언어학 개론〉이었거든요.
- 93. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005)
언어학은 사람이 구사하는 언어를
연구하는 과학분야인데
- 94. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005)
학생 절반이 수능시험의
언어영역 생각하고 들어왔다가
- 95. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005)
첫 강의만 듣고 대거 취소했던 강의이긴 하지만
저에겐 인생 강의였습니다.
- 96. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005)
언어학을 전공한 건 아니더라도
늘 덕심을 갖고 있었죠.
- 97. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
그런 전 종성 님의 이 글을 보고
깊은 감명을 받았어요.
- 98. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
외래어 표기법이 자동화되면
당장 저에게도 도움될 것 같았고
- 99. 정기적으로 회의를 열어 용례를 정하는 것으
로는 한계가 있다. 외래어 표기 심의 방식이
자동화되어 한글로 표기하고 싶은 외국어를
입력하자마자 한글 표기가 나와야 한다.
http://iceager.egloos.com/2610028
그걸 만드는 과정도
굉장히 재밌어 보였죠.
- 105. >>> from hangulize import *
>>> hangulize(u'Cappuccino', 'ita')
u'카푸치노'
옛 한글라이즈
이런 식으로 파이썬 환경에서 쓸 수 있는
"hangulize" 라이브러리를 만들었습니다.
- 106. >>> from hangulize import *
>>> hangulize(u'Cappuccino', 'ita')
u'카푸치노'
옛 한글라이즈
이 파이썬 구현을
"옛 한글라이즈"라고 부를게요.
- 109. 주로 번역가가 사용
이지민, 《그래도 번역가로 살겠다면》(2017)
이 웹 서비스가 번역가 분들에겐
소소한 도움을 주고 있는 것 같더라고요.
- 113. •주먹구구식 구현
•고치기 어려운 버그
•전사 규칙이 파이썬 코드
옛 한글라이즈 불만
특히 외래어 표기법 전사 규칙을
파이썬 코드로 쓰게 했던 점이 가장 후회됩니다.
- 121. lang:
id = "rus"
codes = "ru", "rus"
english = "Russian"
korean = "러시아어"
script = "cyrillic"
macros:
"@" = "<vowels>"
vars:
"cs" = "б", "в", "г"
전사 규칙 .hgl 파일
rewrite:
"град" -> "град-"
"^ль" -> "л-ь"
"ый" -> "ы"
transcribe:
"б" -> "ㅂ"
"л," -> "-ㄹ"
test:
"Ольга" -> "올가"
"Пётр" -> "표트르"
새로 구현하면서는 전사 규칙도 코드 대신
이런 텍스트파일로 정의할 수 있게 설계했는데
- 122. lang:
id = "rus"
codes = "ru", "rus"
english = "Russian"
korean = "러시아어"
script = "cyrillic"
macros:
"@" = "<vowels>"
vars:
"cs" = "б", "в", "г"
전사 규칙 .hgl 파일
rewrite:
"град" -> "град-"
"^ль" -> "л-ь"
"ый" -> "ы"
transcribe:
"б" -> "ㅂ"
"л," -> "-ㄹ"
test:
"Ольга" -> "올가"
"Пётр" -> "표트르"
정해진 틀 안에서 쓰다 보니
버그가 발생할 여지도 적고
- 123. lang:
id = "rus"
codes = "ru", "rus"
english = "Russian"
korean = "러시아어"
script = "cyrillic"
macros:
"@" = "<vowels>"
vars:
"cs" = "б", "в", "г"
전사 규칙 .hgl 파일
rewrite:
"град" -> "град-"
"^ль" -> "л-ь"
"ый" -> "ы"
transcribe:
"б" -> "ㅂ"
"л," -> "-ㄹ"
test:
"Ольга" -> "올가"
"Пётр" -> "표트르"
맞춤형 문법이라서
읽기도 훨씬 편해졌습니다.
- 124. H 형상, 로마자 i, 화살표, 한글ㅣ
옛 로고 새 로고
그리고 8년 만에
새 로고도 디자인했죠.
- 136. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
- 137. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
두 번째 Rewrite 단계에선
일련의 패턴 찾아 바꾸기로
- 138. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
앞에서 넘어온 "si chuan"을
"si, chwan,"로 바꿔줍니다.
- 139. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
이 단계의 용도는
소리글자의 표음성을 강화하는 것인데
- 146. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
따라서 소리글자라고 해도 실제 소리에
1:1 대응되는 경우는 별로 없는데
- 147. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
한글로 옮기려면 의미가 아닌
발음이 필요하니까
- 148. •패턴 찾아 바꾸기
•표음성 강화
2단계: Rewrite
Rewrite TranscribePhonemize
si chuan
"{s}i" -> "i,"
si, chuan
"{h}uan" -> "wan"
si, chwan
"n$" -> "n,"
si, chwan,
이 단계에서 철자로부터
발음을 최대한 유추합니다.
- 149. •한글 자모로 변환
•패턴 찾아 바꾸기
•외래어 표기법 구현
3단계: Transcribe
Rewrite TranscribePhonemize
si, chwan,
"wan,?" -> "ㅘ-ㄴ"
si, chㅘ-ㄴ
"i," -> "ㅡ"
sㅡ chㅘ-ㄴ
"ch" -> "ㅊ"
sㅡ ㅊㅘ-ㄴ
"s" -> "ㅆ"
ㅆㅡ ㅊㅘ-ㄴ
- 150. •한글 자모로 변환
•패턴 찾아 바꾸기
•외래어 표기법 구현
3단계: Transcribe
Rewrite TranscribePhonemize
si, chwan,
"wan,?" -> "ㅘ-ㄴ"
si, chㅘ-ㄴ
"i," -> "ㅡ"
sㅡ chㅘ-ㄴ
"ch" -> "ㅊ"
sㅡ ㅊㅘ-ㄴ
"s" -> "ㅆ"
ㅆㅡ ㅊㅘ-ㄴ
그렇게 구한 발음을
세 번째 Transcribe 단계에선
- 151. •한글 자모로 변환
•패턴 찾아 바꾸기
•외래어 표기법 구현
3단계: Transcribe
Rewrite TranscribePhonemize
si, chwan,
"wan,?" -> "ㅘ-ㄴ"
si, chㅘ-ㄴ
"i," -> "ㅡ"
sㅡ chㅘ-ㄴ
"ch" -> "ㅊ"
sㅡ ㅊㅘ-ㄴ
"s" -> "ㅆ"
ㅆㅡ ㅊㅘ-ㄴ
대응되는 한글 자모로 바꿔줍니다.
- 152. •한글 자모로 변환
•패턴 찾아 바꾸기
•외래어 표기법 구현
3단계: Transcribe
Rewrite TranscribePhonemize
si, chwan,
"wan,?" -> "ㅘ-ㄴ"
si, chㅘ-ㄴ
"i," -> "ㅡ"
sㅡ chㅘ-ㄴ
"ch" -> "ㅊ"
sㅡ ㅊㅘ-ㄴ
"s" -> "ㅆ"
ㅆㅡ ㅊㅘ-ㄴ
여기가 외래어 표기법이
실제로 구현되는 단계죠.
- 153. •한글 자모로 변환
•패턴 찾아 바꾸기
•외래어 표기법 구현
3단계: Transcribe
Rewrite TranscribePhonemize
si, chwan,
"wan,?" -> "ㅘ-ㄴ"
si, chㅘ-ㄴ
"i," -> "ㅡ"
sㅡ chㅘ-ㄴ
"ch" -> "ㅊ"
sㅡ ㅊㅘ-ㄴ
"s" -> "ㅆ"
ㅆㅡ ㅊㅘ-ㄴ
Transcribe 단계도 Rewrite 단계와 마찬가지로
일련의 패턴 찾아 바꾸기로 이뤄져 있습니다.
- 159. • though ▶
• through ▶
• rough ▶
• cough ▶
• thought ▶
• bough ▶
영어의 낮은 표음성
예를 들어 "ough"는 이렇게나
다양한 발음을 갖고 있지만
- 160. • though ▶
• through ▶
• rough ▶
• cough ▶
• thought ▶
• bough ▶
영어의 낮은 표음성
철자 규칙만으로 발음을 정확하게
유추하는 건 불가능하다고 합니다.
- 167. 초보 주의
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
저
고랭코리아
우선 들어가기 전에 앞에서 말씀드렸듯이
전 Go를 취미로만 써봤거든요.
- 168. 초보 주의
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
저
고랭코리아
큰 코드베이스에서 남들과 협업해보거나
실무에서 제대로 써본 적이 아직 없습니다.
- 169. 초보 주의
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
저
고랭코리아
그래서 너무 당연한 얘기를 하거나
틀린 얘기를 할 수도 있는데
- 170. 초보 주의
진지한 장난감 협업장난감옹알이
실무 리뷰 구루
저
고랭코리아
그럴 경우 부담 없이 sub@subl.ee로
제보해주시면 감사하겠습니다.
- 190. 쓸 만 하다.
더 잘 하고 싶다.
이런저런 간단한 장난감을 만들면서 Go를 써보니
꽤 쓸 만 하고 재미있다는 인상을 받았습니다.
- 191. 쓸 만 하다.
더 잘 하고 싶다.
Go 특유의 간결함이
이제 명료함으로 느껴지더라고요.
- 192. 쓸 만 하다.
더 잘 하고 싶다.
몇 십 줄 짜리 간단한 장난감에서 벗어나
좀 더 진지한 걸 만들어보면서
- 193. 쓸 만 하다.
더 잘 하고 싶다.
Go를 더 잘 다루고 싶다고
생각하게 됐습니다.
- 197. •주먹구구식 구현
•고치기 어려운 버그
•전사 규칙이 파이썬 코드
옛 한글라이즈 불만
앞에서 말씀드렸듯이 기존 한글라이즈에서
맘에 들지 않는 구석도 많았고
- 198. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
또 한글라이즈가 저에겐 새로운 언어를 익힐 때
연습과제로 삼기 꽤 좋은 프로젝트거든요.
- 199. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
이미 한 번 만들어봐서
불확실성은 별로 없는데
- 200. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
적당히 복잡하면서
상당히 계산 중심적이다 보니
- 201. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
구조나 알고리즘에 대한 고민도
다시 한 번 해보게 되고
- 202. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
그 언어가 유니코드와 정규표현식을
어떻게 다루는지 깊게 겪어볼 수도 있고
- 203. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
또 이미 만들어둔 테스트케이스가 많아서
제대로 짰는지 검증할 재료도 충분하죠.
- 204. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
마지막으로 제가
덕질할 수 있는 주제여서
- 205. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
몇 달 정도는 지긋이 해볼 수 있는
과제이기도 합니다.
- 206. • 이미 한 번 만들어 봄
• 적당한 복잡성
• 계산 중심적
•유니코드/정규표현식
•풍부한 테스트케이스
•언어학 덕질
연습과제: 한글라이즈
그렇게 파이썬으로 만들었던 한글라이즈를
Go로 다시 만들게 됐습니다.
- 209. a. 정규표현식
b. 말과 글
c. 테스트와 문서화
좀 두서 없을 수도 있는데 정규표현식, 말과 글,
테스트와 문서화에 대해 다룰 거예요.
- 215. •안전한 정규표현식 구현
•문자열 길이에 대해 선형 시간
•고의적으로 일부 기능 미지원
RE2
by Google
구글에서 만든 정규식 엔진인
RE2를 기반으로 하고 있습니다.
- 216. •안전한 정규표현식 구현
•문자열 길이에 대해 선형 시간
•고의적으로 일부 기능 미지원
RE2
by Google
RE2는 평균적으로 가장 빠른
정규식 엔진은 아니더라도
- 217. •안전한 정규표현식 구현
•문자열 길이에 대해 선형 시간
•고의적으로 일부 기능 미지원
RE2
by Google
대상 문자열 길이에 정비례하는 선형 시간을
보장하는 걸 목표로 삼는다고 합니다.
- 218. •안전한 정규표현식 구현
•문자열 길이에 대해 선형 시간
•고의적으로 일부 기능 미지원
RE2
by Google
그래서 선형 시간에 구현할 수 없는 정규식의
일부 고급 기능은 고의적으로 지원하지 않죠.
- 222. O( n)
RE2 성능 보장
대상 문자열 길이
보통 상수항
정규식 패턴은 코드에 미리
적어 두는 경우가 대부분이다 보니
- 223. O( n)
RE2 성능 보장
대상 문자열 길이
보통 상수항
사실상 m을 상수항으로 취급해도 좋습니다.
상당히 훌륭하죠.
- 233. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
벤치마크는 패턴과 문자열의
길이를 바꿔가며 진행할 텐데
- 234. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
이런 식으로 /a?/와 /a/를
x개만큼 반복하는 패턴과
- 235. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
x개의 "a"로 이뤄진
대상 문자열을 가지고
- 236. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
x를 늘려가면서
속도를 비교해볼 겁니다.
- 237. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
저는 파이썬의 정규식
표준 라이브러리 "re"와
- 238. f(1) = /a?a/를 "a"에 매치
f(3) = /a?a?a?aaa/를 "aaa"에 매치
f(5) = /a?a?a?a?a?aaaaa/를 "aaaaa"에 매치
f(x) = /a?ˣaˣ/를 "aˣ"에 매치
벤치마크
Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
Go의 정규식 표준 라이브러리 "regexp"
두 가지로 직접 돌려봤어요.
- 246. /a?ˣaˣ/를 "aˣ"에 매치
파이썬 re Go regexp
f(10) 39.7㎲ 1.8㎲
f(15) 1.3㎳ 3.8㎲
f(20) 47.2㎳ 6.6㎲
f(25) 1.7초 9.7㎲
f(30) 61.8초 13.9㎲
f(50) 676일(예상) 38.5㎲
제가 돌려본 벤치마크 환경에선
x가 50일 때 Go 쪽은 38.5㎲면 끝나지만
- 247. /a?ˣaˣ/를 "aˣ"에 매치
파이썬 re Go regexp
f(10) 39.7㎲ 1.8㎲
f(15) 1.3㎳ 3.8㎲
f(20) 47.2㎳ 6.6㎲
f(25) 1.7초 9.7㎲
f(30) 61.8초 13.9㎲
f(50) 676일(예상) 38.5㎲
파이썬 쪽은 1년 9개월이나
걸릴 것으로 예상되더라고요.
- 249. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
앞서 정규식 엔진엔 몇 가지
알고리즘이 있다고 말씀드렸는데
- 250. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
크게 Spencer 류와 Thompson 류로
나눌 수 있을 것 같습니다.
- 251. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
파이썬 re는 Spencer 류에 속하고
RE2와 Go regexp는 Thompson 류에 속하죠.
- 252. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
앞에서 돌렸던 벤치마크의 경우
Spencer 류 엔진에선 지수 시간이 걸리지만
- 253. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
Thompson 류 엔진에선
제곱 시간밖에 걸리지 않습니다.
- 254. Spencer 류
펄, PCRE, 파이썬, 루비, 자바
Thompson 류
awk, sed, grep, RE2, Go, 러스트
왜 이런 차이가 생기는지
x=3일 때를 예로 들어서 살펴볼게요.
- 262. Spencer 류
"aaa"a? a? a? aaa
a? aaa
aaa
aaa
a?가 있다고 가정
a?가 없다고 가정
한 단계 더 물러나서 이번엔
두 번째 /a?/가 없다고 가정해요.
- 263. Spencer 류
"aaa"a? a? a? aaa
a? aaa
aaa
aaa
a?가 있다고 가정
a?가 없다고 가정
그 상태에서 앞에서와 같이
세 번째 분기도 다시 탐색합니다.
- 264. Spencer 류
"aaa"a? a? a? aaa
a? aaa
aaa
aaa
a?가 있다고 가정
a?가 없다고 가정
새로운 두 가지 길이 있지만
이번에도 모두 틀린 길이죠.
- 265. Spencer 류
"aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
a?가 있다고 가정
a?가 없다고 가정 aaa
이젠 첫 번째 /a?/도 없다고 가정하고
그동안 탐색했던 길만큼 다시 탐색합니다.
- 266. Spencer 류
"aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
a?가 있다고 가정
a?가 없다고 가정 aaa 매치!
마지막 길까지 살펴보면 마침내
패턴이 매치된단 걸 알 수 있습니다.
- 267. a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
퇴각검색
(backtracking)
이런 식으로 일단 길 하나를 쭉 파보고
틀렸으면 퇴각한 다음
- 268. a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
퇴각검색
(backtracking)
다른 길로 다시 파보는 방식을
"퇴각검색"이라고 하는데
- 269. a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
퇴각검색
(backtracking)
Spencer 류 정규식 엔진은
분기를 퇴각검색으로 구현합니다.
- 275. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
세 번째 "a"에서도
같은 일을 반복합니다.
- 276. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
매치!
그러면 패턴 끝까지 도달한
가능성이 하나 나타나는데
- 277. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
매치!
바로 매치를 찾은 것이죠.
- 278. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
매치!
퇴각검색 방식을 쓰는
Spencer 류에서와 달리
- 279. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
매치!
Thompson 류에서 대상 문자열의 각 글자는
단 한 번씩만 읽히는데
- 280. Thompson 류
"aaa"
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
매치!
즉, 되돌아가는 일 없이
전진만 하는 것입니다.
- 281. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
- 282. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
이 벤치마크에서 Spencer 류가
탐색하는 가능성은 2ˣ개인데 반해
- 283. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
Thompson 류는
x+1개만 탐색합니다.
- 284. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
그래서 Spencer 류의 탐색 횟수는
지수적으로 증가하고
- 285. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
Thompson 류의 탐색 횟수는
선형적으로 증가하죠.
- 286. Spencer 류 Thompson 류
"aaa" "aaa"a? a? a? aaa
a? a? aaa
a? aaa
a? aaa
aaa
aaa
aaa
aaa
2ˣ a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
a?a?a?aaa a?a?a?aaa a?a?a?aaa
첫 번째 a 두 번째 a 세 번째 a
x+1
이 때문에 특정한 경우에 둘 사이에서
극단적인 성능차이를 볼 수 있습니다.
- 288. •평균적으론 충분히 빠르고
•표현력이 더 좋아요.
•펄, PCRE, 파이썬, 루비, 자바
Spencer 류
하지만 일반적인 경우 Spencer 류 정규식 엔진도
충분히 빠르게 동작해요.
- 289. •평균적으론 충분히 빠르고
•표현력이 더 좋아요.
•펄, PCRE, 파이썬, 루비, 자바
Spencer 류
패턴만 안전하게 짜면 Thompson 류만큼
안정적으로 쓸 수 있죠.
- 290. •평균적으론 충분히 빠르고
•표현력이 더 좋아요.
•펄, PCRE, 파이썬, 루비, 자바
Spencer 류
그리고 정규식 기능 중엔
퇴각검색으로만 구현할 수 있는 것도 있어서