Os eventos da história são contados em ordem cronológica, se parece que algum evento é irrelevante, provavelmente não é, apenas um momento em que ficará claro por que mencionei que esse evento será posterior. O idioma que eu criei mudou com o tempo. Se você ler e entender que o idioma não é muito bom e não puder ler mais, ainda recomendo ler até o final, talvez sua opinião mude. A imagem do artigo não reflete os principais recursos do idioma, mas realmente não há links no idioma.Olá leitor! Meu nome é Alexander, nasci em uma cidade pequena (menos de 10.000 pessoas) na Bielorrússia. Minha família era pobre, havia muito poucos brinquedos, sobre o computador e qualquer console, você não pode gaguejar. Apesar de a família ser pobre, a mãe não tinha parentes pobres, que às vezes nos davam coisas baratas. E então, um dia (em algum lugar de 2001), esses mesmos parentes nos deram um computador Byte (o análogo soviético do ZX Spectrum 48k). Minha alegria não tinha limites! Imediatamente comecei a lançar jogos nele. Os jogos neste computador foram baixados de cassetes de fita comuns. O download de um jogo durou cerca de 5 minutos e, com pouca probabilidade, poderia ter parado devido a um sinal de baixa qualidade. Para aumentar a probabilidade de um download bem-sucedido, tive que limpá-lo com álcool e ajustar a posição da cabeça de leitura do gravador. Todo esse xamanismo durante o carregamento, a duração do carregamento e a incapacidade de persistir nos jogos levaram ao fato de que gradualmente comecei a perder o interesse nos jogos. Mas junto com o Byte, também me foi apresentado um livro sobre como trabalhar com este computador. Decidi ler este livro para aprender mais sobre os recursos do Byte. O livro acabou por ser um livro sobre a linguagem de programação BASIC incorporada no Byte.
Apenas peguei e copiei o primeiro programa que recebi de um livro para um computador e o iniciei. Quando vi um círculo na tela, fiquei simplesmente estupefato - era um sentimento indescritível. Quando cheguei, comecei a alterar vários números no programa e depois de iniciar a figura mudou de forma, mudei números e iniciei o programa repetidamente, parecia que eu estava em outro universo e comecei a estudá-lo. Depois de ler tudo o que havia neste livro sobre o básico, comecei a criar meus próprios programas. No começo, escrevi-os em um pedaço de papel, compilei e lancei-os na minha cabeça, depois o transferi para um computador e verifiquei o que iria acontecer. Depois que eu mesmo escrevi meu primeiro programa sem um livro, percebi - este é meu, é isso que quero fazer na vida. Comecei a escrever o dia inteiro em um pedaço de papel em vários programas (incluindo jogos).
Cerca de um ano depois, após os eventos descritos acima, a ciência da computação aparece na minha escola. Com o tempo, nas lições, começamos a aprender programação no programa IntAl. Nas lições, programamos um pouco, pois havia muitos outros materiais não relacionados à programação e também trabalhamos em computadores (havia menos computadores que os alunos). Mas havia uma disciplina eletiva em ciência da computação em nossa escola, e eu decidi me matricular lá, com a esperança de que eles me dessem mais oportunidades de programação. No corpo docente, começamos a estudar o Turbo Pascal, desde o primeiro momento em que gostei muito do idioma. Havia registros (são estruturas), unidades (também são módulos e bibliotecas), procedimentos e funções. Era algum tipo de mundo novo e bonito, mais bonito do que tudo que eu conhecia antes. Tendo começado a estudar pascal, finalmente decidi que queria me tornar um programador.
Depois de me formar na 9ª série da escola, tive a opção de ir para qualquer faculdade ou para a 10ª série. Decidi ir a um liceu, especializado em um operador de computador com um estudo aprofundado de física, matemática, astronomia e ciência da computação. Muitas pessoas disseram que, se eu me formar nesta especialidade, será mais fácil entrar em uma universidade como programador. Foram dadas três horas para resolver o vestibular, usei apenas 30 minutos, dos quais 10 verifiquei se tudo estava correto. Recebido! No Lyceum, continuei estudando Pascal, mas também comecei a estudar Photoshop, Corel Draw, Excel, a linha de comando do Windows e arquivos .bat.
Ao saber o que fiz, os mesmos parentes que me deram “Byte” me deram um novo computador com as seguintes características: Intel Celeron de 800 MHz, núcleo único, 64 Mb de RAM, disco rígido de 14 Gb, vídeo embutido com resolução de 640 x 480 e 16 cores. Os pais decolaram e atualizaram comprando 64 Mb de RAM e uma placa de vídeo Matrox Milenium g400 16 Mb, com suporte para 16 milhões de cores, com resolução de 800 x 600 (limitação do monitor). Naquela época, quase ninguém tinha acesso à Internet, todas as informações eram extraídas principalmente de discos vendidos nas lojas.
Um dos meus amigos comprou vários CDs de programação Delphi, incluindo o Borland Delphi 7, vários tutoriais, vários componentes e um programa com muitas perguntas sobre o Delphi e respostas para essas perguntas (uma espécie de StackOverflow offline no mínimo).
Tudo era tão simples e conveniente que os programas foram escritos um após o outro. Também na biblioteca do liceu havia um livro sobre programação em C. Depois de lê-lo, percebi que não gostava de C, gostava de Pascal e, principalmente, de Delphi muitas vezes mais. C é mais complicado e não é tão conveniente, a única coisa que eu gostei sobre isso é o uso de chaves em vez de começar o fim. Mas não preciso pensar que Pascal era uma linguagem ideal para mim. Com o tempo, muitas coisas começaram a me incomodar (além de começar o fim). Por exemplo, eu queria que strings e matrizes fossem estruturas com os seguintes campos: um ponteiro para uma área de memória com dados, o número de elementos, o número máximo de elementos que um ponteiro pode conter na área de memória, para que várias matrizes ou linhas possam apontar para a mesma área de memória e você pode criar uma matriz a partir de uma parte de outra matriz sem copiar os elementos. Como se viu depois, as matrizes que eu queria são chamadas de fatias. Então, eu queria escrever um tradutor que traduz de um pascal tão modificado para um regular, mas abandonei essa idéia.
O mesmo amigo que me apresentou ao Delphi disse que uma certa empresa envia discos grátis com alguns Ubuntu e Kubuntu. Eu nem sabia o que era, mas ele me deu 2 discos de graça. O Ubuntu não começou comigo, mas o Kubuntu começou e funcionou muito bem. Fiquei surpreso - acontece que há algo mais além do Windows e dos. Eu realmente queria colocar o Kubuntu no computador e estudá-lo, mas a unidade de 14 Gb era categoricamente contra. Além disso, a essa altura eu já tinha acesso à Internet (5 Kb / s) e o modem no Kubuntu não funcionava. Portanto, o disco com o Kubuntu foi lançado na prateleira. De repente, o mesmo amigo começou a delirar com algum tipo de montador, tudo me mostrou algum tipo de programa, mas eles só me fizeram sorrir, porque 50 linhas de montador foram substituídas por uma linha de Delphi, mas um amigo me convenceu a tentar e deu um disco com o FASM e livros de montagem. Eu não gostei do montador, embora as macros no FASM sejam uma coisa legal.
E então eu me formei no ensino médio, é hora de ir para a faculdade. Mas, pouco antes do final do liceu, comecei a ganhar dinheiro na Internet. Existem muitos golpistas na Internet que fingem ser empreendedores bem-sucedidos e oferecem aos usuários desavisados o seguinte acordo: “Dê-nos pelo menos um dólar e, após duas semanas, reembolsaremos US $ 2”. Se você der um dólar aos golpistas, então, estranhamente, depois de duas semanas eles realmente retornam US $ 2, mas se você der 10 e depois de duas semanas, será indicado que tenho 20 dólares na minha conta, mas será impossível retirá-lo. Criei muitas caixas de correio e, usando várias caixas de correio e alterando o endereço IP (eu tinha um IP dinâmico), registrei muitas contas em sites fraudulentos, colocando $ 1 nelas toda vez. Considerando que já ganhei um pouco de dinheiro dessa maneira, comecei a ser visitado pelo pensamento - “Talvez eu não deva ir para uma universidade? Eu posso programar como quiser sem uma universidade. ” Eu também estava inclinado a esse pensamento pelo fato de a Internet frequentemente escrever que o programador não precisava de uma torre. Enquanto eu pensava - "agir ou não agir?", A própria vida decidiu por mim. Meu pai se inscreveu em um site de namoro, encontrou um novo amor por si mesmo e me jogou com sua mãe. Percebendo que minha mãe sozinha não seria capaz de me apoiar enquanto eu estudava, eu não comecei a entrar na universidade. Após o liceu, tive que trabalhar um ano em alguma empresa. Consegui um emprego em uma mercearia, estava envolvida na extração do TTN e na entrada das mercadorias que chegavam à loja em um computador. Tendo trabalhado um pouco na loja, escrevi um programa que analisa o banco de dados de produtos na loja e procura possíveis problemas. Depois disso, a empresa proprietária da loja ofereceu a transferência para eles como programador, mas quando descobriram que eu não tinha ensino superior, eles mudaram de idéia. E fiquei trabalhando na loja. Meu salário não era ruim, mas a renda dos golpistas era muito modesta. Os rendimentos eram baixos porque o registo de contas demorava muito tempo e, na Bielorrússia, era muito difícil trabalhar com dinheiro na Internet. Liberty Reserve - dinheiro na Internet, cujo trabalho foi fornecido por um banco na Costa Rica, que não forneceu informações sobre seus clientes ao governo, motivo pelo qual a maioria dos golpistas utilizou o Liberty Reserve.
Foi especialmente difícil comprar esse dinheiro na Bielorrússia, já que nos trocadores automáticos você tinha que pagar sete vezes mais (se a memória servir), e comprar de pessoas era um negócio arriscado. Parei de enganar os golpistas e recebi renda apenas do trabalho. Depois de trabalhar um ano, decidi procurar algo melhor. Eu tinha uma boa quantia em dinheiro e decidi atualizar meu computador. Características do novo PC: AMD Athlon 64 x2 2600 (com suporte para instruções SSE2 que não estavam no processador anterior. Isso é importante!), 1 Gb de RAM, disco rígido de 80 Gb. Lembrando que eu queria aprender o Kubuntu, mas tinha um disco rígido muito pequeno, decidi instalar o Linux e o Windows ao mesmo tempo, pois não tinha problemas com o disco. Quando fui à loja de unidades de computador, comprei uma unidade openSUSE 10.2. Meu novo trabalho era consertar computadores em uma das empresas da minha cidade, com um período de teste de um mês. O chefe desta empresa, assim como sua esposa, estavam desenvolvendo algum tipo de software de contabilidade, aprendendo que eu gostava de programação, eles se ofereceram para participar de uma porcentagem de vendas futuras, mas, como estavam desenvolvendo no Visual FoxPro e SQL, eu precisava aprender essas linguagens. Eu concordei. Um mês depois, descobriram que eles não iam me contratar, mas precisavam que eu substituísse o funcionário que havia saído de férias quando ele retornou, disseram que não precisavam mais de mim, mas ainda queriam que eu os ajudasse. Com o desenvolvimento, é claro que me recusei e comecei a procurar um novo emprego. Vários meses de buscas sem êxito levaram ao fato de eu ter ido ao canteiro de obras como auxiliares.
O salário do auxiliar era 3,5 vezes menor que o do operador de computador da loja, mas devo dizer que o trabalho é muito mais fácil (eu era um cara forte). No fim de semana, usando o FASM, comecei a aprender essas novas instruções SSE2 para mim. Tendo experimentado, percebi que em algumas tarefas, essas instruções podem aumentar significativamente a produtividade. Eu queria saber como os desenvolvedores de software incorporam instruções SSE2 em seus aplicativos, porque se todas as tarefas em que faz sentido usar o SSE2 forem resolvidas com eles, o programa não será executado em computadores sem o suporte ao SSE2, mas se você não as usar, o programa vai trabalhar mais devagar. Obviamente, você pode descobrir no início do programa se o processador possui suporte SSE2 e, dependendo do resultado, executar código diferente, mas, neste caso, a complexidade do desenvolvimento e teste aumenta, bem como o aumento do consumo de RAM e cache do processador. Depois de analisar vários programas, vi que a maioria dos programas não usa o SSE2. E então me perguntei: "Por que os compiladores não compilam macros no assembler e, no computador do usuário final, algum utilitário não preenche as constantes necessárias para as macros e somente depois que um binário é criado?". E eu, lembrando-me do pascal modificado que inventei no Lyceum, decidi escrever um compilador assim. Também tomei a decisão de adicionar genéricos ao idioma e o idioma começou a se parecer com algo assim:
type Point(a){
x, y: a;
}
type Line(a){
a, b: Point(a);
}
function createLine(a, b: Point(a)) Line(a){
result.a = a;
result.b = b;
}
Windows Linux( Windows, Linux ). Ubuntu 8.10, . , Gentoo. Gentoo use- , . , , , , . , - LLVM, LLVM IR. , , FASM, LLVM IR, , , , LLVM , , . . LLVM IR , , , , , . , , LLVM IR, , , . :
function inc(a: ^Integer) Integer{
result = a^ + 1;
}
procedure foo(){
var
a: ^Integer;
b: Integer;
...
//
...
b = inc(ro nocp a) // inc ,
}
, (800 $/), . , Haskell, : « », « », , - , . . Haskell . , — , , , — , , , ( , ) — , , , — , . « Haskell ». , . , . , , Haskell, - , . Haskell , Haskell( Python), .
, . Haskell . - Junior Haskell Developer , . . , , IDE, firefox + google , . . Haskell .
, Haskell , , , Haskell , , Haskell — ! Haskell , , ( Haskell). :
function lineLength(line: Line) Real
result = sqrt(sqr(line.a.x - line.b.x) + sqr(line.a.y - line.b.y))
- 800$ 400$, 120$ + + 250$. 250$, ? . , — , , . 35$ . , , , . , , , , , - . 2 . , - . , , , , , « , . » — . , , , (14 ). , , , , , , . , ( ), , , , 1-2 . . , , , 3 , . , 3 . , . ( ).
: , , , . ( ), , , , . , , , , , ( ). , . , - (, , , ), , - , . ( , , ), 60% . , , , . , , :
- , ( ).
- , LLVM IR . , A m, , LLVM IR , B A, m LLVM IR .
- .
- .
, . , :
- Haskell?
, , . :
abstract class Printable
require method (Printable) print()
method (Printable) printLn()
this.print()
String.eol().print()
- ?
, , , . :
class Some(SomeParent)
a, b String
class Some(Some, Printable)
override method (Some) print()
this.a.print()
this.b.print()
- ?
( 2 , — ). - , ?
, . . :
method (Some) foo(a :String, b String) // a - , b -
c := 10 // c
d .= 12 // d
:someMethod() // someMethod, c
c.someMethod() // someMethod, c
//2 , , ,
- ?
, . :
class Point
x,y Number
method (Some) foo(a Point<x UInt64, y UInt64>) // a , Point, x y. , .
- , Point x y .
class Point
x, y !Number // x , y x
- ?
, , . :
class Point
numberClass #Number
private x, y .numberClass
method (Point) createPoint(x, y .numberClass) This //This -
result:x = x
result:y = y
- , LLVM IR ?
( ) , . :
method (Some) foo(a .z, b Point<numberClass .f>, c UInt64)
//a z
//b Point numberClass, f
//c UInt64,
- ?
, , , - , , . 0 — .
, . . , , , , , , . , , , — , . - 5 . , . : . — 170 $/. , , , , . , , .
, , , . , O0 O2, O1 O3. , LLVM IR, . LLVM IR, , clang C. - , C LLVM IR , LLVM IR. LLVM IR? .
C LLVM IR? LLVM IR C: , , , C . LLVM IR C. , . , , , . , this 2 ( ) 4. , , 20 — 40 ( ). , , . , 2 , , , , , , . , , — . , . , .
, :
— « , ?». , , , , . , this ( ). :
method (#Some) foo(a String, b `String, c ~String, d :String)
//this
//a
// b ,
//c ,
//d ,
. , , , ( ) , , , ( ) : , , , , this ( , ), , , , . , :
method (~Some) veryBadMethod(value This)
this = value
method (#Some) foo()
a := Some
b .= Some#randomValue() //, b
a~veryBadMethod(b)
a:someMethod() // ,
, . , , . , , , . — 2 , , , , , — .
, , . , «! ! .». , . — . , , 150-180. 11 . , , , - , . (? , ). , . , , 30- , , , 200$ ( ), , , .
, . (Disciples 3) — , , — « !». , , , ? , ! , , . , « ? Haskell.». 10 , , , , , . -, , ( , ) , , .
, . , , . , , , , , .
, , , , , , . . . , , . :
type Point(a)
x,y a
type SimplePoint
x,y Double
//-
a := Point(UInt64)
Haskell, , , , . , - . . :
group Equal
//equal(a, a) -> Bool
, Equal, equal, 2 , Bool.
(rules) — , . . :
rules
1 = type == [_] //
2 = type[0] > Equal // Equal
3 = 1 & 2
join 3 Equal // Equal
. , , , , — . , 1 9 ( 5), , , , . :
func notEqual(a, b)
rules
final = a > Equal & a == b
result = Bool
result = !(a == b) //! == , result = (neg(equal(a, b)) a.equal(b).neg()
, , , , . , , , , , . , bash , . ( ) .
, : cine, , fei. github:
cine fei...( ).XML Kate.Linux x86_64( ) clang.
,
, cine.
:
- cine fei n-kine enfei.
- cine C.
- cine ( ).
- 4ernika, , .
- , , . size count , size count, . , , , .
- , ( ).
- , , ( , ). , , . .
- cine , cine — UInt8, , .
- LLVM IR C, clang GCC. , , , clang.
- SIMD , 0.1 SIMD ( ), , SIMD .