Эх код

хэл дээр бичигдсэн эх кодын жишээ. Программын анхны коммент буюу тайлбарыг улаанаар, кодын голд байх комментийг ногооноор, жинхэнэ кодын хэсгийг цэнхэрээр дүрслэв]]
**Эх код** (бас **эх текст** заримдаа шууд **код**; ) гэдэг нь ямарваа программчлалын хэл дээр бичигдсэн, хүний уншиж чадах, компьютерын программын гүйцэтгэх зааврыг хэлнэ. Эх код нь дотроо кодыг жирийн хүний хэл дээр тайлбарласан комментийн хэсгийг агуулж болно. Программын ажиллагааг программист зааж өгөхдөө эх кодыг бичдэг. Эх кодыг ихэвчлэн компьютер шууд ойлгохгүй бөгөөд компайлер ашиглан үүнийг машин код руу хувиргадаг. Энэхүү машин кодыг шууд ажиллуулах боломжтой бөгөөд executable (exe) хэлбэртэй байдаг. Нөгөө талаас зарим програмчлалын хэл дээр бичигдсэн кодыг компайлер ашиглахгүйгээр мөр мөрөөр нь интерпретер ашиглан шууд ажиллуулах боломжтой байдаг. Ийм хэлний нэг жишээ нь Python юм. 

Ихэнх программ хангамж нь эх кодгүйгээрээ зарагдаж түгээгддэг. Нээлттэй эхийн программ хангамж нь программын эх кодыг нээлттэй лицензтэйгээр түгээгддэг бөгөөд давуу тал нь хэн ч хамаагүй, зөвшөөрөл авах шаардлагагүйгээр эх кодыг судалж, өөрчилж, цаашаа түгээх боломжтой байдаг.

Эх кодын хэсгүүдийг мөн ном, сурах бичгүүдэд тавьсан байдаг бөгөөд энэ нь программын ерөнхий алгоритмыг тайлбарлах зорилготой байдаг.

## Тодорхойлолт 
*Эх код* гэсэн томьёо нь текст хэлбэртэй байх кодоос гадна илүү өргөн хүрээгээр машин код, зурган хэлбэрээр дүрслэгдсэн тэмдэглэгээнд оноож өгч болно. IEEE-гийн "Source Code Analysis and Manipulation" хуралд хэлснээр:

Илүү тодорхой байлгах үүднээс ‘**эх код**’ гэсэн нэр томьёо нь программ хангамжийн системийн бүрэн ажиллагааг тодорхойлох ямар ч тодорхойлолтыг хэлнэ гэж үзнэ. Иймээс машин код, өндөр түвшний хэл, системийн бүтэн ажиллагааг дүрслэх зурган тодорхойлолтууд нь үүнд хамаарна.

## Бүтэц 
Компьютер программын эх код нь санах ой дээр хадгалагдах хэд хэдэн текст файлаас (ганц файл ч байж болно) ихэвчлэн бүрддэг. Эдгээр файлуудыг файлын директориудад тодорхой бүтэцтэйгээр хадгалдаг бөгөөд үүнийг **эх мод** буюу **source tree** гэнэ. Эх кодыг мөн өгөгдлийн санд гэх мэт өөр байдлаар хадгалж болно.

Зарим программын эх код нь өөр өөр программчлалын хэл дээр бичигдсэн байж болно. Жишээлбэр Си хэл дээр голлон бичигдсэн программ хангамжийн хурдыг нэмэгдүүлэх зорилгоор зарим хэсгийг ассемблер хэл дээр бичсэн байх жишээтэй. 

Түүнчлэн програмын жижиг хэсгүүдийг тус тусад нь бичиж, компайлдсаны дараа library linking хийх аргаар дараа нь нэгтгэж болно. Зарим программчлалын хэлд ингэх нь стандарт байдаг: Java дээр класс бүрийг тус тусын файл болгон компайлдсаны дараа бүтнээр нь ажиллуулахдаа интерпретер нь эдгээрийг холбож өгч ажиллуулдаг.

Өөр нэг арга нь цөм програмыг ямар нэг хэлний интерпретер болгон зохиож, энэхүү хэл дээрээ macro эсвэл add-in бичиж өгснөөр гол ажиллагааг бүрдүүлдэг. Emacs программ нь ийм аргачлалаар бүтээгдсэн.

Программ хангамжийн төсөлд хамаарах бүх програмын эх кодын цуглуулгыг **code base** гэнэ. Code base-уудыг version control system-д хадгалах нь сүүлийн үед түгээмэл болсон. Үүнийг ашигласнаар программын эх кодод оруулсан өөрчлөлтүүдийг бүхлээр нь хадгалж, программ хөгжүүлэлтийн явцыг харж зохицуулах боломжтой. Ийм зорилгоор SVN, Git гэх мэт программуудыг ашигладаг. Маш олон тооны эх кодын файлтай төслүүдийг  компайлдах зааврыг Makefile-д бичиж өгдөг. Makefile нь эх кодын файлууд ямар учиртай болох, яаж компайлдах зааврыг агуулсан байдаг.

## Зорилго 
Эх кодыг компайлдаж executable программ болгодогоос гадна хүмүүс дунд алгоритмыг тайлбарлахад хэрэглэдэг. Түүнчлэн бусдын программчлах арга барилыг суралцахад эх кодыг хоорондоо солилцож, уншиж ойлгох нь ашигтай байдаг.

Программыг өөр компьютерын платформ дээр ажилладаг болгохоор шилжүүлэхдээ (Porting гэдэг) эх кодыг нь ашигладаг.

Компайлдсан executable-г буцааж эх код болгож хувиргахыг (ассемблер эсвэл өндөр түвшний программчлалын хэл рүү) decompilation гэдэг.

Эх кодыг өөр программын төсөл дээр ашиглахыг software reusability гэнэ.

## Лиценз 
Программ хангамж болон түүнийг бүтээх эх кодыг хоёр төрлийн лицензийн төрөлтэйгээр түгээж болдог: нээлттэй эхийн болон proprietary.

*Нээлттэй эхийн* гэдэг нь программыг чөлөөтэй, үнэгүйгээр хэрэглэж, түгээж, өөрчилж, судлах боломжтой. *Proprietary* гэдэг нь эх код нь нууц, эсвэл ямар нэг хүн эсвэл байгууллагын эзэмшил болдог лицензийн төрөл.

Нээлттэй эхийн анхны лиценз нь 1989 онд гарсан GNU General Public License бөгөөд GNU үйлдлийн системийн лиценз болгох зорилготой байжээ.

Proprietary программ хангамж нь төрөл бүрийн зохиогчийн эрхийн хууль, үйлдвэрлэлийн нууц, патентаар хамгаалагдсан байдаг. Мөн decompilation, урвуу инженерчлэл, шинжилгээ, өөрчлөлт, copy protection-г даван туулах гэх мэт зүйлийг хориглосон EULA (хэрэглэгчийн программыг ашиглах гэрээ)-тай зарагддаг. Эх кодыг объект код болгож компайлдаж хамгаалахаас гадна code encryption, code obfuscation, code morphing гэх мэт хамгаалах аргууд байдаг.

## Чанар 
Программын эх кодыг яаж бичсэн байх нь программ хангамжийн хөгжүүлэгдэд чухал үр дагавартай. Coding convention буюу кодыг бичих журам гэж байдаг бөгөөд кодыг хүн уншихад ойлгомжтой байхаар бичих, хэлний онцлогтой холбоотой зүйлсийг агуулсан байдаг. Энэ нь анхны хөгжүүлэлтээс хойш програмын цаашдын нэмэлт өөрчлөлтийг гүйцэтгэж буй хөгжүүлэгчдэд тустай байлгах гол үүрэгтэй.

Кодыг уншихад хялбар байлгахаас илүүтэйгээр программын хурдтай ажиллагаа, олон төрлийн архитектурт чиглүүлж компайлдах боломжтой байлгах гэх мэт зүйлс нь эх кодын чанарт илүү чухал үүрэгтэй.

## Эшлэл 
* (VEW04) "Using a Decompiler for Real-World Source Recovery", M. Van Emmerik and T. Waddington, the *Working Conference on Reverse Engineering*, Delft, Netherlands, 9–12 November 2004. Extended version of the paper.

## Цахим холбоос 
* Source Code Definition by The Linux Information Project (LINFO)
* 
* Same program written in multiple languages