1. 파이썬

요즘 프로그래밍 언어는 네이티브 코드+수동 메모리 관리(= 가상 머신이나 GC가 없는) 분야에서야 C++이 무섭게 발전하면서 약진하는 중이다. D나 Rust나 델파이 같은 나머지 네이티브 코드 언어 진영은 요즘 어찌 지내나 모르겠다.

거기서 양상이 살짝 바뀌어서 VM 기반의 언어로는 Java와 C#이 대표적이다. C#은 매우 뛰어난 언어이고 기반이 탄탄한 건 사실이지만 PC와 Windows의 밖에서는 과연 쓸 일이 얼마나 있나 모르겠다. 안드로이드와 iOS 모두 앱 개발용으로 권장하는 주력 언어가 코틀린, Swift 등 생소한 것으로 바뀌었는데, 지난 수 년 동안 기존 언어(Java, Objective C)의 점유율은 어찌 바뀌었는지 역시 궁금하다.

이보다 표현이 더 자유로운 동적 타입 언어 세계에서는 닥치고 JavaScript 아니면 파이썬이 지존 압권 깡패로 등극했다. 펄, 루비, 루아.. 등등 필요 없고 이걸로 다 물갈이돼 버렸다. 특히 파이썬은 교육용과 실무용이라는 두 영역에서 완벽하게 주류로 자리잡았다는 것이 대단하고 신기하다.

대학교들 CS101 프로그래밍 기초 코스에서 가르치는 언어도 C, Java를 거쳐 지금은 몽땅 파이썬이다. 교육용이 아니면 일부 특수한 분야 한정의 마이너 언어에 그쳤던 과거의 베이식이나 파스칼과는 매우 대조적인 점이다. 한편, JavaScript는 웹의 세계 공용어라는 독보적인 지위를 획득했고 말이다.

네이티브 코드인 C++, 가상 머신 기반인 Java, 동적 타입인 파이썬.. 이렇게 등급과 종류를 불문하고 언어들에 한때는 객체지향 패러다임이 들어가는 게 유행이었는데, 21세기에 들어서는 함수형 패러다임도 필수가 돼서 익명 함수(람다) 정도는 지원해 줘야 아쉽지 않은 지경이 돼 있다.

C/C++, Java 같은 언어에만 파묻혀 살다가 컴파일 에러와 런타임 에러의 구분이 없는 언어..
catch되지 않은 예외 같은 에러를 잡고 나니 다음으로 소스 코드의 스펠링 에러를 접할 수 있는 언어를 쓰는 느낌은 참 묘하다.
그래도 컴파일 없이 바로 실행한다는 게 심리적으로 참 부담없고 가벼운 느낌을 준다. 먼 옛날에 Basic 쓰던 시절 이래로 얼마 만에 다시 경험하는 느낌인지?

  • 나눗셈은 정수/정수라도 언제나 실수가 되는구나. 이건 C/C++ 계열이 아니라 베이식/파스칼에 더 가까운 이념이다. 그래도 '같지 않음'이 <>가 아니라 !=인 것은 C/C++ 영향이다.
  • 비트 연산자는 & |로 두고, 논리 연산자를 and or이라는 단어로 분리한 것은 나름 양 계열의 특성을 골고루 적절하게 수용한 디자인인 것 같다.
  • 삼항 연산자 A ? B:C를 B if A else C로 표현한 것은.. 우와;;;;
  • 함수에 인자를 전달할 때 값만 그냥 전하기도 하고 경우에 따라서 config=100 이렇게도 주는 건.. C/C+++ 스타일과 objective C 스타일을 모두 접하는 것 같다.
  • 문자열이나 리스트 같은 복합 자료형에다가 상수배 곱셈 연산을 해서 복제 뻥튀기를 시키는 것도 상당히 유용하다. 단, 이 경우 내부에 있는 복합 자료형들은 shallow copy만 된다. 제대로 deep copy를 하려면 list comprehension 같은 다른 기법으로 원소들을 하나하나 새로 생성해야 한다.
  • 여러 변수에다 한꺼번에 대입하기, 그리고 리스트 원소들을 연달아 함수 인자로 풀어넣기...;;;
  • 코딩을 하다 보면 특정 자료구조 내부의 원소들을 range-based for 문으로 순회함과 동시에, 각 원소별로 1씩 증가하는 인덱스 번호도 같이 돌리고 싶은 때가 많다. 이럴 때 파이썬은 for i, elem in enumerator(set)라고.. enumerator를 사용하면 저 기능을 곧장 구현할 수 있다.. 오, 이거 사이다 같은데?
  • []는 배열, {}는 dictionary. 의도한 건지는 모르겠지만 JSON 자료구조와 딱 정확하게 대응한다.
  • 문자열에 "" ''을 모두 사용 가능한 건 SQL 같다. 다만, 문자로 표현된 숫자 리터럴과의 구분이 없다 보니, 'a'와 97을 상호 변환하는 건 베이식이나 파스칼처럼 별도의 함수를 써야 한다.

