Chrome

โครงการ Chromium ที่เป็นโครงการต้นน้ำของเบราว์เซอร์ Chrome ประกาศเริ่มรองรับไลบรารีภาษา Rust เป็นจุดเริ่มต้นของการใช้ภาษา Rust เพื่อเพิ่มความปลอดภัยให้ซอฟต์แวร์โดยรวม

การใช้งานช่วงแรกจะเป็นการใช้งานทางเดียว นั่นคือตัวโค้ด Chromium หลักที่เป็น C++ จะเรียกไลบรารีที่เป็นภาษา Rust ได้แต่ไลบรารีเหล่านั้นห้ามเรียกโค้ด C++ อื่นอีก และโค้ด Rust ที่ใช้งานจะเป็นส่วนประกอบที่แยกเฉพาะทาง (standalone components) เท่านั้น ไม่ใช่ส่วนที่เป็นแกนหลักของตัวเบราว์เซอร์ โดยทั่วไปไลบรารีเหล่านี้มักรับผิดชอบงานเฉพาะทางเท่านั้น

การใช้งานโค้ด Rust มากกว่านี้จะต้องมีการปรับโครงสร้างค่อนข้างมาก เพราะภาษา Rust สามารถจัดการหน่วยความจำโดยไม่ต้องการ garbage collector ได้เพราะแนวคิดสองอย่าง ได้แก่ อายุของตัวแปร (lifetime) และความเป็นเจ้าของ (exclusive mutability) แต่ในโครงสร้างของเบราว์เซอร์ Chrome นั้นมี pointer ที่ชี้ไปยังออปเจกต์เดียวกันหลายจุดและแก้ไขข้อมูลได้จากหลายส่วนพันกันไปมา การปรับโครงสร้างโค้ด C++ ให้ทำงานเข้ากับภาษา Rust ได้จึงเป็นการปรับโครงสร้างขนานใหญ่  ตอนนี้เองกูเกิลก็ลงทุนพัฒนาโครงการอย่าง Crubit ที่เชื่อมภาษา C++ เข้ากับ Rust ได้สองทางอยู่ แต่ก็ยังเป็นโครงการระดับทดลองเท่านั้น

ที่มา - Google Security Blog

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
MuvMi (Urban Mobility Tech Co.,Ltd.) company cover
MuvMi (Urban Mobility Tech Co.,Ltd.)
Shape the future of urban mobility towards affordable, clean, and safe solutions
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH company cover
LTMH
LTMH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

mr_tawan Sat, 14/01/2023 - 21:13

หลาย ๆ ทีมมองไกลไปถึงขั้นย้ายภาษา ซึ่งคิดว่ามีความเสี่ยงเหมือนกัน (แต่ไม่เสี่ยงเท่า Servo ที่เล่นเขียนใหม่หมดทุกอย่างเลยยังติดอยู่ในตมอยู่จนถึงตอนนี้) ผมก็ยังมองว่า เอ... ลองเริ่มจาก modernize codebase ก่อนมั้ย ?

C++ ในปัจจุบันเอง ก็มีเรื่อง object lifetime เหมือนกัน (stack-base, smart pointer, etc.) แต่ถ้าคนเขียนยังคิดว่า เฮ้ถ้าก๊อปปี้เยอะ ๆ มันจะช้านะ หรือ เอ พอใช้ unique pointer เยอะ ๆ แล้วมันน่ารำคาญ (เพราะต้องคอยสร้าง weak pointer เวลาส่งให้คนอื่นใช้)

ส่วนเรื่อง mutability ผมว่าไม่ใช่เรื่องใหม่ แต่คนก็รำคาญเหมือนกัน เพราะมันต้องพิมพ์ keyword เพิ่ม ก็เลยแบบลืมพิมพ์บ้างอะไรบ้าง คิดว่าการใช้ static analysis มาช่วยก็น่จะช่วยได้มากพอสมควร

แต่จุดอ่อนของ C++ จริง ๆ น่าจะเป็นการที่มันมีฟีเจอร์มากมาย เพราะเป็นภาษาเก่า แต่ในทางกลับกันฟีเจอร์ที่คนมองหาก็อาจจะไม่มี (เช่น string manipulation ของ C++ นี่ห่วยมากๆ แค่ search string ยังยากเลย) มันก็เลยกลายเป็นภาษาที่เข้าถึงได้ยาก หาคนสานต่อได้ยาก

