Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

Many of the C projects that exist today were started decades ago.

The UNIX operating system’s development started in 1969, and its code was rewritten in C in 1972. The C language was actually created to move the UNIX kernel code from assembly to a higher level language, which would do the same tasks with fewer lines of code.

Oracle database development started in 1977, and its code was rewritten from assembly to C in 1983. It became one of the most popular databases in the world.

In 1985 Windows 1.0 was released. Although Windows source code is not publicly available, it’s been stated that its kernel is mostly written in C, with some parts in assembly. Linux kernel development started in 1991, and it is also written in C. The next year, it was released under the GNU license and was used as part of the GNU Operating System. The GNU operating system itself was started using C and Lisp programming languages, so many of its components are written in C.

But C programming isn’t limited to projects that started decades ago, when there weren’t as many programming languages as today. Many C projects are still started today; there are some good reasons for that.

How is the World Powered by C?

Despite the prevalence of higher-level languages, C continues to empower the world. The following are some of the systems that are used by millions and are programmed in the C language.

Microsoft Windows

Microsoft’s Windows kernel is developed mostly in C, with some parts in assembly language. For decades, the world’s most used operating system, with about 90 percent of the market share, has been powered by a kernel written in C.

Linux

Linux is also written mostly in C, with some parts in assembly. About 97 percent of the world’s 500 most powerful supercomputers run the Linux kernel. It is also used in many personal computers.

Mac

Mac computers are also powered by C, since the OS X kernel is written mostly in C. Every program and driver in a Mac, as in Windows and Linux computers, is running on a C-powered kernel.

Mobile

iOS, Android and Windows Phone kernels are also written in C. They are just mobile adaptations of existing Mac OS, Linux and Windows kernels. So smartphones you use every day are running on a C kernel.

Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

Databases

The world’s most popular databases, including Oracle Database, MySQL, MS SQL Server, and PostgreSQL, are coded in C (the first three of them actually both in C and C++).

Databases are used in all kind of systems: financial, government, media, entertainment, telecommunications, health, education, retail, social networks, web, and the like.

Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

3D Movies

3D movies are created with applications that are generally written in C and C++. Those applications need to be very efficient and fast, since they handle a huge amount of data and do many calculations per second. The more efficient they are, the less time it takes for the artists and animators to generate the movie shots, and the more money the company saves.

Embedded Systems

Imagine that you wake up one day and go shopping. The alarm clock that wakes you up is likely programmed in C. Then you use your microwave or coffee maker to make your breakfast. They are also embedded systems and therefore are probably programmed in C. You turn on your TV or radio while you eat your breakfast. Those are also embedded systems, powered by C. When you open your garage door with the remote control you are also using an embedded system that is most likely programmed in C.

Then you get into your car. If it has the following features, also programmed in C:

  • automatic transmission
  • tire pressure detection systems
  • sensors (oxygen, temperature, oil level, etc.)
  • memory for seats and mirror settings.
  • dashboard display
  • anti-lock brakes
  • automatic stability control
  • cruise control
  • climate control
  • child-proof locks
  • keyless entry
  • heated seats
  • airbag control

You get to the store, park your car and go to a vending machine to get a soda. What language did they use to program this vending machine? Probably C. Then you buy something at the store. The cash register is also programmed in C. And when you pay with your credit card? You guessed it: the credit card reader is, again, likely programmed in C.

All those devices are embedded systems. They are like small computers that have a microcontroller/microprocessor inside that is running a program, also called firmware, on embedded devices. That program must detect key presses and act accordingly, and also display information to the user. For example, the alarm clock must interact with the user, detecting what button the user is pressing and, sometimes, how long it is being pressed, and program the device accordingly, all while displaying to the user the relevant information. The anti-lock brake system of the car, for example, must be able to detect sudden locking of the tires and act to release the pressure on the brakes for a small period of time, unlocking them, and thereby preventing uncontrolled skidding. All those calculations are done by a programmed embedded system.

