30/09/2018, 16:39

Nhờ giải thích về cross complier , tool chain

Em đang là sinh viên năm 3, có một số câu hỏi thắc mắc mong được các anh giải thích giùm, vì khi em tìm hiểu mà có những cái em không hiểu được tường tận bản chấn vấn đề nên hơi “băn khoăn”, mấy anh chịu khó trả lời giúp hết nhé.

  1. Về Cross Complier

Em tìm hiểu thì được biết cross complier là một complier có thể biên dịch mã để chạy trên các hệ thống nền tảng khác nhau. Vậy có nghĩa là đoạn mã mà nó biên dịch ra có thể chạy trên tất cả các nền tảng luôn hay sao ? Nếu không phải thì dựa vào đâu mà ta có thể biết đoạn mã do cross complier biên dịch này có thể chạy được trên nền tảng nào, hệ điều hành nào ?

GCC trên Linux khác gì với GCC của Cygwin trên Windows hay là giống nhau ? Đem đoạn mã biên dịch bằng cygwin trên windows qua Linux thi có “chạy” được không ?

  1. Tool chain là gì ? Tool chain hoạt động như thế nào ? Tool chain có phải là cross complier không ?

  2. Về Java
    Em thấy mấy bạn cài viết code java trên Eclipse windows , sau đó biên dịch và chạy được trên một thiết bị Android. Vậy có phải Eclipse đã tích hợp một cross complier không, và cross complier này tên là gì ?
    Một chương trình android viết bằng java được biên dịch trên windows và linux thì 2 mã biên dịch này có giống nhau không ? Nếu không giống nhau tại sao khi nạp vào android device lại chạy giống nhau ?

Itachi Citus viết 18:46 ngày 30/09/2018

Em tìm hiểu thì được biết cross complier là một complier có thể biên dịch mã để chạy trên các hệ thống nền tảng khác nhau. Vậy có nghĩa là đoạn mã mà nó biên dịch ra có thể chạy trên tất cả các nền tảng luôn hay sao ? Nếu không phải thì dựa vào đâu mà ta có thể biết đoạn mã do cross complier biên dịch này có thể chạy được trên nền tảng nào, hệ điều hành nào ?

Về tư tưởng ban đầu là thế, viết mã một lần chạy trên nhiều nền tảng khác nhau, nhưng do hệ điều hành bị phân mảnh tính năng nên giờ gần như không thể biên dịch được về mã executable trên mọi nền tảng nữa, ngoại trừ khi phần mềm sử dụng thư viện chuẩn và… console, nhưng một số trường hợp điều này cũng không đúng. Một số thư viện giao diện đồ họa cố gắng thay đổi điều này nhưng đương nhiên có giới hạn nhất định, điển hình là desktop apps vs mobile apps.

Tool chain là gì ? Tool chain hoạt động như thế nào ? Tool chain có phải là cross complier không ?

en.wikipedia.org

Toolchain

In software, a toolchain is a set of programming tools that is used to perform a complex software development task or to create a software product, which is typically another computer program or a set of related programs. In general, the tools forming a toolchain are executed consecutively so the output or resulting environment state of each tool becomes the input or starting environment for the next one, but the term is also used when referring to a set of related tools that are not necessarily...

Em thấy mấy bạn cài viết code java trên Eclipse windows , sau đó biên dịch và chạy được trên một thiết bị Android. Vậy có phải Eclipse đã tích hợp một cross complier không, và cross complier này tên là gì ?Một chương trình android viết bằng java được biên dịch trên windows và linux thì 2 mã biên dịch này có giống nhau không ? Nếu không giống nhau tại sao khi nạp vào android device lại chạy giống nhau ?

Thực chất khi phát triển ứng dụng trên eclipse, bạn phải cài 1 thêm compiler cho android. Nó biên dịch về bytecode cho dalvik virtual machine (gần đây thay bằng cái gì đấy không nhớ lắm). Do đó, dù biên dịch trên windows hay linux hay macos thì nó cũng như nhau và trình biên dịch là cross compiler do nó biên dịch mã nguồn trên nền tảng này sang nền tảng khác.

Itachi Citus viết 18:45 ngày 30/09/2018