แต่เอาจริง ก็มีคนเริ่มพูดถึง C++/2 กันแล้ว ตัดฟีเจอร์ที่ไม่ได้ใช้จริง หรือใช้ไม่ได้จริงทิ้งไป (C++ มีฟีเจอร์ที่เคยถูกตัดทิ้งมาก่อนบ้าง เช่น Garbage Collection) แต่ถ้าจะไปขั้นนั้น ไป Rust แทนก็อาจจะดีกว่า (แต่ project governance อาจจะไม่เปิดเผยเท่า C++ ซึ่งเป็นมาตรฐาน ISO อยู่ ณ.ตอนนี้ (ซึ่งเป็นสาเหตุว่าทำไมมันพัฒนาช้าเหมือนกัน))

ณ.จุดนี้ผมว่า Rust ก็เหมือนกับสมัยที่โปรเจคเริ่มเปลี่ยนจาก C ไปเป็น C++ แหละ (แต่รอบนั้นอาจจะทำได้เนียนกว่า เนียนจนกระทั่งบางคนไม่รู้ว่าตัวเองใช้ C++ อยู่ ไม่ใช่ C) แต่สุดท้ายแล้วโปรเจคที่เป็น C ตอนนี้ก็ยังมีอยู่พอสมควร

Servo ไม่ค่อยขยับแล้วจริง แต่ว่าชิ้นส่วนบางชิ้นของ Servo ก็เข้าไปอยู่ใน Firefox หลายปีแล้วครับ ปูมที่เอามารวมดูจาก Bugzilla ได้ด้วย หรืออ่านจากโพสต์นี้ที่เป็น Blog สรุปก็ได้ครับ

ในประเด็นนั้นผมเข้าใจครับ แต่ผมก็อยากให้เห็นว่า บางทีการเล่นสร้างทุกอย่างตั้งแต่ติดลบมันก็ไม่เหมาะกับโปรเจคขนาดใหญ่ครับ (โดยเฉพาะในองค์กรณ์ที่ไม่ได้มีเงินทุนให้เผาเล่นเยอะขนาดนั้น)

ทำทุกอย่างหมดไม่ไหวจริงครับ ซึ่งผมว่าคนที่ทำ Servo ทราบครับ เพราะว่าอย่างน้อยเขาไม่ได้ทำ ทำ JavaScript engine ยังใช้ Gecko เหมือนเดิม แต่ขนาดว่าตัด Gecko ออกแล้วงานมันเยอะเกินไปอยู่ดีครับ และหลายอย่างก็เป็นงานละรายละเอียด ทำนองว่าเขียน C ธรรมดาก็ได้ เช่น การเลือกฟอนท์ตั้งต้นของแต่ละระบบปฏิบัติการ ดังนั้นผมคิดว่าเริ่มทำทีละโมดูลแบบที่ Chrome ทำก็ดีแล้วครับ

btoy Sun, 15/01/2023 - 18:43

In reply to by mr_tawan

พอต้องมาจับ C++ เพิ่งเข้าใจเลยครับว่าฟีเจอร์มันเยอะมากเป็นยังไง และก็จริงที่ฟีเจอร์พื้นฐานของ string ใช้งานยากกว่าภาษาอื่นเยอะ แต่อย่างว่า C++ มีออพชั่นสำหรับตอน compile เยอะมาก

ผมเห็น CPP2 ก็ดูน่าสนใจนะ เหมือนทีมพัฒนามีความตั้งใจที่จะรักษาความเป็น C++ ไว้ในขณะที่โปรแกรมเมอร์ก็ไม่ต้องปวดหัวกับการเรียนรู้ Library จำนวนมหาศาล

ใช่ครับ พอดีเป็นการพัฒนาแบบต่อยอดจากระบบที่มีอยู่แล้วอีกที compiler เป็นแบบของเค้าเอง รองรับ ISO C++14 แล้วก็ library หลักจากตัวแพลตฟอร์ม (ลงอะไรเพิ่มไม่ค่อยได้ด้วย เนื่องจาก policy และรันบน Solaris)

ปล. แต่ผมเป็น C++ programmer มือใหม่น่ะครับ เมนจริงๆไม่ใช่ภาษานี้ หลายๆอย่างน่าจะมาจากที่ผมไม่รู้เองด้วยแหละ

