Một số ưu điểm / nhược điểm của việc sử dụng C so với hội là gì? [đóng cửa]


15

Tôi hiện đang học ngành kỹ thuật về Viễn thông và Điện tử và chúng tôi đã chuyển từ trình biên dịch sang C trong lập trình vi xử lý. Tôi nghi ngờ rằng đây là một ý tưởng tốt. Một số ưu điểm và nhược điểm của C so với lắp ráp là gì?

Những lợi thế / bất lợi tôi thấy là:

Ưu điểm:

  • Tôi có thể nói rằng cú pháp C dễ học hơn rất nhiều so với cú pháp Trình biên dịch.
  • C dễ sử dụng hơn để tạo các chương trình phức tạp hơn.
  • Học C bằng cách nào đó có năng suất cao hơn so với học trình biên dịch vì có nhiều thứ phát triển xung quanh C hơn Trình biên dịch.

Nhược điểm:

  • Trình biên dịch là ngôn ngữ lập trình cấp thấp hơn C, vì vậy điều này làm cho nó tốt cho việc lập trình trực tiếp đến phần cứng.
  • Là linh hoạt hơn rất nhiều ám chỉ bạn làm việc với bộ nhớ, ngắt, đăng ký vi mô, vv.

17
Uhm ... chào mừng đến thế kỷ mới. Bạn sẽ thích nó ở đây. Chúng tôi có các bộ vi điều khiển chạy .NET , Java , Linux và thậm chí cả những người sử dụng python để lập trình PIC .
ZJR

@ZJR Làm thế nào để bạn sử dụng Python để lập trình PIC? PIC nào?
gièm pha

2
@detly Nó không phải là con trăn đầy đủ, chỉ là một tập hợp con của lõi. Một lớp cú pháp python qua chức năng điều khiển , nếu bạn muốn. pyastra là ví dụ đầu tiên tôi rút ra, nhưng tôi nhớ rằng đã đọc tài liệu của một tài liệu khác, cũng đã làm ATMEL.
ZJR

4
Thành thật mà nói, với sự phức tạp của các bộ xử lý hiện đại, tôi sẽ ngạc nhiên nếu nhiều lập trình viên có thể viết trình biên dịch chặt chẽ hơn, hiệu quả hơn trình biên dịch C hiện đại có thể tạo ra. Chẳng hạn, tôi rất muốn thử lập trình CPU kiến trúc EPIC trong trình biên dịch chương trình - Mel sẽ ở ngay tại nhà với Itanium . * 8 ')
Đánh dấu gian hàng

5
@ZJR Thế kỷ mới này nghe có vẻ thú vị! Mặc dù vậy, tôi tò mò về ngôn ngữ thời gian chạy .NET, Java VM và Linux được viết bằng ngôn ngữ nào? Như trong, ngôn ngữ lập trình vi điều khiển thực tế được thực hiện trong ngôn ngữ nào? Ồ ... C hoặc người lắp ráp thế kỷ này cũng vậy ...

Câu trả lời:


17

Dưới đây là một số câu trả lời tràn ngăn xếp có thể giúp bạn (đây là những câu trả lời hàng đầu, câu trả lời được chấp nhận):

Ưu điểm

/programming/143561/is-there-a-need-to-use-assugging-these-days (chỉ dành cho người dùng 10K) hoặc Lưu trữ

  • Hội được sử dụng trong các giai đoạn sớm nhất của bộ nạp khởi động. Khi CPU cấp nguồn cho ngăn xếp không khả dụng và thật khó để giữ trình biên dịch C cố gắng lưu mọi thứ vào ngăn xếp. Phần lớn bộ nạp khởi động dù sao cũng được viết bằng C, một khi việc khởi tạo sớm nhất được thực hiện.
  • Hội được sử dụng để viết nguyên thủy khóa mutex. Về cơ bản là không thể có được trình biên dịch C để phát ra các hướng dẫn về rào cản bộ nhớ ở những nơi cần thiết.
  • Các thường trình như memset () hoặc memcpy () thường được thực hiện trong lắp ráp. Ví dụ, tôi đã viết một memset () với một vòng lặp lớn không được kiểm soát, nó sẽ tự động tính toán một địa chỉ nhánh để nhảy vào giữa vòng lặp đó cho một lần lặp cuối cùng. Thói quen AC sẽ tạo ra nhiều mã hơn, mất thêm I $. Tương tự, các tập lệnh CPU thường bao gồm tải dòng bộ đệm hoặc các hướng dẫn khác có thể tăng tốc đáng kể memcpy () mà trình biên dịch C sẽ không sử dụng.

Nhược điểm

/programming/2684364/why-arent-programs-written-in-assinstall-more-often

  • ASM có mức độ dễ đọc kém và không thực sự duy trì được so với các ngôn ngữ cấp cao hơn.
  • Ngoài ra, có rất ít nhà phát triển ASM hơn so với các ngôn ngữ phổ biến khác, chẳng hạn như C.
  • Hơn nữa, nếu bạn sử dụng ngôn ngữ cấp cao hơn và các hướng dẫn ASM mới trở nên khả dụng (ví dụ SSE), bạn chỉ cần cập nhật trình biên dịch và mã cũ của bạn có thể dễ dàng sử dụng các hướng dẫn mới.

Thí dụ

Bài đăng cuối cùng bên dưới là bài đăng Stack Overflow phác thảo một kịch bản sẽ hiển thị một ví dụ lắp ráp nhanh hơn C (khi thực hiện cùng chức năng).

/programming/577554/when-is-assembler-faster-than-c


20
  • C dễ lập trình hơn, so với hội. Có những lý do rõ ràng không đáng để luyện tập lại.

  • Dễ sử dụng hơn, C cho phép bạn viết chương trình nhanh hơn. Nói chung các chương trình này cũng dễ gỡ lỗi hơn và dễ bảo trì hơn. Hơn nữa, việc quản lý các chương trình lớn, phức tạp trong C. dễ dàng hơn trong C.

  • Thông thường, mã được tạo bởi trình biên dịch cũng tốt như nhau (về tốc độ và hiệu quả) như trình biên dịch viết tay - nếu không muốn nói là tốt hơn.

  • C là cấp độ khá thấp, và hiếm khi bạn muốn xuống thấp hơn nhiều. Có thêm một lớp trừu tượng hiếm khi là một điều xấu.

  • Khi bạn cần hạ thấp xuống, bạn có thể sử dụng hội, nếu không bạn có thể sử dụng C.

  • Bạn có thể viết hội bằng mã C, nhưng không viết C bằng mã hội.


6
Tôi có thể nói, có thể đôi khi bạn sẽ thấy mã máy được tối ưu hóa của trình biên dịch C tốt hơn mã lắp ráp viết tay của bạn
người dùng

@crucified - đây đã là một yêu cầu phổ biến (và thường được biện minh) vào giữa đến cuối những năm 90. Một trình biên dịch áp dụng tối ưu hóa một cách đáng tin cậy và có hệ thống - không chỉ khi nó nhận thấy cơ hội.
Steve314

15

Chương trình AC có thể được biên dịch thành các kiến ​​trúc vi xử lý khác nhau.


4

chúng tôi đã chuyển từ trình biên dịch chương trình sang C trong lập trình vi xử lý. Tôi nghi ngờ rằng đây là một ý tưởng tốt

Đừng sợ, không ai phát triển chương trình mới trong trình biên dịch 100% nữa. Ngày nay, C có thể được sử dụng ngay cả đối với các kiến ​​trúc 8 bit nhỏ nhất, điên rồ nhất. Tuy nhiên , biết một số trình biên dịch làm cho bạn trở thành một lập trình viên C tốt hơn đáng kể. Ngoài ra, luôn có một vài chi tiết nhỏ trong hai chương trình cần được viết bằng trình biên dịch chương trình.

Tôi có thể nói rằng cú pháp C dễ học hơn rất nhiều so với cú pháp Trình biên dịch.

Có cú pháp dễ dàng hơn, chắc chắn. Tuy nhiên, học toàn bộ ngôn ngữ C với tất cả các chi tiết gây phiền nhiễu phức tạp hơn nhiều so với học tất cả các chi tiết của một trình biên dịch cụ thể. C là một ngôn ngữ lớn hơn và rộng hơn nhiều. Nhưng sau đó, một lần nữa, bạn có thể không cần phải tìm hiểu tất cả các chi tiết.

C dễ sử dụng hơn để tạo các chương trình phức tạp hơn.

Thật vậy, C cung cấp các cơ chế để thiết kế chương trình mô-đun, chẳng hạn như đóng gói và phạm vi cục bộ / biến cục bộ. Và C có một thư viện tiêu chuẩn, cộng với một lượng tài nguyên khổng lồ được viết trong suốt 30 năm qua. Và quan trọng nhất, C là xách tay.

Học C bằng cách nào đó có năng suất cao hơn so với học trình biên dịch vì có nhiều thứ phát triển xung quanh C hơn Trình biên dịch.

C có rất nhiều chức năng, thư viện và tài nguyên được tạo sẵn, do đó sẽ ít phát minh lại bánh xe. Nhưng ngoài điều đó, tuyên bố của bạn là chủ quan. Tôi tin rằng đó là một vấn đề sở thích cá nhân.

Ví dụ, tôi là một lập trình viên C có kinh nghiệm, thỉnh thoảng lập trình C ++. Tôi thấy mình kém năng suất hơn trong C ++, vì tôi không biết ngôn ngữ đó cũng như tôi biết C. Nhưng chỉ vì tôi cảm thấy như vậy, điều đó không nhất thiết có nghĩa là lập trình trong C hiệu quả hơn lập trình trong C ++. Một lập trình viên C ++ có kinh nghiệm chắc chắn sẽ có ý kiến ​​ngược lại.

Và có nhiều khía cạnh để "sản xuất". Một khía cạnh rất quan trọng là thời gian bảo trì và đặc biệt là thời gian cần thiết để khắc phục các lỗi do bảo trì. C dễ bảo trì hơn nhiều so với trình biên dịch chương trình.

Trình biên dịch là ngôn ngữ lập trình cấp thấp hơn C, vì vậy điều này làm cho nó tốt cho việc lập trình trực tiếp đến phần cứng.

Lập trình phần cứng có thể được thực hiện trực tiếp bằng một trong hai ngôn ngữ. Điều duy nhất bạn không thể làm trong C là truy cập các con trỏ ngăn xếp và các thanh ghi điều kiện, v.v., của chính lõi CPU. Vì vậy, nếu lập trình phần cứng, bạn có nghĩa là nói chuyện với CPU của chính mình, thì có, trình biên dịch cho phép nhiều hơn một chút so với C. Nếu bạn có nghĩa là truy cập phần cứng bên ngoài, thì trình biên dịch không có lợi ích gì so với C. Nhưng có lẽ khó viết hơn, vì nó thường khó viết hơn mã trình biên dịch mã chung cho một thiết bị bên ngoài cụ thể, hơn mã C chung.

Là linh hoạt hơn rất nhiều ám chỉ bạn làm việc với bộ nhớ, ngắt, đăng ký vi mô, vv.

Điều này LAF không đúng. C cũng cho phép bạn làm tất cả những điều đó, mặc dù bạn có thể phải dựa vào mã C dành riêng cho trình biên dịch, chẳng hạn như từ khóa ngắt.


Cuối cùng, bạn cần biết cả hai ngôn ngữ để lập trình MCU, nhấn mạnh vào C.


Theo cách nào thì toàn bộ ngôn ngữ C phức tạp hơn một số ngôn ngữ máy phức tạp hơn? Đã làm cả hai, tôi nghĩ rằng C mà không có các thư viện thì ít phức tạp hơn. Nếu bạn đang đề cập đến Thư viện chuẩn C, bạn cũng cần một cái gì đó tương tự như vậy trong trình biên dịch chương trình, để làm bất cứ điều gì hữu ích. C có thể là một ngôn ngữ lớn hơn và rộng hơn, nhưng bạn không cần phải biết nó với cùng một mức độ chi tiết. a = b[i] + c;ít phức tạp hơn nhiều so với hướng dẫn tải b[i](cần tính toán) và cvào các thanh ghi (phải có sẵn), thêm và lưu trữ.
David Thornley

1
@DavidThornley Càng tìm hiểu về C, bạn càng nhận ra mức độ phức tạp của nó. Bạn có biết tất cả hàng trăm trường hợp hành vi không xác định / không xác định / ngụ ý? Bạn có biết tất cả các quy tắc quảng cáo kiểu ngầm chi tiết (khuyến mãi số nguyên, chuyển đổi số học thông thường) không? Tất cả các quy tắc và cú pháp đặc biệt liên quan đến specifier? Tất cả các dạng khác nhau của mảng đa chiều tĩnh / động, bao gồm các con trỏ mảng (không bị nhầm lẫn với các con trỏ đến phần tử thứ nhất của một mảng) Tất cả các tính năng của C99 và C11? Và như thế.

1
@Lundin: Điều quan trọng về C là bạn có thể hỏi tất cả những câu hỏi đó và tìm câu trả lời cụ thể. Trình biên dịch tuân theo tiêu chuẩn được yêu cầu ghi lại cách chúng hoạt động đối với 62 (không phải "hàng trăm") hành vi được xác định. Sự đơn giản tuyệt đối của hội làm cho nó trở thành một đề xuất mang theo bữa trưa của riêng bạn, điều này sẽ làm giảm sự phức tạp mà C xử lý đối với mã của riêng bạn. Tôi có thể chống lại lập luận của bạn bằng cách hỏi có bao nhiêu thư viện dấu phẩy động đã được viết trong cụm cho bất kỳ kiến ​​trúc cụ thể nào và tại sao hành vi của chúng được xác định theo thực thi.
Blrfl

1
@Lundin: 62 là số hành vi do trình biên dịch xác định được liệt kê trong phần 4 của hướng dẫn sử dụng GCC. Loại bỏ những gì mà thư viện định nghĩa sẽ tạo ra sự so sánh táo với táo vì không có thư viện chuẩn để lắp ráp. Yêu cầu đối với tài liệu là câu đầu tiên của §J.3. GCC và một số trình biên dịch thương mại mà tôi đã mua hoặc sử dụng kể từ khi C89 được phê chuẩn (Intel, Sun, IBM, Portland Group), do đó, "hầu hết" mà bạn không bận tâm đến việc không tuân thủ chính mình. Nói về các tiêu chuẩn, cách lắp ráp x86 được viết bằng cú pháp Intel trên trình biên dịch với cú pháp AT & T có phù hợp với bạn không?
Blrfl

1
@Lundin: Xe của tôi rất tuyệt, cảm ơn. Tay lái, chân ga, phanh, ly hợp và cuống đèn báo rẽ đều ở những nơi tiêu chuẩn, có hành vi tiêu chuẩn và các điều khiển khác đều được đánh dấu rõ ràng bằng các ký hiệu tiêu chuẩn ISO. Tất cả những thứ được xác định theo cách thực hiện như hệ thống giải trí, HVAC, điều hướng, điều khiển hành trình, v.v. đều được ghi lại trong một cuốn sách béo trong ngăn đựng găng tay. Hội giống như Plymouth năm 1973 của tôi: không có gì nhiều, nhưng ở dạng thô, nó không có khả năng như những gì tôi đang lái. Hội là cùng một cách; sự phức tạp đến trong những gì bạn thêm vào nó.
Blrfl

1

Tùy thuộc vào cách bạn cần nhúng, C sẽ tạo ra các chương trình lớn, chậm. Điều này sẽ làm tăng đáng kể chi phí của phần đó của sản phẩm. Nó có thể là một giọt nước trong đại dương cho toàn bộ sản phẩm hoặc có thể thay đổi hoàn toàn sản phẩm. Vâng, một số người có thể nói rằng các nỗ lực bảo trì và phát triển phần mềm rẻ hơn, một lần nữa có thể đúng hoặc sai, nếu điều đó được nhúng sâu và nhắm đến một phần mà công suất thấp, nhỏ và rẻ tiền bạn không nói về nhiều mã. Mã đó chủ yếu dành riêng cho nhà cung cấp đó hoặc chip cụ thể đó vì vậy trong C không có lợi ích về tính di động, bạn phải viết lại trước mỗi mục tiêu. Với dòng cortex-m từ ARM, chúng tôi mới bắt đầu có thể có C cạnh tranh với asm, không phải mọi người không sử dụng C hoặc các ngôn ngữ cấp cao khác trong các sản phẩm nhúng của họ,

Cuộc tranh luận C vs ASM, một cách chuyên nghiệp, luôn sôi sục để viết nó bằng C và sử dụng ASM nơi bạn có thể biện minh cho nó. Và bạn có thể biện minh cho nó. Trong thế giới nhúng có hiệu suất và kích thước.

Bạn phải bao gồm mục tiêu trong cuộc thảo luận này. Mặc dù nhiều người đã sử dụng C với Microchip (các bức ảnh cũ hơn, không phải pic32 là mips) với chi phí rất lớn, đó là một bộ hướng dẫn khủng khiếp cho trình biên dịch, bộ hướng dẫn rất giáo dục và thú vị nhưng trình biên dịch không thân thiện. msp430, avr, arm, thumb, mips, tất cả đều tốt cho trình biên dịch. 8051 cũng tệ.

Thậm chí nhiều hơn ngôn ngữ các công cụ. Esp trong những trường hợp lo lắng về phát triển và quản lý mã là một đối số, bạn cần có các công cụ để có mặt hôm nay và ngày mai. Có một công cụ nguồn duy nhất, thậm chí bao gồm một mod gcc duy nhất, được quản lý bởi một nhóm, có rủi ro từ góc độ kinh doanh. Bạn có thể tìm thấy nhiều hơn một trình biên dịch, và bất kỳ ai xứng đáng tham gia vào nhóm đó đều có thể đánh bại một trình biên dịch trong một ngày cuối tuần (miễn là hội thảo bạn viết không phải là chỉ thị và hạnh phúc vĩ mô). Đối với cả asm và C, bạn sẽ muốn sử dụng các công cụ nguồn mở (hoặc của riêng bạn trong các công cụ gia đình), nơi bạn có cơ hội tốt hơn, ngay cả khi nó có nghĩa là sử dụng máy ảo để chạy bản phân phối linux 10 năm, có sẵn các công cụ cho Tuổi thọ của sản phẩm.

Điểm mấu chốt, một lần nữa, sử dụng / học / dạy cả C và asm, bắt đầu với C và sử dụng asm nơi bạn có thể biện minh cho nó.


Những lập luận này nghe có vẻ lỗi thời đối với tôi. Nếu bạn đang sử dụng một trình biên dịch hiện đại đã được viết trong 10 năm qua, thì tôi tin rằng bạn sẽ có một thời gian khó khăn để viết một chương trình biên dịch chương trình hiệu quả hơn đáng kể so với chương trình C. Trừ khi, có lẽ bạn đang sử dụng một số kiến ​​trúc khủng long 30 tuổi như PIC hoặc 8051, sau đó bạn sẽ có một chương trình chậm chạp bất kể bạn làm gì ...

Nó là khá nhỏ để sửa chữa lắp ráp chậm được tạo ra bởi gcc và llvm hiện đại nhất. Gcc 4.x tạo mã chậm hơn, kém hiệu quả hơn so với sê-ri 3.x (đối với một số mục tiêu, ít nhất là các mục tiêu tôi đã đánh giá, ARM chẳng hạn). Tôi nghĩ điều quan trọng là phải xua tan quan niệm rằng trình biên dịch đang hoạt động tốt hơn con người bởi vì nó không phải là. Và ngay cả khi nó làm điều đó chỉ làm điều đó khi con người biết họ đang làm gì. "Biết công cụ của bạn" nếu bạn muốn sử dụng chúng một cách hiệu quả. Bắt đầu với C và sử dụng ASM khi cần nếu bạn có thể biện minh cho nó ...
old_timer

Vì gcc là nguồn mở, nó là một con thú kỳ lạ. Có lẽ cổng đặc biệt đó được thực hiện kém. Tất cả tối ưu hóa mã phải được thực hiện cho nền tảng cụ thể, đó không phải là một nhiệm vụ tầm thường. Sẽ công bằng hơn khi so sánh hiệu suất của trình biên dịch thủ công so với trình biên dịch thương mại cho nền tảng đó.

gcc là đa mục tiêu vì vậy trung bình nó làm một công việc khá tốt nhưng không phải là một công việc tuyệt vời cho bất kỳ mục tiêu cụ thể nào. Và đó là những gì được mong đợi. nhưng quan điểm của bạn về một trình biên dịch hiện đại, trong 10 năm qua, v.v. Chỉ cần không giữ, các trình biên dịch sẽ không trở nên tốt hơn khi mã được tạo ra, chúng ngày càng tốt hơn về ngôn ngữ và các mục tiêu và tính năng với chi phí mã được tạo ra. Quan niệm rằng bất kỳ trình biên dịch hiện đại nào làm cho mã tốt nhất có thể chỉ đơn giản là sai. Rất đúng là trung bình RẤT NHIỀU so với trình biên dịch mã hóa bằng tay, khó có thể thực hiện bất kỳ dự án có kích thước khá nào trong asm tốt hơn C
old_timer

đó là lý do tại sao hầu hết mọi người nói sử dụng C cho đến khi có vấn đề và sau đó sửa chữa vấn đề trong asm nếu bạn có thể biện minh cho nó. Bạn có thực sự cần một chút hiệu suất tăng, đó thực sự là vấn đề hiệu năng của bạn, bạn có muốn duy trì mã này với mã asm không, bạn sẽ tiếp tục kiểm tra từng trình biên dịch trong tương lai để xem liệu đầu ra của nó có sửa chữa hoặc giảm bớt vấn đề của bạn không đến một mức độ chấp nhận được, v.v.
old_timer

1

Để lắp ráp, có một sự thỏa hiệp không thể tránh khỏi giữa khả năng duy trì và hiệu suất mã. Bạn có thể viết dễ đọc / duy trì lắp ráp hoặc bạn có thể viết mã được tối ưu hóa cao; nhưng bạn không thể làm cả hai.

Đối với C, sự thỏa hiệp không hoàn toàn biến mất, nhưng nó ít được chú ý hơn - bạn có thể viết dễ đọc / duy trì C được tối ưu hóa hợp lý.

Một lập trình viên ngôn ngữ lắp ráp xuất sắc sẽ có khả năng đánh bại trình biên dịch gần như mọi lúc, nhưng hầu hết thời gian họ sẽ cố tình chọn cách viết dễ đọc / duy trì mã thay thế; và do đó, một lập trình viên ngôn ngữ lắp ráp xuất sắc sẽ bị trình biên dịch đánh bại hầu hết thời gian.

Cách thông minh là sử dụng cả lắp ráp và C (thay vì chỉ lắp ráp hoặc chỉ C) - ví dụ: sử dụng C cho các phần của mã nơi một lập trình viên ngôn ngữ lắp ráp xuất sắc sẽ chọn viết mã duy trì / chậm và sử dụng lắp ráp cho phần còn lại (nơi "tối ưu hóa cao và khó bảo trì" thực sự hợp lý).


-3
  1. Tương đối tốt cho hiệu quả lập trình.
  2. Nó dễ dàng để lập trình bằng ngôn ngữ c hơn là sử dụng lắp ráp.
  3. Ngôn ngữ C có thể khá nhanh hơn ngôn ngữ lắp ráp.
  4. Có thể viết lắp ráp trong mã C nhưng không viết C trong mã lắp ráp.

3
chỉ có lợi thế ....
Kiran Sapkale

3
Đây chỉ là một phiên bản được điều chỉnh lại của một số ưu điểm / nhược điểm của việc sử dụng C so với hội là gì? ; bạn đã không thêm bất cứ điều gì mới vào cuộc thảo luận ở đây.
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.