Tại sao sự khinh miệt đối với COBOL? [đóng cửa]


52

Khi mọi người đề cập đến COBOL, nó thường gặp tiếng khịt mũi hoặc rên rỉ. Tôi không biết nhiều về COBOL, nhưng tôi đã thấy một số chương trình được viết trong đó. Tôi có thể thấy rằng nó dài dòng, và đôi mắt không quen thuộc như của tôi, không thể hiểu được. Nhưng, thực sự, không phải tất cả các ngôn ngữ lập trình đều hoàn toàn vô nghĩa với một giáo dân sao?

Tôi hiểu rằng nó hoạt động, hoạt động tốt và vẫn được sử dụng rộng rãi trong các ngành công nghiệp mà nó được thiết kế. Không phải đó là những đặc điểm của một ngôn ngữ tốt? Có gì tệ về COBOL?


8
COBOL không thể thao túng cơ sở dữ liệu phân cấp hoặc tệp phẳng và để bơm dữ liệu ra các báo cáo chỉ có văn bản lớn trên máy in ma trận điểm khổng lồ. Nhưng hầu hết dữ liệu hiện nay đều có trong RDBMS và hầu hết các nhà quản lý thích các báo cáo đẹp. COBOL không xử lý tốt như vậy.
pdr

1
@ Steve314: Vâng! Những, cái đó! Ngoại trừ chúng tôi là Line Matrix, và tôi đã không uống cà phê sáng nay khi tôi viết nó. - en.wikipedia.org/wiki/Line_matrix_printer
pdr

3
Nếu không tìm hiểu về COBOL, nếu bạn tìm kiếm một chút, tôi nghĩ bạn sẽ nhận thấy rất nhiều ngôn ngữ cụ thể của tên miền không phổ biến ở đây (để nói rằng ít nhất); COBOL, Fortran, VB6, MATLAB ... tất cả các ngôn ngữ rất tốt, chỉ không tốt cho việc giảng dạy khoa học máy tính và trừu tượng hóa của chúng.
Rook

4
@Rook - những thứ đó có thực sự được tính là ngôn ngữ dành riêng cho tên miền không? Ngay cả MATLAB, IIRC, vẫn có khả năng lập trình cho mục đích chung. Tôi nghĩ DSL chủ yếu áp dụng cho những thứ như yacc, lex, v.v. - những ngôn ngữ chỉ thực sự có khả năng thực hiện một nhiệm vụ khá hẹp, dẫn đến cái tên chung khác là "ngôn ngữ nhỏ". Tôi chưa bao giờ nghĩ rằng COBOL, Fortran hoặc VB có thể được gọi là tên miền cụ thể. Tất nhiên chúng đều có xu hướng được sử dụng trong các lĩnh vực cụ thể, nhưng tôi nghĩ chúng vẫn thường được coi là ngôn ngữ cho mục đích chung.
Steve314

1
@ Steve314 - Vâng, tốt - chúng ta có thể nói có hai mặt. Một người nói dom.spec. những cái chỉ là những cái bạn đã đề cập, cái còn lại có cái nhìn tổng quát hơn và được tính trong cái tôi đã đề cập quá, trong khi vẫn giữ chúng trong danh mục mục đích chung. Nhưng thực tế, bất cứ nơi nào bạn đề cập đến kỹ thuật và khoa học viễn tưởng. comp. bạn sẽ nhận được Fortran hoặc MATLAB, kinh doanh ... COBOL ... sử dụng thuật ngữ có vẻ hợp lý nhất với bạn. Tôi sử dụng cái này vì tôi thấy nó phù hợp với hầu hết mọi người. Trong mọi trường hợp, họ nhận được một phần bash công bằng vì một số lý do từ cộng đồng cs nói chung.
Rook

Câu trả lời:


68

COBOL là một trong những ngôn ngữ đầu tiên tôi học - nếu bạn bỏ qua vô số phiên bản Cơ bản, ba hoặc bốn ngôn ngữ trình biên dịch và một biến thể của Forth, thì đó là trong năm ngôn ngữ đầu tiên của tôi và học đồng thời với Pascal. IOW, tôi đang trả lời từ kinh nghiệm cá nhân bằng ngôn ngữ.

EDIT Tôi nên nói kinh nghiệm cổ xưa . Tôi không bao giờ sử dụng ngôn ngữ này sau khi kết thúc thập niên 80, mặc dù tôi đã mua một cuốn sách mới (để thay thế cuốn sách cũ mà tôi đã vứt đi trong sự ghê tởm) để tôi có một cái gì đó để đề cập để những câu chuyện kinh dị của tôi sẽ không bị biến dạng. Nhưng tôi không biết ngôn ngữ đã phát triển như thế nào trong ít nhất 20 năm qua.

Rõ ràng, đối với nhiều người, nó chỉ là "cũ là xấu" quan điểm cho rằng jonsca đã mô tả - và cũng nhiều hơn một tay thứ ba vượt qua-me-down thái độ điều. Nhưng có những vấn đề thực sự tiềm ẩn bên dưới đó.

Quá dài dòng là một vấn đề thực sự - có quá nhiều sự lộn xộn trong cách hiểu mã. Đây là vấn đề lớn nhất. Những người nhìn vào MOVE, ADDMULTIPLYbáo cáo vv trong kinh dị có một cái nhìn hơi phóng đại này, sự thật - sự COMPUTEtuyên bố là gần gũi hơn với các bài tập trong các ngôn ngữ khác. Nhưng vẫn còn rất nhiều lộn xộn trong tất cả các bộ phận và các bộ phận. Một trong những điều đầu tiên tôi học được ở COBOL là luôn luôn bắt đầu bằng cách sao chép một trang SKELETON.COB tiêu chuẩn dài A4.

