ຄອມພິວເຕີ, ດໍາເນີນໂຄງການ
ກະຈາຍສຽງ - ເປັນ ... ປະເພດຂອງ compilers. ແປງແລະບັນດາໂຄງການກະຈາຍ
ໂຄງການ, ເຊັ່ນດຽວກັນກັບປະຊາຊົນທີ່ຈະແປພາສາຈາກພາສາຫນຶ່ງໄປຍັງອີກຕ້ອງການລ່າມແປພາສາ.
ແນວຄິດພື້ນຖານ
ໂຄງການດັ່ງກ່າວແມ່ນເປັນຕົວແທນພາສາຂອງການຄິດໄລ່: ຂ້າພະເຈົ້າ→ P → P (i). ລ່າມແປພາສາເປັນໂຄງການທີ່ຖືກສະຫນອງໃຫ້ແກ່ໂຄງການການປ້ອນຂໍ້ມູນ P ແລະບາງວັດສະດຸປ້ອນ x ໄດ້. ມັນສະແດງຢູ່ດ້ານ P x: ຂ້າພະເຈົ້າ (P, x) = P (x). ຄວາມຈິງທີ່ວ່າມີພຽງແຕ່ຫນຶ່ງແປພາສາແມ່ນສາມາດປະຕິບັດບັນດາໂຄງການທີ່ເປັນໄປໄດ້ທັງຫມົດ (ຊຶ່ງສາມາດເປັນຕົວແທນໃນລະບົບຢ່າງເປັນທາງການ) ເປັນ profound ຫຼາຍແລະທີ່ສໍາຄັນ Turing ການຄົ້ນພົບ.
ໂຮງງານຜະລິດເປັນນາຍແປພາສາຂອງບັນດາໂຄງການໃນພາສາເຄື່ອງ. ໂດຍທົ່ວໄປມີລາຄາແພງເກີນໄປທີ່ຈະຂຽນນາຍພາສາສໍາລັບພາສາໃນລະດັບສູງ, ສະນັ້ນພວກເຂົາເຈົ້າແປເປັນຮູບແບບທີ່ງ່າຍຕໍ່ການຕີຄວາມຫມາຍ.
ບາງປະເພດຂອງຜູ້ແປພາສາມີຊື່ strange ຫຼາຍ:
- ການປະກອບແປໂຄງການພາສາປະກອບເປັນພາສາເຄື່ອງ.
- The compiler ແປພາສາໃນລະດັບສູງທີ່ຈະເປັນພາສາຕ່ໍາ.
ກະຈາຍສຽງ - ແມ່ນໂຄງການທີ່ໃຊ້ເວລາເປັນຂໍ້ມູນປ້ອນຂໍ້ມູນໂຄງການທີ່ເປັນພາສາບາງ S ແລະສາມາດຜະລິດໂຄງການ T ໃນລັກສະນະທີ່ພວກເຂົາເຈົ້າທັງສອງມີຄວາມຫມາຍດຽວກັນໄດ້: P → X → Q. ຫມາຍຄວາມວ່າ, ∀x. P (x) = Q (x).
ຖ້າຫາກວ່າການອອກອາກາດຂອງໂຄງການທັງຫມົດເຂົ້າໄປໃນບາງສິ່ງບາງຢ່າງຕີຄວາມຫມາຍໄດ້, ມັນຖືກເອີ້ນວ່າການລວບລວມກ່ອນການປະຕິບັດ, ຫຼື AOT ລວບລວມໄດ້. AOT compiler ສາມາດຖືກນໍາໃຊ້ໃນໄລຍະການ, ສຸດທ້າຍຂອງທີ່ມັກເປັນຜູ້ປະກອບການ, ສໍາລັບການຍົກຕົວຢ່າງ:
ແຫລ່ງລະຫັດ compiler → (ຜູ້ແປ) →→ປະກອບລະຫັດປະກອບ (compiler) ລະຫັດ→→ເຄື່ອງ CPU (ນາຍພາສາ).
ການປະຕິບັດຫຼືເຄື່ອນໄຫວລວບລວມເກີດຂຶ້ນຖ້າຫາກວ່າໂຄງການໄດ້ຖືກອອກອາກາດ, ໃນເວລາທີ່ປະຕິບັດໂດຍພາກສ່ວນທີ່ຖືກລວບລວມໃນເມື່ອກ່ອນອື່ນ. JIT-compilers ຈື່ສິ່ງທີ່ເຂົາເຈົ້າໄດ້ເຮັດມາແລ້ວດັ່ງນັ້ນເປັນທີ່ຈະບໍ່ເຮັດເລື້ມຄືນລະຫັດແຫຼ່ງອີກເທື່ອຫນຶ່ງແລະອີກເທື່ອຫນຶ່ງ. ພວກເຂົາເຈົ້າເຖິງແມ່ນວ່າສາມາດຜະລິດການລວບລວມດັດແປງງ່າຍແລະ recompilation ອີງໃສ່ພຶດຕິກໍາຂອງສະພາບແວດລ້ອມປະຕິບັດໂຄງການດັ່ງກ່າວ.
ພາສາຈໍານວນຫຼາຍອະນຸຍາດໃຫ້ປະຕິບັດລະຫັດທີ່ໃຊ້ເວລາລວບລວມແລະສັງລວມລະຫັດໃຫມ່ຢູ່ໃນອຸ.
ຂັ້ນຕອນຂອງການແປພາສາ
ອອກອາກາດຄັ້ງປະກອບດ້ວຍຂັ້ນຕອນຂອງການວິເຄາະແລະສັງເຄາະໄດ້:
ແຫລ່ງລະຫັດວິເຄາະ→→→ຈືຂໍ້ມູນການກໍາເນີດໄຟຟ້າເປັນຕົວແທນ (synthesizer) → code ເປົ້າຫມາຍ.
ນີ້ແມ່ນເນື່ອງມາຈາກເຫດຜົນດັ່ງກ່າວ:
- ວິທີການອື່ນໆແມ່ນບໍ່ເຫມາະສົມ. ການແປພາສາຄໍາສັບພຽງແຕ່ບໍ່ໄດ້ເຮັດວຽກ.
- ແກ້ໄຂວິສະວະກໍາທີ່ດີ: ຖ້າຫາກວ່າທ່ານຕ້ອງການທີ່ຈະຂຽນຜູ້ແປພາສາສໍາລັບພາສາ M ແລະ N ແຫຼ່ງເປົ້າຫມາຍຕ້ອງຂຽນເທົ່ານັ້ນບັນດາໂຄງການງ່າຍດາຍ M + N (polukompilyatorov) ແທນທີ່ຈະກ່ວາຜູ້ຊາຍ× N ສະລັບສັບຊ້ອນ (ທັງຫມົດຂອງຜູ້ແປພາສາ).
ຢ່າງໃດກໍຕາມ, ໃນຕົວຈິງ, ໄດ້ເບິ່ງຈືຂໍ້ມູນການຂອງຫຼາຍບໍ່ຄ່ອຍສະແດງອອກພຽງພໍແລະປະສິດທິພາບພຽງພໍທີ່ຈະກວມເອົາທຸກແຫຼ່ງແລະເປົ້າຫມາຍ conceivable ພາສາ. ໃນຂະນະທີ່ບາງຄົນສາມາດເຂົ້າມາໃກ້ກັບນີ້.
compilers ທີ່ແທ້ຈິງຜ່ານຫລາຍຂັ້ນຕອນ. ໃນເວລາທີ່ການສ້າງ compiler ຂອງທ່ານເອງບໍ່ໄດ້ຈໍາເປັນຕ້ອງໄດ້ກັບຄືນມາທັງຫມົດເຮັດວຽກຫນັກວ່າປະຊາຊົນໄດ້ເຮັດການສ້າງຕົວແທນແລະເຄື່ອງກໍາເນີດ. ທ່ານສາມາດແປພາສາພາສາຂອງທ່ານໂດຍກົງໃນ JavaScript ຫຼື C ແລະໃຊ້ເວລາປະໂຫຍດຂອງທີ່ມີຢູ່ແລ້ວ JavaScript ກໍາແລະ compiler C ໃນການເຮັດສ່ວນທີ່ເຫຼືອ. ນອກນັ້ນທ່ານຍັງສາມາດນໍາໃຊ້ເປັນຕົວແທນລະດັບປານກາງທີ່ມີຢູ່ແລ້ວແລະ ເຄື່ອງ virtual.
ບັນທຶກການແປພາສາ
ກະຈາຍສຽງ - ເປັນໂຄງການຫລືຮາດແວທີ່ກ່ຽວຂ້ອງສາມພາສາ: ແຫລ່ງທີ່ມາຂອງຈຸດຫມາຍປາຍທາງແລະພື້ນຖານ. ພວກເຂົາເຈົ້າສາມາດໄດ້ຮັບການລາຍລັກອັກສອນໃນ T-ຮູບຮ່າງ, ປົດປ່ອຍຊາດແລະຕົ້ນສະບັບຊ້າຍ, ຂວາແລະເປົ້າຫມາຍພື້ນຖານຕ່ໍາກວ່າ.
ມີສາມປະເພດຂອງ compilers ແມ່ນ:
- ກະຈາຍສຽງ - ເປັນ samokompilyator ຖ້າຫາກວ່າມັນສອດຄ້ອງກັບພາສາແຫຼ່ງພື້ນຖານ.
- Compiler ທີ່ພາສາເປົ້າຫມາຍເປັນພື້ນຖານ, ເອີ້ນວ່າ samorezidentnym.
- ກະຈາຍສຽງ - ສອງຝັ່ງ, compiler, ຖ້າຫາກວ່າເຂົາເປົ້າຫມາຍແລະພາສາຕ່າງໆພື້ນຖານ.
ເປັນຫຍັງນີ້ເປັນສິ່ງສໍາຄັນ?
ເຖິງແມ່ນວ່າຖ້າຫາກວ່າທ່ານບໍ່ເຄີຍເຮັດໃຫ້ເປັນ compiler ທີ່ແທ້ຈິງ, ເປັນຄວາມຮູ້ທີ່ດີຂອງເຕັກໂນໂລຊີຂອງການສ້າງຂອງຕົນ, ເນື່ອງຈາກວ່າແນວຄວາມຄິດທີ່ຖືກນໍາໃຊ້ສໍາລັບຈຸດປະສົງນີ້ໄດ້ຖືກນໍາໃຊ້ຢ່າງກວ້າງຂວາງ, ສໍາລັບຕົວຢ່າງເຊັ່ນ:
- ຂໍ້ຄວາມຮູບແບບ;
- ສອບຖາມພາສາ ຖານຂໍ້ມູນ;
- ສະຖາປັດຕະຄອມພິວເຕີແບບພິເສດ;
- ບັນຫາທີ່ດີທີ່ສຸດທົ່ວໄປ;
- GUIs;
- ພາສາສະຄິບ;
- ການຄວບຄຸມ;
- ເຄື່ອງ virtual;
- ການແປພາສາເຄື່ອງ.
ໃນນອກຈາກນັ້ນ, ຖ້າຫາກວ່າທ່ານຕ້ອງການທີ່ຈະຂຽນຕົວປະມວນຜົນ, Linkers, ລົດຕັກ, debuggers ແລະ profilers, ທ່ານຕ້ອງໄປໂດຍຜ່ານຂັ້ນຕອນການເຊັ່ນດຽວກັນກັບໃນເວລາທີ່ລາຍລັກອັກສອນ compiler ໄດ້.
ນອກນັ້ນທ່ານຍັງສາມາດຮຽນຮູ້ວິທີການຂຽນໂຄງການທີ່ດີກວ່າ, ນັບຕັ້ງແຕ່ການສ້າງຂອງການແປພາສາສໍາລັບພາສາໄດ້ຫມາຍຄວາມວ່າເປັນຄວາມເຂົ້າໃຈທີ່ດີກວ່າຂອງສະລັບສັບຊ້ອນແລະມີສອງນັຍຂອງຕົນ. ການສຶກສາຂອງບັນດາຫຼັກການທົ່ວໄປຂອງການກະຈາຍສຽງຍັງອະນຸຍາດໃຫ້ທ່ານສາມາດກາຍເປັນພາສາອອກແບບທີ່ດີ. ດັ່ງນັ້ນມັນບໍ່ສໍາຄັນແນວໃດ steep ພາສາຖ້າຫາກວ່າມັນບໍ່ສາມາດໄດ້ຮັບການປະຕິບັດສິດທິພາບ?
ເຕັກໂນໂລຊີທີ່ສົມບູນແບບ
ເຕັກໂນໂລຊີ compiler ການປົກຫຸ້ມຂອງພື້ນທີ່ທີ່ແຕກຕ່າງກັນຈໍານວນຫຼາຍຂອງວິທະຍາສາດຄອມພິວເຕີ:
- ທິດສະດີຢ່າງເປັນທາງການຂອງພາສາ: ໄວຍະກອນ, ວະຈີວິພາກ, computer
- ສະຖາປັດຕະຄອມພິວເຕີ:. ຄໍາແນະນໍາຊຸດ, RISC ຫຼື CISC ທໍ່ປະມວນຜົນຫຼັກຮອບໂມງ, ແລະອື່ນໆ;
- ແນວຄວາມຄິດຂອງພາສາການຂຽນໂປຣແກຣມ, ສໍາລັບການຍົກຕົວຢ່າງ, ປະຕິບັດການຄວບຄຸມລໍາດັບການດໍາເນີນການຕາມເງື່ອນໄຂ, iteration, recursion, decomposition ທີ່ເປັນປະໂຫຍດ, modularity, synchronization, ດໍາເນີນທຸດໍາເນີນໂຄງການ, ຂອບເຂດ, ຄົງຍ່ອຍປະເພດ, ແມ່ແບບ, ປະເພດຜົນຜະລິດ, prototypes, ຄໍາ, ການໄຫຼ, Monad, mailboxes, ດໍາເນີນການຕໍ່ , ສັນລັກຕົວແທນສະແດງອອກເປັນປົກກະຕິ, ຄວາມຊົງຈໍາເຮັດທຸລະກໍາ, ມໍລະດົກ, polymorphism, ການປັບຄ່າຮູບແບບ, ແລະອື່ນໆແລະອື່ນໆ..
- ພາສາບໍ່ມີຕົວຕົນແລະເຄື່ອງ virtual;
- ສູດການຄິດໄລ່ແລະ ຂໍ້ມູນໂຄງສ້າງ: ສໍານວນປົກກະຕິຂັ້ນຕອນວິທີການແຍກວິເຄາະຂັ້ນຕອນວິທີຟິກ, ການຂຽນໂປຣແກຣມແບບເຄື່ອນໄຫວ, ການຝຶກອົບຮົມ;
- ພາສາການຂຽນໂປຣແກຣມ: syntax ຄວາມຫມາຍ (static ແລະເຄື່ອນໄຫວ), ຂະບວນທັດສະຫນັບສະຫນູນ (ໂຄງສ້າງ, OOP, ທີ່ເປັນປະໂຫຍດ, ມີເຫດຜົນ, stack, ຂະຫນານ, ດໍາເນີນທຸດໍາເນີນໂຄງການ);
- ຊອຟແວການສ້າງ (compilers, ປົກກະຕິແລ້ວຂະຫນາດໃຫຍ່ແລະສະລັບສັບຊ້ອນ): ທ້ອງຖິ່ນ, ຈາກຖານຄວາມຈໍາ, componentize, API, ການໂຕ້ຕອບ, ໃຫ້ການນໍາໃຊ້, synchronization.
ການອອກແບບລວບລວມ
ບາງສ່ວນຂອງບັນຫາຕ່າງໆທີ່ພົບໃນການພັດທະນາຂອງການແປພາສາທີ່ແທ້ຈິງ:
- ບັນຫາກ່ຽວກັບພາສາຕົ້ນທາງ. ມັນເປັນເລື່ອງງ່າຍທີ່ຈະສັງລວມມັນ? ມີຕົວປະມວນຜົນ? ມີວິທີການປະເພດແນວໃດ? ມີຫ້ອງສະຫມຸດ?
- ການຈັດກຸ່ມຜ່ານ compiler: ດຽວຫຼືຫຼາຍວິທີການ?
- ລະດັບຂອງການທີ່ດີທີ່ສຸດທີ່ຕ້ອງການ. ບັນດາໂຄງການກະຈາຍໄວແລະບໍ່ສະອາດມີທີ່ດີທີ່ສຸດພຽງເລັກນ້ອຍຫຼືບໍ່ມີສາມາດຈະປົກກະຕິ. compiler ໃນໄລຍະທີ່ດີທີ່ສຸດຈະຊ້າ, ແຕ່ລະຫັດທີ່ດີກວ່າຢູ່ໃນອຸອາດຈະຕົກເປັນມູນຄ່າມັນ.
- ໄດ້ປະລິນຍາທີ່ກໍານົດໄວ້ຂອງການຊອກຄົ້ນຫາຄວາມຜິດພາດ. ສາມາດແປພາສາເປັນພຽງແຕ່ຢຸດຢູ່ໃນຄວາມຜິດພາດຄັ້ງທໍາອິດ? ໃນເວລາທີ່ມັນຄວນຈະຢຸດເຊົາການ? ບໍ່ວ່າຈະໄວ້ວາງໃຈການແກ້ໄຂຄວາມຜິດພາດການລວບລວມແນວໃດ?
- ການວາງຈໍາຫນ່າຍເຄື່ອງມື. ຖ້າຫາກວ່າພາສາຕົ້ນສະບັບແມ່ນບໍ່ຂະຫນາດນ້ອຍຫຼາຍ, ສະແກນເນີແລະໂດຍທົ່ວໄປວິເຄາະຖືກຕ້ອງ. ກໍຍັງມີເຄື່ອງປັ່ນໄຟ, ເຄື່ອງກໍາເນີດລະຫັດ, ແຕ່ພວກເຂົາເຈົ້າແມ່ນບໍ່ຄືກັນ.
- ປະເພດຂອງລະຫັດເປົ້າຫມາຍທີ່ຈະໄດ້ຮັບການສ້າງຂຶ້ນ. ໄດ້ຮັບການຄັດເລືອກຈາກລະຫັດເຄື່ອງບໍລິສຸດອາຫານເສີມຫຼື virtual. ຫຼືພຽງແຕ່ຂຽນເປັນບາງສ່ວນເຂົ້າທີ່ສ້າງເປັນຕົວແທນລະດັບປານກາງທີ່ນິຍົມເຊັ່ນ LLVM, RTL ຫລື JVM. ຫຼືເຮັດໃຫ້ການແປພາສາຂອງຕົ້ນສະບັບເປັນໃນລະຫັດແຫຼ່ງໃນ C ຫຼື Javascript.
- ຮູບແບບຂອງຂໍ້ກໍານົດເປົ້າຫມາຍດັ່ງກ່າວ. ທ່ານສາມາດເລືອກທີ່ຈະ ເປັນພາສາປະກອບ, ລະຫັດເຄື່ອງ Portable, ຮູບພາບຄວາມຊົງຈໍາລະຫັດເຄື່ອງ.
- Retargeting. ໃນເວລາທີ່ກໍານົດໄວ້ຂອງເຄື່ອງກໍາເນີດແມ່ນດີທີ່ຈະມີບາງສ່ວນ inlet ທົ່ວໄປ. ສໍາລັບເຫດຜົນນີ້ມັນເປັນທີ່ດີທີ່ສຸດທີ່ຈະມີຫນຶ່ງໂດຍທົ່ວໄປສໍາລັບວັດສະດຸປ້ອນຂອງຫຼາຍພາກສ່ວນ.
compiler ຖາປັດຕະຍະ: ອົງປະກອບ
ເຫຼົ່ານີ້ແມ່ນອົງປະກອບທີ່ເປັນປະໂຫຍດທີ່ສໍາຄັນຂອງ compiler ທີ່ສ້າງລະຫັດ native (ຖ້າຫາກວ່າໂຄງການຜົນຜະລິດແມ່ນໂຄງການໃນ C ຫຼືເຄື່ອງ virtual, ທ່ານຈໍາເປັນຕ້ອງບໍ່ຫລາຍຂັ້ນຕອນນັ້ນ) ເປັນ:
- ໂຄງການວັດສະດຸປ້ອນ (ເຄື່ອງຫມາຍການໄຫຼ) ໄດ້ຖືກປ້ອນເຂົ້າໄປໃນການສະແກນ (ວິເຄາະສັບ), ເຊິ່ງ converts ມັນເຂົ້າໄປໃນນ້ໍາຂອງ tokens ໄດ້.
- Parser (parser) ສ້າງຫນຶ່ງຕົ້ນໄມ້ syntax ບໍ່ມີຕົວຕົນ.
- ການວິເຄາະ Semantic decomposes ຂໍ້ມູນ semantic ແລະກວດສອບຂໍ້ຕົ້ນໄມ້ສໍາລັບຄວາມຜິດພາດ. ດັ່ງນັ້ນ, ການກໍ່ສ້າງເສັ້ນສະແດງການ semantic - ຕົ້ນໄມ້ syntax ຕົວຕົນທີ່ມີຄຸນສົມບັດເພີ່ມເຕີມແລະການເຊື່ອມໂຍງການສ້າງຕັ້ງຂຶ້ນ.
- ໂດຍທົ່ວໄປລະຫັດລະດັບປານກາງສ້າງເສັ້ນສະແດງການໄຫຼ (Tuples ຖືກຈັດກຸ່ມເປັນບລັອກຕົ້ນຕໍ).
- ເຄື່ອງ, ເອກະລາດດີທີ່ສຸດລະຫັດດໍາເນີນການທັງສອງທ້ອງຖິ່ນ (ພາຍໃນຫນ່ວຍພື້ນຖານ) ແລະທົ່ວໂລກ (ກັບຕັນທັງຫມົດ) ທີ່ດີທີ່ສຸດໂດຍພື້ນຖານແລ້ວຍັງເຫຼືອຢູ່ພາຍໃນປະຕິບັດ. ການຫຼຸດຜ່ອນລະຫັດຊ້ໍາຊ້ອນແລະລົດຄວາມຍຸ່ງຍາກການຄິດໄລ່ໄດ້. ຜົນໄດ້ຮັບແມ່ນເປັນເສັ້ນສະແດງການໄຫຼດັດແກ້.
- ໂດຍທົ່ວໄປບັງຄັບລະຫັດເປົ້າຫມາຍບລັອກພື້ນຖານເຂົ້າໄປໃນລະຫັດການຄວບຄຸມລະບົບສາຍສົ່ງ rectilinear, ການສ້າງໄຟລ໌ວັດຖຸປະກອບທີ່ຈົດທະບຽນ virtual (ອາດບໍ່ໄດ້ຜົນ).
- ເຄື່ອງຂຶ້ນ optimizer, linker ແບ່ງຄວາມຊົງຈໍາລະຫວ່າງການລົງທະບຽນແລະດໍາເນີນການວາງແຜນທີມ. ຈະດໍາເນີນການໂຄງການປ່ຽນໃຈເຫລື້ອມໃສໃນພາສາປະກອບຢູ່ໃນສະພາແຫ່ງນີ້ມີການນໍາໃຊ້ທີ່ດີຂອງທໍ່.
ໃນນອກຈາກນັ້ນ, ການນໍາໃຊ້ຂອງການຄຸ້ມຄອງລະບົບຍ່ອຍການຊອກຄົ້ນຫາຄວາມຜິດພາດແລະຕາຕະລາງສັນຍາລັກ.
ການວິເຄາະ Lexical (ສະແກນ)
ສະແກນເນີແປງຕົວອັກສອນແຫຼ່ງນ້ໍາເຂົ້າໄປໃນນ້ໍາຂອງ tokens, ຖອນຊ່ອງຫວ່າງ, ຄວາມຄິດເຫັນແລະມະຫາພາກຂະຫຍາຍໄດ້.
ສະແກນເນີມັກຈະພົບບັນຫາເຊັ່ນ: ບໍ່ວ່າຈະເປັນຫຼືບໍ່ທີ່ຈະໃຊ້ເວລາເຂົ້າໄປໃນບັນຊີຂອງກໍລະນີທີ່, ຂອບເຂດ, ຂຶ້ນບັນທັດແລະຄວາມຄິດເຫັນຝັງ.
ຄວາມຜິດພາດທີ່ອາດເກີດຂຶ້ນໃນລະຫວ່າງການສະແກນເອີ້ນວ່າ lexical ແລະປະກອບມີ:
- ຕົວອັກສອນທີ່ບໍ່ໄດ້ຢູ່ໃນຫນັງສືໄດ້;
- ການເກີນຂອງຈໍານວນຂອງຕົວອັກສອນໃນຄໍາສັບຫຼືເສັ້ນ;
- ບໍ່ແມ່ນອາການປິດຫລືສະຕິງທີ່ຮູ້ຫນັງສື;
- ໃນຕອນທ້າຍຂອງເອກະສານໃນຄວາມຄິດເຫັນ.
ແຍກ (ວະຈີວິພາກ)
ຕົວແຍກວິເຄາະແປງລໍາດັບຂອງ tokens ການເຂົ້າໄປໃນຕົ້ນໄມ້ syntax ບໍ່ມີຕົວຕົນ. node ຢູ່ໃນລໍາຕົ້ນແຕ່ລະຄົນແມ່ນເກັບຮັກສາໄວ້ເປັນວັດຖຸທີ່ມີທົ່ງນາທີ່ມີຊື່, ຈໍານວນຫຼາຍຊຶ່ງໃນນັ້ນແມ່ນຕົນເອງຂໍ້ຕົ້ນໄມ້ເປັນ. ໃນຂັ້ນຕອນນີ້ບໍ່ມີຮອບວຽນ. ໃນເວລາທີ່ທ່ານສ້າງ parser ແມ່ນມີຄວາມຈໍາເປັນທີ່ຈະຈ່າຍເອົາໃຈໃສ່ກັບລະດັບຂອງຄວາມສັບສົນຂອງໄວຢາກອນ (LL ຫຼື LR) ແລະຊອກຫາບໍ່ວ່າຈະມີທຸກ disambiguation ກົດລະບຽບ. ບາງພາສາທີ່ຮຽກຮ້ອງໃຫ້ມີການວິເຄາະ semantic.
ຄວາມຜິດພາດທີ່ພົບເຫັນຢູ່ໃນຂັ້ນຕອນນີ້ແມ່ນເອີ້ນວ່າໄວຍາກອນ. ສໍາລັບຕົວຢ່າງເຊັ່ນ:
- k = 5 * (7 - y;
- j = / 5;
- 56 = x * 4.
ການວິເຄາະຄວາມຫມາຍ
ໃນລະຫວ່າງການ ວິເຄາະ semantic ການກວດສອບການອະນຸຍາດຂອງກົດລະບຽບແລະພາກສ່ວນບໍລິສັດຮ່ວມຂອງຕົ້ນໄມ້ parse ໄດ້ (ໃຫ້ຊື່ກະສານອ້າງອີງໃສ່ປະຕິບັດງານສໍາລັບການສົນທະນາປະເພດໄນແລະອື່ນໆ. D) ສໍາລັບກອບເປັນຈໍານວນຂອງກາຟ semantic.
ທ້າວ Xiao ເວົ້າວ່າ, ທີ່ກໍານົດໄວ້ຂອງຍອມຮັບຂອງກົດລະບຽບໃນພາສາທີ່ແຕກຕ່າງກັນທີ່ແຕກຕ່າງກັນໄດ້. ຖ້າຫາກວ່າທ່ານສັງລວມພາສາ Java, ຄື, compilers ອາດຈະພົບ:
- ປະກາດຕົວແປທີ່ຫຼາກຫຼາຍພາຍໃນຂອບເຂດຂອງຕົນ;
- ກະສານອ້າງອີງເພື່ອເປັນຕົວປ່ຽນແປງກ່ອນທີ່ຈະປະກາດຂອງຕົນ;
- ເອກະສານກັບຊື່ຂອງບໍ່ໄດ້ປະກາດໄດ້;
- ການລະເມີດສິດທິສິດທິບັດ;
- ຈໍານວນຫຼາຍເກີນໄປຫຼືບໍ່ພຽງພໍຂອງການໂຕ້ຖຽງໃນການໂທວິທີການ;
- ປະເພດບໍ່ກົງກັນ.
ການຜະລິດ
ການຜະລິດລະຫັດລະດັບປານກາງສາມາດຜະລິດເສັ້ນສະແດງການໄຫຼປະກອບດ້ວຍ Tuples, ຈັດກຸ່ມເປັນບລັອກພື້ນຖານ.
ການຜະລິດລະຫັດຜະລິດລະຫັດເຄື່ອງທີ່ແທ້ຈິງ. ໃນ compilers ດັ້ງເດີມສໍາລັບ RISC, ເຄື່ອງໃນຂັ້ນຕອນທໍາອິດ, ທ່ານສ້າງຜູ້ປະກອບກັບຈໍານວນນິດຂອງການລົງທະບຽນ virtual. ສໍາລັບ CISC, ເຄື່ອງອາດຈະບໍ່ເກີດຂຶ້ນ.
Similar articles
Trending Now