Compiler là gì ?

Chúng tôi rất vui mừng được chia sẻ kiến thức sâu sắc về từ khóa Compiler la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

Compiler là gì ? Cross Compiler là gì ? Nó có liên quan gì tới một mạng lưới 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 tiếng nói lập trình thành lớp học tương đương dưới dạng tiếng nói máy tính, thường là tiếng nói ở thấp cấp hơn, tiếng nói máy. Đơn giản dễ hiểu thì có thể tạm nói là nhờ Complier này mà file .c tất 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

Tất cả chúng ta có thể xem sơ đồ rõ ràng các bước từ Code/Build/Run ở hình sau

Thông thường nếu dùng lớp học để lập trình như Keil C chẳng hạn thì chỉ việc ấn một nút Build/Run xong là tất cả chúng ta chỉ việc ngồi chờ và lớp học đượ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 những 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 khoản thời gian 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à tôi đã 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 người tiêu dùng

  • Build: mạng lưới 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 Windows
  • Host: mạng lưới 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à mạng lưới hệ thống chạy lớp học 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 luôn tồn tại thể là một máy tính thông 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 phương tiện để tạo và quản lý file nhị phân (bin) của target CPU
  • as : là assembler, nó sinh ra mã nhị phân (binary code) từ assembler source code
  • ld : trình liên kết (linker)
  • ar, ranlib : sinh ra file nén .a, sử dụng như thể thư viện
  • objdump, readelf, size, nm, strings: phân tích file nhị phân
  • strip : để loại bỏ những phần thừa trong file nhị phân để giảm kích thước của chúng

Xem Thêm : Ba con sói là gì? Tiếng anh ba con sói gọi là gì?

Thông thường để cross-compiler một lớp học ta phải tùy chỉnh biến môi trường xung quanh 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 sử 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ể nói đến như: glibc, uClibc, eglibc, dietlibc, newlib, …
  • Kernel headerCung cấp các API cấp thiết cho Applications và C Library giao tiếp với Kernel.
  • GCC compilergcc, c++, g++ : compilerTrình biên dịch trong mạng lưới hệ thống Linux, compile cho rất nhiều tiếng nói và nhiều kiến trúc CPU khác nhau như ARM, MIPS, PowerPC, SuperH, x86; tuy nhiên tôi chỉ đề cập đến tiếng nói C/C++ và kiến trúc CPU là ARM và x86.
  • GDB Debugger: Trình tháo gỡ, trợ hỗ trợ cho quá trình phát hiện lỗi khi develop application.

Ví dụ với GCC Compiler

Thiết lập 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à tùy chỉnh

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

Ví dụ

Xét một ví dụ cơ bản với lớp học C tính căn bậc 2 của 4 như sau

#include <stdio.hvàgt; #include <math.hvàgt; int main(int argc, char **argv){ double x; x = sqrt(4); printf(“x = %f n”, x); return 1; }

Để thực hiện thì tất cả 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 lớp học nhị phân từ file object $ ./prog #chạy lớp học

Kết quả

Giảng giải

Xem Thêm : Anise là gì?

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ẽ gồm có các thông tin:

  • Đường dẫn các header khai mạc với -I, ví dụ -I./include
  • Các define được khai mạc với -D, ví dụ -DDEBUG để define DEBUG
  • Các option đặc biệt quan trọng 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ó gồm có các thông tin:

  • Đường dẫn tới thư viện, được khai mạc bằng -L, ví dụ -L./lib
  • Các thư viện khai mạc 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 mạng lưới 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

  1. 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ó một 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 tuyến phố 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 thông số -print-sysroot cho gcc. Chúng ta có thể thao tác kiểm tra nhanh bằng lệnh gcc -print-sysroot
  2. Có thể thêm -v vào câu lệnh biên dịch để thấy xác thực các thông 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 trước hết với Crosscompiler, tìm hiểu được một tí về phương pháp để compile source .c đơn giản. Mới bước đầu làm quen thế là đủ, hứa hẹn mọi người ở bài tiếp theo.

You May Also Like

About the Author: v1000