COBOL không có một số tính năng thú vị, nhưng những tính năng (ví dụ như PICđiều) có xu hướng có những điều mà hiện nay nhiều phần của DBMS chứ không phải là ngôn ngữ lập trình, và điều đó dường như tôi thường có một cách tốt hơn để tách những trách nhiệm. Ngoài ra, một số thư viện trong các ngôn ngữ khác sử dụng một cái gì đó có thể so sánh với PIC(ví dụ printf và scanf trong thư viện chuẩn C). Có thể cho rằng, tốt nhất đã được giữ, nhưng tồi tệ nhất đã giảm.

Ngoài ra, đối với mỗi tính năng hay, có ít nhất một tính năng không thể chịu đựng được. Ví dụ, cho dù vòng lặp có tầm thường đến đâu, bạn phải di chuyển cơ thể vào một quy trình riêng. Các PERFORM ... UNTIL ...và các tuyên bố tương tự câu lệnh đơn - không cấu trúc khối. Trong một nghĩa nào đó, COBOL là một hương vị của lập trình cấu trúc từ trước khi lập trình có cấu trúc được phát minh - có một GO TO, nhưng nó sử dụng được nản chí (ít nhất là khi tôi đã sử dụng COBOL), nhưng vòng lặp nói riêng chỉ là không xử lý mà tốt.

Trên thực tế, ngôn ngữ mà tôi đã sử dụng sau COBOL khiến tôi nhớ nhất là ... dBase. Như trong Ashton-Tate dBase III +. Ngày nay, mọi người có nhiều khả năng nhớ tất cả các bản sao đã chết hoặc sắp chết (Clipper, FoxPro, v.v.) dẫn đến tên chung xBase - và vẫn còn một hậu duệ còn sống ở xHarbour. Vấn đề là đây là những ngôn ngữ cơ sở dữ liệu, nhưng không có gì giống như SQL.

Ngay cả khi đó, nơi mọi chương trình COBOL hoạt động trên một cơ sở dữ liệu cụ thể cần bao gồm một bản sao đặc tả của cơ sở dữ liệu đó (và các bản sao có thể không nhất quán), đó thực sự không phải là trường hợp trong xBase khi cơ sở dữ liệu biết cấu trúc của chính nó.

Sau đó, tính đến điều đó, COBOL không quá khủng khiếp nếu bạn chấp nhận nó cho những gì nó là. Nhưng những gì nó không phải là một ngôn ngữ để viết cấu trúc dữ liệu. Đó có thể là lý do tại sao COBOL phải chịu đựng rất nhiều trong thời kỳ chiến tranh thần thánh C vs Pascal - cả hai bên có thể đồng ý rằng COBOL không tốt cho việc phát minh lại cây nhị phân một lần nữa.

Ồ - và một điều tôi sẽ không bao giờ quên là cuốn sách giáo khoa COBOL đầu tiên của tôi đã không mô tả SORTlệnh như thế nào , nói rằng nó nằm ngoài phạm vi của cuốn sách - rõ ràng, tác giả không thể đối phó với ý tưởng sắp xếp, hoặc coi nó là nhiều hơn những bộ óc nhỏ bé của các sinh viên COBOL có thể đối phó với [xem chỉnh sửa ở cuối]. Điều đó làm cho rất khó để thực hiện nghiêm túc COBOL.

Một khía cạnh kỳ lạ của điều này là Lập trình cấu trúc Jackson, mà tôi cũng bị buộc phải học cùng một lúc, và đặc biệt để sử dụng với COBOL. Một phần của việc này là vẽ sơ đồ cấu trúc cho đầu vào, sau đó là sơ đồ cấu trúc cho đầu ra, sau đó vẽ sơ đồ cấu trúc ở giữa cho mã. Sắp xếp rõ ràng là một vấn đề đã được giải quyết - bạn không thể rút ra được thuật toán sắp xếp theo cách này. Vì vậy, thật kỳ lạ khi được cuốn sách văn bản khuyến nghị nói rằng toàn bộ khái niệm sắp xếp nằm ngoài tâm trí nhỏ bé của tôi, đồng thời được dạy một cái gì đó giống như hàng tá thuật toán sắp xếp khác nhau và cách thực hiện chúng trong Pascal.

Các vấn đề mà JSP có thể xử lý có lẽ là một hướng dẫn tốt cho những điều mà COBOL có thể làm tương đối tốt. Nhưng ngay cả khi đó, điều đó không nhất thiết có nghĩa là cả JSP và COBOL đều là những cách tốt để xử lý những vấn đề đó.


EDIT vào ngày 30 tháng 7 năm 2014

Tôi vừa được tăng cường danh tiếng từ việc này, nhắc nhở tôi rằng nó ở đây. Khi điều đó xảy ra, do một số bộ sưu tập sách cổ mang đầy hoài niệm, giờ đây tôi có thể sửa một SORTlệnh WRT .

Cuốn sách ban đầu tôi sử dụng làm văn bản được đề xuất khi học COBOL là "Lập trình phương pháp trong COBOL" của Ray Welland. Điều này không bao gồm COBOL 85 (mặc dù đã có phiên bản "Lập trình phương pháp trong COBOL-85" sau này mà tôi chưa từng thấy).