2. 각 프로그래밍 언어별로 없어서 처음에 좀 놀랐던 것들

  • JSON: JavaScript라는 프로그래밍 언어의 문법을 채용했다면서 정작 자신은 코멘트를 넣는 부분이 없고 정수 리터럴에 16진수 표기용 접두사가 없다. 얘는 오로지 machine-generation만 생각했는가 보다.
  • Java: int 같은 primitive type을 함수에다 reference로 전달해서 swap 같은 걸 시킬 수 없다. 그리고 가상 머신 환경에서 큰 의미가 없긴 하지만 sizeof 연산자도 없다.
  • 파이썬 1: goto가 없는 건 Java도 마찬가지이지만.. switch-case도 없다. 파이썬은 들여쓰기 구문이 콜론으로 끝나는 언어인데, 정작 C/C++계열에서 라벨과 콜론을 사용하는 문법이 저 동네에서 존재하지 않는 셈이다. 넣어 달라는 제안이 과거에 있긴 했지만 문법적으로 난감해서 봉인됐다고 한다. 뭐, 그 대신 얘는 elif가 있다.
  • 파이썬 2: 그리고 파이썬은 명시적인 const 속성도 없는 것 같다. 튜플이 값의 불변을 보장하는 자료형이기 때문에 const 테이블 역할을 같이 담당한다.
  • 파스칼: 오리지널 문법에서는 임의의 크기의 동적 배열을 만들 수 없다. 참고로 베이식은 배열의 크기 조절은 자유이지만 포인터가 아예 존재하지 않다 보니 리스트 같은 재귀 구조의 복잡한 자료구조를 구현하는 것 자체가 원천 불가능이다.
  • 익명 함수: C++의 람다만 그런 건지는 모르겠지만, 자기 자신을 간단히 가리키는 키워드가 없고 재귀호출을 구현할 수 없다. 그나마 구현했다는 것들은 다 주변의 다른 functor 등 갖가지 편법을 동원해서 매우 힘들게 억지로 구현한 것들이다.

사실, C/C++의 for문은 while문과 거의 동치일 정도로 조건 검사 지향적이고 range-based for는 21세기가 돼서야 도입됐다. 그러나 파이썬의 for문은 훨씬 더 range 내지 iterator 지향적이다.

그리고 베이식 같은 언어는 switch/case가 거의 if문의 연장선일 정도로 범위 지정도 되고 쓰임이 유연하지만.. C/C++의 switch/case는 그보다 제약이 심하다. 그 대신 그 제약을 이용해서 컴파일러가 최적화를 할 여지가 더 있다. (가령, 조건 검사 대신 테이블 오프셋 참조로..)

3. 언어 문법 차원에서의 지원

20여 년 전 먼 옛날에 스타크래프트 경기 중계방송이란 게 처음으로 행해지던 극초창기엔 경기 운영 노하우가 부족해서 이런 일이 있었다고 한다.
경기를 하는 선수 말고 화면 중계를 위한 옵저버도 게임에 join을 해야 하는데, 자기 기지는 없이 남들 시야 눈팅만 하는 상태로 참여하는 방법을 몰랐던 것이다.

그러니 그때 옵저버는 테란을 골라서 들어갔다. 자기 커맨드센터는 띄워서 맵 구석 모서리에 안 보이게 처박아 놓고, SCV 4기는 서로 공격시켜서 없앴다. 이런 궁색한 삽질을 해서 자기 존재를 최대한 없애 버린 뒤 선수들의 화면을 중계했던 것이다.

물론, 옵저버의 이런 자폭 플레이는 경기 시작 직후, 카메라가 잠시 각 선수들의 개인 화면을 비추고 있는 동안 최대한 잽싸게 행해졌다. 한편으로 선수들 역시 옵저버에게 자기 시야를 공개하는 설정을 매번 수동으로 해 줘야 했다.
선수가 옵저버의 커맨드센터를 고의나 실수로 부숴서 옵저버를 엘리시켜 버리는 건.. 그건 경기 진행 방해이며 규정상 거의 반칙 몰수패 사유가 됐을 것이다.;;

