Dart는 어떤 플랫폼에서도 빠른 앱을 개발하기 위한 클라이언트 최적화 언어입니다. 그 목표는 멀티 플랫폼 개발을 위한 가장 생산적인 프로그래밍 언어를 제공하고, 앱 프레임워크를 위한 유연한 실행 런타임 플랫폼과 결합하는 것입니다.
언어는 개발 중에 만들어진 선택 사항으로 정의됩니다. 이 선택 사항은 언어의 기능과 강점을 형성하는데 영향을 미칩니다. Dart는 특히 클라이언트 개발에 적합한 기술적 엔벨롭(technical envelope)을 위해 설계되었습니다. 이것은 개발 (하위초당 상태 저장 핫 리로드)과 컴파일 타겟(웹, 모바일 및 데스크톱)에 걸쳐 고품질의 제품 경험을 우선시합니다.
또한 Dart는 Flutter의 기반을 형성합니다. Dart는 Flutter 앱을 구동하는 언어와 런타임을 제공하지만, Dart는 또한 코드 형식 지정, 분석 및 테스트와 같은 다양한 개발자 작업도 지원합니다.
Dart: 언어
Dart 언어는 타입 안전합니다. 변수의 값이 항상 변수의 정적 타입과 일치하도록 하기 위해 정적 타입 검사를 사용합니다. 때로는 이를 사운드 타이핑(sound typing)이라고도 합니다. 타입은 필수적이지만 타입 주석은 타입 추론을 통해 선택적으로 사용할 수 있습니다. Dart 타이핑 시스템은 런타임 검사와 결합된 동적 타입 사용을 허용하여 실험 중이거나 특히 동적해야 하는 코드에 유용할 수 있습니다.
Dart는 기본적으로 사운드 널 안전 기능을 내장하고 있습니다. 이는 값이 널(null)일 수 없다는 것을 명시하지 않는 이상 널이 될 수 없음을 의미합니다. 사운드 널 안전을 통해 Dart는 정적 코드 분석을 통해 런타임에서의 널 예외로부터 보호할 수 있습니다. 다른 많은 널 안전 언어와 달리 Dart는 변수가 널이 아닌 것으로 결정되면 해당 변수는 결코 널이 될 수 없습니다. 디버거에서 실행 중인 코드를 검사하면 널이 아닌 여부가 런타임에서 유지되는 것을 볼 수 있으므로 사운드 널 안전이 유지됩니다.
다음 코드 샘플은 라이브러리, 비동기 호출, 널 가능 및 널 불가능 타입, 화살표 문법, 생성기, 스트림 및 게터와 같은 여러 Dart 언어 기능을 소개합니다. 언어에 대해 더 알아보려면 Dart 언어 투어를 살펴보세요.
번역 품질이 좋지 않지만 시간이 없으니 개발자라면 알잘딱깔센 이해하고 넘어가야 한다.
import 'dart:math' show Random;
void main() async {
print('Compute π using the Monte Carlo method.');
await for (final estimate in computePi().take(100)) {
print('π ≅ $estimate');
}
}
/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch = 100000}) async* {
var total = 0; // Inferred to be of type int
var count = 0;
while (true) {
final points = generateRandom().take(batch);
final inside = points.where((p) => p.isInsideUnitCircle);
total += batch;
count += inside.length;
final ratio = count / total;
// Area of a circle is A = π⋅r², therefore π = A/r².
// So, when given random points with x ∈ <0,1>,
// y ∈ <0,1>, the ratio of those inside a unit circle
// should approach π / 4. Therefore, the value of π
// should be:
yield ratio * 4;
}
}
Iterable<Point> generateRandom([int? seed]) sync* {
final random = Random(seed);
while (true) {
yield Point(random.nextDouble(), random.nextDouble());
}
}
class Point {
final double x;
final double y;
const Point(this.x, this.y);
bool get isInsideUnitCircle => x * x + y * y <= 1;
}
이 코드는 Dart 언어를 사용하여 몬테 카를로(Monte Carlo) 메서드를 사용하여 원주율(π)을 계산하는 예제를 보여줍니다. 이 코드는 원주율의 값을 추정하기 위해 점을 무작위로 생성하고, 단위 원 안에 포함되는 점의 비율을 사용하여 원주율을 추정합니다.
import 'dart:math' show Random;: Dart의 math 라이브러리에서 Random 클래스만 가져옵니다.
void main() async { ... }: main 함수가 정의되어 있으며, 비동기 코드(async)로 작성되어 있습니다. 이 함수는 시작점으로 사용되며, 몬테 카를로 메서드를 사용하여 원주율을 계산하고 결과를 출력합니다.
Stream< double > computePi({int batch = 100000}) async { ... }: computePi 함수는 스트림을 반환하며, 몬테 카를로 메서드를 사용하여 원주율 값을 추정합니다. batch 매개변수는 한 번에 생성할 무작위 점의 수를 나타냅니다. async 키워드는 이 함수가 비동기적으로 값을 생성하는 제너레이터 함수임을 나타냅니다.
Iterable< Point > generateRandom([int? seed]) sync { ... }: generateRandom 함수는 무작위 점을 생성하는 이터러블(Iterable)을 반환합니다. 이 함수는 동기적으로(sync) 값을 생성합니다. seed 매개변수는 난수 생성에 사용되는 시드값을 지정합니다.
class Point { ... }: Point 클래스는 2D 점을 나타내며, 점의 좌표와 해당 점이 단위 원 내에 있는지 여부를 확인하는 메서드를 제공합니다.
코드의 주요 동작은 computePi 함수에서 이루어집니다. 이 함수에서는 무한 루프를 사용하여 무작위 점을 생성하고 단위 원 내에 포함된 점의 수를 계산한 후, 이를 토대로 원주율(π) 값을 계산하여 스트림으로 반환합니다. main 함수에서는 이 스트림에서 원주율 값을 100번까지 출력합니다.
이 코드는 몬테 카를로 메서드를 사용하여 원주율을 추정하는 간단한 예제로, 스트림과 제너레이터를 활용하여 비동기적인 작업을 수행하는 방법을 보여줍니다.
Dart: 라이브러리
Dart는 다양한 일상적인 프로그래밍 작업을 위한 핵심 라이브러리 세트를 갖추고 있습니다:
모든 Dart 프로그램에 대한 내장 타입, 컬렉션 및 기타 핵심 기능 (dart:core)
큐, 연결 리스트, 해시맵 및 이진 트리와 같은 더 풍부한 컬렉션 유형 (dart:collection)
JSON 및 UTF-8과 같은 다른 데이터 표현 간의 변환을 위한 인코더 및 디코더 (dart:convert)
수학 상수 및 함수, 그리고 난수 생성 (dart:math)
파일, 소켓, HTTP 및 기타 비웹 응용 프로그램을 위한 I/O 지원 (dart:io)
Future 및 Stream과 같은 클래스를 사용한 비동기 프로그래밍 지원 (dart:async)
고정 크기 데이터 (예: 부호 없는 8바이트 정수)를 효율적으로 처리하는 목록 및 SIMD(단일명령 다중데이터) 숫자 유형 (dart:typed_data)
다른 C 스타일 인터페이스를 가진 다른 코드와의 상호 운용성을 위한 외부 함수 인터페이스 (dart:ffi)
메모리를 공유하지 않는 독립적인 워커인 아이솔레이트(isolates)를 사용한 동시 프로그래밍 (dart:isolate)
브라우저 및 Document Object Model (DOM)과 상호 작용해야 하는 웹 기반 응용 프로그램을 위한 HTML 요소 및 기타 리소스 (dart:html)
핵심 라이브러리 외에도 다양한 API가 포함된 포괄적인 패키지 세트를 통해 많은 기능이 제공됩니다. Dart 팀은 다음과 같은 유용한 보조 패키지를 많이 출판합니다:
characters
intl
http
crypto
markdown
또한, 제 3자 출판사 및 넓은 커뮤니티는 XML, Windows 통합, SQLite, 압축과 같은 기능을 지원하는 수천 개의 패키지를 게시합니다.
Dart: 플랫폼
Dart의 컴파일러 기술을 통해 코드를 다양한 방식으로 실행할 수 있습니다:
네이티브 플랫폼: 모바일 및 데스크톱 장치를 대상으로 하는 앱의 경우, Dart는 Dart VM(가장 JIT 컴파일)과 기계 코드 생성을 위한 미리 컴파일(AOT) 컴파일러를 모두 포함합니다.
웹 플랫폼: 웹을 대상으로 하는 앱의 경우, Dart는 개발 또는 프로덕션 목적으로 컴파일할 수 있습니다. 웹 컴파일러는 Dart를 JavaScript로 변환합니다.
플러터 프레임워크는 다트 플랫폼을 기반으로 하는 인기있는 멀티 플랫폼 UI 툴킷으로, iOS, Android, macOS, Windows, Linux 및 웹에서 실행되는 UI 경험을 구축하기 위한 도구 및 UI 라이브러리를 제공합니다.
Dart 네이티브 (머신 코드 JIT 및 AOT)
개발 중에 빠른 개발자 사이클은 반복에 중요합니다. Dart VM은 점진적 다시 컴파일(JIT)과 라이브 메트릭 수집(DevTools 제공)을 가능하게 하는 라이브 디버깅 지원을 포함한 JIT 컴파일러를 제공합니다.
앱이 프로덕션에 배포될 준비가 되었을 때 (앱 스토어에 발행하거나 프로덕션 백엔드에 배포하는 경우), Dart 미리 컴파일(AOT) 컴파일러는 네이티브 ARM 또는 x64 기계 코드로 컴파일할 수 있습니다. AOT 컴파일된 앱은 일관되고 짧은 시작 시간을 갖고 시작합니다.
AOT 컴파일된 코드는 효율적인 Dart 런타임 내에서 실행되며, 사운드 Dart 타입 시스템을 적용하고 빠른 객체 할당과 세대별 가비지 수집을 통해 메모리를 관리합니다.
Dart 웹 (JavaScript 개발 및 프로덕션)
Dart 웹은 JavaScript를 기반으로 하는 웹 플랫폼에서 Dart 코드를 실행하는 기능을 제공합니다. Dart 웹에서는 Dart 코드를 JavaScript 코드로 컴파일하여 브라우저에서 실행됩니다. 예를 들어 Chrome 내부의 V8에서 실행됩니다.
Dart 웹에는 두 가지 컴파일 모드가 있습니다:
빠른 개발 사이클을 가능하게 하는 점진적 개발 컴파일러
데드 코드 제거와 같은 기술을 통해 빠르고 압축된 배포용 JavaScript로 Dart 코드를 컴파일하는 최적화 프로덕션 컴파일러
다트 런타임
다른 플랫폼을 사용하든, 코드를 어떻게 컴파일하든, 코드를 실행하기 위해서는 Dart 런타임이 필요합니다. 이 런타임은 다음과 같은 중요한 작업을 담당합니다:
메모리 관리: Dart는 사용되지 않는 메모리를 가비지 컬렉터(GC)에 의해 회수하는 관리형 메모리 모델을 사용합니다.
Dart 타입 시스템 강제 적용: 대부분의 Dart 타입 검사는 정적(컴파일 타임)이지만 일부 타입 검사는 동적(런타임)입니다. 예를 들어 Dart 런타임은 타입 검사 및 캐스트 연산자를 통해 동적 검사를 강제합니다.
아이솔레이트 관리: Dart 런타임은 주로 코드가 실행되는 메인 아이솔레이트와 앱이 생성하는 다른 아이솔레이트를 제어합니다.
네이티브 플랫폼에서는 Dart 런타임이 자체 포함된 실행 가능 파일 내에 자동으로 포함되며, dart run 명령에서 제공하는 Dart VM의 일부입니다.
시간이 되면 웬만하면 원문을 읽으세요...