loại bình luận bên dưới rằng "Bạn phải sắp xếp các tệp đầu vào trước khi đọc chúng hoặc sắp xếp tệp đầu ra sau khi tạo nó, sử dụng tiện ích sắp xếp đi kèm với HĐH". Từ câu trả lời của tôi, tôi đã bỏ lỡ điểm "đi kèm với hệ điều hành". Kindall đã gợi ý một cái gì đó giống với triết lý Unix AFAICT, với COBOL được sử dụng cho các bit, nó tốt cho các tiện ích hệ điều hành như một tiện ích sắp xếp được sử dụng cho một số thứ khác, và có lẽ sử dụng ngôn ngữ bó / script / shell để dán các bit lại với nhau. Điều này có ý nghĩa hơn nhiều trong một thế giới cổ đại, nơi phần mềm tương tác hiếm khi không tồn tại, do đó, dù sao bạn cũng sẽ gửi một loạt công việc (do đó là "ngôn ngữ lô").

Sau đây được trích dẫn từ trang 165-166 của "Lập trình phương pháp trong COBOL" ...

Việc sử dụng các tệp nối tiếp có thứ tự ngụ ý rằng cần phải có một phương tiện sắp xếp các bản ghi trong một tệp thành một số thứ tự được chỉ định theo khóa. Hầu hết các hệ thống máy tính lớn hơn đều có tiện ích sắp xếp sẽ sắp xếp một tệp theo vị trí, loại và kích thước của từng mục dữ liệu tạo thành khóa.

Ngoài ra còn có một cơ sở để sắp xếp các hồ sơ từ trong một chương trình COBOL nhưng điều này nằm ngoài phạm vi của cuốn sách này vì hai lý do:

(a) giao diện cho hệ điều hành thường khá phức tạp và thay đổi tùy theo hệ thống,

(b) mô-đun sắp xếp là một phần tùy chọn của ANS '74 COBOL và có thể không được triển khai trong các hệ thống COBOL cho các máy tính nhỏ hơn.

Do đó, sẽ có giả định rằng các cơ sở tồn tại để sắp xếp các tệp theo một thứ tự được chỉ định và vấn đề cập nhật các tệp đó sẽ được xem xét.

Nói tóm lại, kindall là chính xác - giả định là thông thường việc sắp xếp sẽ được thực hiện bên ngoài COBOL. Thậm chí có thể có một lý do thực sự để loại trừ việc sắp xếp từ một ngôn ngữ lập trình vào khoảng năm 1974 cho các máy tính nhỏ.

Những gì tôi nói ở trên về cơ bản là những gì bạn nhận được sau khoảng 20 năm không thể kiểm tra sự thật do vứt cuốn sách đi.

Tuy nhiên, tôi vẫn nên chỉ ra rằng tôi đã chính thức nghiên cứu về COBOL từ cuốn sách được đề xuất này bao gồm tiêu chuẩn năm 1974 (không phải tiêu chuẩn 1985) vào năm 1988 và 1989. Phiên bản thứ ba của "COBOL dành cho sinh viên" (Parkin, Yorke, Barnes) - phiên bản đầu tiên bao gồm COBOL 85 - không được xuất bản cho đến năm 1990. Tôi không chắc chắn, nhưng tôi nghĩ rằng phiên bản "Lập trình phương pháp" của COBOL 85 đã không được xuất bản cho đến năm 1994.

Nhưng điều đó không nhất thiết đại diện cho thế giới COBOL kéo lê đôi chân của mình - tốt, dù sao thì nó cũng không nhiều. Việc áp dụng tiêu chuẩn mới cần có thời gian cho bất kỳ ngôn ngữ nào, ngay cả bây giờ.


5
+1 Để thực sự biết những gì bạn đang nói về. Ước gì tôi có thể cung cấp cho bạn +1 khác cho JSP. Bạn đã bao giờ sử dụng "Delta"? Đó là một trình tạo Cobol để bạn có thể viết mã JSP của mình vào mã, theo kiểu tương tự như các định nghĩa bộ nhớ (01 - 03 - 05) và sau đó viết Cobol của bạn vào các khoảng trống. Cả hai vui vẻ và bực bội như địa ngục.
pdr

3
Trang Wikipedia trên JSP - en.wikipedia.org/wiki/Jackson_Stabaseured_Programming . Khi tôi học nó, tất cả đã được thực hiện trên giấy.
Steve314

1
Lý do phân loại được coi là một vấn đề được giải quyết là nó đã được. Từ hồi ức của tôi, COBOL thực sự không khuyến khích có nhiều hơn một hoặc hai bản ghi trong bộ nhớ cùng một lúc (bản ghi hiện tại và có thể là bản ghi trước đó). Bạn phải sắp xếp các tệp đầu vào trước khi đọc chúng hoặc sắp xếp tệp đầu ra sau khi tạo nó, sử dụng tiện ích sắp xếp đi kèm với HĐH.
kindall

1
Tôi đã thực hiện một số COBOL trong một vài năm (để tham khảo, tôi chỉ 26 tuổi) và tôi có thể làm rõ một điều cho bạn. Bạn không còn cần phải xác định các khoản cho mỗi vòng lặp, bây giờ bạn có thể inline nó với PERFORM UNTILtới END-PERFORMkhối. Tôi thực sự ghét rằng tôi biết điều đó.
AgentConundrum

