คอมไพเลอร์ดำเนินการ การรวบรวมภาษาโปรแกรม การแปล bytecode เป็นรหัสเครื่อง

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

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

ในบทความนี้ เราจะดูวิธีการคอมไพล์โปรแกรม Linux กระบวนการคอมไพล์ทำงานอย่างไร และความยืดหยุ่นที่คุณสามารถกำหนดค่าทุกอย่างได้

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

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

sudo apt ติดตั้ง manpages-dev ที่จำเป็นต่อการสร้าง git automake autoconf

จากนั้นคุณสามารถตรวจสอบการติดตั้งและเวอร์ชันคอมไพเลอร์ที่ถูกต้อง:

แต่ก่อนที่จะไปยังการคอมไพล์โปรแกรม เรามาพิจารณาองค์ประกอบของกระบวนการนี้โดยละเอียดก่อน

การคอมไพล์ทำอย่างไร?

การคอมไพล์โปรแกรม Linux เป็นกระบวนการที่ค่อนข้างซับซ้อน มันซับซ้อนยิ่งกว่านั้นเพราะโค้ดโปรแกรมไม่ได้อยู่ในไฟล์เดียวหรือแม้แต่ในไฟล์ต้นฉบับทั้งหมด แต่ละโปรแกรมใช้ไลบรารีระบบจำนวนมากที่มีฟังก์ชันมาตรฐาน นอกจากนี้ รหัสเดียวกันจะต้องทำงานบนระบบที่แตกต่างกันซึ่งมีไลบรารีเวอร์ชันต่างกัน

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

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

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

การคอมไพล์โปรแกรม Linux

สิ่งแรกที่เราต้องการคือซอร์สโค้ดของตัวโปรแกรมเอง ในตัวอย่างนี้ เราจะสร้าง vim เวอร์ชันล่าสุด นี่เป็นโปรแกรมที่เป็นกลางโดยสิ้นเชิง ค่อนข้างเรียบง่ายและมีประโยชน์สำหรับทุกคน ดังนั้นจึงเหมาะอย่างยิ่งสำหรับเป็นตัวอย่าง

กำลังรับแหล่งที่มา

สิ่งแรกที่เราต้องการคือซอร์สโค้ดของโปรแกรม ซึ่งสามารถพบได้บน GitHub คุณสามารถค้นหาซอร์สสำหรับโปรแกรม Linux ส่วนใหญ่ได้ใน GitHub นอกจากนี้ยังมีคำแนะนำในการประกอบ:

มาดาวน์โหลดซอร์สของโปรแกรมของเราโดยใช้ยูทิลิตี้ git:

คอมไพล์โคลน https://github.com/vim/vim

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

กำลังตั้งค่าคอนฟิก

ต่อไปเราจำเป็นต้องเรียกใช้สคริปต์ที่จะตรวจสอบโปรแกรมของเราว่าเข้ากันได้กับระบบและกำหนดค่าพารามิเตอร์การคอมไพล์ มันถูกเรียกว่า configuration และจัดทำโดยนักพัฒนาโปรแกรมพร้อมกับซอร์สโค้ด กระบวนการคอมไพล์ทั้งหมดอธิบายไว้ใน Makefile ซึ่งจะถูกสร้างขึ้นโดยยูทิลิตี้นี้

หากการกำหนดค่าไม่ได้อยู่ในโฟลเดอร์ต้นทาง คุณสามารถลองเรียกใช้สคริปต์ต่อไปนี้เพื่อสร้าง:

./bootstrap
$ ./autogen.sh

คุณยังสามารถใช้ยูทิลิตี้ automake เพื่อสร้างสคริปต์นี้:

คำเตือน
$ส่วนหัวอัตโนมัติ
$ automake --gnu --add-missing --copy --foreign
$ autoconf -f -กำแพง

ยูทิลิตี้ automake และอื่น ๆ ในชุดสร้างไฟล์ที่จำเป็นตามไฟล์ Mackefile.am ไฟล์นี้จำเป็นในโครงการส่วนใหญ่

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

./configure --help

