Tags:
Node Thumbnail

TIOBE เป็นดัชนีวัดอันดับความนิยมของภาษาโปรแกรมผ่านทาง search engine ต่างๆ ซึ่งเดือนเมษายนก็มีอันดับที่น่าสนใจดังนี้ครับ

  • ภาษา C ขึ้นที่ 1 แทน Java อีกครั้ง หลังจากเคยทำได้เมื่อ 2 ปีก่อน ก็น่าจับตามองว่าจะอยู่ตำแหน่งนี้ได้นานแค่ไหน เพราะความนิยมใน Android ที่เพิ่มขึ้นเรื่อยๆ นั่นเอง
  • Objective-C เร่งสปีดตัวเองจนเข้าใกล้ C++ ที่รั้งอันดับ 3 มาอย่างยาวนานได้ นับว่า iPhone, iPad มาแรงมากจริงๆ
  • แม้ว่า Visual Basic จะดูถดถอยลงมากในช่วงหลัง (รั้งอันดับ 7) แต่ Visual Basic .NET ก็สามารถตีเข้ามาอยู่ในอันดับ 14 ได้ ท่าทางว่าภาษานี้จะตายยากเสียแล้ว?
  • NXT-G ภาษาสำหรับตัวต่อ Lego Mindstorms กลับเข้ามาติดอันดับที่ 20 อีกครั้ง

สำหรับ 10 อันดับแรก เรียงลำดับดังนี้: C, Java, C++, Objective-C, C#, PHP, Visual Basic, Python, JavaScript, Perl

ที่มา: The H, TIOBE

Get latest news from Blognone

Comments

By: hisoft
ContributorWindows PhoneWindows
on 11 April 2012 - 09:25 #406854
hisoft's picture

เย้ C#, Java ยังอยู่ต้น ๆ (T_T)

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 11 April 2012 - 10:37 #406882
UltimaWeapon's picture

เดาได้เลยว่าคนไทยหลายๆคนจะงงว่า C/C++ มันโผล่มาอยู่อันดับสูงขนาดนี้ได้ไงแน่ๆ เพราะไทยแลนด์งานเกี่ยวกับ C/C++ แทบจะไม่มีกันเลยทีเดียว มีแต่ Java, C#, PHP ซะส่วนมาก

By: btoy
ContributorAndroidWindows
on 11 April 2012 - 12:35 #406955 Reply to:406882
btoy's picture

ผมคนนึงที่งง ห้า ห้า


..: เรื่อยไป

By: cavaji
AndroidUbuntu
on 11 April 2012 - 12:44 #406965 Reply to:406882
cavaji's picture

อยู่ในความคิดของผมมาก่อนแล้ว... เพราะมันเร็วมากๆๆ Java สู้ไม่ได้เลย.

By: tonkung
Windows Phone
on 11 April 2012 - 12:50 #406968 Reply to:406882

ผมก็งงครับ โดยเฉพาะ c นี้ล่ะ

By: จักรนันท์ on 11 April 2012 - 17:07 #407128 Reply to:406882

ผมกลับงงว่า Assembly หล่นไปอยู่อันดับ 24 ได้ไง โดยเฉพาะไปอยู่หลัง Ada!!

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 11 April 2012 - 19:03 #407185 Reply to:407128
UltimaWeapon's picture

เอาจริงๆแล้ว Assembly แทบจะไม่ค่อยได้ใช้เลยนะคับ ส่วนมากจะ C กันหมด เพราะได้ Performance เกือบจะระดับเดียวกัน (ถ้าเขียนเป็น + Compiler เก่ง) เผลอๆบางทีจะมากกว่าด้วย ถ้าคนเขียน Assembly เก่งไม่เท่า C Compiler ส่วนมากหลักๆแล้ว Assembly มันจะไว้ใช้ก็ต่อเมื่อ C ทำงานนั้นๆไม่ได้ เช่น การใช้ Instruction พิเศษของ CPU ที่ Compiler ไม่สามารถให้ได้ หรือ entry point ของตัว boot loader

By: จักรนันท์ on 11 April 2012 - 21:35 #407252 Reply to:407185

ผมยังใช้กันอยู่เสมอๆ ครับ

คือ ทุกๆ Compiler มันจะมีจุดที่ให้ผลเป็น Native ที่งี่เง่าอยู่เสมอ ซึ่งจุดเหล่านั้นทำให้ Process period time คลาดเคลื่อนในงาน Control ระดับ Hardware

ผมยกตัวอย่างเช่น...

ลองใช้ if (); ดูนะครับ แล้ว Compile ดู แล้วดู Code ที่ได้ออกมา จะพบ Format ที่ทุกๆ Compiler วางไว้ออกมาเป็นแบบนี้...

// สมมติใน if เราเช็ค ตัวแปร เป็น true (คือ 1), bsf ก็คือเช็ค bit 0 ในตัวแปร ว่า Set หรือไม่

bsf ตัวแปร,0

goto จริง

goto ไม่จริง

จริง:

bla...

bla...

bla...

goto งานต่อไป

ไม่จริง:

goto งานต่อไป

งานต่อไป:

bla...

bla...

bla...

แบบนี้ครับ ทุก Compiler ของทุกค่ายเลย เวลาเจองานที่ผมต้อง Strict เรื่อง Process period time นี่ ต้อง asm เอาเท่านั้น ไม่งั้น คุมไม่ได้ครับ

งานที่ว่าเช่น เวลาต้องทำ Bit bang ใน BUS ด้วย Speed สูงสุดที่ไม่มีมี Clock อ้างอิง (และไม่ขึ้นกับ Clock)

ยังมีตัวอย่างให้ยกอีกเยอะครับ ทดลองดูได้เลยครับง่ายๆ เขียนสั้นๆ มีแค่ 1 Instruction แล้ว Compile เสร็จแล้วดู Native ที่ออกมาเลย (เปิดตาราง CPU Instruction ดูเลย) จะเจออะไรที่เป็น Garbage แบบนี้อยู่พอสมควร
หลายลักษณะครับ ที่ Compiler เหมือนทำ Template ไว้แล้ว

แค่ goto อันเดียวนี่ ถ้าเป็น x86 ต้อง Fetch code ถึง 8 byte เป็นอย่างน้อยนะครับ เสียเวลา CPU ไปถึง 39 Clock เลยทีเดียว ทำให้เวลาทำ Process Synchronization Calibrating นี่ยากมาก ขยับ Code นิดเดียวเช่น...

i = i + 1; เป็น i++; เท่านั้น ถึงเละได้ทันที เพราะบาง Compiler ให้ผล Native ออกมาต่างกัน

บาง Compiler ก็สู่รู้ครับ มันแปลทั้ง 2 Instruction นั่นออกมาเป็น Native เดียวกัน ทั้งที่จงใจจะถ่วงเวลา Process ด้วย i = i + 1; เพื่อให้มีการ Load ค่า i ลงใน Register เล่นๆ ก่อน แล้วค่อยเพิ่มค่า แล้ว Load กลับอีกที

ถ้าผมยกตัวอย่างอีก มีหวัง Blog ระเบิดแน่นอน.... ผมมี Case เยอะครับ

ถ้าไม่ใช้ Assembly เลย เป็นไปไม่ได้เลย ที่จะคุมเรื่อง Timing ได้แม่นยำครับ ผมเลยคิดว่ามันน่าจะยังจำเป็นกว่า Ada

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 11 April 2012 - 21:50 #407259 Reply to:407252
UltimaWeapon's picture

ไอ้ที่ยกตัวอย่างมานั้น Assembly ของอะไรเหรอคับ เพราะถ้า x86 มันคงไม่ใช่ละ ถ้า x86 VC++ ฉลาดจะตาย ที่คุณยกตัวอย่างมาไม่มีหรอก มีแต่มันจะออกมาแบบนี้

test eax, eax
jz ไม่จริง
เริ่มทำงานส่วนจริง

ส่วน Process period time ผมไม่รู้จักหรอก Bit bang ของคุณก็เหมือนกัน คุณบอกยังมีตัวอย่างอีกเยอะ แต่ผมผ่าน Code ของ VC++ มาเยอะแล้ว Garbage ที่คุณว่ามันแทบจะไม่มีออกมา

Process Synchronization Calibrating ที่คุณว่ามาผมก็ไม่รู้เหมือนกัน ไม่รู้ว่าคุณมั่วมา หรือผมโง่เองกันแน่

ส่วนเรื่อง Timing ที่คุณว่ามา ยกตัวอย่างให้ดูหน่อยได้มั้ยคับว่ามันเป็นยังไง

By: จักรนันท์ on 12 April 2012 - 05:32 #407374 Reply to:407259

ไอ้ที่คุณว่ามัน ฉลาดจะตาย นั่นแหละครับ ที่ผมว่าในงานของผม คือการ สู่รู้ ครับ

งานของคุณมีแต่งานที่ Code สามารถมี Overhead สูงได้ คุณจึงไม่ทราบว่า สำหรับงานที่ Interface ระดับ Hardware นั้น Compiler ยุคใหม่ สู่รู้กันมาก (ทำให้ความฉลาดของมัน กลายเป็น Garbage ไป)

เช่นที่คุณยกผลว่า...

test eax, eax

jz

นั่นคือ Native ที่ได้หลังจาก Load ค่าจาก Memory ใส่ eax ไปตรวจสอบแล้ว ซึ่งมีขนาดถึง 16 bit ตรงนี้ CPU จะต้อง Fetch อ่าน Native code ก่อน Process ถึง 8 byte เช่นที่ผมบอกไปแล้ว แล้วจึงค่อย Process ตาม และผมให้สังเกตุนะครับ ในมื่อตัวอย่างผมต้องการตรวจสอบแค่ Bit 0 ของตัวแปรเท่านั้น!! คุณลองพยายามเขียน VC++ ให้ Compile ออกมาได้โดยได้ Native ที่กระทำแค่เท่าที่จำเป็นที่ Bit 0 ให้ผมดูหน่อยซิครับ?

สำหรับเรื่องที่คุณคิดว่ามั่ว นั่นเพราะคุณไม่รู้น่ะครับ... เมื่อคุณ Design Board ออกมา ไม่ว่าจะ CPU อะไร พอคุณวาง Chipset หรือ MCU อื่นๆ ที่คุณต้องการลงไปใน Board โดยใช้ Oscillator เดียวกันเป็น Source (CLK) ให้แต่ละ Processor ทำ PLL คูณค่า Clock เอาเอง (x86 ปัจจุบันทำแบบนี้หมดครับ โลกเรายังไม่สามารถผลิต Crystal ระดับ GHz ได้ครับ เขาทำ PLL กันทั้งนั้น) ในการออกแบบ Board ลักษณะนี้ จะสามารถทำความเร็วสื่อสารใน Bus ระหว่าง Processor ได้สูงสุด ด้วยการใช้ Bit bang concept ครับ เพราะ Processor ทุกตัวจะเดินอยู่บน Clock Source เดียวกัน

ทีนี้ Bit bang เนี่ย ต้องเข้มงวดมากครับ เรื่องเวลาในการ Process แต่ละ Loop ของการรับ/ส่งข้อมูลแต่ละ Bit ใน Bus line ซึ่ง... คุณต้องเขียน Code ให้แต่ละ Loop ใช้เวลาเท่ากันครับ (ในระดับ Pico Sec ลงไป)

คุณ UltimaWeapon ทดลองเองได้เลยครับ...
ลองเขียน Code 2 Code นะครับ เอา Bit bang concept นี่เลยพอ คุณก็ได้หัวแตกแน่นอน... ผมให้โจทย์คุณเลย ไปลองดู

Code แรก สมมติเป็น Master แล้วกัน ส่งข้อมูล Byte เดียวพอ

อีก Code เป็น Slave ครับ รับ Byte เดียว

