Komentarze blokowe - prosta rzecz, ale jakoś nie chce się udać

0

Wiadomo, że komentarze oprócz opisywania kodu źródłowego może służyć do włączania lub wyłączania fragmentów kodu z działania, z tego się wzięły słowa "zakomentować" i "odkomentować".

We wszystkich językach wywodzących się z C (C, C++, Java, PHP, JavaScript) jest komentarz blokowy zaczynający się od /* i kończący się na */, za pomocą którego można łatwo wyłączyć dłuższy fragment kodu.

Zadziwia mnie fakt, że autorzy większości kompilatorów i IDE nie potrafią sobie poradzić z bardzo prostym problemem, jakim jest komentarz zagnieżdżony. Chodzi o to, że jest jakiś kod z komentarzem blokowym i chce się go wyłączyć w całości. Najprostsza czynność to dopisanie /* na początku i / na końcu. Niestety, kompilator jest tak zrobiony, że po znaku / ignoruje tekst i napotkane dalsze znaki /*, a przy pierwszym */ kończy ignorancję i komentarz od pierwszego */ do drugiego */ niestety jest ignorowany. Pół biedy, jeżeli IDE ma funkcję dodawania i usuwania // we wszystkich zaznaczonych liniach naraz, jeżeli tego nie ma, to wyłączenie na próbę czy na krótko większego kawałka kodu składającego się z co najmniej 20 linii jest problematyczne.

Np. ten problem dotyczy Visual Studio i Qt Creatora. Natomiast darmowy kompilator SDCC ma ten problem rozwiązany i radzi sobie z tym bez najmniejszego problemu. Dziwi fakt, że w środowiskach które mają ponad 10 lat i zarabiają duże pieniądze, problem nadal występuje, natomiast proste kompilatory rozprowadzane za darmo mogą mieć ten problem rozwiązany. Usunąć komentarze to algorytmicznie żaden problem (proste operacje na tekście), potem kod ogołocony z komentarzy trafiałby do właściwej kompilacji.

Ciekawe, co jest przyczyną pozostawiania problemu komentarzy blokowych.

a    - Kod źródlowy
/*
b    - Komentarz
/*
c    - Komentarz
*/
d    - To jest komentarz, ale dla kompilatora z opisanym błędem jest to niesłusznie kod źródłowy
*/
e    - Kod źródlowy
1

Dla mnie i pewnie dla większości świata nie jest to problemem, stąd brak prób rozwiązania takich "problemów".

Jak sam zauważyłeś - to nie będzie trudny temat, ale:

  • zmiana zachowania może zepsuć już istniejący kod, np tu na "a;" zakończy się plik jeżeli kompilator nie znajdzie drugiego zamknięcia komentarza blokowego (choć tu mógłby być jeszcze specjalny przypadek
a;
/*
/*
komentarz
*/
a++;
  • po co sobie komplikować coś, co zachowuje się w zasadzie tak samo od lat w każdym języku?
  • i nikomu szczególnie nie przeszkadza
0

w większości IDE masz przycisk do komentowania długich fragmentów który dodaje na początku każdej linii //, komentarze można w ten sposób w dowolny sposób "zagnieżdżać" i komentarz drugiego stopnia przykładowo wygląda tak: ////
dla mnie logiczniejsze jest że */ kończy blok komentarza, w przeciwnym przypadku trzeba by było analizować składnię w każdym komentarzu bo przykładowo można napisać

var a = "/*";

i to nie powinno zacząć komentarza

1

Kompilator FPC ma taką funkcję i uwierz mi, na dłuższą metę to irytuje.
Poza tym to nie ma nic do kompilatorów czy środowisk - każdy aspekt języka (w tym komentarze) zgrabnie opisuje dana dokumebtscja i jeżeli mówi ona jasno, że */ kończy blok komentarza, to ten token właśnie kończy blok komentarza.

0

w C i C++ możesz sobie zakomentować blok kodu za pomocą

#if 0
tutaj kod zawierający /* ...*/
#endif

zagnieżdżone komentarze w FPC były powodem, dla którego nie mogłem ukończyć syntax highlightera dla Free Pascala pod Visual Studio. VS pozwala na przeniesienie max 32 bitów stanu pomiędzy jedną linią kodu a drugą, i w tych 32 bitach trzeba zmieścić takie rzeczy jak "jesteś wewnątrz stringa", "jesteś wewnątrz klasy", "jesteś wewnątrz komentarza o poziomie.." ..i już na ten poziom bitów zabrakło, bo na dodatek trzeba byłoby pamiętać, jakiego rodzaju każdy poziom komentarza był.

0

W Scali można zagnieżdżać komentarze /* */ i IDE nie ma z tym problemu. Podejrzewam, że jest więcej języków, w których można zagnieżdżać.

1

@andrzejlisek pytanie brzmi co mówi specyfikacja danego języka o takim komentarzu. Bo IDE i kompilatory implementują to co muszą. Jeśli standard języka nie definiuje tej sytuacji, to wcale nie muszą tego implementować jeśli nie chcą.

3
  1. od tego powinienes miec wersje kontrolii a nie zakomentowywac kod ktory nie dziala. Kod zakomentowany w wieskzosci wypadkow powinien zostawac usuwany
  2. kazde IDE jezeli jest potrzeba czegos zakomentowac uzywa jednolinijkowego komentarza. Wiec jezeli jest zagniezdzony to zrobi podwojny (jak odkomentujesz jedna czesc to ta zagniezdzona nadal bedzie zakomentowana)
3
andrzejlisek napisał(a):

We wszystkich językach wywodzących się z C (C, C++, Java, PHP, JavaScript) jest komentarz blokowy zaczynający się od /* i kończący się na */, za pomocą którego można łatwo wyłączyć dłuższy fragment kodu.

W czasach kiedy powstało C praktycznie nie funkcjonowało kolorowanie kodu w edytorach i łatwiej było czytać cudzy kod kiedy komentarze były jednopoziomowe. Dziś też są miejsca, gdzie dostępny kod nie jest kolorowany i odczytanie go mogłoby powodować błędy, szczególnie jeżeli wielopoziomowo zakomentowane są duże bloki kodu.
W edytorach bez kolorowania składni, przy udostępnieniu wielopoziomowych komentarzy, widząc komentarz /* / nie można być pewnym , czy 200, 300, 1000 linijek wcześniej ktoś nie wstawił początku bardziej ogólnego komentarza (/...).

1 użytkowników online, w tym zalogowanych: 0, gości: 1