1
@NealB Tôi chỉ làm rõ quan điểm của anh ấy, vì anh ấy thừa nhận kinh nghiệm của anh ấy đã lỗi thời, thậm chí theo tiêu chuẩn của COBOL. Tôi hiểu ý của bạn về COBOL85, nhưng có rất nhiều mã cũ đã được bắt đầu trước khi nó tồn tại hoặc được viết bởi những người bị mắc kẹt trong phiên bản trước. Bạn thực sự không thể cho rằng một codebase đạt tới 85 tiêu chuẩn, nhưng ngay cả khi nó là, nó vẫn là một ngôn ngữ không thoải mái. Các lập trình viên cũ đang nghỉ hưu nhanh hơn so với việc họ được thay thế và rất ít lập trình viên mới muốn làm việc trong COBOL. Tôi biết tôi sẽ không muốn chạm vào những thứ đó một lần nữa.
AgentConundrum

43

Đã dành hầu hết ngày hôm nay để viết một số COBOL tôi nghĩ rằng tôi có thể cung cấp một số đầu vào hiện tại.

Đầu tiên là công cụ BAD: -

  • Không có chức năng gọi. COBOL hiện đại có một số chức năng được xây dựng nhưng nó là một công việc kỹ thuật nghiêm túc để viết riêng của bạn.
  • Không có loại kiểm tra trên các cuộc gọi chương trình con. Bạn có thể vượt qua (hoặc không vượt qua) bất cứ điều gì trong lệnh gọi chương trình con, chương trình con được gọi sẽ cho rằng nó có các tham số chính xác và không có cách nào để phát hiện các tham số bị thiếu hoặc không hợp lệ.
  • Không có thư viện. Không có zilch không. Không có thư viện tiêu chuẩn, không có thư viện dễ sử dụng rộng rãi. Bạn kết thúc mã hóa các nhiệm vụ giao tiếp bằng cách bàn giao nhiều lần.
  • Tất cả mọi thứ được thực hiện như một từ khóa. Bởi vì các tác giả ngôn ngữ không có khái niệm về thư viện, mọi tính năng mới kết thúc được triển khai với các từ khóa mới, ví dụ PARSE và RENDER để hỗ trợ XML.

Sự hiểu lầm, tức là những lời chỉ trích thường được chững lại đối với ngôn ngữ cũ thân yêu không hợp lệ hoặc không liên quan.

  • Độ dài. Vì vậy, bạn gõ thêm một vài ký tự! Nó không phải là một vấn đề nghiêm trọng. Trong nhiều trường hợp, COBOL ít dài dòng hơn nói Java.

  • "LỌC LỚN" Bạn thấy thuật ngữ này được băng bó rất nhiều. Không có gì như vậy chỉ là COBOL có thể xử lý bất kỳ định dạng tệp nào và bất kỳ tổ chức tệp nào.

  • Không đa luồng. Trong các môi trường mà COBOL phát triển mạnh, đa luồng thường được dành cho các thùng chứa ứng dụng như CICS hoặc IMS, tốt hơn là các lập trình viên có xu hướng xấu về nó.

Và những thứ tốt - một số khía cạnh của COBOL vượt trội so với các ngôn ngữ khác: -

  • Cấu trúc dữ liệu. COBOL có một cú pháp ngắn gọn và linh hoạt để xác định cấu trúc dữ liệu phức tạp và các kiểu dữ liệu lẻ.
  • Số học thập phân. Nó có hỗ trợ riêng cho số học thập phân, tức là số học theo cách hiểu của kế toán viên, với cách làm tròn thích hợp, v.v.
  • Di chuyển với Thời đại. Một số khía cạnh của COBOL là hiện đại đáng ngạc nhiên. Hỗ trợ XML tích hợp, hỗ trợ lập trình OO, khả năng sử dụng các lớp Java, v.v.
  • Tích hợp với DB2, CICS, v.v. Điều này chỉ áp dụng cho COBOL của máy tính lớn của IBM (nhưng đó là phần lớn nhất của COBOL vẫn đang chạy) nhưng việc tích hợp với DB2, CICS và các môi trường máy tính lớn khác giúp dễ dàng mã hóa những thứ như cơ sở dữ liệu dịch vụ web hơn bất kỳ môi trường nào khác.
  • Xử lý màn hình. Việc xử lý màn hình tiêu chuẩn như được thực hiện trên AS / 400 và MicroF Focus Cobol là tuyệt vời.
  • Hiệu suất. Trong nhiều năm, trình biên dịch COBOL đã tạo ra các tệp thực thi hiệu năng rất cao. Chỉ có C và Trình biên dịch gốc bản địa đánh bại COBOL trên máy tính lớn của IBM.

Vì vậy, tất cả trong tất cả các hoạt động của nó khá tốt cho một cái gì đó đã được đưa ra bởi một ủy ban trong những năm 1950. Nếu một ứng dụng hiện có được triển khai trong COBOL và thực hiện công việc thì không có lý do gì để viết lại nó. Tuy nhiên, trừ khi có một lý do thực sự tốt, tôi không thấy bất kỳ lời biện minh nào cho các dự án mới sử dụng COBOL.


2
Trong câu trả lời của tôi, tôi nói rằng COBOL có hại cho cấu trúc dữ liệu. Đây có phải là một sự khác biệt trong "cấu trúc dữ liệu" nghĩa là gì? Có thể các công cụ bố trí bản ghi là tuyệt vời, nhưng COBOL vẫn là ngôn ngữ sai cho cây nhị phân, v.v.? Hoặc có thể kinh nghiệm của tôi về COBOL đã quá cũ hoặc bị hạn chế? Câu hỏi chính - COBOL có con trỏ không? (Đáng lo ngại, một Google nhanh chóng đề nghị có, mặc dù cuốn sách cũ của tôi cho thấy không). Tôi ghét rút lại một câu trả lời kiếm được tất cả những điểm đáng yêu đó cho tôi, nhưng nếu tôi sai ...
Steve314

