07/01/2019, 14:36

Tôi đã đóng góp cho Swift Compiler như thế nào

Chắc các bạn đều biết Swift đã được Apple opensource cách đây khá lâu. Điều có có nghĩa là bạn hoàn toàn có thể tham gia đóng góp (contribute) để góp phần xây dựng ngôn ngữ này. Tuy vậy để đến bước gửi PR và được chấp nhận là 1 quãng đường khá dài. Ở bài viết này mình sẽ chia sẻ các rào cản mình ...

Chắc các bạn đều biết Swift đã được Apple opensource cách đây khá lâu. Điều có có nghĩa là bạn hoàn toàn có thể tham gia đóng góp (contribute) để góp phần xây dựng ngôn ngữ này. Tuy vậy để đến bước gửi PR và được chấp nhận là 1 quãng đường khá dài. Ở bài viết này mình sẽ chia sẻ các rào cản mình phải vượt qua khi gửi 1 PR nhỏ xinh đầu tiên đến Apple.

Cơ duyên

Năm ngoái mình có dịp phát biểu tại try! Swift Tokyo 2018 và tham dự vào 1 OpenSource Workshop rất hay dành cho những ai có hứng thú với Swift Compiler. Tại đó có những core contributor của Swift compiler hướng dẫn khá tận tình nên mới vượt qua được những bước đầu tiên. Năm 2019 cũng sắp mở CfP (Call For Paper) nên bạn nào muốn thử thì mạnh dạn nộp bài nhé :smile:

Chuẩn bị tinh thần

  • Swift Compiler chủ yếu viết bằng C++. Nếu bạn có kinh nghiệm với C++ thì quá tuyệt vời, còn nếu không thì vẫn có thể đóng góp vào những phần viết bằng Swift như là Standard Library.
  • Để build đc compiler khá lâu. Ít nhất bạn nên có MacBookPro 15 inch (4 core) và tính kiên nhẫn :smile:
  • Có 2 bước build: full build mất nhiều thời gian và incremental build mất ít thời gian hơn. Tuy nhiên mỗi khi update git thì sẽ phải chạy lại full build 1 lần, vì vậy đừng quên lấy code mới nhất trước khi bắt tay vào làm nhé.
  • Hiểu biết về compiler và Type Programming là 1 lợi thế :sweat_smile:
  • Đọc trước về cấu trức của Swift Compiler: https://academy.realm.io/posts/tryswift-jesse-squires-contributing-open-source-swift/.

Bước 1: Đọc README

Hiển thiên phải không nào, repo của Swift ở đây: https://github.com/apple/swift
Forum thảo luận tính năng mới: https://forums.swift.org/
Bugs List (đã filter theo những bug dễ cho newbie): bugs.swift.org

Bước 2: Thiết lập môi trường

Phần này cơ bản là đọc README cũng làm được, nhưng mình liệt kê theo thứ tự:

  • Download Xcode 10
  • Cài đặt những package cần thiết
brew install cmake ninja
  • Lấy source mới nhất về
mkdir swift-source
cd swift-source
git clone git@github.com:apple/swift.git
git remote add private git@github.com:orakaro/swift.git
utils/update-checkout --clone  # From next time to update: utils/update-checkout 
  • Tạo file Xcode để làm việc ( chưa build )

    utils/build-script -x -r -S
    # or
    utils/build-script --xcode --release-debuginfo --skip-build
    
  • Mở file Xcode project bằng Xcode tại đường dẫn:

    build/Xcode-RelWithDebInfoAssert/swift-macosx-x86_64/Swift.xcodeproj

Và chúc mừng bạn, cuối cùng đã có thể build

utils/build-script -r # Very long
# or
utils/build-script --release-debuginfo

Đi uống cafe và 1-2 tiếng sau quay lại nhá!
Đây là cái mặt mũi Xcode khi mở source của compiler:

IDE

Bước 3: Thiết lập môi trường debug

Khi đã build xong lần đầu tiên thì bạn có thể tự chúc mừng bản thân là phần mất thời gian nhất đã qua. Giờ là hướng dẫn để chúng ta có thể debug Swift compiler dùng Xcode.

  • Mở Xode bên trên tạo 1 scheme mới đặt tên tuỳ ý
  • Edit Scheme > Run Step > Info > Executable > chọn đường dẫn đến build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/bin/swift. Đây là thành quả/phiên bản của ngôn ngữ swift mới đc build lúc nãy alt text
  • Edit Scheme > Run Step > Arguments > thêm đường dẫn đến 1 file source với nội dụng bất kỳ mà bạn muốn chạy. alt text

Đã xong, bây giờ bạn có thể đặt breakpoint tuỳ ý vào C++ source, viết 1 đoạn code bất kỳ trong file test bên trên, ấn nút Debug và mày mò xem Swift Compiler làm gì với đoạn code 1 cách cụ thể :muscle:

Bước 3: Chọn ticket và chiến

Mình chọn 1 ticket rất dễ (hoặc ban đầu tưởng là dễ), thay đổi 1 message lỗi :sweat_smile: https://bugs.swift.org/browse/SR-7015
Mình sẽ không đi sâu vào cụ thể, nhưng tóm tắt lại mình phải thêm 1 message mới, lấy tên hàm tương ứng và cuối cùng là viết test.

  • Build lại Swift Compiler sau khi thay đổi ( không tốn nhiều thời gian )
utils/build-script -rt
  • Chạy test
utils/run-test --build-dir ../build/Ninja-RelWithDebInfoAssert test/expr/cast/cf.swift # Test specific file

Bước 4 Gửi Pull Request

Sửa đã xong và chuẩn bị tinh thần ăn hành thì gửi Pull Request thôi: https://github.com/apple/swift/pull/16088 Sau khoảng hơn 2 chục cái comment thì cuối cùng cũng được chấp nhận và merge vào master. Nghe đồn là thay đổi sẽ được release từ Swift 5 :smile:

Kết luận

Bạn thấy đấy, đóng góp cho opensource hay cho ngôn ngữ không có gì là quá to tát, lần lượt vượt qua từng bước thì cuối cùng cũng đi đến đích. Mình cũng mới chỉ fix 1 bug rất đơn giản, nhưng hi vọng những ghi chú bên trên sẽ có ích khi bạn lần đầu có ý định đóng góp cho Swift compiler. Xong bước này bạn có thể nghĩ tiếp đến viết proposal và thảo luận để implement proposal trong 1 PR to hơn.

Tham khảo

  • swift.org / Swift Compiler Architecture
  • Realm / Contributing to open source Swift
  • Gyb as debugger for Swift Compiler
  • Getting started with swift development
0