Mặc dù ngôn ngữ lập trình được sử dụng trên các hệ thống nhúng có thể thay đổi từ thương hiệu này sang thương hiệu khác, nhưng chúng được lập trình phổ biến nhất bằng ngôn ngữ C.

Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

Tại sao ngôn ngữ lập trình C vẫn được sử dụng?

Ngày nay, có nhiều ngôn ngữ lập trình cho phép các nhà phát triển có năng suất cao hơn so với C cho các loại dự án khác nhau. Có các ngôn ngữ cấp cao hơn cung cấp các thư viện tích hợp lớn hơn nhiều nhằm đơn giản hóa việc làm việc với JSON, XML, UI, trang web, yêu cầu của khách hàng, kết nối cơ sở dữ liệu, thao tác truyền thông, v.v.

Nhưng mặc dù vậy, có rất nhiều lý do để tin rằng chương trình C sẽ vẫn hoạt động trong một thời gian dài.

Trong các ngôn ngữ lập trình, một kích thước không phù hợp với tất cả. Dưới đây là một số lý do mà C là không thể đánh bại, và gần như bắt buộc, đối với các ứng dụng nhất định.

Tính di động và hiệu quả

C gần như là một ngôn ngữ lắp ráp di động. Nó gần với máy càng tốt trong khi nó gần như có sẵn cho các kiến ​​trúc bộ xử lý hiện có. Có ít nhất một trình biên dịch C cho hầu hết mọi kiến ​​trúc tồn tại. Và ngày nay, do các nhị phân được tối ưu hóa cao được tạo ra bởi các trình biên dịch hiện đại, nó không phải là một nhiệm vụ dễ dàng để cải thiện đầu ra của chúng với lắp ráp viết tay.

Đó là tính di động và hiệu quả của nó mà các trình biên dịch, thư viện và thông dịch viên của các ngôn ngữ lập trình khác thường được triển khai trong Ciêu. Các ngôn ngữ được giải thích như Python, Ruby và PHP có các triển khai chính được viết bằng C. Nó thậm chí còn được các trình biên dịch sử dụng cho các ngôn ngữ khác để giao tiếp với máy. Ví dụ, C là ngôn ngữ trung gian bên dưới Eiffel và Forth. Điều này có nghĩa là, thay vì tạo mã máy cho mọi kiến ​​trúc được hỗ trợ, các trình biên dịch cho các ngôn ngữ đó chỉ cần tạo mã C trung gian và trình biên dịch C xử lý việc tạo mã máy.

C cũng đã trở thành một ngôn ngữ franca để giao tiếp giữa các nhà phát triển. Là Alex Allain, Trình quản lý kỹ thuật Dropbox và người tạo ra cProgramming.com, đặt nó:

C là một ngôn ngữ tuyệt vời để thể hiện những ý tưởng phổ biến trong lập trình theo cách mà hầu hết mọi người đều thoải mái. Hơn nữa, rất nhiều nguyên tắc được sử dụng trong C - ví dụ, argcargv cho các tham số dòng lệnh, cũng như các cấu trúc vòng lặp và các loại biến - sẽ hiển thị bằng nhiều ngôn ngữ khác mà bạn học được để bạn có thể nói chuyện Đối với mọi người ngay cả khi họ không biết C theo cách phổ biến cho cả hai bạn.

Thao tác bộ nhớ

Truy cập địa chỉ bộ nhớ tùy ý và số học con trỏ là một tính năng quan trọng làm cho C phù hợp hoàn hảo cho lập trình hệ thống (hệ điều hành và hệ thống nhúng).

Tại ranh giới phần cứng/phần mềm, các hệ thống máy tính và bộ vi điều khiển ánh xạ các thiết bị ngoại vi của chúng và các chân I/O vào địa chỉ bộ nhớ. Các ứng dụng hệ thống phải đọc và ghi vào các vị trí bộ nhớ tùy chỉnh đó để liên lạc với thế giới. Vì vậy, khả năng của C, để thao túng các địa chỉ bộ nhớ tùy ý là bắt buộc đối với lập trình hệ thống.