ลองดูตัวเลือกที่ใช้บ่อยที่สุดที่เป็นมาตรฐานสำหรับทุกโปรแกรม:

  • --คำนำหน้า=คำนำหน้า- โฟลเดอร์สำหรับติดตั้งโปรแกรมแทนที่จะเป็น / เช่นอาจเป็น /usr/local/ จากนั้นไฟล์ทั้งหมดจะไม่กระจายไปตามระบบไฟล์หลัก แต่อยู่ใน /usr/local
  • --bindir=DIR- โฟลเดอร์สำหรับวางไฟล์ปฏิบัติการจะต้องอยู่ใน PREFIX
  • --libdir=DIR- โฟลเดอร์เริ่มต้นสำหรับการวางและค้นหาไลบรารี่ใน PREFIX
  • --includedir=DIR- โฟลเดอร์สำหรับวางหน้าคน
  • --disable-คุณลักษณะ- ปิดการใช้งานคุณสมบัตินี้
  • --เปิดใช้งานคุณสมบัติ- เปิดใช้งานคุณสมบัติ;
  • --with-library- ชอบเปิดใช้งานเปิดใช้งานไลบรารีหรือไฟล์ส่วนหัวที่ระบุ
  • --ไม่มีห้องสมุด- การปิดใช้งานนี้จะปิดใช้งานการใช้ไลบรารี

คุณสามารถเรียกใช้การกำหนดค่าโดยไม่มีตัวเลือกเพื่อใช้ค่าเริ่มต้น แต่คุณสามารถระบุเส้นทางที่คุณต้องการได้ด้วยตนเอง ในกรณีของเรา ./configure อยู่ที่นั่นและเราสามารถใช้มันได้:

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

ในกรณีนี้ เราจำเป็นต้องติดตั้งไลบรารี่ที่จำเป็น ตัวอย่างเช่น โปรแกรมเสนอคำสาป ดังนั้นเราจึงใส่:

sudo apt ติดตั้ง libncurces-dev

คำนำหน้า lib จะถูกเพิ่มก่อนไลบรารีเสมอ และ -dev หมายความว่าเราต้องการไลบรารีที่มีไฟล์ส่วนหัวทั้งหมด เมื่อการขึ้นต่อกันทั้งหมดเสร็จสิ้น การตั้งค่าจะสำเร็จ

การสร้างโปรแกรม

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

หลังจากนี้โปรแกรมจะถูกติดตั้งในโฟลเดอร์ที่คุณระบุและคุณสามารถใช้งานได้ แต่วิธีที่ถูกต้องกว่าคือการสร้างแพ็คเกจเพื่อติดตั้งโปรแกรมซึ่งทำได้โดยใช้ยูทิลิตี้ checkinstall ซึ่งช่วยให้คุณสร้างแพ็คเกจทั้ง deb และ rpm ได้ดังนั้นจึงสามารถใช้ได้ไม่เพียง แต่ใน Ubuntu เท่านั้น แทนที่จะทำการติดตั้ง ให้รัน:

จากนั้นเพียงติดตั้งแพ็คเกจผลลัพธ์โดยใช้ dpkg:

sudo dpkg ติดตั้ง vim.deb

หลังจากนี้การประกอบโปรแกรมก็เสร็จสมบูรณ์และติดตั้งเรียบร้อย จึงสามารถใช้งานต่อได้เต็มประสิทธิภาพ

หากคุณติดตั้งโปรแกรมโดยใช้ make install คุณสามารถลบออกได้โดยการรันคำสั่งย้อนกลับในโฟลเดอร์เดียวกัน:

sudo ทำการถอนการติดตั้ง

คำสั่งจะลบไฟล์ทั้งหมดที่ถูกคัดลอกไปยังระบบไฟล์

ข้อสรุป

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

เพื่อสรุปวิดีโอเกี่ยวกับความหมายของคอมไพเลอร์และล่าม:

คอมไพเลอร์- โปรแกรมหรือเครื่องมือทางเทคนิคที่ทำงาน การรวบรวม.

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

รวบรวม- แปลโปรแกรมเครื่องจากภาษาเชิงปัญหาเป็นภาษาเชิงเครื่อง

ประเภทของคอมไพเลอร์

    การทำเวกเตอร์-

    แปลซอร์สโค้ดเป็นโค้ดเครื่องบนคอมพิวเตอร์ที่ติดตั้งโปรเซสเซอร์เวกเตอร์ยืดหยุ่นได้

    -ออกแบบในลักษณะโมดูลาร์ ขับเคลื่อนด้วยตารางและตั้งโปรแกรมด้วยภาษาระดับสูงหรือใช้งานโดยใช้คอมไพเลอร์ของคอมไพเลอร์

    กล่องโต้ตอบ-

    ดู: นักแปลบทสนทนาเพิ่มขึ้น

    -ส่งชิ้นส่วนของโปรแกรมอีกครั้งและส่วนเพิ่มเติมโดยไม่ต้องคอมไพล์ใหม่ทั้งโปรแกรม

    การตีความ (ทีละขั้นตอน)-

    กำจัดข้อผิดพลาดทางไวยากรณ์บางประเภทถิ่นที่อยู่

    -โดยจะอยู่อย่างถาวรใน RAM และพร้อมสำหรับการนำกลับมาใช้ใหม่ในงานต่างๆ มากมาย

    เรียบเรียงด้วยตนเอง-