3
Có một nhược điểm của số học thập phân: bạn phải nói chính xác có bao nhiêu chữ số bạn muốn. Tôi nhớ đã tìm thấy lỗi khi chúng tôi có quá ít 9s trong PICmệnh đề trong một số chương trình trong một nhóm.
David Thornley

2
Ấn tượng (không hiểu rõ) của tôi là COBOL đặc biệt giỏi trong việc xử lý dữ liệu trong các bản ghi cứng, có kích thước cố định. Không tốt, có lẽ, tại các cấu trúc dữ liệu động. Sửa lỗi cho tôi nếu tôi sai.
Barry Brown

@ Steve314 - con trỏ yep xuất hiện vào khoảng năm 1985 nhưng hơi khập khiễng vì bạn chỉ có thể đặt chúng vào phần trong phần liên kết. Các phiên bản sau này cho phép bạn chỉ vào bất cứ điều gì.
James Anderson

1
@St Structures - trong khi nó không đạt tiêu chuẩn Python về băm và cây, v.v. Nó tốt như C hoặc Java - ngoại trừ C ++ cộng với Boost hoặc Java cộng với Thư viện bộ sưu tập. Một lần nữa, việc không đánh giá cao giá trị của các thư viện và chức năng tiêu chuẩn đã làm tê liệt ngôn ngữ trong suốt cuộc đời dài của nó.
James Anderson

27

Điều này có lẽ là xuống Djikstra. Djikstra tuyên bố rằng "Việc sử dụng COBOL làm tê liệt tâm trí; do đó, việc dạy học của nó nên được coi là một hành vi phạm tội." Cobol được xem là ngây thơ, không có cấu trúc và dài dòng. Với khả năng tự thay đổi mã (một thực tế không được khuyến khích ngay cả trong số các lập trình viên cobol), nó được xem là khá khó để gỡ lỗi hoặc làm theo.

Sau đó, có vấn đề không tương thích lớn giữa các phiên bản quá.

Tôi sẽ đề nghị đọc phần phê bình và bảo vệ trong Wikipedia cho ngôn ngữ - http://en.wikipedia.org/wiki/COBOL#Criticism_and_defense


20
Một ngày nào đó họ sẽ phát hiện ra một hầm chứa đầy mã được viết bởi Dijkstra bằng các ngôn ngữ mà anh ta đã tố cáo.
jonsca

7
@jonsca - bạn sẽ ngạc nhiên về những gì bạn sẽ làm vì tiền.
JeffO

3
Các phiên bản không tương thích là IIRC khá phổ biến cho đến ít nhất là những năm 70 và ngay cả trong những năm 80 cũng có Basic. Dijkstra có lẽ đã đưa ra quan điểm của mình dựa trên một vấn đề mà tôi đề cập trong câu trả lời của mình - COBOL không tốt cho (hoặc có nghĩa là tốt cho) mã hóa cấu trúc dữ liệu. Do đó, đối với một giá trị cụ thể của "dạy lập trình" hoặc "dạy khoa học máy tính", thì COBOL thực sự là thuốc độc. Tất nhiên vì COBOL không có ý định đó, nên đó là một yêu cầu khá bất công - nhưng sau đó, IIRC, bối cảnh là một số người đang cố gắng dạy những điều này bằng cách sử dụng COBOL.
Steve314

2
Dijkstra <- một người đàn ông đã nói quá nhiều ...
Rook

3
@Danny: COBOL đã bị coi thường trước khi Dijkstra viết dòng đó vào năm 1975.
John R. Strohm

9

Đó là tuổi tác và tính dài dòng thường là những điều khiến mọi người than vãn về nó.

Tôi dường như nhớ lại rằng mục tiêu chính của IBM khi thiết kế COBOL là nó "nên cho phép người quản lý ngân hàng viết chương trình". Mục tiêu này rõ ràng có ảnh hưởng sâu sắc đến cách ngôn ngữ được thiết kế, và bây giờ nó đã phát triển.

Rõ ràng là có nhiều COBOL ngoài tự nhiên hơn bất kỳ ngôn ngữ nào khác. Tuy nhiên, sau khi làm việc trong ngành CNTT gần 20 năm (15 năm về ngân hàng), tôi chưa bao giờ gặp phải một hệ thống duy nhất nào được triển khai trong đó.


Tôi đã nghe ai đó đề cập đến ngân hàng khi đi qua, đó là lý do duy nhất tôi đưa nó vào, nhưng tôi chắc chắn sẽ tin lời bạn hơn là vì người khác.
jonsca

4
Tôi đã làm việc 20 năm trong ngành Ngân hàng, hầu hết tất cả đều ở COBOL. Các ngân hàng khác nhau đã làm những điều khác nhau theo cách tôi cho là.
TrueDub

Tôi biết ít nhất một hệ thống ERP chính có (hoặc có đến khoảng năm 2007) rất nhiều COBOL trong đó.
Alan B

2
Không phải IBM đã thiết kế COBOL. Những kẻ xúi giục chính là Hải quân Hoa Kỳ và UNIVAC.
James Anderson

8
"mục đích chính của IBM khi thiết kế COBOL là nó" nên cho phép người quản lý ngân hàng viết chương trình "." Một mục tiêu cao cả, mặc dù đại đa số các nhà quản lý mà tôi biết thậm chí không thể viết cho tôi tài liệu đơn giản cho một trang web, chứ đừng nói đến việc viết COBOL.
maple_shaft