ให้คุณเขียน Code แรก ส่งข้อมูล 8 bit จากตัวแปร โดยเปลี่ยน Bit ที่ขาใดก็ได้ ตามใจคุณ ของ Printer port หรือจะใช้ Port อื่นใด ก็ตามแต่จะสะดวกครับ เอา I/O บน Mainboard คุณนั่นแหละ มาใช้ทดสอบแค่ Bit เดียว โดยมี Start bit เป็น Bit แรก และข้อมูลตามมาอีก 8 bit ทันที หนึ่ง Cycle จึงเท่ากับ 9 bit ไม่มี Clock ให้อิงครับ วิ่งเต็มที่ตามที่คุณเขียน Code ได้ เขียนเสร็จแล้ว เอา Scope ทำการจับ Capture เอาไว้เลย ว่าได้ 9 bit ความเร็วกระฉูด ยิ้มแย้มไปได้

ทีนี้....

มาเขียน Code ที่สอง เป็นขารับนะครับ... เออ.. นี่แหละ ทำให้มันรับได้ครับ แค่นี้ เริ่มเห็นปัญหาของ Compiler หรือยังครับ?

เพราะ Code มันย่อมไม่เหมือนกัน แต่... คุณต้องเขียนให้ได้ Native code ที่ใช้เวลาทำงานในแต่ละรอบการเปลี่ยน Bit เท่ากันเสมอ!!! ที่ความเร็วสูงสุดตาม Clock source ของ CPU (ที่ผ่าน PLL แล้วด้วย) ทำได้ ไม่ใช่ตาม Clokc จำกัดแบบ PCI Bus อะไรพวกนั้น พวกนั้นต้องทำงานตามจังหวะ Clock ของ Bus ครับ

ยังมีอื่นๆ อีกเยอะครับ ถ้าคนที่เคยแต่เขียน Program ลงบน Board ที่คนอื่นทำมาให้ใช้ ไม่มีวันเข้าใจว่าทำไมผมจึงว่า "ความฉลาด" ที่คุณยกมา กลับเป็น "การสู่รู้" แบบที่ผมกล่าวไป คนที่ไม่ถึงกับ Implement กับ Processor ได้เองโดยตรงจะเข้าใจได้ก็อีกกลุ่มหนึ่งครับ (สำหรับ x86 นะ) คือกลุ่มที่มีความสามารถและเคยเขียน Driver เอง ไม่ว่ากับ DOS หรือ OS ใดๆ เพื่อใช้ Peripheral Interface Card ที่ไม่ใช่ของทั่วไปในตลาดใช้งาน เช่นในโรงงานอุตสาหกรรม มีกรณีเยอะ เอา ModBus Interface Card เข้าไปเสียบ เพื่อให้ PC เข้าร่วมวงกับ PLC ของ Siemens ได้เป็นต้น กรณีเจอของหลายสัญชาติในระบบ เช่น German + India + Japan + Russia และ Italy + German + USA มา Join Hardware กัน แล้วเราต้องเอาอะไรมาเชื่อม ไม่ว่าจะ Base บน x86 หรือ Processor อื่นใด

เจ้าพระยาพืชไร่... โคราช... ถ้ามีใครผ่านมา Blog นี้ ช่วยผมอธิบายก็ได้นะครับ งานที่คุณเคยจ้างบริษัทผมเข้าไปแก้ปัญหาให้เมื่อปี 2542 เมื่อ Seimens + Toshiba + อะไรหว่าลืมแล้ว เข้าไปสางให้ สถานการณ์อย่างกับสนามรบระหว่าง Engineer ข้ามชาตินั่นน่ะครับ

ไทยบารอดา... มาบตาพุฒ... นาย India กับการพยายาม Implement ของ India ลงไปในระบบด้วย (ผมชื่นชมนะ กับความพยายามส่งเสริมงานที่ออกมาจากสมองของ Engineer ชาติตัวเอง แต่ให้ตายสิ... ผมต้องเอา Network Card ของ 3COM USA ไปนั่ง Remount Chip ออก มาทำใหม่กับ Ukriane Engineer เพราะ... Protocol ของ India เป็นของเขาเอง!!! ต้องหาทางเชื่อมกับ Siemens ให้ได้)

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

ผมพยายามยกตัวอย่างและพูดด้วยภาษาที่เชื่อว่าพาคุณเข้าใจได้ง่ายที่สุดแล้ว ถ้านึกไม่ออก ต้องขออภัยจริงๆ แต่ให้ถามมาครับ จะพยายามอธิบายลงไปอีก ผมไม่หวง ไม่กั๊กครับ ผมอยากให้มีบุคคลากรระดับนี้ในบ้านเราเกิดขึ้นอีก มันมีน้อยมากอยู่แล้วจริงๆ การเป็นแต่ Programmer จะเก่งยังไง ก็แค่ผู้บริโภคนวตกรรม (ในมุมมองของผม) อย่างน้อยต้องมีความสามารถระดับสร้าง Compiler เองได้ จึงจะเป็นบุคคลากรที่ทำให้ชาติเริ่มต่อสู้ในสงครามเทคโนโลยีได้ครับ (นี่อย่างน้อยแล้วนะ ในมุมมองของผม)

ใครแถวนี้ จะช่วยอธิบาย ผมก็ไม่ขัดข้องนะครับ เพราะการพูดให้สั้นแล้วเข้าใจได้ง่ายนั้น ไม่ใช่ความสามารถของผม

==== มา Edit เพิ่ม ====

พอดีนึกได้ เพราะคุณอ้างถึง VC++ ทำให้เข้าใจได้ว่า คุณเป็น Programmer ที่ถนัดทาง x86 เลยจะยกตัวอย่างนี้เพิ่มแล้วกันครับ

คุณเคยเขียนโปรแกรม Interface กับ USB ไหมครับ? ผมอนุมานว่าต้องเคยแน่ๆ นะครับ แต่ตอนคุณเขียน ผมเชื่อว่าคุณคงใช้งานผ่าน Library สำเร็จรูปเอา ทีนี้... ผมอยากให้คุณลองเขียนโปรแกรมใช้งาน USB โดยตัวเอง ควบคุมขา D- D+ เอง ไม่ใช่ใช้งานผ่าน Driver ที่คนอื่นทำมาให้แล้ว เอาตามความเร็วมาตรฐาน USB 2.0 ด้วย คือ 480 Mbps นี่คือผมต่อให้มีฐาน Clock ที่แน่นอน ไม่ใช่วิ่งตามความเร็วสูงสุดที่ USB Chip สามารถเปลี่ยน State ของขา D- D+ ได้ (Keyword คือ Latch จะได้ไปค้นได้ครับ)

แค่นี้แหละครับ ลองเขียนให้แต่ละ Loop ทำงานที่พอดีเวลา 1/480,000,000 วินาทีดูครับ แล้วจะทราบว่า ยังมีอีกหลายกรณีนัก ที่หลีก Assembly ไม่พ้นแน่ๆ ชนิดที่ผมกล้าพูดว่า Assembly ไม่มีวันตายแน่นอน

480 ล้านรอบต่อวินาที ต่อให้ x86 CPU ที่ทำงานระดับ GHz แต่ถ้าเขียน Code ด้วยภาษาที่สูงกว่า Assembly ก็หน้ามืดล่ะครับ ที่จะทำให้พอดีได้ (Garbage จาก Compiler ทำนองที่ผมกล่าวไว้จะโผล่มาไม่ได้เลยไง) แค่เขียนให้ทำงานทันใน 1 คาบเวลาก็หืดขึ้นคอแล้วครับ พอมี Clock ให้ CPU ใช้ Process แค่ 2 Clock กว่าๆ ต่อความเร็ว CPU 1 GHz (1 GHz ก็เป็นไปไม่ได้แล้วล่ะ แค่ fetch คำสั่ง ก็เวลาไม่พอแล้วครับ ยังไม่ทันได้ประมวลผลเลย)

การเขียนตรงนี้ พวก Hardcore ที่ทำงานใน Layer แบบผมลงไป เรียกว่า Stack ครับ (เขียน USB Stack ใช้เอง - เป็นการให้ Keyword ไว้ให้คุณไปค้นได้อีกน่ะครับ)

อีกตัวช่วยสนับสนุนความมั่วของผมได้คือ คนที่เล่น MCU แถวนี้ (บางคนที่ Hardcore พอ) น่าจะเข้าใจที่ผมพูดได้ทั้งหมดทันที... ใช่ไหมครับ?

==== มา edit เพิ่มอีกครั้ง ส่วนที่ลืมอธิบาย ====

การปรับ Code เพื่อให้ Loop ทำงานที่เวลาเท่ากันพอดีในการทำงานที่ต่างกันตั้งแต่ 2 Code ขึ้นไป เรียกการกระทำนี้ว่า Process Synchronization Calibrating ครับ มันไม่ใช่ศัพท์เฉพาะครับ มันเป็นคำนามของกิริยา เหมือนคำว่า Walking นั่นแหละ ดังนั้น มันไม่มีในตำราแบบเป็น Topic เลยตรงๆ ครับ บางครั้งเวลาคุยกัน ก็พูดสั้นๆ เลยว่า Timing หรือ Period tuning ก็ว่ากันไปแล้วแต่กลุ่มคนครับ

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 April 2012 - 10:41 #407410 Reply to:407374
UltimaWeapon's picture

ผมว่าคุณกับผมเลิกตีกันเหอะ เพราะมันคุยกันคนละ Architecture ละ ผมไม่ใช่สาย Micro controller หรือ Hardware อย่างคุณ

คุณบอก Assembly น่าจะยังใช้เยอะ นั่นเพราะชีวิตคุณติดกรอบอยู่แต่ในโลกของ Micro controller นั่นละคับ คุณลองมองดูโลก PC ดูสิ โปรแกรม Unix ส่วนมากก็ C กันหมด มันไม่มีใครมาบ้าเขียน Assembly ทั้งโปรแกรมหรอก ซึ่ง Driver ของพวก Unix/Windows ก็เหมือนกัน Code แทบจะทั้งหมดก็เป็น C

"นั่นคือ Native ที่ได้หลังจาก Load ค่าจาก Memory ใส่ eax ไปตรวจสอบแล้ว ซึ่งมีขนาดถึง 16 bit" eax 16 บิทเหรอคับ? ไม่ใช่ละ 32 บิทตะหาก คุณไม่ใช่สาย x86 คุณอย่ามาพยายามทำตัวเอาชนะและบ้าพลังเลยคับ เหมือนกับการพยายามทำตัวเอาชนะว่า Assembly มันไม่ควรจะตกอันดับขนาดนั้น OK คุณเก่งมากในสาย Micro controller/Hardware

เรื่องเชคแค่บิทแรก x86 ไม่มีอะไรดีเท่า test แล้วละคับ หรือถ้าคุณว่ามี ก็เอามาให้ผมดูหน่อย

ผมว่าถ้าคุณจะดูถูกความสามารถของ VC++ ขนาดนั้น วามันสร้าง Garbage เยอะ ลองมาหัดเล่นสาย x86 ดูแล้วลองคอมไพล์แบบ Performance Optimization + Link-time code generation ดู คุณจะได้เห็นกับตาตัวคุณเองว่า Garbage มันแทบจะไม่มี นอกจากจะเป็น Garbage ที่เกิดจากการเขียน Code ไม่เป็นเอง

หรือถ้าคุณยอมรับแม้แต่ Garbage เล็กๆน้อยๆขนาดนั้นไม่ได้ คุณก็เขียนโปรแกรมใหญ่ๆด้วย Assembly ไปเถอะ อย่างเขียนระบบ OS ที่ใหญ่เท่ากับ Linux/Windows ด้วย Assembly ทั้งหมด (ซึ่งไม่มีใครเขาบ้าพลังเพื่อจะทำแบบนั้นหรอก) หรือไม่ต้อง OS ก็ได้ แค่เขียนเว็บใหญ่ๆด้วย Assembly ก็พอละ

สรุปทั้งหมดที่ผมจะอยากอธิบายคือ มันปรกติแล้วที่ Assembly จะร่วงอันดับขนาดนั้น เพราะมันมีแค่งานส่วนน้อยเท่านั้นที่ต้องการใช้มัน ใช่ อย่างที่คุณว่า มันไม่มีวันตายแน่นอน แต่มันก็ไม่มีวันที่จะขึ้นมาอยู่ในอันดับหนึ่งได้อีกแล้ว

