Czy język programowania z założenia może wymusić „czysty kod”? [Zamknięte]

19

Więc koduję swoje pierwsze projekty w C ++ i wydaje się, że potrzeba więcej wysiłku, aby uczynić kod „czystym”, niż po prostu działać. Wydaje się, że C ++ „pozwala” na pisanie brzydkiego, ale działającego kodu.

Co skłoniło mnie do myślenia

Czy język programowania może wymuszać czysty kod z założenia? Czy są już takie języki?

Jak to jest uwzględnione jako zasady projektowania w rozwoju / teorii języka programowania? Jakie środki są stosowane?

mavavilj
źródło
14
Wiele języków próbowało. Moim zdaniem żadnemu się nie udało.
Gort the Robot
5
Niestety jest to całkowicie oparte na opiniach, ponieważ nie ma obiektywnej definicji „czystego kodu”. Nie krępuj się porozmawiać o tym na naszym czacie , jestem pewien, że wszyscy tam będą mieli jakieś opinie.
Ixrec 04.04.16
9
Nie, możesz pisać FORTRAN w dowolnym języku.
whatsisname
4
Pytasz, czy można udokumentować idiotyzm języka. Jak mówią, idioci są genialni .
Gort the Robot
2
Jakie cechy ma „czysty kod” na potrzeby tego pytania? Musisz to zdefiniować, w przeciwnym razie każda odpowiedź z dowolnym uzasadnieniem może być ważna.
Theodoros Chatzigiannakis

Odpowiedzi:

20

Główny wpływ, jaki projekt języka wywiera na „czysty kod”, jest na poziomie syntaktycznym. Języki z dużą ilością skrótów i niejasnych operatorów (Perl / APL) nadają się do „brudnego” kodu, podczas gdy języki z mniejszym zestawem elementów (powiedzmy Python) nadają się do czystszego kodu.

Semantyka jest jednak zupełnie innym zwierzęciem. Nie ma sposobu, aby wymusić, aby semantyka języka była używana w czysty sposób, szczególnie dlatego, że jako kompilator nie możesz wiedzieć, co użytkownik tego języka próbuje osiągnąć. Potężne narzędzie to po prostu - potężne narzędzie na dobre i na złe.

Ostatecznie semantyka jest ważniejsza niż składnia. Jest to także część, którą najtrudniej jest odgadnąć jako programistę serwisowego (np. „Co tak naprawdę oznacza ten kod? Widzę, co robi…”).

W związku z tym powiedziałbym, że nie ma projektu wymuszającego czysty kod, ale można napisać prostą składnię z czystą semantyką, która to ułatwia. Na lepsze lub gorsze, czysty kod jest przede wszystkim kwestią wiedzy programistów, motywacji, dyscypliny i umiejętności.

Michael
źródło
2
Powiedziałbym, że system typów może przejść długą drogę w kierunku wymuszenia poprawnej semantyki. Na przykład języki silnie typowane zapewniają, że zmienne mają przypisane wartości odpowiednich typów. Język, który sprawia, że ​​typy są tanie i łatwe, zachęca do kodowania większej semantyki w typach. Mocno napisany język sprawia, że ​​programiści wyrażają wolę konwersji typu. Język, który przesłania semantykę za pomocą bojlera, utrudnia również rozumowanie semantyki. Co do tego, czym jest „czysta” semantyka, nie jest jasne. Ale wyobrażam sobie, że ma to znaczną zbieżność z prawidłową semantyką.
Przywróć Monikę
7

Języki mogą zmusić lub zachęcić programistów do zajęcia się pewnymi klasami błędów, co jest częścią definicji czystego kodu. Na przykład różne języki wykonują stosunkowo przyzwoitą pracę polegającą na adresowaniu:

  • Wyjątki wskaźnika zerowego.
  • Błędy stanu współdzielonego.
  • Problemy z współbieżnością.
  • Niezaznaczone wyjątki.

To jednak tylko część drogi, ponieważ czysty kod dotyczy przede wszystkim komunikacji międzyludzkiej . Języki programowania naprawdę mają tylko jedną dźwignię, która im w tym pomaga, i to jest ich moc ekspresji . To naprawdę trudny termin do zdefiniowania, ale w zasadzie dobrym programistom łatwiej jest pisać czystszy kod w bardziej wyrazistych językach. Dostępnych jest więcej narzędzi do łatwego wyrażania algorytmu w terminach, które dobrze komunikują się z innymi ludźmi. Nie zrozum mnie źle, możesz napisać czysty kod w ( prawie ) dowolnym języku programowania. To tylko niektóre języki ułatwiają i dają lepszy wynik względny.

