Przejdź do zawartości

Wikipedia:Propozycje do Artykułów na Medal/C (język programowania)

Z Wikipedii, wolnej encyklopedii

C (język programowania)[edytuj | edytuj kod]

Uzasadnienie

Artykuł został gruntownie przebudowany. Aktualna wersja została oparta przede wszystkim na aktualnym standardzie ISO, definiującym język C, oraz na książce B. Kernighana i D. Ritchiego Język ANSI C. Pisząc artykuł starałem się uniknąć stylu dydaktycznego i tworzenia tutoriala, ale skupiłem się na takich kwestiach jak historia rozwoju C oraz jego popularność czy krytyka. Liczba listingów kodu jest niewielka – tyle ile w mojej opinii ma sens. Znaczna większość wykorzystanych źródeł to publikacje naukowe lub książkowe uznanych autorów. Artykuł (przynajmniej w mojej opinii) wyczerpuje temat w zakresie, który da się uźródłowić z poszanowaniem WP:WER (podejrzewam, że pewne informacje – szczególnie dotyczące zastosowań czy krytyki – dałoby się jeszcze wyciągnąć z forów typu StackOverflow). Msz2001 (dyskusja) 18:14, 23 lip 2022 (CEST)

Uwagi merytoryczne
  1. Na razie przeczytałem wstęp i dział "Krytyka". Moim zdaniem w artykule brakuje krytyki zarządzania pamięcią przez malloc/free, z czego czasem powstają wiszące wskaźniki. Gover7 (dyskusja)
    Utworzyłem sekcję o zarządzaniu pamięcią, w której wspomniałem o malloc i free. Jest tam również informacja o podatnościach. W mojej opinii szersza dyskusja problemów związanych z alokacją pamięci powinna się znaleźć w jakimś innym artykule, np. Alokacja pamięci, ponieważ są to podatności niezwiązane stricte z językiem C, a ich uzasadnienie wykracza poza opis języka. Dopisałem jednak wprost, że powszechne wykorzystanie wskaźników jest czynnikiem obniżającym bezpieczeństwo oprogramowania. Msz2001 (dyskusja) 14:46, 24 lip 2022 (CEST)
    @Msz2001 Proponowałabym dodać odniesienie bardziej konkretnie do Przepełnienie bufora (a nie ogólnie do bezpieczeństwa). W przykładach jest zresztą C z tego co widzę :-). Brakuje u nas źródeł o przepełnieniu, ale jakby co Marek Wrona o tym pisał (ISBN: 83-7243-076-4). Jak coś to daj znać, to podeślę stronę. Nux (dyskusja) 00:01, 17 sie 2022 (CEST)
    @Nux Dzięki za wskazanie źródła. Niestety nie dysponuję tą książką ani nie za bardzo jestem w stanie ją sobie teraz zorganizować, więc gdybyś mógł tę stronę podesłać, to chętnie skorzystam i mogę napisać coś więcej w artykule. Msz2001 (dyskusja) 10:35, 17 sie 2022 (CEST)
  2. Brakuje też krótkiej wzmianki o tym, że z C wywodzi się C++ i o tym, czym się różni C++ od C. Gover7 (dyskusja) 13:26, 24 lip 2022 (CEST)
    Wstawiłem wzmiankę o C++ do sekcji o historii. Myślałem, czy nie zrobić osobnej sekcji z językami wywodzącymi się z albo inspirowanymi C, ale nie mogłem znaleźć dobrego źródła, które podałoby zestawienie takich języków, a sam takiej listy nie chcę tworzyć, gdyż wybór języków będzie twórczością własną. Msz2001 (dyskusja) 21:52, 24 lip 2022 (CEST)
    Wstawiłem do sekcji o popularności zdanie z wybraną listą języków ze składnią podobną do C, którą posortowałem alfabetycznie. Przy każdym z języków jest przypis. Na pełną listę bym nie liczył. Powołałem się głównie na podręczniki do konkretnych języków programowania. W przypisach zawarłem cytat wskazujący na język C. Paweł Ziemian (dyskusja) 15:05, 13 sie 2022 (CEST)
  3. Typy_pochodne "Nazwa tablicy stanowi jednocześnie adres jej zerowego elementu[73]." -- mam wątpliwości czy można to tak zapisać. To by sugerowało, że jakoś w pamięci jest zapisana ta nazwa... Ja bym powiedział, że nazwa wskazuje na adres. Albo, że w zmiennej jest adres. –Nux (dyskusja) 22:12, 20 sie 2022 (CEST)
    Chodziło mi o wyrażenie czegoś w rodzaju, że deklarując tablicę np. 10 intów, w pamięci znajdzie się tylko 10 intów, bez żadnego ukrytego wskaźnika na pierwszy z nich. Formalnie standard to opisuje mniej więcej tak: "jeżeli w wyrażeniu użyta jest wartość typu T[], to jest konwertowana na wskaźnik T* na pierwszą wartość tablicy". Pomyślę jeszcze i skoryguję to zdanie. Msz2001 (dyskusja) 22:44, 20 sie 2022 (CEST)
    Hm... Jakbym miał się czepiać ;)... To ściśle rzecz biorąc, to w pamięci nie znajdzie się nawet 10 intów. Zostaną natomiast zrobione 2 rzeczy:
    1. Zarezerwowane zostanie miejsce w pamięci. Miejsce odpowiednie duże by zmieści 10 intów. W to miejsce możesz potem wstawić 20 shortów, albo zupełnie inną strukturę danych.
    2. Do zmiennej zostanie przypisany adres w pamięci. Adres na którym możesz w miarę dowolnie operować. Zdaje się, że kiedyś ten adres, to był zwykły uint (może ulong). Nux (dyskusja) 23:08, 20 sie 2022 (CEST)
    Zmieniłem na prawie dosłowny cytat ze standardu: Specjalna:Diff/67875026. Msz2001 (dyskusja) 10:35, 21 sie 2022 (CEST)
    Ok Nux (dyskusja) 19:37, 22 sie 2022 (CEST)
  4. Typy_pochodne "Porównywanie oraz odejmowanie dwóch wskaźników jest dozwolone wyłącznie wtedy, kiedy dotyczą one tej samej tablicy." -- w jakim sensie niedozwolone? Chyba niezalecane bardziej? To znaczy z odejmowania po prostu dziwny adres wyjdzie. I pewnie system zaprotestuje przy próbie odczycie z tej pamięci... Tym nie mniej kompilator raczej to dopuści. Chyba że o coś innego chodziło.
    U mnie działa ¯\_(ツ)_/¯
    #include <stdio.h>
     
     int main() {
         int tab1[5];
         int tab2[5];
         printf("\n tab1 %u", tab1);
         printf("\n tab2 %u", tab2);
         printf("\n tab1 %u", tab2-tab1);
         return 0;
     }
    Nawiasem mówiąc chyba w DOS i starych Windowsach ten adres to był globalny adres pamięci (obszar wszystkich programów). Co mogło powodować zabawne efekty po wyjściu poza oficjalnie przydzielony obszar pamięci ;-). To znaczy efekty wykraczające dosłownie poza daną aplikację. –Nux (dyskusja) 22:12, 20 sie 2022 (CEST)
    Nie pamiętam już jak to było ujęte w K&R, ale obecny standard C używa tam shall a nie must, więc poprawię jutro. Msz2001 (dyskusja) 22:44, 20 sie 2022 (CEST)
    Poprawione. Msz2001 (dyskusja) 10:35, 21 sie 2022 (CEST)
    Ok Nux (dyskusja) 19:37, 22 sie 2022 (CEST)
  5. Typy_pochodne "Do wartości wskaźnika można również dodać lub odjąć dowolną liczbę całkowitą." -- może warto tutaj dodać informacje o efekcie. To poniekąd wynika z tego jest w notce do indeksowania, ale może nie być oczywiste, że wynik takie operacji jest zależny od typu. To znaczy tablica+1 to jest przejście do następnej komórki, czyli zwiększa adres w zależności od wielkości danej komórki. Wydaje mi się, że wskaźniki są na tyle unikatowe i nieintuicyjne dla kogoś kto używa języków wyższego typu (czy w ogóle innych języków), że warto o tym napisać. –Nux (dyskusja) 22:12, 20 sie 2022 (CEST)
    Wstawiłem, częściowo w treści, uszczegóławiając uwagą. Msz2001 (dyskusja) 10:35, 21 sie 2022 (CEST)
    Idealnie 👌 Nux (dyskusja) 19:38, 22 sie 2022 (CEST)
  6. Krytyka W sumie to w krytyce warto dla równowagi wspomnieć o powiązanym mechanizmie: Ochrona pamięci. To znaczy mimo tego, że w ramach programu C nie ma kontroli nad pamięcią, to sam system pamięci może ją kontrolować... Nie wiem czy bardziej do pierwszego akapitu, czy do drugiego to pasuje... Chyba do drugiego. –Nux (dyskusja) 22:12, 20 sie 2022 (CEST)
    Dopisałem zdanie o tym, że niewłaściwe odwołania do pamięci mogą generować naruszenie ochrony pamięci. Dla kompletności wstawiłem je do sekcji o zarządzaniu pamięcią. Msz2001 (dyskusja) 11:21, 21 sie 2022 (CEST)
    Ok Nux (dyskusja) 19:38, 22 sie 2022 (CEST)
  7. Krytyka Zastanawiam się jeszcze czy nie warto by było dodać informacji o domyślnej wartości. Co prawda dopisałem to już w klasach pamięci, ale myślę, że warto jeszcze wspomnieć o tym krytyce. To znaczy np. w JS wartością domyślną jest specjalny typ `undefined`, a w C zachowanie jest niezdefiniowane i w `int a` może być dowolna liczba. W związku z tym program może inaczej działać nawet w różnych trybach kompilacji (w tym samym kompilatorze). Nie wiem jak w najnowszym, ale w starym VisualStudio było dziwnie -- w trybie debug wpisywane były 0 (i zdaje się, że też nie zawsze), a w release były losowe znaki (to co akurat było w pamięci). Być może do ostatniego akapitu o niezdefiniowanych zachowaniach warto to dorzucić? –Nux (dyskusja) 22:12, 20 sie 2022 (CEST)
    Dodałem akapit o niezainicjowanej zmiennej. Paweł Ziemian (dyskusja) 09:58, 21 sie 2022 (CEST)
    Idealnie 👌 Nux (dyskusja) 19:39, 22 sie 2022 (CEST)
