Nhiệm vụ của trình biên dịch (compiler) là gì?

Compiler là gì ? Cross Compiler là gì ? Nó có liên quan gì tới một hệ thống nhúng ? Mình cùng tìm hiểu một số khái niệm cơ bản trong bài này nhé.

Bạn đang xem: Compiler là gì

Compiler

Compiler hay còn gọi là trình biên dịch có thể được hiểu là công việc dịch chuỗi câu lệnh được viết từ một ngôn ngữ lập trình thành chương trình tương đương dưới dạng ngôn ngữ máy tính, thường là ngôn ngữ ở cấp thấp hơn, ngôn ngữ máy. Đơn giản dễ hiểu thì có thể tạm nói là nhờ Complier này mà file .c chúng ta viết mới được dịch thành file .hex .bin để nạp được xuống một MCU bất kỳ.

Quá trình biên dịch

Chúng ta có thể xem sơ đồ chi tiết các bước từ Code/Build/Run ở hình sau

Thông thường nếu dùng chương trình để lập trình như Keil C chẳng hạn thì chỉ cần ấn một nút Build/Run xong là chúng ta chỉ việc ngồi chờ và chương trình được nạp trực tiếp vào chip luôn, nhưng ẩn đằng sau những nút này là một loạt hoạt động theo các bước như hình trên.

Cross Compiler/ Toolchain là gì ?

Cross Compiler hay còn gọi là Toolchain có thể được hiểu là một source code được viết trên máy tính chạy trên chip Intel, sau khi thông qua một cross compiler sẽ cho ra file nhị phân có khả năng chạy được trên một nền tảng chip khác là ARM. Một ví dụ cơ bản nhất là mình đã dùng một máy tính hệ điều hành Ubuntu để build ra một file image có thể chạy trên Raspberry Pi

Qúa trình tạo ra và sử dụng cross compiler/ tool chain có liên quan tới 3 đối tượng

Build: hệ thống tạo ra tool chain, thường là các máy tính dùng chip Intel và hệ điều hành Linux hoặc WindowsHost: hệ thống chạy tool chain để compile source code, host cũng giống build thường là các máy tính dùng chip Intel và Windows hoặc Linux là hệ điều hành.Target: là hệ thống chạy chương trình do host tạo ra, thường target là các máy tính nhúng dùng chip ARM, tuy nhiên nó cũng có thể là một máy tính bình thường dùng chip Intel.

Vậy các thành phần của Cross Compiler là gì ?

Binutils: Là một tập các công cụ để tạo và quản lý file nhị phân [bin] của target CPUas : là assembler, nó sinh ra mã nhị phân [binary code] từ assembler source codeld : trình liên kết [linker]ar, ranlib : sinh ra file nén .a, sử dụng như là thư việnobjdump, readelf, size, nm, strings: phân tích file nhị phânstrip : để loại bỏ những phần thừa trong file nhị phân để giảm kích thước của chúng

Thông thường để cross-compiler một chương trình ta phải cài đặt biến môi trường mới có thể compile đúng đượcVí dụ

$ export PATH=/path/to/compiler/bin:$PATH$ export CROSS_COMPILE=arm-none-linux-gnueabi- $ export CC=${CROSS_COMPILE}gcc $ export CXX=${CROSS_COMPILE}g++ $ export CPP=${CROSS_COMPILE}cpp $ export AR=${CROSS_COMPILE}ar $ export AS=${CROSS_COMPILE}as $ export LD=${CROSS_COMPILE}ld $ export RANLIB=${CROSS_COMPILE}ranlib $ export STRIP=${CROSS_COMPILE}strip C/C++ LibraryLibrary được dùng làm interface giữa applications và kernel, cung cấp các C API chuẩn để dễ dàng phát triển ứng dụng. Một số libb có thể kể đến như: glibc, uClibc, eglibc, dietlibc, newlib, …

Kernel headerCung cấp các API cần thiết cho Applications và C Library giao tiếp với Kernel.

GCC compilergcc, c++, g++ : compilerTrình biên dịch trong hệ thống Linux, compile cho rất nhiều ngôn ngữ và nhiều kiến trúc CPU khác nhau như ARM, MIPS, PowerPC, SuperH, x86; tuy nhiên mình chỉ đề cập đến ngôn ngữ C/C++ và kiến trúc CPU là ARM và x86.GDB Debugger: Trình gỡ rối, trợ giúp cho quá trình phát hiện lỗi khi develop application.

Xem thêm: Tập The Dục Giảm Mỡ Bụng Vào Thời Gian Nào