ท่านอยู่ในสภาพที่น่าเห็นใจครับ ใช้ libboost ไม่ได้ทั้ง ๆ ที่ libboost ก็ใช้กันบน Solaris ได้

[นอกเรื่อง] โปรแกรมด้าน text processing ใช้ C++ กันเยอะครับ จนถึงทุกวันนี้ เท่าที่ผมเคยเห็นมาเกือบทุกโครงการใช้ libboost ครับ ส่วนที่เหลือใช้ Qt เพื่อที่จะได้ใช้ QString

พอใช้ unique pointer เยอะ ๆ แล้วมันน่ารำคาญ (เพราะต้องคอยสร้าง weak pointer เวลาส่งให้คนอื่นใช้)

case นี้ควรจะใช้ shared pointer นะครับ
และมันมี idiom case นี้ให้ด้วย https://youtu.be/QGcVXgEVMJg

ส่วน weak pointer + shared pointer เอาไว้ใช้กับ thread handler ส่วนใหญ่ (ใช้แก้ทาง shared pointer ที่เป็น atomic operation ไม่ต้อง increase reference counter)
https://stackoverflow.com/a/34302850/5391421

จะว่าไป ถ้าว่าด้วยเรื่อง memory safe C++ น่าจะ safe กว่า Rust ด้วยซ้ำ ถ้าใช้ smart pointer เป็น

ผมเขียน C++ ไม่เป็นได้แค่เขียนเล่น เมื่อ 5 ปีที่แล้วลองทดสอบ unique_ptr ดู ไม่รู้ว่าล้าสมัยไปแล้วหรือเขียนผิดหรือเปล่านะครับ คือลองเขียนให้โปรแกรมใช้ตัวแปรที่โดน move ไปแล้วครับตามด้านล่าง

int
main(int argc, char* argv[])
{
std::unique_ptrstd::string s(new std::string("toto"));
std::unique_ptrstd::string p = std::move(s);
std::cout << *(s.get()) << std::endl;
return 0;
}

ปรากฎว่า compile ผ่านครับ แต่รันไม่ได้ซึ่งก็ไม่ควรได้อยู่แล้ว

$ g++ -Wall -std=c++17 move.cxx
$ ./a.out
Segmentation fault (core dumped)

ในกรณีแบบนี้ Rust compiler จะตรวจให้ได้เลยครับ

อีกกรณีหนึ่งที่ผมคาดว่า C++ ก็น่าจะตรวจเวลา compile ไม่ได้คือในกรณี share mutable variable กันหลาย ๆ thread ซึ่งใน Rust ตรวจให้ได้ครับ

โค้ดดูยากหน่อยอย่างไรลองดูใน gist ได้นะครับ

hisoft Mon, 16/01/2023 - 18:19

In reply to by veer

ใส่ code ใน markdown ใช้

```cpp
// code
```

ครอบครับ เช่น

int
main(int argc, char* argv[])
{
  std::unique_ptr<std::string> s(new std::string("toto"));
  std::unique_ptr<std::string> p = std::move(s);
  std::cout << *(s.get()) << std::endl;
  return 0;
}

btoy Mon, 16/01/2023 - 18:57

In reply to by veer

ตะกี้ผมลองรันเล่นๆ ด้วย g++ ก็ยัง compile ผ่านแต่รันไม่ได้เหมือนเดิมครับ

std::unique_ptr<std::string> s(new std::string("abc"));
std::unique_ptr<std::string> p = std::move(s);
std::cout << *(s.get()) << std::endl;

เดามั่วๆว่า C++ compiler จะยังไม่ได้เน้นเรื่อง borrow checker มั้ง Rust ที่เน้นตรงนี้