By: จักรนันท์ on 12 April 2012 - 12:56 #407427 Reply to:407410

อ้าว... ผมว่าคุณเข้าใจผิดนะ คุณตั้ง Guard อะไรหรือครับ? ผมไม่ได้ตีกับคุณนะ แล้วประเด็นที่ผมออกความเห็นคือ ผมไม่คิดว่า Ada จะอยู่ลำดับที่สูงกว่า Assembly ด้วยเหตุผลที่ผมเห็นว่า Assembly ยังมีส่วนใช้งานมากกว่า Ada เพราะแม้มี C ก็ตาม ยังมีหลายอย่างที่ Compiler ทำแทนไม่ได้?!?

ผมงงท่านล่ะสิ?!?

ชีวิตผมไม่ได้ติดอยู่ในโลกแคบแน่นอนครับ บริษัท (ของ) ผมรับงานออกแบบ Consumer prototype ของหลายสิ่งหลายอย่าง มีแม้กระทั่งที่ใช้อยู่ใน PC ของคุณ บน Motherboard ของคุณเลยด้วยซ้ำ ไปตลอดจนถึง Server ในปัจจุบันผม Outsource งานระดับ High Level Language ออกไปเกือบหมด (ภาษา Script ออกไปได้หมด 100% แล้ว ส่วน C ยังใช้อยู่ จึงเรียกว่าเกือบหมด) ในบริษัทผม มอง Compiler เป็นเครื่องมือลดภาระในการเขียนโปรแกรมครับ แต่เวลา Inspect งานแล้ว 50% ผมตรวจงานกันที่ Native code เลย ไม่ได้ตรวจที่ Source code ครับ จึงทำให้มีประสบการณ์กับ ความสู่รู้ ของ Compiler หลายตัว

คุณพูดไม่ผิดครับ ที่คุณใช้คำว่า แทบ ทั้งหมดก็เป็น C ถ้าคุณพูดว่าทั้งหมดเป็น C ล่ะก็ผิดแน่ๆ แต่จะขอถามว่า ไม่ได้มีตรงไหน ที่ผมบอกว่า ทั้งหมดเขียนเป็น Assembly เลย เหตุที่ผมเห็นว่า Assembly ยังจำเป็น เพราะผมยกส่วนที่แม้จะเขียนด้วย C ก็ไม่สามารถบังคับให้ Native ออกมาตรงประสงค์ได้ จึงทำให้ Assembly ยังคงอยู่ และจำเป็นถึงขนาดแม้ใน VC++ หรือ C Compiler ตัวอื่นๆ ก็ตาม ก็ยังสามารถ Inline Assembly code ลงไปใน Source ได้เลยโดยตรง นั่นแปลว่า มันยังจำเป็นจนถึงขนาดผู้สร้าง Compiler เองก็ทราบดี

ส่วนที่คุณยกมา ผมพิมพ์ผิด คุณจะจับผิดที่พิมพ์ผิดหรือครับ งั้นคุณช่วยดูตรงที่ผมพิมพ์ไม่ผิดหน่อยนะครับ ที่ผมกล่าวต่อเนื่องไปอีกว่า "จะต้อง Fetch อ่าน Native code ก่อน Process ถึง 8 byte" นั่นหมายความว่าอะไรครับ?

fetch คำสั่ง 4 byte และ eax อีก 4 byte เท่ากับ 8 byte... ในใจผมคิดเป็น byte ที่ CPU ต้อง fetch ไป ความันมือที่กำลังพิมพ์ ซึ่งติดพันกับกำลังคิดในใจถึง x86 มันเลยพิมพ์ผิดออกไป 1 จุด ดังนั้นมันไม่ได้มีผลอะไรกับ Reply ผมดอกครับ

ผมไม่ได้เอาชนะครับ ไม่ได้บ้าพลัง ผมอยู่ในวงการมาตั้งแต่ก่อนยุค 8080 ผมออกแบบสร้างเองได้ด้วยตัวเองทั้งหมด ผมส่งแบบสั่งทำ Chip เองกับทั้ง Microchip, Ti, Freescale, Intel และ Samsung ซึ่งมีผมเป็นบริษัทเดียวในประเทศไทย (ที่เป็นของคนไทย 100%) ที่มีความสามารถทำได้แบบนั้น นอกนั้นเป็นแค่ Dealer/Distributor นำเข้า Chip สำเร็จรูปมาขายเท่านั้นครับ ถ้าผมจะเอาชนะ ก็คงกร่างมานานแล้ว ผมไม่ใช่เด็กๆ แล้วนะครับ

ผมยังยืนยันให้คุณกลับไปอ่านใหม่ ว่าผมแปลกใจที่.... Assembly อยู่อันดับหลัง Ada

การยกตัวอย่าง ไม่ได้เป็นการโจมตี C แต่อย่างใด ผมเขียนได้ทุกภาษา ไม่มีภาษา Computer ใดๆ ในทุกๆ Platform เป็น Black magic box สำหรับผม ทุกๆ ภาษา ทุกๆ Compiler คือ Tools ในการอำนวยความสะดวกและความรวดเร็วในการ Coding ทั้งสิ้นครับ ทุกภาษาผมจึงใช้เวลาเพียงสัปดาห์เท่านั้นในการศึกษาและเริ่ม Coding มันได้

ประเด็นที่ว่า Check bit ไม่มีอะไรดีเท่า test นั้น คุณก็หลงประเด็นของผมนะครับ ผมยกตัวอย่างว่า Assembly จำเป็นกว่า Ada ยังไง เพื่อแสดงให้เห็นว่า แม้ใช้ C ก็ตาม ก็ยังทำให้ Assembly หายไปไม่ได้... แต่... กลับกันคือ เมื่อมี C แล้ว มันแทนที่ Ada ได้ 100% จึงสงสัยยิ่งนักว่า ทำไม Ada อยู่ก่อน Assembly

Get the point ไหมครับ?

ถ้าอธิบายผมได้ว่า Ada มันไปอยู่งานไหนบ้างให้ผมรู้เพิ่มสิ โอเคเลยครับ ผมอยากรู้!

ย่อหน้าถัดมา คุณก็ยังระมัดระวังตัวด้วยคำว่า "Garbage มันแทบจะไม่มี" เมื่อมีคำว่าแทบ... ผมก็ไม่ต่อประเด็นล่ะนะครับ... เพราะเหตุผลของผมที่ทำไมแม้ VC++ เอง ก็ยัง Inline Assembler ลงไปได้ ก็เพราะ มันทำให้ ไม่มี Garbage เลย ไม่ได้นั่นเอง

ย่อหน้าถัดมา... ครับ ผมยอมรับไม่ได้ แม้แต่ Garbage เล็กๆ น้อยๆ ครับ ผมยกตัวอย่างเพิ่มให้ก็ได้... คุณลองเอา Modem ที่ใช้ Connexant chip มานะครับ มา Re-engineering ดูนะครับ แล้วดูใน Driver ของมัน เวลาที่ Initalize ทุกครั้ง ดู Native ที่มัน Load ลง Chip เพื่อทำงานนะครับ ทำไมเขาเขียนด้วย Pure C ไม่ได้?

นั่นเพราะ Connexant ใช้ DSP ในการ Modulate สร้างสัญญาณเสียง Modem ทำงานในเชิง Software ล้วนๆ ซึ่งไม่สามารถเขียนด้วย Pure C ให้แม่นยำทางเวลาได้ครับ

นี่ผมยกตัวอย่างด้วย Windows Driver ที่คุณถนัดเลยนะครับ

ย่อหน้าสุดท้าย ผมขอย้ำว่า... อธิบายผมที ทำไม Ada อยู่อันดับก่อน Assembly ครับ...

มีตรงไหน ที่ผมสงสัยว่า Assembly ควรอยู่อันดับ 1 ??? (และมันไม่เคยได้อยู่อันดับต้นๆ เลยด้วยซ้ำ อย่างน้อยก็ในรอบ 25 ปีล่ะ ก่อนหน้านั้น ไม่กล้า Confirm)

จะผลักไสให้ผมไปอยู่ขอบทำไมครับ ผมอยู่สายกลาง... พูดอย่างเป็นกลาง ไม่ได้อยู่ข้างภาษาไหนๆ เลย ผมใช้ได้หมดครับ วิศวกรคอมพิวเตอร์ที่แท้จริงในความหมายของผมคือ ต้องเห็น Programming Language เป็นแค่ Tool ครับ ไม่งั้นเป็นลูกน้องผมไม่ได้ จะได้รับค่าตอบแทนวันละ 15,000 ขึ้นไปจากผมได้ ต้องคิดและทำได้ขนาดนั้นครับ

OS ผมสร้างใหม่กันเป็นประจำอยู่แล้วครับ.. เรื่องจริง.. งานไหนๆ ออกแบบเสร็จ ก็ต้องทำอยู่แล้ว เพราะอะไรน่ะหรือ... คืองี้...

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

ร่ายต่อ...

เพราะสิทธิบัตรครับ

เมื่อบริษัทผมรับงาน... เกริ่นก่อน... ปัจจุบัน ผมรับงานต่างชาติ 100% ครับ ในประเทศไม่รับแล้ว ดูแลเฉพาะลูกค้าเก่ากันมา เพราะมันเป็น Connection กว่า 10 ปีกันแล้วทั้งนั้น ทิ้งไม่ได้ ด้วยความที่บุคคลากรในระดับ Hardcore ทุกวันนี้ หายากกว่าเมื่อ 20-30 ปีก่อนเยอะ ผมก็ต้อง Outsource งานที่มีบุคคลากรในตลาดทำได้อยู่แล้วออกไปให้มากที่สุด เท่าที่จะมากได้ แต่งานที่ Outsource ออกไปได้น้อยมากคือ ใน Layer ที่เริ่ม Interface กับ Hardware ลงไปจนถึงตัว Hardware design แต่เมื่อก่อน ที่เราเริ่มต้น งานยังไม่เยอะ เราทำทั้งหมดแหละครับ ตั้งแต่ยังไม่มี Windows เกิดขึ้น ลูกค้าไม่เอา OS/2 (ตอนนั้น OS/2 ก็ยังห่วย) เราก็ต้องเขียน OS ใช้เอง บลาฯ บลาฯ บลาฯ.... เกริ่นพอแล้ว...

ดังนั้น ตัว Frontend application ใน Layer ที่คุณทำ ถึงแม้ผมจะ Outsource ออกไปหมดก็ตาม แต่ไม่ได้หมายความ บริษัทผมจะไม่ได้แตะของใน Layer นั้นอีก ทุก OS ที่ออกมา เราต้องชำแหละครับ ทุก Compiler ทุก Technology ครับ แต่ให้เราทำ Frontend application ตอนนี้เราไม่ทำครับ ความรู้ความชำนาญเราสูง แต่คนเราไม่พอ ยังไงก็ยังมีแค่ 2 มือ 1 หัว 24 ชั่วโมงต่อวันต่อคนอยู่ดี

ยิ่งในไทยยิ่งยาก ผมจึงเปิดสาขาไว้อีก 4 ประเทศ เอางานออกไป R&D นอกบ้านดีกว่า... (คนไทยเป็นยังไง ผมขอไม่เปิดประเด็นแล้วกัน เดี๋ยวเรื่องยาว)

เรื่องสิทธิบัตร นั่นเอง ที่ทำให้ แม้แต่ USB Stack เรายังต้องเขียนขึ้นเองครับ เมื่อลูกค้าสั่ง Design ออกมา ผมจะเอา Code เก่าๆ หรือ Code ของคนอื่นมายำยัดใส่ไม่ได้ครับ หรือแม้แต่ใช้ Library/Driver ของคนอื่นก็ไม่ได้ เว้นแต่ลูกค้าจะยอมเอง เพราะเมื่อเขานำไปผลิตเป็น Product จริงของเขาแล้ว มีปัญหาสิทธิบัตรตามหลังมา ผมได้ล้มละลายทันทีครับ!!

