หลังจากลงอะไรที่หาสาระไม่ค่อยจะได้มาหลายครั้ง
เลยคิดว่า บางทีเราก็ควรทำตัวมีสาระบ้างจะดีไหม?
โพสนี้เลยจะเป็นเรื่องที่มีสาระขึ้นมาบ้าง ซึ่งจะเป็นเรื่องเกี่ยวกับ Compiler (คอมไพเลอร์) นะครับ
ต้องเท้าความก่อนว่าผมเพิ่งเรียนวิชาคอมไพเลอร์จบมา เลยอย่างลองเอามาเล่าๆ
นอกจากนั้น การเป็นโปรแกรมเมอร์ ก็ควรจะต้องรู้จักคอมไพเลอร์(จริงไหม?)
งั้นไปเริ่มกันเลยยยย
Compiler, what is it?
“ก่อนจะรันได้ ก็ต้องคอมไพล์โปรแกรมก่อนนะ”
“คอมไพล์ไม่ผ่านนน ผิดอะไรไม่รู้อ่า”
เวลา(หัด)เขียนโปรแกรม ก็มักจะเจอสองประโยคข้างต้น สรุปแล้วไอ้การคอมไพล์ และคอมไพเลอร์มันคืออะไรกันล่ะ?
พูดสั้นๆ รวบรัด
คอมไพเลอร์ก็คือโปรแกรมชนิดหนึ่ง ซึ่งมีหน้าที่ แปลงโปรแกรมจากภาษา(คอมพิวเตอร์)ชนิดหนึ่ง ไปเป็นอีกภาษาหนึ่ง
ดังนั้นเวลาที่เราคอมไพล์โปรแกรมที่เราเขียน เช่น C, Java คอมไพเลอร์ซึ่งเป็นโปรแกรมแปลภาษาก็จะทำหน้าที่ตรวจสอบความถูกต้อง และแปลภาษานั้นๆไปเป็นอีกโปรแกรมที่เหมือนกันในอีกภาษาหนึ่งเช่น Assembly อะไรแบบนี้
แค่แอสเซมบลี หรือภาษาเครื่องเองหรอ?
จากที่ยกตัวอย่างข้างต้น คอมไพเลอร์อาจจะเปลี่ยนภาษาจาก C, Java เป็น Assembly แต่จริงๆแล้ว คอมไพเลอร์แปลจากภาษาหนึ่ง ไปเป็นอีกภาษาหนึ่งซึ่งเป็นภาษาอะไรก็ได้
ดังนั้น เราอาจจะแปลภาษา C เป็น Java, Python หรือ ภาษาอะไรก็ได้
โดยคอมไพเลอร์ที่ถูกเขียนก็จะสามารถแปลภาษาได้เฉพาะแค่ที่ถูกเขียนมา ซึ่งนั่นก็เป็นเหตุให้ บางทีเราอาจจะต้องคอมไพล์หลายครั้ง เช่นนน
- เราอยากแปลจากภาษา A เป็น C
- แต่เราดันไม่มีคอมไพเลอร์ที่สามารถเปลี่ยน A เป็น C ได้โดยตรง
- เรามีแค่คอมไพเลอร์ที่สามารถเปลี่ยน A เป็น B และเปลี่ยน B เป็น C
- จะไปยากอะไร เราก็เปลี่ยนจาก A เป็น B ก่อนดิ! แล้วค่อยใช้คอมไพเลอร์อีกตัวเปลี่ยน B เป็น C ไง
Compiler is a program…
อย่างที่บอกข้างต้นแหละครับ คอมไพเลอร์ก็คือโปรแกรมชนิดหนึ่ง เพราะฉะนั้น
- คอมไพเลอร์ต้องรันด้วยภาษาชนิดหนึ่ง ในที่นี้จะเป็นภาษาอะไรก็ได้ อาจจะเป็น Assembly, Machine Language, Java, C
- เพราะคอมไพเลอร์เป็นโปรแกรม เราก็ต้องคอมไพล์คอมไพเลอร์ได้ด้วยสิ? ใช่แล้วว เวลาที่เราพัฒนาคอมไพเลอร์ เราก็ต้องคอมไพล์มันได้
- แล้วถ้าคอมไพล์คอมไพเลอร์ จะได้อะไร? – เราก็ได้คอมไพเลอร์นั่นแหละครับ แต่เป็นคอมไพเลอร์ที่รันด้วยภาษาอื่น เช่นเราเขียนคอมไพเลอร์ที่ใช้แปลภาษาจากA เป็น B โดยไอ้เจ้าคอมไพเลอร์ของเราเขียนด้วยภาษา C แต่เครื่องที่บ้านเพื่อนดันใช้ภาษา D เราก็ต้องคอมไพล์คอมไพเลอร์ของเรา ซึ่งก็จะได้คอมไพเลอร์ที่ใช้แปลภาษาจากA เป็น B ซึ่งเป็นคอมไพเลอร์ที่รันบนภาษา D งงไหม? ถ้างง ดูรูป
Compiler VS Interpreter
คอมไพเลอร์น่ะ คือตัวแปลภาษาของโปรแกรม เช่น โปรแกรมบวกเลขที่เขียนบนC ให้เป็นโปรแกรมบวกเลขในภาษาAssembly แล้วเราค่อยเอาโปรแกรมบวกเลขในภาษาAssemblyไปรันอีกที
ในขณะที่ อินเทอร์พรีเตอร์(Interpreter) (เขียนเป็นภาษาไทยยากเนอะ) นั้นคือตัวแปลคำสั่ง อธิบายให้ชัดๆเลยคือ อินเทอร์พรีเตอร์ (ปาดเหงื่อ = =”a) เนี่ย จะได้ผลออกมาทันที เช่นนน
- เรามีโปรแกรมบวกเลขที่เขียนโดยภาษา C แต่เครื่องเราอะทำงานด้วยภาษา A เพราะฉะนั้น เราก็รันโปรแกรมบวกเลขตรงๆบนเครื่องไม่ได้
- ถ้าเรารันโปรแกรมบวกเลขโดยอินเทอร์พรีเตอร์ที่ใช้รันภาษาC โดยอาศัยภาษาAเป็นตัวรัน(จำได้ใช่ไหม อินเทอร์พรีเตอร์ก็เป็นโปรแกรม) อินเทอร์พรีเตอร์ก็จะเปลี่ยนโปรแกรมเราเป็นภาษาA แล้วรันทันที เพราะฉะนั้นเราก็จะได้ลองเห็นโปรแกรมเราเลย
- แต่ถ้าเราคอมไพล์โปรแกรมบวกเลขของเราด้วยคอมไพเลอร์ที่เปลี่ยนจากภาษาC เป็น ภาษาA เราจะได้โปรแกรมบวกเลขในภาษาA แล้วค่อยเอาไปรันอีกที
เอ้า!!! แล้วทำไมเราถึงใช้คอมไพเลอร์อ่ะ? ทำไมไม่ใช้อินเทอร์พรีเตอร์ไปเลย? – คำตอบคือมันช้ากว่าไง ดูอย่าง Javaที่มี Java Virtual Machine เป็นอินเทอร์พรีเตอร์ มันเลยช้ากว่า C ที่รันได้ตรงๆ
เอ้า(ที่2)!!! แล้วทำไมใช้อินเทอร์พรีเตอร์อ่ะ? – การทำงานบางอย่าง เราก็อยากเห็นผลก่อนไงเช่น การจำลองโปรแกรมแอนดรอยด์ ใครเคยเขียนแอนดรอยด์แล้วจำลองก็คงจะรู้ มันช้าแค่ไหนนน
Compilers are all around…
มาถึงตรงนี้ บางคนที่ไม่ใช่สายคอมฯอาจจะคิดว่า “คอมไพเลอร์มันไม่เห็นจะสำคัญอะไรกับชีวิตฉันเลย”
เด็กสายคอมก็อาจจะยังคงคิดว่า “ก็ใช้ๆไป ไม่เห็นจะต้องสนใจ ใส่ใจอะไรกับมันเลย”
คุณอาจจะกำลังคิดผิด เพราะจริงๆแล้วคอมไพเลอร์(และอินเทอร์พรีเตอร์)นั้นอยู่(เกือบจะ)รอบๆตัวเราเลยนะ!
เช่น สำหรับคนทำงานเขียนโปรแกรม เราก็ต้องใช้คอมไพเลอร์ในการทำงานถูกไหม
แต่ให้ลองนึกถึงเวลาเล่นอินเตอร์เน็ต อินเทอร์พรีเตอร์จะคอยทำหน้าที่แปลงภาษาจาก PHP เป็น HTML กลายเป็นหน้าเวปไซต์ให้เราใช้ แล้วด้านหลังก็ยังมีการใช้งานพวก SQL ไว้ใช้เรียกข้อมูลจากฐานข้อมูลอีก เห็นยังงงง ว่ามันสำคัญนะ!!
เขียนมาพอสมควร คิดว่าหลายๆคนคงจะรู้จักคอมไพเลอร์เพิ่มขึ้น
ไว้ครั้งหน้าจะมาต่อนะครับว่าเบื้องลึกเบื้องหลังนั้น “คอมไพเลอร์ทำงานอย่างไร” ทำไมคอมไพล์ไม่ผ่าน