À mình nhầm khái niệm về cross compiler rồi, biên dịch trên nền tảng này và chạy trên nền tảng khác, sorry

Hnib viết 18:52 ngày 30/09/2018

Còn một câu hỏi anh chưa trả lời giúp em nhé;

GCC trên Linux khác gì với GCC của Cygwin trên Windows hay là giống nhau ? Đem đoạn mã biên dịch bằng cygwin trên windows qua Linux thi có “chạy” được không ? Cygwin đã “làm gì” để đoạn mã biên dịch đó Windows có thể hiểu và chạy được ?

Hnib viết 18:44 ngày 30/09/2018

À mình nhầm khái niệm về cross compiler rồi, biên dịch trên nền tảng này và chạy trên nền tảng khác, sorry

Vậy ý là nó chạy trên tất cả các nền tảng khác được luôn hay sao anh ? Nếu không phải thì làm sao biết được nó sẽ chạy được trên nền tảng nào ?

Itachi Citus viết 18:41 ngày 30/09/2018

Mình bằng tuổi bạn thôi à. Hai trình biên dịch đó khác nhau, đem đoạn mã từ windows sang linux (Và ngược lại) sẽ không chạy được.
Nó làm gì thì mình cũng không rõ lắm . Bạn có thể xem qua tại http://www.tenouk.com/ModuleW.html
Ủa mà bạn đang học trình biên dịch à mà phải tìm hiểu mấy cái này vậy

Lập Trình Sư viết 18:49 ngày 30/09/2018

Hiểu không đúng rồi.

Cross Compiler (CComp) : chỉ đơn giản là một trình biên dịch thực thi việc biên dịch thông qua điều kiện cần và đủ của môi trường mà nó sẽ thực hiện quá trình tạo sản phẩm.
Mỗi lần thực hiện build từ source code ra sản phẩm thì CComp sẽ phải kiểm tra xem cấu hình đang là tạo ra sản phẩm cho môi trường nào rồi thực hiện biên dịch.
Ví dụ để build một ứng dụng lấy tên người dùng hiện tại.
Trên Windows thì sẽ dùng Windows API như GetCurrentUser(), còn Linux thì có thể là whoami, vậy sẽ có việc cấu hình có thể là:

(code này chỉ mang tính chất minh hoạ)
#ifdef __WINDOWS__
#define get_current_user GetCurrentUser
#else
#define get_current_user exec("whoami")
#endif

và trong code thì phải sử dụng hàm get_current_user() chứ ko phải hai hàm riêng của từng hệ điều hành thế kia.

GCC trên Linux là của Linux, chứ không phải Windows.
Cygwin là bản phát triển port bộ tool của GNU (bao giờ GCC) sang Windows. Và nó là một code khác tương tự chứ không chung một bộ code tạo nên GCC.

Các file chạy khi được build hướng tới môi trường nào thì phải tuân thủ cấu trúc file. Ví dụ trên Windows file có extension là EXE có cấu trúc thường gọi là PE, còn cấu trúc file chạy trên Linux là ELF.
Rõ ràng là khác nhau, làm sao có thể vứt một file theo cấu hình của hệ điều khác sang mà có thể chạy được?

Toolchain: là một tập hợp các bộ công cụ dùng để phát triển và tạo ra một sản phẩm hay một hệ thống các sản phẩm.

Java: ko phải là Cross compiler, ko phải toolchain, chỉ là một ngôn ngữ lập trình, OK?. Chỉ có điều là Java không giống các ngôn ngữ lập trình khác, nó chỉ có thể thực thi được khi trên hệ thống đã được cài đặt JVM (Java Virtual Machine). JVM sẽ thực hiện quản lí và thực thi các bytecode do Java compiler sinh ra từ việc build Java source code.

Bất cứ thiết bị nào có cài đặt JVM đều có thể thực thi bytecode sinh ra từ Java compiler. Nói béng ra là, JVM trên Windows hay Linux là một, như nhau, nên mã bytecode đẻ ra như nhau (thực ra cũng có một số khác biệt, nhưng ko nghiên cứu chuyên sâu thì cũng ko cần bận tậm lắm).