그러다가 잘 알다시피 경기용 맵은 특수하게 트리거를 조작해서 옵저버를 위한 전용 자리가 있는 "유즈맵, 커스텀 맵" 형태로 만들어지고 쓰이게 되었다. 이제 옵저버의 일꾼을 제거하고 커맨드센터를 치우는 삽질을 할 필요가 없어진 것이다.
하지만 경기 자체는 다른 특이 사항이 전혀 없고 건물 짓고 유닛 뽑아서 적 진영을 부수는 것밖에 없는데 매번 유즈맵을 쓰는 건 번거로웠다. 스타 프로그램 차원에서 일반 맵에다가 옵저버 참관 기능을 지원하는 게 제일 이상적이고 바람직했다.

결국 옵저버 참관 기능은 먼 훗날 스타의 1.18 패치에서 정식으로 도입됐다. 지난 1.08 패치에서 리플레이 기능이 추가된 것만큼이나 참신한 기능이다.
특히 이 참관 기능은 각 선수들의 개인 화면과 동급으로 진영별 자원 수, 생산· 연구 건물들의 내부 진행 상태까지 모두 볼 수 있어서 매우 편리하다. 과거의 유즈맵 옵저버로는 그런 게 가능하지 않았기 때문에 선수 개인 화면의 모습을 직접 봐야 했다.

이렇게 과거에 꼼수로 구현하던 기능들이 훗날 정식으로 가능해진 것의 예로는 C++ 프로그래밍이 떠오른다.
일례로, 복사나 대입이 가능하지 않은 클래스를 만들기 위해서 복사 생성자나 대입 연산자를 private에다가 미구현 상태로 박아 넣는 꼼수가 동원됐지만.. C++14부터는 = delete라는 더 완전하고 깔끔한 문법이 언어 차원에서 추가됐다.

Posted by 사무엘

2020/08/03 19:31 2020/08/03 19:31
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1780

한국어의 오묘한 면모

1. 청자를 배제한 1인칭 또는 2인칭

언어 의사소통이라는 게 기본적으로 화자와 청자 사이에서 이뤄지는 것이다 보니, 인칭대명사도 나와 너, 1인칭과 2인칭은 좀 특별하게 취급된다. I나 You가 아닌 다른 모든 사람은 제3자, 말 그대로 3인칭이 되며, 영어에서는 3인칭 단수에 대해 현재 시제 동사는 뒤에 -s가 붙기도 한다.

그런데 기본적으로 1인칭이나 2인칭이지만, "청자를 배제"하는 효과를 내는 대명사 내지 동사 굴절(활용??)이 존재하면 도움이 될 때가 있다. 이런 건 아무래도 주어 생략 눈치 100단과 높임법이 존재하는 한국어가 영어보다 더 발달해 있다.

대표적인 예는 '우리'와 '저희'이다. 1인칭은 복수형이 되면 나뿐만 아니라 주변의 다른 사람까지 포함할 수 있다. 하지만 '저희'는 '우리'와 달리 (1) 화자를 청자보다 낮출 뿐만 아니라 (2) 화자가 속한 집단과 청자는 서로 관계가 없는 별개라고 선을 긋는다.

이런 구분이 영어 we에는 존재하지 않으며, 언어학자에 따라서는 이건 가히 제4인칭이라고 보기도 한다. "저희나라는 틀린 말이니 우리나라라고 써야 한다??" 같은 성토가 존재할 수 있는 언어 자체가 한국어 말고는 거의 없을 것이다.

2인칭의 경우 화자에게는 you라고 부를 수 있을 정도로 가깝고 친근한 사람이지만 그렇다고 그 you가 청자를 의미하지는 않는 경우가 얼마든지 있다. 그래서 한국어는 '당신'이 웃어른에 대한 사실상 3인칭 높임말인데..
이게 2인칭일 때는 그다지 높이는 의도가 없고 낮잡아 부르는 말이라는 게 참 웃기는 짬뽕 같다. "당신이 뭔데 참견이야?"처럼.. 같은 단어가 2인칭과 3인칭을 오락가락 하는 건 한편으로 독일어의 Sie와 sie를 보는 것 같기도 하다.

CCM 가사에서 "당신은 평강의 왕"과 "당신은 사랑받기 위해 태어난 사람"에서 '당신'이 가리키는 대상이 서로 완전히 다르다는 것은 결국 통사가 아닌 화용 계층으로 가야만 분별할 수 있다.
뭐, 영어는 인칭 호칭이 한국어보다 훨씬 더 간결하니 하나님까지 you라고 서슴없이 가리키는 언어이다. 그나마 문자로 표기할 때는 첫 글자를 대문자로 써 주는 게 고작이다.