Một bộ vi điều khiển có thể được kiến ​​trúc, ví dụ, sao cho byte trong địa chỉ bộ nhớ 0x40008000 sẽ được gửi bởi máy thu/máy phát không đồng bộ phổ quát (hoặc UART, một thành phần phần cứng phổ biến để giao tiếp với các thiết bị ngoại vi) đến 1, và sau khi bạn đặt bit đó, nó sẽ tự động bỏ qua ngoại vi.

Đây sẽ là mã cho hàm C gửi byte thông qua UART đó:

#define UART_BYTE *(char *)0x40008000 
#define UART_SEND *(volatile char *)0x40008001 |= 0x08 

void send_uart(char byte) 
{ 
   UART_BYTE = byte;    // write byte to 0x40008000 address 
   UART_SEND;           // set bit number 4 of address 0x40008001 
}

Dòng đầu tiên của hàm sẽ được mở rộng thành:

*(char *)0x40008000 = byte;

Dòng này bảo trình biên dịch giải thích giá trị 0x40008000 là một con trỏ tới char, sau đó là độ phân giải (đưa ra giá trị được trỏ đến bởi) con trỏ đó (với toán tử * bên trái) và cuối cùng để gán giá trị ____10 cho con trỏ bị hủy bỏ. Nói cách khác: Viết giá trị của biến

*(char *)0x40008000 = byte;
0 vào địa chỉ bộ nhớ 0x40008000.

Dòng tiếp theo sẽ được mở rộng thành:

*(volatile char *)0x40008001 |= 0x08;

Trong dòng này, chúng tôi thực hiện một chút hoặc hoạt động trên giá trị tại địa chỉ

*(char *)0x40008000 = byte;
3 và giá trị
*(char *)0x40008000 = byte;
4 (
*(char *)0x40008000 = byte;
5 trong nhị phân, tức là, 1 trong bit số 4) và lưu kết quả trở lại địa chỉ
*(char *)0x40008000 = byte;
3. Nói cách khác: chúng tôi đặt bit 4 của byte tại địa chỉ 0x40008001. Chúng tôi cũng tuyên bố rằng giá trị tại địa chỉ
*(char *)0x40008000 = byte;
3 là biến động. Điều này cho biết trình biên dịch rằng giá trị này có thể được sửa đổi bởi các quy trình bên ngoài mã của chúng tôi, vì vậy trình biên dịch đã giành được bất kỳ giả định nào về giá trị trong địa chỉ đó sau khi viết cho nó. . Ví dụ, nếu chúng tôi đã làm điều này bên trong một vòng
*(char *)0x40008000 = byte;
8, mà không chỉ định rằng giá trị dễ bay hơi, trình biên dịch có thể cho rằng giá trị này không bao giờ thay đổi sau khi được đặt và bỏ qua lệnh thực hiện lệnh sau vòng lặp đầu tiên.

Sử dụng tài nguyên xác định

Một tính năng ngôn ngữ chung mà lập trình hệ thống không thể dựa vào là thu gom rác, hoặc thậm chí chỉ phân bổ động cho một số hệ thống nhúng. Các ứng dụng nhúng rất hạn chế về tài nguyên thời gian và bộ nhớ. Chúng thường được sử dụng cho các hệ thống thời gian thực, trong đó một cuộc gọi không xác định đối với người thu gom rác không thể đủ khả năng. Và nếu không thể sử dụng phân bổ động vì thiếu bộ nhớ, điều rất quan trọng là phải có các cơ chế quản lý bộ nhớ khác, như đặt dữ liệu vào địa chỉ tùy chỉnh, vì con trỏ C cho phép. Các ngôn ngữ phụ thuộc rất nhiều vào phân bổ động và thu gom rác sẽ phù hợp với các hệ thống giới hạn tài nguyên.

Kích thước mã

C có thời gian chạy rất nhỏ. Và dấu chân bộ nhớ cho mã của nó nhỏ hơn so với hầu hết các ngôn ngữ khác.

Ví dụ, khi so sánh với C ++, một nhị phân do C tạo ra đi vào thiết bị nhúng có kích thước bằng một nửa của một nhị phân được tạo bởi mã C ++ tương tự. Một trong những nguyên nhân chính cho đó là hỗ trợ ngoại lệ.

Các trường hợp ngoại lệ là một công cụ tuyệt vời được thêm bởi C ++ so với C, và, nếu không được kích hoạt và thực hiện thông minh, chúng thực tế không có chi phí thời gian thực hiện (nhưng với chi phí tăng kích thước mã).

Hãy cùng xem một ví dụ trong C ++:

// Class A declaration. Methods defined somewhere else; 
class A
{
public:
   A();                    // Constructor
   ~A();                   // Destructor (called when the object goes out of scope or is deleted)
   void myMethod();        // Just a method
};

// Class B declaration. Methods defined somewhere else;
class B
{
public:
   B();                    // Constructor
   ~B();                   // Destructor
   void myMethod();        // Just a method
};

// Class C declaration. Methods defined somewhere else;
class C
{
public:
   C();                    // Constructor
   ~C();                   // Destructor
   void myMethod();        // Just a method
};

void myFunction()
{
   A a;                    // Constructor a.A() called. (Checkpoint 1)
   {                       
      B b;                 // Constructor b.B() called. (Checkpoint 2)
      b.myMethod();        //                           (Checkpoint 3)
   }                       // b.~B() destructor called. (Checkpoint 4)
   {                       
      C c;                 // Constructor c.C() called. (Checkpoint 5)
      c.myMethod();        //                           (Checkpoint 6)
   }                       // c.~C() destructor called. (Checkpoint 7)
   a.myMethod();           //                           (Checkpoint 8)
}                          // a.~A() destructor called. (Checkpoint 9)

Các phương thức của các lớp

*(char *)0x40008000 = byte;
9,
*(volatile char *)0x40008001 |= 0x08;
0 và
*(volatile char *)0x40008001 |= 0x08;
1 được xác định ở một nơi khác (ví dụ trong các tệp khác). Do đó, trình biên dịch không thể phân tích chúng và không thể biết liệu họ có ném ngoại lệ hay không. Vì vậy, nó phải chuẩn bị để xử lý các ngoại lệ được ném từ bất kỳ hàm tạo, chất phá hủy hoặc các cuộc gọi phương thức khác của họ. Các kẻ phá hủy không nên ném (thực hành rất tệ), nhưng người dùng có thể ném dù sao hoặc họ có thể ném gián tiếp bằng cách gọi một số chức năng hoặc phương thức (rõ ràng hoặc ngầm) ném một ngoại lệ.

Nếu bất kỳ cuộc gọi nào trong

*(volatile char *)0x40008001 |= 0x08;
2 ném một ngoại lệ, cơ chế tháo gỡ ngăn xếp phải có thể gọi tất cả các bộ hủy diệt cho các đối tượng đã được xây dựng. Một triển khai cho cơ chế tháo gỡ ngăn xếp sẽ sử dụng địa chỉ trả lại của cuộc gọi cuối cùng từ chức năng này để xác minh số điểm kiểm tra trên mạng của cuộc gọi đã kích hoạt ngoại lệ (đây là lời giải thích đơn giản). Nó thực hiện điều này bằng cách sử dụng một chức năng tự động hóa phụ (một loại bảng tra cứu) sẽ được sử dụng để ngăn chặn ngăn chặn trong trường hợp một ngoại lệ được ném ra khỏi cơ thể của chức năng đó, tương tự như thế này:

// Possible autogenerated function
void autogeneratedStackUnwindingFor_myFunction(int checkpoint)
{
   switch (checkpoint)
   {
      // case 1 and 9: do nothing;
      case 3: b.~B(); goto destroyA;                     // jumps to location of destroyA label
      case 6: c.~C();                                    // also goes to destroyA as that is the next line
      destroyA:                                          // label
      case 2: case 4: case 5: case 7: case 8: a.~A();
   }
}

Nếu ngoại lệ được ném từ các trạm kiểm soát 1 và 9, không có đối tượng nào cần phá hủy. Đối với điểm kiểm tra 3,

*(volatile char *)0x40008001 |= 0x08;
3 và
*(volatile char *)0x40008001 |= 0x08;
4 phải bị phá hủy. Đối với điểm kiểm tra 6,
*(volatile char *)0x40008001 |= 0x08;
5 và
*(volatile char *)0x40008001 |= 0x08;
4 phải bị phá hủy. Trong mọi trường hợp, lệnh hủy diệt phải được tôn trọng. Đối với các điểm kiểm tra 2, 4, 5, 7 và 8, chỉ đối tượng
*(volatile char *)0x40008001 |= 0x08;
4 cần bị phá hủy.

Hàm phụ trợ này thêm kích thước vào mã. Đây là một phần của không gian trên cao mà C ++ thêm vào C. Nhiều ứng dụng nhúng không thể đủ khả năng này. Do đó, các trình biên dịch C ++ cho các hệ thống nhúng thường có cờ để vô hiệu hóa các ngoại lệ. Vô hiệu hóa các ngoại lệ trong C ++ không miễn phí, bởi vì thư viện mẫu tiêu chuẩn phụ thuộc rất nhiều vào các ngoại lệ để thông báo lỗi. Sử dụng sơ đồ sửa đổi này, không có ngoại lệ, yêu cầu đào tạo nhiều hơn cho các nhà phát triển C ++ để phát hiện các vấn đề có thể xảy ra hoặc tìm lỗi.

Và, chúng tôi đang nói về C ++, một ngôn ngữ có nguyên tắc là: Bạn không phải trả tiền cho những gì bạn không sử dụng. Sự gia tăng kích thước nhị phân này trở nên tồi tệ hơn đối với các ngôn ngữ khác có thêm chi phí bổ sung với các tính năng khác rất hữu ích nhưng không thể có được bởi các hệ thống nhúng. Mặc dù C không cung cấp cho bạn việc sử dụng các tính năng bổ sung này, nhưng nó cho phép dấu chân mã nhỏ gọn hơn nhiều so với các ngôn ngữ khác.

Lý do để học c

C không phải là một ngôn ngữ khó học, vì vậy tất cả những lợi ích từ việc học nó sẽ khá rẻ. Hãy cùng xem một số lợi ích đó.

Lingua Franca

Như đã đề cập, C là một ngôn ngữ franca cho các nhà phát triển. Nhiều việc triển khai các thuật toán mới trong sách hoặc trên internet là đầu tiên (hoặc duy nhất) được cung cấp trong C bởi các tác giả của họ. Điều này cho phép tính di động tối đa có thể cho việc thực hiện. Tôi đã thấy các lập trình viên đấu tranh trên internet để viết lại thuật toán C cho các ngôn ngữ lập trình khác vì anh ấy hoặc cô ấy không biết các khái niệm rất cơ bản về C.

Xin lưu ý rằng C là một ngôn ngữ cũ và phổ biến, vì vậy bạn có thể tìm thấy tất cả các loại thuật toán được viết trong C xung quanh web. Do đó, bạn rất có thể được hưởng lợi từ việc biết ngôn ngữ này.

Hiểu máy (nghĩ trong C)

Khi chúng ta thảo luận về hành vi của một số phần mã nhất định, hoặc một số tính năng nhất định của các ngôn ngữ khác, với các đồng nghiệp, chúng ta cuối cùng đã nói chuyện trong C: Tiết có phải phần này chuyển một con trỏ của người Hồi giáo đến đối tượng hay sao chép toàn bộ đối tượng không? Có thể bất kỳ diễn viên nào xảy ra ở đây không? Và như thế.

Chúng tôi hiếm khi thảo luận (hoặc suy nghĩ) về các hướng dẫn lắp ráp rằng một phần mã đang thực thi khi phân tích hành vi của một phần mã của ngôn ngữ cấp cao. Thay vào đó, khi thảo luận về những gì máy đang làm, chúng tôi nói (hoặc suy nghĩ) khá rõ ràng trong C.

Hơn nữa, nếu bạn có thể dừng lại và nghĩ theo cách đó về những gì bạn đang làm, bạn có thể kết thúc việc lập trình với một loại mê tín nào đó về cách (một cách kỳ diệu) mọi thứ được thực hiện.

Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

Làm việc trên nhiều dự án C thú vị

Nhiều dự án thú vị, từ các máy chủ cơ sở dữ liệu lớn hoặc hạt nhân hệ điều hành, đến các ứng dụng nhúng nhỏ mà bạn thậm chí có thể làm ở nhà vì sự hài lòng và niềm vui cá nhân của mình, được thực hiện trong C. Không có lý do gì để ngừng làm những việc bạn có thể yêu thích vì lý do duy nhất Rằng bạn không biết một ngôn ngữ lập trình cũ và nhỏ, nhưng mạnh mẽ và được chứng minh theo thời gian như C.

Hướng dẫn how is c++ used in software development - c ++ được sử dụng như thế nào trong phát triển phần mềm

Sự kết luận

Illuminati không chạy thế giới. C Lập trình viên làm.

Ngôn ngữ lập trình C dường như không có ngày hết hạn. Nó gần gũi với phần cứng, tính di động tuyệt vời và sử dụng tài nguyên xác định làm cho nó lý tưởng cho sự phát triển cấp thấp cho những thứ như hạt nhân hệ điều hành và phần mềm nhúng. Tính linh hoạt, hiệu quả và hiệu suất tốt của nó làm cho nó trở thành một lựa chọn tuyệt vời cho phần mềm thao tác dữ liệu độ phức tạp cao, như cơ sở dữ liệu hoặc hoạt hình 3D. Việc nhiều ngôn ngữ lập trình ngày nay tốt hơn C cho mục đích sử dụng của họ không có nghĩa là họ đánh bại C trong tất cả các lĩnh vực. C vẫn vượt trội khi hiệu suất là ưu tiên.

Thế giới đang chạy trên các thiết bị chạy bằng C. Chúng tôi sử dụng các thiết bị này mỗi ngày cho dù chúng tôi có nhận ra hay không. C là quá khứ, hiện tại, và, theo như chúng ta có thể thấy, vẫn là tương lai của nhiều lĩnh vực phần mềm.

C có tốt cho các kỹ sư phần mềm không?

Nói một cách đơn giản, nếu bạn đang tìm cách tham gia vào kỹ thuật phần mềm, bạn sẽ cần biết C và C ++.Đừng nhầm lẫn với JavaScript phát triển trang web, Java là ngôn ngữ lập trình phần mềm được sử dụng rộng rãi là cốt lõi của nhiều chương trình, ứng dụng, trang web và hệ thống.if you're looking to get into software engineering, you'll need to know C and C++. Not to be confused with the web-page development focused JavaScript, Java is a widely used software programming language at the core of many programs, applications, web-pages and systems.

C được sử dụng cho lập trình là gì?

Là ngôn ngữ cấp trung, C kết hợp các tính năng của cả hai ngôn ngữ cấp cao và cấp thấp.Nó có thể được sử dụng cho lập trình cấp thấp, chẳng hạn như kịch bản cho trình điều khiển và hạt nhân và nó cũng hỗ trợ các chức năng của các ngôn ngữ lập trình cấp cao, chẳng hạn như kịch bản cho các ứng dụng phần mềm, v.v.