เขียนด้วยภาษาเดียวกับที่ใช้ในการออกอากาศ

    สากล-

    อิงตามคำอธิบายอย่างเป็นทางการของไวยากรณ์และความหมายของภาษาที่ป้อน ส่วนประกอบของคอมไพเลอร์ดังกล่าวคือ: เคอร์เนล, ตัวโหลดวากยสัมพันธ์และความหมายประเภทของการรวบรวม

    แบทช์-

รวบรวมโมดูลซอร์สหลายรายการเป็นรายการงานเดียว

ทีละบรรทัด

    -

    เช่นเดียวกับการตีความ

    มีเงื่อนไข

    -

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

โครงสร้างคอมไพเลอร์

กระบวนการรวบรวมประกอบด้วยขั้นตอนต่อไปนี้:

การวิเคราะห์คำศัพท์ ในขั้นตอนนี้ ลำดับของอักขระในไฟล์ต้นฉบับจะถูกแปลงเป็นลำดับของโทเค็น

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

ผลลัพธ์ของการคอมไพล์ - โมดูลปฏิบัติการ - มีประสิทธิภาพสูงสุดที่เป็นไปได้ แต่เชื่อมโยงกับระบบปฏิบัติการและโปรเซสเซอร์เฉพาะ (และจะไม่ทำงานกับผู้อื่น)

เครื่องเป้าหมายแต่ละเครื่อง (IBM, Apple, Sun ฯลฯ) และแต่ละระบบปฏิบัติการหรือตระกูลระบบปฏิบัติการที่ทำงานบนเครื่องเป้าหมายจำเป็นต้องเขียนคอมไพเลอร์ของตัวเอง นอกจากนี้ยังมีสิ่งที่เรียกว่า คอมไพเลอร์ข้ามช่วยให้คุณสามารถสร้างโค้ดบนเครื่องหนึ่งและในสภาพแวดล้อมระบบปฏิบัติการหนึ่งที่มีจุดประสงค์เพื่อดำเนินการบนเครื่องเป้าหมายอื่นและ/หรือในสภาพแวดล้อมระบบปฏิบัติการอื่น นอกจากนี้ คอมไพลเลอร์ยังสามารถปรับโค้ดให้เหมาะสมสำหรับรุ่นต่างๆ จากตระกูลโปรเซสเซอร์เดียวกัน (โดยรองรับคุณสมบัติเฉพาะรุ่นหรือส่วนขยายชุดคำสั่ง) ตัวอย่างเช่น โค้ดที่คอมไพล์สำหรับโปรเซสเซอร์ตระกูล Pentium สามารถคำนึงถึงคุณสมบัติของคำสั่งแบบขนาน และใช้ส่วนขยายเฉพาะ - MMX, SSE เป็นต้น

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

การสร้าง Bytecode

ผลลัพธ์ของการทำงานของคอมไพเลอร์อาจเป็นโปรแกรมในภาษาระดับต่ำที่สร้างขึ้นเป็นพิเศษซึ่งอาจมีการตีความ เครื่องเสมือน- ภาษานี้เรียกว่ารหัสเทียมหรือรหัสไบต์ ตามกฎแล้ว ไม่ใช่รหัสเครื่องของคอมพิวเตอร์เครื่องใด ๆ และโปรแกรมบนเครื่องนั้นสามารถดำเนินการได้บนสถาปัตยกรรมต่าง ๆ ที่มีเครื่องเสมือนที่เกี่ยวข้อง แต่ในบางกรณี แพลตฟอร์มฮาร์ดแวร์จะถูกสร้างขึ้นเพื่อรองรับรหัสเทียมของภาษาโดยตรง ตัวอย่างเช่น pseudocode ของ Java เรียกว่า Java bytecode รหัสไบต์ Java) และทำงานใน Java Virtual Machine ข้อมูลจำเพาะของโปรเซสเซอร์ picoJava ถูกสร้างขึ้นสำหรับการดำเนินการโดยตรง สำหรับ .NET Framework โค้ดเทียมเรียกว่า Common Intermediate Language (CIL) และรันไทม์เรียกว่า Common Language Runtime (CLR)

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

