Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

한글라이즈 재제작기

948 views

Published on

스피커덱에서 더 편하게 보실 수 있습니다: https://subl.ee/~gokr1808

https://hangulize.org/

〈한글라이즈〉는 외국어 단어를 외래어 표기법에 따라 한글로 옮겨 적어주는 도구입니다. "Espresso"를 "에스프레소"로, "東京"을 "도쿄"로 변환할 수 있죠. 본래 Python으로 구현했던 한글라이즈를 Go로 재구현하면서 겪은 경험과 느낀점을 공유합니다.

고랭코리아 2018년 8월 밋업에서 발표했습니다.

슬라이드셰어에 슬라이드 300장 제한이 있어서 부득이하게 2부로 나눠서 올렸습니다. 보는 데 불편하시겠지만 양해를 부탁드립니다.

- 1부: https://subl.ee/~gokr1808
- 2부: https://subl.ee/~gokr1808.2

Published in: Software
  • Be the first to comment

한글라이즈 재제작기

  1. 1. 이흥섭 2018년 8월 고랭코리아 밋업 재제작기
  2. 2. 이흥섭 2018년 8월 고랭코리아 밋업 재제작기 안녕하세요.
  3. 3. 이흥섭 2018년 8월 고랭코리아 밋업 재제작기 2018년 8월 고랭코리아 밋업에서 〈한글라이즈 재제작기〉를 발표하는
  4. 4. 이흥섭 sublee 이흥섭이라고 합니다. 반갑습니다.
  5. 5. •야생의 땅: 듀랑고 •카트라이더 코인러시 •카트라이더 대시 넥슨 왓 스튜디오 서버아키텍트 저는 넥슨 왓 스튜디오에서 서버아키텍트를 맡고 있고
  6. 6. •야생의 땅: 듀랑고 •카트라이더 코인러시 •카트라이더 대시 넥슨 왓 스튜디오 서버아키텍트 얼마 전 〈야생의 땅: 듀랑고〉를 출시했습니다.
  7. 7. •what-studio/profiling •sublee/trueskill •what-studio/tossi •hangulize/hangulize 오픈소스 2744 385 110 53 개수는 2018년 9월 6일 기준
  8. 8. •what-studio/profiling •sublee/trueskill •what-studio/tossi •hangulize/hangulize 오픈소스 2744 385 110 53 개수는 2018년 9월 6일 기준 한편으론 틈틈이 오픈소스 활동도 하고 있어요.
  9. 9. •what-studio/profiling •sublee/trueskill •what-studio/tossi •hangulize/hangulize 오픈소스 2744 385 110 53 개수는 2018년 9월 6일 기준 제가 주축이 된 오픈소스 프로젝트 중에 별이 많은 것만 한 번 추려봤는데
  10. 10. •what-studio/profiling •sublee/trueskill •what-studio/tossi •hangulize/hangulize 오픈소스 2744 385 110 53 개수는 2018년 9월 6일 기준 이 중에선 가장 별이 적은 〈한글라이즈〉가 오늘 발표의 주제입니다.
  11. 11. Go 코딩 진지한 장난감 협업장난감옹알이 실무 리뷰 구루
  12. 12. Go 코딩 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 우리가 새로운 언어를 습득해 나갈 때 아마 이런 과정을 거치게 될 것 같은데
  13. 13. Go 코딩 협업장난감옹알이 실무 리뷰 구루 고랭코리아 진지한 장난감 Go 언어의 경우 고랭코리아 여러분은 대부분 이쯤에 계실 것 같습니다.
  14. 14. Go 코딩 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 반면 저는 여기 쯤에 있어요.
  15. 15. Go 코딩 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 Go 코딩은 매일 하고 있지만 아직 본격적으로 실무에 써보진 못 했습니다.
  16. 16. Go 코딩 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 한글라이즈도 제 본업과는 전혀 무관하게
  17. 17. 지난 3개월 일과 후 취미코딩 지난 3개월동안 매진했던 일과 후 취미코딩이었어요.
  18. 18. 지난 3개월 일과 후 취미코딩 그러다보니 아마 이 발표에서 제가 여러분에게
  19. 19. 지난 3개월 일과 후 취미코딩 Go에 대한 새로운 지식을 전해 드리진 못 할 것 같은데
  20. 20. 지난 3개월 일과 후 취미코딩 그래도 취미로 익히면서 재밌었던 점을 소개해보려고 합니다.
  21. 21. 지난 3개월 일과 후 취미코딩 학예회 보듯이 재밌게 봐주시면 감사하겠습니다.
  22. 22. 1. 한글라이즈 2. Go 3. 이룬 것 차례
  23. 23. 1. 한글라이즈 2. Go 3. 이룬 것 차례 우선 오늘 발표의 내용은 이렇습니다.
  24. 24. 1. 한글라이즈 2. Go 3. 이룬 것 차례 제가 만들고 있는 한글라이즈에 대해 소개하고
  25. 25. 1. 한글라이즈 2. Go 3. 이룬 것 차례 한글라이즈를 Go로 만들면서 느낀 흥미로웠던 점에 대해서 말씀드릴게요.
  26. 26. 1. 한글라이즈 2. Go 3. 이룬 것 차례 그리고 발표 제목에 "재제작기"라고 적었듯이
  27. 27. 1. 한글라이즈 2. Go 3. 이룬 것 차례 8년 전에 파이썬으로 만들었던 한글라이즈를 이번에 Go로 다시 구현한 것이거든요.
  28. 28. 1. 한글라이즈 2. Go 3. 이룬 것 차례 예전과 비교해서 어떤 성과를 이뤘는지 보여드리겠습니다.
  29. 29. 1. 한글라이즈 그럼 지금부터 한글라이즈가 무엇이고 이 프로젝트가 어떻게 시작됐는지
  30. 30. 1. 한글라이즈 그리고 어떤 원리로 돌아가는지 소개해드릴게요.
  31. 31. 외국어 단어를 한글로 옮겨 적는 도구 한글라이즈
  32. 32. 외국어 단어를 한글로 옮겨 적는 도구 한글라이즈 한글라이즈는 외국어 단어를 한글로 옮겨 적어주는 도구예요.
  33. 33. 말소리를 음성 문자로 옮겨 적음.다음사전 의미를 옮기는 번역(translation)과는 달라요. 전사(transcription) 좀 더 정확히는 "전사"라고 부르는데
  34. 34. 말소리를 음성 문자로 옮겨 적음.다음사전 의미를 옮기는 번역(translation)과는 달라요. 전사(transcription) 다음사전에서 찾아보면 말소리를 음성 문자로 옮겨 적는 걸 뜻한다고 합니다.
  35. 35. 말소리를 음성 문자로 옮겨 적음.다음사전 의미를 옮기는 번역(translation)과는 달라요. 전사(transcription) 한글라이즈의 역할은 외국어 단어의 의미를 해석해서
  36. 36. 말소리를 음성 문자로 옮겨 적음.다음사전 의미를 옮기는 번역(translation)과는 달라요. 전사(transcription) 우리말로 번역하는 게 아니라 발음만 한글로 표기하는 것이죠.
  37. 37. Go▶ 고(전사) ▶ 가(번역) 영어 단어 "Go"를 예로 들면
  38. 38. Go▶ 고(전사) ▶ 가(번역) 발음 그대로 "고"로 옮기는 건 전사고
  39. 39. Go▶ 고(전사) ▶ 가(번역) 의미를 살려 우리말 "가"로 옮기는 건 번역입니다.
  40. 40. PlayOverwatch Lúcio ▶ 루시우 花村 ▶ 하나무라 인명 지명 Overwatch Wiki
  41. 41. PlayOverwatch Lúcio ▶ 루시우 花村 ▶ 하나무라 인명 지명 Overwatch Wiki 전사는 인명이나 지명같은 고유명사나 외래어를 우리말로 옮길 때 필요합니다.
  42. 42. PlayOverwatch Lúcio ▶ 루시우 花村 ▶ 하나무라 인명 지명 Overwatch Wiki 지명인 "하나무라"를 굳이 "꽃 마을"이라고 뜻을 번역해서 옮기지는 않겠죠.
  43. 43. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 이렇게 외래어를 한글로 전사할 때 우리는
  44. 44. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 귀에 들리는 대로 주먹구구식으로 옮기는 대신
  45. 45. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 국립국어원에서 정한 "외래어 표기법"을 따라야 합니다.
  46. 46. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 코딩할 때 따르는 네이밍 컨벤션과 비슷하다고 보면 될 것 같아요.
  47. 47. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 모두가 외래어 표기법을 잘 따르는 건 아니지만
  48. 48. 국립국어원이 정한 외래어 네이밍 컨벤션 외래어 표기법 그래도 이게 있는 덕분에 외래어의 한글표기가 일관성을 어느정도 지켜갈 수 있는 거죠.
  49. 49. Cappuccino이탈리아어 ▶ 몇 가지 예시를 들어볼게요.
  50. 50. Cappuccino이탈리아어 ▶ 익숙한 이탈리아어 단어인 "Cappuccino"입니다.
  51. 51. Cappuccino이탈리아어 ▶ 캡푸씨노…? 어쩌면 "캡푸씨노"라고 옮겨도 말이 될 것 같은데
  52. 52. Cappuccino이탈리아어 ▶ 카푸치노 우린 외래어 표기법에 따라서 이 단어를 "카푸치노"라고 옮깁니다.
  53. 53. Cappuccino이탈리아어 ▶ 카푸치노 "티라미수", "누텔라", "브로콜리"같이 이탈리아어에서 온 외래어는
  54. 54. Cappuccino이탈리아어 ▶ 카푸치노 대체로 외래어 표기법을 잘 따르는 것 같습니다.
  55. 55. 宮本茂일본어 ▶ 이번엔 일본어입니다. 일본 사람 이름이에요.
  56. 56. 宮本茂일본어 ▶ 궁본무…? 아마 한자를 잘 안다면 우리말 한자음을 따서 "궁본무"라고 옮길 수도 있을 것 같아요.
  57. 57. 宮本茂일본어 ▶ 미야모토 시게루 이 이름을 표기법대로 옮기면 "미야모토 시게루"가 되는데
  58. 58. 宮本茂일본어 ▶ 미야모토 시게루 우리말 한자음이 아닌 일본어 한자음을 따른 겁니다.
  59. 59. 宮本茂일본어 ▶ 미야모토 시게루 〈슈퍼마리오〉를 만든 분으로 게임 업계에서 전설적인 분의 이름이죠.
  60. 60. Χίος그리스어 ▶ 이건 그리스에 있는 한 섬의 이름이에요. "Xioc"처럼 생기긴 했는데
  61. 61. Χίος그리스어 ▶ 히오스 "히오스"라고 옮깁니다.
  62. 62. ピカチュウ일본어 ▶ 피카츄 때론 표기법대로 쓰는 게 불편할 수도 있어요. 일본어 이름인 "피카츄"의 경우
  63. 63. ピカチュウ일본어 ▶ 피카추 외래어 표기법에 따르면 "츄"가 아닌 "추"로 표기해야 합니다.
  64. 64. •ピカチュウ ▶ 피카츄 •靑島 ▶ 칭따오 •Chevrolet ▶ 쉐보레 어디까지나 권고사항 피카추 칭다오 셰브럴레이 하지만 외래어 표기법은 어디까지나 권고사항일 뿐이라서
  65. 65. •ピカチュウ ▶ 피카츄 •靑島 ▶ 칭따오 •Chevrolet ▶ 쉐보레 어디까지나 권고사항 피카추 칭다오 셰브럴레이 이미 다른 표기가 널리 퍼져 있는 브랜드라면 국립국어원에서도 그쪽의 손을 들어주고 있습니다.
  66. 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. 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. 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. 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. 70. •정기적으로 각 외래어의 한글 표기 결정 •언론에 보도되는 이름 중심 정부·언론 외래어 심의 공동위원회 그래서 바른 말 쓰기를 특히 중요하게 여기는 정부와 언론 쪽에선
  71. 71. •정기적으로 각 외래어의 한글 표기 결정 •언론에 보도되는 이름 중심 정부·언론 외래어 심의 공동위원회 외래어 표기법이 잘 지켜지고 있는지 평가하고
  72. 72. •정기적으로 각 외래어의 한글 표기 결정 •언론에 보도되는 이름 중심 정부·언론 외래어 심의 공동위원회 정기적으로 공식 외래어 표기를 발표하는 위원회를 두고 있어요.
  73. 73. •정기적으로 각 외래어의 한글 표기 결정 •언론에 보도되는 이름 중심 정부·언론 외래어 심의 공동위원회 "정부·언론 외래어 심의 공동위원회"라는 곳인데 코드리뷰어 집단이라고 생각하면 될 것 같습니다.
  74. 74. 제92차 정부·언론외래어심의공동위원회 심의 결정안 (인명 52건, 일반용어 1건-재심의 2건) • 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아 여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자 인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을 강조하는 디자인으로 유명함. • 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA) 회장(1974~1998). 브라질 인. • 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사. 일본 간사이(關西)학원 원장(2007. 4.~ ).
  75. 75. 제92차 정부·언론외래어심의공동위원회 심의 결정안 (인명 52건, 일반용어 1건-재심의 2건) • 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아 여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자 인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을 강조하는 디자인으로 유명함. • 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA) 회장(1974~1998). 브라질 인. • 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사. 일본 간사이(關西)학원 원장(2007. 4.~ ). 이건 외래어 심의위가 발표한 표기 심의 결정안 중 하나인데
  76. 76. 제92차 정부·언론외래어심의공동위원회 심의 결정안 (인명 52건, 일반용어 1건-재심의 2건) • 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아 여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자 인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을 강조하는 디자인으로 유명함. • 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA) 회장(1974~1998). 브라질 인. • 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사. 일본 간사이(關西)학원 원장(2007. 4.~ ). 아버라, 암살러 그루블 심의위에서도 드물게 틀리는 경우가 있습니다.
  77. 77. 제92차 정부·언론외래어심의공동위원회 심의 결정안 (인명 52건, 일반용어 1건-재심의 2건) • 아베라, 암살라 Amsale Aberra 1954(?1953)~ 에티오피아 여성 기업가·디자이너. 암살라(Amsale) 그룹 대표 겸 디자 인 총책임자. 유행을 좇지 않으면서 세련된 클래식 모던을 강조하는 디자인으로 유명함. • 아벨란제, 주앙 João Havelange 1916~ 국제축구연맹(FIFA) 회장(1974~1998). 브라질 인. • 그루벨, 루스 Ruth M. Grubel 1950~ 미국 교육가·선교사. 일본 간사이(關西)학원 원장(2007. 4.~ ). 아버라, 암살러 그루블 원 단어의 발음을 잘못 유추하는 바람에 표기를 잘못 정하는 경우가 종종 있다고 해요.
  78. 78. •세계의 말과 글 •끝소리 박종성 @iceager
  79. 79. •세계의 말과 글 •끝소리 박종성 @iceager 한편 예전부터 외래어 표기법에 큰 관심을 보인 분이 있는데
  80. 80. •세계의 말과 글 •끝소리 박종성 @iceager 바로 박종성 님입니다.
  81. 81. •세계의 말과 글 •끝소리 박종성 @iceager 종성 님은 "세계의 말과 글"이라는 블로그와 "끝소리"라는 페이스북 페이지에서
  82. 82. •세계의 말과 글 •끝소리 박종성 @iceager 외래어 표기법이나 여러가지 언어에 대한 글을 연재하고 계세요.
  83. 83. •세계의 말과 글 •끝소리 박종성 @iceager 연재하는 글이 굉장히 깊고 재밌으니
  84. 84. •세계의 말과 글 •끝소리 박종성 @iceager 혹시 이 발표가 흥미롭다면 한 번 들어가 보길 추천해드립니다.
  85. 85. •세계의 말과 글 •끝소리 외래어 심의 위원 박종성 @iceager 종성 님은 작년부터는 글 연재 이외에
  86. 86. •세계의 말과 글 •끝소리 외래어 심의 위원 박종성 @iceager 외래어 심의위 위원으로도 활동하고 계십니다.
  87. 87. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028
  88. 88. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 8년 전, 종성 님은 블로그에 이런 글을 쓰셨어요.
  89. 89. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 정기적으로 회의를 열어 용례를 정하는 것으로는 한계가 있다.
  90. 90. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 외래어 표기 심의 방식이 자동화되어
  91. 91. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다.
  92. 92. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005) 잠깐 샛길로 빠지면, 제가 대학교 다닐 때 제일 좋아했던 강의는 〈언어학 개론〉이었거든요.
  93. 93. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005) 언어학은 사람이 구사하는 언어를 연구하는 과학분야인데
  94. 94. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005) 학생 절반이 수능시험의 언어영역 생각하고 들어왔다가
  95. 95. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005) 첫 강의만 듣고 대거 취소했던 강의이긴 하지만 저에겐 인생 강의였습니다.
  96. 96. 강범모, 《언어: 풀어 쓴 언어학 개론》(2005) 언어학을 전공한 건 아니더라도 늘 덕심을 갖고 있었죠.
  97. 97. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 그런 전 종성 님의 이 글을 보고 깊은 감명을 받았어요.
  98. 98. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 외래어 표기법이 자동화되면 당장 저에게도 도움될 것 같았고
  99. 99. 정기적으로 회의를 열어 용례를 정하는 것으 로는 한계가 있다. 외래어 표기 심의 방식이 자동화되어 한글로 표기하고 싶은 외국어를 입력하자마자 한글 표기가 나와야 한다. http://iceager.egloos.com/2610028 그걸 만드는 과정도 굉장히 재밌어 보였죠.
  100. 100. 그래서 덥석 물었습니다.
  101. 101. 아쉽게도 비공개 덧글이고 암호도 잊어서 뭐라고 썼었는진 모르겠지만
  102. 102. 그렇게 종성 님과 둘이서 외래어 표기법을 자동화하기 시작했어요.
  103. 103. 파이썬
  104. 104. 파이썬 당시엔 한창 파이썬을 익히는 중이어서 파이썬으로 개발했고
  105. 105. >>> from hangulize import * >>> hangulize(u'Cappuccino', 'ita') u'카푸치노' 옛 한글라이즈 이런 식으로 파이썬 환경에서 쓸 수 있는 "hangulize" 라이브러리를 만들었습니다.
  106. 106. >>> from hangulize import * >>> hangulize(u'Cappuccino', 'ita') u'카푸치노' 옛 한글라이즈 이 파이썬 구현을 "옛 한글라이즈"라고 부를게요.
  107. 107. https://hangulize.org/ 꼭 프로그래머가 아니더라도 누구나 쉽게 쓸 수 있도록
  108. 108. https://hangulize.org/ "hangulize.org" 웹 서비스도 운영해왔는데
  109. 109. 주로 번역가가 사용 이지민, 《그래도 번역가로 살겠다면》(2017) 이 웹 서비스가 번역가 분들에겐 소소한 도움을 주고 있는 것 같더라고요.
  110. 110. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 하지만 제가 어렸을 때 만든 것이다 보니
  111. 111. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 지금 보면 맘에 들지 않는 부분도 몇 가지 있는데
  112. 112. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 주먹구구식 구현으로 고치기 어려운 버그를 만든 것도 문제지만
  113. 113. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 특히 외래어 표기법 전사 규칙을 파이썬 코드로 쓰게 했던 점이 가장 후회됩니다.
  114. 114. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 프로그래머가 아니면 진입장벽도 높고 버그를 야기할 여지도 많아서
  115. 115. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 새 표기법을 구현할 때 생산성이 그리 좋지 않았던 것 같아요.
  116. 116. 옛 한글라이즈 2010-2018 이런 후회를 뒤로 하고 옛 한글라이즈는 얼마 전에 공식적으로 폐쇄했습니다.
  117. 117. Go Go로 완전히 새로 구현했죠.
  118. 118. gore> :import "github.com/hangulize/hangulize" gore> hangulize.Hangulize("rus", "Владивосто́к") "블라디보스토크" 새 한글라이즈 2018년 5월-
  119. 119. gore> :import "github.com/hangulize/hangulize" gore> hangulize.Hangulize("rus", "Владивосто́к") "블라디보스토크" 새 한글라이즈 2018년 5월- "새 한글라이즈"는 8년 만인 지난 5월부터 만들었어요.
  120. 120. gore> :import "github.com/hangulize/hangulize" gore> hangulize.Hangulize("rus", "Владивосто́к") "블라디보스토크" 새 한글라이즈 2018년 5월- 옛 한글라이즈처럼 Go 환경에서 쓸 수 있는 간단한 라이브러리죠.
  121. 121. lang: id = "rus" codes = "ru", "rus" english = "Russian" korean = "러시아어" script = "cyrillic" macros: "@" = "<vowels>" vars: "cs" = "б", "в", "г" 전사 규칙 .hgl 파일 rewrite: "град" -> "град-" "^ль" -> "л-ь" "ый" -> "ы" transcribe: "б" -> "ㅂ" "л," -> "-ㄹ" test: "Ольга" -> "올가" "Пётр" -> "표트르" 새로 구현하면서는 전사 규칙도 코드 대신 이런 텍스트파일로 정의할 수 있게 설계했는데
  122. 122. lang: id = "rus" codes = "ru", "rus" english = "Russian" korean = "러시아어" script = "cyrillic" macros: "@" = "<vowels>" vars: "cs" = "б", "в", "г" 전사 규칙 .hgl 파일 rewrite: "град" -> "град-" "^ль" -> "л-ь" "ый" -> "ы" transcribe: "б" -> "ㅂ" "л," -> "-ㄹ" test: "Ольга" -> "올가" "Пётр" -> "표트르" 정해진 틀 안에서 쓰다 보니 버그가 발생할 여지도 적고
  123. 123. lang: id = "rus" codes = "ru", "rus" english = "Russian" korean = "러시아어" script = "cyrillic" macros: "@" = "<vowels>" vars: "cs" = "б", "в", "г" 전사 규칙 .hgl 파일 rewrite: "град" -> "град-" "^ль" -> "л-ь" "ый" -> "ы" transcribe: "б" -> "ㅂ" "л," -> "-ㄹ" test: "Ольга" -> "올가" "Пётр" -> "표트르" 맞춤형 문법이라서 읽기도 훨씬 편해졌습니다.
  124. 124. H 형상, 로마자 i, 화살표, 한글ㅣ 옛 로고 새 로고 그리고 8년 만에 새 로고도 디자인했죠.
  125. 125. 四川 쓰촨
  126. 126. 四川 쓰촨 이번엔 한글라이즈의 원리를 살펴보기 위해 중국 지명인 "쓰촨"을 예로 들어보겠습니다.
  127. 127. Rewrite TranscribePhonemize四川 쓰촨 한글라이즈 파이프라인 한글라이즈에 한자 "四川"이 입력되면
  128. 128. Rewrite TranscribePhonemize四川 쓰촨 한글라이즈 파이프라인 일련의 파이프라인을 통과해 최종적으로 "쓰촨"이 되죠.
  129. 129. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 파이프라인의 첫 단계는 Phonemize 단계인데
  130. 130. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 여기선 뜻글자를 소리글자로 바꾸는 작업을 합니다.
  131. 131. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 한자 "四川"의 경우 중국어 병음 "si chuan"으로 바뀌죠.
  132. 132. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan Phonemize 단계가 모든 언어에서 필요한 건 아니지만
  133. 133. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 중국어나 일본어처럼 뜻글자를 쓰는 경우엔 이 단계를 거쳐야만 한글로 옮길 수 있습니다.
  134. 134. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 이때 방대한 발음 사전이나 형태소 분석 같은 기능이 필요한데
  135. 135. •뜻글자를 소리글자로 •사전 •형태소 분석 1단계: Phonemize Rewrite TranscribePhonemize 四川 si chuan 여기에 어떤 라이브러리를 썼는지는 뒤에서 다시 소개하겠습니다.
  136. 136. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan,
  137. 137. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan, 두 번째 Rewrite 단계에선 일련의 패턴 찾아 바꾸기로
  138. 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. 139. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan, 이 단계의 용도는 소리글자의 표음성을 강화하는 것인데
  140. 140. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 여기서 "표음성"이란
  141. 141. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 소리글자가 실제 소리에 대응되는 정도를 뜻합니다.
  142. 142. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 한글도 왼쪽처럼 소리나는 대로만 적으면 표음성은 극대화되지만
  143. 143. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 한 눈에 의미를 파악하긴 더 어렵죠.
  144. 144. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 그래서 철자법에선 오른쪽처럼 표음성을 희생하고
  145. 145. 표음성 신도림행 열차 지옥행 급행열차 표음성 극대화 형태학적 표기 신도리맹 녈차 지오캥 그팽녈차 대신 단어의 형태와 어원을 살리는 경우가 많습니다.
  146. 146. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan, 따라서 소리글자라고 해도 실제 소리에 1:1 대응되는 경우는 별로 없는데
  147. 147. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan, 한글로 옮기려면 의미가 아닌 발음이 필요하니까
  148. 148. •패턴 찾아 바꾸기 •표음성 강화 2단계: Rewrite Rewrite TranscribePhonemize si chuan "{s}i" -> "i," si, chuan "{h}uan" -> "wan" si, chwan "n$" -> "n," si, chwan, 이 단계에서 철자로부터 발음을 최대한 유추합니다.
  149. 149. •한글 자모로 변환 •패턴 찾아 바꾸기 •외래어 표기법 구현 3단계: Transcribe Rewrite TranscribePhonemize si, chwan, "wan,?" -> "ㅘ-ㄴ" si, chㅘ-ㄴ "i," -> "ㅡ" sㅡ chㅘ-ㄴ "ch" -> "ㅊ" sㅡ ㅊㅘ-ㄴ "s" -> "ㅆ" ㅆㅡ ㅊㅘ-ㄴ
  150. 150. •한글 자모로 변환 •패턴 찾아 바꾸기 •외래어 표기법 구현 3단계: Transcribe Rewrite TranscribePhonemize si, chwan, "wan,?" -> "ㅘ-ㄴ" si, chㅘ-ㄴ "i," -> "ㅡ" sㅡ chㅘ-ㄴ "ch" -> "ㅊ" sㅡ ㅊㅘ-ㄴ "s" -> "ㅆ" ㅆㅡ ㅊㅘ-ㄴ 그렇게 구한 발음을 세 번째 Transcribe 단계에선
  151. 151. •한글 자모로 변환 •패턴 찾아 바꾸기 •외래어 표기법 구현 3단계: Transcribe Rewrite TranscribePhonemize si, chwan, "wan,?" -> "ㅘ-ㄴ" si, chㅘ-ㄴ "i," -> "ㅡ" sㅡ chㅘ-ㄴ "ch" -> "ㅊ" sㅡ ㅊㅘ-ㄴ "s" -> "ㅆ" ㅆㅡ ㅊㅘ-ㄴ 대응되는 한글 자모로 바꿔줍니다.
  152. 152. •한글 자모로 변환 •패턴 찾아 바꾸기 •외래어 표기법 구현 3단계: Transcribe Rewrite TranscribePhonemize si, chwan, "wan,?" -> "ㅘ-ㄴ" si, chㅘ-ㄴ "i," -> "ㅡ" sㅡ chㅘ-ㄴ "ch" -> "ㅊ" sㅡ ㅊㅘ-ㄴ "s" -> "ㅆ" ㅆㅡ ㅊㅘ-ㄴ 여기가 외래어 표기법이 실제로 구현되는 단계죠.
  153. 153. •한글 자모로 변환 •패턴 찾아 바꾸기 •외래어 표기법 구현 3단계: Transcribe Rewrite TranscribePhonemize si, chwan, "wan,?" -> "ㅘ-ㄴ" si, chㅘ-ㄴ "i," -> "ㅡ" sㅡ chㅘ-ㄴ "ch" -> "ㅊ" sㅡ ㅊㅘ-ㄴ "s" -> "ㅆ" ㅆㅡ ㅊㅘ-ㄴ Transcribe 단계도 Rewrite 단계와 마찬가지로 일련의 패턴 찾아 바꾸기로 이뤄져 있습니다.
  154. 154. Rewrite TranscribePhonemize四川 쓰촨 한글라이즈 파이프라인 si chuan si, chwan, ㅆㅡㅊㅘ-ㄴ 마지막으로 나열된 자모들을 한글 글자로 모아쓰기하면 전사가 완료돼요.
  155. 155. 아제르바이잔어 벨라루스어 불가리아어 카탈로니아어 체코어 중국어 웨일스어 독일어 그리스어 에스페란토어 에스토니아어 핀란드어 고대 그리스어 세르보크로아트어 헝가리어 아이슬란드어 이탈리아어 일본어 일본어최영애-김용옥 조지아어제1안 조지아어제2안 라틴어 라트비아어 리투아니아어 마케도니아어 네덜란드어 폴란드어 포르투갈어 브라질 포르투갈어 루마니아어 러시아어 슬로바키아어 슬로베니아어 스페인어 알바니아어 스웨덴어 터키어 우크라이나어 베트남어 웨일스어중세
  156. 156. 아제르바이잔어 벨라루스어 불가리아어 카탈로니아어 체코어 중국어 웨일스어 독일어 그리스어 에스페란토어 에스토니아어 핀란드어 고대 그리스어 세르보크로아트어 헝가리어 아이슬란드어 이탈리아어 일본어 일본어최영애-김용옥 조지아어제1안 조지아어제2안 라틴어 라트비아어 리투아니아어 마케도니아어 네덜란드어 폴란드어 포르투갈어 브라질 포르투갈어 루마니아어 러시아어 슬로바키아어 슬로베니아어 스페인어 알바니아어 스웨덴어 터키어 우크라이나어 베트남어 웨일스어중세 한글라이즈엔 현재 일본어, 헝가리어 등 총 40개의 전사 규칙이 들어있어요.
  157. 157. 영어 하지만 아쉽게도 가장 수요가 많은 영어는 아직 지원하지 못 하고 있습니다.
  158. 158. 영어 영어는 특히나 표음성이 낮은 언어라서 그런데
  159. 159. • though ▶ • through ▶ • rough ▶ • cough ▶ • thought ▶ • bough ▶ 영어의 낮은 표음성 예를 들어 "ough"는 이렇게나 다양한 발음을 갖고 있지만
  160. 160. • though ▶ • through ▶ • rough ▶ • cough ▶ • thought ▶ • bough ▶ 영어의 낮은 표음성 철자 규칙만으로 발음을 정확하게 유추하는 건 불가능하다고 합니다.
  161. 161. Ghoti ▶ 영어의 낮은 표음성을 비꼬는 유명한 농담으로 이런 것도 있습니다.
  162. 162. Ghoti ▶ "고티"라고 읽을 것 같은 단어인데
  163. 163. Ghoti ▶ enough women nation "gh"는 "enough"에서, "o"는 "women"에서, "ti"는 "nation"에서 따와서
  164. 164. Ghoti ▶ 피시 enough women nation "피시"라고 읽어야 한다고 합니다.
  165. 165. 2. Go
  166. 166. 2. Go 이번엔 한글라이즈를 Go로 다시 만들면서 저에게 흥미로웠던 점들을 소개해 드릴게요.
  167. 167. 초보 주의 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 고랭코리아 우선 들어가기 전에 앞에서 말씀드렸듯이 전 Go를 취미로만 써봤거든요.
  168. 168. 초보 주의 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 고랭코리아 큰 코드베이스에서 남들과 협업해보거나 실무에서 제대로 써본 적이 아직 없습니다.
  169. 169. 초보 주의 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 고랭코리아 그래서 너무 당연한 얘기를 하거나 틀린 얘기를 할 수도 있는데
  170. 170. 초보 주의 진지한 장난감 협업장난감옹알이 실무 리뷰 구루 저 고랭코리아 그럴 경우 부담 없이 sub@subl.ee로 제보해주시면 감사하겠습니다.
  171. 171. 고루틴 끝내준다! Go 첫인상
  172. 172. 고루틴 끝내준다! Go 첫인상 몇 년 전에 Go 튜토리얼 책을 처음 보면서 들었던 첫인상은 이랬습니다.
  173. 173. 고루틴 끝내준다! Go 첫인상 고루틴 끝내준다!
  174. 174. 고루틴 끝내준다! Go 첫인상 이렇게 병렬 프로그래밍을 쉽게 할 수 있는 환경은 처음 봤었거든요.
  175. 175. 고루틴 끝내준다! Go 첫인상 쓸 때마다 늘 피곤했던 병렬처리 단위, 채널, 큐 등을
  176. 176. 고루틴 끝내준다! Go 첫인상 언어의 기본 기능으로 제공한다는 데에 깜짝 놀랐죠.
  177. 177. •고루틴은 끝내주는데 •그런데 너무 기능이 적다. Go 첫인상 그런데 그 밖엔 취향에 맞지 않는 점이 많았어요.
  178. 178. •고루틴은 끝내주는데 •그런데 너무 기능이 적다. Go 첫인상 그 흔한 반복자나 재정의, 예외도 없고 특히 제네릭이 없어서
  179. 179. •고루틴은 끝내주는데 •그런데 너무 기능이 적다. Go 첫인상 범용적인 정적 자료구조를 만들 수 없다는 점도 의아하게 느껴졌습니다.
  180. 180. •고루틴은 끝내주는데 •그런데 너무 기능이 적다. •고퍼도 귀엽지 않고 Go 첫인상 그리고 무엇보다도 고퍼가 영 귀엽지 않았죠.
  181. 181. 이걸로 정말 제품이 만들어질까? Go 첫인상 이렇게 단순한 언어로 정말 강력한 제품을 만들 수 있을까 의문이 들었습니다.
  182. 182. Docker etcd Terraform K8s 하지만 점점 더 많은 유명 프로젝트가 Go로 만들어지고 있는 모습을 보면서
  183. 183. 된다. 아주 잘 된다는 걸 깨닫게 됐죠.
  184. 184. 협업장난감옹알이 실무 리뷰 구루 진지한 장난감 저도 한 번 Go를 제대로 익혀보고 싶어서 간단한 취미코딩에 써보기 시작했어요.
  185. 185. https://subl.ee/runker/ 예를 들면 이런 겁니다.
  186. 186. https://subl.ee/runker/ 〈섭리랑카〉라는 간단한 〈똥피하기〉 패러디 게임인데
  187. 187. https://subl.ee/runker/ 랭킹서버가 Go 여기서 랭킹서버가 Go와 구글 앱 엔진으로 돼있습니다.
  188. 188. sublee/subpptx 지금 이 발표자료에 자막 붙이는 데 쓰고 있는 "subpptx"도 Go로 만들었어요.
  189. 189. sublee/subpptx 이 프로젝트에선 고루틴 덕분에 손쉽게 페이지 단위로 병렬처리할 수 있었죠.
  190. 190. 쓸 만 하다. 더 잘 하고 싶다. 이런저런 간단한 장난감을 만들면서 Go를 써보니 꽤 쓸 만 하고 재미있다는 인상을 받았습니다.
  191. 191. 쓸 만 하다. 더 잘 하고 싶다. Go 특유의 간결함이 이제 명료함으로 느껴지더라고요.
  192. 192. 쓸 만 하다. 더 잘 하고 싶다. 몇 십 줄 짜리 간단한 장난감에서 벗어나 좀 더 진지한 걸 만들어보면서
  193. 193. 쓸 만 하다. 더 잘 하고 싶다. Go를 더 잘 다루고 싶다고 생각하게 됐습니다.
  194. 194. 한글라이즈 다시 만들면 왠지 더 잘 만들 것 같다.
  195. 195. 한글라이즈 다시 만들면 왠지 더 잘 만들 것 같다. 석 달 전 마침
  196. 196. 한글라이즈 다시 만들면 왠지 더 잘 만들 것 같다. 한글라이즈를 다시 만들면 왠지 더 잘 만들 것 같다는 생각이 떠올랐어요.
  197. 197. •주먹구구식 구현 •고치기 어려운 버그 •전사 규칙이 파이썬 코드 옛 한글라이즈 불만 앞에서 말씀드렸듯이 기존 한글라이즈에서 맘에 들지 않는 구석도 많았고
  198. 198. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 또 한글라이즈가 저에겐 새로운 언어를 익힐 때 연습과제로 삼기 꽤 좋은 프로젝트거든요.
  199. 199. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 이미 한 번 만들어봐서 불확실성은 별로 없는데
  200. 200. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 적당히 복잡하면서 상당히 계산 중심적이다 보니
  201. 201. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 구조나 알고리즘에 대한 고민도 다시 한 번 해보게 되고
  202. 202. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 그 언어가 유니코드와 정규표현식을 어떻게 다루는지 깊게 겪어볼 수도 있고
  203. 203. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 또 이미 만들어둔 테스트케이스가 많아서 제대로 짰는지 검증할 재료도 충분하죠.
  204. 204. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 마지막으로 제가 덕질할 수 있는 주제여서
  205. 205. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 몇 달 정도는 지긋이 해볼 수 있는 과제이기도 합니다.
  206. 206. • 이미 한 번 만들어 봄 • 적당한 복잡성 • 계산 중심적 •유니코드/정규표현식 •풍부한 테스트케이스 •언어학 덕질 연습과제: 한글라이즈 그렇게 파이썬으로 만들었던 한글라이즈를 Go로 다시 만들게 됐습니다.
  207. 207. a. 정규표현식 b. 말과 글 c. 테스트와 문서화
  208. 208. a. 정규표현식 b. 말과 글 c. 테스트와 문서화 그럼 Go에서 흥미로웠던 세 가지 주제로 넘어가 보겠습니다.
  209. 209. a. 정규표현식 b. 말과 글 c. 테스트와 문서화 좀 두서 없을 수도 있는데 정규표현식, 말과 글, 테스트와 문서화에 대해 다룰 거예요.
  210. 210. a. 정규표현식
  211. 211. a. 정규표현식 첫 번째는 정규표현식입니다. 줄여서 "정규식"이라고도 부르는데
  212. 212. /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~- ]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d- x7f]|[x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9- ]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0- 5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0- 9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e- x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])/ 이메일 정규표현식 http://emailregex.com/ 텍스트 매칭하는 데에 다들 한 번 쯤은 써보셨을 것 같아요.
  213. 213. /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~- ]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d- x7f]|[x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9- ]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0- 5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0- 9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e- x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])/ 이메일 정규표현식 http://emailregex.com/ 정규식 엔진엔 몇 가지 알고리즘이 있지만
  214. 214. import "regexp" Go 표준 정규식 라이브러리는
  215. 215. •안전한 정규표현식 구현 •문자열 길이에 대해 선형 시간 •고의적으로 일부 기능 미지원 RE2 by Google 구글에서 만든 정규식 엔진인 RE2를 기반으로 하고 있습니다.
  216. 216. •안전한 정규표현식 구현 •문자열 길이에 대해 선형 시간 •고의적으로 일부 기능 미지원 RE2 by Google RE2는 평균적으로 가장 빠른 정규식 엔진은 아니더라도
  217. 217. •안전한 정규표현식 구현 •문자열 길이에 대해 선형 시간 •고의적으로 일부 기능 미지원 RE2 by Google 대상 문자열 길이에 정비례하는 선형 시간을 보장하는 걸 목표로 삼는다고 합니다.
  218. 218. •안전한 정규표현식 구현 •문자열 길이에 대해 선형 시간 •고의적으로 일부 기능 미지원 RE2 by Google 그래서 선형 시간에 구현할 수 없는 정규식의 일부 고급 기능은 고의적으로 지원하지 않죠.
  219. 219. O(mn) RE2 성능 보장 RE2의 시간복잡도는 평균, 최악 모두 O(mn)입니다.
  220. 220. O(mn) RE2 성능 보장 정규표현식 길이 대상 문자열 길이 여기서 m은 정규식 패턴의 길이고 n은 대상 문자열의 길이예요.
  221. 221. O(mn) RE2 성능 보장 정규표현식 길이 대상 문자열 길이 grep 같이 정규식을 사용자입력으로 받는 프로그램이 아닌 이상
  222. 222. O( n) RE2 성능 보장 대상 문자열 길이 보통 상수항 정규식 패턴은 코드에 미리 적어 두는 경우가 대부분이다 보니
  223. 223. O( n) RE2 성능 보장 대상 문자열 길이 보통 상수항 사실상 m을 상수항으로 취급해도 좋습니다. 상당히 훌륭하죠.
  224. 224. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007)
  225. 225. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) RE2를 만든 Russ Cox의 홈페이지에 가보면
  226. 226. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 두 종류의 정규식 엔진을 비교하는 재미있는 벤치마크가 있습니다.
  227. 227. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) Russ Cox는 Go 개발진으로도 유명한 분이죠?
  228. 228. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 우선 이 예시를 보시죠.
  229. 229. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 패턴엔 /a?/와 리터럴 /a/가 각각 3개씩 있고
  230. 230. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 대상 문자열은 "a" 3개로 이뤄져 있습니다.
  231. 231. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 패턴에서 /a?/는 전부 건너뛰고 리터럴 /a/ 3개만 매치시켜야
  232. 232. /a?a?a?aaa/를 "aaa"에 매치 벤치마크 Russ Cox, 〈Regular Expression Matching Can Be Simple And Fast〉(2007) 매치에 성공할 수 있는 패턴이에요.
  233. 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. 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. 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. 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. 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. 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" 두 가지로 직접 돌려봤어요.
  239. 239. /a?ˣaˣ/를 "aˣ"에 매치 시간 파이썬의 re Go의 regexp f(x) 결과는 이랬습니다.
  240. 240. /a?ˣaˣ/를 "aˣ"에 매치 시간 파이썬의 re Go의 regexp f(x) 파이썬 쪽 곡선이 압도적으로 가파르게 올라갔죠.
  241. 241. /a?ˣaˣ/를 "aˣ"에 매치 시간 파이썬의 re Go의 regexp f(x) Russ Cox의 설명에 의하면
  242. 242. /a?ˣaˣ/를 "aˣ"에 매치 시간 f(x) O(x²) O(2ˣ) 시간복잡도가 Go 쪽은 O(x²)이고 파이썬 쪽은 O(2ˣ)이라고 합니다.
  243. 243. /a?ˣaˣ/를 "aˣ"에 매치 시간 f(x) O(x²) O(2ˣ) 언뜻 보면 제곱 시간도 나쁜 성능처럼 보이지만
  244. 244. /a?ˣaˣ/를 "aˣ"에 매치 시간 f(x) O(x²) O(2ˣ) 이 벤치마크 함수는 x가 커질 수록 패턴 길이 m과 문자열 길이 n을 같이 키우니까
  245. 245. /a?ˣaˣ/를 "aˣ"에 매치 시간 f(x) O(x²) O(2ˣ) 제곱 시간이면 사실은 이상적인 성능이라고 볼 수 있습니다.
  246. 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. 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개월이나 걸릴 것으로 예상되더라고요.
  248. 248. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트
  249. 249. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 앞서 정규식 엔진엔 몇 가지 알고리즘이 있다고 말씀드렸는데
  250. 250. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 크게 Spencer 류와 Thompson 류로 나눌 수 있을 것 같습니다.
  251. 251. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 파이썬 re는 Spencer 류에 속하고 RE2와 Go regexp는 Thompson 류에 속하죠.
  252. 252. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 앞에서 돌렸던 벤치마크의 경우 Spencer 류 엔진에선 지수 시간이 걸리지만
  253. 253. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 Thompson 류 엔진에선 제곱 시간밖에 걸리지 않습니다.
  254. 254. Spencer 류 펄, PCRE, 파이썬, 루비, 자바 Thompson 류 awk, sed, grep, RE2, Go, 러스트 왜 이런 차이가 생기는지 x=3일 때를 예로 들어서 살펴볼게요.
  255. 255. Spencer 류 "aaa"a? a? a? aaa a?가 있다고 가정 a?가 없다고 가정
  256. 256. Spencer 류 "aaa"a? a? a? aaa a?가 있다고 가정 a?가 없다고 가정 Spencer 류 엔진은 /a?/라는 분기를 만나면
  257. 257. Spencer 류 "aaa"a? a? a? aaa a?가 있다고 가정 a?가 없다고 가정 우선 /a?/가 존재한다고 가정하고 다음으로 넘어갑니다.
  258. 258. Spencer 류 "aaa"a? a? a? aaa a?가 있다고 가정 a?가 없다고 가정 /a?a?a?/가 전부 있다고 가정하고 끝까지 가보면
  259. 259. Spencer 류 "aaa"a? a? a? aaa a?가 있다고 가정 a?가 없다고 가정 대상 문자열의 끝에 도달해서 리터럴 /a/를 매치시킬 곳이 없단 걸 깨닫죠.
  260. 260. Spencer 류 "aaa"a? a? a? aaa aaa a?가 있다고 가정 a?가 없다고 가정 그럼 마지막 분기로 되돌아가서 그 /a?/가 없다고 가정합니다.
  261. 261. Spencer 류 "aaa"a? a? a? aaa aaa a?가 있다고 가정 a?가 없다고 가정 하지만 이 길 역시 틀린 길이죠.
  262. 262. Spencer 류 "aaa"a? a? a? aaa a? aaa aaa aaa a?가 있다고 가정 a?가 없다고 가정 한 단계 더 물러나서 이번엔 두 번째 /a?/가 없다고 가정해요.
  263. 263. Spencer 류 "aaa"a? a? a? aaa a? aaa aaa aaa a?가 있다고 가정 a?가 없다고 가정 그 상태에서 앞에서와 같이 세 번째 분기도 다시 탐색합니다.
  264. 264. Spencer 류 "aaa"a? a? a? aaa a? aaa aaa aaa a?가 있다고 가정 a?가 없다고 가정 새로운 두 가지 길이 있지만 이번에도 모두 틀린 길이죠.
  265. 265. Spencer 류 "aaa"a? a? a? aaa a? a? aaa a? aaa a? aaa aaa aaa aaa a?가 있다고 가정 a?가 없다고 가정 aaa 이젠 첫 번째 /a?/도 없다고 가정하고 그동안 탐색했던 길만큼 다시 탐색합니다.
  266. 266. Spencer 류 "aaa"a? a? a? aaa a? a? aaa a? aaa a? aaa aaa aaa aaa a?가 있다고 가정 a?가 없다고 가정 aaa 매치! 마지막 길까지 살펴보면 마침내 패턴이 매치된단 걸 알 수 있습니다.
  267. 267. a? a? a? aaa a? a? aaa a? aaa a? aaa aaa aaa aaa aaa 퇴각검색 (backtracking) 이런 식으로 일단 길 하나를 쭉 파보고 틀렸으면 퇴각한 다음
  268. 268. a? a? a? aaa a? a? aaa a? aaa a? aaa aaa aaa aaa aaa 퇴각검색 (backtracking) 다른 길로 다시 파보는 방식을 "퇴각검색"이라고 하는데
  269. 269. a? a? a? aaa a? a? aaa a? aaa a? aaa aaa aaa aaa aaa 퇴각검색 (backtracking) Spencer 류 정규식 엔진은 분기를 퇴각검색으로 구현합니다.
  270. 270. Thompson 류 "aaa" a?a?a?aaa a?a?a?aaa a?a?a?aaa a?a?a?aaa 첫 번째 a 반면 Thompson 류 정규식 엔진은 대상 문자열의 각 글자에 대해서
  271. 271. Thompson 류 "aaa" a?a?a?aaa a?a?a?aaa a?a?a?aaa a?a?a?aaa 첫 번째 a 가능한 선택지를 모두 평가하면서 전진해요.
  272. 272. Thompson 류 "aaa" a?a?a?aaa a?a?a?aaa a?a?a?aaa a?a?a?aaa 첫 번째 a 대상 문자열의 첫 번째 "a"의 경우 패턴의 세 /a?/ 중 어디에도 매치될 수 있고
  273. 273. Thompson 류 "aaa" a?a?a?aaa a?a?a?aaa a?a?a?aaa a?a?a?aaa 첫 번째 a 첫 번째 리터럴 /a/에도 매치될 수 있어서 총 4가지 가능성을 가집니다.
  274. 274. 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"에 매치해보고
  275. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 이 때문에 특정한 경우에 둘 사이에서 극단적인 성능차이를 볼 수 있습니다.
  287. 287. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류
  288. 288. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 하지만 일반적인 경우 Spencer 류 정규식 엔진도 충분히 빠르게 동작해요.
  289. 289. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 패턴만 안전하게 짜면 Thompson 류만큼 안정적으로 쓸 수 있죠.
  290. 290. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 그리고 정규식 기능 중엔 퇴각검색으로만 구현할 수 있는 것도 있어서
  291. 291. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 이쪽의 정규식 표현력이 훨씬 좋습니다.
  292. 292. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 그래서인지 펄과 PCRE, 파이썬을 비롯해
  293. 293. •평균적으론 충분히 빠르고 •표현력이 더 좋아요. •펄, PCRE, 파이썬, 루비, 자바 Spencer 류 오늘날 수많은 정규식 엔진이 이 방식을 쓴다고 해요.
  294. 294. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 하지만 Spencer 류 정규식 엔진을 쓰는 서버가
  295. 295. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 만약 사용자 입력으로 정규식 패턴을 받는다면 얘기가 달라집니다.
  296. 296. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 공격자가 정규식 엔진에서 최악의 경우를 이끌어내는
  297. 297. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 악의적인 정규식 패턴으로 ReDoS 공격을 가할 수 있거든요.
  298. 298. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 구글에서도 ReDoS 공격에 대한 우려가 있어서
  299. 299. /(a+)+/ /([a-zA-Z]+)*/ /(a|aa)+/ /(a|a?)+/ ReDoS 공격 Thompson의 정규식 알고리즘을 기반으로 RE2를 만들게 됐다고 합니다.
  300. 300. 2부에서 계속… 슬라이드셰어에 슬라이드 300장 제한이 있어서 부득이하게 2부로 나눠서 올렸습니다. 보는 데 불편하시겠지만 양해를 부탁드립니다.

×