Flowistry เป็นเครื่องมือที่วิเคราะห์การไหลของข้อมูลของโปรแกรมสนิม Flowistry เข้าใจดีว่าเป็นไปได้หรือไม่ที่รหัสชิ้นหนึ่งจะส่งผลกระทบต่ออีกรหัสหนึ่ง Flowistry รวมเข้ากับ IDE เพื่อให้ "โหมดโฟกัส" ซึ่งช่วยให้คุณมุ่งเน้นไปที่รหัสที่เกี่ยวข้องกับงานปัจจุบันของคุณ
ตัวอย่างเช่น GIF นี้แสดงโหมดโฟกัสเมื่ออ่านฟังก์ชั่นที่สหภาพแรงงานสองชุดรวมกัน:

เมื่อผู้ใช้คลิกตัวแปรหรือนิพจน์ที่กำหนด Flowistry จะจางหายไปรหัสทั้งหมดที่ ไม่ส่งผลต่อ รหัสนั้นและ ไม่ได้รับอิทธิพลจาก รหัสนั้น ตัวอย่างเช่น orig_len ไม่ได้รับอิทธิพลจาก for-loop ในขณะที่ set.len() คือ
Flowistry จะมีประโยชน์เมื่อคุณอ่านฟังก์ชั่นที่มีรหัสจำนวนมาก ตัวอย่างเช่น GIF นี้แสดงฟังก์ชั่นจริงในคอมไพเลอร์สนิม หากคุณต้องการที่จะเข้าใจบทบาทของอาร์กิวเมนต์เฉพาะกับฟังก์ชันการไหลสามารถกรองรหัสส่วนใหญ่เป็นไม่เกี่ยวข้อง:

อัลกอริทึมที่พลังการไหลถูกตีพิมพ์ในกระดาษ "การไหลของข้อมูลแบบแยกส่วนผ่านการเป็นเจ้าของ" ที่ PLDI 2022
สารบัญ
Flowistry มีให้บริการเป็นปลั๊กอิน VSCODE คุณสามารถติดตั้ง Flowistry จาก Visual Studio Marketplace หรือ Open VSX Registry ใน vscode:
หมายเหตุเกี่ยวกับการสนับสนุนแพลตฟอร์ม: Flowistry ยังไม่รองรับ Nixos Flowistry ไม่สามารถให้ไบนารีที่สร้างไว้ล่วงหน้าสำหรับเป้าหมาย ARM เช่น M1 Macs ดังนั้นจึงต้องติดตั้ง Flowistry ตั้งแต่เริ่มต้นในเป้าหมายเหล่านี้ (ทำเพื่อคุณ แต่จะใช้เวลามากกว่าปกติสองสามนาที)
หรือคุณสามารถติดตั้งได้จากแหล่งที่มา:
# Install flowistry binaries
git clone https://github.com/willcrichton/flowistry
cd flowistry
cargo install --path crates/flowistry_ide
# Install vscode extension
cd ide
npm install
npm run build
ln -s $(pwd) ~/.vscode/extensions/flowistry
หากคุณสนใจในการวิเคราะห์พื้นฐานคุณสามารถใช้ลัง flowistry ที่เผยแพร่ไปยัง Crates.io: https://crates.io/crates/flowistry
เอกสารนี้เผยแพร่ที่นี่: https://willcrichton.net/flowistry/flowistry/
หมายเหตุ: docs.rs ไม่สนับสนุนเอกสารสำหรับลังที่ใช้
#![feature(rustc_private)]ดังนั้นเราจึงต้องโฮสต์ด้วยตัวเอง
โปรดทราบว่า Flowistry ล่าสุดมี Rust 1.73 เวอร์ชันสนิมที่รองรับ สูงสุด Flowistry ไม่รับประกันว่าจะทำงานร่วมกับคุณสมบัติที่นำมาใช้หลังจาก 1.73
เมื่อคุณติดตั้งการไหลให้เปิดพื้นที่ทำงานสนิมใน VSCODE คุณควรเห็นไอคอนนี้ในแถบเครื่องมือด้านล่าง:

Flowistry เริ่มต้นด้วยการตรวจสอบประเภทของคุณ อาจใช้เวลาไม่กี่นาทีหากคุณมีการพึ่งพามากมาย
หมายเหตุ: ผลการตรวจสอบประเภทการไหลถูกแคชในไดเรกทอรี
target/flowistryหากคุณลบโฟลเดอร์นี้การไหลจะต้องคำนวณประเภทใหม่ นอกจากนี้สำหรับ codebase ขนาดใหญ่ไดเรกทอรีนี้อาจใช้พื้นที่ดิสก์ในปริมาณที่พอเหมาะ
เมื่อ flowistry บู๊ตขึ้นไอคอนการโหลดจะหายไป จากนั้นคุณสามารถเข้าสู่โหมดโฟกัสได้โดยเรียกใช้คำสั่ง "Toggle Focus Mode" โดยค่าเริ่มต้นแป้นพิมพ์ลัดคือ Ctrl+R Ctrl+A (⌘+R ⌘+A บน Mac) หรือคุณสามารถใช้เมนูบริบทของการไหล:

ในโหมดโฟกัสการไหลจะคำนวณการไหลของข้อมูลภายในฟังก์ชั่นที่กำหนดโดยอัตโนมัติเมื่อคุณใส่เคอร์เซอร์ที่นั่น เมื่อการวิเคราะห์การไหลเสร็จสิ้นแถบสถานะจะมีลักษณะเช่นนี้:

หมายเหตุ: การไหลอาจช้าลงเล็กน้อยสำหรับฟังก์ชั่นขนาดใหญ่ อาจใช้เวลาถึง 15 วินาทีในการวิเคราะห์
Flowistry ทำให้สิ่งที่คุณต้องการมุ่งเน้นตามเคอร์เซอร์ของคุณ ดังนั้นหากคุณคลิกที่ตัวแปรคุณควรเห็นพื้นที่โฟกัสของตัวแปรนั้น Flowistry จะเน้นรหัสที่มุ่งเน้นเป็นสีเทาจากนั้นก็จางหายไปจากรหัสนอกภูมิภาคโฟกัส ตัวอย่างเช่นเนื่องจากเคอร์เซอร์ของผู้ใช้อยู่ใน view_projection ตัวแปรนั้นจะถูกเน้นด้วยสีเทาและจะแสดงพื้นที่โฟกัส

บางครั้งคุณต้องการให้พื้นที่โฟกัสอยู่ในที่ที่อยู่และคลิกที่รหัสอื่นเพื่อตรวจสอบโดยไม่ต้องเปลี่ยนโฟกัส เพื่อจุดประสงค์นี้การไหลมีแนวคิดของ "เครื่องหมาย" เมื่อคุณเลือกรหัสเพื่อมุ่งเน้นคุณสามารถเรียกใช้คำสั่ง "Set Mark" (Ctrl+R Ctrl+S / ⌘+R ⌘+S) จากนั้นเครื่องหมายจะถูกตั้งค่าที่ตำแหน่งปัจจุบันของเคอร์เซอร์และโฟกัสจะอยู่ที่นั่นจนกว่าคุณจะเรียกใช้คำสั่ง "UNSET MARK" (CTRL+R CTRL+D / ⌘+R ⌘+D)
หากคุณต้องการแก้ไขรหัสทั้งหมดในภูมิภาคโฟกัสเช่นเพื่อแสดงความคิดเห็นหรือคัดลอกคุณสามารถเรียกใช้คำสั่ง "เลือกภูมิภาคที่เน้น" (Ctrl+R Ctrl+T / ⌘+R ⌘+T) สิ่งนี้จะเพิ่มพื้นที่โฟกัสทั้งหมดลงในการเลือกของบรรณาธิการของคุณ
Flowistry เป็นโครงการวิจัยที่ใช้งานอยู่ในการประยุกต์ใช้การวิเคราะห์การไหลของข้อมูลสำหรับการเกิดสนิม มันมีการพัฒนาอย่างต่อเนื่องในขณะที่เราทดลองใช้เทคนิคการวิเคราะห์และกระบวนทัศน์การโต้ตอบ ดังนั้นจึงไม่ได้ขัดหรือมีประสิทธิภาพเหมือนเครื่องมือเช่น Rust Analyzer แต่เราหวังว่าคุณจะยังคงมีประโยชน์! อย่างไรก็ตามมีข้อ จำกัด ที่สำคัญหลายประการที่คุณควรเข้าใจเมื่อใช้การไหลเพื่อหลีกเลี่ยงความประหลาดใจ
หากคุณมีคำถามหรือปัญหาโปรดยื่นปัญหา GitHub เข้าร่วม Discord ของเราหรือ DM @wcrichton บน Twitter
เมื่อรหัสของคุณมีการอ้างอิงการไหลจะต้องเข้าใจสิ่งที่จุดอ้างอิงถึง Flowistry ใช้ข้อมูลอายุการใช้งานของ Rust เพื่อกำหนดจุดต่อข้อมูล อย่างไรก็ตามโครงสร้างข้อมูลที่ใช้ความไม่แน่นอนภายในเช่น Arc<Mutex<T>> อย่างชัดเจน ไม่ แบ่งปันอายุการใช้งานระหว่างพอยน์เตอร์กับข้อมูลเดียวกัน ตัวอย่างเช่นในตัวอย่างนี้:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ; Flowistry สามารถ กำหนดได้ว่า *x.lock().unwrap() = 1 คือการกลายพันธุ์ของ x แต่ ไม่สามารถ ระบุได้ว่าเป็นการกลายพันธุ์ของ y ดังนั้นหากคุณมุ่งเน้นไปที่ y การมอบหมายให้ 1 จะจางหายไปแม้ว่ามันจะเกี่ยวข้องกับมูลค่าของ y
เรากำลังค้นคว้าวิธีการเพื่อเอาชนะข้อ จำกัด นี้ แต่ตอนนี้เพิ่งทราบว่านี่เป็นกรณีหลักที่รู้ว่าการไหลเป็นที่ทราบกันดีว่าให้คำตอบที่ไม่ถูกต้อง
การวิเคราะห์ของ Flowistry พยายามที่จะรวมรหัสทั้งหมดที่ อาจ มีอิทธิพลต่อจุดโฟกัส การวิเคราะห์นี้ทำให้สมมติฐานจำนวนมากด้วยเหตุผลทั้งในทางปฏิบัติและพื้นฐาน ตัวอย่างเช่นในตัวอย่างนี้:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; หากคุณมุ่งเน้นไปที่ v On Line 3 จะรวม v.get_mut(0) เป็นการดำเนินการที่สามารถแก้ไขได้ v เหตุผลก็คือการไหลไม่ได้วิเคราะห์ร่างกายของฟังก์ชั่นที่เรียกว่าจริง ๆ แต่ค่อนข้างประมาณตามลายเซ็นประเภทของพวกเขา เนื่องจาก get_mut ใช้เวลา &mut self เป็นอินพุตจึงถือว่าเวกเตอร์ สามารถ แก้ไขได้
โดยทั่วไปคุณควรใช้โหมดโฟกัสเป็นเครื่องมือการตัดแต่งกิ่ง หากรหัสจางหายไปคุณไม่ต้องอ่าน (ลบข้อ จำกัด ที่กล่าวถึงข้างต้น!) หากมันไม่ได้จางหายไปก็อาจเกี่ยวข้องกับงานของคุณ
การไหลทำงานโดยการวิเคราะห์กราฟ MIR สำหรับฟังก์ชั่นที่กำหนดโดยใช้ API ของ Rust Compiler จากนั้นส่วนขยาย IDE จะยกผลการวิเคราะห์จากระดับ miR กลับสู่ระดับต้นทาง อย่างไรก็ตามข้อมูลจำนวนมากเกี่ยวกับโปรแกรมจะหายไปในการเดินทางจากซอร์สโค้ดไปยังเมียร์
ตัวอย่างเช่นหากแหล่งที่มามีนิพจน์ foo.whomp.bar().baz() เป็นไปได้ว่าตัวแปรชั่วคราวจะถูกสร้างขึ้นเฉพาะสำหรับนิพจน์ foo.whomp.bar() ดังนั้นหากผู้ใช้เลือก foo การไหลอาจไม่สามารถระบุได้ว่าสิ่งนี้สอดคล้องกับสถานที่ mir ที่แสดงถึง foo
นี่คือเหตุผลที่ส่วนขยาย IDE เน้นรหัสที่เน้นด้วยสีเทาเพื่อให้คุณสามารถเข้าใจว่าการเลือกเคอร์เซอร์ของคุณเป็นอย่างไร
Flowistry วิเคราะห์ฟังก์ชั่นเดียวในแต่ละครั้ง หากฟังก์ชั่นมีฟังก์ชั่นอื่น ๆ เช่นคำจำกัดความ fn หรือการปิดหรือโดยปริยายผ่าน Async ดังนั้นการไหลของการไหลจะแสดงเฉพาะภูมิภาคโฟกัสภายในร่างกายฟังก์ชั่นที่เล็กที่สุดที่มีเคอร์เซอร์ของคุณ สิ่งนี้มักจะถูกกำหนดไว้อย่างดีสำหรับคำจำกัดความของฟังก์ชั่นและการปิด แต่อาจทำให้เกิดความสับสนสำหรับ async เนื่องจากขึ้นอยู่กับว่า Rustc ตัดสินใจที่จะแกะสลักฟังก์ชั่น async ของคุณอย่างไร
หาก Rustup ล้มเหลวโดยเฉพาะอย่างยิ่งกับข้อผิดพลาดเช่น "ไม่สามารถเปลี่ยนชื่อไฟล์ที่ดาวน์โหลดได้" นี่อาจเป็นเพราะการไหลของการไหลของ Rustup พร้อมกับเครื่องมืออื่น (เช่น Rust-Analyzer) จนกระทั่ง Rustup#988 ได้รับการแก้ไขแล้วไม่มีทางอัตโนมัติในเรื่องนี้
ในการแก้ปัญหาให้ไปที่บรรทัดคำสั่งและเรียกใช้:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
จากนั้นกลับไปที่ VScode และคลิก "ดำเนินการต่อ" เพื่อให้การไหลของ Flowistry ติดตั้งต่อไป
Rust Analyzer ไม่รองรับ MIR และตัวตรวจสอบยืมซึ่งเป็นส่วนสำคัญของการวิเคราะห์ของ Flowistry ความจริงนั้นไม่น่าจะเปลี่ยนแปลงได้เป็นเวลานานดังนั้นการไหลเป็นเครื่องมือแบบสแตนด์อโลน
ดูข้อ จำกัด สำหรับปัญหาที่ทราบ หากนั่นไม่ได้อธิบายสิ่งที่คุณเห็นโปรดโพสต์ไว้ในปัญหาไฮไลท์ที่ไม่คาดคิดหรือถาม Discord