8

Có gì tệ về COBOL?

Không có gì.

Tôi nghĩ mọi người có một quan niệm định sẵn rằng cũ là xấu, "mới nhất là tốt nhất". Nó vẫn còn được sử dụng rất nhiều và tôi chắc chắn sẽ có đủ công việc bảo trì mã trong nửa thế kỷ nữa.

Năm 1997, Tập đoàn Gartner báo cáo rằng 80% doanh nghiệp của thế giới chạy trên COBOL với hơn 200 tỷ dòng mã tồn tại và ước tính có khoảng 5 tỷ dòng mã mới mỗi năm. (thông qua wikipedia )

Trong mã hóa, người ta phải luôn chọn công cụ tốt nhất cho công việc và với một số ngành nhất định kết hôn với phần cứng nhất định, ngôn ngữ là tối ưu. Tôi chưa bao giờ làm việc trong lĩnh vực ngân hàng, nơi tôi đã nghe nói nó rất phổ biến, nhưng câu trả lời của Sean cho thấy đây không phải là trường hợp.

Nếu có vấn đề với mã kế thừa trông cũ, miễn là bạn có thể tát UI hoặc giao diện web trước nó, hầu hết người dùng sẽ không biết sự khác biệt.


1
Ngôn ngữ nào dành cho người dùng?
JeffO

16
"Dòng mã" không phải là một biện pháp ngôn ngữ chéo tốt. COBOL nổi tiếng là dài dòng. 5 tỷ dòng mã này có thể tương đương với mười bảy regex;)
MSalters

3
Đôi khi, COBOL là công cụ phù hợp cho công việc - rất nhiều lần không phải vậy. Phần khó là khiến mọi người nhận ra sự khác biệt.
TrueDub

1
Hoàn toàn đúng, @TrueDub. Câu nói của tôi nghe có vẻ hơi bán hàng, nhưng nó không có nghĩa là gì.
jonsca

3
@TrueDub: Nếu COBOL là công cụ phù hợp cho công việc, tôi không muốn làm công việc đó, miễn là tôi có giải pháp thay thế. Có nhiều công việc thú vị hơn tôi có thể được trả tiền cho.
David Thornley

5

Mọi người không thích COBOL vì nó có ứng dụng hạn chế. Nó được thiết kế cho các hệ thống kinh doanh, tài chính và hành chính cho các công ty và chính phủ.

Tất cả những thứ này có điểm gì chung? Dữ liệu. Rất nhiều và rất nhiều dữ liệu.

Đoán xem ai được thiết kế để crunch dữ liệu và có nhiều tập tin cho bữa sáng? Bạn có thể nói ngôn ngữ định hướng kinh doanh COmmon ?

50 năm trước, COBOL là điều tốt nhất cho các tổ chức lớn có nhiều dữ liệu để quản lý. Ngày nay có nhiều cách tốt hơn để quản lý một khối lượng dữ liệu lớn để COBOL không còn phù hợp. Hoặc là nó?

Hãy xem xét các chính phủ. Dữ liệu nào chính phủ cần theo dõi? Id người, giấy khai sinh, hồ sơ y tế, thuế (ồ ... vâng ... thuế), v.v. Và họ phải giữ những infos này vô thời hạn, hôm nay và 50 năm trước cũng vậy.

Mọi người cũng nói xấu các ngân hàng trong một số câu trả lời và thực sự các ngân hàng là người sử dụng rất nhiều COBOL. Tại sao? bởi vì không giống như các loại công ty khác, các ngân hàng thường có một lịch sử. Một số tồn tại hàng trăm năm ( ví dụ như cái này chẳng hạn ).

Điều đó có nghĩa là một số dữ liệu từ 50 năm vẫn phải ở đây với chúng tôi, hôm nay, ngày 7 tháng 10 năm 2011. Bây giờ chúng tôi có SQL Server và C # hoặc Oracle và Java, nhưng 50 năm trước đã có COBOL và các tệp.

Khi thời gian trôi qua, dữ liệu cho các chính phủ và ngân hàng ngày càng lớn hơn và việc di chuyển các hệ thống ngày càng tốn kém hơn. Điều đó có nghĩa là họ phải ở lại COBOL và được duy trì và phát triển khi kinh doanh phát triển. Một số ngân hàng đang dần di chuyển trong khi các ngân hàng khác chỉ dán giao diện Web2.0 đẹp trước máy tính lớn (c # và Java được sử dụng nhiều nhất). Bạn có thể nói mã di sản? (COBOL đi đôi với mã di sản (cực kỳ), một số được nhiều người chạm đến qua nhiều thập kỷ tồn tại - một điều khác mà các lập trình viên chúng tôi không thích: D).

Và bây giờ bạn có một phân khúc hoạt động. COBOL hiện có ứng dụng hạn chế và trải nghiệm của bạn bị ảnh hưởng .

Và những người tham gia vào COBOL cuối cùng phát hiện ra rằng bạn làm điều tương tự hết lần này đến lần khác, hết năm này qua năm khác và khi họ thức dậy, họ không còn cạnh tranh trên thị trường bởi vì mọi người bây giờ muốn PHP, Java, C # , REST, jQuery và chỉ các ngân hàng tìm kiếm người COBOL.

Tại thời điểm này, nhu cầu thấp hơn nguồn cung và những người không thực hiện việc cắt giảm phải chuyển sang thứ khác. Và họ phải bắt đầu với tư cách là đàn em vì COBOL thực sự làm tê liệt tâm trí (tin rằng không phải Copy-Paste là phong cách phát triển chính của COBOL và chiếm năng suất lớn) và bây giờ họ nguyền rủa ngày họ nhặt được COBOL và không ' T mất bất kỳ dịp nào để kể những câu chuyện kinh dị của họ về nó :). Nhưng bạn có thể kể những câu chuyện về bất kỳ ngôn ngữ rắm cũ nào không còn có nhu cầu ngày nay nhưng bạn là người không may mắc kẹt với nó. O tốt...

PS và COBOL là xấu cho tất cả các lý do khác được đề cập bởi những người khác :)