Jednak nie możesz po prostu ustawić ekspresji, a magicznie ludzie zaczną pisać lepszy kod. W przypadku większości programistów dajesz im więcej pokręteł do zmiany w ich języku, a oni nie będą wiedzieli, jak ich używać poprawnie, więc ich kod kończy się naprawdę gorzej. Aby poprawić jakość kodu, potrzebujesz dyscypliny i dobrego mentoringu. Nie ma srebrnych kul.

Karl Bielefeldt
źródło
6

Do pewnego stopnia. Wiele języków jest specjalnie zaprojektowanych, aby zachęcać do niektórych form czystego kodu zgodnie z ideałami projektantów języków. Z pewnością możliwe jest pisanie brzydkiego i niezrozumiałego kodu w dowolnym języku, ale niektóre języki starają się go zniechęcić.

Na przykład Python zmusza cię do wcięcia bloków zgodnie ze strukturą semantyczną języka, podczas gdy wiele innych języków pozwala na wcięcie całkowicie losowo lub wcale. To przykład języka aktywnie promującego pewien ideał czystości.

JacquesB
źródło
3

Jeśli potrafisz to skwantyfikować, możesz stworzyć język, który może go zoptymalizować.

Chociaż nie znam żadnego konkretnego języka, który egzekwowałby zasady „czystego kodu”, gliniarze działający na kompilacji są dość powszechni.

Głównym powodem, dla którego jest to odrębny krok od upieczenia w języku, jest w dużej mierze funkcja priorytetów. W najlepszym interesie języka programowania jest zapewnienie programistom największej elastyczności w celu uzyskania jak najszerszego poziomu adopcji. Istnieje tak wiele różnych języków programowania i DSL, które sztucznie ograniczają bazę użytkowników poprzez wybredne podejście i opinie na temat dopuszczalnych danych wejściowych, które prawdopodobnie mogłyby utrudnić szersze zastosowanie.

Na przykład zmuszanie ludzi do pisania nie leży w najlepszym interesie C #

if (condition)
{

zamiast

if (condition) {

Ale warcaby stylu można uznać za wybredne, ponieważ do tego właśnie zostały zaprojektowane.

Tak więc, aby odpowiedzieć na pytanie

Czy język programowania może wymuszać czysty kod z założenia?

mój nacisk

Oczywiście, o ile podasz mocną definicję tego, co oznacza „czysty kod”.

Na przykład mogę zdefiniować „czysty kod”, co oznacza:

  • długość linii nie większa niż 80 znaków
  • funkcje składające się z nie więcej niż 100 linii
  • wcięcie musi mieć dwie spacje
  • otwarte nawiasy klamrowe muszą następować na końcu linii poprzedzonej dokładnie jedną spacją
  • nie więcej niż dwóch operatorów na linię

i możesz nie zgadzać się z niektórymi lub wszystkimi tymi konwencjami, ale pod koniec dnia są one policzalne i można je egzekwować programowo.

zzzzBov
źródło
1

Nie, nie w sensie, który opisujesz. Wykrywanie „brzydoty” nie może być wykonane automatycznie!

Jednak projektanci języków mogą robić rzeczy, aby zachęcić do dobrego kodu (nie chcę mówić „czysty”, ponieważ czasami dobry, bezpieczny kod jest również długi i „brzydki”). Na przykład projektanci języka Rust przyjrzeli się rzeczom, które zdyscyplinowali programiści C ++ (np. Nadając wartościom przypisanym do sterty pojedynczego „właściciela”), i ułatwili wykonanie niektórych z tych rzeczy. Obejmuje to udostępnienie narzędzia do sprawdzania typów, za pomocą którego można sprawdzić, czy nie popełniono pewnych typowych błędów.

Powiedziałbym, że dobry projekt językowy jest często reaktywny: projektanci patrzą na to, co robią dobrzy programiści, i starają się, aby było to łatwiejsze i „ładniejsze”.

Paul Stansifer
źródło