การรวบรวมแบบไดนามิก

บทความหลัก: การรวบรวม JIT

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

รหัส CIL ยังถูกคอมไพล์เป็นรหัสเครื่องเป้าหมายโดยคอมไพเลอร์ JIT และไลบรารี .NET Framework จะถูกคอมไพล์ล่วงหน้า

การแยกส่วน

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

แยกการรวบรวม

แยกการรวบรวม(ภาษาอังกฤษ) การรวบรวมแยกต่างหาก) - การแปลส่วนต่างๆ ของโปรแกรมแยกกัน ตามด้วยการรวมกันโดยตัวเชื่อมโยงเป็นโมดูลโหลดเดียว

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

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

ประเภทของคอมไพเลอร์

  • การทำเวกเตอร์- แปลซอร์สโค้ดเป็นโค้ดเครื่องบนคอมพิวเตอร์ที่ติดตั้งโปรเซสเซอร์เวกเตอร์
  • แปลซอร์สโค้ดเป็นโค้ดเครื่องบนคอมพิวเตอร์ที่ติดตั้งโปรเซสเซอร์เวกเตอร์- ออกแบบในลักษณะโมดูลาร์ ขับเคลื่อนด้วยตารางและตั้งโปรแกรมด้วยภาษาระดับสูงหรือใช้งานโดยใช้คอมไพเลอร์ของคอมไพเลอร์
  • -- ดู: นักแปลบทสนทนา
  • กล่องโต้ตอบ- ส่งชิ้นส่วนของโปรแกรมอีกครั้งและส่วนเพิ่มเติมโดยไม่ต้องคอมไพล์ใหม่ทั้งโปรแกรม
  • การตีความ (ทีละขั้นตอน)- ดำเนินการรวบรวมคำสั่งแต่ละรายการ (คำสั่ง) ของโปรแกรมต้นฉบับอย่างเป็นอิสระตามลำดับ
  • คอมไพเลอร์คอมไพเลอร์- นักแปลที่ยอมรับคำอธิบายอย่างเป็นทางการของภาษาการเขียนโปรแกรมและสร้างคอมไพเลอร์สำหรับภาษานี้
  • การตีความ (ทีละขั้นตอน)- กำจัดข้อผิดพลาดทางไวยากรณ์บางประเภท
  • กำจัดข้อผิดพลาดทางไวยากรณ์บางประเภท- โดยจะอยู่อย่างถาวรใน RAM และพร้อมสำหรับการนำกลับมาใช้ใหม่ในงานต่างๆ มากมาย
  • -- เขียนด้วยภาษาเดียวกับที่ใช้ในการออกอากาศ
  • เรียบเรียงด้วยตนเอง- อิงตามคำอธิบายอย่างเป็นทางการของไวยากรณ์และความหมายของภาษาที่ป้อน ส่วนประกอบของคอมไพเลอร์ดังกล่าวคือ: เคอร์เนล, ตัวโหลดวากยสัมพันธ์และความหมาย

ประเภทของการรวบรวม

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

โครงสร้างคอมไพเลอร์

กระบวนการรวบรวมประกอบด้วยขั้นตอนต่อไปนี้:

  1. การวิเคราะห์คำศัพท์ ในขั้นตอนนี้ ลำดับของอักขระในไฟล์ต้นฉบับจะถูกแปลงเป็นลำดับของโทเค็น
  2. การวิเคราะห์เชิงวากยสัมพันธ์ (ไวยากรณ์) ลำดับของโทเค็นจะถูกแปลงเป็นแผนผังการแยกวิเคราะห์
  3. การวิเคราะห์ความหมาย แผนผังการแยกวิเคราะห์ได้รับการประมวลผลเพื่อสร้างความหมาย (ความหมาย) - ตัวอย่างเช่น การผูกตัวระบุเข้ากับการประกาศ ประเภท การตรวจสอบความเข้ากันได้ การกำหนดประเภทนิพจน์ ฯลฯ โดยทั่วไปผลลัพธ์จะเรียกว่า "การเป็นตัวแทน/รหัสระดับกลาง" และสามารถขยายได้โดย แผนผังการแยกวิเคราะห์ แผนผังใหม่ ชุดคำสั่งเชิงนามธรรม หรืออย่างอื่นที่สะดวกสำหรับการประมวลผลต่อไป
  4. การเพิ่มประสิทธิภาพ การลบโครงสร้างที่ไม่จำเป็นออกและทำให้โค้ดง่ายขึ้นโดยยังคงความหมายของโค้ดไว้ การเพิ่มประสิทธิภาพอาจอยู่ที่ระดับและขั้นตอนที่แตกต่างกัน เช่น ในโค้ดระดับกลางหรือในโค้ดเครื่องขั้นสุดท้าย
  5. การสร้างรหัส จากการแสดงระดับกลาง รหัสในภาษาเป้าหมายจะถูกสร้างขึ้น