Uwagi do stylu (język, struktura)
  1. Trochę przeredagowałem wstęp. Mam nadzieję, że uznasz te zmiany za korzystne. Gover7 (dyskusja) 21:22, 23 lip 2022 (CEST)
Uwagi do uźródłowienia
  1. Nie dajemy przypisów we wstępie. Sidevar (dyskusja) 13:07, 27 lip 2022 (CEST)
    Usunąć przypisy to żadna trudność, ale... czy w ten sposób jakość artykułu się poprawi? Msz2001 (dyskusja) 13:46, 27 lip 2022 (CEST)
    Chodzi o to, aby wstęp był uźródłowiony w treści artykułu, wtedy tych przypisów w leadzie nie ma potrzeby dawać. AramilFeraxa (Napisz do mnie!) 13:47, 27 lip 2022 (CEST)
    W takim razie usunąłem przypisy do tych informacji, które i tak się pojawiają dalej. Msz2001 (dyskusja) 13:51, 27 lip 2022 (CEST)
    Hm... @Sidevar jakieś źródło tak jednoznacznego stwierdzenia? Zajrzałem na wersję angielską -- przypisu są na początku. Zajrzałem na promowany medalowy Majas na balkonie -- przypisy są w pierwszym zdaniu. Przypisy można i powinno się używać wielokrotnie. Jeśli rażą Cię przypisy w źródle, to można zawsze przenieść definicję niżej i dodać odwołanie na górze.
    Moim zdaniem chociażby do "Język C powstawał jako rozwinięcie języka B" powinno być źródło. Podobnie do "C jest jednym z popularniejszych języków programowania". Nux (dyskusja) 23:44, 16 sie 2022 (CEST)
    Jestem trochę zaskoczony takim komentarzem. Wersja angielska jest osobnym projektem o innych zasadach. Nasze zasady pochodzą z WP:IDEAŁ, zdanie "Ponieważ zawarte tu informacje..." Sidevar (dyskusja) 00:07, 17 sie 2022 (CEST)
    Linkowałem polski artykuł. Brak przypisów na górze nie jest regułą (a WP:IDEAŁ o ile wiem jest luźnym zbiorem zaleceń). Co więcej moim zdaniem zgodnie z WP:WER właśnie należy to robić "Źródła należy podać w postaci przypisów lub notatki bibliograficznej. Źródła należy podać w szczególności w przypadku cytatów, informacji kontrowersyjnych i informacji o wyjątkowości.".
    Czytelnik nie powinien musieć biegać po artykule, żeby szukać gdzie jest źródło tych stwierdzeń. Artykuł jest dobry ale długi. Na pewno mało kto przeczyta go na raz ;-). Poza tym artykuły ewoluują i niektóre fragmenty mogą znikać. Nux (dyskusja) 16:59, 20 sie 2022 (CEST)
    ...Tym nie mniej przyjmuję, że może to tylko moje zdanie 🙃... Na pewno te rzeczy ze wstępu są wyjaśnione w dalszej części artykułu, więc jest w porządku. Nux (dyskusja) 11:51, 21 sie 2022 (CEST)
Uwagi dot. neutralności
Uwagi dot. problemów technicznych
Sprawdzone przez
  1. Paweł Ziemian (dyskusja) 21:26, 30 lip 2022 (CEST)
  2. --katafrakt () 12:11, 13 sie 2022 (CEST)
  3. Kobrabones (dyskusja) 12:30, 20 sie 2022 (CEST) Ubolewam, że mamy tak mało solidnych artykułów o tej tematyce :(
  4. Nux (dyskusja) 22:12, 20 sie 2022 (CEST)