PS2. In 1997, the Gartner Group reported that 80% of the world's business ran on COBOL with over 200 billion lines of code in existence and with an estimated 5 billion lines of new code annually.Có thật không? Và làm thế nào để đo ngày đó? Họ đã đi làm mọi công ty trong từ và hỏi họ có bao nhiêu dòng COBOL họ có hoặc những gì?


4

Hai tính năng.

  • Tuyên bố ALTER là tà ác thuần túy. Mặc dù hiếm khi được sử dụng trong các ứng dụng COBOL hiện đại hơn, nhưng nó được sử dụng rất nhiều trong "thời xa xưa" vì nó hiệu quả hơn cấu trúc "IF-GOTO" tương đương. Khi máy tính chỉ có 32K RAM, mỗi lệnh đều quan trọng. Nó đã sửa đổi một tuyên bố GOTO để có một đích khác.

    Điều này làm cho một số mã mờ đục vì bản thân mã là trạng thái.

  • Mệnh đề REDEFINES trong cấu trúc dữ liệu (như uniontrong C) là một vấn đề muôn thuở. Thuật ngữ "liên minh tự do" - nghĩa là các cấu trúc dữ liệu được phủ mà không có người phân biệt đối xử - là một cách để tóm tắt vấn đề. Hai bí danh REDEFINES không thể được phân biệt bằng dữ liệu; chỉ đọc rộng rãi logic chương trình mới có thể xác định ý nghĩa của hai cách hiểu xen kẽ của các byte.

    Điều này làm cho nhiều cấu trúc dữ liệu mờ đục vì dữ liệu không thể hiểu được nếu không có mã.

Khả năng đọc của cú pháp giống như tiếng Anh đã bị đánh bại bởi hai cấu trúc này.

[Tôi đã được cảnh báo bởi những người điều hành rằng những câu trả lời ngắn sẽ loại bỏ câu hỏi quan trọng và thú vị của bạn. Nếu bạn tìm thấy sự bác bỏ này, bạn có thể yêu cầu chi tiết. Hoặc gắn cờ để người điều hành có thể xóa nó.]


Tôi không nhớ ai trong số họ - hoặc là đàn áp, hoặc tôi chưa bao giờ học chúng. Một tìm kiếm nhanh cho tôi biết rằng tôi chắc chắn đồng ý rằng đó ALTERlà xấu xa, nhưng tính năng này hiếm khi được sử dụng, vì vậy nó không thực sự là một lý do để ghét COBOL. Tôi không chắc chắn về REDEFINESmặc dù. So sánh nó với nó unionkhiến tôi suy nghĩ một chút tử tế hơn đối với nó - nhưng có lẽ những gì ổn trong ngôn ngữ xử lý cấu trúc dữ liệu và xử lý dữ liệu ở mức độ thấp có thể không phải là một ý tưởng tuyệt vời trong xử lý dữ liệu.
Steve314

Đôi khi câu trả lời của bạn đánh tôi là bác bỏ, nhưng điều này chỉ là vô ích. Tôi không biết liệu bạn đang cố gắng giúp đỡ ở đây, nhưng làm điều đó rất tệ, hoặc nếu bạn chỉ đang nói với chính mình. Tôi có thể hỏi bạn ý của bạn về 'tội ác thuần túy', nhưng cái hay của những câu trả lời hay ở trên là tôi không cần phải bắt đầu một cuộc trò chuyện để học được điều gì đó.
Eric Wilson

@EricWilson: Cảm ơn vì đã bỏ qua câu trả lời của tôi rất kỹ. Điều đó giúp tôi hiểu những gì cần thiết hơn để được thêm vào.
S.Lott

1
@Eric - vấn đề ALTERlà nó chuyển hướng gotos. Đầu tiên, điều đó có nghĩa là bạn đang sử dụng gotos - bản thân tôi không nghĩ đó là xấu, nhưng trong hầu hết các ngôn ngữ, đó là một trường hợp đặc biệt khác thường. Thứ hai, điều đó có nghĩa là các gotos đi đến một nơi khác ngoài nơi họ nói họ sẽ đến - và điều đó thật đáng sợ. Tôi không thực sự tin rằng đây là mã tự sửa đổi, nhưng nó được mô tả như là nơi tôi nhìn và nghĩ về nó như là sửa đổi các mục tiêu hướng dẫn nhảy trong trình biên dịch giải thích tại sao.
Steve314

@ S.Lott Cảm ơn bạn đã bổ sung (bạn cũng vậy @ Steve314), tôi đã học được một điều thú vị và đảo ngược phiếu bầu của tôi.
Eric Wilson

3