แค่ทำ MP3 Decoding QFN Chip เมื่อ 6-7 ปีที่แล้ว ก็ยุ่งตายแล้ว เพราะจะโดน Lame เก็บตังค์ ทั้งๆ ที่ Code เราเขียนใหม่เองหมด ไม่ได้มีลอกแม้แต่น้อย....

นี่แหละ ทำให้ Team ผมมีความชำนาญสูง ในการ Re-engieering ตรวจสอบงานที่ผลที่เป็น Native ครับ

ผมมอง Computer เหมือนกันหมดครับ!! ไม่มี Architecture สำหรับผมในการคิด คำว่า Architecture จะมีในความคิดเมื่อตอน Design เท่านั้นครับ เวลาตรวจงาน ก็กาง Instruction Table ตรวจกันเลย Processor ไหนๆ ก็คือ Processor ทั้งนั้นในสายตาผมครับ

แต่เรื่องหนึ่งคือ ด้วยความเคารพ ผมกลับเห็นว่าผมอยู่ในกรอบที่มีกรอบของคุณเป็น Subset นะครับ เพราะ Software คือ Subset ของ Hardware เสมอ (เป็นความเป็นจริงสำหรับผม จะไม่เป็นข้อเท็จจริงของใคร ผมขออย่าเปิดประเด็นใหม่เลยนะครับ) โลกของ PC ก็เป็น Sub world ของโลก Processor และโลก Processor ทั้งหมดก็ยังเป็น Sub world ของโลก Analog Transistor ธรรมดาๆ นี่แหละ แต่เวลาผมคิด (เรื่อง Software) ผมก็ไม่ได้บ้าคิดจากระดับ Transistor ขึ้นมานะครับ ผมจะคิดจากระดับ Logic gate ขึ้นไป (คือเริ่มจากจุดที่เป็น Digital แล้วขึ้นไป)

ขอแค่นี้ก่อนแล้วกันครับ เพราะถ้าคุณยังยืนที่เดิม คือคิดว่ากำลัง ตี กับผมอยู่เหมือนเดิม ผมพิมพ์ต่อไป ก็รังแต่จะทำให้คุณยิ่งเกิดทิฐิเข้าไปอีก ถ้าเข้าใจกันแล้ว มันค่อยน่าเสวนากันหน่อย

ย้ำอีกทีทิ้งท้าย.....

เหตุใด Assembly จึงตกลงไปถึงอันดับ 24 โดยเฉพาะไปอยู่หลัง Ada

ถ้าช่วยชี้แจงข้อสงสัยให้ผมได้ ผมยินดีครับ

By: Thaitop_BN
Windows PhoneUbuntuWindows
on 13 April 2012 - 02:39 #407667 Reply to:407427
Thaitop_BN's picture

ผมกำลังงงฮะว่าที่เถียงกันเนี่ย ประเด็นคืออันดับความนิยมของภาษา หรือภาษาไหนเจ๋งกว่ากันกันแน่?

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

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 13 April 2012 - 14:06 #407753 Reply to:407427
UltimaWeapon's picture

งั้นสงสัยคงจะมีแค่ผมคนเดียวมั้งที่อ่านแล้วรู้สึกว่าตีกัน (ดราม่า) อยู่

เอาเถอะคับ ขี้เกียจจะเถียงละ ขี้เกียจจะอ่านอะไรยาวๆด้วย สำหรับผมคุณก็แค่อีโก้สูง บ้าพลัง พยายามจะเอาชนะ เพราะไม่อยากจะเสียหน้าที่คนอื่นรู้ว่าคุณเก่ง แค่ศัพท์ที่คุณใช้อย่าง "ความสู่รู้" มันก็บ่งบอกละ แล้วยิ่งที่คุณบอกว่าไม่ใช่เด็กๆแล้วยิ่งทำให้ผมรู้สึกว่าเป็นแบบที่ผมคิด

คุณอาจจะสวนกลับว่าผมอีโก้สูง พยายามเอาชนะเหมือนกัน ใช่คับ ตัวผมก็อีโก้สูง ผมรู้ตัวผมดี

By: จักรนันท์ on 13 April 2012 - 16:08 #407787 Reply to:407753

"ความสู่รู้" ผมพูดถึง Compiler นะครับ อย่างชัดเจน ไฉนคุณตีความเหมือนผมหมายถึงมนุษย์ (โดยเฉพาะคุณคงตีความหมายถึงตัวคุณ)

Compiler ไม่ใช่สิ่งมีชีวิตด้วยซ้ำ กับหมา แมว เวลามันสู่รู้ ผมจะพูดว่ามันสู่รู้ มันก็ไม่เห็นจะแปลก ไม่ได้หยาบคาย ความหมายก็ตรงตัว จะมีคำไหนที่ผมจะต้องใช้เพื่อถนอมน้ำใจ นุ่มนวล และสุภาพกว่านี้ได้อีก? โดยเฉพาะกับ Compiler ซึ่งไม่ใช่สิ่งมีชีวิตเนี่ย มันมีน้ำใจให้ผมต้องถนอมด้วยหรือครับ?

คุณคิดว่าผมมี Ego สูงเช่นที่คุณว่ามา...

ถ้าอย่างนั้น... อยากให้ผมสำแดง Ego จริงๆ ไหมครับ?
อยากเห็นคนเก่งจริงแสดง Ego ไหมครับ?

ขอผมมาสิครับ ผมจะยกตัวอย่างสัก Code หนึ่งให้คุณดูเลย ทั้งที่ผ่านมา ผมพูดแต่เรื่องที่ Compiler ทำไม่ได้ ทำให้ Assembly ยังต้องมีอยู่ และควรจะสำคัญกว่า Ada เพราะมี Pascal/Delphi/Kylix/FPC/Lazarus ขึ้นมาแล้ว ซึ่งเป็นภาษาที่วิวัฒนาการจาก Ada ขึ้นมาอีก ผมหลีกเลี่ยงมากที่จะพูดถึงข้อจำกัดของตัวภาษาเอง โดยเฉพาะเวลามาเจอหนุ่มไฟแรงแบบคุณ ที่มีความคิดว่า ภาษาใดภาษาหนึ่งคือที่สุดแล้ว ก็ยกตัวอย่างด้วย C Compiler เพราะรู้ว่าถ้าเอา Compiler ภาษาอื่น มีหวังได้เจอเด็กรุ่นหลังที่มั่นใจเกินเหตุแบบคุณมากมายกว่านี้อีก ผมคาดหวังว่าเซียน C ก็น่าจะรู้ข้อจำกัดของภาษาที่ตนเองชื่นชอบดี ว่า C ทำผลงานได้ Optimize ใกล้เคียง Assembly ที่สุดแล้ว แต่มันก็ได้แค่ใกล้เคียงครับ และคงไม่มาต่อล้อต่อเถียงกลายเป็นเอาตัวภาษามาแย้งกันแบบนี้ เพราะประเด็นผมอยู่ที่ ลำดับของภาษา โดยมีจุดสนใจที่ Assembly และ Ada โดยยก C Compiler มาเป็นตัวอย่างว่า ทุกๆ C Code ในระดับ Hardware Interface ของทุก Architecture ทุก Platform ทุก OS ยังต้องใช้ Assembly อยู่ร่วมด้วยทั้งสิ้น ในขณะที่ Ada ไม่ได้มีเหตุให้ต้องมีภาษานี้เข้าไปแทรกอยู่ทุกอณูของ Computer เช่น Assembly ดังนั้นไฉนเลย Ada จึงได้ลำดับก่อน Assembly

ผมดูออกครับ ว่าคุณมั่นใจเหลือเกิน ว่าคุณเก่ง C มากๆ ผมหลีกเลี่ยงนะครับ ที่จะไม่แทงใจดำคุณตรงนี้ แต่ถ้าคุณอยากเห็น Ego ของคนเก่งจริง ก็บอกมาครับ ผมจะยกตัวอย่าง Code ง่ายๆ เลย ที่แสดงให้เห็นเลยว่า ไม่ว่า C Compiler ใดๆ ในโลกทั้งตอนนี้และในอดีต ก็ไม่สามารถผลิต Native code ได้ออกมา Optomize ไปกว่าการเขียน Code ส่วนนั้นเป็น Assembly ครับ

คุณบังคับให้ผมแสดง Ego ด้วยวาจาไม่งดงามของคุณเองนะครับ

ผมเห็นอยู่แล้ว ว่าคุณมั่นใจเกินเหตุ เจตนาจะไม่ฉีกหน้าคุณก็รักษาไว้มาตลอดนะครับ อีกทั้งเจตนาจะไม่ได้โจมตีตัวภาษา C เลยแม้แต่น้อย แต่ถ้าต้องการผมก็จะแสดงให้ดูได้ครับ ถ้าคิดจะเป็นเซียน C ก็ควรรู้ข้อจำกัดของภาษาที่ตัวเองเป็นเซียนด้วยสิครับ Code แบบไหนที่ C ไม่สามารถผลิตออกมาได้ เซียนจริงๆ ย่อมรู้ทุกคนครับ ผมถือว่าเป็น Basic ของทุกภาษาเลยนะ ที่ผู้ประสิทธิประสาทวิชาภาษานั้นย่อมสอนลูกศิษย์ไว้ ว่าภาษานั้นมีข้อจำกัดอะไรบ้าง

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

  • Assembly คือพื้นฐานของ Digital ครับ มันคือ Hardware แท้ๆ มันจึงสำคัญกว่าภาษาอื่นใดทั้งในโลก แต่ไม่ได้หมายความว่ามันจะได้รับความนิยมครับ

  • Architecture คือตัวเลือกครับ มนุษย์ต้องเป็นผู้เลือก Architecture มาใช้งานครับ Architecture ไม่ใช่ กรอบ ความคิดครับ Computer คือทาสของเราครับ

  • ภาษาอื่นใดทั้งหมด นอกจาก Assembly คือ Tool ในการอำนวยความสะดวกแก่ Developer ทั้งสิ้น เป็นการกระจายงาน เพื่อลดเวลาการสร้างงาน ในส่วนงานที่อะลุ่มอล่วยให้มี Garbage ได้ โดยเฉพาะ Frontend application บน PC Platform ซึ่งอะลุ่มอล่วยได้มากที่สุดในเวลานี้ เพื่อกระจายงานออกไปให้ได้มากที่สุด ให้ Programmer ต่อยอดงานได้ง่ายที่สุด ทำให้โลกสร้างบุคคลากรพันธุ์ Programmer ออกมาได้ง่ายขึ้น มากขึ้น ไม่ต้องเริ่มกันตั้งแต่ 0/1 เป็นผลให้เกิดการศึกษาในสาขา Software Programming โดยเฉพาะขึ้นมาได้

ถ้ายังเชื่อว่าผมมี Ego แบบทำลายคนอื่นเช่นที่คุณคิด ก็ขอมาครับ ผมจะเขียนตัวอย่างให้คุณดู คนมีความรู้ความสามารถสูงแบบผม ถ้าเป็นแบบที่คุณคิด คงโด่งดังในทางเลวร้ายไปทั่วแล้วล่ะครับ ลูกศิษย์ลูกหาผมก็มีทั่ว Asia แล้ว นี่ขนาดผมไม่มีประวัติเลวร้ายอะไรกับใครมาก่อนเลยจนใกล้ฝั่งแล้วนี่ ก็ยังมีคนไทยหมั่นไส้ผมเกิดขึ้นได้เองอยู่แล้ว(เช่นคุณ)

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

By: Yoeko
iPhoneAndroidWindows
on 18 April 2012 - 06:12 #409258 Reply to:407787
Yoeko's picture

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

By: จักรนันท์ on 18 April 2012 - 17:00 #409430 Reply to:409258

ขอบคุณครับ เจตนาตรงของผมก็คือเผื่อแผ่ประสบการณ์แก่คนรุ่นหลังนั่นแหละครับ เพราะความรู้ในตำราหาศึกษาได้ง่าย แต่ประสบการณ์ของคน หาศึกษาได้ยากกว่าครับ