Android bản thân đã sử dụng DVM (Dalvik Virtual Machine), là một VM nhỏ hơn JVM dành cho các thiết bị nhỏ bé , nên thực thi code Java bình thường, không hề xoắn.

Khi phát triển Android trên Eclipse, bạn sẽ phải cài đặt ADT Plugin (Android Development Tool) và Android SDK. Khi thực hiện build, bản chất là ADT sẽ gọi tới toolchain của Android, gọi tới công cụ build source Android trên Windows (APT , Android Platform Tools). Bộ tools này sinh ra khi build source code của cả hệ điều hành Android, cấu hình môi trường nào thì sẽ ra platform build của môi trường đó. (Cái này ai làm Android ROM nhiều là biết ngay ấy mà ).

Nguyễn Minh Dũng viết 18:40 ngày 30/09/2018

Ok, để Đạt giải thích cái này. Ví dụ bạn có một cái máy x86 của Intel đi. Khi bạn compile code thì tạo ra file thực thi chạy được trên nền tảng x86 của intel. Nhưng nếu bạn muốn viết một chương trình chạy được trên nền tảng MIPS hoặc PowerPC thì không thể compile trên cái máy MIPS hoặc PowerPC bởi vì các thiết bị này thiếu CPU, RAM, HDD.

Khi này ta cần đến cross-compiler. Crosscompiler sẽ giúp cho việc sử dụng máy x86 của Intel để compile code chạy được trên các target khác. Ví du như ở trên, MIPS và PowerPC.

Hnib viết 18:44 ngày 30/09/2018

À không, mình tập tành học lập trình, mình muốn hiểu rõ bản chất vấn đề nên hỏi đó mà , hehe

Hnib viết 18:45 ngày 30/09/2018

@ltd : Em vẫn chưa rõ chỗ này . Theo như anh Đạt nói thì em đang xài một máy X86 của intel, giờ em build một ứng dụng có thể chạy được trên MIPS, Power PC gì đó thì em phải xài cross complier. Vậy em có phải cấu hình gì không để cái mã em sinh ra em biết được là nó sẽ chạy trên MIPS chẳng hạn.

Nguyễn Minh Dũng viết 18:53 ngày 30/09/2018

Dĩ nhiên phải có cấu hình chứ.

Hnib viết 18:43 ngày 30/09/2018

@laptrinhio : Cảm ơn anh về một bài giải thích rất cụ thể giúp em khai sáng ra nhiều vấn đề.

Hnib viết 18:48 ngày 30/09/2018

Đây là những gì em học được qua sự giúp đỡ của anh @laptrinhio và anh @ldthi , có chỗ nào sai thì sữa giúp em nhé

  1. Cross Complier là một complier, nó có khả năng biên dịch một chương trình trên nền tảng 1 nhưng chạy được trên nền tảng 2. Và để chạy được trên nền tảng nào thì bản thân chúng ta phải cấu hình việc này. Cũng như gcc trên Cygwin hoặc Mingw chạy trên windows là gcc này đã được cấu hình sẵn là sẽ biên dịch mã này để chạy trên windows. Vì cross complier đã biết được là đoạn code này sẽ được biên dịch cho nền tảng kiến trúc nào, nên thành ra mã binary code mà nó sinh ra sẽ khác nhau cho mỗi nền tảng. Vì vậy không thể sử dụng mã biên dịch mà cross complier biên dịch cho windows để chạy trên linux được.

  2. Toolchain chứa đựng một cross complier đã được cấu hình sẵn cho một môi trường nào đó cộng thêm các công cụ giúp ích lập trình viên soạn thảo và biên dịch chương trình. 2 loại toolchain phổ biến trên windows để biên dịch c++/c là Cygwin và Mingw

  3. Complier của java không phải là một cross complier, mã biên dịch của nó luôn luôn là để phục vụ cho Java Virtual Machine, còn vì sao mà cùng một mã biên dịch này mà có thể chạy trên nhiều hệ điều hành khác nhau chính là do hệ điều hành đó đã được cài JVM. Mỗi hệ điều hành có một JVM khác nhau, JVM này sẽ giúp thông dịch mã bytecode này có thể chạy được trên nền tảng/ hệ điều hành đó.

Bài liên quan
0