ในการใช้งานคอมไพลเลอร์เฉพาะ ขั้นตอนเหล่านี้สามารถแยกออกหรือรวมกันในรูปแบบใดรูปแบบหนึ่งได้

การสร้างรหัส

การสร้างรหัสเครื่อง

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

ผลลัพธ์ของการคอมไพล์ - โมดูลปฏิบัติการ - มีประสิทธิภาพสูงสุดที่เป็นไปได้ แต่เชื่อมโยงกับระบบปฏิบัติการและโปรเซสเซอร์เฉพาะ (และจะไม่ทำงานกับผู้อื่น)

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

การสร้าง Bytecode

ผลลัพธ์ของคอมไพเลอร์อาจเป็นโปรแกรมในภาษาระดับต่ำที่สร้างขึ้นเป็นพิเศษซึ่งอาจมีการตีความ เครื่องเสมือน- ภาษาดังกล่าวเรียกว่ารหัสเทียมหรือรหัสไบต์ ตามกฎแล้ว ไม่ใช่รหัสเครื่องของคอมพิวเตอร์เครื่องใด ๆ และโปรแกรมในนั้นสามารถดำเนินการได้บนสถาปัตยกรรมต่าง ๆ ที่มีเครื่องเสมือนที่เกี่ยวข้อง แต่ในบางกรณี แพลตฟอร์มฮาร์ดแวร์จะถูกสร้างขึ้นเพื่อรองรับรหัสเทียมของภาษาโดยตรง ตัวอย่างเช่น รหัสเทียมของภาษา Java เรียกว่า Java bytecode และทำงานใน Java Virtual Machine และข้อกำหนดโปรเซสเซอร์ picoJava ถูกสร้างขึ้นเพื่อดำเนินการโดยตรง สำหรับ .NET Framework โค้ดเทียมเรียกว่า Common Intermediate Language (CIL) และรันไทม์เรียกว่า Common Language Runtime (CLR)

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

การรวบรวมแบบไดนามิก

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

รหัส CIL ยังถูกคอมไพล์เป็นรหัสเครื่องเป้าหมายโดยคอมไพเลอร์ JIT และไลบรารี .NET Framework จะถูกคอมไพล์ล่วงหน้า

การแยกส่วน

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

แยกการรวบรวม

แยกการรวบรวม(ภาษาอังกฤษ) การรวบรวมแยกต่างหาก) - การแปลส่วนต่างๆ ของโปรแกรมแยกกัน ตามด้วยการรวมกันโดยตัวเชื่อมโยงเป็นโมดูลโหลดเดียว

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

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

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

ดูสิ่งนี้ด้วย

หมายเหตุ

วรรณกรรม

  • อัลเฟรด ดับเบิลยู. อาโฮ, โมนิกา เอส. แลม, ราวี เซธี, เจฟฟรีย์ ดี. อุลล์แมนคอมไพเลอร์: หลักการ เทคโนโลยี และเครื่องมือ = คอมไพเลอร์: หลักการ เทคนิค และเครื่องมือ - ฉบับที่ 2 - อ.: วิลเลียมส์, 2010. - 1184 น. - ไอ 978-5-8459-1349-4
  • โรบิน ฮันเตอร์.แนวคิดพื้นฐานของคอมไพเลอร์ = สาระสำคัญของคอมไพเลอร์ - อ.: วิลเลียมส์, 2545. - 256 หน้า - ไอ 0-13-727835-7
  • ฮันเตอร์ อาร์.การออกแบบและสร้างคอมไพเลอร์ / การแปล จากอังกฤษ เอส.เอ็ม. ครูโกวอย. - อ.: การเงินและสถิติ, 2527. - 232 น.
  • ดี. เครนชอว์มาสร้างคอมไพเลอร์กันเถอะ!
  • Serebryakov V. A. , Galochkin M. P.พื้นฐานของการออกแบบคอมไพเลอร์

มูลนิธิวิกิมีเดีย 2010.

คำพ้องความหมาย:

ดูว่า "คอมไพเลอร์" ในพจนานุกรมอื่น ๆ คืออะไร:

    - (lat. ใหม่, จาก lat. รวบรวมเป็น rob, rob, เลือก) เรียบเรียงบทความหรือหนังสือโดยยืมข้อความจากงานเขียนของผู้เขียนต่างๆ พจนานุกรมคำต่างประเทศที่รวมอยู่ในภาษารัสเซีย Chudinov A.N., 1910. คอมไพเลอร์... ... พจนานุกรมคำต่างประเทศในภาษารัสเซีย

    ดูนักเขียน... พจนานุกรมคำพ้องความหมายภาษารัสเซียและสำนวนที่คล้ายกัน ภายใต้. เอ็ด N. Abramova, M.: พจนานุกรมรัสเซีย, 1999. ผู้เรียบเรียง, นักเขียน; นักแปล, แฮ็ค, โปรแกรมพจนานุกรมคำพ้องความหมายภาษารัสเซีย... พจนานุกรมคำพ้อง

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

    COMPILER คือโปรแกรมคอมพิวเตอร์ที่แปลสัญลักษณ์ของภาษาการเขียนโปรแกรมเป็นคำสั่งที่คอมพิวเตอร์สามารถเข้าใจได้โดยตรง โปรแกรมส่วนใหญ่เขียนด้วยภาษาระดับสูง เช่น C, Pascal หรือ BASIC... พจนานุกรมสารานุกรมวิทยาศาสตร์และเทคนิค

    คอมไพเลอร์, คอมไพเลอร์, สามี (หนังสือ). ผู้เขียนเรียบเรียง. - นักเขียนที่สามารถเขียนได้เฉพาะการรวบรวมเท่านั้น (ละเลย) คอมไพเลอร์ที่น่าสงสาร พจนานุกรมอธิบายของ Ushakov ดี.เอ็น. อูชาคอฟ พ.ศ. 2478 พ.ศ. 2483 ... พจนานุกรมอธิบายของ Ushakov

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

ภาษาของระบบปฏิบัติการ

ประการแรก เป็นสิ่งที่ควรค่าแก่การสรุป เนื่องจากการเขียนโปรแกรมไม่เพียงแต่เกี่ยวกับการขับเคลื่อนคำสำคัญบางคำลงในเครื่องจักรเท่านั้น แต่ยังเกี่ยวกับการดำเนินการอย่างรอบคอบที่เกี่ยวข้องกับส่วนประกอบของระบบอีกด้วย เริ่มแรกมีรหัสไบนารี่จากนั้นโปรแกรมเมอร์ก็สร้างภาษาโปรแกรมกึ่งเครื่อง - แอสเซมเบลอร์ แต่เพื่ออะไร?

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

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

ในยุค 80 พวกเขาตัดสินใจที่จะเกิดภาษาโปรแกรมที่จะทำให้การเขียนระบบปฏิบัติการเป็นเรื่องง่ายและสะดวก นี่คือลักษณะที่ C และคอมไพเลอร์ C GCC จาก GNU ปรากฏขึ้น หากคุณใช้ Linux คุณต้องเคยเห็นผลิตภัณฑ์ของบริษัทนี้มาก่อน อย่างไรก็ตามแอสเซมเบลอร์ยังคงใช้อยู่ในปัจจุบันเนื่องจากคอมไพเลอร์บางตัวสร้างไฟล์อ็อบเจ็กต์ด้วยรหัสไบนารี่และไฟล์ปฏิบัติการอื่น ๆ - ด้วยรหัสแอสเซมบลี ทุกอย่างขึ้นอยู่กับแพลตฟอร์มของนักพัฒนา

คอมไพเลอร์สมัยใหม่ประกอบด้วยโปรแกรมต่อไปนี้:

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

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

คอมไพเลอร์ธรรมดาตัวแรก

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


เป็นไปได้ไหมที่จะสร้างโดยไม่มีภาษาใหม่?

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


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

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

สุดยอดคอมไพเลอร์ Windows

ดังนั้นผู้อ่านหลายคนรู้ว่ามีภาษาที่ตายแล้วอยู่หลายภาษา แต่ยังมีภาษาที่ยังมีชีวิตอยู่อีกมากมาย นั่นคือภาษาที่อัปเดตไลบรารีมาตรฐานของตนอย่างน้อยปีละครั้ง ดังที่เราได้กล่าวไปแล้ว C ถูกสร้างขึ้นในปี 1980 ซึ่งเป็นความก้าวหน้าครั้งยิ่งใหญ่ บรรพบุรุษของเราหลายคนยังคงชื่นชอบภาษานี้ แต่ตอนนี้ล่ะ?

เขาใช้ชีวิตและเจริญเติบโตในร่างใหม่ ทายาทของมันคือ C++ อย่างถูกต้อง แม้ว่าผู้สร้างจะถูกห้ามไม่ให้เขียนโค้ดที่คล้ายกับ C ในนั้น แต่โปรแกรมเมอร์หลายคนเพิกเฉยและทำเช่นนั้น แต่เหตุใดจึงอนุญาตให้มีการละเมิดกฎอย่างร้ายแรงเช่นนี้


    ประการแรก ไลบรารีมาตรฐานได้รับส่วนแบ่งอย่างมีนัยสำคัญจาก C และคอมไพเลอร์ G++ ใหม่สามารถคอมไพล์โค้ด C ได้ ซึ่งในตัวมันเองบ่งบอกถึงความคล้ายคลึงกัน ประการที่สอง C++ ถูกสร้างขึ้นเพื่อแทนที่ C และตอนนี้เราก็เห็นผลลัพธ์แล้ว อย่างไรก็ตามโปรแกรมคอมไพเลอร์ G++ จะไม่ "สาบาน" จนกว่าจะมีการใช้คลาสอย่างน้อยหนึ่งคลาส - นี่คือความแตกต่างที่สำคัญระหว่างสองภาษา คุณสามารถเรียก G++ ว่าเป็นคอมไพเลอร์ที่ดีที่สุดได้ ไม่ใช่เพราะว่าแอปพลิเคชันมือถือ ระบบปฏิบัติการ Windows ฯลฯ ถูกเขียนขึ้นเพื่ออะไร

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


พยายามอ่านหนังสือให้มากที่สุดเท่าที่จะเป็นไปได้ไม่เพียง แต่เกี่ยวกับพื้นฐานของการเขียนโปรแกรมเท่านั้น แต่ยังเกี่ยวกับประวัติความเป็นมาของการสร้างภาษาด้วยดังนั้นคุณจะเริ่มเข้าใจสาระสำคัญของกระบวนการอย่างแน่นอน พยายามผสมผสานการฝึกฝนและความรู้ใหม่ๆ เข้าด้วยกัน ด้วยวิธีนี้คุณจะจำทุกอย่างได้เร็วยิ่งขึ้น นอกจากนี้ พยายามพัฒนาภาษาอังกฤษของคุณให้อยู่ในระดับกลางเป็นอย่างน้อย มิฉะนั้น คุณจะใช้งาน IDE ได้ยากมาก

ในที่สุด

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

สวัสดีผู้อ่านที่รัก! วันนี้เราจะมาเจาะลึกทฤษฎีกันสักหน่อย แน่นอนว่าคุณทุกคนเคยอยากส่งโปรแกรม super-duper ของคุณไปให้เพื่อน แต่จะทำอย่างไร? อย่าบังคับให้เขาติดตั้ง PascalABC.NET! วันนี้เราจะพูดถึงวิธีการทำเช่นนี้

ภาษาการเขียนโปรแกรมทั้งหมดแบ่งออกเป็นสองประเภท - ตีความได้และ รวบรวม.

ล่าม

เมื่อเขียนโปรแกรมในภาษาที่แปลแล้ว เราจะเขียนโปรแกรมที่ไม่ต้องรันในโปรเซสเซอร์ แต่ให้รันโดยโปรแกรมล่าม เรียกอีกอย่างว่าเครื่องเสมือน

ตามกฎแล้วโปรแกรมจะถูกแปลงเป็นโค้ดระดับกลางซึ่งก็คือชุดคำสั่งที่เครื่องเสมือนสามารถเข้าใจได้

เมื่อตีความ โค้ดจะถูกดำเนินการตามลำดับทีละบรรทัด (จากคำสั่งหนึ่งไปยังอีกคำสั่งหนึ่ง) ระบบปฏิบัติการสื่อสารกับล่าม ไม่ใช่ซอร์สโค้ด

ตัวอย่างของภาษาที่ตีความ: PHP, JavaScript, C#, Python

โปรแกรมที่คอมไพล์ทำงานเร็วขึ้น แต่ใช้เวลามากในการรวบรวมซอร์สโค้ด