Ví dụ với GCC Compiler

Cài đặt GCC

Trước hết, mình thực hiện các bước với GCC trên máy tính dùng Ubuntu nhé

Thực hiện check version hiện có của gcc/g++ và cài đặt

$ gcc --version$ g++ --version$ sudo apt-get install gcc g++

Ví dụ

Xét một ví dụ cơ bản với chương trình C tính căn bậc 2 của 4 như sau

#include #include int main[int argc, char **argv]{ double x; x = sqrt[4]; printf["x = %f \n", x]; return 1; } Để thực hiện thì chúng ta lưu code trên dưới dạng file là main.c, sau đó thực hiện gõ lệnh command sau trên ubuntu

$ export CFLAGS="-I./include -DDEBUG -Wall -g" $ export LDFLAGS+=" -L./lib -lm" $ gcc -c main.c ${CFLAGS} #tạo file object từ source $ gcc -o prog main.o ${LDFLAGS} #tạo file chương trình nhị phân từ file object $ ./prog #chạy chương trình

Kết quả

Giải thích

Trên đây là một format cơ bản nhất của GCC

CFLAGSC compiler flags đưa các options vào trong compiler để thực hiện quá trình compile source code thành object sẽ bao gồm các thông tin:

Đường dẫn các header bắt đầu với -I, ví dụ -I./includeCác define được bắt đầu với -D, ví dụ -DDEBUG để define DEBUGCác option đặc biệt khác của compiler như -g để bật chức năng debug gdb của gcc compiler, -wall để trace các cảnh báo [warning] trong quá trình c

$ export CFLAGS="-I./include -DDEBUG -Wall -g"LDFLAGS

Linker flags dùng trong quá trình linking các thư viện, nó bao gồm các thông tin:

Đường dẫn tới thư viện, được bắt đầu bằng -L, ví dụ -L./libCác thư viện bắt đầu với -l là viết tắt của lib, ví dụ: -lm tương ứng với libm, thư viện math có sẵn trong hệ thống

$ export LDFLAGS+=" -L./lib -lm"gcc : Complier cho C source và g++ là complier cho C++ source

Tiếp một ý bổ sung của anh Minatu

Có một thông số hơi quan trọng. Đó là sysroot, tức là đường dẫn đến thư mục root [/].Khi tìm file header lúc compile thì gcc sẽ làm đường dẫn base để tìm các file .h.Nó thường có 1 tập các thư mục mặc định như /usr/local/include,.. để tìm kiếm các file stdio.h, string… khi đó, nó sẽ tìm trên đường dẫn đầy là sysroot/usr/local/include.Khi linking cũng thế, nếu đường dẫn là /usr/lib thì đường dẫn đầy đủ khi tìm sẽ là sysroot/usr/lib.Nếu biên dịch native thì sysroot chính là /. Còn nếu sử dụng cross-compiler đặc thì đường dẫn này thường khác.Có thể hiển thị cái này bằng tham số –print-sysroot cho gcc. Bạn có thể thao tác kiểm tra nhanh bằng lệnh gcc -print-sysrootCó thể thêm -v vào câu lệnh biên dịch để thấy chính xác các tham số của gcc. Ví dụ như trong ví dụ trên ta thêm -v ở lệnh demo$ gcc -c main.c ${CFLAGS} -v

Tạm kết

Thế là xong được những bước cơ bản đầu tiên với Crosscompiler, tìm hiểu được một chút về cách để compile source .c đơn giản. Mới bước đầu làm quen thế là đủ, hẹn mọi người ở bài tiếp theo.

Có rất nhiều thuật ngữ tiếng anh mà nhiều người đang muốn tìm hiểu và khám phá, trong bài viết này, ngu công nghệ tiên tiến sẽ lý giải giúp bạn hiểu compiler là gì, trình biên dịch là gì ? Hãy cũng chúng tôi tìm hiểu thêm ngay bài viết với tựa đề : ” Compiler là gì ? Trình biên dịch là gì ” nhé

Compiler là gì ?

Compiler là gì ? [ Trình biên dịch hay còn gọi là Phần Mềm Biên Dịch ] là một chương trình mà trên cơ sở đó máy tính làm việc làm dịch một chuỗi những câu lệnh được viết bằng một ngôn từ lập trình [ hay còn gọi là ngôn từ nguồn hay mã nguồn ] .


Xem thêm : Meraki là gì ? Ưu điểm yếu kém Meraki mang lại gồm những gì

Thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ khác là ngôn ngữ máy tính mới [hay còn gọi là ngôn ngữ đích]. Chương trình mới được dịch ra chúng ta sẽ gọi là mã đối tượng.

Bạn đang đọc: Compiler là gì? Trình biên dịch là gì – //blogthuvi.com

Cái tên Compiler đang được rất nhiều những nhà phân phối chip coi trọng nhất, luôn dẫn tiên phong phong thứ nhất trong nghành sản xuất chip công nghiệp .
Nó không đơn thuần chỉ nổi tiếng bởi cánh chip giải quyết và xử lý được sản xuất dưới công nghệ tiên tiến bán dẫn tốt nhất, IDE tốt, không chỉ có vậy Compiler còn bí mật giúp cho vi tinh chỉnh và điều khiển tiếp xúc với con người một cách rất là thuận tiện trải qua một ngôn từ cấp cao gọi là C .

Lịch sử của Compiler

Các trình biên dịch Compiler trong bước đầu được thử nghiệm và tăng trưởng từ thập niên 1950. Tuy nhiên trong số đó chỉ có nhóm thao tác với FORTRAN được đứng vị trí số 1 bởi ông John Backus là thành công xuất sắc trong việc trình làng trình biên dịch một cách hoàn hảo nhất tiên phong trong năm 1957 . Và trên cơ sở hoàn hảo đó COBOL liên tục tăng trưởng và sớm có được trình biên dịch trên nhiều loại kiến trúc trong năm 1960 .

Với việc sử dụng ngôn từ cấp cao lần lượt đã tạo ra những trình biên dịch mới sinh ra vào đầu thập niên 1970 khi đó trình biên dịch C và Pasal đã được thiết kế xây dựng nên từ chính ngôn ngữ của chúng. Xây dựng một trình biên dịch tự lập chính là một cái bẫy khởi động .

Chúng ta hoàn toàn có thể hiểu đơn thuần là, phiên bản tiên phong của trình biên dịch tự lập này hoàn toàn có thể được cho phép một ngôn từ phải được biên dịch từ một trình biên dịch mà được viết trong một ngôn từ khác hoặc chính là, bắt chước theo cách được tạo lập trong trình biên dịch Lisp, với cách biên dịch bằng cách này thì trình biên dịch này sẽ cùng nằm trong một ứng dụng thông dịch .

Chức năng của Compiler là gì ?

Chức năng chính của compiler là gì bạn đã biết chưa. Compiler với công dụng phân khúc nhỏ những chương trình nguồn thành nhiều phần và áp những cấu trúc ngữ pháp lên chúng một cách hoàn hảo .


Xem thêm : Sóng RF là gì ? Sóng RF có lợi hay có hại cho sức khỏe thể chất

  • Cho phép bạn xây dựng chương trình mục tiêu mong muốn từ IR và hơn nữa cũng tạo ra bảng ký hiệu.
  • Biên dịch mã nguồn và nhanh chóng phát hiện báo cáo các lỗi trong mã nguồn.
  • Quản lý lưu trữ tất cả các mã và biến trong máy.
  • Hỗ trợ biên dịch một cách riêng biệt.
  • Đọc, phân tích toàn bộ chương trình tương đương về mặt ngữ nghĩa.
  • Cho phép dịch mã nguồn trở thành mã đối tượng tùy vào loại máy.
  • Trình biên dịch giúp xác minh toàn bộ thông tin chương trình. Do đó sẽ không có lỗi cú pháp hoặc ngữ nghĩa.
  • Tệp thực thi sẽ được tối ưu hóa cao nhất bởi trình biên dịch. Do đó tệp thực thi cho tốc độ nhanh hơn.
  • Compiler cho phép bạn tạo cấu trúc bên trong trong bộ nhớ.
  • Sử dụng chương trình Compiler giúp bạn không cần phải thực thi chương trình trên cùng một máy mà nó đã được xây dựng từ trước .
  • Dễ dàng thao tác dịch toàn bộ chương trình sang ngôn ngữ khác.
  • Có khả năng kết nối các tệp thành một định dạng thực thi.
  • Kiểm tra lỗi cú pháp cũng như kiểu dữ liệu một cách linh hoạt nhanh nhay.
  • Các kỹ thuật đang được sử dụng để xây dựng một trình biên dịch mà nó còn có thể hữu ích cho các mục đích khác.
  • Có trình biên dịch mạnh mẽ  giúp triển khai đầy đủ các Ngôn ngữ lập trình cấp cao.
  • Hỗ trợ tối ưu hóa cho các kiến ​​trúc máy tính song song.
  • Tạo lập ra được những thiết kế phân cấp bộ nhớ mới của máy móc.
  • Ngày càng được đón đầu và sử dụng rộng rãi để dịch các chương trình.
  • Cho phép người dùng sử dụng cùng với các Software Productivity Tools khác

Đến đây chắc tất cả chúng ta đã hiểu được compiler là gì rồi, nó có tính năng và trách nhiệm thế nào, lịch sử dân tộc hình thành của nó như thế nào rồi. Vậy phổ cập lúc bấy giờ có những loại compiler nào, hãy cùng ngu công nghệ tiên tiến đi tiếp nhé

Các loại Compiler phổ cập lúc bấy giờ

Nắm được compiler là gì rồi, vậy bạn đã biết Compiler hiện nay được chia thành bao nhiêu loại chưa, nếu còn thắc mắc thì hãy một lần nữa cùng ngu công nghệ khám phá tiếp phần phía dưới đây nhé.

Xem thêm: Hiểu đơn giản về khái niệm Big O trong lập trình

Single Pass Compiler là gì ? [ hay còn gọi là trình biên dịch 1 lần ]

Trình biên dịch 1 lần chỉ triển khai nghiên cứu và phân tích từ vựng, nghiên cứu và phân tích cú pháp và tạo mã một lần duy nhất. Hiểu một cách đơn thuần, nó được cho phép mã nguồn đi qua mỗi đơn vị chức năng biên dịch duy nhất một lần. Sau đó trình biên dịch này sẽ ngay lập tức dịch từng phần mã code thành mã máy sau cuối .

Các quá trình của trình biên dịch một lần là trong bước đầu đi, nghiên cứu và phân tích cú pháp, nghiên cứu và phân tích từ vựng và tạo mã. Nó sẽ nghiên cứu và phân tích từ vựng cho quét mã nguồn rồi thực thi chia những từ vựng ấy thành những mã thông tin . Và một điều đương nhiên là mọi ngôn từ lập trình đều có ngữ pháp . Ngữ pháp đại diện thay mặt cho cú pháp và những công bố pháp lý của ngôn từ khi thiết yếu. Tiếp đó, nghiên cứu và phân tích cú pháp và xác lập cấu trúc ngôn từ sẽ được diễn đạt đơn cử nhất qua ngữ pháp. Kết thúc, trình tạo mã tạo ra mã đích .

Nhìn một cách toàn diện và tổng thể, Single Pass Compiler không tối ưu hóa mã và không có sự tạo mã trung gian .

Two Pass Compiler là gì ? [ trình biên dịch 2 lần ]

Trình biên dịch 2 lần được chia thành 2 phần đơn cử chính là :

  • Frontend: trình biên dịch ánh xạ mã thành  Intermediate Representation [IR].
  • Backend: trình biên dịch tiếp tục ánh xạ IR đến máy đích.

Nhìn chung, phương pháp biên dịch hai lần đã đơn giản hóa quy trình nhắm tiềm năng. Hơn nữa nó còn được cho phép nhiều frontend hơn .

Multipass Compiler là gì ? [ trình biên dịch nhiều lần ]

Trình biên dịch nhiều lần cho mã nguồn trải qua quy trình nghiên cứu và phân tích từ vựng, nghiên cứu và phân tích cú pháp, tạo mã, … nhiều lần trong khi triển khai tạo mã trung gian .

Nó sẽ chuyển đổi chương trình thành một hoặc có thể là nhiều IR trong các bước giữa mã nguồn và mã máy. Trình biên dịch nhiều lần sẽ  xử lý lại toàn bộ đơn vị biên dịch trong mỗi lần truyền tuần tự nhất.

Xem thêm: Competitor Là Gì – Nghĩa Của Từ Competitor

Sau khi lấy hiệu quả của lần dịch trước làm đầu vào và tạo ra cho tất cả chúng ta một đầu ra trung gian. Hơn nữa trong mỗi lần dịch qua, mã sẽ được cải tổ cho đến khi lần quy đổi sau cuối và tạo mã ở đầu cuối . Một trình biên dịch nhiều lần sẽ triển khai những công tác làm việc vụ bổ trợ như tối ưu mã, tạo mã trung gian phụ thuộc vào vào máy và tối ưu mã độc lập với máy .

Nếu còn vướng mắc về Compiler là gì ? thì mọi người hãy liên hệ trực tiếp với chúng tôi để được tư vấn một cách tận tình nhất .

Source: //blogthuvi.com
Category: Blog

Video liên quan

Chủ Đề