Tôi đã lập trình trong COBOL trong vài năm. Cú pháp của nó đơn giản so với các ngôn ngữ ngày nay và bạn không cần phải có nhiều lý thuyết để học. COBOL đã làm việc rất tốt với CICS của IBM (một hệ thống quản lý giao dịch trực tuyến) và lập trình viên cần lưu ý mã để mở rộng số lượng người dùng ứng dụng từ 1 đến vài nghìn. CICS cung cấp GUI dựa trên ký tự hoạt động với màn hình dưới dạng một đơn vị hiển thị (không có cửa sổ). Bạn có thể hiển thị các biểu đồ bằng cách sử dụng (GDDM của IBM) trên máy tính lớn. COBOL có thể nói chuyện với các tệp được lập chỉ mục (VSAM và ISAM) cũng như DB2 (quan hệ dựa trên SQL) và IMS. COBOL / CICS là một môi trường rất mạnh mẽ và bạn có thể học nó trong vài tuần. Điều đó có nghĩa là bạn tập trung vào công việc kinh doanh không phải là công nghệ, vì vậy bạn làm việc 7 trên 8 giờ về mã hóa không phải là học MVM, JavaScript và tương tự.

Vấn đề với COBOL là tiếp thị xấu dẫn đến sự thiếu quan tâm của các bên thứ 3 để phát triển các công cụ và môi trường lập trình cho nó. Ngoài ra, việc thiếu hỗ trợ cho Windows như giao diện khiến mức độ phổ biến của nó giảm sau năm 1993. Chi phí máy tính lớn khiến khách hàng tìm kiếm các lựa chọn thay thế và trình biên dịch cho COBOL có sẵn trong UNIX và DOS. Ngôn ngữ C đã thu hút nhiều ánh sáng vì nó có thể dễ mang theo hơn và có quyền truy cập trực tiếp vào các chức năng của hệ điều hành, điều mà COBOL có rất ít.

Các ngôn ngữ như VB, DBase, FoxPro và Clipper có cách tốt hơn để truy cập vào 'cơ sở dữ liệu' trên PC so với COBOL tương đương trên DOS nên đã mất COBOL. CICS đã không được làm cho rẻ trên DOS hoặc UNIX trong một thời gian dài, vì vậy giá trị của nó không có trên các môi trường này.

Ngày nay, COBOL được hỗ trợ với .NET nhưng tôi đoán rằng nó đã thua trận chiến trên tất cả các nền tảng ngoại trừ máy tính lớn (và có thể là AS / 400), nơi nó vẫn còn ở đó vì số lượng lớn các ứng dụng quan trọng phụ thuộc hoàn toàn vào nó


"thiếu hỗ trợ cho Windows như giao diện" .... còn netcobol.com/products/Fujitsu-NetCOBOL-for-.NET/overview
JoelFan

@JoelFan cảm ơn bình luận của bạn. Bạn đúng là ngày nay, có những công cụ tốt hơn cho COBOL nhưng tôi nghĩ rằng tất cả chúng đã đến quá muộn. Quan điểm của tôi về việc thiếu hỗ trợ cho giao diện Windows là từ đầu những năm 90, trong đó chỉ có Micro Focus là người chơi duy nhất trên thị trường.
NoChance

2

Heh, tôi đã đi học đại học vào đầu những năm 80, và mọi người đã khinh miệt về COBOL ngay cả khi đó. Tôi nghĩ vấn đề lớn nhất là tính dài dòng của nó - một câu đơn giản "Xin chào, thế giới!" trong COBOL có lẽ là hơn năm mươi dòng, 95% trong số đó là bắt buộc. Nó không phải là một ngôn ngữ rất thanh lịch hoặc hấp dẫn. Nó cũng được thiết kế để xử lý các vấn đề của ngày hôm qua và không thực sự cho vay các mô hình phát triển được phát triển sau khoảng năm 1970. Đó là một ngôn ngữ tạo báo cáo khá tốt - miễn là các báo cáo của bạn là các cột số vô tận với các tiêu đề và chân trang. Nếu bạn muốn dán vào biểu đồ hoặc logo ở đâu đó, hãy quên nó đi. Tôi nghĩ rằng đây vẫn là ngôn ngữ nhanh nhất cho các tác vụ "xử lý dữ liệu" (lấy tệp định dạng cố định với 5M giao dịch ATM và thực hiện điều chỉnh số dư đơn giản cho từng tác vụ), Nhưng có bao nhiêu nhà phát triển làm những điều đó nữa? Và ngày nay, rất nhiều hệ thống sử dụng XML hoặc JSON, tôi không muốn nghĩ về việc cố gắng phân tích bất cứ điều gì như thế với COBOL (thực ra, tôi rất ghét nghĩ về việc phân tích cú pháp nói chung trong COBOL!)


1
"Hello World" có bao nhiêu dòng?. Phân tích cú pháp / tạo XML - hiện được tích hợp vào ngôn ngữ. Có lẽ bạn nên nâng cấp cơ sở kiến ​​thức của bạn. Câu trả lời này thuộc về kỷ nguyên của năm 1960 của COBOL.
NealB

Hấp dẫn. Tôi đã không phải làm việc với COBOL trong gần một thập kỷ, nhưng lần trước tôi đã thấy nó được viết giống như tôi nhớ nó, PHÂN TÍCH XÁC NHẬN, PHẦN LÀM VIỆC-BẢO QUẢN và tất cả. Tôi đoán tất cả những "nhận xét bắt buộc" (AUTHOR, DATE-VIẾT, NGUỒN-MÁY TÍNH, ĐỐI TƯỢNG-MÁY TÍNH) bây giờ là tùy chọn. Phân tích cú pháp XML trông không ấn tượng lắm - bạn phải cấu trúc phân chia dữ liệu để phản ánh cấu trúc tệp, không có xử lý theo kiểu SAX hoặc DOM. Thật tốt khi biết nó ở đó.
TMN
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.