ถึงเจตนาจะเป็นเช่นไร แต่ผมก็มีงานภาระหน้าที่ จึงเลือกที่จะสิงสถิตอยู่เพียงที่เดียวในแต่ละเวลาเท่านั้น เอื้อเฟื้อให้กับสังคม/วงการตามเวลาว่างที่จัดให้ได้น่ะครับ

หากจะค้นหาสิ่งที่ผมโม้ไว้ในอดีต ก่อนยุค Internet คงหายากแล้ว สมัยนั้นผมเขียนลงนิตยสาร Computer Review แต่ไม่ได้ชื่อจริง (เป็นยุคที่นิยมใช้นามปากกา เพื่อความเท่ห์) ผมมีเก็บไว้ในชั้นหนังสือประมาณ 30-40 เล่ม แต่ก็ไม่ครบทั้งหมด

หลังจากนั้น Modem เริ่มเร็วถึง 9,600 bps เริ่มเกิด BBS ในบ้านเรา ที่โด่งดังก็ของคุณไพศาล ของดร.โจ ผมจำไม่ได้แล้วว่าผมนิยมเชื่อมต่อ Server ของใคร เพราะเป็นสมาชิกไปเสียทุกที่ แต่จะเชื่อมต่อเพื่อรับส่ง Content/File/email เพียงที่เดียว โดยเลือกที่โด่งดังน้อยที่สุด เพราะสายโทรศัพท์จะว่างมากกว่าที่โด่งดังมาก อีกทั้งยังเป็นกำลังใจแก่ผู้ตั้ง Server เพราะ BBS นี่ เสียกับเสียเลยนะครับ ไม่สามารถ Make profit อะไรได้ เนื้อหาที่ผมโม้ไว้ใน BBS ผมไม่ได้เก็บไว้เลย ยกเว้น email ยังเก็บไว้ทั้งหมด แต่อยู่ในรูปแบบของ BlueWave Format ครับ ยุคนี้เป็นยุคที่เซียน Computer ใกล้ชิดกันมากที่สุดครับ อบอุ่น ตั้งแต่ Singapore ขึ้นมายันเมืองไทย โดยมี BBS ฝรั่งอยู่คนหนึ่ง ซึ่งมาอาศัย/ทำงานอยู่พัทยา เป็น Gateway หลักของไทยเรา เพื่อ Exchange กับ BBS ต่างประเทศ (ขออภัย ที่นึกชื่อไม่ออกจริงๆ ใครจำได้จะเสริมก็ได้นะครับ และถ้าผมจำผิดตรงไหน ก็ทักท้วงได้ครับ)

หลังจากยุค BBS เมื่อตอน Windows NT เกิดขึ้นมา ช่วงนั้นเป็นช่วงเงียบหายไปหลายปีของผม เพราะไปอยู่ต่างประเทศเสียมาก รับงานสร้างเครื่องจักร/หุ่นยนต์ต่างๆ ที่ใช้ในกระบวนการผลิตของโรงงานอุตสาหกรรม ร่วมกับวิศวกรมากมายหลายเชื้อชาติหลายบริษัท เป็นงาน Sub-contract จากบริษัทยักษ์ใหญ่ในวงการอีกที

กลับมาตั้งหลักที่เมืองไทยอีกครั้งเมื่อปี 39 (คราวนี้เริ่มจำได้ชัดขึ้น เพราะเวลาไม่ไกลมาก) เปลี่ยนวิธีคิดใหม่โดยทำงานเอาตัวเราเป็นศูนย์กลางแทน เพื่อลดการเดินทางลง เพราะมันเหนื่อย มันเบื่อ มันคิดถึงบ้านครับ ถึงแม้ตอนนี้ผมก็ไม่เคยได้ใช้ Passport จนหมดอายุเลย เล่มเต็มก่อนตลอด มันเอียนเครื่องบินจริงๆ นะครับ อย่าคิดว่าโชคดีได้เที่ยวบ่อยเลย (คนอื่นมักทักแบบนี้) เลยปฏิวัติการรับงานของตัวเอง เมื่อนั้นก็มีเวลาว่างขึ้นมาอีกครั้ง เพราะต้องสร้างฐานธุรกิจตาม Model ใหม่ของตัวเอง ได้ย้อนกลับมาดูในวงการของบ้านเรา พบว่าเซียนๆ หายไปเยอะ กลายร่างเป็น Business man เต็มตัวไปแล้วทั้งนั้น ท้อแท้กับคนรุ่นใหม่ในวงการอยู่หลายปีเพราะเจอแต่นักวิชาการเยอะแต่นักปฏิบัติแทบไม่มี (รู้กว้าง แต่ไม่ลึกซักอย่าง เหมือนเป็ด) จนกระทั่งเกิด Grand Linux และ LinuxTLE ผมจึงไปสังกัด opentle.org อยู่พักใหญ่ ตลอดช่วงที่ LinuxTLE ยัง Base อยู่บน Redhat/Fedora ครับ ก็คงหาอ่านในนั้นได้พอสมควร

เมื่อ LinuxTLE เริ่มจาง ไปเป็น SIS คำถามต่างๆ ใน Board ก็เริ่มลอยขึ้นไปในระดับ User/Implementor และบังเอิญได้พบ Link ของที่นี่ จึงตามมาดู ชอบใจ Concept ของเจ้าของ Web จึงย้ายมาที่นี่ครับ

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

เอากรณีเดียวก่อนนะครับ เดี๋ยว Blog ระเบิด แล้วจะโดนคุณ lew, mk เขาไล่ตะเพิดเอา ประมาณว่าเว็ปข่าว ไม่ใช่เว็บโชว์พาว... (ขอใช้ศัพท์วัยรุ่น กัดตัวเองดักไว้หน่อยนะครับ กันเด็กรุ่นใหม่หมั่นไส้แล้วเปิดประเด็นกับผมอีก)

ภาษาที่สูงกว่า Assembly ย่อมมี Overhead เสมอครับ กรณีแรกที่จะเล่าเลยคือ เรื่อง Register ครับ ที่ถ้าใช้ภาษาสูงกว่า Assembly แล้ว ไม่มีทางใช้ Register ได้อย่างเต็มประสิทธิภาพใน Processor ส่วนใหญ่ โดยเฉพาะ PC นี่แหละครับ ตัวดีเลย...

ยกตัวอย่างเลย.... สมมติ C Code เป็นดังนี้... (สมมติหยาบๆ นะครับ)

int i;

int j;

for (i = 0; i < 10; i++)

for (j = 0; i < 20; j ++)

target [i,j] = bla... bla....;

Native code ที่ได้จะมีกระบวนการประมาณนี้ (หยาบๆ อีกเช่นกัน - ระแวงการจับผิดเลยนะเนี่ย)

1) ทำ eax เป็น 0

2) mov [Address ของ i],eax // เอาค่าใน eax ไปใส่ใน i

3) ทำ eax เป็น 0 อีก // เข้า Loop แรก

4) mov [Address ของ j],eax // เอาค่าใน eax ไปใส่ใน j

5) อ่านค่าจาก Address ของ i // เข้า Loop ที่สอง

6) อ่านค่าจาก Address ของ j

7) เอามากำหนด Pointer เพื่อไปยัง target ที่ Array [i,j]

8) เข้าสู่กระบวนการ... เตรียมค่าให้ target

9) mov [Address ของ j],eax // เอาค่าใน j ไปใส่ใน eax

10) inc eax // เพิ่มค่า eax

11) mov eax,[Address ของ j] // เอาค่าใน eax ไปใส่ใน j

12) ตรวจสอบ eax ว่าเท่ากับ 20 หรือยัง ถ้ายังก็ย้อนไป 5)

13) mov [Address ของ i],eax // เอาค่าใน i ไปใส่ใน eax

14) inc eax // เพิ่มค่า eax

15) mov eax,[Address ของ i] // เอาค่าใน eax ไปใส่ใน i

16) ตรวจสอบ eax ว่าเท่ากับ 10 หรือยัง ถ้ายังก็ย้อนไป 3)

ข้อจำกัดของภาษาสูงคือ จะทำการ Clear การใช้งาน Register ก่อน Process ในแต่ละ Statement เสมอ เพื่อป้องกันการเกิด Bug จากความไม่รอบคอบของผู้เขียนภาษานั้น เพราะไม่ใช่สิ่งที่เป็นเป้าหมายของภาษาอยู่แล้ว ตัวภาษาถูกออกแบบมาเพื่อให้ผู้เขียนได้ Comfortable ขึ้น ข้อควรระวังจะได้ลดลง เขียนง่ายขึ้น สบายขึ้น ดังนั้นจึงเป็น Overhead เกิดขึ้นเสมอ....

เกิดขึ้นอย่างไร... ดู Process ต่อไปนี้ที่ทำงานเหมือน C Code ข้างบน เมื่อเป็น Assembly ใน x86 นะครับ...

1) Clear bx เป็น 0

2) push bx // เก็บ bx ลง Stack // เข้า Loop แรก

3) Clear cx เป็น 0

4) push cx // เก็บ cx ลง Stack // เข้า Loop ที่สอง

5) เตรียมข้อมูลให้ target ตามสบาย เพราะ cx และ dx ถูก Push ลง Stack ไว้แล้ว , สมมติว่าเตรียมใส่ ax แล้วกัน

6) pop cx

7) pop bx

8) เอาค่า ax ใส่ใน target ที่ Offset ตำแน่ง [cx,dx] // ถ้าไม่ใช่ x86 แล้ว หลาย Processor โดยเฉพาะ SoC ทั้งหลายสามารถอ้างถึง SRAM ได้โดยตรงโดยไม่ต้องกระทำค่าบน Registor ก่อนด้วยครับ

9) test cx ว่าได้ 20 หรือยัง ถ้ายัง ก็ goto 4)

10) test bx ว่าได้ 10 หรือยัง ถ้ายังก็ goto 2)

แจ๋มเลยไหมครับ? ข้อจำกัดแรกของภาษาสูงที่ผมอธิบาย คือคุณไม่สามารถใช้ Registor ได้อย่างเต็มที่และมีประสิทธิภาพครับ ภาษาสูงไม่ให้คุณเข้าถึงการกำหนด Registor ใดๆ โดยตรงทั้งสิ้นครับ มันเป็นนโยบายหลักของภาษาสูงอยู่แล้ว คือทำให้ง่ายในการเขียนครับ แลกกับ Overhead เข้าไปแทน

ปกติคุณใช้ Loop กันประจำอยู่แล้ว ตั้งตัวแปร Temporary กันประจำเพื่อนับ Loop กันอยู่แล้ว แต่ตัวแปรเหล่านั้น ภาษาสูงจะใช้หน่วยความจำจริงๆ ในการเก็บ และต้อง Load ไป Load มาระหว่าง Register กับ Memory ในตำแหน่งนั้นเสมอๆ ตลอดเวลา ซึ่งไม่มีความจำเป็น ในขณะที่เมื่อเขียนเป็น Assembly เราสามารถใช้ Registor ที่มีทั้งหมดได้ ซึ่งทำให้ความเร็วสูงกว่าภาษาสูงอีกหลายเท่าตัว (ถึงเป็นหลายร้อยเท่าตัวเลยทีเดียว เช่นใน Code ตัวอย่างที่ผมอธิบาย) เพราะการกระทำใน Registor อยู่ในภาย Processor เอง แต่การเคลื่อนข้อมูลกับหน่วยความจำ ต้องผ่าน Memory Bus ครับ มี Delay time ตามความเร็ว Bus และหน่วยความจำเอง

ทุก Statement ของภาษาสูง จะได้ Native code ที่ทำการ Clear การใช้งาน Registor ทุกตัวเสมอ ไม่ให้ข้าม Statement เพื่อไม่ให้เกิด Bug นี่เป็น Overhead แรกที่ผมนำมาอธิบายเพราะเป็น Overhead ที่มีมากที่สุดของภาษาสูงครับ (ย้ำว่า Overhead และ Garbage คือคนละคำกันนะครับ ทำความเข้าใจดีๆ)

ยิ่งโดยเฉพาะ PC แล้ว มี Register ให้ใช้หลายตัวเชียว แต่คุณจะไม่สามารถควบคุมให้ใช้ Registor ทั้งหมดได้เต็มประสิทธิภาพเลย สำหรับ Processor ที่มีเพียง Registor เดียว ก็จำเป็นต้องอาศัย Momory เหมือนกันครับ (ไม่มีเหลือแล้วมั๊งในปัจจุบัน Processor ที่มี Registor ให้แต่ตัวเดียวเนี่ย)

คุณคงนึกในใจว่า แล้วมีตรงไหนบน PC หรือ ที่ต้องเขียนขนาดนี้?

มีครับ เช่น... Display driver ไง...

ลอง Re-engineering ดูสิครับ เลือกเอา nVidia driver มาก็ได้ เอาบน Windows นี่เลยที่คุณผู้อ่านส่วนใหญ่ถนัดกันนี่แหละ.... พวกนี้ต้องการความเร็วสูงมากอยู่แล้ว (Render)

ลองคิดถึงว่า เมื่อคุณต้องการลดความสว่าง (ทำ Fade out) ในภาพ 3D ที่กำลังแสดงผลอยู่ทั้งภาพ ด้วยลดค่า R,G,B เพียงแค่ 1 เท่านั้น ของภาพหลังจากที่ GPU Render แล้วออกมาไว้ใน Video buffer เป็น 2D แล้วและกำลังส่งผลต่อไปยัง Buffer ที่จะให้ Circuit นำไปแสดงที่จอภาพต่อไป....

คุณจะ....

ลดค่า R, G, B ของทุก Pixel ด้วยการเขียน Code ใน Driver เป็นภาษาสูง ซึ่งต้อง Load ไป/มา กับ System memory มันตลอดทุก Loop แต่ละ Loop ต้อง Load ไป/มาหลายๆ ครั้ง หรือเปล่าครับ?

nVidia คงขายไม่ออกเป็นแน่แท้.....

และเหตุนี้เอง ความที่ผู้ที่นำ GPU ไป Implement ต่อแต่ละรายมัก Optimize Code ได้ไม่ดีพอ เช่น Asus, Gigabyte ซึ่งก็ต้องเขียน Driver ของตนเองขึ้นมาขายพร้อมกับ Card ส่งผลให้ nVidia พบว่ารีดศักยภาพได้ไม่เต็มที่ จึงทำให้ nVidia เองต้องตั้งทีมเขียน Driver สำหรับ GPU ของตนเองขึ้นมาซึ่งใช้ได้กับ Card ส่วนใหญ่ที่ใช้ GPU ของตน มีความ Optimize มากกว่า คือ Optimize ทั้ง Code และ Optimize Algorithm ด้วย

และส่งผลให้ ในกรณี Linux นั้น nVidia จึงไม่เต็มใจ Open source ทั้งหมดออกมา เพราะการ Open source ก็เท่ากับการเปิดเผยเคล็ดทาง Algorithm ด้วยนั่นเอง นี่ผมถือเป็นโอกาสได้อธิบายข้อข้องใจที่ผมผ่านตาที่คนสงสัยว่า nVidia หวงอะไรนักหนา?

การเปิด Code นั้นไม่ส่งผลต่อความลับในตัว GPU ของ nVidia ครับ แต่มันเปิดเผยการเร่งความเร็วที่ได้จากการ Coding และยังเป็นคำตอบที่ว่า ทำไม nv Driver แบบ Open source บน Linux ที่ xorg ทำกัน จึงยังไม่สามารถทำให้ได้ศักยภาพอย่าง Code ของ nVidia เองบน Windows Driver (ก็ nv เขียนเป็น Pure C ก็คงรอไปชาติหน้าเลยมั๊ง อาจจะได้ความเร็วไล่ทัน Windows ได้)

เวลาผมหมดแล้ว รู้สึกค้างคาในการอธิบายอย่างไรไม่รู้ แต่ต้องทำงานก่อนล่ะครับ ขอไว้เท่านี้ก่อน

By: Virusfowl
ContributorAndroidSymbianWindows
on 20 April 2012 - 21:40 #410718 Reply to:409430

ขอขอบคุณสำหรับความเห็นดีๆ อีกคนครับ ผมเข้าใจว่าเวลาของคุณมีค่ามากกว่าจะมาใช้ในการโต้เถียงกับคนที่ไม่เข้าใจวัตถุประสงค์ของการ "ถกกันทางวิชาการ" ในนี้แน่ๆ แต่การที่คุณสละเวลาอันมีค่าและเขียนอธิบายอย่างชัดเจน น่าจะทำให้คนที่เปิดใจอ่าน ได้เปิดโลกให้กว้างมากขึ้นอีกโขเลยล่ะ (ผมก็หนึ่งในนั้น)

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

ขอบคุณอีกครั้งครับ :)

ป.ล. น่าจะหาเวลาเขียนประสบการณ์ออกมาเป็นบล็อกหรือหนังสือบ้างนะครับ สิ่งที่สั่งสมมาจะได้ไม่เลือนหายไปกับกาลเวลา...


@ Virusfowl

I'm not a dev. not yet a user.

By: จักรนันท์ on 28 April 2012 - 15:21 #413678 Reply to:410718

ยินดีครับ ดีใจที่ได้ทราบว่า ข้อเขียนของผมยังมีผู้เห็นประโยชน์อยู่

สำหรับเรื่องเขียน Blog ผมไม่ถนัดครับ ผมมักจับประเด็นตามสมัยนิยมและอยู่ในแนวทางที่ตัวเองเชี่ยวชาญ ถ้าให้ผมใช้ตัวเองเป็นศุนย์กลาง ตั้ง Topic ขึ้นมาเขียนเองแบบ Blog style ผมก็จะไม่รู้ว่าจะเริ่มที่ตรงไหนดี มันมีเรื่องราวเยอะแยะไปหมด แม้กระทั่งสมัยที่เขียนบทความลงหนังสือ ก็จะอาศัยจับประเด็นในวงการตอนนั้นขึ้นมาครับ ดังนั้นถ้าผมสร้าง Blog มันคงออกมาสะเปะสะปะทีเดียว

และยังมีเหตุผลทางด้านเวลา ที่ผมไม่สามารถแบ่งเวลาให้ได้พอที่จะดูแลถึงขั้นทำ Blog ของตัวเองได้

ถึงกระทั่งหนังสือ สมัยก่อนพิมพ์ด้วย RW แล้วส่งไฟล์ให้ Edtior ก็พอแล้ว ทางนั้นจะเกลาให้ เรียบเรียงใหม่ ตรวจแก้ไข จัดเรียงพิมพ์ให้เอง ไอ้ผมมันก็คนนิสัยชอบพิมพ์สดๆ รวดเดียว ในลักษณะของการเล่าประสบการณ์ มาสมัยนี้มันกลายเป็นภาระของผู้เขียนไปตลอดจนถึงการวาง Layout ของ Content ไปเสียแล้ว

การเล่าของผม ผมจะไม่เล่า "ความรู้" เพราะเป็นสิ่งที่หาได้ง่ายเรียนรู้อยู่แล้ว ผมยึดลำดับการเกิดความเป็นจริงที่ว่า

  • ข้อเท็จจริง (Fact) คือสิ่งที่มีอยู่แล้ว ตั้งอยู่แล้ว รอบตัวเรา เป็นเงื่อนไขธรรมชาติ

  • ประสบการณ์ (Experience) คือวิธีการค้นพบข้อเท็จจริงใดๆ ด้วยสติปัญญาของมนุษย์

  • ความรู้ (Knowledge) คือบันทึกผลของประสบการณ์ ซึ่งเป็นแบบสรุป คัดย่อ ตัดทอน เพราะถูกจำกัดด้วยความจุของสื่อบันทึกและข้อจำกัดของการสื่อสารระหว่างมนุษย์ด้วยกันเอง

ในการร่ำเรียนของมนุษย์ ก็ไม่ต่างจากหลักการทาง Programming language นั่นคือ เริ่มเรียนจาก Knowledge เพื่อไม่ต้องเสียเวลาเริ่มกันจาก "การค้นหาข้อเท็จจริง" เพื่อให้มนุษย์นำไป Apply ต่อยอดต่อไปได้เลย เพราะข้อจำกัดที่สำคัญของเราคือ ช่วงชีวิต

เมื่อมีการค้นพบข้อเท็จจริงมากขึ้นเท่าไหร่ เวลาใน 1 ชีวิตของมนุษย์ก็ยิ่งไม่มีมากพอที่จะเรียนรู้จาก Base ขึ้นไปได้มากเท่านั้น จึงต้องตัดทอนเป็น Layer ออกไป ในขณะเดียวกันยิ่งมนุษย์เอาไป Apply ต่อยอดมากเท่าไหร่ ในอีกด้านของการเรียนรู้ ก็ยิ่งมีนวตกรรม/เทคโนโลยีให้เรียนรู้มากขึ้นเท่านั้น

Knowledge มันยังเติบโตไม่หยุดทั้งสองด้านครับ ยังมี Fact ที่เรายังไม่รู้อีกจำนวนมาก ไหนจะยังมีสิ่งที่เราเชื่อว่าเป็น Fact แต่เพราะประสบการณ์ของเผ่าพันธุ์เรายังไปไม่ถึงที่จะพบได้ว่ามันไม่ใช่ Fact และ/หรือไม่เป็น Fact เสมอไป และยังมีด้านที่เป็นนวตกรรม/เทคโนโลยีที่มนุษย์เราต่อยอดกันขึ้นไปเองอีก

อธิบายเท่านี้ คงจะพอเข้าใจได้ว่า Concept ผมคืออะไร จุดยืนผมอยู่ตรงไหน

จุดเสียของการแบ่ง Layer ในการเรียนรู้/ทำงาน/ต่อยอดของมนุษย์ก็คือ อัตตาของมนุษย์เอง เมื่อมนุษย์ผู้ใดเชื่อว่า ทุกสิ่งที่ตนรู้คือที่สุดแล้ว แล้วตีกรอบตัวเอง เติมแต่ง ใส่ไข่ความเชื่อจนกลายเป็นงมงายในบางครั้ง ไม่เปิดใจลงไป/ขึ้นไปดูใน Layer ติดๆ กัน/ใกล้เคียงกัน กลับกลายเป็นความแตกแยกไม่ลงรอย กลายเป็นความไม่สมบูรณ์ของผลงานของเผ่าพันธุ์ และเป็นทางตันแห่งการพัฒนาของ Human race ในที่สุด

นักปราชญ์ไม่หวงวิชา ไม่ใช่เพราะความเป็นคนดีครับ ที่จริงมันไม่เกี่ยวกันเลยระหว่าง ความถือตัว กับ ความดี แต่เพราะถ้าผู้ใดถึงระดับปราชญ์ ผู้นั้นย่อมพบข้อเท็จจริงว่า สิ่งต่างๆ มันมีมากมายเกินกว่าที่สมองมนุษย์แต่ละคนจะแบกได้หมด หวงไปก็เท่านั้นครับ เมื่อถึงจุดนี้ เขาจะละวางอัตตาลงเองโดยอัตโนมัติ ในมุมของผู้รู้แล้ว การสร้างทายาทสืบต่อความรู้ของตัวเองต่างหาก ที่ยากเย็นเหลือเกิน และจุดนี้เองที่ผู้รู้ทุกคนจะเข้าใจคำว่า "Born to be" ได้อย่างชัดเจนครับ ตลอดจนไปถึงที่จะเข้าใจได้ว่า "บัวสี่เหล่า" นั้น พระพุทธเจ้าไม่ได้หมายถึงคนดี/ไม่ดี อย่างที่คนส่วนใหญ่เข้าใจกันอยู่เลย

จบเรื่องปรัชญาดีกว่า มาเข้าเรื่อง Technic ที่ผมถนัดต่อดีกว่าครับ

สำหรับคุณ mk และคุณ lew ถ้ามันชักจะเยอะไปแล้ว ก็เตือนผมได้ ไม่ต้องเกรงใจนะครับ และขอขอบคุณที่ปล่อยให้โม้อยู่ได้อย่างนี้ครับ

Reply ที่แล้ว มีคนบอกผมว่า ผมพิมพ์ผิดอยู่สองแห่ง (Serious mis-typing) นะครับ ตรง Assembly code ใน Step ที่ 5) และ 8) ที่ผมพิมพ์เป็น cx และ dx ต้องเป็น bx และ cx นะครับ ที่ผิดตรงนี้มันถึงขั้นทำให้คนที่พยายามทำความเข้าใจตาม อาจทำยังไงก็ไม่อาจเข้าใจได้ เลยต้องแก้ครับ

จาก Reply ที่แล้ว เป็น Overhead แรกที่มีมากที่สุด ถ้าเอาประสบการณ์มาเล่าเป็น Case ก็จะเยอะมากมาย ขาดเขียนตำราหากินไปได้ตลอดชีวิตเลยทีเดียว นี่เป็นเหตุผลที่ผมได้เคยพูดว่า "Case ผมเยอะ" เพราะจะเอาตรงไหน Appliationใด โปรแกรมอะไร Platform ใด ที่เป็น High Level มาเป็นโจทย์ ก็ใช้ได้หมดโลก ตั้งแต่อดีตจนถึงปัจจุบัน และยังคงมีต่อไปในอนาคตครับ

Reply นี้จะขอเล่ากรณีที่สอง ซึ่งเป็น Overhead รอง เพราะบาง Compiler สร้าง Compiler directive และ/หรือ Macro ให้พอจะแก้ไขข้อจำกัดทางภาษาในกรณีนี้ได้ แต่ไม่มีความสามารถนี้ใน Compiler ทั้งหมดบน PC นะครับ มีในระดับ ARM และพวก Microcontroller ลงไป

นั่นคือการ กำหนด Instruction Algorithm ได้

ผมจะสมมติตัวอย่าง C Code แบบง่ายๆ หยาบๆ นะครับ

do

i += j;

{

if (condition) j--;

i++;

}

} while (another_condition);

ด้วยข้อจำกัดทางภาษา ใน Statement ที่ว่า i += j; จะแตกออกเป็น Native ที่ต้อง Load ค่า i และ j มาบวกกัน และค่าจะคาอยู่ที่ ax (ผมไม่ได้พูดถึง Overhead จากการ Load ไป/มาระหว่าง Register และ Memory ซึ่งมีอยู่แล้วแน่นอนนะครับ ขอให้ทำความเข้าใจตามดีๆ)

หลังจากตรวจสอบ condition แล้ว ถ้าเป็นเท็จ ก็จะต่อไป i++ ซึ่ง Native ที่ได้จะทำการ Load ค่าจาก Memory มาสู่ ax Register ใหม่อีกครั้งเสมอ เพราะภาษาต้องป้องกันกรณีที่ condition เป็นจริง ซึ่งค่าใน ax จะกลายเป็นค่าของ j ไปแล้ว

นี่คือข้อจำกัดทางภาษา ที่ไม่สามารถกำหนด Algorithm ลงไปขนาดนั้นได้ครับ ในเมื่อเราทราบว่า ค่า i คือสิ่งที่เราสนใจอยู่ แต่เพราะตัวภาษาไม่อาจทราบได้ว่า เจตนาของ Algorithm เป็นเช่นนั้น ไม่ว่า Compiler จะ AI ขนาดไหนในปัจจุบันนี้ ก็ไม่มีตัวไหนมีปัญญาทำความเข้าใจเจตนาของผู้ Coding จนผลิต Native ให้ออกมา Optimize ได้แบบดังต่อไปนี้ครับ... (Assembly หยาบๆ เช่นเคยนะครับ)

1).... 9) ขอข้าม i += j; ไปเลยนะครับ เพราะส่วนนี้ได้ Code ที่ Optimize กว่าอยู่แล้วตามกรณีแรก แต่นี่ผมกำลังอธิบาย OVerhead กรณีที่สองนะครับ

ตรง if (condition) j--; จะได้ Native ประมาณว่า

test condition // หรือ Flag อะไรก็ได้จากการเช็ค condition - ไม่ใช่จุดสนใจเลยขอหยาบๆ

jz NEXT

move ax,[Address ของ j]

dec ax

move [Address ของ j],ax

NEXT:

ตรง i++; จะได้ Native ประมาณว่า

move ax,[Address ของ i]

inc ax

move [Address ของ i], ax

Instruction สุดท้าย เป็น Overhead ของกรณีแรกนะครับ ไม่ใช่สิ่งที่ผมสนใจในขณะที่อธิบายกรณีที่สองอยู่นี้

Instruction ที่สองจากท้าย ได้ผลเหมือน Assembly เท่ากันอยู่แล้ว แต่... ดูที่ Instruction ที่สามจากท้ายครับ กับสังเกตุหลังตรวจสอบ condition ร่วมนะครับ

เพราะภาษาต้องปิดงานในทุก Statement ของภาษาเอง อีกทั้งไม่มี Compiler ใดเข้าใจเจตนาของผู้เขียนได้ ในขณะที่เมื่อเขียนเป็น Assembly แล้ว เราสามารถวาง Code ใหม่ ให้ทำงานเร็วขึ้นอีกเป็นร้อยเท่าตัวได้ง่ายๆ เช่นตัวอย่างหยาบๆ ต่อไปนี้ครับ

test condition // หรือ Flag อะไรก็ได้จากการเช็ค condition - ไม่ใช่จุดสนใจเลยขอหยาบๆ

jz NEXT

move ax,[Address ของ j]

dec ax

move [Address ของ j],ax

move ax,[Address ของ i]

NEXT:

inc ax

move [Address ของ i], ax

สังเกตุนะครับ ผมแค่ย้าย move ax,[Address ของ i] เท่านั้น ความเร็วเพิ่มขึ้นหลายร้อยเท่าตัวทันทีครับ เพราะเราทราบอยู่แล้วว่า ถ้า condition ไม่เป็นจริงแล้ว ค่าใน ax ยังคงเป็นค่าของ i อยู่เช่นเดิม จังไม่จำเป็นต้อง Load ค่ามาจาก Memory ใหม่ ซึ่งใช้เวลานานมาก แม้กระทั่ง Memory ที่เร็วที่สุดในปัจจุบัน ก็ยังใช้เวลานานกว่าการถ่ายเทค่าภายใน Register ที่อยู่ในตัว Processor เองถึงหลายร้อยเท่าตัวขึ้นไป

นี่ผมยังไม่แสดงถึงว่า แค่ Code นี้ เรา Optimize ได้มากกว่านี้อีก ถ้าจัดวางลำดับ Instruction ใหม่เท่านั้นเอง โดยที่ไม่ได้ลดขนาด Native code ลงด้วยนะครับ (อันนั้นมันเข้าสู่ Overhead กรณีแรก) นี่คือ Native ได้เท่าเดิมเลย

อ่านมาถึงตรงนี้... คงสงสัยกันอีกแล้วล่ะสิ ไอ้ "บ้าพลัง" นี่ มันเอาตรงไหนมาพล่ามหว่า ใน PC มีด้วยหรือ? (บ้าพลังหรือไม่ ถึงตอนนี้ผู้อ่านคงทราบแล้วว่า ที่จริง ยักษ์ของผมยังนอนกรนอยู่เลยครับ)

มีครับ เอาตัวอย่างบน Windows เช่นเคย ซึ่งผู้อ่านส่วนใหญ่ถนัด ก็เช่น Codec ทั้งหมดไงครับ ไหนจะ Compression tools ทั้งหลายอีก Spread sheet application ทั้งหลาย ...โอย... เยอะแยะไปหมดครับ

ลักษณะ Code ที่ทำ Loop ซ้ำๆ จะแยกประเด็นออกไปทำอย่างอื่นเป็นครั้งคราวตาม Period condition จะเจอ Overhead นี้ของภาษาทั้งนั้น

บนเครื่องทรัพยากรเยอะๆ อย่าง PC ที่สามารถ Coding แบบขี่ไดโนเสาร์จับอะมีบาได้ ก็ไม่จำเป็นต้องให้ความสำคัญในกรณีนี้ไปเสียทั้งหมดในการ Coding โปรแกรมใดๆ แต่อย่างกรณีเช่น Codec ก็หนีไม่พ้นครับ

PC ออกจะแร้งแรง กว่าจะ Decoding HD ได้ลื่น บริโภค Hardware แค่ไหนครับ?

กับอีกหลาย Embedded ที่มีทรัพยากรด้อยกว่ามากๆ แบบเทียบกันไม่ติด เขาก็ตามมา Decoding HD ได้บ้างเพราะอะไร?

และนี่เอง Compiler สำหรับ Processor เล็กๆ เหล่านี้ เลยต้องมี Compiler directive หรือ Macro พิเศษให้ผู้ Coding สามารถลงไปกำหนดลำดับ Instruction ด้วยตัวเองได้นั่นเอง แต่ PC ยังไม่มีเพราะ... เหลือเฟือเหลือเกินนั่นเอง เวลาจะต้องใช้ที เลยต้อง Inline Assembler ใส่ลงไปเลย

และอย่าง Spread sheet application ก็เช่นกัน นี่เป็นคำตอบที่ทำไม OpenOffice Calc ให้ความเร็วสู้ Excel ไม่ได้ และ ณ ตอนนี้ ไม่มีทางสู้ได้แน่นอน เพราะ OOO เป็น Open Source ที่มี Concept เป็น Single code ไปสู่ Multi architecture/Platform จึงต้องเขียนเป็น Pure C ให้มากที่สุด ดังนั้นการ Update แต่ละ Cell ซึ่งมีลักษณะการ Coding เป็น Loop เข้ากรณีที่สองที่ผมอธิบายนี้จึงมีมาก ในขณะที่ Excel นั้น M$ แยก Platform ในการ Compile และ Inline Assembler ในส่วนเหล่านี้ลงไปเพื่อ Optimize Algorithm ให้ได้ Performance สูง ที่จริงแล้ว M$ เขาถึงขนาดแยก Code ในแต่ละ Architecture เลยด้วยครับ

อธิบายกรณีที่สองแค่นี้นะครับ

มีเวลาแล้วจะมาร่ายกรณีต่อๆ ไปให้ เอาสัก 4-5 กรณีแรกก็พอ กรณีหลังๆ มันจะมี Case น้อยลงเรื่อยๆ

เรื่องเหล่านี้ไม่มีในตำราครับ ต่อให้หาบน Internet ก็ไม่มีเนื้อหาลงลึกแบบนี้ เพราะนี่คือการเล่า "ความเป็นจริง" ที่เกิดขึ้นจริงจากประสบการณ์ และดันเป็นสิ่งที่ "เซียน" ส่วนใหญ่ของโลก เขาหวงนักหวงหนา เพราะมันเป็นเหมือนเคล็ดวิชาที่เอาไว้สยบคนอื่นเขาไปได้ทั่ว ใช้เรียกค่าตัวแพงๆ หากินไปได้ตลอด เอาไว้ใช้เป็น Consult ก็ได้ เต๊ะจุ๊ยแล้วคอยตบหัวเด็กรุ่นใหม่ด้วยสิ่งเหล่านี้ แล้วยังได้ค่าตัวแพงอีก (ผมจะโดนดักตีหัวไหมเนี่ย?) ไหนจะยังเอาไว้ใช้ใส่ในผลิตภัณฑ์ของตัวเองให้เหนือกว่าคู่แข่งที่ดันมีแต่ทีมลูกจ้าง Software engineer ที่ไม่ลงลึกพอ (ทำให้ผมมีตลาดหากินอยู่ทุกวันนี้ ตลาดนี้โล่งสบาย คู่แข่งน้อยจนแทบไม่มี ที่มีก็ไม่น่าเรียกว่าคู่แข่ง เพราะเกี่ยงงานกันทั้งนั้น มันทำไม่ทันครับ - มาสิครับ มาจับตลาดนี้กัน คนไทยจะได้ผงาด)

เช่นเดียวกับที่ผมจะบอกว่า ที่มีผู้ใช้ C กล่าวกันเกลื่อนว่า "ผลงานจาก C ได้ Performance เกือบระดับเดียวกัน" ลามไปถึงว่า "เผลอๆ จะดีกว่า" นั้น แค่สองกรณีแรกที่ผมยกข้อจำกัดทางภาษามาอธิบาย ก็เห็นได้แล้วว่า "เป็นไปไม่ได้ที่ C จะได้ Native ที่มี Performance ดีกว่า Assembly" ครับ

เมื่อภาษาอื่นนอกจาก Assembly จัดระดับกันเองแล้ว จะให้ C อยู่ล่างสุด ถือได้ว่าใกล้เคียง Assembly ที่สุดแล้ว นั่นกล่าวถูกต้องครับ แต่อย่าเข้าใจผิดในเรื่องหนึ่งคือ....

ในวิธีการเทียบดังกล่าวนั้น ถ้าดูเฉพาะ Gap ระหว่าง C กับ Assembly แล้ว โดยไม่มี Gap ระหว่าง C กับภาษาอื่นข้างบนมาเป็น Scale วัด ผมจะขอใช้คำว่า "ยังห่างไกล" ครับ ชนิดที่ว่าเป็นไปไม่ได้เลยทีเดียว ที่ Pure C จะได้ Code ที่มี Performace ใกล้เคียง Assembly ได้

ขอให้ผู้ที่ถนัด C ทั้งหลาย จงอย่าใส่ไข่ความรู้/ความเชื่อของตัวเองจนล้นหลามไปแบบนั้นครับ

ยกตัวอย่างข่าวเรื่อง Source code ของ POP (Prince Of Persia) แล้วกันครับ ผู้อ่านไปฮือฮากันที่ Code เป็น Assembly ล้วนๆ แต่... มีใครสังเกตุไหมครับ? ว่า Native ของทั้ง Game รวมไปถึง Data ของ Game ไม่ว่าจะเสียง ดนตรี ตลอดไปจน Story board และ Save Game สามารถบรรจุในแผ่น Diskette ขนาด 720KB ได้?

ขอให้เซียน C ทั้งโลก ลองใช้ Pure C เขียน Game ลักษณะเดียวกัน ละเอียดเท่ากัน มีเนื้อหาเท่ากัน แล้ว Compile ด้วย Compiler ใดๆ ที่เซียนผู้นั้นถนัดที่สุด Optimize ได้เป็นที่สุด เขียนออกมาดูสิครับ ว่าจะทำให้อยู่ใน 720KB ได้ไหม? และยังทำงานบน Processor ที่มีหน่วยความจำเพียงแค่ 640KB ด้วยความเร็วแค่ 16MHz ได้หรือไม่?

เอาสิครับ จะ "บ้าพลัง C" สักแค่ไหน ก็ลองพยายามดูกันนะครับ (C, Pascal และ Assembly ทั้งสามคือภาษาอันดับ 1 ของผม แต่เจอโจทย์อย่างนี้ ผมก็ขอบายล่ะครับ เพราะรู้ว่า เป็นไปไม่ได้)

By: Go-Kung
iPhoneWindows PhoneAndroidBlackberry
on 28 April 2012 - 17:52 #413723 Reply to:413678

ได้ความรู้อีกเยอะเลย ขอบคุณมากครับ

By: Virusfowl
ContributorAndroidSymbianWindows
on 1 May 2012 - 00:43 #414547 Reply to:413678

^_^ โดยส่วนตัวผมมีความรู้ด้านเทคนิคที่คุยๆ กันนี้น้อยมากๆ ยิ่ง coding ยิ่งแล้วใหญ่ แม้พื้นก็ไม่มี แต่ก็ยังชอบอ่านครับ ส่วนไหนไม่รู้เรื่องก็ข้ามๆ ไป แต่ชอบความเห็นในเว็บนี้ เพราะถกกันด้วยเหตุผล+หลักฐาน ไม่ใช่อารมณ์ :D

ส่วนความเห็นของคุณ จักรนันท์ ผมชอบส่วนที่เป็นปรัชญานะครับ พอได้อ่านอะไรที่ทำให้เรารู้สึกว่า มนุษย์นี้ช่างกระจ้อยร่อยนัก ก็เป็นการลดอัตตาของตัวเองลงได้

บางทีเรื่องการหวง/ไม่หวงความรู้ ก็เป็นข้อสงสัยของผมเช่นกัน เพราะบางทีผมก็รู้สึกว่า ทำไมคนเราต้องหวงความรู้กันด้วยนะ ทำไมบางคนก็กระจายความรู้กันแค่คนในกลุ่มหรือเฉพาะพวกพ้อง แต่ในบางครั้ง ผมก็รู้สึกว่าตัวเองก็เป็นอย่างนั้นเหมือนกัน บางทีเราก็กลับรู้สึกว่า "เฮ้ยไม่ใช่หน้าที่" ทำไมเราจะต้องไปนั่งไล่บอกคนโน้นบอกคนนี้ ในเรื่องที่เขาไม่รู้ด้วยล่ะ อะไรประมาณนี้

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

เอ๊ะ! รู้สึกจะไม่เกี่ยวกับหัวข้อข่าวเลยสินะ :P

edit: ลืมเขียน ^^ มัวแต่บ่นเรื่องตัวเอง

"ผมมักจับประเด็นตามสมัยนิยมและอยู่ในแนวทางที่ตัวเองเชี่ยวชาญ" อ่านประโยคนี้แล้วผมนึกถึงคุณหมอจิม @jimmy_live แฮะ มีอยู่ช่วงนึงที่คุณหมอแกจะทำ live tweeting เกือบทุกคืน ตามอ่านแล้วได้แง่มุมจากประเด็นในตอนนั้นๆ ได้ดีมากเลย อีกคนที่เคยมี live tweeting ก็ อาจารย์ไพศาล @paisalvision ผมชอบที่อ.แกมาเล่าประสบการณ์เรื่องโน้นเรื่องนี้(ไม่ใช่วิจารณ์การเมืองอะนะ) อ่านตอนหัวค่ำ+ถึงดึกๆ หน่อย แล้วได้อารมณ์เหมือนคุณตามาเล่านิทานให้หลานๆ ฟังก่อนนอนดีอ่า :) แต่ประเด็นคือปัจจุบันนี้ ทั้ง 2 ท่านที่ว่ามา ก็เลิกทำ live tweeting กันหมดแล๊ว T_T


@ Virusfowl

I'm not a dev. not yet a user.

By: Go-Kung
iPhoneWindows PhoneAndroidBlackberry
on 12 April 2012 - 12:58 #407451 Reply to:407410

ผมว่าคุณออกตัวแรงไปหน่อย UltimaWeapon ครับ

คอมเมนท์ก่อนมาเป็นชุดเลยทั้ง Asslembly ของอะไร, นู่นนี่ผมไม่รู้จัก ไม่ผมโง่ก็คุณมั่ว, ยกตัวอย่างให้ดูหน่อย

พออีกฝั่งยกตัวอย่างมาพร้อมอธิบายทั้งหมด คุณกลับบอกว่าเลิกตีกันเหอะ ตัดบทดื้อๆทันที

By: idxn
iPhoneAndroidUbuntu
on 15 April 2012 - 22:38 #408374 Reply to:407451

+1

By: BLiNDiNG
AndroidUbuntuWindowsIn Love
on 11 April 2012 - 17:44 #407151 Reply to:406882
BLiNDiNG's picture

ในไทยไม่ค่อยมีงานแนวๆ OS , แนวๆ linux ล่ะมั้งครับ

By: จักรนันท์ on 12 April 2012 - 05:18 #407376 Reply to:407151

เอ๋... สถิตินั่น แค่ในเมืองไทยหรือครับ? ผมไม่ทันสังเกตุ

ถ้าแค่ในไทย งั้นผมไม่แปลกใจ แต่ถ้าเป็นสถิติทั่วโลก ยังไงก็ยังแปลกใจ ที่ Ada นิยมกว่า Assembly ได้ยังไง ผมคงรู้จักงานที่ใช้ Ada น้อยไปจริงๆ

By: จักรนันท์ on 16 April 2012 - 15:40 #408502 Reply to:407376

เสาร์-อาทิตย์ที่ผ่านมา ได้พบเพื่อนเก่าหลายคน หนึ่งในนั้นเป็นอาจารย์ วศ.ม. บางมดอยู่ คุยกันสนุกออกรส และผมได้หยิบกรณี Assembly VS Ada นี่ขึ้นมาสนทนากับเขา ได้ฟังความเห็นที่น่าสนใจมา จึงมา Reply ตอบตัวเองในนี้ และเผื่อเป็นประโยชน์ต่อท่านอื่นต่อไป สรุปได้ดังนี้...

สถาบันการศึกษาในเมืองไทย โดยมากนิยมใช้ Pascal ในการปูพื้นการคิดอย่างมีโครงสร้างให้แก่นักศึกษา แต่สถาบันต่างชาติจำนวนมาก นิยมใช้ Ada ในการสอนปูพื้น ดังนั้นจากสถิติซึ่งน่าจะวัดจากการ Download และ/หรือ ดัชนีคำในการค้นหาของ Search engine ต่างๆ จึงมีจำนวนที่เกี่ยวข้องกับ Ada สูงกว่า แม้ว่าในการทำงานจริง Ada จะมีเหลือใช้น้อยมากแล้วก็ตาม

ด้วยความเห็นที่ผมได้รับฟังมานี้ ทำให้ผมหายสงสัยแล้วว่า Ada ยังเหลือใช้มากอยู่ที่ใด

By: Yoeko
iPhoneAndroidWindows
on 18 April 2012 - 06:16 #409259 Reply to:408502
Yoeko's picture

ผมไม่เคยเขียน Ada เลย ภาษานี้คือภาษาระดับไหนครับ high หรือ low ครับ

By: Go-Kung
iPhoneWindows PhoneAndroidBlackberry
on 18 April 2012 - 11:36 #409335 Reply to:409259

High ครับ

จัดว่าเป็น Pure OO ภาษาแรกเลยก็ได้

By: BLiNDiNG
AndroidUbuntuWindowsIn Love
on 21 April 2012 - 23:58 #411151 Reply to:407376
BLiNDiNG's picture

ป่าวครับ ผมตอบคุณ ultima weapon ที่บอกว่า

"ในไทยแลนด์งานเกี่ยวกับ C/C++ แทบจะไม่มีกันเลยทีเดียว มีแต่ Java, C#, PHP ซะส่วนมาก"

By: projectsoft.biz
Windows
on 11 April 2012 - 10:45 #406888

long live php

By: Go-Kung
iPhoneWindows PhoneAndroidBlackberry
on 11 April 2012 - 12:41 #406961

ของ VB, VB.NET มันเป็นการ Transfer กันเองรึเปล่า

แบบคนย้ายจาก VB มาเขียน VB.NET แทน

By: cavaji
AndroidUbuntu
on 11 April 2012 - 12:42 #406962
cavaji's picture

ยังรู้เรื่องอยู่

C, Java, C++, Objective-C, C#, PHP, Visual Basic, JavaScript

By: cloverink
iPhoneAndroidUbuntuWindows
on 11 April 2012 - 12:57 #406974
cloverink's picture

อืมมมม ก้มหน้าก้มตาเขียนโปรแกรมต่อไป :3

By: Architec
ContributorWindows PhoneAndroidWindows
on 11 April 2012 - 15:50 #407077

ถ้าชีวิตยังมีแรงก็จะไม่ขอแตะ VB ตลอดกาล

By: punbodyslam
iPhone
on 11 April 2012 - 15:57 #407087

Native Client ครับ

By: jonathanz on 11 April 2012 - 17:38 #407145

แอบเชียร์ Python อยู่ลึกๆ

By: sornram9254
Windows PhoneAndroidUbuntuWindows
on 11 April 2012 - 22:46 #407278
sornram9254's picture

Perl จงเจริญ... * 0 *

By: panuphong
Android
on 12 April 2012 - 11:51 #407424
panuphong's picture

นึกว่าอ่านพันทิพอยู่

By: pittaya
WriterAndroidUbuntuIn Love
on 12 April 2012 - 14:33 #407487
pittaya's picture

JavaScript ไม่แรงอย่างที่คิดแฮะ


pittaya.com