|
|
 Rank: มือมืด Groups: Member
Joined: 3/21/2008 Posts: 53 Location: Whenever you code,you've reached my places.
|
Lambda Expression
เป็นชุด Syntax ที่ถูกสร้างมาจาก Lambda Calculus โดยมีจุดประสงค์เพื่อช่วยในการให้นิยามฟังก์ชัน, การใช้งานฟังก์ชันและการเวียนซ้ำ(Recursion)
พูดอย่างง่ายคิอช่วยให้เราสร้างชุดคำสั่งได้จากรูปแบบการนิยามฟังก์ชันที่เหมือนการนิยามฟังก์ชันทางคณิตศาสตร์ หรือการช่วยในการเขียนโปรแกรมเชิงฟังก์ชันนั่นเอง(Functional programming) สำหรับคนที่เคยใช้โปรแกรมพวก Maple, Matlab น่าจะคุ้นน่าคุ้นตาดี
มองอีกมุมหนึ่ง Lambda Expression(ใน C# 3.0) ก็เป็นพัฒนาการขั้นต่อมาของ Anonymous method ใน C# 2.0
โดนใน C# 2.0 นั้นเมื่อเราต้องการสร้างการทำงานเพียงครั้งเดียวและไม่ต้องการใช้ซ้ำหรือแชร์ส่วนของโค้ดร่วมกับส่วนอื่น
เราสามารถสร้างชุดการทำงานเฉพาะที่ซึ่ง จริงๆแล้วสามารถมองเหมือน method หนึ่งได้ แต่จะไม่สามารถอ้างถึงผ่านชื่อ
ของ Method ได้(เพราะว่ามันไม่มีชื่อ) เราจึงเรียกมันว่า Anonymous method (ใช้ delegate อ้างไปยัง method แทน)
ดังตัวอย่างต่อไปนี้
สมมติว่าเราสร้าง List ของ int 1 - 20
List<int> iList = new List<int>();
for (int i = 1; i < 20; ++i)
iList.Add(i);
เราต้องการจะแยกเอาเฉพาะเลขคี่
List<int> oddList1 = iList.FindAll(delegate(int i) { return (i & 1) == 1; });
ในวงเล็บ FindAll คือตัวอย่างการใช้งาน Anonymous method
ซึ่งเราสามารถแทนด้วย Lambda Expression ได้ดังนี้
List<int> oddList2 = iList.FindAll((i) => (i & 1) == 1);
ลองพิมพ์ออกมาดู
oddList1.ForEach((i) => { Console.Write(i+" "); });
oddList2.ForEach((i) => { Console.Write(i+" "); });
ได้ผลลัพธ์
1 3 5 7 9 11 13 15 17 19
ให้สังเกตุรูปแบบการเขียน Lambda Expression
ซึ่งจะมีรูปแบบดังนี้
([ตัวแปร]) => นิพจน์หรือชุดคำสั่ง;
เช่น
(i) => (i & 1) == 1
ความหมายคือ รับค่า parameter เข้าทางตัว i
นำ i ดำเนินการ BitWise And กับ 1 ซึ่งถ้าผลลัพธ์เหลือค่า 1
หมายถึง i เป็นเลขคี่ ซึ่งจะทำให้ตัวดำเนินการ == ให้ค่า true
Lambda Expression นั้นทำให้ C# เริ่มดูเหมือน Functional Language เข้าไปทุกทีแต่
C# นั้นมีข้อดีที่เด่นกว่าภาษาอื่นๆมาก เรียกได้ว่าเป็นภาษาที่รับกับเงื่อนไขทางทฤษฎีและปฏิบัติได้อย่างลงตัวมากๆ
ตัวอย่างเช่นการ มี Unified Type แต่ไม่ทำให้ความเร็วเสียไปเหมือนภาษา Smalltalk
Lambda Expression ก็เช่นกันถึงแม้จะดูเหมือนว่าเราไม่ต้องสนใจ Type ของผลลัพธ์ของ Lambda Expression
แต่จริงๆแล้วมันยังคงเป็น Strong type อยู่
Love = λygh·g(y(y)(h,g), y(y)(h,g))
Code:Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U) = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U) = I(Love(Love)(U,I), Love(Love)(U,I)) = I(Love(Love)(U,I)) Love Combinator!!!!
|
|
 Rank: มือมืด Groups: Member
Joined: 3/21/2008 Posts: 53 Location: Whenever you code,you've reached my places.
|
อาจมีคนสงสัยว่าตัว Lambda expression นี้มีประโยชน์อะไรออกจากทำให้โค้ดมันดูแปลกตา
คำตอบก็คือมีประโยชน์มากสำหรับการเขียนโปรแกรมแบบ stateless ที่ซึ่งจำเป็นมาสำหรับการรองรับ
โปรแกรมที่เป็น Concurrency เพราะว่าทุกอย่างจะถูก pass-by-value และตัว lambda เองเป็น immutable object
ดังนั้นมั่นใจได้ว่าจะไม่เกิด racing conditions จากตัว lambda แน่นอน
บางคนสงสัยอีกว่าตัว lambda นั้นสามารถเขียนโปรแกรมได้ครอบคลุม คือสามารถแทนที่ตัว syntax ของ C# ปกติหรือไม่
คำตอบคือทำได้ แต่จะต้องปรับระบบความคิดกันนิดหน่อย
ดูตัวอย่างเช่นการเขียน recursive function ในรูปของ Lambda expression
http://seethesharp.spaces.live.com/blog/cns!2A7877D6642160EC!171.entry Love = λygh·g(y(y)(h,g), y(y)(h,g))
Code:Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U) = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U) = I(Love(Love)(U,I), Love(Love)(U,I)) = I(Love(Love)(U,I)) Love Combinator!!!!
|
|
Rank: มือเทพ Groups: Member
Joined: 3/6/2008 Posts: 176 Location: TH
|
เดี๋ยวก็มีคนสงสัยอีกว่า Concurrency คืออะไรผมว่าอธิบายยาวไปเลยดีกว่าไหมครับ
ส่วนตัวผมแล้ว Concurrency ผมไม่เคยใช้กับพวก Software เลยเคยใช้แต่กับพวก Hardware (จำพวกภาษา VHDL, Verilog)
บอกตรงๆครับว่าบน Software ผมก็ไม่เห็นความสำคัญของมัน เพราะว่ายังไม่เคยใช้มั้งครับ ผมเองก็อยากรู้เหมือนกัน
ถ้าจะอธิบายเรื่องการใช้งาน Concurrency บน Software จะดีมากครับ
|
|
 Rank: มือมืด Groups: Member
Joined: 3/21/2008 Posts: 53 Location: Whenever you code,you've reached my places.
|
แหม เล่นถามแบบนี้ เรือ่งมันยาวครับ เรื่อง concurrency นี่ซับซ้อนพอจะเขียนเป็นตำราเล่มๆได้เลย
ดังนั้นจะให้ผมอธิบายที่เดียวจบคงเป็นไปไม่ได้ครับ ได้แต่บอกคร่าวๆได้ดังนี้
Concurrency เป็นคุณสมบัติของระบบ(คอมพิวเตอร์)ใดๆที่สามารถประมวลผลหลายๆงานไปได้พร้อมๆกัน
และ
มีปฏิสัมพันธ์ต่อกันเพื่อแลกเปลี่ยนข้อมูลหรือสถานะของการประมวลผล
ประโยชน์ของ Concurrent programming?
1. โลกทุกวันนี้เป็น(หรือถ้ามองอย่าง conservative สุด : กำลังจะเป็น)โลกของ Multicore-CPU
ซึ่งชัดเจนว่าโปรแกรมที่ดีคือโปรแกรมที่ถูกออกแบบมาเพื่อใช้ทรัพยากรที่มืออยู่จำกัดให้เกิดประโยชน์สูงที่สุด(เหมือน Economic rule แฮะ)
ซึ่งแนวทางการใช้ประโยชน์จาก multicore-cpu นั้นมีอยู่สองแนวคิดคือ
ก.ไก่ - automatic parallel decomposition : ซึ่งก็คือการที่เราเขียนโปรแกรมไปแบบบปกติทุกวันนี้ แต่ใช้เครื่องมือพิเศษแยกการทำงานให้ cpu แต่ละตัวประมวลผล
ข.ไข่ - concurrent design ซึ่งก็คือการออกแบบให้ระบบมีการรองรับ asynchronization ตั้งแต่ระดับโครงสร้าง
แน่นอนว่าแบบ ก. จะง่ายกว่า แบบ ข. แต่สำหรับโปรแกรมที่เป็น performance critical นั้นจำเห็นต้องใช้ แบบ ข.
เพิ่มเติม : ถ้าใครบ้าหนังเรื่อง The Matrix การประมวลผล matriix นั้นต้องใช้ concurrent design กับการประมวลผล matrix ขนาดใหญ่ เห้นประโยชน์รึยัง อิอิ
2. Slow Device : ทุกวันนี้โลกเราชักมีช่องว่างระหว่าง fast device กับ slow device มากขึ้นทุกที HDD มี access time ในระดับ ms แต่ ram ล่อไป ns เร็วกว่าพันเท่า
และยังไม่นับการประมวลผลที่ใช้ข้อมูลจาก Network รอไปเถอะ... เสียเวลาไหม? เสียเวลามากๆ ต้องมานั่งรอโหลด ทางแก้ละ? = concurrency
3. Human User : มนุษย์เรานี่ละตัวดีเวลารอให้โปรแกรมโหลดมันเบื่อไหมที่หน้าจอมันจะค้างๆ? ทำอะไรก็ไม่ได้ เซ็งไหม? ถ้าเซ็งละก็มองมาที่ concurrency สิคับ
4. Distributed system : ทุกวันนี้โปรแกรมมันไม่ได้รันอยู่บนเครื่องโดดๆอีกต่อไปแล้ว มันกระจายอยู่บน Network และผลที่ตามมาคือ ... concurrency อย่างหลีกเลี่ยงไม่ได้...
สรุปน่ะ
Concurrency -> โปรแกรมทำงานหลายๆ Thread และมี Interaction ต่อกันเพื่อประมวลผลงานหนึ่งๆ....จบ
-------
นิดนึง
VHDL, Verilog เป็นภาษาที่ใช้ออกแบบ Hardware ซึ่งจะเป็นคนละเรื่องกับ Concurrency
Concurrency สามารถใช้งานได้แม้แต่ ASM หรือ VB C++ Java Perl JavaScript etc. กล่าวสั้นๆคือ Concurrency เป็น Abstraction Love = λygh·g(y(y)(h,g), y(y)(h,g))
Code:Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U) = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U) = I(Love(Love)(U,I), Love(Love)(U,I)) = I(Love(Love)(U,I)) Love Combinator!!!!
|
|
Rank: มือเทพ Groups: Member
Joined: 3/6/2008 Posts: 176 Location: TH
|
ครับ VHDL, Verilog เป็นภาษาออกแบบ Hardware ซึ่ง Hardware ส่วนมากจะทำงานเป็น Concurren อยู่แล้วครับ
ซึ่งผมสงสัยก็คือมีกรณีไหนบ้างที่เราต้องการให้ Software ทำงานเป็น concurren บ้าง แต่ก็พอได้คำตอบแล้วครับ ขอบคุณมากๆครับ
|
|
|
Guest |