Dart 2 출시 소식: 클라이언트 개발에 최적화된 언어
Dart 2 출시 소식: 클라이언트 개발에 최적화된 언어
오늘 우리는 Dart 2를 발표해요. 웹과 모바일을 위한 클라이언트 개발에 독특하게 최적화된 언어라는 우리의 Dart 비전을 받아들인 언어의 리부트(rebooot)예요.
Dart 2로 우리는 타입 시스템을 크게 강화하고 단순화하고, 문법을 정리하고, 개발자 도구 체인 상당 부분을 밑바닥부터 다시 구축해서 모바일과 웹 개발을 더 즐겁고 생산적으로 만들었어요. Dart 2는 또한 Flutter, AdWords, AdSense 등 언어의 초기 채택자에게서 배운 교훈과, 고객 피드백에 대한 수천 개의 크고 작은 개선을 담고 있어요.
출처: Announcing Dart 2: Optimized for client-side development
본문
Dart의 핵심 원칙(Core Tenets)
Dart 2의 진전에 대해 더 얘기하기 전에, 왜 우리가 Dart가 클라이언트 개발자의 요구에 잘 맞는 위치에 있다고 믿는지 짚어볼 가치가 있어요.
현대적 범용 언어에 필요한 속성 외에도, 클라이언트 개발은 이런 언어의 이점을 얻어요.
- 생산적(Productive). 문법은 명확하고 간결해야 하고, 도구는 단순해야 하며, 개발 사이클은 거의 즉각적이고 온디바이스(on-device)여야 해요.
- 빠름(Fast). 런타임 성능과 시작(startup)이 작은 모바일 기기에서도 훌륭하고 예측 가능해야 해요.
- 휴대 가능(Portable). 클라이언트 개발자는 오늘날 iOS, Android, 웹이라는 세 가지 플랫폼을 생각해야 해요. 언어는 그 모두에서 잘 동작해야 해요.
- 접근하기 쉬움(Approachable). 수백만 개발자에게 관련성 있으려면 언어가 너무 낯설어지면 안 돼요.
- 반응형(Reactive). 언어가 반응형(reactive) 프로그래밍 스타일을 지원해야 해요.
Dart는 Google 안팎에서 웹, iOS, Android에 걸쳐 많은 고품질의 미션 크리티컬 애플리케이션을 출시하는 데 쓰여 왔고, 모바일과 웹 개발에 아주 잘 맞는 언어예요.
- Dart는 명확하고 간결한 문법과, JIT 컴파일러를 가진 VM 위에서 동작하는 능력 덕분에 개발자 속도를 높여요. 후자는 모바일 개발 중 stateful hot reload를 가능하게 해, 코드를 편집하고 컴파일해서 기기의 실행 중인 앱에 교체하는 초고속 개발 사이클을 만들 수 있어요.
- AOT로 네이티브 코드에 효율적으로 컴파일하는 능력 덕분에, Dart는 모바일 기기에서 예측 가능한 고성능과 빠른 시작을 제공해요.
- Dart는 빠른 모바일 성능을 위한 네이티브 코드(ARM, x86 등) 컴파일과, 웹을 위한 효율적인 JavaScript로의 트랜스파일을 모두 지원해요.
- Dart는 놀랍지 않은 객체 지향 측면과 문법 덕분에 많은 기존 개발자가 쉽게 접근할 수 있어요. 사용자들에 따르면 어떤 C++, C#, Objective-C, Java 개발자라도 며칠 안에 생산적으로 일할 수 있어요.
- Dart는 검증된 코어 라이브러리(streams와 futures 포함)로 반응형 프로그래밍에 잘 맞고, 빠른 세대별 가비지 컬렉터로 단명 객체를 관리하는 것도 뛰어나게 지원해요.
Dart 2: 더 나은 클라이언트 개발
Dart 2에서 우리는 Dart를 클라이언트 개발을 위한 훌륭한 언어로 굳히기 위한 추가 조치를 취했어요. 특히 강력한 타이핑(strong typing)을 추가하고, UI가 코드로 정의되는 방식을 개선하는 등 몇 가지 새 기능을 담았어요.
강력하고 사운드한 타이핑(Strong, Sound Typing)
AdWords와 AdSense 팀은 Google 수익의 큰 비중을 차지하는 광고를 관리하기 위해, Google에서 가장 크고 진보된 웹 앱 일부를 Dart로 구축했어요. 이 팀들과 긴밀히 협력하면서 우리는 Dart의 타입 시스템을 강화할 큰 기회를 발견했어요. 이는 Dart 개발자가 개발 과정에서 더 일찍 버그를 잡고, 대규모 팀이 만든 앱으로 더 잘 확장하며, 전반적인 코드 품질을 높이는 데 도움을 줘요.
물론 이게 독특한 건 아니에요. 더 넓은 웹 생태계에서도 JavaScript에 타입 어노테이션을 추가하는 추세가 커지고 있어요. 예를 들어 TypeScript와 Flow 둘 다 코드를 분석하는 능력을 개선하기 위해 JavaScript를 타입 어노테이션과 추론으로 확장해요.
아래의 작은 예시에서 Dart 2의 타입 추론은 다소 미묘한 오류를 드러내는 데 도움을 주고, 그 결과 코드 품질을 전반적으로 개선하는 데 도움을 줘요.
void main() {
List<int> prices = ['99', '27', '10000', '20000000'];
// Sort in place from smallest to largest
prices.sort();
print('Lowest price is ${prices[0]}!');
}
이 코드는 무엇을 하나요? 합리적으로는 '27'을 출력할 거라고 기대할 수 있어요. 하지만 Dart 2의 사운드 타입 시스템이 없는 상태에서는 '10000'을 출력해요. 왜냐하면 그것이 문자열 리스트를 사전식(lexicographically)으로 정렬할 때 우연히 최소 요소이기 때문이죠. 하지만 Dart 2에서 이 코드는 타입 오류를 낼 거예요.
코드로서의 UI(UI as Code)
UI를 만들 때, 별도의 UI 마크업 언어와 앱을 작성하는 프로그래밍 언어 사이를 전환해야 하는 것은 종종 좌절을 불러일으켜요. 우리는 UI 정의를 코드로 만드는 일이 즐거운 경험이 되도록, 이 컨텍스트 전환의 필요성을 극적으로 줄이기 위해 힘쓰고 있어요. Dart 2는 선택적(optional) new와 const를 도입해요. 이 수요가 많던 기능은 그 자체로 매우 값지고, 앞으로 올 것들의 방향도 정해요. 예를 들어 선택적 new와 const 덕분에 UI 위젯 정의를 키워드 하나 없이 깔끔하게 만들 수 있어요.
// Before Dart 2
Widget build(BuildContext context) {
return new Container(
height: 56.0,
padding: const EdgeInsets.symmetric(horizontal: 8.0),
decoration: new BoxDecoration(color: Colors.blue[500]),
child: new Row(
...
),
);
}
// After Dart 2
Widget build(BuildContext context) =>
Container(
height: 56.0,
padding: EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(color: Colors.blue[500]),
child: Row(
...
),
);
Dart의 클라이언트 측 사용
모바일
Dart의 가장 중요한 용도 중 하나는 Google의 새 모바일 UI 프레임워크인 Flutter예요. iOS와 Android를 위한 고품질 네이티브 인터페이스를 만드는 프레임워크죠. 엄청나게 인기 있는 쇼 Hamilton: The Musical의 공식 앱은 Flutter가 개발자들이 기록적인 시간 안에 무엇을 만들 수 있게 해주는지 보여주는 예시예요. Flutter는 반응형 프로그래밍 스타일을 쓰고 전체 UI를 픽셀 단위로 제어해요. Flutter에게 Dart는 배우기 쉬움, 반응형 프로그래밍, 훌륭한 개발자 속도, 빠른 가비지 컬렉터를 가진 고성능 런타임 시스템 측면에서 딱 맞는 언어예요.
웹
Dart는 미션 크리티컬 웹 애플리케이션을 위한 검증된 플랫폼이에요. dart:html 같은 웹 특화 라이브러리와 완전한 Dart 기반 웹 프레임워크를 갖추고 있어요. 웹 개발에 Dart를 쓰는 팀들은 개발자 속도 개선에 기뻐했어요. Google AdWords 엔지니어링 부사장인 Manish Gupta가 설명하듯:
AdWords 프런트엔드는 크고 복잡하며, Google 수익의 대부분에 결정적이에요.
우리는 성능과 예측 가능성, 배우기 쉬움, 사운드 타입 시스템, 웹·모바일 지원의 훌륭한 조합 때문에 Dart를 선택했어요.
우리 엔지니어들은 이전보다 두세 배 더 생산적이고, 전환한 걸 매우 기쁘게 생각해요.
나아가기(Moving Forward)
Flutter와 Dart로, 개발자들은 드디어 안드로이드, iOS, 웹을 위한 프로덕션 품질의 앱을 공유 코드베이스로, 타협 없이 작성할 기회를 얻었어요. 그 결과 팀원들은 플랫폼 사이를 유연하게 오가며 코드 리뷰 같은 걸로 서로 도울 수 있어요. 지금까지 우리는 AdWords Express와 AppTree 같은 팀들이 모바일과 웹 간에 코드의 50%~70%를 공유하는 것을 보았어요.
Dart는 오픈소스 프로젝트이자 공개 ECMA 표준이에요. 우리는 Dart 코어 프로젝트와 점점 커지는 Dart 패키지 생태계 양쪽에 기여를 환영해요.
Dart 2는 Flutter와 커맨드라인의 Dart SDK에서 시험해 볼 수 있어요. Dart SDK의 경우 dev 채널에서 최신 Dart 2 프리릴리스를 받아 --preview-dart-2 플래그로 코드를 실행하세요. gitter에서 커뮤니티에 합류하는 것도 환영해요.
오늘 발표된 개선으로, Dart 2는 현대 앱 개발의 도전을 다루는 생산적이고 깔끔하며 검증된 언어가 됐어요. 이미 지구상에서 가장 까다로운 개발자들이 사랑하고 있고, 여러분도 사랑하게 되길 바래요.
더 알아보기
- Dart SDK 설치 페이지에서 Dart 2 프리릴리스를 받아 시험해 볼 수 있어요.
- Flutter에서 Dart를 모바일 UI 개발에 어떻게 쓰는지 볼 수 있어요.
- Dart 패키지 생태계에서 커뮤니티가 만든 패키지를 살펴볼 수 있어요.
- gitter의 Dart 커뮤니티에 참여해서 의견을 나눌 수 있어요.