Hacker News

கோ கம்பைலரைப் புரிந்துகொள்வது: இணைப்பான்

கோ கம்பைலரைப் புரிந்துகொள்வது: இணைப்பான் புரிதலின் இந்த விரிவான பகுப்பாய்வு அதன் முக்கிய கூறுகள் மற்றும் பரந்த தாக்கங்கள் பற்றிய விரிவான ஆய்வுகளை வழங்குகிறது. கவனம் செலுத்தும் முக்கிய பகுதிகள் விவாதம் மையமாக உள்ளது: முக்கிய வழிமுறைகள் மற்றும் சார்பு...

1 min read Via internals-for-interns.com

Mewayz Team

Editorial Team

Hacker News

கோ கம்பைலரைப் புரிந்துகொள்வது: இணைப்பான்

Go இணைப்பான் என்பது Go தொகுத்தல் கருவித்தொகுப்பின் இறுதிக் கட்டமாகும், தொகுக்கப்பட்ட பொருள் கோப்புகளை ஒரு இயங்கக்கூடிய பைனரியாக இணைக்கும் பொறுப்பாகும். இது குறியீட்டு குறிப்புகளைத் தீர்க்கிறது, நினைவக முகவரிகளை ஒதுக்குகிறது மற்றும் வெளிப்புற சார்புகள் இல்லாமல் இயக்க முறைமை ஏற்றப்பட்டு இயங்கக்கூடிய ஒரு சுய-கட்டுமான நிரலை உருவாக்குகிறது.

பொறியியல் குழுக்கள் உற்பத்தி அமைப்புகளை உருவாக்குவதற்கு - Mewayz போன்ற இயங்குதளங்களுக்குப் பின்னால் உள்ள உள்கட்டமைப்பு மற்றும் அதன் 207-தொகுதி வணிக OS ஆகியவை அடங்கும் - இணைக்கும் கட்டத்தில் என்ன நடக்கிறது என்பதைப் புரிந்துகொள்வது செயல்திறன், வரிசைப்படுத்தக்கூடிய மென்பொருளை எழுதுவதற்கு அவசியம்.

கோ லிங்கர் உண்மையில் என்ன செய்கிறது?

Go கருவித்தொகுப்பில், தொகுத்தல் இரண்டு முக்கிய கட்டங்களில் நடக்கும். முதலில், கம்பைலர் (gc) Go மூலக் கோப்புகளை கட்டிடக்கலை சார்ந்த பொருள் கோப்புகளாக மொழிபெயர்க்கிறது. பின்னர் இணைப்பான் (cmd/link) அந்த ஆப்ஜெக்ட் கோப்புகளை எடுத்து அவற்றை முடிக்கப்பட்ட இயங்கக்கூடியதாக இணைக்கிறது. கம்பைலர் தொடரியல் பகுப்பாய்வு, வகை சரிபார்ப்பு மற்றும் குறியீடு உருவாக்கம் ஆகியவற்றைக் கையாளும் போது, இணைப்பான் ஒரு நிரலை அசெம்பிள் செய்வதற்கான இடஞ்சார்ந்த மற்றும் தொடர்புடைய வேலையைக் கையாளுகிறது.

இந்தச் செயல்பாட்டின் போது இணைப்பான் பல முக்கியமான செயல்பாடுகளைச் செய்கிறது. இது தொகுப்புகள் முழுவதும் உள்ள அனைத்து குறியீட்டு குறிப்புகளையும் தீர்க்கிறது, அதாவது ஒரு தொகுப்பு எல்லையை கடக்கும் ஒவ்வொரு செயல்பாட்டு அழைப்பு அல்லது மாறி குறிப்பு அதன் உண்மையான செயலாக்கத்துடன் இணைக்கப்படும். இது ஒவ்வொரு செயல்பாடு மற்றும் உலகளாவிய மாறிக்கும் மெய்நிகர் நினைவக முகவரிகளை ஒதுக்குகிறது. இது இலக்கு இயக்க முறைமையால் எதிர்பார்க்கப்படும் வடிவத்தில் இறுதி பைனரியை எழுதுகிறது - Linux க்கான ELF, MacOS க்கு Mach-O அல்லது Windows க்கான PE.

C அல்லது C++ லிங்கர்கள் போலல்லாமல், Go லிங்கர் முழுவதுமாக Goவில் எழுதப்பட்டுள்ளது. Go 1.5 பூட்ஸ்ட்ராப் முயற்சியின் போது முடிக்கப்பட்ட இந்த முடிவு, இணைக்கும் செயல்முறையின் மீது Go குழுவிற்கு முழுக் கட்டுப்பாட்டை அளிக்கிறது மற்றும் பெரும்பாலான உருவாக்கங்களுக்கு வெளிப்புற கருவிச் சங்கிலிகள் சார்ந்திருப்பதை நீக்குகிறது.