그리고 끝으로.. 한국어는 어휘 차원에서 청자 들으라고 하는 말이 아닌 '혼잣말'이 구분되는 굉장히 독특한 언어라고 한다. "그게 뭐였더라?"와 "그게 뭐였냐/뭐였니?"의 차이를 생각해 보자.
둘 다 똑같이 의문문이고 굳이 따지면 전자도 문맥에 따라서는 남에게 답을 듣고 싶을 때 쓸 수 있는 말이다. 하지만 골똘이 생각하면서 청자를 응시하지 않고 혼잣말로 중얼거릴 때 후자처럼 말을 하지는 않을 것이다. 한국어에는 이런 세밀한 문법적 기능이 존재한다는 뜻이다.

어떤 언어로든지 청자를 배제하는 1/2인칭, 높임법이나 성별에 구애받지 않고 단· 복수만 구분하는 간편한 대명사가 존재한다면 불필요한 오해를 줄일 수 있고 좋을 것 같다. 우리말 성경이 하나님이나 윗사람을 가리키는 2인칭 대명사를 '너, 그대'라고 번역하지를 못해서 몽땅 '주, 왕' 등으로 3인칭화하는 것은 상당히 불편하게 느껴지며 의미 왜곡까지 발생할 여지가 있는데.. 참 난감한 문제이다.

2. 용언들

한국어에서 활용되거나 접사가 붙는 양상이 좀 이상하게 꼬이고 있는 대표적인 용언을 몇 가지 정리하자면 다음과 같다. 뭐, 수 년 전에 이미 언급한 적이 있는 식상한 아이템도 포함해서 말이다.

(1) 바라다
개인적으로 ‘바랐는데’까지는 원리원칙대로 쓰지만, '바라요', '바람'(명사화된 형태)는 도저히 입에 익지 않아서 불가피하게 ‘바램’과 '바래요'가 튀어나온다. wind 바람과 구분하려는 심리도 있고, 또 ‘자라다, 발하다’ 같은 유사 형태의 다른 용언들은 그런 파생 명사가 존재하지 않는다는 점에서 비교도 된다. 쉽지 않은 문제이다.
‘바라다’는 “-(시)기 바랍니다”라는 형태로.. 평서문(통사)을 가장한 사실상의 정중한 명령문(화용)으로 쓰이고 있다. “-(시)면 고맙겠습니다/감사하겠습니다”는 명령에서 한 단계 내려가서 화용론상의 청유, 부탁에 가깝고 말이다.

(2) 날다
‘나는’이라고만 쓰면 체언+조사 형태와 구분이 안 되니 틀린 줄 알면서도 자꾸 ‘날으는’이라는 대체제가 쓰인다. 아니면 ‘하늘 나는’ 내지 ‘비행하는’이라고 말을 바꿔서 혼동을 줄여야 한다. UFO를 ‘미확인 비행 물체’라는 한자어 말고 순우리말로 도대체 어떻게 깔끔하게 설명할 것인가?

(3) 맞다
동사와 형용사의 경계가 완전히 난장판이다. 원래는 동사이지만 ‘알맞다, 걸맞다’ 같은 비슷한 형용사들이 용법에 영향을 주는 게 틀림없다.
그리고 반의어인 ‘틀리다’는 잘 알다시피 현재 과거 시제 경계가 완전 난장판이다. 이게 ‘다르다/틀리다’ 구분까지 난장판으로 만드는 데 일조하고 있다.

(4) 우습다
‘웃다’의 사동형 동사인 ‘웃기다’가 ‘우습다’라는 기존 형용사의 의미와 용법을 대체해 온 게 어제 오늘 일이 아니다. 아직까지는 원래 있던 ‘우습다’가 더 격식 있는 점잖은 말투로 여겨지지만 그런 인식이 언제까지 유지될지?
왜 이런 일이 생기는 걸까? 이건 옳다/그리다의 가치 판단이 필요한 현상일까? 내 역량으로는 정확하게 분석을 못 하겠다.

(5) 좋다/좋아하다, 싫다/싫어하다
good와 like의 관계, 그리고 "난 네가 좋다/싫다" 같은 말을 영어로 어떻게 표현할지를 생각해 보면 뭔가 묘한 느낌이 든다.
한국어는 영어와 달리 "덥다/춥다"(사람이 느끼는 결과)와 "뜨겁다/차갑다"(사람에게 느낌을 주는 공기, 물이나 다른 물체가.. 혹은 사람의 마음이)의 구분이 존재하는 언어이다. 저기서 "좋다/싫다"는 마치 "덥다/춥다"처럼 사람이 느끼는 결과 관점을 나타내는 형용사일 것이다.

(6) 모르다
내가 아는 언어들 중에 do not know가 타동사 한 단어로 딱 떨어지게 존재하는 언어는 모국어인 한국어 말고는 없다. 신기한 노릇이다.

3. 기억에 남는 단어들

  • 시력교정술인 '라식과 라섹', 폭염 속에서 발생하기 쉬운 '일사병과 열사병'. 요런 건 뭔가 비슷하면서 내부 디테일은 다른 용어쌍인 것 같다.
  • 충전은 일차적으로는 전기를 보충하는 것이지만 뭔가 리소스를 채운다는 뜻에서 교통카드 액수 보충, 휴식과 회복 같은 뜻으로 의미가 확장되고 있다. 물론 한자가 다른 充塡도 있다.
  • 포장도.. wrap과 pave는 서로 완전히 다른 뜻이긴 하지만, 도로를 포장하는 것도 노반을 싸매고 꾸민다는(?) 뜻과 그리 심하게 이질적이지 않은 것 같다. 앞의 '충전'의 의미 확장과 비슷하게 말이다.
  • 大/小가 쓰였지만 크다/작다의 의미가 많이 퇴색한 것이 좀 있다. 대학(고등교육) 대포(무기), 소설(문학..) 소포(우편물)

4. 스타크래프트 게임의 종족별 나레이션

스타크래프트가 출시된 지 20년이 훌쩍 넘었다는 게 믿어지지 않는다. 지금 2020년은 옛날에 PC 통신에서 큰 인기를 끌었던 소설 “환상의 테란”에서 상상하고 묘사하던 미래 배경이기도 하다.

스타는 처음 나왔을 때는 한국어 UI가 없었고 심지어 인게임 채팅창에서 한글 입력조차 되지 않았었다. Localization에 관한 한 불모지였다. 그러다가 스타 2라든가 리마스터 에디션이 나오면서 완벽하게 한국어로 번역되고 더빙까지 됐다. 컴퓨터 하드웨어 성능이 더 향상되었으며, 또 잘 알다시피 한국에서 스타가 넘사벽 급의 인기를 끌었기 때문이다. 처음에 스타가 로컬라이즈가 된 언어는 오히려 일본어였는데 그건 싹 묻혀 버렸다.

개인적으로는 3종족의 아나운서 나레이션을 모두 다른 문체로 번역했어야 했다고 생각한다. 자막은 합쇼체로 통일하더라도 음성 나레이션은 다르게 말이다. 몽땅 다 똑같이 합쇼체로 해 놓으면 너무 길기도 하고 종족별 개성이 살아나지 못한다.

  • 프로토스는 누가 봐도 점잖고 근엄한 분위기이니 디씨 같은 “핵 공격이 감지되었소. 파일런이 더 필요하오.”가 돼야 할 것이다.
  • 테란은 여성 부관이 사령관에게 보고하는 형태이니, 유구한 군대 말투 다나까를 반영하여 지금처럼 “핵 공격이 감지됐습니다. 서플라이가 더 필요합니다.”로 할 수도 있고.. 아니면 부관이 기계인간 사이보그인 걸 감안하여 무전 주고받듯이 뚝뚝 끊어서 “핵 공격 감지됨. 보급고 추가 요망”처럼 할 수도 있다.
  • 저그는 뭔가 공동체 같은 느낌이 드니 구어체 반말까지 생각할 수 있다. “핵 공격이 감지됐다! 오버로드를 더 뽑아야 돼.”

영어 원문은 주어가 다르다. 똑같이 미네랄이 부족해도 플토는 You’ve not enough minerals이지만 저그는 We require more minerals이지 않던가? 영어에 you와 we의 차이가 있다면 한국어는 합쇼체와 해라체의 차이가 존재하는 것이 합당하다.

스타크 세계관이 한국에서 주도적으로 창작됐고 스타라는 게임이 한국에서 만들어졌다면 세 종족의 특성과 개성에 맞게 나레이션의 형태도 저렇게 달라졌을 거라는 게 내 생각이다.
한국어에 기왕 복잡한 조사(체언)와 어미(용언)들이 존재한다면, 그것들을 제 역할을 발휘할 수 있는 곳에 최대한 잘 활용해야 할 것이다. 특히 번역을 할 때 말이다.

Posted by 사무엘

2020/08/01 08:35 2020/08/01 08:35
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1779


블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Site Stats

Total hits:
2678019
Today:
103
Yesterday:
2484