한 언어에 대한 전반적인 내용을 써 본 건 스위프트(Swift) 언어가 처음이다. 공부하는 겸 글을 싸질렀지만 그 덕분에 많은 도움이 되기도 했다. 그리고 그 덕분인지 언어에 대한 인상이라는 글을 쓸 기회가 생긴 것 같다.
어라 헤더가 없네?
가장 첫 인상은 헤더(Header) 같이 별도로 정의된 스펙 문서가 없어서 마치 스크립트 언어를 연상케 하는 겉모습이었다. 문법 자체도 간결해 보여서 마치 Python을 컴파일이 가능한 버전으로 만든 건 같았다.
하지만 이내 헤더가 없음에 약간의 좌절도 느꼈다. 숨기고 싶은 인터페이스와 공개하고 싶은 인터페이스를 어떻게 구분할 수 있을까? 이런 느낌은 현재 내가 하고 있는 SDK 개발 처럼, 특정한 라이브러리 등을 외부에 제공해야 할 때 하게되는 고민 같다.
Type Safe?
타입 안전(type-safe)이라는 표현은 뭐라고 하는 것이 좋을까? 개인적으로는 스위프트는 ‘타입 강제’ 언어라는 표현이 더 어울린다고 생각한다.
타입 세이프의 의미는 값과 타입 간의 관계를 명확히 한다는 표현이다. 그런데 이건 결국 '컴파일 타임 때 타입이 반드시 결정’ 이라는 제한으로 이루어진다. 그 덕분에 오버플로우 체크를 엄격하게 할 수 있는 길을 만들어 놨다.
현대적인 스크립트 언어들과의 차이점이 여기서 보인다. 대게 이런 언어들은 타입이 동적(Dynamic)이다. 한 변수의 타입이 하나가 아니라 다른 것으로 런타임 때 마구 바뀔 수 있다. 그래서 스크립트언어가 느리다는 것은 잘 알려져있다.
물론 뭐든 장단점과 특징이 있기 마련. 타입 강제라는 표현은 나쁘다라는 의미가 아니라 특징이라고 받아들이자.
강력한 언어 != 간결한 언어
문법(Syntax) 면에서 스위프트는 결코 간결하지 않다. 애플이 WWDC에서 이야기 한 ‘빠르게 개발 할 수 있는 언어’ 라는 표현은 틀렸다고 생각한다. 사용 할 수 있는 키워드도 많고 제한 사항도 많고 이상한 규칙도 많다.
물론 언어에 익숙해지고 몸에 익는다면 개발속도는 빨라지게 마련이다. 그런데 이건 모든 언어에 대해 할 수 있는 말이다.
오히려 구식 C 언어 같은 언어가 간결한 문법을 가지고 있다. 그 만큼 언어를 배울 때의 시간은 적게 소모된다. 스위프트는 언어를 배우는데 소모되는 시간이 좀 길다고 느껴진다. (물론 C의 포인터 같은 이질적인 뭔가는 사람에 따라 다르겠지만...)
다만 스위프트로 모듈을 잘 만들어 놓으면 이 모듈을 가져다 쓰는 개발자 입장에서는 편하고 빠르게 개발이 가능하다는 것은 부정하기 힘들다.
퍼포먼스를 위함인가 개념을 위한 의도인가
간혹 스위프트를 보다보면 의 존재하는지 이해하기 힘든 문법이 보인다. 예를 들어 override 라던가 mutating 같은 것이다.
사실 override는 코드 읽기 측면에서 도움이 될 수도 있다. 상위 클래스의 구현을 보지 않고도 이 메소드가 상속받아서 재구현(오버라이드) 되어 있다고 바로 파악 할 수 있기 때문이다. 그렇다면 강제로 명시하지 않아도 되는 것 아닌가? 스위프트는 현재 override 키워드를 강제하고 있다.
가장 이해하기 힘든 것은 mutating 이다. 구조체의 경우 멤버 프로퍼티를 메소드에서 수정하는 것을 기본적으로 제한하고 있다. 수정하고 싶다면 반드시 mutating 을 명시해야 한다. 그런데 이건 무슨 의도가 있는건가? 아니면 퍼포먼스를 위한 특수한 설계인가? 왜 굳이 struct 에서만 mutating을 명시해야 하는가? class는 왜 mutating이 없어도 되는가?
컴파일러 입장에서 보면 mutating 이든 override 이든 명시하지 않아도 코드를 보고 알아서 파악은 가능하다. 다만 문법에서 일부러 쓰도록 강요하고 있다.
느린데 제법 빠르다
스위프트가 발표되고 Xcode 6 베타가 즉시 발표됨에 따라 언어 벤치마크도 제법 활발하게 이루어졌다. 하지만 대부분 스위프트가 느리다는 결과를 보여주고 있다.
그런데 문제는 컴파일러 최적화 옵션(-Ofast)을 주면 C++에 버금갈 정도로 빨라진다는데 있다. 도데체 최적화를 안하면 뭔 짓을 하길래 이렇게 느릴까?
아직은 NextStep 에서 벗어나질 못 했다.
물론 이는 기본 프레임워크 때문일지도 모르겠지만, 아직은 많은 기본적이어야 할 데이터타입이 NS로 시작하는 이름의 클래스에 의존적이다. NS는 NextStep의 약자이고 Objective-C 를 대표하는 프레임워크이기도 했다. 그런데 NS Framework 들은 스위프트 문법과 어울리지 않다는 생각이다.
Array나 Dictionary 같은 타입은 잘 벗어났으면서 왜 NSDate는 Date로 벗어나질 못 하는걸까? 심지어 String 조차 NSString의 브릿지를 많이 제공하고 있는데 이는 스위프트 고유의 것은 아니다.
섵부른 이야기 일 수도 있지만, 스위프트는 아직 미완성이라고 생각한다. 즉 나중에는 벗어날 것 같다는 생각이다.
Po<LLVM>wer
LLVM이 대단한 것은 사실이고 실제로 좋다고 생각한다. 이건 그냥 넘어가자.
현재 스위프트의 장점 중 상당수는 이 LLVM에 의해 포장되어 있다고 느껴진다. 스위프트 소개에는 LLVM의 소개가 빠지질 않는다.
Xcode 6의 플레이그라운드 기능은 유용하다. 하지만 이 기능은 LLVM에 의존적이다. 제대로 된 플레이 그라운드가 나오려면 컴파일 방식이 아닌 좀 느리더라도 인터프리터가 제공되는 편이 좋지 않을까?
LLVM이 대단하긴 하지만 스위프트라는 언어만 본다면 제외하고 생각하는게 좋다는 느낌이다.
미완성
결론은 이걸로 맺어질 것 같다. 이 언어가 개발된지 4년 밖에 안되었고 다른 유명 언어들은 대게 10년 이상 개발된 언어들이라는 차이를 보자. 스위프트는 계속 변해갈 것이다. 다만 현 시점에선 아직 1.0 을 내놓기 이전의 알파라는 느낌이 강하다.
앞서 몇 가지 관련 이야기를 했었지만 또 다른 예를 하나 들어보자. class 에서 static 키워드를 사용하면 에러가 난다. 그런데 에러 내용을 봤는가. "static 은 아직 class 에서는 지원하지 않는다.” 이런 에러 메시지가 돌아온다.
심지어 OOP에서 가장 기본으로 삼는 포장화(Access Control)도 없다. 드러내고 싶은 멤버는 public 으로, 감추고 싶은 멤버는 private 로 만들어 주는 등 클래스 포장 기술은 OOP의 기본이다. 그런데 왜 없나? 일단 Xcode 6 Beta 2 에서는 Known Issue로 분류되어 있기에 나중에 추가될 것은 확실하다.
결국 기본적으로 제공되어야 할 것이 없기에 스위프트를 미완성이라 평가하는 것이다.
미래는 어떻게 될지 알 수가 없다. 느긋하게 가는 편하지만 느린 미래일까 아니면 카오스급 급변의 미래일까. ;-)
[관련글] 스위프트(Swift) 가이드
Popular Posts
-
Q. 1.3과 1.12 중 어느 버전이 더 최신 버전인가요? A. 1.12가 더 최신버전입니다. 위의 같은 질문류를 커뮤니티에서 본 적이 있는데 놀랍게도 1.3을 1.12보다 더 높은 버전으로 생각하는 사람이 많은 것 같았다. 그래서 이번에는 버...
-
sigsegv 검색을 통해 유입된 내역이 하나 보여서 잠깐 설명.
-
이번 글은 굉장히 유명한 수학 함수 3가지를 적어보는 글입니다. 그리고 오랜만에 구어체가 아닌 존대말(?)로 쓰는 글이기도 하겠네요. 이번에 언급하는 함수 세 가지, 즉 ceil(), floor(), round() 함수는 C 언어 시절부터 쓰이...
-
최신의 Emacs 22~23 에서는 한글 폰트 설정에 따른 불편함은 많이 사라진 편이지만, 역시 마음에 드는 폰트 설정은 힘든 편이었다. 특히 영문과 한글 폰트를 별도로 설정해야 하는 경우 크기를 맞추는 등의 삽질이 필요한 편이다.
-
첫째가 다니고 있는 어린이집이 초토화되고 있다. 독감 때문이다. 한 반의 60% 가량의 원아가 독감으로 등원하고 있지 않다고 하니 사태가 심각하다. 물론 여기서 말하는 독감은 그 인플루엔자가 맞다. 독한 감기를 말하는 게 아니다. 이런 이야기는 굳이 ...
-
Vim이 강력한 편집기로써 군림하게 된 건 편한 키맵, 정규표현식, 그리고 이 매크로 레코딩 기능이 있기 때문이라고 감히 주장하고 싶다. 레코딩 기능은 사용자가 입력하는 키를 그대로 녹화해서 매크로로 만들어 주는 기능이다. 이 기능에 대해 간단히...
-
블로그를 네이버 및 티스토리에서 구글 블로거로 완전히 이주하기로 시작한 뒤의 첫 투기기록 글이다. 어쨌든 매주 토요일 오후 늦은 시각, 로또 대신 비트코인을 시장가로 만 원어치 무지성으로 지르는 프로젝트의 194주 차 기록이다. 194.95% -...
Tags
Blog Archive
-
▼
2014
(91)
-
▼
6월
(37)
- Xcode Playground Killer Codes
- Objective-C에서 Swift로 넘어가기 #2
- 예제로 보는 스위프트(Swift) - MyDatetime 클래스
- Swift - 병렬 프로그래밍(Concurrency Programming) 가이드
- Swift - GCD(Grand Central Dispatch) 기초
- Swift - NSOperationQueue 병렬 프로그래밍 기초
- Swift - NSThread 병렬 프로그래밍 기초
- Objective-C에서 Swift로 넘어가기
- Swift - 유용한 전처리기(Preprocessor)
- Swift 언어에 대한 인상
- 스위프트(Swift) 가이드
- Swift - 제너릭(Generics)
- Swift - 오퍼레이터 오버로드(Operator Overloads)
- Swift - 서브스크립트(Subscripts)
- Swift - 확장(Extensions)
- Swift - 프로토콜(Protocols)
- Swift - 생성자와 파괴자(Initialization and Deinitialization)
- Swift - 메소드(Method)
- Swift - 싱글톤 패턴(Singleton Pattern)
- Swift - 프로퍼티(Properties)
- Swift - 클래스(Class) 훑어보기
- Swift - 구조체(Structure) 훑어보기
- Swift - 열거형(Enumerations)
- Swift - 루프(Loop)
- Swift - 논리 제어문(Conditional Statements)
- Swift - 컬렉션 타입(Collection Types)
- Swift - 클로져(Closures)
- Swift - 함수(Function)
- Swift - 튜플(Tuple)
- Swift - 기본 공통사항
- Swift - 변수와 상수 그리고 타입
- Swift - 옵셔널(Optionals)
- Swift - 문자열(String)
- Homebrew로 설치한 Macvim 에서 Python 관련 이상증상
- Swift 루프 퍼포먼스 테스트
- Xcode 6 플레이그라운드 시작
- Xcode 6 Beta를 설치해보다
-
▼
6월
(37)
0 comments:
댓글 쓰기