ผิดอย่างแรงครับ ไม่มีใครใช้ unique pointer แบบนี้แน่นอนครับ

  • ไม่มีค่อยใครใช้ move กับ unique pointer เพราะใน scope เดี๋ยวกันไม่ควรจะมี reference เดียวกันมากกว่า 1
  • โคตร rare ที่จะมีคนใช้ raw pointer จาก smart pointer
  • unique pointer == ownership concept ของ Rust
  • C++ มี life time object แบบ count reference ให้ (น่าจะเป็น share mutable variable คุณว่า) คือ shared pointer ซึ่งค่อนข้างสะดวกเมื่อใช้กับ thread ที่ไม่รู้ว่าจะจบเมื่อไร ผมลองหาใน STD reference ของ Rust แล้วหาไม่เจอ tool แบบนี้
  • weak pointer ของ C++ จุดประสงค์หลักเลยคือป้องกัน dangling pointer เป็น feature ของ memory safe อย่างหนึ่ง แต่หลายคนยังไม่เข้าใจกว่าจะใช้เมื่อไร
  • ผมบอกไปแล้วจะให้ safe กว่า Rust ต้องใช้ smart pointer เป็นน่ะครับ มันไม่ได้ safe by default

ผมปกติผมไม่ได้เขียน C++ เป็นปกติ เลย format, ตั้งชื่อแหวกชาวบ้านหน่อยนะครับ

ไม่เป็นไรครับ โครงการ C++ ก็ดูตั้งชื่อจัด format กันหลากหลายอยู่แล้วครับ

https://godbolt.org/z/9srGMWfaq

ขอบคุณครับ อย่างน้อยก็ทำให้เห็นว่า compiler กันไม่ให้ auto obj2 = obj1 ได้ แต่ยังไม่เข้าใจว่าทำถึงจะ safe กว่า Rust ครับ

เรื่อง shared_ptr กับ atomic<shared_ptr> ผมไม่เคยลองเลยครับ แต่เท่าที่อ่านมาไม่มีสิ่งที่เหมือนกันเสียทีเดียวใน Rust ครับ แต่ว่ากรณีที่ใช้ reference counting ข้าม thread ปกติก็ใช้ Arc กันครับ หรือถ้ามาการเขียนตัวแปรนั้นด้วยก็ใช้ Arc<Mutex<...>> หรือ Arc<RwLock<...>> ครับ

หลายอย่างที่ผมเคยคิดว่าไม่น่าจะมีใครเขียนออกมาแบบนั้นได้ แต่เอาจริง ๆ ก็เจอ Rust มันมาช่วยป้องกันส่วนนี้ได้ครับ เช่น โค้ดควรจะใช้ Arc<RwLock<...>> แต่ไม่ใช้ compiler ก็จะไม่ให้ผ่าน

ทีแรกผมคิดว่า Rust ไม่มี Object life time แบบ count reference ครับ (มี memory safe feature มากกว่าก็ควร safe กว่า)
แต่ Arc ที่คุณบอกล่ะครับคือสิ่งที่ผมหาไม่เจอ โถมองผ่านๆ ผมก็นึกว่า graphic function

ขอบคุณสำหรับความรู้ครับ

ว่าแต่คำสั่ง auto นี่ สำหรับมือใหม่ ผมค่อนข้างสับสนว่าควรเริ่มใช้จากจุดไหน ถึงจะทำให้ code อ่านไม่ยากเกินไป เท่าที่อ่านใน SO ส่วนใหญ่ก็จะบอกว่าให้ใช้ในจุดที่เรารู้ได้ง่ายๆว่า object ที่จะสร้างขึ้นเป็น type อะไร ตอนนี้เลยพยายามยังไม่ใช้ไปก่อน

ปัญหาของ C++ อย่างหนึ่ง คิดแค่ตอน runtime ไม่พอ ต้องคิดถึง compile time เยอะกว่าภาษาอื่น
เพราะมันมี keyword, feature ที่ใช้เฉพาะตอน compile เยอะมาก inline, constexpr, template, ...

auto ก็เป็นหนึ่งในนั้น
ฉะนั้น ถ้าใช้ auto แล้วไม่ error ตอน compile นี้ไม่มีปัญหาครับ ไม่มี overhead ตอน runtime (ถ้าเขียนไปนานๆ จะเจอ typename ยาวเป็นบรรทัด auto ช่วยได้เยอะ)
compiler มันจะเดาและ assign type ให้ตอน compile
แต่ต้องระวัง เวลาใช้กับอะไรที่ type มันไม่ชัดเจน อย่าง literal

auto str = "string";//  ผมอยากให้เป็น std::string แต่ assign "const char*" 
auto A = 0x41;//  ascii A ผมอยากให้เป็น char แต่ assign "int"
auto lamda = [](){ return 10;}; //"int anyfnname()"