What are you using FB for and what features do you use most?
Re: What are you using FB for and what features do you use most?
And you can take advantage of the fall-through behavior to do interesting things with few lines of code that you can't do with any other language's implementation of case. One man's bug is another man's feature. As warts go, it's extremely minor. I'm sure it's source of some bugs, but a linter might alert you. I'm sure a modern language wouldn't do that but C has aged extremely well over the last 40 or 50 years.
I much prefer curly braces to the more awkward begin/end syntax in Pascal[1]. FB's syntax is marginally better than Pascal's as the "begin" is implicit. However the problem with FB's syntax is it's much more complicated for an editor to trivially match beginning and end of blocks. Pascal makes it easier, but C makes it super fast to match beginning and end, which makes reading other people's code much easier, especially if it goes off the screen.
[1] Programmers are born with a finite number of keystrokes, so less typing prolongs the life of the programmer!
I much prefer curly braces to the more awkward begin/end syntax in Pascal[1]. FB's syntax is marginally better than Pascal's as the "begin" is implicit. However the problem with FB's syntax is it's much more complicated for an editor to trivially match beginning and end of blocks. Pascal makes it easier, but C makes it super fast to match beginning and end, which makes reading other people's code much easier, especially if it goes off the screen.
[1] Programmers are born with a finite number of keystrokes, so less typing prolongs the life of the programmer!
Re: What are you using FB for and what features do you use most?
As I wrote in my last post at the bottom of the previous page, C is quite ok, but fall through is a horrible design error. If you are able to find some major C sources somewhere, check how often the fall through "feature" has been used, and compare that to the number of stupid break statements that the poor programmers had to use. There is absolutely no excuse of fall through.
Plus, even in Assembly you can use Case 16, 18, 20 which is, technically speaking, fall through, but with a much clearer syntax.
Plus, even in Assembly you can use Case 16, 18, 20 which is, technically speaking, fall through, but with a much clearer syntax.
Re: What are you using FB for and what features do you use most?
Well sure you can do that in C also by combining the case statements which is just as readable as case 16,18,20. But that's not really what "fall through" describes, and is not what the gotcha is all about.jj2007 wrote:Plus, even in Assembly you can use Case 16, 18, 20 which is, technically speaking, fall through, but with a much clearer syntax.
Code: Select all
switch(foo) {
case 16:
case 18:
case 20:
/* This code is executed for only 16,18, and 20 */
/* without the break we'll fall through */
case 22:
case 24:
case 26:
/* This code is executed for 16,18,20, 22, 24, and 26. */
/* without break we'll fall through again. */
case 28:
/* and finally this is executed for 16,18, 20, 22, 24, 28 and 28. */
}
Re: What are you using FB for and what features do you use most?
No, Case 16, 18, 20 is not technically fall-through. It is a set comprising one condition (similar to an if-statement using or), technically jumping from one test to the next within a single branch.jj2007 wrote:Note that Case 16, 18, 20 is, technically speaking, fall through, but with a much clearer syntax.Code: Select all
mov eax, 17 ; try any combination you like,.. mov edx, 77 mov ecx, 99 mov ebx, 17 Switch eax Case 1 print "eax is one", 13, 10 Case edx .. ecx print "eax is between edx and ecx", 13, 10 Case 10 .. 15 print "eax is between 10 and 15", 13, 10 Case ebx print "eax is the same as ebx", 13, 10 Case 16, 18, 20 print "eax is sixteen or eighteen or twenty", 13, 10 Default print str$(eax), " is nowhere in the ranges above", 13, 10 Endsw
Furthermore, the example of using multiple registers is a concept of higher level languages; it never works that way in assembler. When a higher level language like C is translated to assembler, a variable's value or address is typically loaded into a register after which the register is being tested by means of a jump table.
The problem with translating a switch statement to assembler is that the compiler generates labels (jump addresses) that are never used. For example the following FB code:
Code: Select all
dim a as integer = 10
select case a
case 0
print "0"
case 1 to 3
print "1 to 3"
case 4, 5, 6
print "4, 5, 6"
case else
print "7 to 10"
end select
Code: Select all
// ...
.L12:
mov esi, 7
lea rax, .LC3[rip]
mov rdi, rax
call fb_StrAllocTempDescZEx@PLT
mov QWORD PTR -24[rbp], rax
mov rax, QWORD PTR -24[rbp]
mov edx, 1
mov rsi, rax
mov edi, 0
call fb_PrintString@PLT
.L13:
.L5:
.L14:
mov edi, 0
// ...
From an assembler point of view a compiler generated switch statement is a very ugly construct. From a compiler point of view a switch statement is a beast to translate to assembler.
Re: What are you using FB for and what features do you use most?
It should be noted that fall-through is used much less often because there are not so many cases that require or could use fall-through. Languages that do it the other way around (explicit fall-through) provide the same capability with just as much code and much less bug prone.caseih wrote:And you can take advantage of the fall-through behavior to do interesting things with few lines of code that you can't do with any other language's implementation of case.
I very much disagree with the readability of curly braces. Moreover, on most keyboards it requires an extra keystroke (shift) making a two-character keyword easier when doing a lot of coding. That's why I decided for do..end blocks in SharpBASIC as a replacement for C's curly braces, which can then be used for other purposes, such as collections, dictionaries or sets. Also speaking against the readability of curly braces as code block delimiters is that with loop statements the placement of a condition such as while or until becomes a problem. So C decided to put that statement outside of the respective code block. I consider that bad language design.I much prefer curly braces to the more awkward begin/end syntax in Pascal[1]. FB's syntax is marginally better than Pascal's as the "begin" is implicit. However the problem with FB's syntax is it's much more complicated for an editor to trivially match beginning and end of blocks. Pascal makes it easier, but C makes it super fast to match beginning and end, which makes reading other people's code much easier
Yes, Pascal's begin..end is not the best solution, especially because it is sometimes mandatory but not always. It also adds to verbosity. On the other hand, Pascal and ALGOL were developed before C and Pascal continued the tradition of ALGOL, partially as an educational language.
Re: What are you using FB for and what features do you use most?
That very much depends on the assembly language used. MASM is not the only one out there. ;-).jj2007 wrote:Plus, even in Assembly you can use Case 16, 18, 20
Re: What are you using FB for and what features do you use most?
See Switch in C and MASMMunair wrote:No, Case 16, 18, 20 is not technically fall-through. It is a set comprising one condition (similar to an if-statement using or), technically jumping from one test to the next within a single branch.
Re: What are you using FB for and what features do you use most?
Is it? Many GNU applications migrated to C++, a move that happened in the business world long ago. C remains a preferred system language, simply because that field doesn't have much room for anything else. (Rust tries with a security angle, but I have my doubts)caseih wrote:And you can take advantage of the fall-through behavior to do interesting things with few lines of code that you can't do with any other language's implementation of case. One man's bug is another man's feature. As warts go, it's extremely minor. I'm sure it's source of some bugs, but a linter might alert you. I'm sure a modern language wouldn't do that
but C has aged extremely well over the last 40 or 50 years.
Anyway the feature richness of the fall through could be debated if it was the other way around (fall through with keyword, default without). How it is currently is simply hopeless design. (and or maybe saving memory in the initial compilers for cases that have multiple switch selector values? )
Curly braces are a fail on so many levels in the current situation. They are characters that need combined keys to make (which any type instructor can say should be avoided), it is quite easily to gloss over them, and training over time (I've been doing embedded C for a significant part of my time for 15 years no) only fixes that when well indented. Misplaced braces are too easily missed.I much prefer curly braces to the more awkward begin/end syntax in Pascal[1].
True. But not all characters have the same typing weight. Combo keystrokes and keys at the edge of the keyboard weigh heavier than alpha characters in the middle. Keyboards are designed that way.[1] Programmers are born with a finite number of keystrokes, so less typing prolongs the life of the programmer!
Re: What are you using FB for and what features do you use most?
Well no matter how you cut it any language could remain in the top 5 most common languages for 50 years is impressive. It speaks to the at least some design staying power, despite now security weaknesses and deficiencies that are mattering more and more. Of course Pascal is also impressive for having a good basic design for even more years, and is still used today, although not nearly on the same scale as C. Obviously BASIC has a heritage that stretches decades also, but over the last few decades has remained extremely niche, and BASIC dialects are all wildly different and incompatible with each other. There is such thing as ANSI standard BASIC, but we should all be glad FB is not an implementation of that.
Most of you seem to misunderstand my point about curly braces. I was not talking about anyone's personal opinion on the readability of various methods of defining blocks. I was speaking from the point of view of the text editor, and a programmer using the text editor to navigate the code. Braces make matching extremely trivial. In fact even the oldest text editors had brace matching functionality to easily pop between braces. It requires very little understanding of the language's syntax to do; it can mostly work with all curly-braced languages, even ones the text editor, or even the programmer, has never seen before. All the text editor has to do is match a single character (which is very fast), and track the depth. Text editors have done this for decades, long before fancy syntax highlighting became common. It also makes it trivial to reformat the code to any particular style, and C reformatting tools have been around for almost as long as C. Of course we can do all this block matching with pascal code also, but now we have to search for a string instead of a single character match.
As for BASIC, well, that's impossible for a text editor to do without a thorough implementation of the language's grammar, and the grammar of a language like FB is very complicated, full of ambiguities, lookaheads, and probably backtracking. It also means that an editor that knows about one dialect of BASIC will fall down on another dialect when it comes to block detection, and code reformatting. And obviously an editor has the same issue with a language like Python, but Python's grammar is a lot simpler than any BASIC dialect. And any language that merges a statement with the block syntax would have this issue with text editors.
Most of you seem to misunderstand my point about curly braces. I was not talking about anyone's personal opinion on the readability of various methods of defining blocks. I was speaking from the point of view of the text editor, and a programmer using the text editor to navigate the code. Braces make matching extremely trivial. In fact even the oldest text editors had brace matching functionality to easily pop between braces. It requires very little understanding of the language's syntax to do; it can mostly work with all curly-braced languages, even ones the text editor, or even the programmer, has never seen before. All the text editor has to do is match a single character (which is very fast), and track the depth. Text editors have done this for decades, long before fancy syntax highlighting became common. It also makes it trivial to reformat the code to any particular style, and C reformatting tools have been around for almost as long as C. Of course we can do all this block matching with pascal code also, but now we have to search for a string instead of a single character match.
As for BASIC, well, that's impossible for a text editor to do without a thorough implementation of the language's grammar, and the grammar of a language like FB is very complicated, full of ambiguities, lookaheads, and probably backtracking. It also means that an editor that knows about one dialect of BASIC will fall down on another dialect when it comes to block detection, and code reformatting. And obviously an editor has the same issue with a language like Python, but Python's grammar is a lot simpler than any BASIC dialect. And any language that merges a statement with the block syntax would have this issue with text editors.
Obviously there is more about this that is subjective than any kind of technical argument. I can think of some things that are generally considered to be bad language design, such as PHP having no less than three different equality operators, or it's feature of automatically converting strings to numbers in expressions. But this is the first time I've heard the claim that one of the most consistent features of C's grammar is a design flaw! The fact that a <statement> production in the C grammar can be either a single statement or a block of statements was really neat thinking on K&R's part. It simplified the grammar a lot and reduces ambiguities. That's what I consider good design. K&R's decisions were also based on the realities of computers at the time. Grammars like FB has today would have made the compiler impossibly slow and memory-intensive back then. They struck an amazing balance between the needs of the programmer and the limited power of the compiler that still serve us well today. Obviously today we have more freedom to design things differently when starting over. So whatever works for Sharp BASIC, good on you.Munair wrote:So C decided to put that [while] statement outside of the respective code block. I consider that bad language design.
Re: What are you using FB for and what features do you use most?
Shrug. Mathematical expressions are heavily used in programming and they similarly require combination keys. And BASIC used type suffix symbols for years.marcov wrote:Curly braces are a fail on so many levels in the current situation. They are characters that need combined keys to make (which any type instructor can say should be avoided), it is quite easily to gloss over them, and training over time (I've been doing embedded C for a significant part of my time for 15 years no) only fixes that when well indented. Misplaced braces are too easily missed.
If you get off on your indentations, one could similarly lose track of begins and ends as much as curly braces.
Which brings me to a question I've always had (and acknowledge I'm well and truly in the weeds here), but just where should I put begin and end in Pascal? For example, should it be following the IF/THEN on the same line, on its own line but at the parent indent level, on its own line but indented slightly, or on its own line indented fully with the body indented further? No matter where I put it, it looks awkward to me, especially if then/else. Braces have similar problems, but at least it doesn't look half bad to the programmer to put them on their own lines, or K&R style on the same line. But I despise GNU style of half indenting them on their on line!
Re: What are you using FB for and what features do you use most?
More than design, it simply was entrenched in some (unix) business. Or by that same metric Cobol and Fortran must be the best designed languages ever.caseih wrote:Well no matter how you cut it any language could remain in the top 5 most common languages for 50 years is impressive. It speaks to the at least some design staying power, despite now security weaknesses and deficiencies that are mattering more and more.
My side of this discussion is not about C vs other languages. It is against looking at known design issues with C _nowadays_ with rose-tinted glasses and brand it features just because of some "100000 lemmings can't be wrong" argument.Of course Pascal is also impressive for having a good basic design for even more years, and is still used today, although not nearly on the same scale as C. Obviously BASIC has a heritage that stretches decades also, but over the last few decades has remained extremely niche, and BASIC dialects are all wildly different and incompatible with each other. There is such thing as ANSI standard BASIC, but we should all be glad FB is not an implementation of that.
I want to stress "nowadays" again, because if you look into reasons, you often find small but necessary reasons in the very early days with the limited memories of the day. But it is probably not an full screen editor, simply because there were few.
#define begin {Braces make matching extremely trivial.
#define end }
Perfectly valid C, now run your editor again.
Re: What are you using FB for and what features do you use most?
Code: Select all
switch (svar)
{
case 12:
printf("That was case 12\n");
break;
case 24:
printf("That was case 24\n");
break;
case 16:
printf("That was case 16\n");
break;
default:
printf("That was default\n");
break;
}
Code: Select all
switch svar
case 12
printf("That was case 12\n")
case 24
printf("That was case 24\n")
case 16
printf("That was case 16\n")
default
printf("That was default\n")
endsw
Re: What are you using FB for and what features do you use most?
Some (unix) business? Too funny. While Cobol and Fortran are still in use all these decades later, that is not what I said nor what I meant. I was talking about a language that is not only still used, but *widely* used. As in one of the top five most widely-used language A big difference there! Furthermore dozens of languages have come and gone in the meantime. Reminds me of the famous quote by Stroustrup (about c++ but it applies to C), "There are only two kinds of languages: the ones people complain about and the ones nobody uses."marcov wrote:More than design, it simply was entrenched in some (unix) business. Or by that same metric Cobol and Fortran must be the best designed languages ever.
Oh sure you can deliberately break any editor with macros, including syntax highlighting, but it hardly speaks to the downsides of C's syntax.#define begin {
#define end }
Perfectly valid C, now run your editor again.
Last edited by caseih on Jan 16, 2022 18:44, edited 5 times in total.
Re: What are you using FB for and what features do you use most?
I know people tire of my c/python/whatever posts and Marcov's pascal posts. But your MASMBASIC macro posts are particularly tiring. That is *not* assembly language, jj, sorry. That is what using MASM macros can look like, but it's not assembly code. I cannot run that in nasm, for example. If you wanted to show what assembly really looks like when implementing these structures, show the raw assembly output from the macro assembler. Macros are powerful concepts, no doubt, letting you create a higher level of abstraction. But you're just muddying the waters here, really. Although I admit I muddied the waters also in general on this thread.jj2007 wrote:See the difference? The lower one is Assembly: no ":", no ";", no "{", no break. In short, no unnecessary crap.
Last edited by caseih on Jan 16, 2022 18:40, edited 1 time in total.
Re: What are you using FB for and what features do you use most?
I dare to question that it's Assembly. It is higher level language construct inserted into "assembly"; afterwards it will still be translated by the compiler to real assembly code over which the programmer has no control. MS at its best.jj2007 wrote:See the difference? The lower one is Assembly: no ":", no ";", no "{", no break. In short, no unnecessary crap.
EDIT: I very much agree with caseih on this one.