Go's Linker பாரம்பரிய இணைப்பாளர்களிடமிருந்து எவ்வாறு வேறுபடுகிறது?

C/C++ சுற்றுச்சூழல் அமைப்பில் உள்ள பாரம்பரிய இணைப்பிகள் — GNU ld, gold, அல்லது LLVM இன் lld — ELF இடமாற்றம் செய்யக்கூடிய நிலையான பொருள் கோப்பு வடிவங்களில் செயல்படுகின்றன. Go இன் இணைப்பான் அதன் சொந்த உள் பொருள் வடிவமைப்பைப் பயன்படுத்துகிறது, இது நெகிழ்வுத்தன்மையைக் கொடுக்கிறது, ஆனால் அது ஓரளவு தனிமைப்படுத்தப்பட்ட சுற்றுச்சூழல் அமைப்பில் இருப்பதைக் குறிக்கிறது.

  • இயல்புநிலையாக நிலையான இணைப்பு: Go ஆனது பெரும்பாலான சந்தர்ப்பங்களில் நிலையான இணைக்கப்பட்ட பைனரிகளை உருவாக்குகிறது, முழு இயக்க நேரத்தையும் அனைத்து சார்புகளையும் ஒரே கோப்பில் உட்பொதிக்கிறது. இது பொதுவாக டைனமிக் பகிரப்பட்ட நூலகங்களை நம்பியிருக்கும் சி நிரல்களுடன் கடுமையாக முரண்படுகிறது.
  • தனியான முன்செயலாக்கப் படி இல்லை: பாரம்பரிய டூ-பாஸ் இணைப்பாளர்கள் செய்யும் வழியில் Go இணைப்பாளருக்கு தனியான குறியீட்டுத் தீர்மானம் தேவையில்லை. இது தொகுப்பாளர் ஏற்கனவே தீர்மானித்த சார்பு வரிசையில் தொகுப்புகளை செயலாக்குகிறது.
  • டெட் கோட் நீக்குதல்: கோவின் நிலையான நூலகம் பெரியதாக இருப்பதால், அணுக முடியாத செயல்பாடுகள் மற்றும் மாறிகளை இணைப்பாளர் தீவிரமாக நீக்குகிறார். இது இல்லாமல், ஒவ்வொரு பைனரியும் பயன்படுத்தப்படாத தொகுப்புகளின் எடையைக் கொண்டிருக்கும்.
  • இயக்க நேர ஒருங்கிணைப்பு: Go இணைப்பான் ஒவ்வொரு பைனரியிலும் Go இயக்க நேரத்தை உட்பொதிக்க வேண்டும் - குப்பை சேகரிப்பான், goroutine திட்டமிடுபவர் மற்றும் அடுக்கு மேலாண்மை குறியீடு உட்பட. இது C இணைப்பில் நேரடி இணை இல்லாத பொறுப்பாகும்.
  • CGo பிரிட்ஜிங்: CGo இயக்கப்பட்டிருக்கும் போது, Go இணைப்பான் கலப்பு Go/C ஆப்ஜெக்ட் கோப்புகளைக் கையாள கணினியின் C இணைப்பாளருடன் ஒருங்கிணைக்க வேண்டும், இது செயல்முறைக்கு கணிசமான சிக்கலைச் சேர்க்கிறது.

முக்கிய நுண்ணறிவு: Go லிங்கரின் வடிவமைப்புத் தத்துவம், உருவாக்க வேகத்தை விட வரிசைப்படுத்தல் எளிமைக்கு முன்னுரிமை அளிக்கிறது. உட்பொதிக்கப்பட்ட இயக்க நேரத்துடன் முழுமையான நிலையான பைனரிகளை உருவாக்குவதன் மூலம், நீண்ட இணைப்பு நேரங்கள் மற்றும் பெரிய பைனரிகளின் விலையில், பகிர்வு லைப்ரரிகள், பதிப்பு முரண்பாடுகள் மற்றும் இயக்க நேர சார்புத் தீர்மானம் ஆகியவற்றை - Go முழு வகை தயாரிப்பு சிக்கல்களையும் நீக்குகிறது.

இணைப்பாளர் செயல்திறன் ஏன் ஒரு தொடர்ச்சியான சவாலாக உள்ளது?

பல ஆண்டுகளாக, Go லிங்கர் ஆனது உருவாக்க செயல்முறையின் மெதுவான பகுதிகளில் ஒன்றாகும். இது தனிப்பட்ட தொகுப்புகளை விட ஒரே நேரத்தில் முழு நிரலிலும் செயல்படுவதால், அதை தொகுக்கும் விதத்தில் இணையாக மாற்ற முடியாது. கோ குழு இணைப்பாளர் மேம்பாடுகளில் அதிக முதலீடு செய்துள்ளது, குறிப்பாக Go 1.15 மற்றும் 1.16 இல், புதிய ஆப்ஜெக்ட் கோப்பு வடிவத்தை அறிமுகப்படுத்தியது மற்றும் இணைப்பான் நினைவக பயன்பாட்டை தோராயமாக 30% குறைத்தது.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

இணைப்பாளர் முழு நிரல் செயல்பாடுகளையும் செய்ய வேண்டும் என்பதே அடிப்படை சவால். நிரலில் உள்ள ஒவ்வொரு சின்னம், ஒவ்வொரு இடமாற்றம் மற்றும் ஒவ்வொரு வகை விளக்கத்தின் உலகளாவிய பார்வை இதற்குத் தேவை. பெரிய கோட்பேஸ்களுக்கு - 138,000+ பயனர்களுக்கு சேவை செய்யும் நிறுவன இயங்குதளங்களுக்கு - அதாவது ஒரே பாஸில் மில்லியன் கணக்கான சின்னங்களை இணைப்பவர் செயலாக்குகிறார்.

சமீபத்திய மேம்பாடுகள் வேலையை இணைப்பாளரிடமிருந்து மீண்டும் கம்பைலருக்கு மாற்றுவதில் கவனம் செலுத்துகின்றன. முன்பே தீர்க்கப்பட்ட இடமாற்றங்களுடன் கம்பைலர் முழுமையான பொருள் கோப்புகளை உருவாக்குவதன் மூலம், இணைப்பாளர் இணைப்பு நேரத்தில் குறைவான வேலைகளைச் செய்ய முடியும். இது Go டூல்செயினுக்குள் நடந்து கொண்டிருக்கும் கட்டிடக்கலை பரிணாமமாகும்.

கோவின் பைனரி பாதுகாப்பில் இணைப்பான் என்ன பங்கு வகிக்கிறது?

Go பைனரிகளில் பாதுகாப்பு தொடர்பான பல அம்சங்களுக்கும் இணைப்பாளரே பொறுப்பு. இது நினைவகப் பிரிவுகளில் இயங்கக்கூடிய அனுமதிகளை அமைக்கிறது, தரவுப் பிரிவுகள் இயங்கக்கூடியவை அல்ல மற்றும் குறியீடு பிரிவுகள் எழுதக்கூடியவை அல்ல என்பதை உறுதிப்படுத்துகிறது. ஆதரிக்கப்படும் தளங்களில், நிலை-சுயாதீனமான இயங்குதளங்களை உருவாக்குவதன் மூலம் ASLR (முகவரி ஸ்பேஸ் லேஅவுட் ரேண்டமைசேஷன்) செயல்படுத்துகிறது.

Go 1.17 இல் தொடங்கி, இணைப்பானது சரியான DWARF பிழைத்திருத்தத் தகவலுடன் பைனரிகளை உருவாக்குவதையும் மற்றும் மெட்டாடேட்டாவை உருவாக்குவதையும் ஆதரிக்கிறது, இது பாதிப்பு ஸ்கேனிங் மற்றும் மென்பொருள் விநியோகச் சங்கிலி சரிபார்ப்புக்கு உதவுகிறது. -buildid கொடி, இணைப்பு நேரத்தில் செயலாக்கப்பட்டது, மீண்டும் உருவாக்கக்கூடிய சரிபார்ப்புக்காக ஒவ்வொரு பைனரியிலும் ஒரு தனிப்பட்ட அடையாளங்காட்டியை உட்பொதிக்கிறது.

அடிக்கடி கேட்கப்படும் கேள்விகள்

Go உடன் வெளிப்புற இணைப்பியைப் பயன்படுத்த முடியுமா?

ஆம். CGo இயக்கப்பட்டிருக்கும் போது அல்லது நீங்கள் -linkmode=external ஐ Go toolchainக்கு அனுப்பும் போது, ​​கணினி இணைப்பிற்கு (பொதுவாக gcc அல்லது clang) இறுதி இணைக்கும் படியை அது ஒப்படைக்கிறது. உங்கள் நிரல் C லைப்ரரிகளுக்கு எதிராக இணைக்கும் போது மற்றும் சில இயங்குதளங்களில் இயல்புநிலை நடத்தையாக இருக்கும் போது இது தேவைப்படுகிறது. Go இன் சொந்த இணைப்பானை பிரத்தியேகமாகப் பயன்படுத்தும் உள் இணைப்பு, வேகமானது மற்றும் எளிமையான கட்டமைப்பை உருவாக்குகிறது, ஆனால் C சார்புகளைக் கையாள முடியாது.

C பைனரிகளை விட Go பைனரிகள் ஏன் பெரிதாக உள்ளன?

Go இணைப்பான் குப்பை சேகரிப்பான், goroutine திட்டமிடுபவர், netpoller மற்றும் பிரதிபலிப்பு வகைத் தகவல் உட்பட ஒவ்வொரு பைனரியிலும் முழு Go இயக்க நேரத்தையும் உட்பொதிக்கிறது. ஒரு குறைந்தபட்ச "ஹலோ, வேர்ல்ட்" நிரல் கூட இந்த இயக்க நேரத்தை உள்ளடக்கியது, இதன் விளைவாக பைனரிகள் 1-2 எம்பியில் தொடங்கும். இணைப்பாளரின் டெட் கோட் எலிமினேஷன் இதை கணிசமாகக் குறைக்கிறது, ஆனால் இயக்க நேரத் தளம் தவிர்க்க முடியாதது. -ldflags="-s -w"ஐப் பயன்படுத்தி பிழைத்திருத்தத் தகவலைப் பயன்படுத்தி, பைனரி அளவை 20-30% குறைக்கலாம்.

Go இணைப்பான் ஒரே குறியீட்டு பெயரில் பல தொகுப்புகளை எவ்வாறு கையாளுகிறது?

Go ஆனது, தொகுப்பின் முழுமையான இறக்குமதிப் பாதையை உள்ளடக்கிய முழுத் தகுதியான குறியீட்டுப் பெயர்களைப் பயன்படுத்துகிறது. encoding/json இல் ஒரு செயல்பாடு Parse மற்றும் உங்கள் சொந்த தொகுப்பில் உள்ள Parse ஆகியவை இணைப்பான் மட்டத்தில் முற்றிலும் வேறுபட்ட குறியீடுகளாக குறிப்பிடப்படுகின்றன. இந்த நேம்ஸ்பேசிங் ஆப்ஜெக்ட் கோப்பு வடிவத்தில் சுடப்படுகிறது, எனவே Go தொகுப்புகளுக்கு இடையே குறியீடு மோதல்கள் கட்டமைப்பு ரீதியாக சாத்தியமற்றது. C குறியீடுகள் தட்டையான உலகளாவிய பெயர்வெளியைப் பகிர்ந்து கொள்ளும் CGo சூழல்களில் மட்டுமே முரண்பாடுகள் எழுகின்றன.

சரியான கருவிகள் மூலம் சிறப்பாக உருவாக்கவும்

Go லிங்கர் போன்ற குறைந்த-நிலை டூல்செயின் இயக்கவியலைப் புரிந்துகொள்வது, கட்டுமான சிக்கல்களைக் கண்டறிதல், CI பைப்லைன்களை மேம்படுத்துதல் மற்றும் நம்பகமான மென்பொருளை அனுப்புதல் ஆகியவற்றின் போது பொறியியல் குழுக்களுக்கு அளவிடக்கூடிய விளிம்பை அளிக்கிறது. வணிகத்தை நடத்துவதற்கும் இதே கொள்கை பொருந்தும் - உங்கள் செயல்பாட்டு கருவித்தொகுப்பை நீங்கள் எவ்வளவு அதிகமாகப் புரிந்துகொள்கிறீர்களோ, அவ்வளவு திறமையாகச் செயல்படுத்துகிறீர்கள்.

Mewayz உங்கள் முழு வணிகத்தையும் நிர்வகிக்க 207 ஒருங்கிணைந்த தொகுதிகளை வழங்குகிறது — திட்ட மேலாண்மை மற்றும் CRM முதல் விலைப்பட்டியல் மற்றும் குழு ஒத்துழைப்பு வரை — $19/mo இல் தொடங்குகிறது. தங்கள் பணிப்பாய்வுகளை நெறிப்படுத்திய 138,000+ பயனர்களுடன் சேரவும். இன்றே Mewayz உடன் தொடங்கவும்.

இல் மட்டுமே சாத்தியமற்றது

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime