Tôi có nên cố gắng thực hiện các vấn đề thực hành trong lắp ráp? [đóng cửa]


9

Tôi đã xem xét vấn đề Project Euler 48 :

Sê-ri , 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.

Tìm mười chữ số cuối của chuỗi, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .

Trong Python tôi có thể làm điều này với một dòng duy nhất:

sum((x**x for x in xrange(1,1001))

Nhưng lắp ráp tương đương này sẽ là 100 dòng và một thách thức thực sự.

Tôi có nên thực hiện một số câu đố trong lắp ráp để hiểu rõ hơn về lập trình cấp thấp và hiểu máy tính thực sự hoạt động như thế nào không?


2
Nếu bạn không biết làm thế nào bộ nhớ hoạt động, làm thế nào bạn có thể mong đợi để đối phó với các chủ đề như con trỏ? Nếu bạn không hiểu làm thế nào một máy tính và hệ điều hành hoạt động, làm thế nào bạn có thể lập trình một ứng dụng?
Ramhound

Tôi có thể tạo ra rất nhiều khái niệm trừu tượng Ramhound đó là lý do tại sao tôi hỏi bạn điều này. Tôi có thể không nhận được đầy đủ các con trỏ vẫn có thể thực hiện điều gì đó trong các con trỏ như hoán đổi, điều này hợp lý khi bạn giả sử con trỏ lưu trữ vị trí bộ nhớ của một số kiểu dữ liệu khác. chủ đề tôi nên đọc? Ngôn ngữ hội và một chút COA sẽ tốt?
Nishant

Nếu bạn không có được đầy đủ các con trỏ, bạn sẽ thấy đó là một bất lợi nghiêm trọng ở một số nơi.
David Thornley

3
Dòng Python của bạn tính x ^ 2 cho x trong 1..1000 (thay vì x ^ x cho x trong 1..1000) hoặc python thậm chí còn kỳ diệu hơn tôi nghĩ. :)
Ingo

Là chức năng "nâng cao sức mạnh" *trong Python?

Câu trả lời:


1

Ngoài việc học lắp ráp, tôi tin rằng việc học một ngôn ngữ cấp thấp như C được biên dịch là rất có giá trị. Vì vậy, câu trả lời của tôi là có, nhưng một lần nữa tôi có lẽ thiên vị vì tôi thích lập trình cấp thấp.

Ví dụ, chỉ cần hiểu làm thế nào các câu lệnh đơn giản được biên dịch. Các chức năng sau đây,

int func(int val)
{
  int num = val * 5;
  return num;
}

... trở thành (ít nhất là một chút thú vị):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

Mã này lấy đối số từ ngăn xếp (val, tham số thành func), dịch chuyển nó sang trái 2 vị trí (nhân với 2 ^ 2 hoặc 4) và sau đó thêm giá trị ban đầu vào kết quả. Kết quả cuối cùng là một phép nhân với 5. Một ví dụ như thế này minh họa một số điều cần chú ý, chẳng hạn như tối ưu hóa trình biên dịch. Thay vì gọi một lệnh để nhân trực tiếp lên 5, nó sẽ dịch chuyển hai vị trí để nhân với 4 và sau đó thêm giá trị ban đầu. Tôi tìm thấy những ví dụ như thế này để cải thiện đáng kể sự hiểu biết của tôi về mọi thứ ở cấp độ thấp hơn.

Tạo đầu ra của trình biên dịch chương trình từ gcc với -Stùy chọn. Tuy nhiên, lưu ý rằng kết quả sẽ thay đổi theo trình biên dịch và mức tối ưu hóa.

Dù sao, tôi không nghĩ trở thành một lập trình viên ngôn ngữ lắp ráp cũng giống như hiểu về lắp ráp . Một lần nữa, tôi cảm thấy rằng lập trình bằng một ngôn ngữ như C và biết cách đưa nó vào mã máy là một thực hành có giá trị.


11

Có lẽ không cần thiết để thực sự có thể viết trình biên dịch chương trình (hầu hết trong số đó là chi tiết về quy ước khởi tạo và gọi cho hệ thống của bạn).

Đó là giá trị hiểu một số, trong trường hợp bạn đang cố gắng gỡ lỗi một cái gì đó mà không có nguồn.

NHƯNG chắc chắn là đáng để hiểu máy ít nhất là ở mức 'C' và con trỏ (về cơ bản là trình biên dịch cấp cao) để bạn biết tại sao việc nối một chuỗi một triệu lần trong một vòng lặp là xấu.


Trên thực tế, một số triển khai tương đối thông minh có thể làm cho for i in range(1000000): s = s + '.'không (t nhiều) tệ hơn các phiên bản "tối ưu hóa" mà tôi đang sử dụng lại s. Tương tự, một số phát triển khác làm mất hiệu lực giả định hợp lý với kiến ​​thức C và giả định thực hiện ngây thơ. Nhưng nói chung nó hữu ích hơn là có hại. Chỉ cần lưu ý rằng việc triển khai ngôn ngữ đôi khi thông minh hơn bạn;)

2
@delnan -Tôi chỉ cần một ví dụ ngắn về việc thứ gì đó trông vô hại trong Java / C # có thể rất đắt trên silicon. Tôi đặc biệt bắt gặp rất nhiều người nghĩ rằng việc phân bổ và sao chép bộ nhớ lớn là tức thời.
Martin Beckett

Tôi ghét phải tin rằng delnan :-)
Nishant

5

Câu hỏi hay. Học hội chắc chắn là tốt và đáng nỗ lực.

  1. Hiểu biết ở mức độ thấp như vậy sẽ được sử dụng tốt trong phát triển phần mềm nhúng
  2. Tái cấu trúc ở mức thấp
  3. Nó sẽ giúp bạn sử dụng hiệu quả trình gỡ lỗi
  4. Cung cấp cho bạn sự hiểu biết về mã được tháo rời để trợ giúp trong các công cụ như hang động mã

2
Tôi đã phải tìm kiếm codec. Tôi sử dụng chúng rất nhiều, nhưng chúng tôi gọi chúng là "Đường vòng". research.microsoft.com/en-us/projects/detours
ProdigySim

1

Có và không.

Mặc dù đúng là nó sẽ cho bạn hiểu rõ hơn về những gì mã của bạn đang làm và tại sao một số thứ chỉ là một ý tưởng tồi mà bạn phải nghĩ về nỗ lực này.

Học lắp ráp không phải là một dự án cuối tuần, nó sẽ khiến bạn mất rất nhiều thời gian và bạn cần phải suy nghĩ liệu thời gian này có thể được chi tiêu tốt hơn hay không.

Nếu bạn không vào mã được tối ưu hóa thì có lẽ bạn sẽ không bao giờ thấy lợi ích bằng với nỗ lực bạn bỏ ra.


1

Tôi đã làm rất nhiều trình biên dịch khi tôi còn trẻ và tôi không nghĩ nó giúp hiểu bất cứ điều gì ngoài trình biên dịch. Nếu bạn nhìn vào trình biên dịch hiện đại thì tất cả đều là ngôn ngữ macro. Tôi thường ghét sự tương tự, nhưng dù sao đi nữa: Liệu việc biết động cơ của một chiếc xe hoạt động như thế nào giúp bạn trở thành người lái xe tốt hơn?


Có biết làm thế nào động cơ của một chiếc xe làm việc làm cho bạn một người lái xe tốt hơn? Không, nhưng nó làm cho bạn trở thành một chủ sở hữu xe tốt hơn, bởi vì nếu động cơ bị hỏng bạn có thể sửa nó.
Cameron Martin

Đồng ý, nhưng nó không làm cho bạn một trình điều khiển tốt hơn, đó là sự tương tự tôi đang sử dụng. Bằng cách tự sửa chữa động cơ, bạn không hỗ trợ nền kinh tế rộng lớn hơn bằng cách sử dụng cơ học, ... Tương tự có giới hạn. Nói chung, tôi sẽ không bao giờ khuyến khích ai đó tìm cách học một cái gì đó nếu họ quan tâm, nhưng tôi nghĩ bạn cần đi sâu xuống lỗ thỏ để có thể áp dụng nó một cách hữu ích cho các ngôn ngữ cấp cao hơn. Để bắt đầu, bạn cần hiểu các tối ưu hóa biên dịch được sử dụng bởi ngôn ngữ cụ thể nếu nó được biên dịch, hoặc trình thông dịch hoặc jitter. Đó là một khu vực rộng lớn.
Ian

1

Cách tôi đã làm việc để hiểu trình biên dịch chương trình là bằng cách viết chương trình bằng các ngôn ngữ cấp cao hơn, sau đó thay thế các bộ phận bằng (ít nhất là hy vọng) các vùng tương đương về chức năng của mã được lắp ráp. Điều này có nghĩa là tôi có thể sử dụng HLL cho những gì chúng tốt - tổ chức và giải quyết các vấn đề cấp cao - và tôi sử dụng asm để đập kim loại.

(Khi tôi nói về chương trình máy chủ được viết bằng HLL, ý tôi là C hoặc ObjC khi tôi đang cố gắng học x86_64 asm và BASIC khi tôi làm việc trên Z80, 6502 và 6809 asm).

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.