โปรแกรมที่ออกแบบมาสำหรับล่ามสามารถดำเนินการได้ในระบบใดๆ ที่มีล่ามดังกล่าวอยู่ ตัวอย่างทั่วไปคือโค้ด JavaScript เบราว์เซอร์สมัยใหม่ใด ๆ ทำหน้าที่เป็นล่าม คุณสามารถเขียนโค้ด JavaScript ได้เพียงครั้งเดียว รวมถึงโค้ดนั้นในไฟล์ html และโค้ดจะทำงานเหมือนกันในทุกสภาพแวดล้อมที่มีเบราว์เซอร์ ไม่สำคัญว่าจะเป็น Safari บน Mac OS หรือ Internet Explorer บน Windows

คอมไพเลอร์

คอมไพเลอร์คือโปรแกรมที่เปลี่ยนซอร์สโค้ดที่เขียนด้วยภาษาโปรแกรมเป็นคำสั่งเครื่อง

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

เมื่อเรียบเรียงทั้งหมดแล้ว รหัสแหล่งที่มา(อันที่โปรแกรมเมอร์เขียน) จะถูกแปลเป็นภาษาเครื่องทันที ที่เรียกว่าแยก ไฟล์ปฏิบัติการซึ่งไม่เกี่ยวข้องกับซอร์สโค้ด ระบบปฏิบัติการรับประกันการทำงานของไฟล์ปฏิบัติการ ตัวอย่างเช่น ไฟล์ .EXE ถูกสร้างขึ้น

ตัวอย่างของภาษาที่คอมไพล์: C, C++, Pascal, Delphi

ความคืบหน้าของคอมไพเลอร์

กำลังประมวลผลล่วงหน้า

การดำเนินการนี้ดำเนินการ ตัวประมวลผลล่วงหน้าข้อความ.

ข้อความต้นฉบับได้รับการประมวลผลบางส่วน - มีการสร้างสิ่งต่อไปนี้:

  • แทนที่ความคิดเห็นด้วยบรรทัดว่าง
  • การเชื่อมต่อโมดูล ฯลฯ ฯลฯ

การรวบรวม

ผลการคอมไพล์ก็คือ รหัสวัตถุ.

รหัสวัตถุเป็นโปรแกรมในภาษารหัสเครื่องพร้อมการเก็บรักษาข้อมูลสัญลักษณ์บางส่วนที่จำเป็นในระหว่างกระบวนการประกอบ

เค้าโครง

เค้าโครงอาจมีชื่อต่อไปนี้: ผูก, การประกอบหรือ การเชื่อมโยง.

นี่เป็นขั้นตอนสุดท้ายในกระบวนการรับไฟล์ปฏิบัติการซึ่งประกอบด้วย การเชื่อมโยงไฟล์วัตถุโครงการทั้งหมดเข้าด้วยกัน.

ไฟล์ EXE.

หลังจากลิงค์แล้ว คุณจะมีไฟล์ .EXE ของโปรแกรมของคุณ คุณสามารถโยนมันให้เพื่อนได้ และมันจะเปิดขึ้นมาในบรรทัดคำสั่ง เช่นเดียวกับใน DOS รุ่นเก่าที่ดี มาลองสร้างไฟล์ .EXE กัน การดำเนินการทั้งหมดจะได้รับใน PascalABC.NET

ไปที่เครื่องมือ -> การตั้งค่า -> ตัวเลือกการคอมไพล์ เราตรวจสอบว่ามีการทำเครื่องหมายในช่องถัดจาก 2 จุดหรือไม่ ถ้าเป็นเช่นนั้นเราจะลบมันออก

ตอนนี้เปิดโปรแกรมของคุณแล้วรัน

เปิดไดเร็กทอรีที่คุณมีซอร์สโค้ดของโปรแกรม

นี่คือไฟล์ .EXE

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


เราเชื่อมต่อไลบรารี CRT ภายนอกและใช้ฟังก์ชัน Readkey ที่มีอยู่ในตัว

ตอนนี้หน้าต่างจะปิดเมื่อคุณกดปุ่มใดก็ได้

หมายเหตุ: PascalABC.NET เป็นสภาพแวดล้อมการพัฒนาแบบรวม

สภาพแวดล้อมการพัฒนาประกอบด้วย:

  • โปรแกรมแก้ไขข้อความ
  • คอมไพเลอร์;
  • เครื่องมือประกอบอัตโนมัติ
  • ดีบักเกอร์

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



มีคำถามหรือไม่?

แจ้งการพิมพ์ผิด

ข้อความที่จะส่งถึงบรรณาธิการของเรา: